[![Electron][electron-shield]][electron-url] [![Node][node-shield]][node-url] [![React][react-shield]][react-url] [![TypeScript][typescript-shield]][typescript-url] [![License][license-shield]][license-url] [![Stargazers][stars-shield]][stars-url] [![Issues][issues-shield]][issues-url] [![Website][website-shield]][website-url]

Call.md Logo

Call.md

Turn meetings into live agent loops. Record, transcribe, and analyze meetings with real-time AI intelligence — before, during, and after calls.
Explore the docs »

View Demo · Install · Report Bug

--- ## Demo https://github.com/user-attachments/assets/94470e99-c0f6-4e35-9d03-b28efa362b3b ## Quick Install **macOS** (Apple Silicon & Intel): ```bash curl -fsSL https://artifacts.videodb.io/call.md/install | bash ``` After installation: 1. Launch Call.md from Applications or Spotlight 2. Grant system permissions when prompted (Microphone and Screen Recording required) 3. Register with your VideoDB API key ([get one free](https://console.videodb.io)) ### Platform Support | Platform | Installer | Status | |----------|-----------|--------| | macOS 12+ (Apple Silicon & Intel) | `curl` command above | Supported | | Windows | — | Not available yet ([#29](https://github.com/video-db/call.md/issues/29)) | | Linux | — | Not available yet | **There is no Windows installer today.** The blocker is not the Electron app — that builds on Windows and Linux — but the capture engine underneath it: [`@videodb/recorder`](https://www.npmjs.com/package/@videodb/recorder) ships binaries for `darwin-x64` and `darwin-arm64` only. With no Windows binary there is nothing to record microphone, system audio or screen with, so the app now says so up front instead of failing partway into a meeting. You can still build and run everything around recording (UI, MCP servers, workflows, exports) on Windows and Linux — see [Building for other platforms](#building-for-other-platforms). Follow [#29](https://github.com/video-db/call.md/issues/29) for Windows support. --- ## Overview Call.md turns meetings into live agent loops. It records locally, transcribes in real-time (you vs them), and provides live intelligence during calls. When the meeting ends, it generates summaries with action items and can send data to your workflow automation platforms. ## Features ### During the Meeting (Live Intelligence) - **Dual-Channel Transcription** - Separate transcription for you (mic) vs them (system audio), powered by VideoDB - **Transcription Language** - Pick the meeting language in **Settings → Transcription**, or leave it on Automatic - **Live Assist** - AI generates contextual suggestions: things to say, questions to ask - **Conversation Metrics** - Real-time monitoring of talk ratio, speaking pace (WPM), questions asked, monologue detection - **Coaching Nudges** - Gentle rate-limited alerts when conversation needs steering - **MCP Auto-Triggering** - Detects information needs from conversation and calls your MCP tools automatically - **MCP Results Panel** - Inline display of tool outputs (markdown, links, structured data) during meetings - **Bookmarking** - Mark important moments for easy reference later ### Post-Meeting Intelligence - **AI-Generated Summaries** - Three parallel extractions: - Short overview (narrative summary) - Key points by topic (attributed to participants) - Action items (concrete next steps) - **Structured Export** - Markdown export with full transcript, summary, and metrics - **Workflow Webhooks** - Auto-send meeting data to n8n, Zapier, or CRMs when meeting ends ### Meeting Preparation - **Meeting Setup Wizard** - AI-generated probing questions based on meeting description - **Dynamic Checklist** - AI creates discussion checklist from meeting context - **Google Calendar Integration** - Sync upcoming meetings ### Privacy & Storage - **Local-First** - SQLite database, all data stored on your machine - **Screen & Audio Recording** - Capture screen, microphone, and system audio simultaneously - **Recording History** - Browse and review past recordings with full transcripts - **VideoDB Integration** - Transcription and AI features require internet connectivity ## How It Works **During Recording:** - Captures dual-channel audio (you vs them) and sends to VideoDB for real-time transcription via WebSocket - Runs live intelligence: metrics tracking, coaching nudges, and AI-generated assists - MCP agent automatically detects information needs and triggers relevant tools **After Recording:** - Generates three-part summary: narrative overview, key points, and action items - Sends meeting data to workflow automation platforms (n8n, Zapier, CRMs) - Exports to markdown with full transcript and intelligence ## Tech Stack - **Electron 34** - Desktop application framework - **TypeScript 5.8** - Full type safety across main and renderer processes - **React 19** - Modern UI framework with concurrent features - **Tailwind CSS + shadcn/ui** - Utility-first styling with high-quality component primitives - **tRPC 11** - End-to-end type-safe API layer between main and renderer - **Hono** - Fast HTTP server for tRPC API endpoints - **Drizzle ORM + SQLite** - Type-safe database operations with local storage - **Zustand** - Lightweight state management - **VideoDB SDK** (0.2.4) - Screen recording, transcription, and video processing - **MCP SDK** (1.0.0) - Model Context Protocol for tool integrations - **OpenAI SDK** (6.19.0) - LLM calls via VideoDB's OpenAI-compatible API - **Vite** - Fast frontend bundling and hot module replacement ## Prerequisites - macOS 12+ (Monterey or later) — required for recording, see [Platform Support](#platform-support) - VideoDB API Key ([console.videodb.io](https://console.videodb.io)) - System permissions: Microphone and Screen Recording For development: Node.js 18+ and npm 10+ ## Getting Started (Users) 1. **Install:** ```bash curl -fsSL https://artifacts.videodb.io/call.md/install | bash ``` 2. **Launch** the app and enter your VideoDB API key ([get one free](https://console.videodb.io)) 3. **Grant permissions** when prompted (Microphone and Screen Recording) 4. **Start Recording** - Click "New Meeting" and begin your first session The app will transcribe in real-time, show live assists, and generate a summary when you're done. --- ## Getting Started (Developers) 1. **Clone the repository:** ```bash git clone https://github.com/video-db/call.md.git cd call-md ``` 2. **Install dependencies:** ```bash npm install ``` 3. **Rebuild native modules for Electron:** ```bash npm run rebuild ``` 4. **Start development mode:** ```bash npm run dev ``` 5. **Register with your VideoDB API key** when the app opens ### Available Scripts | Command | Description | |---------|-------------| | `npm run dev` | Start development mode (main + renderer with hot reload) | | `npm run build` | Build TypeScript and React for production | | `npm run dist:mac` | Build macOS distributable DMG | | `npm run dist:win` | Build Windows NSIS installer (recording unsupported, see below) | | `npm run dist:linux` | Build Linux AppImage (recording unsupported, see below) | | `npm run typecheck` | Run TypeScript type checking | | `npm run test` | Run unit tests | | `npm run lint` | Run ESLint | | `npm run rebuild` | Rebuild native modules for Electron | | `npm run db:generate` | Generate database migration files | | `npm run db:migrate` | Apply database migrations | ### Building for other platforms electron-builder is already configured for Windows (NSIS) and Linux (AppImage), so you can produce an installer on those platforms: ```bash npm install && npm run rebuild && npm run dist:win ``` Build on the target OS. Cross-building is not supported here because `better-sqlite3` is a native module that has to be rebuilt for the host. What works in such a build: the full UI, MCP servers, workflows, settings, history, and markdown export. What does not: starting a recording — the VideoDB capture engine has no binary for the platform, and the app returns a clear error rather than crashing. Track [#29](https://github.com/video-db/call.md/issues/29) for progress. ## MCP Server Setup Connect MCP servers in **Settings → MCP Servers**: 1. Click **Add Server** 2. Choose transport: **stdio** (local) or **http** (remote) 3. Configure and click **Connect** The MCP agent runs automatically during meetings, detects information needs from conversation, and triggers relevant tools. Results appear inline in the **MCP Results** panel. ## Development ### Project Structure ``` src/ ├── main/ # Electron Main Process │ ├── db/ # Database layer (Drizzle + SQLite) │ ├── ipc/ # IPC handlers │ ├── lib/ # Utilities (logger, paths, permissions) │ ├── server/ # HTTP server (Hono + tRPC) │ │ └── trpc/ # tRPC router and procedures │ └── services/ # Business logic │ ├── copilot/ # Meeting intelligence services │ │ ├── context-manager.service.ts │ │ ├── conversation-metrics.service.ts │ │ ├── nudge-engine.service.ts │ │ ├── sales-copilot.service.ts # Core orchestrator │ │ ├── summary-generator.service.ts │ │ └── transcript-buffer.service.ts │ ├── mcp/ # MCP orchestration and tool execution │ │ ├── connection-orchestrator.service.ts │ │ ├── intent-detector.service.ts │ │ ├── mcp-agent.service.ts │ │ ├── tool-aggregator.service.ts │ │ └── result-handler.service.ts │ ├── live-assist.service.ts │ ├── mcp-inference.service.ts │ ├── llm.service.ts │ └── videodb.service.ts ├── preload/ # Preload scripts (IPC bridge) ├── renderer/ # React Frontend │ ├── api/ # tRPC client │ ├── components/ # UI components │ │ ├── auth/ # Authentication modal │ │ ├── calendar/ # Calendar integration UI │ │ ├── copilot/ # Meeting intelligence UI │ │ ├── history/ # Recording history views │ │ ├── home/ # Home screen │ │ ├── icons/ # Icon components │ │ ├── layout/ # App layout (sidebar, titlebar) │ │ ├── mcp/ # MCP results/status components │ │ ├── meeting-setup/ # Meeting prep wizard │ │ ├── recording/ # Recording controls & live assist │ │ ├── settings/ # Settings editors │ │ ├── transcription/ # Live transcription panel │ │ └── ui/ # shadcn/ui components │ ├── hooks/ # Custom React hooks │ ├── lib/ # Utilities │ └── stores/ # Zustand state stores (session, copilot, mcp) └── shared/ # Shared types & schemas ├── schemas/ # Zod validation schemas └── types/ # TypeScript types ``` ### IPC API The app exposes IPC APIs through the preload script: - `window.electronAPI.mcp.*` - MCP server and tool operations - `window.electronAPI.mcpOn.*` - MCP event subscriptions ## Permissions (macOS) The app requires the following permissions: - **Microphone** - For voice recording - **Screen Recording** - For screen capture Grant these in **System Preferences > Privacy & Security**. ## Troubleshooting **Recording not starting:** - Check microphone and screen recording permissions in System Settings - Verify VideoDB API key is valid **Transcription not appearing:** - Ensure mic and system audio are enabled in settings - Wait 5-10 seconds for first transcripts - Check internet connectivity **Transcription is in the wrong language:** - Set the meeting language in **Settings → Transcription** (it applies to the next recording, not one already in progress) - If transcripts still come back in English, the language is not yet supported by the VideoDB transcription backend. The app sends `language_code` and falls back to the engine default rather than failing — see [#25](https://github.com/video-db/call.md/issues/25) **Development issues:** - Rebuild native modules: `npm run rebuild` - Check Node.js version (requires 18+) - Review logs: `~/Library/Application Support/call-md/logs/` ## Data Storage Application data is stored in: ``` ~/Library/Application Support/call-md/ ├── config.json # Settings; credentials encrypted at rest ├── data/ │ └── call-md.db # SQLite database └── logs/ └── app-YYYY-MM-DD.log # Daily log files ``` ## Security Everything below stays on your machine; only audio, video and prompts go to VideoDB. - **Credentials at rest** — the VideoDB API key in `config.json` and in the SQLite `users` table is encrypted through the OS keychain (Keychain on macOS, DPAPI on Windows, libsecret on Linux). Access tokens are stored as SHA-256 digests, never in the clear. MCP server env vars, HTTP headers and OAuth tokens are encrypted with AES-256-GCM under a keychain-wrapped key. - **Local API** — the tRPC server binds to `127.0.0.1` only and accepts CORS requests from loopback origins, so nothing on your network can reach it. Every procedure except registration requires a valid access token. - **File permissions** — the app data directory is `0700` and the database, config, tokens and logs are `0600`. - **Renderer** — both windows run with `contextIsolation`, no Node integration, and the Chromium sandbox enabled. The API key is never written to localStorage. - **Webhooks** — workflow URLs are validated at save time *and* at call time. Non-HTTP(S) schemes, embedded credentials, redirects, and hosts that resolve to loopback, private, link-local or cloud-metadata addresses are rejected, so a webhook cannot be used to reach inside your network. - **Logs** — credential-shaped fields are redacted before anything is written. Upgrades migrate existing data in place on first launch; you do not need to log in again. Report security issues via [GitHub Issues](https://github.com/video-db/call.md/issues). ## Community & Support - **Documentation:** [docs.videodb.io](https://docs.videodb.io) - **Issues:** [GitHub Issues](https://github.com/video-db/call.md/issues) - **Discord:** [Join community](https://discord.gg/py9P639jGz) - **API Key:** [VideoDB Console](https://console.videodb.io) ---

Made with ❤️ by the VideoDB team

--- [electron-shield]: https://img.shields.io/badge/Electron-34-47848F?style=for-the-badge&logo=electron&logoColor=white [electron-url]: https://www.electronjs.org/ [node-shield]: https://img.shields.io/badge/Node.js-18+-339933?style=for-the-badge&logo=node.js&logoColor=white [node-url]: https://nodejs.org/ [react-shield]: https://img.shields.io/badge/React-19-61DAFB?style=for-the-badge&logo=react&logoColor=black [react-url]: https://reactjs.org/ [typescript-shield]: https://img.shields.io/badge/TypeScript-5.8-3178C6?style=for-the-badge&logo=typescript&logoColor=white [typescript-url]: https://www.typescriptlang.org/ [license-shield]: https://img.shields.io/badge/License-MIT-yellow.svg?style=for-the-badge [license-url]: https://opensource.org/licenses/MIT [stars-shield]: https://img.shields.io/github/stars/video-db/call.md.svg?style=for-the-badge [stars-url]: https://github.com/video-db/call.md/stargazers [issues-shield]: https://img.shields.io/github/issues/video-db/call.md.svg?style=for-the-badge [issues-url]: https://github.com/video-db/call.md/issues [website-shield]: https://img.shields.io/website?url=https%3A%2F%2Fvideodb.io%2F&style=for-the-badge&label=videodb.io [website-url]: https://videodb.io/