I built Filelathe to answer a simple itch: drop a file (or paste a URL) and get a floating window with the right tool—media players, editors, inspectors—or a freshly invented mini-app when the format is something nothing else handles.
Live at filelathe.com; source on GitHub. It is also listed on my /projects page.

At a glance
- What this is: A Vite SPA with Vercel serverless APIs that turns each open file into a floating window. The chrome is host UI; the body is a json-render Spec rendered through a local component catalog.
- Dual-model split: Jev (TypeSafe System One) decides and composes; Claude Haiku invents Specs only when the format is unknown and invent is the right call.
- Privacy default: Nothing is uploaded to a durable backend. Files live in the browser (and briefly in the API function for compose/invent). Invented Specs cache in IndexedDB on your machine.
Why not one big LLM?
Most “AI file viewer” demos ask a generative model to emit HTML or a free-form UI. That is flexible and also a reliability problem: unbounded output, hallucinated controls, and no typed contract between the model and the host.
Filelathe keeps generation inside a catalog. Known kinds (image, audio, CSV, PDF, tracker modules, and so on) get compose paths that walk catalog candidates. Unknowns either hit a dedicated player registry, fall through to a binary inspector, or—when Jev says invent—get a Spec that Haiku must build from the live component list.
That separation is intentional. System One is for decisions code can trust; Spec invention is generative and validated afterward.
Jev vs Haiku
| Jev | Haiku | |
|---|---|---|
| Role | Judgment + composition | Generation |
| Jobs | Route invent vs inspect; compose known-file UIs from candidates | Invent a catalog Spec for unknowns |
| Returns | Typed choices (and confidence) | Free-form text parsed into a Spec |
Jev never invents emulators or writes Spec JSON for unknowns. Player-registry matches are decided in code first; Jev only answers invent vs inspect when detection cannot classify the file and no host player applies. Compose walks candidates with choice questions so the Spec tree stays small and typed.
When invent runs, the server asks Haiku for a Spec that only uses components from the live catalog. Output is parsed, validated, and hydrated with file state. Failures (missing key, bad JSON, invalid types) use a deterministic fallback Spec instead of crashing. Successful invents cache in IndexedDB by content hash and by extension+MIME so the next similar drop can reuse the Spec.

What you can open today
Known paths include pixel editing for images, spreadsheet editing for CSV, PDF and video viewers, markdown rendering, an in-window page preview for URLs, and a chiptune3 / libopenmpt tracker player for XM, MOD, IT, S3M, and friends. Planned emulator formats go to the binary inspector on purpose—never invent an emulator from a Spec.

Tracker module → Play in the browser (libopenmpt / chiptune3); bytes stay in the tab.

Known image → PixelEditor (brush, colors, download PNG).

Open URL → in-window page preview (here navigating to Projects).
Hosting shape
The UI is a Vite SPA; APIs live under api/ (compose, invent-viewer, fetch-resource) with long maxDuration for invent/compose. Rate limits are sliding windows per client IP via Upstash Redis on Vercel (in-memory locally). Exceeded calls return 429 + Retry-After; missing Jev keys return 503.
This fits the same “small surface, explicit contracts” mindset I wrote about in How I Am Running Sites in 2026—agency earlier in the pipeline, but still reviewable artifacts and clear failure modes. It also rhymes with the catalog-constrained AI UI ideas in LICHEN: the model is a partner inside a designed interface, not an unbounded HTML generator.
What I want next
I care most about which obscure formats break invent in interesting ways, and about growing the catalog so compose stays better than invent for anything we can classify. Saved Specs can already be scrubbed and proposed as contributions under contrib/invented/—the long-term bet is that invented mini-apps become shareable, reviewable artifacts rather than one-off chat output.
Drop something weird at filelathe.com and tell me what you get.

