All field notes

Field note / EchoLedger

Local-First AI: Privacy Lessons from Building EchoLedger

EchoLedger is a local-first Mac meeting-notes MVP. Designing capture, transcription, speaker separation, screenshots, retention, permissions, and deletion around the device made privacy an architecture—not a promise in the footer.

Meeting notes are useful because meetings contain the exact information people do not want casually exposed: customer details, employee concerns, product decisions, negotiations, and half-formed ideas. That makes meeting software a good test of whether “privacy-first” is an architecture or just a sentence on a landing page.

I have been building EchoLedger as a native, local-first macOS meeting recorder. It captures audio from an application window the user selects, can include the microphone when the user explicitly enables it, transcribes with Apple’s on-device speech technology, separates speakers with on-device machine-learning models, and produces editable notes without requiring an account or a content-upload service. It never joins the call as a bot.

EchoLedger is still an MVP, not a broadly distributed finished product. Compilation, deterministic identity behavior, and the on-device speaker pipeline have been tested, but a signed, permission-enabled capture check in a real meeting environment is still required before beta distribution. That limitation belongs in the story because privacy claims are only as good as the behavior that has actually been verified.

Here are the design lessons I expect to reuse.

Local-first starts with a data map

“Runs on your computer” is not precise enough. A product may process audio locally while sending analytics, crash context, screenshots, prompts, or transcript excerpts elsewhere. The first step is to list every sensitive artifact and every place it can travel.

For EchoLedger, that includes:

  • captured application audio;
  • optional microphone audio;
  • transcript text;
  • recognized text from saved screenshots;
  • structured notes;
  • speaker embeddings and labels;
  • retained recording files; and
  • logs, exports, recovery files, and preferences.

The current design keeps meeting content on the Mac. There is no account, analytics service, advertising SDK, backend, or content-upload path. A first-use download is required for speaker models, so the product should not claim that it never uses the network. It should say exactly what the network is used for and what is not uploaded.

That distinction is small in copy and large in trust.

Refusing a cloud fallback is a product decision

On-device features can fail because an operating-system language asset is unavailable, a model has not finished downloading, or the current hardware cannot perform the job as expected. The tempting fallback is to send the content to a server so the feature appears more reliable.

EchoLedger refuses to fall back to server speech recognition. If the supported local path is unavailable, the feature should explain the requirement rather than silently changing the privacy model.

This is the same principle as failing closed in other high-trust workflows: a limitation that the user can understand is better than success achieved under a different set of promises.

Permission prompts are part of the experience

A Mac recording app needs sensitive operating-system permissions. EchoLedger uses the standard Screen & System Audio and Speech Recognition permission paths. Microphone permission is requested only when the user enables microphone inclusion. Settings show permission status, provide request actions, and link to the appropriate system controls.

The goal is not to make permission friction disappear. The goal is to make the request specific and honest:

  • what access is needed;
  • which feature needs it;
  • whether the feature can work without it; and
  • how the user can change the decision later.

A broad permission requested before its purpose is visible feels invasive even when the underlying implementation is sound. Sequence and explanation matter.

Capture should remain intentional and visible

EchoLedger does not begin recording automatically. The user selects an application, acknowledges consent, and starts the session. A persistent recording indicator stays visible.

That choice gives up some “effortless” automation. It also avoids a far worse failure: capturing a conversation the user did not intend to record. Meeting consent requirements can vary by location and context, so the product cannot make that legal or relational decision for the user. It can make recording deliberate, visible, and easier to stop.

This is a useful pattern beyond audio. When an action changes the sensitivity of collected data, explicit state is often better than clever inference.

Privacy-friendly defaults reduce future mistakes

Audio retention is off by default. When a user enables it, the audio is stored as files rather than being hidden inside an opaque application database. Deleting a meeting removes the audio it references. A separate delete-all action removes meetings, recordings, recovery files, and preferences.

Defaults matter because many people never revisit settings. A product should not rely on every user finding a privacy control after sensitive data has already accumulated.

Retention also needs to be connected to deletion. A “delete meeting” button that leaves the underlying recording, screenshot cache, or export behind is only deleting the interface’s memory of the data.

Logs can violate an otherwise local design

Developers use logs to diagnose errors. That makes logs an easy place for transcript fragments, file paths, prompt inputs, or recognized screen text to leak. EchoLedger’s design prohibits meeting audio, transcript text, note content, recognized screen text, and voice embeddings from being written to unified logs.

The app still needs diagnostics. The safer pattern is structural and redacted information: permission states, feature status, model availability, versions, and error categories without the content that caused the error.

“Local” is not only about network requests. It is also about every local subsystem that can duplicate sensitive content.

Local AI still needs operational honesty

Running models on the device does not eliminate reliability work. Long recordings need bounded streams and careful timestamps. Speaker labels can change during processing. Provisional results need to be distinguished from authoritative post-processing. Files need lifecycle management. App permissions are tied to the signed identity users actually install.

A local-first product can be private and still be unfinished, inaccurate, or hard to recover. Privacy is one quality attribute, not a substitute for testing.

Questions to ask before choosing local-first

Not every business workflow needs an on-device architecture. Cloud services can be the right choice when teams need shared access, centralized administration, or server-scale processing. But sensitive workflows deserve a deliberate decision.

I would ask:

  1. What is the most sensitive input?
  2. Does it need to leave the device to produce the required result?
  3. Which features truly require an account or shared backend?
  4. What happens when local assets are unavailable?
  5. What does the product log?
  6. What is retained by default?
  7. Does deletion remove the underlying artifacts?
  8. Which privacy behavior has been verified in the exact signed build users will run?

EchoLedger’s most useful lesson is not that every AI product should be local. It is that privacy should change the structure of the product: its dependencies, fallbacks, permissions, defaults, logs, deletion behavior, and release evidence.

If privacy only changes the marketing copy, the design work has not started yet.

Filed under

  • EchoLedger
  • Local-first AI
  • Privacy