A portable Windows desktop application for capturing, structuring, summarizing, and operationalizing meeting notes. Built with Tauri 2 + Rust + React + TypeScript.
- Raw Note Capture — Type notes live, paste transcripts (Teams/Zoom/Meet), import text/markdown files
- AI-Powered Processing — Clean grammar, generate structured minutes, extract action items, decisions, deliverables, risks, open questions
- Human-in-the-Loop — Review and accept/reject/edit AI suggestions before committing
- Action Item Tracking — Full CRUD with owner, due date, priority, status, confidence scoring, tentative flags
- Full-Text Search — FTS5-powered search across all meetings and notes
- Export — Markdown, CSV, JSON export with save-to-file dialog
- Portable Mode — Runs as a portable app without installation
- Secure — API keys stored in Windows Credential Store, never in config files
- Offline-First — Core features work without internet; AI features degrade gracefully
| Layer | Technology |
|---|---|
| Desktop Shell | Tauri 2 |
| Backend | Rust (rusqlite, keyring, reqwest) |
| Frontend | React 19, TypeScript, Vite |
| Styling | Tailwind CSS 4 |
| Database | SQLite with FTS5 |
| AI | OpenAI-compatible API (Ollama, LM Studio, OpenAI) |
- Rust 1.70+ with
cargo - Node.js 18+ with
npm - Windows 10 22H2 or later (for WebView2)
# Clone the repo
git clone <repo-url> meeting-notes
cd meeting-notes
# Install frontend dependencies
npm install
# Run in development mode
npm run tauri devThe first cargo build will take a few minutes to download and compile Rust dependencies.
# Build optimized release
npm run tauri buildThe installer/executable is output to src-tauri/target/release/bundle/.
The app supports portable distribution — no installer required.
At startup, the app checks for these markers next to the executable:
- A file named
portable(can be empty) - OR a folder named
data/
If either exists, the app runs in portable mode and stores all data inside <exe_dir>/data/:
meeting-notes.exe
portable ← marker file (or just create a data/ folder)
data/
db/ ← SQLite database
config/ ← settings.json
exports/ ← exported files
logs/ ← application logs
If neither marker exists, data is stored in %APPDATA%/meeting-notes/.
- Build the release:
npm run tauri build - Copy the
.exefromsrc-tauri/target/release/ - Create a
portablefile (ordata/folder) next to it - Distribute the folder
No configuration needed. Returns realistic sample data for development and testing.
- Install Ollama and pull a model (e.g.,
ollama pull llama3) - In Settings, set:
- Provider:
openai-compatible - Endpoint:
http://localhost:11434/v1 - Model:
llama3
- Provider:
- Start LM Studio server
- In Settings, set:
- Provider:
openai-compatible - Endpoint:
http://localhost:1234/v1 - Model: (your loaded model name)
- Provider:
- In Settings, set:
- Provider:
openai-compatible - Endpoint:
https://api.openai.com/v1 - Model:
gpt-4o-mini(or your preferred model)
- Provider:
- Enter your API key in the API Key section (stored in Windows Credential Store)
meeting-notes/
├── src/ # React frontend
│ ├── components/
│ │ ├── ui/ # Base UI components (Button, Badge, Card, Tabs)
│ │ ├── layout/ # AppLayout, Sidebar
│ │ ├── meetings/ # NoteEditor
│ │ ├── actions/ # ActionItemRow
│ │ ├── ai/ # ExtractionReview
│ │ └── search/
│ ├── pages/ # Dashboard, Meetings, MeetingDetail, ActionItems, Settings
│ ├── hooks/ # useAutosave
│ ├── lib/ # api.ts (Tauri invoke wrapper), utils.ts
│ ├── types/ # TypeScript interfaces
│ └── styles/ # Tailwind globals
├── src-tauri/ # Rust backend
│ └── src/
│ ├── app/commands/ # Tauri command handlers (thin layer)
│ ├── domain/ # Domain models (Meeting, ActionItem, Minutes, etc.)
│ ├── services/ # Business logic
│ ├── db/ # SQLite repos, migrations, FTS5 search
│ ├── ai/ # Provider trait, MockProvider, OpenAiCompatibleProvider
│ ├── config/ # Portable mode, app config
│ ├── export/ # Markdown, CSV, JSON export
│ └── utils/ # Error types
└── ARCHITECTURE.md # Full architecture documentation
SQLite with WAL mode for performance. Schema includes:
- meetings — Meeting sessions with status tracking
- raw_notes — Original unprocessed notes (source of truth)
- processed_minutes — AI-generated structured minutes
- action_items — Tracked commitments with confidence scores
- decisions, deliverables, risks_blockers, open_questions — Extracted entities
- ai_processing_runs — Audit trail for AI operations
- meetings_fts — FTS5 full-text search index
Migrations run automatically on startup.
- All data stored locally by default
- API keys stored in Windows Credential Store via
keyringcrate - Keys never appear in logs, config files, or exports
- When using API-based AI providers, note content is sent to the configured endpoint
- No telemetry or analytics
MIT