Epi (named after Epimetheus, the Titan of afterthought) is a privacy-by-design desktop application that records meetings, transcribes them natively offline, and generates intelligent summaries using local Large Language Models (LLMs).
Built with Tauri v2, React 19, TypeScript 5.8, and Rust, Epi keeps your data securely on your machine β operating entirely offline by default with zero privacy trade-offs.
Epi wasn't built in a day. It evolved from a simple need into a context-aware local intelligence platform:
- The Itch: It started because I wanted a simple tool that records my voice and lets me transcribe and write action points.
- The Evolution: Then I wanted the tool to also record the audio from videos where I could add some context or questions by stopping the video and talking. Out of that I could create a summary of that video with my remarks.
- The Prototype: The tool initially turned into a Python app with a Flet frontend that I had to start manually in the terminal.
- The Final Form: After a lot of tinkering and changes, experimenting with different layouts and prototypes, I finally ended up with Epi β a polished, local-first Tauri desktop application.
Want to see how it works without downloading the desktop app? Check out the interactive web preview (with simulated recording, transcription, and summarization):
π Launch the Live Demo
- Low-latency, high-fidelity capture powered by
cpaldevice resolution and TCP loopback streaming to an isolatedffmpegprocess. - Audio is saved directly on your local disk as compressed Opus (
.ogg) files (~/Documents/Epi Library/Recordings/). - Supports simultaneous multi-device input and output selection.
- Offline transcription using WhisperX running in a managed local Python virtual environment (
whisperx_env). - Word-level timestamps, real-time live microphone transcription (
live_transcribe.py), and speaker diarization (with Pyannote HuggingFace token support). - CPU-Only Install Option: Option to install CPU-only PyTorch dependencies in
whisperx_env, saving ~3.8 GB of disk space.
- Extract meeting minutes, decisions, and action items using Ollama (Llama 3, Mistral, Qwen, etc.).
- In-App Ollama Model Manager (New in v1.1.0): Browse, pull (with live streamed percentage download progress), and delete Ollama models directly in the Engine tab, backed by native Rust disk space checks (
sysinfo).
- Global Glossary: Define domain-specific terms and acronyms that are automatically fed into WhisperX's
initial_promptto improve speech recognition accuracy on technical jargon. - Tag Context Injection: Assign tags with background context to recordings. During LLM summarization, active tag contexts and related historical recording summaries are injected inside
<BACKGROUND_CONTEXT>tags ahead of the transcript.
- Flexible filename templating (
epi_naming_schema) with token replacement ({title},{DD},{MM},{YYYY},{HH},{mm},{counter}). - Daily counters are automatically calculated against local SQLite timestamps.
- Sticky Pill Header: Floating navigation bar stays pinned to the top while scrolling long transcriptions or library lists.
- Tag Search: Filter recordings in the Library tab by assigned tags alongside title and text content.
- Scheduled Automations: Configure background rules to automatically run transcriptions or default summarizations on recordings.
- Multi-Tier Storage Cleanup: Reclaim disk space by performing audio-only deletions (preserving text transcripts and summaries), deleting summaries/transcripts only, or clearing application logs.
- Optional cloud fallbacks for OpenAI (Whisper & GPT-4o), AssemblyAI, Google AI Studio (Gemini), and Anthropic (Claude).
- API keys are encrypted at rest using Tauri Stronghold (
tauri-plugin-stronghold).
Epi is organized into four core workspace tabs:
- Studio Tab: Microphones and audio output device selection, record/stop button, real-time audio waveform visualization, and live microphone transcription.
- Analysis Tab: Complete transcript editor, speaker label inspection, summary generation, custom prompt template selection, and tag context injection.
- Library Tab: Filterable recording history with tag search, playback control, re-transcription actions, and granular multi-tier storage deletion options.
- Engine Tab: Central control center for Ollama model downloading/deletion, WhisperX setup & CPU-only toggle, built-in one-click FFmpeg manager, Global Glossary & Tags configuration, Naming Schemas, Automations, and Stronghold-encrypted Cloud API keys.
| Subsystem | Technology | Purpose |
|---|---|---|
| Frontend | React 19 Β· TypeScript 5.8 (Strict) Β· Vite 7 | Modern reactive component interface |
| Styling & Icons | Vanilla CSS Custom Properties Β· lucide-react |
Glassmorphism aesthetic, dark/light theme binding |
| Desktop Runtime | Tauri v2 (@tauri-apps/api/core) |
Native OS IPC, window management, permissions |
| Backend Core | Rust 2021 Edition Β· Tokio Β· sysinfo |
Async command dispatch, disk space check, process supervision |
| Audio Engine | cpal Β· ffmpeg (TCP Loopback) |
Device enumeration, audio streaming, Opus .ogg encoding |
| Local AI Engine | WhisperX (Python 3.10+ venv) Β· Ollama Daemon | Offline speech recognition & LLM summarization |
| Storage & Security | SQLite (tauri-plugin-sql) Β· Tauri Stronghold |
Relational metadata storage & encrypted secret storage |
+-----------------------------------------------------------------------------------+
| REACT 19 FRONTEND |
| App.tsx <--> SessionContext <--> LibrarySettingsContext <--> WebShowcase |
+------------------------------------------+----------------------------------------+
| Tauri IPC invoke()
v
+-----------------------------------------------------------------------------------+
| RUST TAURI BACKEND |
| lib.rs <--> audio/ <--> whisperx/ <--> cloud_llm/ <--> local_llm/ |
+---------+--------------------+---------------------+------------------------------+
| | |
v v v
+--------------+ +------------------+ +-------------------+
| CPAL / FFmpeg| | Python WhisperX | | Ollama Local API |
| TCP Stream | | (whisperx_env) | | (localhost:11434) |
+------+-------+ +--------+---------+ +---------+---------+
| | |
+--------------------+-----------------------+
| File System / SQLite
v
+-----------------------------------------------------------------+
| LOCAL STORAGE: ~/Documents/Epi Library/ & AppData/epi_meta.db |
+-----------------------------------------------------------------+
- Recording Lifecycle:
SessionContext.startRecording()-> Tauri IPCstart_recording-> Rust allocatescpalaudio buffer -> streams over local TCP socket ->ffmpegwrites.ogg->stop_recordingflushes output -> SQLite record created. - Transcription Lifecycle: Audio path passed to
run_whisperx-> Rust invokeswhisperx_env/bin/whisperxwith Glossaryinitial_prompt-> generates text + word timestamps ->.txt/.jsonsaved toTranscriptions/-> SQLite updated. - Summarization Lifecycle: Transcript text + prompt template +
<BACKGROUND_CONTEXT>tags sent togenerate_local_summary(Ollama) orgenerate_cloud_summary-> markdown result saved toSummaries/and SQLite.
Epi runs across platforms and primarily targets Linux, while fully supporting Windows and macOS.
- Node.js (v18+)
- Rust Toolchain (1.80+)
- FFmpeg: Available in system PATH OR automatically downloaded via Epi's built-in one-click installer into
{AppData}/ffmpeg/. - Python 3.10+ (required for the local WhisperX virtual environment).
- Ollama (Optional, for local LLM inference): Running on
http://localhost:11434.
# 1. Clone the repository
git clone https://github.com/ekarbe/epi.git
cd epi
# 2. Install Node dependencies
npm install
# 3. Launch full Tauri desktop dev mode (Frontend + Rust Backend)
npm run tauri dev
# 4. Preview Web Showcase only (Mocked environment)
npm run dev
# 5. Type-check TypeScript codebase
npx tsc --noEmit
# 6. Build production desktop installer
npm run tauri build- Linux (Primary Target): Supported via
.deband.AppImage. Audio capture integrates natively with PulseAudio / PipeWire monitor sources. - Windows: Supported via
.msiand.exeinstallers. Uses WASAPI loopback audio capture. Unsigned binaries trigger Windows Defender SmartScreen ("More info" -> "Run anyway"). - macOS: Supported via
.dmginstallers (Apple Silicon & Intel).- macOS Audio Note: Native macOS security restrictions prevent direct recording of system output audio (Speakers/Headphones) via standard APIs. Microphone capture works out of the box. To capture system audio on macOS, install a virtual audio loopback driver such as BlackHole and select it in the Studio tab.
- macOS Gatekeeper Note: Unsigned macOS builds trigger an "unidentified developer" warning. Bypass by Control-clicking (or right-clicking)
Epi.appin Finder and selecting Open.
| Content Type | Location | Description |
|---|---|---|
| Audio Recordings | ~/Documents/Epi Library/Recordings/ |
Compressed Opus (.ogg) audio files |
| Transcripts | ~/Documents/Epi Library/Transcriptions/ |
Raw text (.txt) and word-timestamp JSON (.json) |
| Summaries | ~/Documents/Epi Library/Summaries/ |
Markdown (.md) LLM-generated summaries |
| Application Logs | ~/Documents/Epi Library/Logs/ |
Process logs (app.log, _ffmpeg.log) |
| Database | {AppData}/epi_meta.db |
SQLite metadata database (tauri-plugin-sql) |
| Secrets & Settings | {AppData}/settings.json |
Encrypted store (tauri-plugin-stronghold) |
| WhisperX Venv | {AppData}/whisperx_env/ |
Isolated Python virtual environment |
| Local FFmpeg | {AppData}/ffmpeg/ |
Managed standalone FFmpeg binary |
See the LICENSE file for license rights and limitations (GPLv3).
Epi - Local-first Meeting Intelligence
Copyright (C) 2026 Eike Christian Karbe
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.