Not a quick voice memo app. Braindump is for the longer stuff — the 5-minute architecture walkthrough, the 30-minute problem deep-dive. Dump your brain, get it transcribed, then refine it with an inline AI rewriting chat.
Up to ~2h20m in a single recording
View on GitHub ArchitectureHit record in your browser. Pick your microphone. Talk for as long as you need — this is for real explanations, not quick memos, and a recording runs to about 2 hours 20 minutes. Give it a title.
A background worker transcribes your audio on-device with a local Whisper model — no API key, nothing leaves your machine. The text appears automatically when it's ready, and the audio file is deleted once it has been transcribed. Want the cloud? Switch to the OpenAI Whisper API with one env var.
Full-text search across all your transcriptions. Find that idea you had last Tuesday.
Below the transcript, an AI assistant locked to rewriting/editing streams suggestions inline. Toggle in your saved skills (tone, persona, format rules) and iterate via text or a quick voice button. Pick your provider — Anthropic, OpenAI, Google, and more.
Choose your microphone, hit record, and keep talking — a single recording runs to about 2 hours 20 minutes. Mono 24 kbps Opus is transparent to Whisper (which downsamples to 16 kHz mono anyway) while being small enough that length stops being the constraint. Live waveform, elapsed timer, and a readout of how much recording time you have left.
Audio is queued and transcribed asynchronously — on-device via whisper.cpp by default (no key), or the OpenAI Whisper API if you opt in. Real-time status updates via Server-Sent Events.
PostgreSQL full-text search with weighted ranking (title matches rank higher). Optional OpenSearch backend for larger deployments.
The transcript becomes the first message to a writing assistant locked to rewriting/editing — no shells, no execution, just text. Replies stream live over Mercure (every open tab sees the same deltas), markdown is rendered safely, and history persists across reloads. Voice input button with a mic device picker for quick refinements. Supports Anthropic, OpenAI, Google, Groq, Mistral, DeepSeek, xAI, and OpenRouter; each user brings their own API key, encrypted at rest (libsodium from APP_SECRET when self-hosted, Vault KMS on Symfony Cloud).
Reusable context documents you define once and toggle on per chat: tone guidelines ("slightly sarcastic, short sentences"), persona definitions ("formal bank email"), domain knowledge, writing rules. Activated skills get concatenated into the system prompt for every assistant call in that conversation — invisible in the message stream, but they shape every reply. Like agent skills in coding tools, but for writing.
If you don't type a title before recording, gpt-4.1-mini generates a short descriptive one from the transcript once Whisper finishes. The page header swaps in live via Mercure — no reload.
Built-in form login plus OpenID Connect (OIDC) single sign-on. Connect Okta, Azure AD, Google Workspace, Keycloak, or any OIDC provider. Set OIDC_ENABLED=1 and three env vars to activate.
EasyAdmin dashboard for user management. Create accounts, manage roles, view all recordings.
OpenAI requests with large audio files can take minutes. Workers handle this outside the HTTP request path, so users aren't stuck waiting. The web request enqueues a job and returns immediately.
Transcription status updates and rewriting-chat token deltas are published to per-resource topics. Browsers subscribe via SSE; PHP-FPM never holds the long-lived connection itself, so the app stays responsive.
Audio files must be accessible by both the web app and the transcription worker. Symfony Cloud's network-storage service gives both containers access to the same files.
Whisper resamples everything to 16 kHz mono, so recordings are captured as mono 24 kbps Opus — same accuracy, a fifth of the bytes. Once the transcript is saved the audio is deleted, so storage never grows. Failed transcriptions keep their audio, with a download link.
Database, message queue (a durable Doctrine transport, woken by LISTEN/NOTIFY), and full-text search all in PostgreSQL. No extra services to manage. Swap in RabbitMQ or OpenSearch when you need to scale.
User API keys are encrypted at rest via Symfony Cloud's managed Vault KMS transit encryption. The encryption key never leaves the vault.
A weekly Symfony Cloud task branches the app, runs composer update and the test suite on the branch, then auto-merges security fixes or emails a merge link — on its own on-demand container, not the production app.
The AI is locked to rewriting via a server-side system prompt. The app never runs anything it produces — replies are rendered as sanitized markdown (marked + DOMPurify). No shells, no tools, no eval.
Start with one command and nothing installed. Add hosted services later, one at a time — only if you want them.
No PHP, no database, no API keys. You get the whole app on localhost:8000 with on-device transcription, a bundled database and Mercure, and a seeded demo login (admin@example.com / password). First build takes a few minutes; later starts are quick.
You only need PHP 8.4 and Composer — SQLite is the default, so there's no database to install. Add ffmpeg + whisper.cpp and grab a model for transcription.
Everything below is optional — turn it on when you're ready, in any order. Secrets live in .env.local.
OPENAI_API_KEY).DATABASE_URL.OIDC_ENABLED=1).upsun push.