버전 기록

  1. v5 2026. 10. 28. · 80d5312

    Check the TypeScript strictly, with no `any` tsconfig is strict, and Biome's noExplicitAny and noImplicitAnyLet are on again. The JSON the site keeps and its queries answer (settings, options columns, records, rows) is one type, Data (modules/json.ts), whose readers check the fields they use; the pages call it Fields and Row. Where a check already guaranteed a value, the types now say so: requireBoard asserts its board, startWrite's edits always have their row, only() reads an aggregate's one row, signedIn() serves any ctx, and present() tells a found list from one with gaps. The pages read the signed-in member and the owner's client through signedInMember(), naruClient() and ownerClient(), and elements they made through within(), as $ reads them by ID. The vendored DOMPurify takes the dompurify package's types (vendor/purify.es.d.mts, left out of the build). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

  2. v4 2026. 10. 27. · 650a5d1

    Build and check with pnpm and Biome, as commung does npm and Prettier give way to pnpm 10 and Biome 2.2.5, configured like commung's: the lockfile is pnpm-lock.yaml, `pnpm lint` runs `biome check` (formatting, lint and import order), and CI installs with pnpm. The build formats the JavaScript it publishes with Biome's JS API instead of Prettier, under biome.json's formatter settings. Biome's first pass reformats and sorts imports across the sources, drops unused imports, and calls `escape` and `unescape`, which shadowed the globals, escapeHtml and unescapeHtml. Three of its recommended rules are off: noExplicitAny and noImplicitAnyLet, while tsconfig is not strict, and noAssignInExpressions, for the `??=` caches and `return (x = …)` the code is written with. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

  3. v3 2026. 10. 27. · 1e40798

    Find the site's name from Naru's edge when served on a custom domain createNaru() reads the site off <login>.naru.pub and throws anywhere else, so a site installed from the template on a custom domain could not start until its owner wrote their login name into shared/config.ts. Naru's edge answers /.well-known/naru-site with the site's login name on every host it serves; ask it when config.site is empty and the SDK cannot tell. config.site still wins when set, for local servers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

  4. v2 2026. 10. 27. · e1efde9

    Load the owner's /_owner/ files, behind a switch in 디자인 사이트 주인 파일 불러오기 (off unless turned on) loads /_owner/style.css in every page's head, after the template's and 디자인's CSS and before 사용자 CSS, and /_owner/script.js as a module once the page is set up. Naru keeps _owner/ out of every template and update, so what an owner puts there outlasts them. The admin screen loads neither. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

  5. v1 2026. 10. 27. · 4e96b99 · 마이그레이션 5개

    Put the look in every page's head, so pages open in the owner's design The design layer, 사용자 CSS and the <body> classes waited for the site query, so each page first painted in the template's look. designLook makes them on the server; each page's route writes them into index.html's <head> (the styles as the elements app/site.ts reuses, the classes set as <body> appears), and the page only refreshes them. A "</" in the owner's CSS is written "<\/" so it cannot end its element. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>