build · Oct 2026
Prepo
Solo build: product, data model, app, extraction, follow-ups, and desktop shell
- Next.js
- TypeScript
- PostgreSQL
- Drizzle
- Tauri 2
- OpenRouter
Summary
Prepo is a proxy project manager. A meeting goes in as a recording, a transcript, or pasted minutes, and comes out as minutes, decisions, open questions, and assigned tickets. It then follows up on those tickets and syncs them with Linear.
Problem
Action items usually die in a notes document. The meeting ends with a list of things somebody said they would do, and the list is never assigned, never scheduled, and never checked again. The gap is not note taking but the follow-through after the notes.
Approach
A pnpm monorepo with a Next.js app, a Tauri 2 desktop shell, shared Zod schemas, and a Postgres schema of 25 tables behind row-level security. Extraction is one model call per meeting through OpenRouter. The transcript is sent as untrusted JSON, the reply has to match a JSON Schema, and every action item must cite a segment token that resolves to a real row. An item that cannot be resolved is dropped, not repaired. Owners resolve only against workspace members, dates land at 17:00 in the owner's timezone, and writes run as a non-owner database role inside a workspace-scoped transaction.
Outcome
The app records or imports a meeting, transcribes it, extracts minutes and action items, and puts them through a review screen with the source quote. Approved items become tickets with an escalation ladder. Tickets mirror into Linear through a queue that never makes a local write wait on the network, and Linear changes come back through a signed webhook.
Honest limitations
There is no verified Resend sending domain, so email follow-ups only reach the account's own address; refused sends are recorded with Resend's reason. Deepgram is wired but unconfigured, so import-by-transcript is the working path. The Tauri desktop shell is compiled and tested but not packaged or published. Push notifications, PII redaction before the model call, and automated extraction quality evals are not implemented.
Detail
- Grounding before storage
- The model's reply has to pass the same Zod schema the prompt describes. Every action item cites a transcript segment, and the quote shown in review is read from the transcript rather than from the model's prose.
- Tenant boundary in the database
- Row-level security and a non-owner application role enforce the workspace boundary, so a cross-tenant read returns nothing and a cross-tenant write is rejected. Signing in as the second seeded owner and opening the first workspace returns 404.
- A queue between local and Linear
- Local ticket writes commit first. A separate queue performs the Linear call, backs off and retries on failure, and reports sync status on the ticket page.
- Honest gaps
- The README records what is wired but unconfigured, what is built but unpublished, and what is deliberately not implemented, so a demo cannot be mistaken for a finished product.
Gallery

Next project
Joevix