diff --git a/README.md b/README.md index f64ffca..185eac1 100644 --- a/README.md +++ b/README.md @@ -1,193 +1,134 @@
-# 🥣 Oatmeal +Oatmeal bowl icon -**Your coding agent is your meeting notetaker.** +# Oatmeal -[![License: MIT](https://img.shields.io/badge/License-MIT-b48455.svg)](LICENSE) -[![Local First](https://img.shields.io/badge/audio-never%20leaves%20your%20machine-2ea44f)](#privacy) -[![No Cloud](https://img.shields.io/badge/cloud-none-critical)](#how-it-works) -[![Works With](https://img.shields.io/badge/works%20with-Claude%20Code%20·%20Cursor%20·%20Codex-8a63d2)](#quickstart) -[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](#contributing) +### A little more present. -*An open-source Granola alternative with a twist: there is no app. -A tiny local recorder transcribes your meetings with Whisper — and the AI you -already pay for (Claude Code, Cursor, Codex…) writes the notes, answers questions, -and keeps your team's knowledge base in sync. No bots joining calls. No accounts. -No API keys. No cloud.* +An open-source meeting notebook with local transcription and your choice of AI.
Listen, jot down a thought, and leave with the details that matter. -
+[![License: MIT](https://img.shields.io/badge/license-MIT-697558?style=flat-square)](LICENSE) [![Local transcription](https://img.shields.io/badge/transcription-on_your_computer-697558?style=flat-square)](#your-meetings-your-choice) [![Desktop preview](https://img.shields.io/badge/macOS_%2B_Windows-desktop_preview-b85b37?style=flat-square)](#try-oatmeal) ---- +**[Try Oatmeal](#try-oatmeal)** · **[Watch the demo](#a-meeting-in-ten-seconds)** · **[On Publik ↗](https://publikhq.com/oatmeal-vedsoni-dev)** · **[Road to release](https://github.com/VedSoni-dev/oatmeal/pull/2)** -## How it works +Oatmeal’s desktop notebook showing a Product sync meeting, its summary, decisions, and next steps beside a searchable meeting library. -``` -you, in a meeting ──► localhost:4123 recorder - mic + system audio → Whisper (local, WebGPU) - │ - ▼ - meetings/2026-07-18-standup.transcript.md (streams live) - │ - "write up my meeting" ▼ - your coding agent - │ - ▼ - meetings/2026-07-18-standup.notes.md - │ - ▼ - git commit → push → 🧠 team knowledge base -``` +The actual desktop preview. Example meeting with fictional content. -No bot joins your call. The recorder listens to *your* machine — your mic plus the -system audio you already hear — captured as two separate tracks, transcribed -separately, and tagged **You** / **Room** in the transcript. Your agent does -everything intelligent with the result. + -## Quickstart +## A notebook that listens -```bash -git clone https://github.com/VedSoni-dev/oatmeal.git -cd oatmeal -``` +Your meeting is the main event. Oatmeal keeps a local transcript while you take the few notes that matter, then helps you find the decisions, commitments, and next steps. -Then paste one line into your coding agent: +**Capture the conversation.** Record your microphone and optional meeting audio. Whisper transcribes on your computer. No bot joins the call. -> **Read SKILL.md and set up Oatmeal for me.** +**Add your perspective.** Write in a clean notebook while the conversation flows. Notes save automatically. -That's the whole install. The agent installs deps, starts the recorder, opens -http://localhost:4123, and tells you how to record. (Claude Code auto-discovers the -skill via `.claude/skills/` — mentioning meetings is enough.) +**Keep what matters.** Make a summary, ask about the meeting, search your library, or export everything as Markdown. -When a meeting starts: hit **Record**, share **Entire screen** with **"share system -audio" checked** (window shares carry no audio). When it ends, tell your agent: +## A meeting in ten seconds -> **write up my meeting** +![Oatmeal demo moving from personal notes to the You/Room transcript and then to a concise meeting summary.](docs/assets/oatmeal-demo.gif) -You get summary, key points, decisions, and action items — committed to git if the -repo has a remote. +UI walkthrough with fictional notes, transcript, and a prepared summary. Generation and recording are not shown. -
-Manual setup (no agent) +## Your meetings, your choice -```bash -npm install -npm start # recorder at http://localhost:4123 -``` - -Transcripts land in `meetings/` as plain Markdown. Bring any tool you like. -
+**Audio is transcribed locally.** Choose where the text goes when you ask for AI help. -## Claude Code superpowers + + + + + + + +
Claude
Claude
OpenRouter
OpenRouter
Ollama
Ollama
Hugging Face
Local models
-Cloning the repo IS the install. Claude Code picks all of this up automatically: +| Option | How it works | +| --- | --- | +| **On this computer** | Download Whisper for speech and Qwen for text. Work offline after the downloads, with no account or usage bill. Small local text models select original meeting excerpts to preserve facts. | +| **ChatGPT subscription** | Sign in through the official Codex runtime. Your plan’s Codex limits apply. | +| **Claude subscription** | Sign in through the official Claude Agent SDK. Eligibility and usage follow your Claude plan. | +| **Your API key** | Connect OpenAI, Claude, Grok, or OpenRouter. Keys saved in Settings use operating-system encryption. | +| **Publik API** | Choose Fast, Balanced, or Smart. Link an account and use a shared Publik balance; the app shows costs and account links. A fresh install starts at $0.00. | +| **Ollama** | Connect to an existing local Ollama server and choose your model. | -| You type | What happens | -|---|---| -| `/meeting` | Recorder starts (if needed) and opens in your browser — for when you're 2 minutes out | -| `/writeup` | Latest transcript becomes polished notes: summary, decisions, action items — committed & pushed | -| `/recall what did we tell Acme about pricing?` | Grounded answer from every meeting in the knowledge base, with file citations | -| `/prep akrit` | Pre-meeting brief: what you discussed last time, open action items, promises made, suggested agenda | +Cloud requests require confirmation. Raw audio stays on your computer. Cloud providers receive meeting text only when you ask them for AI help. [Read the privacy and account details →](docs/desktop-guide.md#privacy-and-accounts) -And two things you never type: +## Try Oatmeal -- **It notices unwritten meetings.** A `SessionStart` hook checks for transcripts - with no notes — open Claude Code after a call and it offers the write-up before - you ask. -- **MCP auto-registers.** [`.mcp.json`](.mcp.json) exposes `list_meetings` / - `search_meetings` / `get_meeting` to any MCP client the moment you open the repo. +**The desktop app is a development preview in [PR #2](https://github.com/VedSoni-dev/oatmeal/pull/2).** Apple Silicon development builds have been tested. Windows and Intel Mac packaging are configured, with platform validation still pending. Signed public installers are not available yet. -(Other agents: same flows work by asking in plain English — the commands are just -markdown files in [`.claude/commands/`](.claude/commands/), readable by anything.) +With **Node.js 22+**, run: -## The team knowledge base - -**Sharing = git.** No sync server, no org accounts, no per-seat pricing: - -1. Your team creates one repo — say `team-knowledge` — with a `meetings/` folder. -2. Everyone clones it and points their recorder at it - (`OATMEAL_MEETINGS_DIR=/meetings npm start`). -3. After each meeting, each person's agent commits + pushes their notes there - (the skill does this automatically when a remote exists). -4. Everyone's agent `git pull`s and can answer from *anyone's* meetings: +```sh +git clone --branch codex/desktop-app https://github.com/VedSoni-dev/oatmeal.git +cd oatmeal +npm ci +npm start +``` -> *"What did we tell Acme about pricing last month?"* -> *"List every action item assigned to me this week."* -> *"Summarize all the decisions from sprint planning meetings."* +Oatmeal opens in its own desktop window. No coding agent or separate local model server is needed. -Access control is your git host's access control. History is the git log. Deleting -a note is a commit. Compliance export is `git archive`. It's boring — that's the point. +1. **Set up your models.** Open Settings and download a speech model. Choose local text, a subscription, Publik, or your own API key. +2. **Start a meeting.** Give it a name, press Record, and let participants know you’re taking notes. Turn on Meeting audio to include the other side of a call. +3. **Make it useful.** Add a few notes, stop recording, and choose Summary → Generate notes. Export when you’re ready. -## Runs without the agent open +
+Build a Mac or Windows installer -The recorder and calendar watcher are **background services**, not agent tasks — your -coding agent doesn't need to stay open for any of this to work day to day. +Run on the matching operating system and architecture: -```bash -node scripts/install-autostart.mjs +```sh +npm run build:mac # .app, .dmg, .zip — macOS 14.2+ +npm run build:win # NSIS installer — Windows 10/11 x64 ``` -Registers the recorder as a real background service — a Startup-folder entry on -Windows, a LaunchAgent on macOS, `systemd --user` on Linux — with **no admin rights -and no permission prompts**. Starts at every login, keeps running. Your agent runs -this **once**; after that, closing your terminal or Claude Code doesn't stop it. +Local builds are development artifacts. See [signing and release setup](https://github.com/VedSoni-dev/oatmeal/blob/codex/desktop-app/docs/RELEASING.md) before distributing them. Real subscription sign-in, platform audio permissions, and long meetings still need release validation; [verification status](https://github.com/VedSoni-dev/oatmeal/blob/codex/desktop-app/docs/VERIFICATION.md) records what was actually tested. -### Calendar automation +
-If your coding agent has (or can add) a Google/Outlook Calendar connector, just ask -it to wire your calendar into Oatmeal — one click of OAuth, nothing to paste. +## Bring your coding agent -No calendar connector? One URL, no OAuth: +The original browser recorder and Markdown workflow are still here. Work with meeting files in **Cursor, Claude Code, Codex, or another MCP client**. -```bash -cp oatmeal.config.example.json oatmeal.config.json -# paste your calendar's ICS feed URL (Google Calendar → Settings → your calendar -# → "Secret address in iCal format") -node scripts/install-autostart.mjs # re-run: also installs the calendar watcher -``` + + + + + + +
Cursor
Cursor
MCP + Markdown
Claude
Claude Code
Skills + MCP
OpenAI
Codex
MCP + Markdown
-From then on, with zero agent involvement: a standalone script checks your calendar -every 5 minutes and opens the recorder in your browser ~7 minutes before each -meeting. You just hit Record. Your agent's only jobs are the one-time install and -writing up notes afterward. +The MCP server exposes `list_meetings`, `search_meetings`, and `get_meeting` for Markdown files. Export desktop meetings into the folder you configure for MCP; it does not automatically read the desktop database. **[Agent setup guide →](docs/agent-workflow.md)** -## What's in the repo +## Built to stay yours -| Path | What it is | -|---|---| -| [`SKILL.md`](SKILL.md) | The product spec your agent follows — setup, notes flow, knowledge base rules, calendar automation | -| [`capture/`](capture/) | Zero-dependency local server + recorder page — mic + system loopback, in-browser Whisper (WebGPU, pick tiny/base/small), live You/Room transcript, built-in meeting viewer | -| [`meetings/`](meetings/) | Your transcripts + notes. Plain Markdown. Yours. | -| [`scripts/mcp-server.mjs`](scripts/mcp-server.mjs) | Optional MCP server — expose meetings to any MCP client | -| [`scripts/install-autostart.mjs`](scripts/install-autostart.mjs) | Registers the recorder (+ calendar watcher) as a background OS service | -| [`scripts/calendar-watch.mjs`](scripts/calendar-watch.mjs) | Standalone ICS calendar poller — opens the recorder before meetings, no agent needed | -| [`.claude/skills/`](.claude/skills/) | Auto-discovery so Claude Code picks up the skill on clone | +- **Plain Markdown exports.** Take your notes and transcripts to another tool whenever you want. +- **Local storage.** Meetings stay in your application data folder. Pending audio is saved temporarily for recovery, then deleted after transcription succeeds. +- **Recoverable recordings.** Interrupted transcription can resume from saved audio chunks. +- **Open source.** Inspect the code, change the prompts, add a provider, or build your own version. -## Privacy +Meeting files are not encrypted by the app. System-audio capture depends on the OS, permissions, and chosen source. You/Room separates audio lanes, not individual remote speakers. -- Transcription is **local** — Whisper runs in your browser (one-time ~80 MB model - download, then fully offline). Audio is never stored or uploaded anywhere. -- Transcripts are plain files on your disk. The only network hop is the git remote - **you** choose — or none. -- The AI that reads your transcripts is the coding agent you already use and trust. -- Recording people has consent rules that vary by place. Tell attendees you're - taking notes. +## Make it better -## Contributing +

Electron Built on Electron, with local models powered by Transformers.js.

-PRs welcome. The codebase is intentionally tiny (~500 lines, zero server deps): -if you can read `capture/server.mjs` and `capture/public/app.js`, you've read the -whole thing. +Bug reports, thoughtful design feedback, and pull requests are welcome. Include your OS, provider, and steps to reproduce; keep meeting content and credentials out of public issues. -**Good first issues:** -- Smarter meeting-title detection (from calendar or first few words) -- Calendar connector recipes (Google, Outlook, Slack integration guides) -- **Full multi-person diarization** (mic vs system audio are already tagged "You"/"Room" — telling apart two+ people on the *other* end of the call would need Pyannote or similar) -- Better error messages (when Whisper fails, when git push fails, etc.) +On the desktop preview branch: -**Not in scope:** cloud sync, accounts, compliance features (fine-grained audit logs), multi-language models beyond Whisper's baseline. Those belong in derivatives, not core. +```sh +npm test +npm run test:desktop +``` -## License +[Desktop guide](docs/desktop-guide.md) · [Architecture](https://github.com/VedSoni-dev/oatmeal/blob/codex/desktop-app/docs/ARCHITECTURE.md) · [Release checklist](https://github.com/VedSoni-dev/oatmeal/blob/codex/desktop-app/docs/RELEASING.md) · [Report an issue](https://github.com/VedSoni-dev/oatmeal/issues) + +--- -MIT © Vedant Soni — free forever. Everything the paid notetakers charge for is a -git repo and an agent prompt away. +MIT © Vedant Soni. An independent Granola alternative. [WhimprFlow](https://github.com/Blueturboguy07/WhimprFlow) inspired the platform and release patterns. Product names and logos identify the tools and services described; they belong to their respective owners and do not imply endorsement. [Asset credits](docs/assets/README.md) diff --git a/docs/agent-workflow.md b/docs/agent-workflow.md new file mode 100644 index 0000000..bc86ffd --- /dev/null +++ b/docs/agent-workflow.md @@ -0,0 +1,48 @@ +# Use Oatmeal with your coding agent + +Oatmeal's MCP server reads Markdown files from `meetings/` by default. It exposes three tools: `list_meetings`, `search_meetings`, and `get_meeting`. This is the original file-based workflow, separate from the desktop app's internal meeting storage. + +To use desktop meetings with it, export the meeting as Markdown into `meetings/` or set `OATMEAL_MEETINGS_DIR` to your export directory. Requests through a coding agent follow that agent's data and billing settings; reading a local file into a cloud agent may send its content to that provider. + +## Claude Code + +Install repository dependencies, then register the server using an absolute path: + +```sh +claude mcp add oatmeal -- node /absolute/path/to/oatmeal/scripts/mcp-server.mjs +``` + +The repository also includes `.mcp.json`, Claude skills, and commands. Review and trust project configuration before enabling it. + +## Cursor or another MCP client + +Add this entry to your client's MCP configuration, replacing both paths with your own: + +```json +{ + "mcpServers": { + "oatmeal": { + "command": "node", + "args": ["/absolute/path/to/oatmeal/scripts/mcp-server.mjs"], + "env": { + "OATMEAL_MEETINGS_DIR": "/absolute/path/to/meeting-exports" + } + } + } +} +``` + +Ask the agent to list your meetings, search for a decision, or read a meeting file. It can only return files that exist in the configured folder. + +## Original browser recorder + +The `main` branch retains the original browser workflow while the desktop preview is reviewed: + +```sh +npm install +node capture/server.mjs +``` + +Open `http://localhost:4123`. Record in the browser; transcripts are saved as Markdown in `meetings/`. On the desktop branch, the equivalent command is `npm run start:browser`. + +For the complete original workflow, see [the legacy guide](https://github.com/VedSoni-dev/oatmeal/blob/codex/desktop-app/docs/legacy-agent-workflow.md). diff --git a/docs/assets/README.md b/docs/assets/README.md new file mode 100644 index 0000000..4528eed --- /dev/null +++ b/docs/assets/README.md @@ -0,0 +1,12 @@ +# Documentation assets + +- `oatmeal-notebook.png`, `oatmeal-settings.png`: screenshots of the actual desktop preview, captured with an isolated profile and fictional meeting data. +- `oatmeal-demo.gif`: a ten-second UI walkthrough through notes, transcript, and a prepared summary. It does not depict live recording or model generation. +- `oatmeal-icon.svg`: Oatmeal's own icon, covered by the repository's MIT license. +- `logos/`: Cursor, Claude, OpenRouter, Ollama, Hugging Face, and Electron marks from [Simple Icons](https://github.com/simple-icons/simple-icons/tree/develop/icons), retrieved October 5, 2026. The collection is released under [CC0](https://github.com/simple-icons/simple-icons/blob/develop/LICENSE.md); trademarks remain with their owners. `-light` variants use a monochrome fill for dark-background legibility; proportions are unchanged. + +- `logos/openai.png`: the OpenAI organization’s public GitHub avatar, retrieved through the [GitHub organization API](https://api.github.com/orgs/openai). The mark belongs to OpenAI and identifies the Codex workflow. + +Logos identify actual integrations, the optional agent workflow, and the desktop framework. They do not denote partnerships or endorsements. Claude's mark identifies both Claude and the Claude Code workflow. + +Regenerate the screenshots and GIF from the desktop branch with `node scripts/capture-showcase.mjs` after installing dependencies and `ffmpeg`. It uses only fictional data and makes no audio or AI requests. diff --git a/docs/assets/logos/claude-light.svg b/docs/assets/logos/claude-light.svg new file mode 100644 index 0000000..af68f36 --- /dev/null +++ b/docs/assets/logos/claude-light.svg @@ -0,0 +1 @@ +Claude \ No newline at end of file diff --git a/docs/assets/logos/claude.svg b/docs/assets/logos/claude.svg new file mode 100644 index 0000000..1beee86 --- /dev/null +++ b/docs/assets/logos/claude.svg @@ -0,0 +1 @@ +Claude \ No newline at end of file diff --git a/docs/assets/logos/cursor-light.svg b/docs/assets/logos/cursor-light.svg new file mode 100644 index 0000000..e162330 --- /dev/null +++ b/docs/assets/logos/cursor-light.svg @@ -0,0 +1 @@ +Cursor \ No newline at end of file diff --git a/docs/assets/logos/cursor.svg b/docs/assets/logos/cursor.svg new file mode 100644 index 0000000..61303fb --- /dev/null +++ b/docs/assets/logos/cursor.svg @@ -0,0 +1 @@ +Cursor \ No newline at end of file diff --git a/docs/assets/logos/electron-light.svg b/docs/assets/logos/electron-light.svg new file mode 100644 index 0000000..6859363 --- /dev/null +++ b/docs/assets/logos/electron-light.svg @@ -0,0 +1 @@ +Electron \ No newline at end of file diff --git a/docs/assets/logos/electron.svg b/docs/assets/logos/electron.svg new file mode 100644 index 0000000..72639c8 --- /dev/null +++ b/docs/assets/logos/electron.svg @@ -0,0 +1 @@ +Electron \ No newline at end of file diff --git a/docs/assets/logos/huggingface-light.svg b/docs/assets/logos/huggingface-light.svg new file mode 100644 index 0000000..da2b90c --- /dev/null +++ b/docs/assets/logos/huggingface-light.svg @@ -0,0 +1 @@ +Hugging Face \ No newline at end of file diff --git a/docs/assets/logos/huggingface.svg b/docs/assets/logos/huggingface.svg new file mode 100644 index 0000000..dd2db93 --- /dev/null +++ b/docs/assets/logos/huggingface.svg @@ -0,0 +1 @@ +Hugging Face \ No newline at end of file diff --git a/docs/assets/logos/ollama-light.svg b/docs/assets/logos/ollama-light.svg new file mode 100644 index 0000000..99134d0 --- /dev/null +++ b/docs/assets/logos/ollama-light.svg @@ -0,0 +1 @@ +Ollama \ No newline at end of file diff --git a/docs/assets/logos/ollama.svg b/docs/assets/logos/ollama.svg new file mode 100644 index 0000000..bc368e9 --- /dev/null +++ b/docs/assets/logos/ollama.svg @@ -0,0 +1 @@ +Ollama \ No newline at end of file diff --git a/docs/assets/logos/openai.png b/docs/assets/logos/openai.png new file mode 100644 index 0000000..5c8532a Binary files /dev/null and b/docs/assets/logos/openai.png differ diff --git a/docs/assets/logos/openrouter-light.svg b/docs/assets/logos/openrouter-light.svg new file mode 100644 index 0000000..1f25c5d --- /dev/null +++ b/docs/assets/logos/openrouter-light.svg @@ -0,0 +1 @@ +OpenRouter \ No newline at end of file diff --git a/docs/assets/logos/openrouter.svg b/docs/assets/logos/openrouter.svg new file mode 100644 index 0000000..83ec807 --- /dev/null +++ b/docs/assets/logos/openrouter.svg @@ -0,0 +1 @@ +OpenRouter \ No newline at end of file diff --git a/docs/assets/oatmeal-demo.gif b/docs/assets/oatmeal-demo.gif new file mode 100644 index 0000000..8aecf90 Binary files /dev/null and b/docs/assets/oatmeal-demo.gif differ diff --git a/docs/assets/oatmeal-icon.svg b/docs/assets/oatmeal-icon.svg new file mode 100644 index 0000000..f1cbd0d --- /dev/null +++ b/docs/assets/oatmeal-icon.svg @@ -0,0 +1 @@ + diff --git a/docs/assets/oatmeal-notebook.png b/docs/assets/oatmeal-notebook.png new file mode 100644 index 0000000..bc1898c Binary files /dev/null and b/docs/assets/oatmeal-notebook.png differ diff --git a/docs/assets/oatmeal-settings.png b/docs/assets/oatmeal-settings.png new file mode 100644 index 0000000..de4ffa0 Binary files /dev/null and b/docs/assets/oatmeal-settings.png differ diff --git a/docs/desktop-guide.md b/docs/desktop-guide.md new file mode 100644 index 0000000..ad72e6a --- /dev/null +++ b/docs/desktop-guide.md @@ -0,0 +1,105 @@ +# Oatmeal + +A little space for your meetings. An open-source desktop meeting notebook for macOS and Windows, inspired by the workflow of Granola. + +Listen to the conversation, jot down a few thoughts, and turn a local transcript into useful notes. No meeting bot joins your calls. You choose where the AI runs. + +## Desktop app + +- Searchable meeting library, editable notes, automatic saves, Markdown import/export. +- Microphone and optional system audio, transcribed separately as **You** and **Room**. +- Downloadable Whisper speech models and Qwen text models. No separate local runtime required. +- Summaries, decisions, action items, and questions about a meeting. +- OpenAI, Claude, Grok, and OpenRouter API keys, encrypted using the operating system. +- Publik API with Fast, Balanced and Smart tiers, consent-based setup, balance and account linking. +- ChatGPT sign-in through the official Codex runtime; Claude sign-in and generation through the official Claude Agent SDK. +- Optional Ollama integration and interrupted-recording recovery. + +**Status:** active development. Mac development builds and automated tests are available. Windows installer configuration and CI are included; Windows hardware audio/sign-in verification is still required. Published, signed installers are not available yet. Publik's desktop integration and public app token are included. New installations must link their account and have sufficient credit before making AI requests. + +## Run from source + +Install Node.js 22 or newer, then: + +```sh +git clone --branch codex/desktop-app https://github.com/VedSoni-dev/oatmeal.git +cd oatmeal +npm ci +npm start +``` + +The app opens in its own desktop window. No coding agent, browser server, Rust toolchain, or separate model runtime is needed. + +1. Open **Settings** and download a speech model. Whisper Tiny is fastest for English; Base and Small support multiple languages. +2. Choose an AI provider. **On this computer** is the default; download a text model for offline summaries. For an API, save your own key and optionally edit the model ID. For a subscription, click **Sign in** and finish in your browser. +3. Create a meeting and click **Record**. Let participants know you're taking notes. Enable **Meeting audio** to include the other side of a call. +4. Jot down thoughts while the transcript is captured. Stop and choose **Summary → Generate notes**. + +Models download from Hugging Face only when requested. Local inference runs on CPU; larger models and long recordings need more memory and time. Built-in local notes and answers select original meeting excerpts to preserve facts; cloud providers produce fuller narrative summaries. API model availability depends on your account; model IDs are editable. + +For **publik API**, choose a tier (Fast is the lowest-cost default), accept the disclosure, then use **Link this computer & pick a plan**. An install starts at $0.00; the first account link provides $0.05 of free use once. The app shows the service's cost disclosure and balance. You can instead paste your own publik key, choose another personal API provider, or use local models. Provisioned publik keys stay in its per-app credential file with restricted permissions; they are never exposed to the app's web UI. See [Publik setup](https://github.com/VedSoni-dev/oatmeal/blob/codex/desktop-app/docs/ARCHITECTURE.md#publik-api) for builder configuration. + +## Platforms and builds + +| Platform | Artifact | Validation | +| --- | --- | --- | +| macOS 14.2+, Apple Silicon | `.app`, `.dmg`, `.zip` | Local development and automated tests | +| macOS 14.2+, Intel | `.dmg`, `.zip` | Intel CI configuration; hardware validation pending | +| Windows 10/11, x64 | NSIS `.exe` installer | Windows CI configuration; hardware validation pending | + +```sh +npm run build:mac # on macOS +npm run build:win # on Windows +npm run pack # unpacked development app +``` + +Use a matching host architecture so the bundled native runtimes match. Output goes to `dist/`. The app includes native inference libraries and official account runtimes; model weights download separately. See [release setup](https://github.com/VedSoni-dev/oatmeal/blob/codex/desktop-app/docs/RELEASING.md) for signing, notarization and CI. Release tags require signing credentials and produce a **draft** GitHub release. + +## Privacy and accounts + +Meetings live in Electron's application data directory. **Settings → Open meetings folder** opens the actual location. Exported Markdown can be shared or committed to your own knowledge repository. + +Audio is transcribed locally. Captured chunks are written temporarily to `pending-audio/` for crash recovery, then deleted after their transcript is saved. Notes, transcripts and pending audio are protected by OS account permissions, **not application-level encryption**. Use **Recover audio** after interrupted transcription. Model files remain cached for offline use. + +Cloud providers receive meeting text when you request AI help and confirm the disclosure. Raw audio is not uploaded. Provider runtimes retain data according to their own terms. Oatmeal isolates account configuration from existing coding-agent setups. API credentials are never returned to the renderer after storage or included in exports. + +ChatGPT subscriptions use Codex plan access, not API credit. Claude subscriptions use the official Agent SDK; eligibility and billing follow Anthropic's current rules. See [architecture and official references](https://github.com/VedSoni-dev/oatmeal/blob/codex/desktop-app/docs/ARCHITECTURE.md). + +System audio depends on OS permissions and capture source. The app warns when it can only hear your microphone. You/Room attribution does not identify individual remote speakers. Real meetings on both platforms need hardware testing before release. + +## Development + +```sh +npm test # persistence, credentials, providers, long-meeting handling +npm run test:desktop # actual Electron UI, persistence and renderer isolation +``` + +An opt-in recording test uses a synthetic 16-bit PCM WAV instead of your microphone: + +```sh +OATMEAL_SPEECH_FIXTURE=/absolute/path/speech.wav \ +OATMEAL_MODEL_CACHE=/absolute/path/downloaded/models \ +npx playwright test recording.spec.mjs +``` + +This opt-in fake-device test launches Chromium with `--no-sandbox` so it can read the fixture. The shipping app retains its sandbox; the normal desktop test verifies renderer isolation. + +| Directory | Responsibility | +| --- | --- | +| `desktop/main.mjs` | Native window, permissions, IPC, recording lifecycle | +| `desktop/core/` | Persistence, provider adapters, official account runtimes | +| `desktop/workers/` | Background Whisper/Qwen inference | +| `desktop/ui/` | Sandboxed notebook, settings, AudioWorklet capture | +| `tests/` | Core contracts and Electron integration tests | +| `.github/workflows/desktop.yml` | Platform checks, installers, draft releases | +| `capture/`, `scripts/` | Original browser recorder, MCP and calendar tools | + +The [original browser/agent workflow](https://github.com/VedSoni-dev/oatmeal/blob/codex/desktop-app/docs/legacy-agent-workflow.md) remains available with `npm run start:browser`. Import existing `.transcript.md` files through **Import transcript**. The desktop app never automatically uploads, commits or pushes an existing meetings repository. + +## Credits and license + +MIT © Vedant Soni. Independently implemented; not affiliated with Granola. + +[WhimprFlow](https://github.com/Blueturboguy07/WhimprFlow) informed the separation of UI/audio/providers, credential storage, model provisioning, and platform release checks. Oatmeal uses Electron to reuse its web audio code. No WhimprFlow source was copied. + +Third-party runtimes and downloaded models retain their own licenses and terms. The official Claude runtime is distributed under Anthropic's terms, not Oatmeal's MIT license.