{"slug": "show-hn-notebook-ai-local-first-meeting-notes-for-mac", "title": "Show HN: Notebook AI – local-first meeting notes for Mac", "summary": "A developer released Notebook AI, an MIT-licensed, local-first AI meeting-notes app for Mac, as a monorepo on GitHub. The app pairs an Electron/React/Vite desktop recorder with a local FastAPI/LangChain sidecar that stores markdown notes on disk and streams summarize, rewrite and extract_action_items transforms to provider APIs such as OpenAI and OpenRouter using locally stored BYOK keys. Notes, transcription and AI work run without an account; only Google Drive mirroring and the web credential vault require sign-in through a separate FastAPI cloud API backed by Supabase.", "body_md": "Desktop-first AI note taker with a local-first Electron UX, a Next.js web app, and FastAPI/LangChain backends.\n\nLicensed under the [MIT License](https://github.com/sridharchaildn/notebook-ai/blob/master/LICENSE). Third-party programs are listed in [NOTICE](https://github.com/sridharchaildn/notebook-ai/blob/master/NOTICE).\n\nYou can open the desktop app and keep notes on this machine without an account. Sign in only when you want Google Drive mirror or the web account vault.\n\nNotebook AI is a monorepo:\n\n- `apps/desktop` : Electron + React + Vite desktop recorder/editor\n- `apps/web` : Next.js landing, signup/signin, onboarding, and web settings\n- `services/local-sidecar` : local FastAPI note/transcript API\n- `services/cloud-api` : hosted FastAPI auth/provider/settings API\n- `packages/contracts` : shared TypeScript API contracts\n- `packages/theme` : shared design tokens (light/dark)\n- `packages/ui` : shared React primitives\n\n```\nflowchart TB\n  subgraph machine[\"Your machine\"]\n    Desktop[\"Desktop app<br/>Electron · React · Vite\"]\n    Web[\"Web app<br/>Next.js\"]\n    Sidecar[\"Local sidecar<br/>FastAPI · LangChain\"]\n    Notes[(\"Markdown notes<br/>on disk\")]\n    Desktop -->|\"localhost\"| Sidecar\n    Sidecar --> Notes\n    Desktop -->|\"open sign-in in browser\"| Web\n  end\n  subgraph network[\"Network\"]\n    Cloud[\"Cloud API<br/>FastAPI\"]\n    Supabase[\"Supabase\"]\n    Providers[\"Provider APIs<br/>OpenAI · OpenRouter · …\"]\n    Cloud --> Supabase\n  end\n  Web -->|\"signin · onboarding · BYOK\"| Cloud\n  Desktop -->|\"desktop auth exchange · Drive OAuth flows\"| Cloud\n  Sidecar -->|\"streamed transform · transcription\"| Providers\n```\n\nA **sidecar** here is a small **local HTTP service** you run next to the desktop app (not a second cloud). It exists so normal work stays **local-first and low-latency**:\n\n- **Notes:** Create, list, and save markdown through the sidecar so content stays on your filesystem and the UI does not depend on a remote service for every edit.\n- **AI and transcription:** Streaming transforms and audio round-trips go to the sidecar on`localhost` , which talks to provider APIs using keys from the sidecar`.env` or keys saved locally by the desktop app on that device.\n\nThe **cloud API** is a separate companion: Supabase auth validation, session refresh/logout, web/mobile provider vault storage, storage preferences, desktop auth handoff, and Drive integration metadata. It does **not** store your note markdown or sit in the path for debounced note persistence. Desktop notes, local provider keys, transcription, and AI work without signing in. Google Drive mirror and the web vault require an account.\n\nCredential scope is intentionally split:\n\n- Desktop BYOK is stored locally on the device through `services/local-sidecar` and is not synced to the account vault.\n- Web and future mobile clients store BYOK only in the cloud API's encrypted account vault.\n- Hosted AI routes can use vault credentials server-side, but raw provider secrets do not go back to browser or mobile clients.\n\n- Fast local-first note editing with debounced persistence\n- Streaming AI action panel (`summarize` ,`rewrite` ,`extract_action_items` )\n- Unified web + desktop visual system with shared tokens/components\n- Dark and light themes with persisted preference\n\nFollow [Getting started](https://github.com/sridharchaildn/notebook-ai/blob/master/docs/getting-started.md) to install dependencies, run the desktop app without an account, and optionally start the cloud API.\n\nThe public Mac download will live on the domain you attach. Set `NEXT_PUBLIC_DESKTOP_DOWNLOAD_URL` to that URL when the domain is ready. Until then, **Download for Mac** opens the GitHub latest release.\n\nCopy the placeholder file and leave secrets empty:\n\n- [`services/local-sidecar/.env.example`](https://github.com/sridharchaildn/notebook-ai/blob/master/services/local-sidecar/.env.example)\n- [`services/cloud-api/.env.example`](https://github.com/sridharchaildn/notebook-ai/blob/master/services/cloud-api/.env.example)\n- [`apps/desktop/.env.example`](https://github.com/sridharchaildn/notebook-ai/blob/master/apps/desktop/.env.example)\n- [`apps/web/.env.example`](https://github.com/sridharchaildn/notebook-ai/blob/master/apps/web/.env.example)\n\nDo not commit `.env` files. Audio transcoding uses `ffmpeg` on your `PATH` when it is installed. Releases do not bundle ffmpeg.\n\n- `VERSION` is the repo-wide source of truth.\n- Run `npm run version:sync` after bumping`VERSION` .\n- Generate release notes with `npm run release:notes -- --version <x.y.z>` .\n- Build the macOS sidecar package with `npm run release:sidecar:mac` .\n- Build the macOS desktop DMG with `npm run release:desktop:mac` .\n- See [docs/releases/PROCESS.md](https://github.com/sridharchaildn/notebook-ai/blob/master/docs/releases/PROCESS.md) for branch naming and release cadence.\n\n- Local sidecar:\n  - `POST /notes`\n  - `GET /notes`\n  - `PUT /notes/{id}`\n  - `PATCH /notes/{id}/move`\n  - `DELETE /notes/{id}`\n  - `GET /folders`\n  - `POST /folders`\n  - `PATCH /folders/{id}`\n  - `DELETE /folders/{id}`\n  - `GET /storage/local-root`\n  - `PUT /storage/local-root`\n  - `GET /storage/preference`\n  - `PUT /storage/preference`\n  - `GET /sync/status`\n  - `POST /sync/run`\n  - `POST /ai/transform/stream` (SSE)\n  - `GET /providers/status`\n  - `POST /providers/byok`\n  - `GET /providers/models`\n  - `DELETE /providers/{provider}`\n- Cloud API:\n  - `POST /auth/session/refresh`\n  - `POST /auth/logout`\n  - `GET /settings/storage`\n  - `PUT /settings/storage`\n  - `POST /providers/openai/oauth/start`\n  - `GET /providers/openai/oauth/callback`\n  - `POST /integrations/google-drive/oauth/start`\n  - `GET /integrations/google-drive/oauth/callback`\n  - `GET /integrations/google-drive/status`\n  - `POST /integrations/google-drive/access-token`\n  - `POST /providers/byok` (web/mobile encrypted account vault)\n  - `GET /providers/status`\n  - `GET /providers/credential` (server-side use only)\n  - `DELETE /providers/{provider}`", "url": "https://wpnews.pro/news/show-hn-notebook-ai-local-first-meeting-notes-for-mac", "canonical_source": "https://github.com/sridharchaildn/notebook-ai", "published_at": "2026-11-10 21:31:17+00:00", "updated_at": "2026-11-10 21:52:32.922135+00:00", "lang": "en", "topics": ["ai-tools", "ai-products", "large-language-models", "developer-tools"], "entities": ["Notebook AI", "Electron", "React", "Vite", "Next.js", "FastAPI", "LangChain", "Supabase"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/show-hn-notebook-ai-local-first-meeting-notes-for-mac", "markdown": "https://wpnews.pro/news/show-hn-notebook-ai-local-first-meeting-notes-for-mac.md", "text": "https://wpnews.pro/news/show-hn-notebook-ai-local-first-meeting-notes-for-mac.txt", "jsonld": "https://wpnews.pro/news/show-hn-notebook-ai-local-first-meeting-notes-for-mac.jsonld"}}