{"id":51180086,"url":"https://github.com/calcom/ai-desktop","last_synced_at":"2026-06-27T06:30:55.862Z","repository":{"id":359437331,"uuid":"1233276261","full_name":"calcom/ai-desktop","owner":"calcom","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-21T21:35:26.000Z","size":3528,"stargazers_count":0,"open_issues_count":0,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-31T13:27:17.712Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/calcom.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-08T19:32:23.000Z","updated_at":"2026-05-21T21:35:30.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/calcom/ai-desktop","commit_stats":null,"previous_names":["calcom/ai-desktop"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/calcom/ai-desktop","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calcom%2Fai-desktop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calcom%2Fai-desktop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calcom%2Fai-desktop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calcom%2Fai-desktop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/calcom","download_url":"https://codeload.github.com/calcom/ai-desktop/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calcom%2Fai-desktop/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34844344,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-27T02:00:06.362Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-27T06:30:55.121Z","updated_at":"2026-06-27T06:30:55.858Z","avatar_url":"https://github.com/calcom.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Cal.ai\n\nA small macOS menu-bar app that turns customer messages on your clipboard into doc-grounded replies, without leaving Slack or Gmail.\n\nIt's a thin desktop client over a RAG backend that does the actual retrieval and generation against the Cal.com Help Desk docs. This repo is the **client only** — production uses `https://api.cal.ai`, and the local backend lives at `~/Development/ai/`.\n\n## What it does\n\nTwo hotkey-driven workflows.\n\n### Clipboard one-shot — `⌘⌥R`\n\nYou're reading a customer message in Slack or Gmail.\n\n1. Select the message, hit `⌘C`.\n2. Press `⌘⌥R`. A \"Composing a reply…\" notification appears.\n3. ~2 seconds later: \"Reply ready — paste into Slack/Gmail.\"\n4. `⌘V` in your reply box.\n\nYou never see a window. The reply is grounded in the actual docs and styled in the voice you've selected from the menu bar.\n\n### Spotlight composer — `⌘⇧R`\n\nFor when you want to edit before sending. A 720-wide always-on-top window opens, pre-filled with your clipboard. Type or paste a message, hit `⌘↵` to generate, watch the reply stream in, see citations to the source docs, and `⌘⇧C` to copy. `Esc` closes it. Hitting `⌘⇧R` again toggles it closed.\n\nThe window is auto-sized — it starts compact (just an input + footer) and grows as content appears, like Spotlight or Raycast.\n\n### Menu bar\n\nA monochrome glyph in the menu bar exposes:\n\n- **Voice** submenu — pick the writer persona used by both workflows.\n- **Open composer** — same as `⌘⇧R`.\n- **Settings…** — API key + backend base URL.\n- **Quit**.\n\n## First run\n\nDefault base URL is `https://api.cal.ai`. For local development, run the backend from `~/Development/ai/` and point settings at your local URL.\n\nOn first launch with no API key configured, Cal.ai opens its Settings window and blocks until you fill it in:\n\n- **Backend base URL** (default `https://api.cal.ai`)\n- **API key** — issued by the backend (`bun run keys:create -- --name \"Cal.ai\" --scopes ask,voices:read --rate-limit 60` over there)\n\nThe key is validated against `GET /me` before it's saved. If the backend is unreachable or the key is invalid / missing required scopes, you'll see an inline error and saving is blocked.\n\n## Installing\n\nAfter building (see below), drag `Cal.ai.app` to **`/Applications`**. This matters: macOS Launch Services only fully indexes apps in standard locations, and notifications won't show your app icon until it's registered. If you want to keep iterating from `target/release/bundle/macos/`, register the bundle manually:\n\n```sh\n/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister \\\n  -f path/to/Cal.ai.app\n```\n\nThe first time you press `⌘⌥R` or `⌘⇧R`, macOS will prompt for **Accessibility permission** (System Settings → Privacy \u0026 Security). Cal.ai requests **Notifications permission** on launch so workflow status notifications are ready before you use the shortcuts. Both are required.\n\n## Stack\n\n- [Tauri 2](https://v2.tauri.app/) (Rust shell, macOS-first; Windows/Linux later)\n- [Bun](https://bun.com) as package manager + Vite runner\n- React 19 + TypeScript\n- Tailwind CSS v4 (via `@tailwindcss/vite`)\n- Vite\n\n## Building from source\n\nPrerequisites: Bun, Rust toolchain (stable), Xcode Command Line Tools.\n\n```sh\nbun install\nbun run tauri dev          # vite + Tauri shell, hot reload\nbun run tauri build        # release .app at src-tauri/target/release/bundle/macos/\n```\n\nOther useful commands:\n\n```sh\nbun run build              # tsc + vite build only (no Rust)\ncd src-tauri \u0026\u0026 cargo check\ncd src-tauri \u0026\u0026 cargo clippy --no-deps\nbun run tauri icon path/to/source.png   # regenerate bundle icons from a 1024×1024 PNG\n```\n\n## Configuration \u0026 persistence\n\nSettings are written to `tauri-plugin-store`'s `settings.json` in the macOS app config dir:\n\n- `api_key`\n- `base_url`\n- `selected_voice_key`\n- `voices_cache` (the last successful `/voices` response so the menu bar still works briefly without network)\n\n\u003e The API key is currently **stored in plaintext on disk**. Migrate to the Keychain before sharing this app with anyone else. (See [`AGENTS.md`](./AGENTS.md) TODOs.)\n\nTo change settings later: menu-bar icon → Settings…\n\n## Hotkeys\n\n| Shortcut | Where | Action |\n|---|---|---|\n| `⌘⌥R` | global | Clipboard one-shot reply |\n| `⌘⇧R` | global | Toggle composer window |\n| `⌘↵` | composer | Generate |\n| `⌘⇧C` | composer | Copy reply (after completion) |\n| `Esc` | composer | Close window |\n\nIf a global shortcut collides with another app, you'll see a notification on launch and the conflicting hotkey won't be registered. There's no in-app remap UI yet — change it in `src-tauri/src/shortcuts.rs::HOTKEY_*` and rebuild.\n\n## Architecture (one-paragraph version)\n\n`tauri.conf.json` declares no startup windows; the menu-bar tray is the only persistent UI. The composer and settings windows are created lazily by Rust commands and routed in React by window label. Workflow 1 (clipboard one-shot) runs **entirely in Rust** — no window involved — using `reqwest` for the SSE stream and Tauri's clipboard + notification plugins for I/O. Workflow 2 (composer) runs in a webview and routes its `/ask` SSE through a Rust command that emits stream events back to React. Settings and the voice list are stored canonically by Rust in `tauri-plugin-store` and mirrored in an in-memory `AppState` for fast tray reads.\n\nFor the full picture — module-by-module rundown, conventions for adding commands and permissions, and the list of macOS-specific gotchas we hit while building this — read [`AGENTS.md`](./AGENTS.md).\n\n## Status\n\nPersonal-tool quality. Works on the maintainer's machine; the API-key-in-plaintext caveat means it's not ready to hand to a teammate yet.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcalcom%2Fai-desktop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcalcom%2Fai-desktop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcalcom%2Fai-desktop/lists"}