An app I built for myself: dictation, chat without the persona, notes, and tasks. Offline-first. Full control over the inputs, the outputs, and everything in between. Commercial tools optimize for a mainstream audience and lock-in — this one is personal, portable, and legible, built to understand agentic systems by making one.
Principles
- Personal — opinionated and unfinished on purpose
- Portable — leave, switch models, keep your data
- Legible — see context assembly, system prompts, and tools per message
- Exploratory — a learning lab, not a product roadmap theater
Run
npm install
npm run dev
Needs Rust. On macOS, Xcode Command Line Tools for the speech helpers.
To iterate on the chat UI in a regular browser (Vite + localStorage, no Tauri/Rust):
npm run dev:browser
Opens http://localhost:5173. Chat works without a key (dummy streamed replies). Paste an OpenAI API key in System → Data, or set VITE_OPENAI_API_KEY in .env, for real completions. Conversations stay in this browser's localStorage — not the desktop profile. Dictation, sync, tools, and images are stubbed.
npm run dist:mac # signed DMG — see BUILD.md
npm run demo # watch the site's demo scenes live (player at /demo-player.html)
npm run capture:site # render every scene into site/assets/ (PNG stills, MP4 clips)
Site screenshots and clips come from demo scenes in src/renderer/demo/scenes.ts: the real app on a scripted backend (demoAdapter.ts) with seeded data, a drawn cursor, scripted replies, and simulated Fn dictation. npm run demo plays them with hot reload; capture:site steps each one frame by frame on a paused clock in headless Chromium, so takes are identical and need no permissions. --only <scene> renders one; --gif also writes GIFs.
Surfaces
| |
|---|
| Desktop | Tauri (Rust + React) — chat modes (Chat/Decide/Write/Refine), tools, memory, notes, tasks, dictation, R2 sync |
| Browser | Same React chat UI via npm run dev:browser — localStorage; dummy replies unless an API key is set; debug shell, not a product client |
| Mobile | Native iOS companion — chat, capture, sync QR pairing (ios/README.md) |
| Models | OpenAI API or OpenAI-compatible locals (e.g. Ollama) |
| Speech | Apple Speech on macOS and iOS |
Docs