About
NTLedger, short for Note-Taking Ledger, is a local meeting notetaker for accountants. It captures a client call on your own Mac, transcribes it on-device, and turns the conversation into engagement notes filed by client and purpose. No bot joins the meeting, and the audio never leaves the machine.
It is for solo and small-firm accountants who will not invite a third-party recorder into a client conversation.
- Manual, bot-free capture. You start it, behind a participant-awareness acknowledgement.
- Two audio sources, kept separate. Your microphone and the meeting audio are labelled YOU and MEETING: attribution without claiming speaker diarization.
- On-device transcription with whisper.cpp, in near-live windows, or import a Zoom or Teams recording.
- Engagement-aware summaries. Nine meeting purposes, from discovery call to IRS notice call, each with an accounting template.
- Local Autopilot. A local Ollama model titles the meeting, files it to a client, classifies the purpose, and drafts the summary. It fills blanks only, never overwrites.
- An encrypted meeting library with search, DOCX and Markdown export, and a read-only MCP server that can hand a summary to Practice Ledger.
Status, plainly: no installer, no release, and not ready for client data. The project’s own rules bar real client recordings until an independent security review and the capture-reliability matrix pass. ntledger.com is registered and still shows a placeholder. No one but me has used it.
Where it fits. NTLedger is the front door of the desktop suite: the conversation becomes a record that can flow into Practice Ledger as a proposed import. It follows the same local-first, MCP-server pattern as LedgerTB and LedgerPDF.
How I built it
Bootstrapped 2026-08-09 from my build kit at the production tier, because a recorded client call is taxpayer data. A working product followed in about two weeks: twenty-one tickets, thirty-four logged decisions, two formal reviews, all with Claude Code.
- Rust core, thin webview. Tauri 2 with a React front end whose content security policy forbids network entirely. Every network call lives in Rust, and the whole egress list is four paths: a pinned model download, the Ollama loopback, an optional bring-your-own-key cloud summary, and a planned update check.
- Audio has no network path. Live capture retains no audio at all; PCM is measured in bounded memory and discarded.
- Local means proven local. A loopback URL is not proof. The app asks Ollama to describe the model and rejects any that reports remote routing.
- Cloud is consent, every time. A native Rust dialog names the provider and hostname on each send, with no remember-my-choice. Structured client names never enter a prompt, local or cloud.
- The rename was a data decision. LedgerVoice became NTLedger on 2026-08-14, before any install existed, because the bundle identifier controls the app-data directory and the keychain entry holding the encryption key. Later would have meant a migration.
