6 min read

anarlog: Open-Source Granola Alternative for Meeting Notes (GitHub, Scanned)

An AI meeting notepad that records on your own device, with no bot joining the call.

anarlog logo
✅
Scan: safe. Nothing malicious. Know that product analytics are on unless you opt out, cloud features are opt-in, and the sync feature ships as prebuilt third-party binaries. Scanned Oct 26, 2026; the full report is below.

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 anarlog

2. Install the workspace (needs Node.js 22+, pnpm, Rust and the Tauri prerequisites)

pnpm install --frozen-lockfile

3. Start the desktop app in development mode

pnpm dev:desktop

On 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

CheckResult
Secrets3 candidates found and read; see the notes above.
Suspicious code4 pattern hits found and read; every one is listed under the raw findings.
Install-time code59 Cargo build scripts. 6 installer scripts (one fetches and runs a remote script; one can call sudo)
Committed binaries12 executable or compiled objects committed; listed under the raw findings.
CI workflows32 workflows. None use pull_request_target. 25 of 32 third-party actions pinned to a tag rather than a commit.
Network hosts40 distinct hosts referenced from source; most often anarlog.so, github.com, api.anarlog.so, meet.google.com. No URLs to bare IP addresses.
Known vulnerabilities117 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 hygieneHas security policy, automated dependency updates, CodeQL, licence file, contributing guide.
OpenSSF ScorecardNot 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)
WhereRuleMatch
apps/api/src/tests.rs:107private-key-----B…--- (27 chars)
crates/api-cloud/src/routes.rs:618private-key-----B…--- (27 chars)
crates/supabase-auth/src/server/mod.rs:161private-key-----B…--- (27 chars)
Pattern hits (4)
WhereRuleMatch
packages/api-client/src/generated/sdk.gen.ts:5very-long-line9026 chars
scripts/setup-devtools.sh:39download-piped-to-shellcurl -fsSL https://dprint.dev/install.sh | sh
scripts/setup-devtools.sh:62download-piped-to-shellcurl -1sLf 'https://dl.cloudsmith.io/public/task/task/setup.deb.sh' | sudo -E bash
scripts/setup-devtools.sh:67download-piped-to-shellcurl -1sLf 'https://artifacts-cli.infisical.com/setup.deb.sh' | sudo -E bash
Installer scripts (6)
Committed binaries (12)
  • crates/cloudsync/vendor/cloudsync/android/x86_64/cloudsync.so: ELF, 8 MB
  • crates/cloudsync/vendor/cloudsync/android/arm64-v8a/cloudsync.so: ELF, 7 MB
  • crates/cloudsync/vendor/cloudsync/android/armeabi-v7a/cloudsync.so: ELF, 5 MB
  • crates/cloudsync/vendor/cloudsync/apple/CloudSync.xcframework/ios-arm64_x86_64-simulator/CloudSync.framework/CloudSync: Mach-O, 1 MB
  • crates/cloudsync/vendor/cloudsync/linux/musl/aarch64/cloudsync.so: ELF, 790 KB
  • crates/cloudsync/vendor/cloudsync/linux/gnu/x86_64/cloudsync.so: ELF, 754 KB
  • crates/cloudsync/vendor/cloudsync/linux/musl/x86_64/cloudsync.so: ELF, 753 KB
  • crates/cloudsync/vendor/cloudsync/linux/gnu/aarch64/cloudsync.so: ELF, 730 KB
  • crates/cloudsync/vendor/cloudsync/windows/x86_64/cloudsync.dll: PE (Windows executable), 699 KB
  • crates/cloudsync/vendor/cloudsync/macos/x86_64/cloudsync.dylib: Mach-O, 645 KB
  • crates/cloudsync/vendor/cloudsync/macos/aarch64/cloudsync.dylib: Mach-O, 612 KB
  • crates/cloudsync/vendor/cloudsync/apple/CloudSync.xcframework/ios-arm64/CloudSync.framework/CloudSync: Mach-O, 611 KB
Worst known vulnerabilities (24 of 117)
AdvisorySeverityPackageSummary
GHSA-4684-h2q9-2vcpcriticalzip@2.4.2ZipStreamReader::extract() and ZipArchive::extract() apply Unix permissions through symlinks without confining the targe…
GHSA-4684-h2q9-2vcpcriticalzip@4.6.1ZipStreamReader::extract() and ZipArchive::extract() apply Unix permissions through symlinks without confining the targe…
GHSA-cg2g-xh64-v4q7criticaldompurify@3.4.16DOMPurify SAFE_FOR_TEMPLATES bypass: split template expressions survive in attached shadow root content on DOM output mo…
GHSA-pqg4-j6r4-53mvcriticalshell-quote@1.10.0shell-quote: `quote()` command injection via a line terminator in a token after a `{ comment }` token
GHSA-8ffr-xgwf-xj56highaws-smithy-json@0.61.9aws-smithy-json: Uncontrolled recursion in the aws-smithy-json unknown-key skip path allows unauthenticated remote denia…
GHSA-8ffr-xgwf-xj56highaws-smithy-json@0.62.5aws-smithy-json: Uncontrolled recursion in the aws-smithy-json unknown-key skip path allows unauthenticated remote denia…
GHSA-f26g-jm89-4g65highgix@0.77.0gitoxide: CommandForbiddenInModulesConfiguration Bypass in gix_submodule::File::update() Enables Arbitrary Command Execu…
GHSA-fr8x-3vfx-f45hhighgix@0.77.0gix and gitoxide: unvalidated submodule name traverses out of .git/modules and redirects state() / open() to another rep…
GHSA-p3hw-mv63-rf9whighgix@0.77.0gix's submodule name validation bypass + trust inheritance flaw enables path traversal and credential disclosure
GHSA-pg4w-g64p-qwhjhighgix@0.77.0gix and gitoxide's symlinked .gitmodules are followed and parsed from outside of the repository
GHSA-f89h-2fjh-2r9qhighgix-fs@0.18.2gix-fs: Symlink prefix-reuse allows worktree escape during checkout
GHSA-x494-mj8g-cj27highgix-pack@0.64.1gix-pack has multiple DoS vectors: unchecked indexing panics and uncapped OOM allocations from crafted pack data
GHSA-p3hw-mv63-rf9whighgix-validate@0.10.1gix's submodule name validation bypass + trust inheritance flaw enables path traversal and credential disclosure
RUSTSEC-2026-0194highquick-xml@0.38.4Quadratic run time when checking a start tag for duplicate attribute names
RUSTSEC-2026-0195highquick-xml@0.38.4Unbounded namespace-declaration allocation in `NsReader` enables memory-exhaustion denial of service
RUSTSEC-2026-0194highquick-xml@0.39.2Quadratic run time when checking a start tag for duplicate attribute names
RUSTSEC-2026-0195highquick-xml@0.39.2Unbounded namespace-declaration allocation in `NsReader` enables memory-exhaustion denial of service
GHSA-3g6h-r5qx-f6hqhighquinn-proto@0.11.17Peer minimum ACK delay can panic quinn-proto when ACK_FREQUENCY transmission is enabled
GHSA-ppcp-v39w-8jq2highquinn-proto@0.11.17Outgoing datagram buffer accounting can panic the sender in quinn-proto
GHSA-82j2-j2ch-gfr8highrustls-webpki@0.101.7rustls-webpki: Denial of service via panic on malformed CRL BIT STRING
GHSA-j5gw-2vrg-8fgxhightokio-tar@0.3.1astral-tokio-tar Vulnerable to PAX Header Desynchronization
GHSA-vv5m-jxxh-4627highzip@2.4.2Insecure Preservation of SUID/SGID Bits during ZIP Extraction Leading to Potential Privilege Escalation
GHSA-vv5m-jxxh-4627highzip@4.6.1Insecure Preservation of SUID/SGID Bits during ZIP Extraction Leading to Potential Privilege Escalation
GHSA-3g6h-r5qx-f6hqhighquinn-proto@0.11.16Peer minimum ACK delay can panic quinn-proto when ACK_FREQUENCY transmission is enabled

By the numbers

Stars9,599
Forks803
Contributors47
Commits9,941
Open issues8
Open pull requests6
Releases341
Latest releasedesktop_v1.4.32
LicenceMIT
Main languageRust
Project age1 year
Last pushOct 26, 2026
Tracked files7,311
Lines of code1.3M
Checkout size523 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.