Skip to content
KrAG2000Public

About

Local-first voice-to-action desktop assistant: speak a thought, get a task, reminder, idea or note. whisper.cpp + llama.cpp, fully offline after setup.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

EchoNote

Press a shortcut, say what's on your mind, keep working. EchoNote turns the thought into a task, reminder, idea or reference note — using speech recognition and a language model that run entirely on your own computer.

  • 🎙 Capture in one keystroke from any app. A red dot in the top bar shows while the microphone is live (like GNOME's screen recorder), and recording stops by itself after 5 seconds of silence.
  • 📝 Local speech-to-text with whisper.cpp.
  • 🧠 Local organizing with llama.cpp and Google's open-weight Gemma 4 (E2B): category, short title, summary, action, and the date phrase you said.
  • ⏰ Reminders with desktop notifications, scheduled from SQLite and restored after restarts.
  • 📥 Nothing is ever lost: the transcript is saved before the AI runs. If the model is loading, missing, slow or wrong, the note waits in the Inbox.
  • 🔒 Offline after setup. No account, no API key, no telemetry, no cloud.
Capture Reminders Settings
Capture Reminders Settings

Built for the DEV Hacktoberfest Weekend Challenge 2026 ("Build for a Friend").


Install (Linux x86-64)

Download from the latest release.

Fedora / RHEL (recommended): RPM package. It installs like any other app, shows up in the app menu and in GNOME Software under Installed, and can be uninstalled from there.

sudo dnf install ./echonote-1.0.5.x86_64.rpm

Debian / Ubuntu: DEB package. Same as the RPM: app menu, GNOME Software / App Center, normal uninstall.

sudo apt install ./echonote_1.0.5_amd64.deb

Any other distribution: AppImage. A single portable file; nothing is installed.

chmod +x EchoNote-1.0.5-x86_64.AppImage
./EchoNote-1.0.5-x86_64.AppImage

(Needs FUSE, which Fedora ships. Elsewhere install fuse/libfuse2, or run with --appimage-extract-and-run.)

Then:

  1. The first-run screen downloads two model files (2.7 GB total) from Hugging Face and verifies their SHA-256 checksums. This is the only time EchoNote uses the network.
  2. Click Set up GNOME shortcut (on GNOME/Wayland). The default shortcut is Alt+Shift+Space.

Nothing else is needed: no Node.js, Python, Ollama, compiler, database server or manual model files. The inference runtimes (whisper-server, llama-server) are inside the package.

Requirements: x86-64 CPU with AVX2 (Intel Haswell / AMD Zen or newer), ~4.5 GB free RAM for the default models (smaller models are available in Settings for low-memory machines), ~3 GB disk for models. The bundled AI runtimes need glibc 2.35 or newer (Ubuntu 22.04+, Debian 12+, Fedora 36+). Tested on Fedora 44 / GNOME 50 (Wayland). The .deb and its bundled runtimes were also verified in an Ubuntu 24.04 container; the desktop experience on Ubuntu itself is untested.

Uninstall

  1. (Optional, removes your notes and the 2.7 GB of models.) In EchoNote open Settings → Delete all data, tick Also delete downloaded models, type DELETE, and confirm. This also removes the GNOME shortcut and the launch-at-login entry.
  2. Quit EchoNote: Settings → Quit EchoNote completely (closing the window keeps it running in the background).
  3. Remove the app:
    • RPM / DEB: GNOME Software (or App Center) → Installed → EchoNote → Uninstall, or sudo dnf remove echonote / sudo apt remove echonote.
    • AppImage: delete the .AppImage file (and any menu entry you created for it).

If you skipped step 1, your data stays in ~/.config/EchoNote (delete that folder to remove it), and the GNOME shortcut can be removed in GNOME Settings → Keyboard → Custom Shortcuts.

Using it

  • Press the shortcut (or the big button), speak, then press it again, or just stop talking: after 5 s of silence the recording stops automatically (Settings → While recording). If nothing was said, nothing is saved.
  • While recording, a red dot appears in the top bar. After you stop, a green check shows for 3 s and then disappears. On GNOME this needs the AppIndicator extension (sudo dnf install gnome-shell-extension-appindicator, then log out and in). Without it, EchoNote shows a small floating popup instead, and GNOME's own microphone icon still appears in the top bar.
  • Within a few seconds the note appears under Tasks / Reminders / Ideas / Reference.
  • If EchoNote isn't sure — e.g. "remind me next Friday" said on a Tuesday, a reminder with no date, or an unclear category — the note goes to Inbox → Needs confirmation with the reason and a pre-filled date you can correct.
  • Search finds text in transcripts, titles and summaries.
  • Closing the window keeps EchoNote running in the background so reminders and the shortcut work. Quit from Settings → Quit EchoNote completely.

How it works

shortcut ─► recorder (renderer, 16 kHz WAV) ─► SQLite capture row ─► whisper-server ─► transcript saved
                                                                                         │
                         reminder scheduler ◄─ validated record ◄─ zod + date resolver ◄─ llama-server + Gemma 4 (grammar)
  • The LLM never computes dates; it copies the date phrase ("tomorrow at 7 pm"). A deterministic resolver (chrono-node, local timezone) turns it into a time, and a phrase that does not occur in the transcript is discarded — so deadlines are never invented.
  • Model output is treated as untrusted input: grammar-constrained decoding (compact JSON, no whitespace), then strict validation.
  • "Thinking" is switched off for classification, so Gemma 4 answers directly.
  • Both inference servers are started once and stay warm; the shared prompt is cached at startup.

Details: docs/ARCHITECTURE.md · docs/PRIVACY.md · docs/TROUBLESHOOTING.md

Models

Purpose Model Size License
Speech (default) Whisper base.en, 5-bit (ggml) 57 MB MIT (OpenAI Whisper weights)
Speech (options) Whisper tiny.en / small.en / small (multilingual, for Hindi/Hinglish – experimental, untested) 31–181 MB MIT
Organizing (default) Gemma 4 E2B Instruct, Q4_0 GGUF (ggml-org) 2.65 GB Apache-2.0
Organizing (faster) Qwen2.5-1.5B-Instruct, Q4_K_M GGUF 1.04 GB Apache-2.0
Organizing (low memory) Gemma 3 1B Instruct QAT Q4_0 / Qwen2.5-0.5B-Instruct Q4_K_M 687 / 469 MB Gemma Terms of Use / Apache-2.0

All are open-weight models. Gemma 4 and Qwen2.5 weights are Apache-2.0, Gemma 3 uses Google's Gemma Terms of Use, and the Whisper weights are MIT. The training data of these models is not open, so they are "open-weight", not fully open-source AI.

Measured performance

Development machine: Intel i7-13620H (6P+4E cores, 16 threads), 16 GB RAM, Fedora 44, GNOME 50 Wayland, CPU only, system power profile quiet / powersave governor (as configured by the owner — expect better numbers in Balanced/Performance mode). Numbers from the automated suites in this repo (docs/benchmarks/, captures.timings).

Operation Measured
App window ready 0.22 s (dev), 0.67 s (AppImage, incl. FUSE mount)
Shortcut → app receives toggle (GNOME shortcut via named pipe) 17–27 ms (warm); 1.4 s if EchoNote has to be started
Toggle → microphone recording 0.13–0.58 s (getUserMedia + AudioWorklet start)
Stop → audio persisted ~0.15 s
whisper base.en load / transcription of a 3–11 s clip 0.23–0.5 s / 1.8–2.3 s
llama-server load / prompt-cache warm-up (once per launch) 2.0–2.9 s / 15–17 s
LLM classification, warm — Gemma 4 E2B (default) median 8.6 s, 8/8 correct
LLM classification, warm — Qwen2.5 1.5B median 5.5 s, 8/8 correct
LLM classification, warm — Gemma 3 1B / Qwen2.5 0.5B 4.2 s / 2.8 s, 6/8 correct each
Gemma 4 load / prompt-cache warm-up (once per launch) 4.5–13 s / ~35 s
Stop → organized note in the app 11.3–13.0 s with Gemma 4, 7.4–8.3 s with Qwen 1.5B (transcript visible after ~2.3 s)
Memory (RSS) llama-server with Gemma 4 E2B ~4.0 GB (Qwen 1.5B: 1.8–1.9 GB) · after startup / after 5 captures (Qwen run): llama-server 1.9 / 1.9 GB · whisper-server 105 / 164 MB · Electron (all processes, shared pages counted repeatedly) 0.74 / 0.96 GB

Speech model comparison (same machine, synthetic espeak voice, which is harder than a human voice):

Model Load Short clip RSS Notes
tiny.en q5_1 0.15 s 0.9 s 111 MB most errors
base.en q5_1 0.22 s 1.8 s 160 MB default – good balance
small.en q5_1 0.42 s 6.5 s 353 MB most accurate, ~3.5× slower

Targets not met on this machine: the spec's "warm LLM P95 < 2 s" — warm classification takes ~8.6 s with Gemma 4 E2B on this throttled CPU (generation runs at ~7 tokens/s; ~5.5 s with Qwen 1.5B). The transcript is saved and visible ~2 s after you stop, so nothing waits on the LLM, but organizing is not instant. Forcing compact JSON output cut Gemma's time from ~14 s to ~8.6 s. GPU offload is not implemented (the build machine has no CUDA/Vulkan SDK).

Testing

npm test                    # 96 unit tests: validation, dates, DB, pipeline, reminders, downloads, IPC, audio
npm run test:integration    # real whisper.cpp + llama.cpp on the real models (8 tests)
npm run test:e2e            # 7 end-to-end workflows driving the built Electron app

The end-to-end suite feeds WAV files into Chromium's fake microphone and drives the app exactly like the GNOME shortcut does (--toggle). It covers: reference note persisted & searchable after restart; a "remind me in two minutes" reminder delivered exactly once and not re-delivered after restart; a future reminder restored after restart; the LLM missing → transcript kept in the inbox → organized after the model returns, without duplicates; first-run setup with a failed then successful real model download; an invalid shortcut, denied microphone and duplicate-toggle protection; and a full capture → transcription → classification run inside a Linux network namespace with no network interface (offline). The same suites were run against dist/linux-unpacked and the AppImage (ECHONOTE_E2E_EXE=…).

Not automated: actually pressing a key on a physical keyboard, a real human voice, and the visual appearance of the desktop notification — check these manually (see below).

Build from source

Requires Node.js 24 (.nvmrc), git, g++, cmake (or CMAKE="uvx --from cmake cmake"). Packaging needs rpmbuild and dpkg-deb; electron-builder's bundled fpm also needs libcrypt.so.1 (libxcrypt-compat on Fedora; the bundler extracts it automatically if it isn't installed).

npm ci
npm run native:build -- --container   # portable whisper-server + llama-server (Ubuntu 22.04 / glibc 2.35, needs Docker or Podman)
npm run models:prepare      # optional: pre-download default models to ~/.config/EchoNote/models
npm run dev                 # run in development
npm run dist:linux          # checks, tests, builds AppImage + .rpm + .deb, inspects them, writes dist/SHA256SUMS
npm run dist:linux -- --release   # ... and publishes GitHub release v<version> (notes: docs/release-notes/v<version>.md)

Limitations

  • Linux x86-64 only; tested on Fedora 44 / GNOME 50 Wayland. Windows/macOS are not supported yet (the main-process logic is portable; packaging, shortcuts and runtimes are not done).
  • On GNOME Wayland, Electron cannot register global shortcuts (tested: returns false even with the GlobalShortcutsPortal feature), so EchoNote installs a GNOME custom keyboard shortcut on request. Other Wayland desktops need a manually bound shortcut running EchoNote… --toggle.
  • Reminders fire only while EchoNote is running. Missed reminders are shown as overdue at next start. Launch-at-login is available for the AppImage build.
  • English is the tested language. The multilingual Whisper model for Hindi/Hinglish is selectable but has not been tested with real speech.
  • One primary intent per recording; a note containing several tasks becomes one item.
  • The top-bar recording indicator needs the AppIndicator extension on GNOME (stock GNOME has no tray); without it a floating popup is used.
  • Models are downloaded at first run (not bundled) to keep the packages small (AppImage 135 MB, RPM 96 MB).
  • Gemma 4 E2B needs ~4 GB of RAM; on machines with less free memory EchoNote offers the smaller models.

License

MIT for EchoNote's code. Bundled runtimes: whisper.cpp and llama.cpp (MIT). Models are downloaded from their publishers under their own licenses (see the table above).

About

Local-first voice-to-action desktop assistant: speak a thought, get a task, reminder, idea or note. whisper.cpp + llama.cpp, fully offline after setup.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages