Turn recorded conversations into structured insights. Automatically.
Drop an audio file in a folder. Get back a searchable transcript and an AI-extracted summary with key themes, quotes, and follow-up questions.
100% local. No API costs. No data leaves your machine.
Recorded with vhs. The script lives at examples/demo.tape.
You record important conversations—interviews, user research calls, sales demos, meetings. Then the audio sits there because:
- Transcription services cost money and take time
- Reading a full transcript is tedious
- The insights you need are buried in 45 minutes of audio
- Organizing files manually is a chore
Audio file drops in folder
↓
[3-5 minutes]
↓
Transcript.md + Insights.md
↓
Original archived automatically
What you get:
| Output | Contents |
|---|---|
| Transcript | Full searchable text, YAML metadata, word count |
| Insights | Pain points, objections, decision criteria, key quotes, follow-up questions, executive summary |
- User Research — Extract patterns from customer interviews
- Sales Calls — Capture objections and buying signals
- Podcasters — Generate show notes and quotable moments
- Journalists — Transcribe interviews with structured highlights
- Founders — Process investor/customer conversations at scale
- Consultants — Document client discovery sessions
- Academics — Transcribe and analyze qualitative research
pip install foresight-transcribeThat's it. Or install from source:
git clone https://github.com/dnoma/foresight.git
cd foresight
pip install -e .# Install Ollama
brew install ollama # macOS
# or: curl -fsSL https://ollama.ai/install.sh | sh # Linux
# Start and pull model (~4GB)
ollama serve &
ollama pull mistralforesight --testLeave it running. Drop files in the folder, they process automatically.
foresight --watchProcess one recording right now.
foresight --file meeting.m4aUse a custom extraction template:
foresight --file meeting.m4a --prompt prompts/sales-call.txtHave a backlog? Process everything at once.
foresight --batchLaunch a simple drag-and-drop UI at http://localhost:8000:
foresight --uiInstall the UI dependency first:
pip install "foresight-transcribe[ui]"---
filename: customer-call-jan-11.m4a
duration: 34:22
word_count: 4521
model: whisper-medium
---
# Transcript: customer-call-jan-11
The full conversation, searchable and quotable...## PAIN POINTS
- Manual invoice processing takes 3 days each month
- No visibility into supplier risk until problems occur
## DECISION CRITERIA
- Must integrate with existing SAP system
- Needs to show ROI within 90 days
## KEY QUOTES
- "We've been burned twice by suppliers going bankrupt with no warning"
## FOLLOW-UP QUESTIONS
- What's the current approval workflow for new suppliers?
- Who else is involved in the vendor selection process?
## EXECUTIVE SUMMARY
[2-3 sentence summary of the entire conversation]See sample files in examples/:
examples/sample-transcript.mdexamples/sample-insights.md
Auto-created on first run:
~/klavis-interviews/
├── raw/ ← Drop recordings here
├── transcripts/ ← Whisper output
├── insights/ ← LLM-extracted analysis
├── archive/ ← Processed originals
└── processing.log
Set output_dir in foresight.yaml to change the base directory.
Edit the config in interview_processor.py (or after install: ~/.local/lib/python*/site-packages/interview_processor.py):
WHISPER_MODEL = "medium" # tiny|base|small|medium|large
OLLAMA_MODEL = "mistral" # or phi3, llama3, etc.
MIN_FILE_SIZE = 100000 # Skip files under 100KBThe EXTRACTION_PROMPT variable controls what the LLM extracts. Modify it for your use case:
# For sales calls
EXTRACTION_PROMPT = """Extract: objections raised, competitor mentions,
next steps agreed, budget signals..."""
# For user research
EXTRACTION_PROMPT = """Extract: user goals, frustrations,
current workflow, feature requests..."""You can also keep templates in files and pass one at runtime:
foresight --file meeting.m4a --prompt prompts/user-research.txtCreate foresight.yaml in your working directory to override defaults:
whisper_model: medium
ollama_model: mistral
prompt_template: user-research
output_dir: ./processedYou can also pass a path explicitly:
foresight --config /path/to/foresight.yaml --watch| Flag | Description |
|---|---|
-m, --model |
Whisper model size (default: medium) |
--skip-insights |
Transcribe only, skip LLM extraction |
--keep-original |
Don't move to archive after processing |
--dry-run |
Preview what would be processed |
--status |
Show pending files and system health |
--retry-failed |
Retry previously failed files |
--prompt |
Use a prompt template file for insights |
--config |
Load settings from a config file |
--test |
Verify installation works |
--ui |
Launch a simple web UI |
- macOS (tested) or Linux
- ~6-7GB RAM during processing (models load/unload automatically)
- Python 3.9+
- ~5GB disk for models (one-time download)
| Audio Length | Time (M1 Mac) |
|---|---|
| 5 min | ~45 sec |
| 30 min | ~3 min |
| 60 min | ~6 min |
| Local (this tool) | Cloud APIs | |
|---|---|---|
| Cost | Free | $0.006/min+ |
| Privacy | Data stays on device | Uploaded to servers |
| Speed | No upload/download | Network dependent |
| Availability | Works offline | Requires internet |
A 1-hour recording costs ~$0.36 on cloud transcription. Process 100 interviews and you've saved $36—plus your data never left your laptop.
.m4a .mp3 .wav .mp4
Files under 100KB are skipped (filters out accidental recordings).
Use-case templates live in prompts/:
prompts/sales-call.txtprompts/user-research.txtprompts/podcast-shownotes.txtprompts/meeting-notes.txtprompts/journalist-interview.txt
Pass one with --prompt to switch extraction style.
In foresight.yaml, prompt_template can be a template name (e.g., user-research)
or a full file path.
Ollama not running?
ollama serve # Start the server
ollama ps # Check if model is loadedTranscription too slow?
foresight --file audio.m4a --model smallCheck system status:
foresight --statusMIT
PRs welcome. Ideas:
- Speaker diarization (who said what)
- Custom prompt templates via config file
- Web UI for reviewing insights
- Export to Notion/Obsidian
- Slack/Discord notifications when processing completes
If this saved you time or money, consider giving it a star. It helps others discover the project.
Built by @dnoma — indie dev building tools that save time.