Foresight
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.
The Problem
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
The Solution
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 |
Use Cases
- 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
Install
pip install foresight-transcribe
That's it. Or install from source:
git clone https://github.com/dnoma/foresight.git
cd foresight
pip install -e .
Setup Ollama (required for insights)
# 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 mistral
Verify installation
foresight --test
Usage
Watch Mode (recommended)
Leave it running. Drop files in the folder, they process automatically.
foresight --watch
Single File
Process one recording right now.
foresight --file meeting.m4a
Batch Mode
Have a backlog? Process everything at once.
foresight --batch
What the Output Looks Like
Transcript
---
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...
Insights
## 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]
Directory Structure
Auto-created on first run:
~/klavis-interviews/
├── raw/ ← Drop recordings here
├── transcripts/ ← Whisper output
├── insights/ ← LLM-extracted analysis
├── archive/ ← Processed originals
└── processing.log
Configuration
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 100KB
Customize the extraction prompt
The 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..."""
Options
| 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 |
--test |
Verify installation works |
System Requirements
- macOS (tested) or Linux
- ~6-7GB RAM during processing (models load/unload automatically)
- Python 3.9+
- ~5GB disk for models (one-time download)
Processing Time
| Audio Length | Time (M1 Mac) |
|---|---|
| 5 min | ~45 sec |
| 30 min | ~3 min |
| 60 min | ~6 min |
Why Local?
| 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.
Supported Formats
.m4a .mp3 .wav .mp4
Files under 100KB are skipped (filters out accidental recordings).
Troubleshooting
Ollama not running?
ollama serve # Start the server
ollama ps # Check if model is loaded
Transcription too slow?
foresight --file audio.m4a --model small
Check system status:
foresight --status
License
MIT
Contributing
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
Support
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.
Metadata
Release files for foresight-transcribe 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| foresight_transcribe-0.1.0.tar.gz | 20.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| foresight_transcribe-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 44.1 kB
Release files / foresight_transcribe-0.1.0.tar.gz
| Download URL | foresight_transcribe-0.1.0.tar.gz |
|---|---|
| Size | 20.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5422b273818651e39016680ae57d435c154354c74a8e340edd1019847f8283d4
|
|
BLAKE2b-256 checksum How to use checksums |
f0c0b82ae5efd3d2ae7d8286e0a045d930b37918f90fa081b3955f73105603e9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.7
|
Release files / foresight_transcribe-0.1.0-py3-none-any.whl
| Download URL | foresight_transcribe-0.1.0-py3-none-any.whl |
|---|---|
| Size | 23.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
32408fe66115b65ec7e64447458a82c6f2ea02c8ada3a924dcefb5bc117a76f2
|
|
BLAKE2b-256 checksum How to use checksums |
0122ab659e0fa3b2271ad3dddec7c3254d8f584cc67a5a0151a8ef63835e103a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.7
|