Website - Docs - Community - Bug reports
- โฌ๏ธ Download
- ๐ฎ Overview
- โจ Features
- ๐ฐ Tech Stack
- ๐ Development
- ๐ค Contributing
- ๐ License
Desktop installers are attached to each release: macOS (Apple silicon), macOS (Intel) and Windows (x64). Packaged builds update themselves.
Open-source AI note taker.
Prismical is a free, open-source AI note taker that transcribes meetings, lectures and voice notes โ without a bot joining your call. It captures system audio in the background, transcribes it with local or cloud AI, and turns it into structured notes with key decisions and action items.
Works with Zoom, Google Meet, Microsoft Teams, Slack, WebEx โ anything that plays audio. Not in a meeting? Just talk or type. Prismical captures and enhances your voice notes too.
This repository is the Prismical desktop app for macOS (Apple silicon and Intel) and Windows (x64).
๐๏ธ Real-time meeting transcription โ system audio capture, no bot joins your call
๐ง AI summaries & action items โ structured notes with key decisions and follow-ups
๐ฃ๏ธ Voice notes โ talk or type, AI structures and organizes your thoughts
๐ช AI skills โ Enhance, Cleanup and Ask across your notes, or write your own custom skills
๐ Local-first AI โ on-device transcription with whisper.cpp
๐ Bring your own model โ OpenAI, Anthropic, OpenRouter, any OpenAI-compatible endpoint, or local models with Ollama
๐ Meeting detection โ Prismical notices when a meeting app starts using the microphone
๐ช Floating widget โ always-on-top compact window for live transcripts and quick notes
๐ Full-text search across all meetings, notes and transcripts
โ๏ธ Prismical cloud (optional) โ sync across devices, sharing, organizations, calendar and speaker diarization
๐ MCP server โ connect your notes to Claude, ChatGPT, Gemini and more (with a Prismical account)
๐ฑ iOS & Android apps โ on the App Store and Google Play
- ๐ฅ๏ธ Electron
- โ๏ธ React
- ๐งโ๐ป TypeScript
- ๐ Effect
- ๐ค whisper.cpp
- ๐ฆ Ollama
- ๐งญ TanStack Router & Query
- โ๏ธ Tiptap
- ๐๏ธ SQLite & Drizzle
- ๐จ Tailwind CSS
- ๐ง๐ผโ๐จ shadcn/ui
- ๐งโโ๏ธ Zod
- ๐งช Vitest & Playwright
- ๐ Turborepo
apps/desktop the Electron app (@prismical/desktop)
packages/desktop-contracts IPC + window contracts shared by main, preload and renderer
packages/native-helpers/* audio-capture (Swift / C#), mic-detector, eventkit helpers
packages/whisper-wrapper the whisper.cpp N-API addon (+ whisper.cpp submodule and patches)
packages/webrtc-aec3-builder reproducible build of the prebuilt WebRTC AEC3 bundle
packages/config-eslint, config-typescript shared lint / tsconfig presets
packages/{app-ui,app-client,app-i18n,api-contracts,app-contracts,silence,
editor-markdown,editor-schema,id,note-derive,ai-prompts}
the screens, data layer, i18n catalogues and contracts
- Node.js 24 and pnpm 10.27.0 (
corepack enablepicks the pinned version) - Portless 0.5 or later (
npm install -g portless), with its HTTPS proxy on port 443 and local CA trusted (portless proxy start --httpsandportless trust) - CMake 3.20 or later (the whisper addon builds with cmake-js)
- macOS: Xcode or the Command Line Tools (Swift 5.10+). At runtime, local transcription needs macOS 14 or later (the whisper addon's deployment target) and capturing other participants' system audio needs macOS 14.2 or later.
- Windows: Visual Studio 2022 Build Tools with the Desktop development with C++ workload, and the .NET 8 SDK for the recording helpers.
Clone with the whisper.cpp submodule so the local-transcription addon can build:
git clone --recurse-submodules https://github.com/amicalhq/prismical.git
cd prismical
corepack enable
pnpm install # applies the whisper.cpp patches and compiles the addon (a few minutes)
pnpm build # builds the workspace packages the app imports from dist/If you cloned without --recurse-submodules, pnpm install still succeeds but skips the
addon; run pnpm --filter @prismical/whisper-wrapper dev:prepare (initializes the submodule and
applies the patches) and then pnpm install again. Seeing the submodule marked as modified in
git status afterwards is expected โ that is the applied patch.
cd apps/desktop
pnpm devPick Local in the first-run chooser and nothing else is needed. The first recording downloads a whisper model and the Silero VAD weights into the app's model directory (verified against pinned checksums). Quit any installed copy of Prismical first: the dev app is a separate Electron instance and shows up as "Electron" in the Dock.
Cloud mode against a Prismical backend needs PRISMICAL_CLIENT_ID (the public PKCE OAuth
client id registered on that backend) and, for a self-hosted or dev backend, the endpoint
overrides โ copy apps/desktop/.env.example to apps/desktop/.env. Dev builds default to a
local *.localhost stack; packaged builds default to the public Prismical cloud. pnpm dev
starts a persistent Forge runner through portless, which assigns the internal OAuth listener port.
In-app restarts recreate Forge and Vite while retaining that route; a normal quit stops the runner.
Register https://prismical-desktop.localhost/oauth/callback on the backend's OAuth client;
the internal port does not appear in the redirect URI. The launcher also
adds a trusted dev-proxy CA (~/.portless/ca.pem) to Node only when that file exists; set
NODE_EXTRA_CA_CERTS yourself for any other self-signed dev stack. At startup, the app also
adds OS-trusted certificates to Node's defaults, excluding expired or invalid certificates.
| Variable | Where | Purpose |
|---|---|---|
PRISMICAL_CLIENT_ID |
build + runtime | Public OAuth client id for cloud-mode sign-in. Absent โ sign-in reports "not configured". |
PRISMICAL_ANALYTICS_KEY |
build + runtime | Telemetry (PostHog) ingestion key. Absent โ telemetry disabled. Local mode never identifies a user. |
PRISMICAL_CORE_API_URL, PRISMICAL_NOTE_WS_URL, PRISMICAL_WEB_APP_ORIGIN, PRISMICAL_ANALYTICS_HOST |
runtime | Cloud endpoints and the telemetry host (dev overrides). The core URL is also the auto-update feed. |
PRISMICAL_*_DEFAULT |
build | Packaged-build endpoint defaults (core.prismical.ai etc.). |
SKIP_CODESIGNING, CODESIGNING_IDENTITY, APPLE_ID, APPLE_APP_PASSWORD, APPLE_TEAM_ID |
packaging | macOS signing + notarization; signing runs only when SKIP_CODESIGNING=false. |
WINDOWS_SIGNTOOL_PATH, WINDOWS_SIGN_WITH_PARAMS |
packaging (CI) | Squirrel in-releasify signing with Azure Trusted Signing. |
GGML_NATIVE, WHISPER_TARGETS, GGML_CUDA, GGML_VULKAN |
whisper build | Addon variants; see packages/whisper-wrapper/README.md. |
PRISMICAL_E2E*, PRISMICAL_E2E_TARGET, PRISMICAL_E2E_PACKAGE |
tests | Playwright harness switches; scrubbed from production packages. |
PRISMICAL_MODEL_CACHE |
scripts | Where pnpm --filter @prismical/desktop fetch-eval-model caches verified weights (default ~/.cache/prismical/models). |
pnpm lint
pnpm type:check
pnpm test # every workspace package, incl. the desktop unit suite
pnpm --filter @prismical/desktop test:e2e:fresh # packages an E2E-gated app and runs the Playwright suite
pnpm --filter @prismical/desktop exec vitest run tests/native # helper golden fixtures + handshakes
pnpm --filter @prismical/desktop test:local-asr # whisper end to end; first: pnpm --filter @prismical/desktop fetch-eval-model --model whisper-base-en (and --model silero-vad-v5)cd apps/desktop
pnpm package # out/Prismical-<platform>-<arch>/ (unsigned unless SKIP_CODESIGNING=false)
pnpm make # DMG + ZIP (macOS) or a Squirrel .exe installer (Windows)build:deps runs before every dev/package/make and rebuilds the native helpers only when their
sources changed; forge's prePackage hook builds the whisper addon if the submodule is present
and downloads the Node sidecar the transcription worker runs under. The prebuilt WebRTC AEC3
bundle is committed; rebuilding it is optional
(packages/webrtc-aec3-builder/README.md).
Maintainers release with the bumpp flow: pnpm --filter @prismical/desktop exec bumpp <version>
bumps apps/desktop/package.json, commits chore: release v<version> and pushes the
v<version> tag. That tag runs .github/workflows/release.yml: signed + notarized macOS
builds (arm64, x64) and a Trusted-Signed Windows x64 build, then attaches the installers and
auto-update payloads to a draft GitHub Release with a generated changelog. A push to a
preview/** branch produces an unsigned rolling pre-release instead. The workflow header lists
the repository secrets a signed release needs.
Contributions are welcome! See CONTRIBUTING.md for how the repository is put together and what a pull request needs, or reach out to the team in our Discord server.
- ๐ Report an Issue: Found a bug? Let us know!
- ๐ฌ Start a Discussion: Have ideas or suggestions? We'd love to hear from you.
Released under MIT. Third-party components and model weights are listed in NOTICE.md.