Private meeting transcription with timestamps. Your audio never leaves your machine.
Features · Quick Start · Configuration · Contributing · License
Most transcription tools upload your recordings to someone else's server. Within runs OpenAI Whisper locally, so meeting audio stays on your desktop — with optional AI recaps only when you ask for them.
- 🔒 Local-first — runs Whisper on your machine; audio never leaves it.
- 🎙️ Any audio — upload MP3, WAV, M4A, FLAC, OGG, or WebM and track progress in-app.
- ⏱️ Timestamped transcripts — structured segments with quick copy actions.
- 📝 Optional AI summary — bring an OpenAI key to generate bullet notes (only transcript text is sent, never audio).
- 🎛️ Model picker — choose any Whisper checkpoint from
tinytolarge-v3to balance speed and accuracy.
┌────────────────┐ audio ┌─────────────────┐
│ React + Vite │ ───────────────► │ Flask backend │
│ (frontend) │ ◄─────────────── │ Whisper (local) │
└────────────────┘ transcript └────────┬────────┘
│ optional, text only
▼
┌─────────────────┐
│ OpenAI API │
│ (summaries) │
└─────────────────┘
Transcription happens entirely on your machine. The only outbound request is the optional summary call, which sends transcript text — never audio.
- Python 3.10+
- Node.js 18+
ffmpeginstalled and on your PATH (see below)- First run needs internet to download Whisper weights
Whisper depends on ffmpeg for audio decoding. Install it once:
macOS (Homebrew):
brew install ffmpegUbuntu/Debian:
sudo apt update
sudo apt install ffmpegWindows (PowerShell):
winget install Gyan.FFmpegVerify:
ffmpeg -versionClone the repo:
git clone https://github.com/aliffrhn/within.git
cd withinTerminal 1 — backend (Flask + Whisper):
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
# Optional overrides
export WHISPER_MODEL=medium # default: medium
export WHISPER_LANGUAGE=auto # default: auto
export PORT=5050 # default: 5050
python app.pyTerminal 2 — frontend (Vite):
npm install
npm run devOpen http://localhost:5173.
The dev server proxies /config, /transcribe, and /summarize to http://localhost:5050. If your backend runs elsewhere, set:
export VITE_BACKEND_URL=http://localhost:5050| Variable | Purpose | Default |
|---|---|---|
PORT |
Flask port | 5050 |
WHISPER_MODEL |
Default checkpoint | medium or recommended |
WHISPER_MODELS |
Comma-separated allowlist | tiny,base,small,medium,large-v2,large-v3 |
WHISPER_RECOMMENDED_MODEL |
Highlighted model in UI | medium |
WHISPER_LANGUAGE |
Default language hint | auto |
MAX_UPLOAD_MB |
Upload limit in MB | 40 |
OPENAI_API_KEY |
Server-side summary key | unset |
OPENAI_SUMMARY_MODEL |
Summary model | gpt-4.1-mini |
OPENAI_API_BASE |
Custom OpenAI-compatible endpoint | https://api.openai.com/v1 |
No such file or directory: 'ffmpeg'— ffmpeg is missing or not on your PATH. Install it using the steps above and restart your terminal.- First transcription is slow — Whisper downloads model weights on first use. Subsequent runs are much faster.
- Out of memory with large models — try a smaller checkpoint like
WHISPER_MODEL=small.
- Audio never leaves your machine — Whisper runs locally.
- Summary requests send only transcript text plus a language hint.
- Temp files are deleted after transcription completes.
Contributions are welcome! Whether it's a bug report, a feature idea, or a pull request — every bit helps.
- Read the Contributing Guide for setup and workflow.
- Check open issues or open a new one to discuss your idea.
- Fork, branch, and send a PR.
Please also see our Code of Conduct.
Distributed under the MIT License.
- OpenAI Whisper — the speech recognition model that powers Within.
- shadcn/ui & Radix UI — UI components.
- Vite, React, Tailwind CSS, and Flask.
If Within is useful to you, consider giving it a ⭐ — it helps others find the project.




