Vellum/web
mithral 3415102d5a Keep web/dist/.gitkeep alive across a build
The build deletes it. vite clears outDir (emptyOutDir: true), and that file is
the only reason //go:embed all:dist compiles in a fresh clone - without it a
clone that has not run a frontend build cannot run go build at all.

Found because it happened: a pnpm build during the transcode work removed the
tracked file, and it showed up as a deletion waiting to be committed. A
developer who ran a build and then staged everything would have broken every
clone silently, and the symptom would appear on someone else's machine.

The build now regenerates it, with the explanation in the file itself so the
next person to see it knows what it is for.
2026-10-12 12:12:02 -04:00
..
dist Keep web/dist/.gitkeep alive across a build 2026-10-12 12:12:02 -04:00
public Apply the brand: charcoal, blue-violet, purple, and the real logo 2026-10-10 17:41:49 -04:00
scripts Keep web/dist/.gitkeep alive across a build 2026-10-12 12:12:02 -04:00
src Play HLS in the web player with hls.js 2026-10-12 12:07:36 -04:00
.gitignore Web UI: Svelte app, embedded into the binary 2026-10-09 16:40:58 -04:00
embed.go Web UI: Svelte app, embedded into the binary 2026-10-09 16:40:58 -04:00
index.html Make the brand the only theme 2026-10-11 13:41:55 -04:00
package.json Keep web/dist/.gitkeep alive across a build 2026-10-12 12:12:02 -04:00
pnpm-lock.yaml Play HLS in the web player with hls.js 2026-10-12 12:07:36 -04:00
pnpm-workspace.yaml Web UI: Svelte app, embedded into the binary 2026-10-09 16:40:58 -04:00
README.md Web UI: Svelte app, embedded into the binary 2026-10-09 16:40:58 -04:00
svelte.config.js Web UI: Svelte app, embedded into the binary 2026-10-09 16:40:58 -04:00
tsconfig.json web: type process.env in vite.config (add @types/node) 2026-10-10 16:33:05 -04:00
vite.config.ts dev: fix the Vite proxy and add a one-command dev runner 2026-10-10 16:32:32 -04:00

Vellum web

Svelte 5 + Vite + TypeScript single-page app. It is built to a static bundle in dist/ and embedded into the Go binary, so all asset paths are relative (base: './' in vite.config.ts).

Commands

pnpm install
pnpm dev      # dev server on :5173, proxying /api to :7788
pnpm build    # writes dist/
pnpm check    # svelte-check

Run the Go server on :7788 (make run from the repo root) and pnpm dev proxies API and health requests to it, so cookies and sessions behave exactly as they will in production.

Layout

src/
  main.ts                 entry point
  App.svelte              login gate -> shell
  app.css                 design tokens and base styles
  lib/
    api.ts                typed client; mirrors the Go handlers
    session.ts            auth + library stores
    nav.ts                view state
    components/
      Login.svelte
      Shell.svelte        nav + view switch
      Libraries.svelte    library list, create, scan, delete
      LibraryView.svelte  item grid with covers
      Reader.svelte       epub.js reader with progress sync
      Users.svelte        admin user management

The reader resumes from a spine index, which is why progress positions are integers: it round-trips through the polymorphic progress table without needing a text column.