How it connects

Dawnforge is plain HTML, CSS and JavaScript pages plus a handful of small Node services, all behind one front door. The AI does not run on the server: it runs on members' own PCs, which fetch their work from the server. This page shows the parts and how they connect. It is built from docs/code-map.json by tools/build-docs.mjs, and tools/check.sh fails when a service or shared module is missing from it.

Choose a part to see what it uses and what uses it.

The login service

The tools

Helper services

Shared browser modules (site/shared)

The AI computers

The big picture Browserpeople Caddyfront door authwho, limits, AI queue Tool pages+ site/shared modules Hollowkeep · Worldquillfiles and worlds AI computersOllama · ComfyUI AI PCs fetch their work from auth

The front door

Everything a browser asks for arrives here first.

Caddy

service caddy

Terminates HTTPS, serves the static pages from the repo's folders, forwards each tool's API paths to its service and sends the old tool subdomains to seppo.app/<tool>/. Before a tool opens it asks the login service (/verify, /verify-admin, /verify-gate and the tool-specific checks) and passes on only the user headers from that answer. Every site gets the security headers and a CSP. The Caddyfile is the one place that says which path goes where. Routes not named elsewhere: `/api/region` answers the visitor's country from Cloudflare's header for the login app only, nothing is stored; `/micropages/*` are the pages made in Scrollforge, sent with a sandbox CSP and noindex; `/verify-mail` checks the sign-in for Roundcube webmail; `/games/*` answers 404 here (the game builds are only for their own admin-only addresses); `/grainwright/*` is the texture-map tool, its `/grainwright/api/hollowkeep/*` calls reach Hollowkeep through the shared route; `/api/almanack/*` is the calendar API; `/docs/api/*` are the function docs, admins only. Hosts not named elsewhere: `moonbrush.seppo.app` redirects to Whisperglass, `dragonflight.seppo.app` redirects to the public Ashflight site, `projects.seppo.app` serves the static sites of other Claude projects, each sandboxed with no sign-in cookie.

Where it lives

The login service

One Node service that knows who everyone is. Every other part trusts its answer.

auth (login service)

service auth

Accounts, invites, approval, sessions, two-factor sign-in, admin pages, themes, storage limits, group and private chats, the feature board, the Work page and Scrollforge (the admin AI workspace), the changelog and newsletters, mail setup, the fresh-code gates for Shellward and Mirrorgate, and the AI gateway with its computers' work queue. It also keeps painted pictures and uploaded photos. One SQLite database in the volume auth_data. server.js is only the route table; each topic has its own file, with pages/ for the rendered pages and api/ for the JSON endpoints.

Where it lives

Before you change it 3
  • Stored data is people's. Files, worlds, chats, boards and stories belong to the people who made them. Copy first and check size and SHA-256 before an original goes, keep removed originals in a holding folder, and make migrations safe to stop and run again. Read the rule
  • Idempotent schema changes. Schema changes are CREATE TABLE IF NOT EXISTS plus migrations that can run on every start. SQL uses prepared statements, never user input glued in. Read the rule
  • Counts toward the storage limit. Everything a person stores counts toward their one storage limit; each tool reports its own part. Read the rule

db.js

module auth/db.js

The schema and the single database handle. Schema changes are idempotent migrations.

Where it lives

Before you change it 2
  • Stored data is people's. Files, worlds, chats, boards and stories belong to the people who made them. Copy first and check size and SHA-256 before an original goes, keep removed originals in a holding folder, and make migrations safe to stop and run again. Read the rule
  • Idempotent schema changes. Schema changes are CREATE TABLE IF NOT EXISTS plus migrations that can run on every start. SQL uses prepared statements, never user input glued in. Read the rule

sessions.js

module auth/sessions.js

Cookies and password checks. Every service asks this one for who is signed in.

Where it lives

computers.js

module auth/computers.js

The AI circle: PCs pair once, long-poll for work and stream answers back.

Where it lives

relay.js

module auth/relay.js

Passes the few allowed requests between Hollowkeep and Worldquill, which never reach each other directly.

Where it lives

pages/

folder auth/pages

Server-rendered pages, one file per page family, pages/layout.js as the shared template (signed-in pages wear the app shell, entrance pages the centred card) and pages/icons.js for the line icons of the admin menu and the side list: login, invites, account, profile and two-factor, admin (menu, activity, backups, AI providers, AI computers, models, mail, newsletters, socials, legal), the board, the changelog, Work, Scrollforge, the Shellward gate page, and the public legal notice and privacy policy.

Where it lives

Before you change it 2
  • Four languages. Text people read exists in English, German, French and Spanish with the same keys in each. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

api/

folder auth/api

JSON endpoints used by the pages and tools: access (who may open what), palette, models, status, paintings, pins, sidebar, socials, group chats, the AI gateway (prompts, photos and pictures to the AI computers, with per-user blocks and the usage log), and the routes of Work and Scrollforge.

Where it lives

Before you change it 1
  • Idempotent schema changes. Schema changes are CREATE TABLE IF NOT EXISTS plus migrations that can run on every start. SQL uses prepared statements, never user input glued in. Read the rule

The tools

Each tool is a static page; Hollowkeep and Worldquill also have a small service for stored data.

Whisperglass

folder whisperglass-site

AI chat and images (Moonbrush paints inside it) at seppo.app/whisperglass/. Talks to the AI circle through auth (/api/ollama, /api/comfy), to web search through web-tools, and to the small AI in the browser when no PC is on. Chats stay in the browser or, when private, in the account; group chats, Worldquill worlds and Hollowkeep files can be brought in.

How data moves through it

Chatting with the AI
  1. Whisperglass
  2. auth (login service)
  3. web-tools

Where it lives

Before you change it 4
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule
  • Four languages. Text people read exists in English, German, French and Spanish with the same keys in each. Read the rule
  • Keep the tool links working. Worldquill pages in chats, stories and boards per world, Save to Hollowkeep and similar links between tools must keep working. Check them after a big change. Read the rule
  • Stored data is people's. Files, worlds, chats, boards and stories belong to the people who made them. Copy first and check size and SHA-256 before an original goes, keep removed originals in a holding folder, and make migrations safe to stop and run again. Read the rule

Hollowkeep (page)

folder hollowkeep-site

The file store's page at seppo.app/hollowkeep/: folders, uploads, previews (PDFs with markup and a reading library, 3D models, PureRef boards), sharing, a locked vault whose keys never leave the browser, and files kept on the device for offline use with edits waiting in an outbox.

Where it lives

Before you change it 4
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule
  • Four languages. Text people read exists in English, German, French and Spanish with the same keys in each. Read the rule
  • Keep the tool links working. Worldquill pages in chats, stories and boards per world, Save to Hollowkeep and similar links between tools must keep working. Check them after a big change. Read the rule
  • Stored data is people's. Files, worlds, chats, boards and stories belong to the people who made them. Copy first and check size and SHA-256 before an original goes, keep removed originals in a holding folder, and make migrations safe to stop and run again. Read the rule

Hollowkeep (service)

service hollowkeep

Files by id on disk plus a SQLite index in the volume hollowkeep_data: folders, sharing, the vault's locked files, kept earlier versions and deleted items, PDF markup, a name search, PureRef board previews and the links Worldquill uses to show Hollowkeep pictures. Other tools save into it through Caddy's /api/hollowkeep path.

Where it lives

Before you change it 3
  • Stored data is people's. Files, worlds, chats, boards and stories belong to the people who made them. Copy first and check size and SHA-256 before an original goes, keep removed originals in a holding folder, and make migrations safe to stop and run again. Read the rule
  • Idempotent schema changes. Schema changes are CREATE TABLE IF NOT EXISTS plus migrations that can run on every start. SQL uses prepared statements, never user input glued in. Read the rule
  • Counts toward the storage limit. Everything a person stores counts toward their one storage limit; each tool reports its own part. Read the rule

Reelhearth (page)

folder reelhearth-site

The video library's page at seppo.app/reelhearth/: shows the person's videos and their space, uploads and removes videos (removed ones wait in a trash that keeps using space), opens the player signed in (the sign-in page on reelhearth.seppo.app), and connects a TV or phone app by a code.

Where it lives

Reelhearth (service)

service reelhearth

Everyone's video folders on disk (volume reelhearth_media), the room each person has left, uploads that stop at the limit, a trash that is only emptied by its owner, and the Jellyfin set-up: one admin account and key kept in reelhearth_data, an account and a library per person, sign-in without a password through Quick Connect and a one-time ticket, and the rights that keep transcoding off.

Where it lives

Before you change it 2
  • Stored data is people's. Files, worlds, chats, boards and stories belong to the people who made them. Copy first and check size and SHA-256 before an original goes, keep removed originals in a holding folder, and make migrations safe to stop and run again. Read the rule
  • Counts toward the storage limit. Everything a person stores counts toward their one storage limit; each tool reports its own part. Read the rule

Jellyfin

service jellyfin

The player behind Reelhearth, one shared server at reelhearth.seppo.app (its admin paths closed in Caddy) that reads the folders read-only and plays files as they are (the server has no graphics card). Limited to two CPUs and 2 GB; the apps for TVs and phones connect to it directly and sign in with a code.

Where it lives

Before you change it 1
  • Stored data is people's. Files, worlds, chats, boards and stories belong to the people who made them. Copy first and check size and SHA-256 before an original goes, keep removed originals in a holding folder, and make migrations safe to stop and run again. Read the rule

Armoryhall (page)

folder armory-site

The software and games library's page at seppo.app/armory/: the library grid, an item with its versions, hashes and scan results, uploads in resumable chunks, my uploads, the terms, reports, the admin tab (pool, quotas, speed, vault switch, quarantine, takedowns, blocklist, metadata log) and browser games in a sandboxed frame from armory.seppo.app.

Where it lives

Armoryhall (service)

service armory

Items with immutable versions and manifests in armory.sqlite and files by random id in the volume armory_data: SHA-256 per file, per-person quota and a pool cap, a share lane (all accounts, named accounts or only me) and a vault lane the uploader chooses per upload (share is the default; owner only, AES-256-GCM at rest with keys derived from ARMORY_SECRET), a name and hash blocklist, quarantine until the scanner says clean, downloads with Range, two at a time and a speed cap, and signed play tickets for armory.seppo.app.

Where it lives

Before you change it 3
  • Stored data is people's. Files, worlds, chats, boards and stories belong to the people who made them. Copy first and check size and SHA-256 before an original goes, keep removed originals in a holding folder, and make migrations safe to stop and run again. Read the rule
  • Idempotent schema changes. Schema changes are CREATE TABLE IF NOT EXISTS plus migrations that can run on every start. SQL uses prepared statements, never user input glued in. Read the rule
  • Counts toward the storage limit. Everything a person stores counts toward their one storage limit; each tool reports its own part. Read the rule

ClamAV for Armoryhall

service armory-clamav

clamd, reached only from the armory network, scans every finished Armoryhall version (INSTREAM, up to 4000 MB per file); freshclam inside fetches the signatures over a network of its own.

Where it lives

Before you change it 1
  • Stored data is people's. Files, worlds, chats, boards and stories belong to the people who made them. Copy first and check size and SHA-256 before an original goes, keep removed originals in a holding folder, and make migrations safe to stop and run again. Read the rule

Metadata lookups for Armoryhall

service armory-meta

Suggests title, year, creators, genres, summary and cover for new Armoryhall uploads from Wikidata and Wikipedia, Open Library and MusicBrainz with the Cover Art Archive. Its own container with a way out to a fixed list of hosts (https only, every address checked, size and time limits); armory reaches it over an internal network and sends it title text only, never anything of the vault.

Where it lives

Before you change it 1
  • Stored data is people's. Files, worlds, chats, boards and stories belong to the people who made them. Copy first and check size and SHA-256 before an original goes, keep removed originals in a holding folder, and make migrations safe to stop and run again. Read the rule

Art sizes for Armoryhall

service armory-img

Makes the web sizes of Armoryhall art (cover, banner, icon, logo, screenshots) with libvips: checks each picture's type and size before decoding, strips its metadata and answers WebP variants, a colour and a tiny placeholder. Its own container with no way out, read-only, no rights, limits on memory, processes and time; armory reaches it over an internal network.

Where it lives

Before you change it 1
  • Stored data is people's. Files, worlds, chats, boards and stories belong to the people who made them. Copy first and check size and SHA-256 before an original goes, keep removed originals in a holding folder, and make migrations safe to stop and run again. Read the rule

Worldquill (page)

folder worldquill-site

Wikis for fantasy worlds at seppo.app/worldquill/: pages edited in place, pictures, Word-style game design documents (.docx and PDF), linked files and 3D models, sharing, history, giving a world away, and offline saving with an outbox. Fableknot and Sketchmere open stories and boards of the same world.

Where it lives

Before you change it 4
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule
  • Four languages. Text people read exists in English, German, French and Spanish with the same keys in each. Read the rule
  • Keep the tool links working. Worldquill pages in chats, stories and boards per world, Save to Hollowkeep and similar links between tools must keep working. Check them after a big change. Read the rule
  • Stored data is people's. Files, worlds, chats, boards and stories belong to the people who made them. Copy first and check size and SHA-256 before an original goes, keep removed originals in a holding folder, and make migrations safe to stop and run again. Read the rule

Familie (page)

folder familie-site

Family organizer at seppo.app/familie/: a shared calendar, shopping list, tasks and notes in the Liquid Glass look. The page reloads its data every 8 seconds and works only online.

Where it lives

Familie (service)

service familie

Small Python service in the volume familie_data (database familie.sqlite): calendar entries, shopping items, tasks and notes. Caddy passes the signed-in login name; who may enter is decided by the login service (admins and the Seppo accounts an admin added in the Familie tab).

Where it lives

Worldquill (service)

service worldquill

Worlds in the volume worldquill_data (database worldquill.sqlite): pages, pictures, documents (Word files read and written here), stories, boards, draw.io diagrams, search, history, kept copies of anything deleted, and links to pictures and files that live in Hollowkeep or Whisperglass. Stories, boards and diagrams are stored per world.

Where it lives

Before you change it 4
  • Stored data is people's. Files, worlds, chats, boards and stories belong to the people who made them. Copy first and check size and SHA-256 before an original goes, keep removed originals in a holding folder, and make migrations safe to stop and run again. Read the rule
  • Idempotent schema changes. Schema changes are CREATE TABLE IF NOT EXISTS plus migrations that can run on every start. SQL uses prepared statements, never user input glued in. Read the rule
  • Counts toward the storage limit. Everything a person stores counts toward their one storage limit; each tool reports its own part. Read the rule
  • Keep the tool links working. Worldquill pages in chats, stories and boards per world, Save to Hollowkeep and similar links between tools must keep working. Check them after a big change. Read the rule

Fableknot

folder fableknot-site

Ink editor for branching dialogue and quests at seppo.app/fableknot/: a screenplay-style script page, a playtest with the self-hosted inkjs, the Learn ink lessons and spellchecking with the small AI in the browser. Stories are stored in the Worldquill world.

Where it lives

Before you change it 4
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule
  • Four languages. Text people read exists in English, German, French and Spanish with the same keys in each. Read the rule
  • Keep the tool links working. Worldquill pages in chats, stories and boards per world, Save to Hollowkeep and similar links between tools must keep working. Check them after a big change. Read the rule
  • Stored data is people's. Files, worlds, chats, boards and stories belong to the people who made them. Copy first and check size and SHA-256 before an original goes, keep removed originals in a holding folder, and make migrations safe to stop and run again. Read the rule

Sketchmere

folder sketchmere-site

Hand-drawn level sketches and boards at seppo.app/sketchmere/, and draw.io diagrams edited in the self-hosted draw.io editor at seppo.app/drawio/ (fetched by tools/fetch-drawio.sh, opened in a sandboxed frame); stored per Worldquill world with live drawing, can show Whisperglass paintings, opens and saves Excalidraw files, and a frame exports as an Unreal blockout (data plus a script for the editor).

Where it lives

Before you change it 4
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule
  • Four languages. Text people read exists in English, German, French and Spanish with the same keys in each. Read the rule
  • Keep the tool links working. Worldquill pages in chats, stories and boards per world, Save to Hollowkeep and similar links between tools must keep working. Check them after a big change. Read the rule
  • Stored data is people's. Files, worlds, chats, boards and stories belong to the people who made them. Copy first and check size and SHA-256 before an original goes, keep removed originals in a holding folder, and make migrations safe to stop and run again. Read the rule

Mirrorgate (page)

folder mirrorgate-site

Admin-only menu for the home PC at seppo.app/mirrorgate/: shows whether the PC is on, wakes or shuts it down through mirrorgate-wake, opens the remote session, the server desktop and Shellward, and guides the Moonlight streaming setup.

Where it lives

Before you change it 1
  • Four languages. Text people read exists in English, German, French and Spanish with the same keys in each. Read the rule

Mirrorgate wake

service mirrorgate-wake

Wakes and shuts down the home PC.

Where it lives

Helper services

Things the tools and the admin pages lean on.

SearXNG

service searxng

The search engine behind web-tools.

Where it lives

Mail server

service mail

Stalwart: sends, receives and stores all mail for the site.

Where it lives

Webmail

service webmail

Roundcube, signed in with the site password through a small plugin.

Where it lives

desktop-db

service desktop-db

Database for the remote desktop.

Where it lives

Guacamole

service desktop

Remote session to the home PC behind Mirrorgate. Its extension (mirrorgate-web/extension) adds the Leave button.

Where it lives

Shellward (web)

service shellward-web

Guacamole page for the admin terminal. It has no users of its own: the login service hands it a signed one-minute login. Its extension (shellward-web/extension) adds paste, the lock bar with idle and total time left and Lock now, and the key row on phones.

Where it lives

Shellward (guacd)

service shellward-guacd

Opens SSH to the server as an unprivileged user and records each session.

Where it lives

Server desktop

service server-desktop

Sandboxed Linux desktop with Firefox, opened from Mirrorgate. Capped at 2 GB and 2 cores, no access to the server's files.

Where it lives

PureRef renderer

service pureref-render

Draws PureRef boards (.pur) as pictures for Hollowkeep's preview, with PureRef itself. No network and no rights; it only gets a copy of one board at a time from Hollowkeep.

Where it lives

Courier

service courier

Started only on request (compose profile courier). Reads the picks inbox and todo answers, accepts only lines the login service signed, and prints each message once for a server session to pass on. No network, no provider keys.

Where it lives

Proton Bridge

service ravenpost-bridge

Proton's own Mail Bridge, running without a screen (compose profile proton, started by deploy once PROTON_INBOX_KEY is set). Offers IMAP only to the Proton inbox service on an internal network; its login lives in its own volume. Reaches Proton through a separate outgoing network.

Where it lives

Proton inbox service

service ravenpost-proton

The small read service behind Ravenpost's Proton tab (compose profile proton). Reads folders and mails from Bridge by IMAP and deletes mails when the login service asks; only the login service can call it, with a shared key. No outgoing network, no mail kept on disk.

Where it lives

Shared browser modules (site/shared)

Loaded by every tool page, so a change here shows up everywhere. Pages load them with a ?v= number that is bumped on every change.

header.js

module site/shared/header.js

The header pill on every page and the Command Sheet it opens (search button, Ctrl K): every tool by topic, search, recent pages. Typing also searches everything the person may open: Worldquill (`/worldquill/api/search`: pages, documents, stories, boards), Hollowkeep (`/hollowkeep/api/search`: file and folder names) and, in the browser, Whisperglass chat titles, with the open world first. Worldquill and Hollowkeep answer from SQLite full-text tables (`search-index.js`) kept in step by triggers and rebuilt from the data when needed; without them they read the data directly. The landing builds its app buttons from the same list. It sets `<html data-design="lw">` before the first paint (`classic` is the rollback, via `SITE_DESIGN` or localStorage `seppo-design`), links `living.css`, loads `panes.js` on seppo.app, injects the tool head (logo, tool name as the page's one level-1 heading, picture) on tool pages and on phones opens the Sections sheet from the logo. The sheet's keys follow the drawn order (the You group is first on wide tool pages). On <html data-simple> pages (not classic) the header is the crest, "Dawnforge" and one Menu button, without search, language, theme or avatar pills; the sheet is the one menu (no Recent; menu-sheet.js adds its other parts) and window.seppoMenu.openMenu opens it for the phone bar.

Where it lives

Before you change it 3
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule
  • Four languages. Text people read exists in English, German, French and Spanish with the same keys in each. Read the rule

symbols.js

module site/shared/symbols.js

Symbol buttons for every tool: a button marked data-sym becomes a round line-symbol button whose own text turns into the tooltip and the screen-reader label (and shows beside the symbol only when the button also has data-sym-word). It holds the one shared set of line symbols and also finds buttons a tool draws later.

Where it lives

shell.js

module site/shared/shell.js

The one script of the app frame (shell.css): the header's list button opens and closes the side list on narrow screens, and a tap beside it, the Escape key or a tap on one of its links closes it again. Every page with a side list loads this instead of its own copy; the phone bottom bar's left button presses the same list button.

Where it lives

whats-new.js

module site/shared/whats-new.js

The What is new page's helper: sizes the framed How the AI works article (ai.html?embed=1) to its content so the page scrolls once.

Where it lives

tabbar.js

module site/shared/tabbar.js

The phone bottom bar every tool shares (520px and narrower): four or five destinations with the main action as a round button in the middle, in Liquid Glass. A tool lists its destinations as data on the script tag and the bar clicks the tool's own buttons, so it needs no layout code. It folds away with the keyboard and on sideways phones. Styles are in ui.css. The last button becomes Sections (`sections.js`: a sheet with the five painted panes and the tool's actions). The round button can take its own name and picture from its target (`data-tab-name`, e.g. Hollowkeep's Add PDFs) and gives them back when the target goes. Rows a tool marks `.tabbar-covered` (also those built later) are tucked away from screen readers and Tab, and only what the bar added is removed again; the haptic tick on iPhone gives focus back. On <html data-simple> pages its last slot says Menu and opens the header's one menu sheet; what More held becomes the sheet's In this tool part.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

scene.js

module site/shared/scene.js

The painted background with parallax.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

mail-key.js

module site/shared/mail-key.js

Makes a PGP key pair in the browser (vendored OpenPGP.js) for locked mail storage on the account mail page; only the public key is sent.

Where it lives

palette.js

module site/shared/palette.js

Colours and themes.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

i18n.js

module site/shared/i18n.js

The window.i18n lookup (t, add, setLanguage, language) with the language pickers, and the English, German, French and Spanish texts of the shared widgets (group chats, storage notices), Mirrorgate, Whisperglass and Hollowkeep. Other tools add their texts with i18n.add.

Where it lives

Before you change it 3
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule
  • Four languages. Text people read exists in English, German, French and Spanish with the same keys in each. Read the rule

refract.js

module site/shared/refract.js

Edge refraction and the pointer rim light for the Liquid Glass (after rdev/liquid-glass-react, MIT): draws a displacement map per big surface (page panels, landing menu, Command Sheet, header pill, tool head) and hands an SVG filter to the frost layer through --refract; a .rim-light ring follows the pointer. Chromium only; Safari and Firefox keep the plain frost.

Where it lives

panes.js

module site/shared/panes.js

Living Window navigation (redesign): five leaded panes (Armoryhall, Whisperglass, Almanack, Board, Account) as real links, a slim rail at the left edge on desktop (900px wide and 440px tall or more, every page except the home; header.js sets html.lw-rail so the page makes room with --rail-width) and a 56px bottom row on phones and short windows that folds while scrolling down. Pressing answers with a spring, opening grows the pane to the screen before the link is followed; reduced motion skips it. header.js loads it only on pages with data-design="lw"; the art is a crop of the page's own scene.

Where it lives

living.css

stylesheet site/shared/living.css

Styles of the Living Window panes: opaque pane art with a scrim so labels keep 4.5:1, lit current pane, the desktop rail with its one --rail-width offset for body, corner bar and tool head, and the phone bottom row. Loaded by header.js on pages with data-design="lw".

Where it lives

simple.css

stylesheet site/shared/simple.css

The simple page look (page-design simplification): one glass surface per content page (.simple-surface, flat rows inside, no glass on glass), six text sizes (12, 14, 16, 20, 28, 40), Pirata One only for the page title, the underline tab row (.simple-tabs) and 44px targets. Everything is scoped to <html data-simple>; removing the attribute restores the Living Window look. Checked by tools/shot/simple.mjs on its own fixture.

Where it lives

simple-tabs.js

module site/shared/simple-tabs.js

The underline tab row of simple.css: centres the current tab in its row on load (only the row scrolls), keeps a focused tab in view and adds the arrow keys, Home and End. window.seppoSimpleTabs.mount(row) mounts rows added later.

Where it lives

world-tabs.js

module site/shared/world-tabs.js

Worldquill's tab row Worlds, Stories, Boards (page-design slice 9): real links in the header of the Worldquill, Fableknot and Sketchmere pages, each opening the matching page on the open world (#w/<id>, else seppo-open-world). Own i18n namespace worldquillTabs; placement in world-tabs.css, look from simple.css.

Where it lives

menu-sheet.js

module site/shared/menu-sheet.js

The one menu of the simple pages (<html data-simple>, page-design slice 3): header.js draws the logo and one Menu button and opens its Command Sheet; this adds the sheet's other parts: In this tool (the phone bar's old More actions, from tabbar.js), Settings (language for everyone, day and night, Notifications, Sign in or Sign out) and the legal links, plus a close button and the Back contract (one history entry, Back closes the sheet before leaving). No Recent block. Checked by tools/shot/menu.mjs.

Where it lives

menu-sheet.css

stylesheet site/shared/menu-sheet.css

Styles of the menu sheet's parts from menu-sheet.js (close button, In this tool rows, Settings choices, legal links): light veils on the sheet's glass, 44px targets, six text sizes. Linked by header.js only on simple pages.

Where it lives

living-ui.js

module site/shared/living-ui.js

Living Window pieces for library pages (Armoryhall, Hollowkeep), only with data-design=lw: a Filter capsule that opens a sheet (popover) for the page's filter controls and counts the active ones, a More menu for tabs past the first few on phones, and a spring press on cover panes. Styles in living-library.css.

Where it lives

arch.js

module site/shared/arch.js

Living Window home: gives the five static arch panes in site/index.html their icon, the scene's leaded art and the press and grow spring from panes.js, names its navigation in the page language and keeps the arch above the dock whatever height the dock has. Loaded by header.js on <html data-design="lw" data-page="home">.

Where it lives

living-home.css

stylesheet site/shared/living-home.css

Places the Living Window home: arch of tall panes above a slim search and tool-icon dock on desktop, painting first with the pane stack scrolling in on phones; light through glass per day and night.

Where it lives

sections.js

module site/shared/sections.js

The Sections sheet of the tool frame (Living Window): a native popover bottom sheet with the five painted panes, a Home row and the actions the bottom bar's old More button held. Opened by tabbar.js (its last button becomes Sections when this module loads) and by the logo on phone tool pages (header.js). Springs up from the bottom, drag the handle down to close, Escape and the back button close it, focus returns to the opener.

Where it lives

mail-living.js

module site/mail/mail-living.js

Ravenpost on phones (Living Window): the bottom bar's Folders button clicks the hidden #open-folders, which shows the folders pane. Nothing else; mail.js keeps the mail logic.

Where it lives

mail-living.css

style site/mail/mail-living.css

Ravenpost phone layout (520px and narrower, not classic): one scroll, folder rows 56px, mail rows 72px, Back plus the reader actions in a grid of three, full-screen compose with its actions on top; the page's own New mail, Refresh, Sorter, old webmail and Folders buttons are tucked behind the bar.

Where it lives

scrollforge-living.js

module site/shared/scrollforge-living.js

Scrollforge (Living Window): marks the page's own title when it only repeats the tool name (all widths) and, on phones, the model chip when no AI is ready, so scrollforge-living.css can hide them; the empty chat's question becomes a level-2 heading. Plain script loaded after scrollforge.js; the classic design keeps the old page.

spring.js

module site/shared/spring.js

Spring motion for gestures CSS cannot do (Living Window redesign): animate(from, to, onFrame) starts from the current value and velocity, retarget(to) continues smoothly when a tap interrupts it, critically damped by default, jumps straight to the target under reduced motion. Tokens for the CSS side are in tokens.css.

Where it lives

crossing.js

module site/shared/crossing.js

Page-to-page transitions.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

chat.js

module site/shared/chat.js

The chat view used by Whisperglass.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

todo-steps.js

module site/shared/todo-steps.js

Adds the Copy button to the command blocks on a to-do's page; the steps, sites and commands themselves are drawn by the server from the to-do text.

Where it lives

md-text.js

module site/shared/md-text.js

Shows the text of a to-do or pick as Markdown (bold, lists, links) through markdown.js; the server has already escaped it.

Where it lives

markdown.js

module site/shared/markdown.js

Turns an AI's Markdown into safe page elements.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

sidebar.js

module site/shared/sidebar.js

The chat list as ordered tabs and folders.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

pins.js

module site/shared/pins.js

Pinned items for every tool: kept on the device and sent to the account when online.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

drawer.js

module site/shared/drawer.js

The phone drawer with a filter, Pinned and Recent, opened from the bottom bar.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

confirm-buttons.js

module site/shared/confirm-buttons.js

Buttons with data-confirm ask first (reset of a model set); Cancel stops the form from being sent.

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

table-labels.js

module site/shared/table-labels.js

Gives every table cell its column title, so admin tables can turn into cards on phones.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

admin-palette.js

module site/shared/admin-palette.js

The admin pages' own search sheet (Ctrl K or /: admin pages, projects and people), Pinned and Recent in the admin side list, and the soft change of the pane between plain admin pages.

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

search-engine.js

module site/shared/search-engine.js

The one search engine behind both Command Sheets: ranks rows (titles before text, starts before middles, recently used first), forgives typos and word forms, finds German and English words in one index, and suggests a corrected word.

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

search-engine.test.mjs

module site/shared/search-engine.test.mjs

Tests for the search engine: ranking, typos, German and English together, suggestions.

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

tooltip.js

module site/shared/tooltip.js

Tooltips drawn in the site's own glass look instead of the browser's own; the title moves aside while the label shows.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

groups.js

module site/shared/groups.js

Group chats.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

private-chats.js

module site/shared/private-chats.js

Syncs private chats with the account.

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

dialog-enter.js

module site/shared/dialog-enter.js

Makes Enter in a dialog's text field confirm the dialog instead of cancelling it, in the tools whose dialogs list Cancel first.

Where it lives

Before you change it 1
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule

offline-store.js

module site/shared/offline-store.js

What a tool keeps on this device for offline use: kept copies of files and the outbox of changes made offline, each with a request id so the server applies it once.

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

offline-api.js

module site/shared/offline-api.js

Makes a tool's API calls work offline (Fableknot stories, Worldquill pages): what was read answers without a connection, offline saves wait in the outbox, and an item changed elsewhere meanwhile keeps both versions.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

painter.js

module site/shared/painter.js

Moonbrush: the chat writes a prompt, ComfyUI paints.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

pc-light.js

module site/shared/pc-light.js

Shows whether an AI PC is on.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

device-ai.js

module site/shared/device-ai.js

Small AI in the browser while no PC is on.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

device-ai-engine.js

module site/shared/device-ai-engine.js

The WebGPU engine behind it, in a hidden frame.

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

gablemark-upload.js

module site/shared/gablemark-upload.js

Sends a chosen document to Gablemark's encrypted vault and asks before a delete.

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

gablemark-ai.js

module site/shared/gablemark-ai.js

The AI buttons of Gablemark's calculator: explain, ask, compare and fill the inputs from a sentence, answered by the admin's own PC.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

ask.js

module site/shared/ask.js

Draws an AI's question as buttons, lists and a short form, and sends the answer back.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

voice.js

module site/shared/voice.js

The microphone button beside Send in every AI message box.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

voice-engine.js

module site/shared/voice-engine.js

The speech model's hidden frame, with voice-worker.js running Whisper.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

voice-worker.js

module site/shared/voice-worker.js

Runs the Whisper speech model for voice input.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

tts-reader.js

module site/shared/tts-reader.js

Read aloud for PDFs: a player under the PDF bar that reads the pages paragraph by paragraph with a voice picker and speed control, all on the reader's own device.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

tts-worker.js

module site/shared/tts-worker.js

Turns sentences into speech with a Piper voice (ONNX runtime and phonemizer from seppo.app) in a worker; nothing leaves the device.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

tts-i18n.js

module site/shared/tts-i18n.js

Read aloud's texts in English, German, French and Spanish.

Where it lives

Before you change it 3
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule
  • Four languages. Text people read exists in English, German, French and Spanish with the same keys in each. Read the rule

hollowkeep-files.js

module site/shared/hollowkeep-files.js

Attach and save files between Whisperglass and Hollowkeep.

Before you change it 3
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule
  • Stored data is people's. Files, worlds, chats, boards and stories belong to the people who made them. Copy first and check size and SHA-256 before an original goes, keep removed originals in a holding folder, and make migrations safe to stop and run again. Read the rule

viewer3d-frame.js

module site/shared/viewer3d-frame.js

Opens a 3D model in a sandboxed frame (the viewer at seppo.app/viewer3d/) and hands it the file's bytes; used by Hollowkeep and by models linked into Worldquill worlds.

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

worldquill-i18n.js

module site/shared/worldquill-i18n.js

Worldquill's texts, and those of the world links inside Whisperglass and Moonbrush, in four languages; merged into the table with i18n.add.

Before you change it 3
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule
  • Four languages. Text people read exists in English, German, French and Spanish with the same keys in each. Read the rule

pdf-markup.js

module site/shared/pdf-markup.js

PDF reader with highlight, text and drawing tools (vendored pdf.js); stores only the markup, never the original. Also reports the page being read and draws a PDF's first page as a cover for the Hollowkeep Library.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

pdf-i18n.js

module site/shared/pdf-i18n.js

PDF markup's texts.

Where it lives

Before you change it 3
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule
  • Four languages. Text people read exists in English, German, French and Spanish with the same keys in each. Read the rule

byline.js

module site/shared/byline.js

Who added or last changed something.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

format.js

module site/shared/format.js

Dates and sizes in the page's language, HTML escaping and saving a file, shared by Hollowkeep, Worldquill, Fableknot and Sketchmere.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

zip.js

module site/shared/zip.js

Writes and reads small zip files for the tools' exports and imports.

Where it lives

Before you change it 3
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule
  • Stored data is people's. Files, worlds, chats, boards and stories belong to the people who made them. Copy first and check size and SHA-256 before an original goes, keep removed originals in a holding folder, and make migrations safe to stop and run again. Read the rule

glass-slider.js

module site/shared/glass-slider.js

Liquid Glass range slider (with glass-slider.css): filled track, glass thumb, value tip, default tick; opt in per input, used by Grainwright.

Where it lives

Before you change it 3
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule
  • Stored data is people's. Files, worlds, chats, boards and stories belong to the people who made them. Copy first and check size and SHA-256 before an original goes, keep removed originals in a holding folder, and make migrations safe to stop and run again. Read the rule

storage-move.js

module site/shared/storage-move.js

Brings browser data from a tool's old subdomain to its new path.

Where it lives

Before you change it 3
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule
  • Stored data is people's. Files, worlds, chats, boards and stories belong to the people who made them. Copy first and check size and SHA-256 before an original goes, keep removed originals in a holding folder, and make migrations safe to stop and run again. Read the rule

storage-bridge.js

module site/shared/storage-bridge.js

The old address's side of that move.

Before you change it 3
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule
  • Stored data is people's. Files, worlds, chats, boards and stories belong to the people who made them. Copy first and check size and SHA-256 before an original goes, keep removed originals in a holding folder, and make migrations safe to stop and run again. Read the rule

moved.js

module site/shared/moved.js

Forwards old tool addresses.

Where it lives

Before you change it 3
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule
  • Stored data is people's. Files, worlds, chats, boards and stories belong to the people who made them. Copy first and check size and SHA-256 before an original goes, keep removed originals in a holding folder, and make migrations safe to stop and run again. Read the rule

restore.js

module site/shared/restore.js

Restores a saved file from an old app.

Where it lives

Before you change it 3
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule
  • Stored data is people's. Files, worlds, chats, boards and stories belong to the people who made them. Copy first and check size and SHA-256 before an original goes, keep removed originals in a holding folder, and make migrations safe to stop and run again. Read the rule

ai-setup.js

module site/shared/ai-setup.js

Admin: reorder AI providers.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

avatar-crop.js

module site/shared/avatar-crop.js

Profile picture picker.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

scrollforge.js

module site/shared/scrollforge.js

The admin Scrollforge workspace: plain chats, pages with preview and Publish, and scheduled tasks with their runs, filtered by kind; builds the list, conversation, model picker and side panels and streams each answer as it arrives.

Where it lives

Before you change it 2
  • Bump the ?v= number. When a shared file whose references carry ?v= changes, raise the number in every reference. Caddy caches versioned files forever, and check.sh fails on mismatches. Read the rule
  • Works offline. A page and its scripts, styles and fonts are plain same-origin files that site/app-sw.js can keep. What cannot work offline says so instead of failing silently. Read the rule

The AI computers

Members' own PCs. They connect out to the site, so nothing has to reach into them.

Home PC scripts

folder desktop

Scripts for Mirrorgate on the home PC.

Where it lives

Armoryhall launcher

folder armory-launcher

The Armoryhall launcher for the PC: a Windows shell (`app/`, built by `build.sh`) that opens the library, downloads and runs items. Its exe is served behind sign-in with `Armoryhall.version` for the update check.

Where it lives

Dawnforge Sync (Urdloom)

folder dawnforge-sync

Urdloom, formerly Dawnforge Sync: a Helix-style git client for artists on Windows that wraps the real git. Tested against real throwaway repositories; served at seppo.app/dawnforge-sync/ behind sign-in.

Where it lives

Streaming prototype

folder streaming-proto

Phase 0 of streaming to a PC, not wired into the live site: pure server functions (`session.js`) that bind a stream session to one account and one of its PCs, the bridge shim and the Sunshine pairing script. Plan in `docs/project/streaming-phase0.md`.

Where it lives

How data moves

5 journeys through the parts above. “Uses” and “Used by” on each card follow the order the parts appear in these journeys.

Opening a tool

  1. The browser asks Caddy for seppo.app/<tool>/.
  2. Caddy asks auth whether this person may open it.
  3. If yes, Caddy serves the tool's static page, whose scripts come from site/shared.
  4. The page's own calls go to /api/... and Caddy forwards them to the tool's service.

Chatting with the AI

  1. Whisperglass sends the message to auth.
  2. auth queues it for the asker's own AI PC (or another one in the circle).
  3. The PC, which keeps a connection open to auth, picks it up, runs Ollama and streams the answer back.
  4. Whisperglass shows it as it arrives; when web search is on, web-tools fetches pages first.

Saving to Hollowkeep

  1. A tool calls /api/hollowkeep, which Caddy routes to the Hollowkeep service with the same permission check.
  2. Hollowkeep writes the file by id and records it in its database.
  3. auth's space.js adds the size to the person's one storage limit.

A Worldquill world in a chat

  1. worldquill-link.js asks /api/worldquill for the world's pages.
  2. The chosen pages travel with the message as context.
  3. A saved answer goes back to Worldquill as a new page; pictures can come from Hollowkeep through auth's relay.

Going live

  1. Work is committed to main in git (Forgejo).
  2. Sebastian says go; deploy.sh on the server pulls main and restarts only the services whose files changed.
  3. Static pages need no restart; Caddy reloads when the Caddyfile changed.

Review list

6 parts have had 5 or more changes since its description was written, so the text may have gone stale. Counted from git history on fc2b581; if the text is still right, add "reviewed": "<short commit>" to the part in docs/code-map.json and run tools/docs-review.sh.