Upload audio, get a transcript with speaker labels, AI summary, quotes, chapters, and action items.
Self-host or fork. MIT licensed.
- Transcription — upload any audio or video file, get a full transcript in under a minute
- Speaker detection — automatically identifies and labels who said what
- AI report — summary, key takeaways, topics, entities, and at-a-glance stats
- Article generation — AI-written article from your transcript
- Notable quotes — verbatim quotes with speaker attribution, timestamps, and context
- Chapters — timestamped sections with timeline, progress tracking, and YouTube-format export
- Action items — extracted tasks with checkboxes
- Ask AI — chat with your files. Ask questions about a single recording or search across all your transcripts
- Search — full-text search across all transcripts and filenames
- Share — generate a public link to any transcript with full report
- Export — download as TXT, SRT, VTT, or Article (.md)
- User accounts — email/password or Google OAuth, email verification, password reset
Upload audio → AI transcribes & identifies speakers → AI generates report, quotes & chapters → View on dashboard
Processing happens in the background. You get notified when your transcript is ready.
At minimum, you need accounts with three services to get Phyrin running:
| Service | What it does | Free tier |
|---|---|---|
| Deepgram | Transcription AI | $200 credit |
| OpenAI | Report generation (summary, quotes, chapters) | Pay-as-you-go |
| Cloudflare R2 | Audio file storage | 10 GB free |
Database — Any PostgreSQL database works. Neon (free tier), Supabase, or a local Postgres via Docker.
Redis — Required for background job processing. Runs as a local Docker container — no external service needed. The included deploy workflow handles this automatically.
Emails — Resend is optional (3,000 emails/month free). The app works without it.
Hosting — you need a server to deploy on. A $4–6/month VPS is enough to start.
Each package has its own .env.example with the variables it needs. See packages/api/.env.example, packages/worker/.env.example, and packages/web/.env.example.
Setup is about 30 minutes if you're comfortable with a terminal.
pnpm installCopy the .env.example in each package and fill in your values:
cp packages/api/.env.example packages/api/.env
cp packages/worker/.env.example packages/worker/.env
cp packages/web/.env.example packages/web/.envcd packages/api
pnpm db:migratedocker run -d --name phyrin-redis -p 6379:6379 redis:alpinepnpm dev:api # API on :4000
pnpm dev:web # Frontend on :3000
pnpm dev:worker # Background workerOpen http://localhost:3000 and create an account.
A GitHub Actions workflow is included that builds and deploys to a DigitalOcean droplet. It works as-is for DigitalOcean, or with minimal changes for any other VPS.
On your server, create the config file:
mkdir -p /opt/phyrin
nano /opt/phyrin/.env # Paste your env vars hereIn your GitHub repo, add these secrets (Settings → Secrets):
| Secret | Value |
|---|---|
DROPLET_HOST |
Your server IP |
DROPLET_USER |
SSH user |
DROPLET_SSH_KEY |
Private SSH key |
DROPLET_SSH_PASSPHRASE |
SSH key passphrase (if any) |
Then go to Actions → Deploy → Run workflow. That's it.
Transcription model — set DEEPGRAM_MODEL in your .env (defaults to Nova 2). Change language with DEEPGRAM_LANGUAGE.
Summary model — set OPENAI_MODEL in your .env (defaults to GPT-4o-mini).
Logging — set LOG_DESTINATION to route logs to Datadog, Grafana Loki, CloudWatch, Axiom, BetterStack, or a local file.
Billing — set VITE_BILLING_ENABLED=true (web) and the matching API var to run a commercial deployment with Stripe. Leave unset (default) for personal/internal use — no Stripe required, larger upload limit.
This section is for developers customizing the codebase.
| Layer | Tech |
|---|---|
| API | Hono, Node.js, JWT (jose), Zod validation |
| Frontend | Vite, React, Tailwind CSS, shadcn/ui, Framer Motion |
| Background jobs | BullMQ, Redis |
| Database | PostgreSQL via Drizzle ORM, pgvector for semantic search |
| Storage | Cloudflare R2 (S3-compatible) |
| Transcription | Deepgram |
| Summaries | OpenAI |
| Resend | |
| Deploy | Docker, GitHub Actions, GitHub Container Registry |
packages/
api/ Hono API server — auth, files, admin routes
web/ React frontend — dashboard, transcript viewer, landing page
worker/ Background worker — transcription, summaries, scheduled cleanup
shared/ Shared types, database schema, constants
┌──────────┐ ┌──────────┐ ┌───────────┐ ┌──────────┐
│ React │────▶│ Hono API │────▶│ BullMQ │────▶│ Deepgram │
│ Frontend │◀────│ Server │ │ Worker │────▶│ OpenAI │
└──────────┘ └────┬─────┘ └─────┬─────┘ └──────────┘
│ │
┌────┴─────┐ ┌─────┴─────┐
│ Postgres │ │ R2 │
│ (Neon) │ │ (Storage) │
└──────────┘ └───────────┘
pnpm build # Build all packages
pnpm typecheck # Typecheck all packages
pnpm typecheck:api # Typecheck API only
pnpm typecheck:web # Typecheck frontend only
pnpm typecheck:shared # Typecheck shared onlyRebranding, one-off scripts, and migration notes for self-hosters: see docs/OPERATIONS.md.
Reach out at contact@phyrin.app.
MIT. Use it for anything, including commercial work. Attribution appreciated but not required.