anarlog is a meeting notepad in the style of Granola. Instead of sending a bot into Zoom, Meet or Teams, it captures audio on your own computer, transcribes it, and turns your rough notes plus the transcript into a clean summary you can edit like a document and export as Markdown. Notes, transcripts and recordings sit in a local SQLite database and plain files, and there is a CLI and MCP server so agents can read them.
Its selling point is choice over where your conversations go. On supported Macs transcription can run fully on-device; summaries and chat can use a local model through Ollama or LM Studio, your own API key, or the optional paid cloud. CloudSync and sharing are off by default. The desktop app is built with Tauri, Rust and React for macOS, Windows and Linux, and it is MIT-licensed, with commercially licensed enterprise parts kept in a separate folder.
History worth knowing: the project began as Hyprnote and the team now also builds a separate product called char. The README states that anarlog stays open source and maintained, and a new desktop release shipped the day before the scan.
- Repository: github.com/fastrepl/anarlog
- Licence: MIT (MIT License)
- Language: Rust. Stars: 9,599. Forks: 803. Last push: Oct 26, 2026.
- Scan: safe, Oct 26, 2026, commit 341ccb3
Who it is for
People who want AI meeting notes without a recording bot in the participant list or their calls stored in someone else's cloud, and teams that need a notetaker that can pass a security review.
Getting started
1. Download the app for macOS, Windows or Linux from anarlog.so/download, or clone the source
git clone https://github.com/fastrepl/anarlog.git && cd anarlog2. Install the workspace (needs Node.js 22+, pnpm, Rust and the Tauri prerequisites)
pnpm install --frozen-lockfile3. Start the desktop app in development mode
pnpm dev:desktopOn Linux, bash scripts/setup-linux.sh installs the build dependencies first, using sudo. The local desktop app starts without any secrets; cloud AI, sync and billing need extra services.
Safety scan
We cloned fastrepl/anarlog at commit 341ccb3 on Oct 26, 2026 and ran the checks described on the GitHub Tools page: credential patterns, decode-and-execute code, install-time scripts, committed binaries, risky CI workflows, every host the code talks to, known vulnerabilities in pinned dependencies, and project hygiene. A person read every hit. This is what we found.
- The 3 private-key hits are one throwaway EC test key, repeated in the test modules of apps/api/src/tests.rs, crates/api-cloud/src/routes.rs and crates/supabase-auth/src/server/mod.rs to sign OAuth test tokens. No real key is present.
- The 4 pattern hits: a 9,000-character line in a generated API client, and scripts/setup-devtools.sh, a maintainer script that pipes the dprint, Taskfile and Infisical installers to a shell, two of them with sudo. The other sudo scripts install Linux build packages. 59 Cargo build scripts are normal for a Tauri app with this many plugins.
- 12 committed binaries are prebuilt builds of the SQLite Sync extension (cloudsync) from sqliteai/sqlite-sync 1.2.0 for each platform, used by the opt-in CloudSync feature. They are compiled third-party code you cannot review in the repository.
- plugins/analytics sends product usage events unless an opt-out flag is set, and checks that flag before every send. Hosted transcription and AI (Deepgram, AssemblyAI, OpenAI, OpenRouter and others among the hosts) are used only for the providers you pick.
- 117 known advisories (4 critical): 79 hits in Cargo.lock (2 critical, in the zip crate), 14 in the enterprise Cargo.lock and 26 in pnpm-lock.yaml (dompurify and shell-quote among the critical ones). 32 workflows, none using pull_request_target; 7 of 32 third-party actions pinned. Security policy, Dependabot, CodeQL and contributing guide present.
What the scanner counted
| Check | Result |
|---|---|
| Secrets | 3 candidates found and read; see the notes above. |
| Suspicious code | 4 pattern hits found and read; every one is listed under the raw findings. |
| Install-time code | 59 Cargo build scripts. 6 installer scripts (one fetches and runs a remote script; one can call sudo) |
| Committed binaries | 12 executable or compiled objects committed; listed under the raw findings. |
| CI workflows | 32 workflows. None use pull_request_target. 25 of 32 third-party actions pinned to a tag rather than a commit. |
| Network hosts | 40 distinct hosts referenced from source; most often anarlog.so, github.com, api.anarlog.so, meet.google.com. No URLs to bare IP addresses. |
| Known vulnerabilities | 117 advisories across 4,833 pinned packages: 4 critical, 35 high, 17 moderate, 12 low, 49 unrated. Cargo.lock: 1,849 packages, 79 advisories; enterprise/Cargo.lock: 360 packages, 14 advisories; pnpm-lock.yaml: 2,836 packages, 26 advisories; scripts/poetry.lock: 5 packages, 0 advisories. |
| Project hygiene | Has security policy, automated dependency updates, CodeQL, licence file, contributing guide. |
| OpenSSF Scorecard | Not scored: the project is not in Scorecard's weekly index. |
The raw findings
Every hit the scanner wrote out, with a link to the exact line at the scanned commit. Secrets candidates are redacted.
Secret candidates (3, redacted)
| Where | Rule | Match |
|---|---|---|
| apps/api/src/tests.rs:107 | private-key | -----B…--- (27 chars) |
| crates/api-cloud/src/routes.rs:618 | private-key | -----B…--- (27 chars) |
| crates/supabase-auth/src/server/mod.rs:161 | private-key | -----B…--- (27 chars) |
Pattern hits (4)
| Where | Rule | Match |
|---|---|---|
| packages/api-client/src/generated/sdk.gen.ts:5 | very-long-line | 9026 chars |
| scripts/setup-devtools.sh:39 | download-piped-to-shell | curl -fsSL https://dprint.dev/install.sh | sh |
| scripts/setup-devtools.sh:62 | download-piped-to-shell | curl -1sLf 'https://dl.cloudsmith.io/public/task/task/setup.deb.sh' | sudo -E bash |
| scripts/setup-devtools.sh:67 | download-piped-to-shell | curl -1sLf 'https://artifacts-cli.infisical.com/setup.deb.sh' | sudo -E bash |
Installer scripts (6)
- scripts/setup-desktop-e2e.sh, 68 lines, uses sudo; talks to v2.tauri.app
- scripts/setup-devtools.sh, 79 lines, uses sudo, fetches and runs a remote script; talks to artifacts-cli.infisical.com, dl.cloudsmith.io, dprint.dev, github.com, packages.stripe.dev
- scripts/setup-flathub.sh, 10 lines, uses sudo; talks to dl.flathub.org
- scripts/setup-linux-others.sh, 26 lines, uses sudo
- scripts/setup-linux-tauri.sh, 19 lines, uses sudo
- scripts/setup-linux.sh, 88 lines, uses sudo; talks to deb.nodesource.com, get.pnpm.io, sh.rustup.rs
Committed binaries (12)
crates/cloudsync/vendor/cloudsync/android/x86_64/cloudsync.so: ELF, 8 MBcrates/cloudsync/vendor/cloudsync/android/arm64-v8a/cloudsync.so: ELF, 7 MBcrates/cloudsync/vendor/cloudsync/android/armeabi-v7a/cloudsync.so: ELF, 5 MBcrates/cloudsync/vendor/cloudsync/apple/CloudSync.xcframework/ios-arm64_x86_64-simulator/CloudSync.framework/CloudSync: Mach-O, 1 MBcrates/cloudsync/vendor/cloudsync/linux/musl/aarch64/cloudsync.so: ELF, 790 KBcrates/cloudsync/vendor/cloudsync/linux/gnu/x86_64/cloudsync.so: ELF, 754 KBcrates/cloudsync/vendor/cloudsync/linux/musl/x86_64/cloudsync.so: ELF, 753 KBcrates/cloudsync/vendor/cloudsync/linux/gnu/aarch64/cloudsync.so: ELF, 730 KBcrates/cloudsync/vendor/cloudsync/windows/x86_64/cloudsync.dll: PE (Windows executable), 699 KBcrates/cloudsync/vendor/cloudsync/macos/x86_64/cloudsync.dylib: Mach-O, 645 KBcrates/cloudsync/vendor/cloudsync/macos/aarch64/cloudsync.dylib: Mach-O, 612 KBcrates/cloudsync/vendor/cloudsync/apple/CloudSync.xcframework/ios-arm64/CloudSync.framework/CloudSync: Mach-O, 611 KB
Worst known vulnerabilities (24 of 117)
| Advisory | Severity | Package | Summary |
|---|---|---|---|
| GHSA-4684-h2q9-2vcp | critical | zip@2.4.2 | ZipStreamReader::extract() and ZipArchive::extract() apply Unix permissions through symlinks without confining the targe… |
| GHSA-4684-h2q9-2vcp | critical | zip@4.6.1 | ZipStreamReader::extract() and ZipArchive::extract() apply Unix permissions through symlinks without confining the targe… |
| GHSA-cg2g-xh64-v4q7 | critical | dompurify@3.4.16 | DOMPurify SAFE_FOR_TEMPLATES bypass: split template expressions survive in attached shadow root content on DOM output mo… |
| GHSA-pqg4-j6r4-53mv | critical | shell-quote@1.10.0 | shell-quote: `quote()` command injection via a line terminator in a token after a `{ comment }` token |
| GHSA-8ffr-xgwf-xj56 | high | aws-smithy-json@0.61.9 | aws-smithy-json: Uncontrolled recursion in the aws-smithy-json unknown-key skip path allows unauthenticated remote denia… |
| GHSA-8ffr-xgwf-xj56 | high | aws-smithy-json@0.62.5 | aws-smithy-json: Uncontrolled recursion in the aws-smithy-json unknown-key skip path allows unauthenticated remote denia… |
| GHSA-f26g-jm89-4g65 | high | gix@0.77.0 | gitoxide: CommandForbiddenInModulesConfiguration Bypass in gix_submodule::File::update() Enables Arbitrary Command Execu… |
| GHSA-fr8x-3vfx-f45h | high | gix@0.77.0 | gix and gitoxide: unvalidated submodule name traverses out of .git/modules and redirects state() / open() to another rep… |
| GHSA-p3hw-mv63-rf9w | high | gix@0.77.0 | gix's submodule name validation bypass + trust inheritance flaw enables path traversal and credential disclosure |
| GHSA-pg4w-g64p-qwhj | high | gix@0.77.0 | gix and gitoxide's symlinked .gitmodules are followed and parsed from outside of the repository |
| GHSA-f89h-2fjh-2r9q | high | gix-fs@0.18.2 | gix-fs: Symlink prefix-reuse allows worktree escape during checkout |
| GHSA-x494-mj8g-cj27 | high | gix-pack@0.64.1 | gix-pack has multiple DoS vectors: unchecked indexing panics and uncapped OOM allocations from crafted pack data |
| GHSA-p3hw-mv63-rf9w | high | gix-validate@0.10.1 | gix's submodule name validation bypass + trust inheritance flaw enables path traversal and credential disclosure |
| RUSTSEC-2026-0194 | high | quick-xml@0.38.4 | Quadratic run time when checking a start tag for duplicate attribute names |
| RUSTSEC-2026-0195 | high | quick-xml@0.38.4 | Unbounded namespace-declaration allocation in `NsReader` enables memory-exhaustion denial of service |
| RUSTSEC-2026-0194 | high | quick-xml@0.39.2 | Quadratic run time when checking a start tag for duplicate attribute names |
| RUSTSEC-2026-0195 | high | quick-xml@0.39.2 | Unbounded namespace-declaration allocation in `NsReader` enables memory-exhaustion denial of service |
| GHSA-3g6h-r5qx-f6hq | high | quinn-proto@0.11.17 | Peer minimum ACK delay can panic quinn-proto when ACK_FREQUENCY transmission is enabled |
| GHSA-ppcp-v39w-8jq2 | high | quinn-proto@0.11.17 | Outgoing datagram buffer accounting can panic the sender in quinn-proto |
| GHSA-82j2-j2ch-gfr8 | high | rustls-webpki@0.101.7 | rustls-webpki: Denial of service via panic on malformed CRL BIT STRING |
| GHSA-j5gw-2vrg-8fgx | high | tokio-tar@0.3.1 | astral-tokio-tar Vulnerable to PAX Header Desynchronization |
| GHSA-vv5m-jxxh-4627 | high | zip@2.4.2 | Insecure Preservation of SUID/SGID Bits during ZIP Extraction Leading to Potential Privilege Escalation |
| GHSA-vv5m-jxxh-4627 | high | zip@4.6.1 | Insecure Preservation of SUID/SGID Bits during ZIP Extraction Leading to Potential Privilege Escalation |
| GHSA-3g6h-r5qx-f6hq | high | quinn-proto@0.11.16 | Peer minimum ACK delay can panic quinn-proto when ACK_FREQUENCY transmission is enabled |
By the numbers
| Stars | 9,599 |
|---|---|
| Forks | 803 |
| Contributors | 47 |
| Commits | 9,941 |
| Open issues | 8 |
| Open pull requests | 6 |
| Releases | 341 |
| Latest release | desktop_v1.4.32 |
| Licence | MIT |
| Main language | Rust |
| Project age | 1 year |
| Last push | Oct 26, 2026 |
| Tracked files | 7,311 |
| Lines of code | 1.3M |
| Checkout size | 523 MB |
Lines by language: TypeScript 423.5K, Rust 420.5K, JSON 289K, SQL 82.2K, Markdown 49.8K, JavaScript 19K.
Questions
Is anarlog free?
Yes. The community app is MIT-licensed and free, including local transcription and bring-your-own model or API key. There is an optional paid Pro plan for hosted transcription and AI, and the enterprise components in the enterprise folder are under a commercial licence.
Does anarlog send my meetings to the cloud?
Only if you choose a cloud provider. Audio is captured on your device, transcription can run on-device on supported Macs, summaries can use a local model, and CloudSync is off by default. The app does send product usage analytics unless you opt out.
Do I need to tell people I am recording?
Yes, you should. No bot joins the call, so other participants will not see a recorder, but recording laws in many places require consent from everyone on the call. Say at the start that you are taking AI notes.
This post is part of GitHub Tools, where every repository is cloned and scanned before it is written up. The scan is a snapshot of one commit on one day; the repository has moved on since, so check it before you install.
