The web client for flick — Svelte 5 + Vite, built with Bun. A pure client of the flick API; the contract is CONTRACTS.md.
Since 1.2 the marketing landing is native: the same Svelte app, the same i18n engine (en/de/es), the same design tokens — served at / to signed-out visitors, with /science and the legal pages as plain routes. The separate Astro site (and the brief /app/ split) is history; landing motion is Web Animations API only, so the AGPL story stays clean.
- Reader — frame-accurate rAF scheduler, fixed ORP pivot, scrubber, WPM control, sentence stepping, context ribbon.
- Library — paste, PDF, EPUB,
.txt, Kindle clippings, or a URL; full-text search; tags; trash with restore. - Habit — streaks, daily goal, stats, a year-in-review "wrapped", friends + shared links.
- Guest-first — read with no account; sign up later and your library merges in.
- Craft — six themes × light/dark, i18n (en/de/es), installable PWA.
No router library — one state machine in App.svelte, with URL routing + back-button support layered on:
stateDiagram-v2
[*] --> landing
landing --> library : Start reading (mints a guest)
landing --> auth : log in
auth --> onboarding : new account
auth --> library : returning
onboarding --> library : done / skip
library --> reader : open a book (/read/id)
reader --> library : esc / back
library --> stats
stats --> library
library --> premium
premium --> library
The reader never computes pacing — it plays server timelines on a rAF accumulator:
flowchart LR
api["GET /api/books/:id/timeline"] --> tl["timeline<br/>[text, orp, weight] …"]
tl --> sched["rAF accumulator<br/>dwell = weight × 60000 / wpm"]
sched --> word["ORP word<br/>pivot fixed, accent colored"]
sched -- "~5 s + pause/exit" --> ckpt["PUT position + words read"]
Monospace only. Square corners. One accent at a time. No gradients, glows, or shadows. Motion is earned (Web Animations API, not a library — even on the landing).
Needs the backend on :8484 (Vite proxies /api).
bun install && bun run dev # http://localhost:5173
bun run check && bun run buildReleases: bump package.json, tag vX.Y.Z, push the tag — CI verifies the version matches, runs the checks, and publishes the release.
part of one more — small tools that keep their data in plain files and never ask you to make an account.

