A bot-free desktop meeting assistant for Windows and Linux that captures, transcribes, and generates insights from Teams, Zoom, and Google Meet meetings.
# 1. Clone and setup
git clone <repo-url>
cd meet-scribe/apps/desktop
npm install
# 2. Generate icons (required for Windows)
npx @tauri-apps/cli icon app-icon.svg
# 3. Run in debug mode
npm run tauri dev
# 4. Build executable
npm run tauri buildFirst build takes 5-10 minutes (downloads Rust dependencies). Subsequent builds: ~30-60 seconds.
Debug locations:
- Frontend: Right-click โ Inspect Element (Ctrl+Shift+I)
- Backend: Use
println!()or VS Code + CodeLLDB extension - Database:
%APPDATA%\com.srprasanna.meet-scribe\meet-scribe.db(Windows) or~/.local/share/com.srprasanna.meet-scribe/(Linux)
Meet Scribe uses system-level audio capture (no bots joining meetings) to record, transcribe with speaker diarization, and generate AI-powered insights from your meetings. All data stays local on your machine.
Key Features:
- ๐ค Bot-free audio capture (WASAPI on Windows, PulseAudio on Linux)
- ๐ฃ๏ธ Speaker diarization with participant linking
- ๐ AI-generated summaries, action items, and insights
- ๐ Secure API key storage in OS keychain
- ๐พ Local SQLite database (no cloud sync)
- ๐ Pluggable ASR (AssemblyAI, Deepgram) and LLM services
-
Node.js 18+ and npm
-
Rust 1.70+ and Cargo
-
Platform-specific dependencies:
- MSVC Build Tools (Visual Studio 2019+)
- WebView2 runtime (usually pre-installed)
sudo apt install libwebkit2gtk-4.1-dev \ build-essential curl wget libssl-dev \ libgtk-3-dev libayatana-appindicator3-dev \ librsvg2-dev libpulse-dev
git clone <repository-url>
cd meet-scribeNavigate to the desktop app directory:
cd apps/desktopInstall Node.js dependencies:
npm installThe Rust dependencies will be downloaded automatically when you first build.
The application requires icons to build on Windows. Generate them from the included SVG:
npx @tauri-apps/cli icon app-icon.svgThis creates all required icon formats in src-tauri/icons/.
Before running the app, ensure all platform-specific prerequisites are installed (see Prerequisites section above).
Verify your setup:
npx @tauri-apps/cli infoThis should show:
- โ Rust toolchain installed
- โ System dependencies met
- โ Tauri CLI ready
Start the app in development mode with hot-reload:
npm run tauri devWhat happens:
- Vite dev server starts on http://localhost:1420
- Rust backend compiles (first time takes 5-10 minutes)
- Application window opens with the React UI
- Frontend changes hot-reload instantly
- Rust changes require app restart
Note: First compile downloads ~600MB of Rust crates and takes 5-10 minutes. Subsequent builds are much faster (30-60 seconds).
- Open the Settings page in the app
- Enter API keys for:
- ASR Service: AssemblyAI or Deepgram (for transcription with diarization)
- LLM Service: OpenAI or Anthropic (for generating insights)
- API keys are stored securely in your OS keychain
Get API Keys:
- AssemblyAI - Speech recognition with diarization
- Deepgram - Alternative ASR service
- OpenAI - GPT models for insights
- Anthropic - Claude models for insights
meet-scribe/
โโโ apps/desktop/
โ โโโ src/ # React frontend
โ โ โโโ pages/ # Dashboard, Settings, etc.
โ โ โโโ components/ # Reusable UI components
โ โ โโโ types/ # TypeScript type definitions
โ โโโ src-tauri/ # Rust backend
โ โ โโโ src/
โ โ โ โโโ domain/ # Core business models
โ โ โ โโโ ports/ # Trait interfaces
โ โ โ โโโ adapters/ # Platform implementations
โ โ โ โโโ commands/ # Tauri IPC commands
โ โ โโโ migrations/ # Database migrations
โ โโโ package.json
โโโ docs/ # Documentation
โโโ CLAUDE.md # Development guide for AI assistants
Meet Scribe uses a ports-and-adapters (hexagonal) architecture:
- Domain Layer: Core business logic and models (platform-agnostic)
- Ports: Trait interfaces defining contracts
- Adapters: Platform-specific implementations (WASAPI, PulseAudio, external APIs)
See CLAUDE.md for detailed architecture documentation.
Standard development mode (recommended):
cd apps/desktop
npm run tauri devThis starts:
- Vite dev server with hot module replacement (HMR)
- Rust backend in debug mode
- Application window with DevTools enabled
Frontend-only development (faster iteration for UI work):
npm run devOpens the React app in your browser at http://localhost:1420. Backend features won't work, but great for UI/CSS development.
In the running app:
- Right-click anywhere in the app
- Select "Inspect Element" or press
Ctrl+Shift+I(Windows/Linux) - Chrome DevTools opens - use Console, Network, React DevTools
In VS Code:
- Install "Debugger for Chrome" extension
- Add to
.vscode/launch.json:
{
"type": "chrome",
"request": "attach",
"name": "Attach to Tauri",
"port": 9222,
"webRoot": "${workspaceFolder}/apps/desktop/src"
}- Start app with:
npm run tauri dev - Start debugging in VS Code (F5)
Print debugging:
println!("Debug: {:?}", variable);
eprintln!("Error: {}", error); // Appears in terminalVS Code debugging:
- Install "CodeLLDB" or "C/C++" extension
- Add to
.vscode/launch.json:
{
"type": "lldb",
"request": "launch",
"name": "Debug Rust Backend",
"cargo": {
"args": ["build", "--manifest-path=apps/desktop/src-tauri/Cargo.toml"]
},
"cwd": "${workspaceFolder}"
}- Set breakpoints in Rust code
- Start debugging (F5)
Using Rust-analyzer:
- Install rust-analyzer VS Code extension
- Provides inline type hints, error checking, and "go to definition"
Logging in Rust:
// Add to Cargo.toml
log = "0.4"
env_logger = "0.11"
// In main.rs
env_logger::init();
log::info!("Application started");
log::debug!("Database query: {}", query);
log::error!("Failed: {}", error);Run with logging:
RUST_LOG=debug npm run tauri dev # Linux/macOS
$env:RUST_LOG="debug"; npm run tauri dev # Windows PowerShellRust backend tests:
cd apps/desktop/src-tauri
cargo testRun specific test:
cargo test test_nameRun with output:
cargo test -- --nocaptureFrontend tests:
cd apps/desktop
npm testFormat code:
# Rust
cd apps/desktop/src-tauri
cargo fmt
# TypeScript/React
cd apps/desktop
npm run formatLint code:
# Rust (with warnings)
cd apps/desktop/src-tauri
cargo clippy
# Rust (strict - fails on warnings)
cargo clippy -- -D warnings
# TypeScript
cd apps/desktop
npm run lintCheck Rust code without building:
cargo checkBuild release version:
cd apps/desktop
npm run tauri buildBuild process:
- Compiles Rust in release mode (optimized, no debug symbols)
- Builds React app for production (minified, optimized)
- Creates platform-specific bundles:
- Windows:
.msiinstaller insrc-tauri/target/release/bundle/msi/ - Linux:
.deband.AppImageinsrc-tauri/target/release/bundle/deb/andbundle/appimage/
- Windows:
Build output locations:
apps/desktop/src-tauri/target/release/
โโโ meet-scribe.exe # Windows executable
โโโ meet-scribe # Linux executable
โโโ bundle/
โโโ msi/
โ โโโ Meet Scribe_0.1.0_x64_en-US.msi # Windows installer
โโโ deb/
โ โโโ meet-scribe_0.1.0_amd64.deb # Debian package
โโโ appimage/
โโโ meet-scribe_0.1.0_amd64.AppImage # Universal Linux
For debugging production issues:
npm run tauri build -- --debugExecutable location: src-tauri/target/debug/meet-scribe.exe
Enable specific features:
npm run tauri build -- --features "feature-name"Target specific architecture:
# 64-bit only
npm run tauri build -- --target x86_64-pc-windows-msvc
# 32-bit (if needed)
npm run tauri build -- --target i686-pc-windows-msvcBefore distributing the executable:
-
Test the release build:
./src-tauri/target/release/meet-scribe.exe # Windows ./src-tauri/target/release/meet-scribe # Linux
-
Verify all features work:
- Database creation
- Settings page
- All navigation
- No console errors
-
Check file size:
- Windows .msi: ~15-20 MB
- Linux AppImage: ~20-25 MB
-
Code signing (optional but recommended):
- Windows: Sign with Authenticode certificate
- Linux: No signing required for AppImage
-
Create changelog for version
This project includes automated release workflows. See docs/RELEASE.md for complete instructions.
Quick release process:
-
Bump version (from root directory):
npm run bump:minor # or bump:patch, bump:major -
Update CHANGELOG.md with release notes
-
Commit, tag, and push:
git add -A git commit -m "chore: release v1.2.3" git tag v1.2.3 git push origin main --tags -
GitHub Actions automatically:
- Builds Windows MSI installer
- Builds Linux DEB and AppImage packages
- Creates GitHub release with all binaries
If the executable is too large:
# In Cargo.toml
[profile.release]
opt-level = 'z' # Optimize for size
lto = true # Link-time optimization
codegen-units = 1 # Better optimization
strip = true # Remove debug symbols# Development
npm run tauri dev # Full app in debug mode
npm run dev # Frontend only
# Building
npm run tauri build # Production build with installer
npm run tauri build -- --debug # Debug build
# Testing
cargo test # Rust tests
npm test # Frontend tests
# Code Quality
cargo fmt # Format Rust
cargo clippy # Lint Rust
npm run format # Format TypeScript
npm run lint # Lint TypeScript
# Version Management (from root directory)
npm run bump:patch # Bump patch version (0.1.0 -> 0.1.1)
npm run bump:minor # Bump minor version (0.1.0 -> 0.2.0)
npm run bump:major # Bump major version (0.1.0 -> 1.0.0)
npm run bump 1.2.3 # Set specific version
node scripts/bump-version.js # Manual version bump script
# Utilities
cargo check # Fast compile check
cargo clean # Clean build artifacts
npx @tauri-apps/cli info # System info
npx @tauri-apps/cli icon # Generate icons- Project structure and build system
- Database schema and migrations
- Domain models and port traits
- SQLite storage adapter
- Basic React UI shell
- Implement Windows WASAPI audio capture
- Implement Linux PulseAudio audio capture
- Audio buffer management and WAV encoding
- UI controls for audio capture
- Phase 3: ASR integration (AssemblyAI, Deepgram)
- Phase 4: LLM integration (OpenAI, Anthropic)
- Phase 5: Participant detection (experimental)
- Phase 6: Polish & enhancements
- Audio Capture: Captures desktop audio using OS-level APIs (no separate recording)
- Participant Detection: Identifies participants via accessibility APIs or OCR (optional)
- Transcription: Sends audio to AssemblyAI or Deepgram for speech-to-text with diarization
- Speaker Mapping: Links diarized speakers ("Speaker 1", "Speaker 2") to actual participant names
- Insight Generation: Sends transcript to LLM to generate summaries, action items, and key points
- Storage: Saves everything locally in SQLite database
- API keys are stored in OS keychain (never in database or config files)
- Meeting data stays local on your machine (no cloud sync by default)
- Audio buffers are temporary and discarded after transcription
- No bots join your meetings - capture happens locally
Problem: Required tools not installed or not in PATH.
Solution:
# Check installations
rustc --version
cargo --version
node --version
npm --version
# Install Rust (if needed)
# Windows: Download from https://rustup.rs
# Linux: curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Install Node.js (if needed)
# Download from https://nodejs.org/ (LTS version recommended)Problem: C++ build tools missing.
Solution (Windows):
- Install Visual Studio Build Tools 2019 or 2022
- During installation, select "Desktop development with C++"
- Restart terminal after installation
Solution (Linux):
sudo apt install build-essentialProblem: Icons not generated.
Solution:
cd apps/desktop
npx @tauri-apps/cli icon app-icon.svgProblem: First compilation downloads 600+ MB of dependencies.
Solutions:
- Normal: First build takes 5-10 minutes - this is expected
- Speed up future builds:
# Install sccache (optional) cargo install sccache export RUSTC_WRAPPER=sccache # Add to shell profile
- Check progress: Rust compilation shows progress in terminal
Problem: Frontend changes don't appear without restart.
Solution:
- Check Vite dev server is running: http://localhost:1420
- Check browser console for errors
- Hard refresh:
Ctrl+Shift+R(Windows/Linux) - Restart dev server: Stop
npm run tauri devand restart
Problem: Migration failed or corrupt database.
Solution (Development):
# Delete database and restart
# Windows
del "%APPDATA%\com.srprasanna.meet-scribe\meet-scribe.db"
# Linux
rm ~/.local/share/com.srprasanna.meet-scribe/meet-scribe.db
# Database will be recreated on next app startProblem: Vite dev server port conflict.
Solution:
# Find and kill process using port 1420
# Windows
netstat -ano | findstr :1420
taskkill /PID <PID> /F
# Linux
lsof -i :1420
kill <PID>
# Or change port in vite.config.tsProblem: WebView2 not installed.
Solution: Download and install: https://developer.microsoft.com/en-us/microsoft-edge/webview2/
Problem: Missing execution permissions.
Solution:
chmod +x src-tauri/target/debug/meet-scribe
chmod +x src-tauri/target/release/meet-scribeProblem: Another Cargo process is running.
Solution:
# Wait for other process to finish, or:
rm ~/.cargo/.package-cacheRust build errors:
cd apps/desktop/src-tauri
cargo build --verbose 2>&1 | tee build.log
# Check build.log for full error detailsCheck system setup:
cd apps/desktop
npx @tauri-apps/cli infoThis shows:
- Installed versions of all tools
- Missing dependencies
- Configuration issues
If all else fails, clean everything and rebuild:
# Clean Rust
cd apps/desktop/src-tauri
cargo clean
# Clean Node modules
cd apps/desktop
rm -rf node_modules package-lock.json
npm install
# Rebuild
npm run tauri buildCheck:
- Database directory exists and is writable
- No antivirus blocking the executable
- Run from terminal to see error messages:
./src-tauri/target/release/meet-scribe.exe
Find your database file:
- Windows:
%APPDATA%\com.srprasanna.meet-scribe\meet-scribe.db - Linux:
~/.local/share/com.srprasanna.meet-scribe/meet-scribe.db
View with SQLite browser:
# Install SQLite
# Windows: Download from https://www.sqlite.org/download.html
# Linux: sudo apt install sqlite3
# Open database
sqlite3 path/to/meet-scribe.db
.tables # List tables
.schema # View schema- Verify OS permissions for microphone/screen recording
- Ensure meeting app is running
- Check audio device selection in Settings
- Test system audio is working in other apps
If you encounter issues not covered here:
- Check existing issues: GitHub Issues
- Search Tauri docs: https://tauri.app/v2/
- Create detailed bug report with:
- Output of
npx @tauri-apps/cli info - Full error message
- Steps to reproduce
- Operating system version
- Output of
This project follows a ports-and-adapters architecture. When adding new features:
- Define the port (trait interface) in
src-tauri/src/ports/ - Implement the adapter in
src-tauri/src/adapters/ - Add Tauri commands in
src-tauri/src/commands/ - Build UI in
src/pages/andsrc/components/ - Write doc comments for all public functions
- Add TODOs for deferred work
See CLAUDE.md for detailed development guidelines.
This project is licensed under the MIT License - see the LICENSE file for details.
Copyright (c) 2025 Prasanna Sambandam Raghu
For issues and questions, please open an issue on GitHub.