An open source audio transcription and transformation app. Powered by Lemonfox WhisperAPI and OpenRouter.
- Lemonfox WhisperAPI for audio transcription (STT)
- OpenRouter for LLM-powered transformations (summaries, notes, etc.)
- Vercel's AI SDK as the LLM framework
- Clerk for authentication
- Neon for postgres
- Next.js App Router
- S3 for object storage (audio files)
- Upstash Redis for rate limiting
- Prisma for ORM
- Vercel for hosting
- Create an account on the site with Clerk
- Upload an audio file, which gets uploaded to S3
- The audio is transcribed using Lemonfox WhisperAPI (Whisper model)
- Optionally, transform the transcription using OpenRouter LLMs (summarize, extract, blog posts, emails, etc.)
- View and manage your transcriptions in your dashboard
- Fork or clone the repo
- Create an account at Lemonfox for audio transcription API
- Create an account at OpenRouter for LLM API
- Create an account at Upstash for Redis (rate limiting)
- Create an account at AWS for S3 (file storage).
If this is the first time you're setting up AWS, then:
-
Create a bucket (e.g.
whisper-rogue-bucket) in your region. -
Under Permissions → CORS, add rules allowing your dev and production origins to issue
PUT/OPTIONS/GETrequests. Example:[ { "AllowedOrigins": ["http://localhost:3000", "https://your-production-domain"], "AllowedMethods": ["GET", "PUT", "POST", "HEAD", "OPTIONS"], "AllowedHeaders": ["*"], "ExposeHeaders": ["ETag"], "MaxAgeSeconds": 3000 } ] -
Create an IAM user (programmatic access) and attach S3 permissions (
AmazonS3FullAccessor a scoped policy for your bucket). -
On that user, add an inline policy allowing STS federation so
next-s3-uploadcan mint temporary credentials:-
Go to IAM Console → Users → click on your user whisperer.
-
Go to the Permissions tab.
-
Click Add permissions → Create inline policy.
-
In the visual editor, choose:
Service: STS (Security Token Service)
Actions: expand and scroll → enable GetFederationToken
Resources: choose “All resources”
It should look like:
Service: Security Token Service (STS) Actions: GetFederationToken Resources: All resources
Click Next, give it a name like:
AllowGetFederationToken
- and click Create policy.
-
-
Store the access key ID/secret for this user in
S3_UPLOAD_KEY/S3_UPLOAD_SECRET, and the bucket/region inS3_UPLOAD_BUCKET/S3_UPLOAD_REGION. Objects should remain private; the app now generates presigned GET URLs when it needs to download an upload for transcription.
-
- Create an account at Neon for PostgreSQL database. For the first time you're setting up Neon, you'll need to create a new project.
- Create a Clerk account at Clerk for authentication
- Create a
.envfile (use.env.examplefor reference) and add your API keys:LEMONFOX_API_KEY- Your Lemonfox API key for transcriptionOPENROUTER_API_KEY- Your OpenRouter API key for LLM transformations- Additional configuration options available in
.env.example
- Run
npm installand thennpm run db:pushto push the schema to Neon and thennpm run devto install dependencies and start the app locally
Users of your deployed app can optionally provide their own API keys for unlimited usage:
- Lemonfox API key → unlimited transcription minutes
- OpenRouter API key → unlimited transformations per day
Keys are entered through the app UI and stored in the browser's session storage.