TreeMap
무료 오픈소스 디스크 사용량 시각화 도구로, 사각형 트리맵·중복 파일 탐색·디스크 가득 예측·정리 시 파일을 휴지통으로만 이동한다
Private, on-device meeting notes: records mic + system audio (no bot in the call), transcribes and diarizes locally, cites every AI-written line. Tauri + Rust + React.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗No bot joins your call. No audio leaves your computer. No subscription.
Download · Website · How it works · Compare · Setup guides
Every popular meeting note-taker works the same way: a bot joins your call, your conversation streams to someone else's servers, a transcript lives in someone else's database, and you pay monthly for the privilege.
That's a strange deal for the most sensitive data you produce all day — candidate interviews, sales negotiations, board conversations, customer calls under NDA.
Fly on the Wall flips it. It's a desktop app that listens from your side of the call — your microphone and the sound coming out of your computer — so it works with Zoom, Meet, Teams, or a phone on speaker, with nothing joining the meeting and nothing for other participants to see. Recording, transcription, and speaker labeling all run on your own machine. Your meetings stay on your disk, as plain files you can open in any editor.
It's free, open source (MIT), and it works offline.
1 — Record. Click Record, or click Start next to a meeting from your connected calendar. Fly on the Wall captures two channels separately — your mic (you) and your system audio (everyone else) — and you jot rough notes in the scratchpad as you go.
2 — Transcribe. Stop the recording and the transcript is built on your computer: timestamped text with speakers labeled and separated ("Speaker 1", "Speaker 2" — click any name to rename it to "Dana"). Because your voice and everyone else's arrive on different channels, "who said what" starts from ground truth instead of guesswork.
3 — Enhance. Pick a template — 1:1, sales, standup, interview, or general — and click ✨ Enhance. Your rough notes and the transcript become clean, structured notes. Your own words stay in your color; every line the assistant added is tinted and carries a citation chip that jumps to the exact moment in the transcript it came from. You always know what you wrote, what the AI wrote, and what the evidence was.
4 — Ask. Open the chat panel and ask the meeting anything — "what did I commit to?", "draft the follow-up email" — and drop any answer into your note with one click.
By default, Enhance and Ask use a local assistant that also runs on your computer, so even the AI step never touches the internet. Prefer a frontier model? Bring your own Anthropic key and use Claude — see Add your API keys.
A couple of tips for the clearest recordings:
The honest version: cloud note-takers are polished products with real strengths — mobile apps, team workspaces, CRM integrations. If those matter more to you than privacy, cost, or control, they're reasonable choices. Here's the objective difference in how they work, as of July 2026 (details change — check each vendor):
| Fly on the Wall | Otter.ai | Fireflies.ai | Fathom | Granola | |
|---|---|---|---|---|---|
| Where audio is processed | Your computer | Their cloud | Their cloud | Their cloud | Cloud AI for notes |
| A bot joins your call | Never | Optional — bot or desktop app | Yes, by default | Optional — bot-free in beta | No |
| Works with any meeting app | Yes — captures system audio | Yes, via desktop app | Supported platforms | Supported platforms | Yes |
| Works fully offline | Yes | No | No | No | No |
| Where transcripts live | Your disk, plain files | Their servers | Their servers | Their servers | Their cloud sync |
| Open source | Yes, MIT | No | No | No | No |
| Price | Free | Free tier + paid plans | Free tier + paid plans | Free tier + paid plans | Free tier + paid plans |
| AI provider | Local by default; bring your own key | Theirs | Theirs | Theirs | Theirs |
If your meetings involve anything you wouldn't paste into a public form — legal, medical, HR, unreleased product, other people's confidential information — the architecture is the feature. There is no server to breach, no retention policy to read, and no vendor processing agreement to negotiate, because there is no vendor in the loop.
Download the installer for your system from the latest release.
macOS downloads are signed and notarized with an Apple Developer ID certificate — they open normally, no warnings. Windows installers aren't signed with a paid certificate yet, so Windows shows a one-time SmartScreen notice the first time you run the installer; the steps below get you past it. (Building the macOS app from source yourself? There's a free self-signing pathway that unlocks system-audio capture on your own Mac — see Build & run (macOS).)
-setup-windows-x64.exe, then double-click it..dmg for your Mac — choose macos-apple-silicon if you have an
Apple Silicon Mac (M1 or newer, i.e. any Mac from 2021 on), or macos-intel if you
have an older Intel Mac. Not sure which you have? Click the Apple menu →
About This Mac: a "Chip" line saying Apple M1/M2/M3/M4 means Apple Silicon, a
"Processor" line saying Intel means Intel. (On v1.7.0 and earlier the files are named
aarch64-macos-arm64 and x64-macos-x64 instead.) Open the .dmg and drag Fly on
the Wall into your Applications folder.xattr -cr "/Applications/Fly on the Wall.app"
Everything downloads itself on first use — the transcription engine and speech models arrive automatically; nothing needs Homebrew. Apple Silicon Macs (M1 and newer) transcribe on the GPU; Intel Macs use the CPU. On macOS older than 14.2, or when the system-audio permission can't be granted, Fly on the Wall records only your microphone and says so in the recording bar — everything else works.
This only applies to releases up to v1.6.0 — newer downloads are signed with an Apple Developer ID, so system audio works out of the box. On the older unsigned builds, macOS only hands real system audio to an app with a stable code-signing identity, so the "other participants" track comes out silent (the app detects this and falls back to mic-only with a warning). You can give the app a free, self-signed identity on your own Mac to unlock real system-audio capture. One line in Terminal — no git, no build tools; it may ask for your login password once, to trust the certificate it creates:
curl -fsSL https://raw.githubusercontent.com/swarnavspujari/fly-on-the-wall/main/scripts/macos-selfsign.sh | bash -s -- "/Applications/Fly on the Wall.app"
Then launch the app (right-click → Open the first time if macOS warns), start a
recording, and choose Allow when it asks to record system audio. The recording bar
tells you if the tap is silent, so you'll know right away that it's working. To go back to
the plain download, just reinstall from the .dmg.
chmod +x on it in a terminal), then double-click it. For the .deb: open it with
your software installer, or run sudo apt install ./ followed by the file's name in a
terminal.gnome-keyring (or KWallet) is running so they have somewhere to
live.After the one-time install, the app keeps itself up to date on every platform: it checks
for a new version when it starts, downloads it quietly in the background, and restarts
once when you say so. Updates never interrupt a recording — the prompt waits until you're
finished. The one exception is a Linux .deb install, which is managed by your package
manager instead — grab new versions from the releases page (the AppImage self-updates).
By default, Enhance and Ask use a local assistant that also runs on your computer, so nothing leaves your machine. If you'd rather use a cloud assistant like Anthropic's Claude, see Add your API keys below.
Connecting a calendar is optional. It lets you start a note and recording straight from a meeting, and shows what's coming up next.
If you're one of our invited testers, this is one click:
Same one click:
Your calendar sign-in is stored in your system's keychain, never in a plain file.
The one-click connections above are for invited testers. If you're setting up Fly on the
Wall on your own, you can register your own free calendar app instead — it takes a few
minutes once. Fly on the Wall talks directly to Google and Microsoft, with no server in
between: it uses the standard installed-app OAuth flow (PKCE + a loopback redirect on
http://127.0.0.1), and your sign-in token is stored in your system keychain, never in a
plain file.
The client ID/secret fields live in Settings → Calendars — flip the View toggle at the top of Settings from Simple to Technical to reveal them.
https://www.googleapis.com/auth/calendar.readonly.Note on the "unverified app" screen and testers.
calendar.readonlyis a sensitive scope. While your consent screen is in Testing, only listed Test users can connect and their sign-in refreshes expire after 7 days (they'd reconnect weekly). To make it permanent, publish the app to Production (Google may ask you to verify it for the sensitive scope). The one-click tester credentials Fly on the Wall bundles are set up this way already.
First, make sure your account has a directory. If you just created a fresh personal Microsoft account and Microsoft Entra ID greets you with "Selected user account does not exist in tenant… Please use a different account," your account has no Entra directory (tenant) yet. The quickest fix: sign up at azure.microsoft.com/free with that account (the free tier isn't charged — the card is for identity only), which provisions a default directory. Then return to the steps below. An existing work/school account already has a directory and skips this.
/common endpoint.http://127.0.0.1 (Azure ignores the random port on loopback addresses). On the
same page, set Allow public client flows to Yes.Calendars.Read and offline_access. (Most
accounts consent at sign-in; some organizations require an admin to approve once.)Two optional keys unlock the cloud features. You paste each one into Settings, and it's stored in your system keychain — never in a plain file.
Groq is a cloud service that can produce transcripts quickly when your computer is too slow to do it well on its own. When Groq is switched on, your meeting audio is sent to Groq for transcription — the speaker labeling still happens on your machine. Groq has a free tier.
gsk_). You won't be able to see it again, so paste it somewhere safe for
a moment.Anthropic's Claude is the cloud assistant that can clean up your notes (Enhance) and answer questions about your meeting (Ask). When you use those features with Claude, your notes and transcript are sent to Anthropic.
sk-ant-). Keep it
somewhere safe — you won't see it again. Using Claude requires some credit in your
Anthropic account.Everything below is for building Fly on the Wall from source or cutting a release. If you just want to use the app, you're done above.
Prerequisites:
rustup recommendedgit clone https://github.com/swarnavspujari/fly-on-the-wall.git
cd fly-on-the-wall
npm install
npm --prefix frontend install
npm run prepare-sidecars # builds + stages fly-mcp (required once before any cargo build)
npm run tauri dev # dev app with hot reload
Production build (installers under the workspace target/release/bundle/):
npm run tauri build
Run the test suite:
cargo test --workspace
The Rust/Node build is the same on macOS (npm run tauri build produces a .app and
.dmg under target/release/bundle/). One extra step is needed to capture the other
participants' audio locally.
System-audio capture uses a Core Audio process tap (macOS 14.2+). macOS only delivers real
audio to that tap if the app has a stable code-signing identity it can attach the
"System Audio Recording" consent to — an unsigned or ad-hoc build gets a tap that silently
returns zeros. scripts/macos-selfsign.sh gives the built app a free self-signed
identity so capture works on your own machine:
npm run tauri build
npm run macos:selfsign # signs target/release/bundle/macos/Fly on the Wall.app
# or point it anywhere: bash scripts/macos-selfsign.sh "/Applications/Fly on the Wall.app"
The script creates a self-signed code-signing certificate the first time (override with
SIGN_IDENTITY="Developer ID Application: You (TEAMID)" to use a real one), signs the
bundle and its sidecars, and prints the one-time consent step. This is a local
identity only — it is trusted on the machine that holds it, not on anyone else's, so it is
for development and validation, not distribution. Shipping working system audio to other
people needs a paid Apple Developer ID + notarization (see below and docs/PORTING.md).
Releases are built by .github/workflows/release.yml on
every v* tag. Every leg feeds the auto-updater: each signs its updater artifact with a
detached .sig (NSIS installer on Windows, .app.tar.gz on macOS, AppImage on Linux) and
uploads a manifest fragment; a final job merges all four platform entries into
latest.json, which installed apps poll at releases/latest/download/latest.json. The
manifest is only published when all four legs succeed — a partial manifest would
silently strand the missing platforms on the current version forever.
src-tauri/tauri.conf.json and the workspace Cargo.toml
([workspace.package] version) — the workflow refuses a tag that doesn't match the
config version, because a mismatched latest.json would make installed apps
re-download the same update forever.TAURI_SIGNING_PRIVATE_KEY and
TAURI_SIGNING_PRIVATE_KEY_PASSWORD — the Tauri updater keypair. The public half lives
in tauri.conf.json (plugins.updater.pubkey). If the private key or password is
lost, shipped apps can never verify another update — they'd need a manual reinstall
with a new key.FOTW_GOOGLE_CLIENT_ID,
FOTW_GOOGLE_CLIENT_SECRET (a non-confidential PKCE desktop-client secret), and
FOTW_MS_CLIENT_ID. They're read at compile time by
src-tauri/src/calendar_defaults.rs and never live in the repo. Leave them unset and
the release is simply BYO-only — users add their own OAuth app under Settings ›
Calendars (see Connect your calendars).main first (tag-push workflows run the workflow file at the tag's
commit), then git tag vX.Y.Z && git push origin vX.Y.Z.Local production builds don't need the key: npm run tauri build skips updater artifacts.
To reproduce the CI build exactly, set both TAURI_SIGNING_PRIVATE_KEY(_PASSWORD) env
vars and add --config src-tauri/tauri.updater.conf.json.
macOS bundles are signed and notarized in CI (Tauri handles codesign with hardened
runtime + src-tauri/Entitlements.plist, then notarytool) when six more repo secrets
are set — the workflow fails fast if any is missing:
| Secret | Value |
|---|---|
APPLE_CERTIFICATE | base64 of the Developer ID Application certificate exported as .p12 — export with legacy encryption (Keychain Access does this by default; with OpenSSL pass -legacy, or -certpbe PBE-SHA1-3DES -keypbe PBE-SHA1-3DES -macalg sha1). macOS security import can't read OpenSSL 3's default PBES2/AES-256 .p12 and fails with a misleading "MAC verification failed (wrong password?)" |
APPLE_CERTIFICATE_PASSWORD | the password chosen when exporting that .p12 |
APPLE_SIGNING_IDENTITY | the cert's full name, e.g. Developer ID Application: Your Name (TEAMID) |
APPLE_ID | the Apple ID email of the developer account |
APPLE_PASSWORD | an app-specific password for that Apple ID (account.apple.com → Sign-In and Security) |
APPLE_TEAM_ID | the 10-character Team ID (developer.apple.com → Membership) |
The Windows installers remain unsigned (SmartScreen warning documented in
Install); an OV/EV Authenticode certificate + signtool would remove that
with no code changes. Linux needs no signing.
See ARCHITECTURE.md for the full picture. In short: crates/fly-core
is the OS-free domain; every platform capability (audio, ASR, diarization, LLM, calendar,
screen, secrets) is a trait crate; src-tauri is the only place impls are picked;
frontend/ is a thin React layer.
Fly on the Wall ships flyonthewall-mcp.exe, a local stdio MCP server over your notes,
meetings, transcripts, and the structured items extracted from them (nothing leaves the
machine; the only write it allows is renaming a speaker label). It speaks the stateless
2026-07-28 MCP specification (per-request metadata, server/discover, cacheable tool
lists) and still answers the legacy initialize handshake, so both current and older MCP
clients connect with no configuration change. Add it to Claude Desktop's
claude_desktop_config.json — in the app, Settings → "Chat with your notes (MCP)"
generates the exact snippet for your install location:
{
"mcpServers": {
"flyonthewall": { "command": "C:\\path\\to\\flyonthewall-mcp.exe", "args": [] }
}
}
Context layer (start here): get_context — a deterministic briefing for any project /
customer / recurring meeting, with every claim citing its meeting and transcript segments
— plus whats_changed, open_items, query_items, get_meeting_items. Underlying
material: search_notes, list_folders, get_note, get_transcript,
get_transcripts, get_meeting, list_recent. The write: set_speaker_label. Items are
extracted in the app after each transcription (Settings → the MCP card has a one-click
backfill for older meetings) using your selected AI provider.
Skill for AI clients:
skills/flyonthewall-meetings/SKILL.md teaches
the intended workflow (context first, transcripts to verify, provenance rules). Install it
in Claude Code / Claude Desktop by copying the folder into ~/.claude/skills/ (or your
project's .claude/skills/); for ChatGPT or Gemini, paste the file's body into custom
instructions / a Gem alongside the MCP connection.