Meetings
Private internal tool

All screenshots show fictional sample data. The people, clients, cases, meetings and transcript are invented.
I built Plaud Capture for my law firm. We record our meetings on Plaud recorders. Every 15 minutes, a program on an office Mac picks up new recordings and uses an AI model to split each conversation by case. For each case it writes a short summary, lists the next steps, and drafts a time entry for each person who was there.
Those show up in a web app the attorneys check like an inbox. The rule I built around: it doesn't guess quietly. If it can't tell which case was being discussed, or hears a name it can't match to someone at the firm, it asks, and that time waits until someone answers. Approved time goes to FreshBooks, and follow-ups can be sent to Asana with a click.
Built with
- Language: TypeScript 5.9, Node.js (≥ 20), npm workspaces
- Web app: Next.js 16.3, React 19.2, Tailwind CSS 4.3, hosted on Vercel
- Database, sign-in, file storage: Supabase (Postgres with row-level security; `supabase-js` 2.112, `@supabase/ssr` 0.12), Google Workspace sign-in
- AI: Anthropic Claude via `@anthropic-ai/sdk` 0.120 to split transcripts by case and draft summaries, next steps and billing lines, with a simpler rule-based parser as the fallback
- Recordings: Plaud CLI (`@plaud-ai/cli` 0.3.11), polled by a scheduled job (launchd) on a Mac
- Integrations: FreshBooks API (time entries), Asana API (tasks)
- Testing: Vitest 3.2; database tests run against PGlite (Postgres compiled to WebAssembly)