Echoes
com.echoes.echoes
LWB lwb89@cosanostr.com **Offline-first, end-to-end encrypted notes — synced privately over [Nostr](https://nostr.com), on your terms.**
First release: Jul 12, 2026, 16 total releases.
Most recent release: Sep 28, 2026.
Appears in 3 app stacks.
16,800 sats / 8 zaps received in the past year.
Sats Received
Underlying data available via MCP: app_zaps, app_releases.
Zap Count
Underlying data available via MCP: app_zaps, app_releases.
Releases
- Sep 28, 2026 1.1.0## v1.1.0 A visual pass over the desk. Sync, encryption, and local storage are unchanged: a note still leaves the device only after you echo it yourself. versionCode is **2015** (versionName 1.1.0). ### Desk - Iris and coral instead of teal, with an aurora behind frosted search and navigation. - Note cards use a gloss gradient. Opening a note uses that same gradient, not a flat fill. - Diary reads as a month-and-day timeline. - The + button opens a fan: note, checklist, photo, and voice where the device can play it back. A long press writes a plain note immediately.
More…
- Voice memos on a card show a waveform and a duration, drawn without decoding the audio while you scroll. ### Notes - Swipe right to pin, swipe left to archive. The same actions are in the selection menu, the note menu, and for the screen reader. Pin and archive stay on this device; they are not part of the synced note, and pinning does not publish anything. - Link another note with `[[Title]]`, or `[[Title|id]]` when you pick one from the list. The id keeps the link if the title changes. Opening a note shows Echoes (backlinks) and Linked. - Local notes show an open ring. A note you have synced shows a filled ring, **Echoed**, with one ripple the first time. In Italian the section stays **Echoes**, and a single backlink is **Echoe**. - The Echoes heading and “link a note” use the sheet’s own ink, so they stay readable on a coloured note and in the dark theme. ### Also - Removed the extra outline that sat on top of the relay, language, attachment, and support controls in Settings. ### Install All three APKs are versionCode 2015 / versionName 1.1.0, signed with the release key. - `app-arm64-v8a-release.apk` — almost every phone from the last several years - `app-armeabi-v7a-release.apk` — older 32-bit phones - `app-release.apk` — universal, if you are not sure which of the two you need - Sep 4, 2026 1.0.0# Echoes v1.0.0 — First Stable Release 🎉 Echoes has carried a `0.x` number since the first commit while the sync protocol, the attachment pipeline and the UI settled. They've now been stable across many releases, so `1.0.0` says that out loud. Alongside the milestone: a visual refresh, and two real UX fixes. ## 🎨 Visual refresh A shared set of theme tokens now runs through the whole app — home,
More…
onboarding, login, settings, and the editor all pick up softer surfaces, consistent spacing/radius, and the same warm-teal palette instead of each screen leaning on slightly different Material defaults. ## ✍️ Formatting no longer fights Android for space Selecting more than a word or two to bold/italicize/strike/underline it used to put Android's own text-selection popup right on top of Echoes' formatting toolbar — the popup grows to follow the selection, and a longer phrase routinely reached the same spot on screen, so one covered the other and taps landed on whichever happened to be on top. Formatting now lives *inside* that same selection popup instead, so there's only ever one toolbar for a selection, correctly positioned no matter how long it is. ## 🗑️ Deleting a note doesn't make you wait on a relay Deleting one note — or several at once — used to sit behind a non-dismissible "deleting…" screen for as long as a slow or unreachable relay took to answer. The note was already gone locally the whole time. Local deletion (fast, no network) is what the screen waits on now; retracting the note from relays runs in the background afterward. ## 🩹 Also A version-numbering mistake in the already-published v0.4.9 release (`--split-per-abi` silently inflated its versionCode) was blocking every update since for anyone who had it installed — Android refuses to install a lower versionCode over a higher one. The v0.4.9 assets have been rebuilt and replaced. **If updates have seemed stuck for you, uninstall and reinstall once — that clears it for good.** --- Signed with the same release key as every build since v0.4.2 (`24e792da…`). Split APKs for arm64-v8a and armeabi-v7a, plus a `.deb` for Debian-based Linux distributions. - Sep 1, 2026 0.4.11# Echoes v0.4.11 — Relays That Actually Retry 🔄 A fix for note sync still misbehaving after the previous release's publish fix, plus a drag-and-drop freeze, underline, and five more note colors. ## 🔄 The real cause A memoization added to skip needless reconnect work was the culprit: once a given set of relays had been "seen" before, `connectToRelays` returned immediately on every later publish or fetch — even for a relay in that set
More…
that had *never actually connected* in the first place (its connection failure is swallowed internally and doesn't surface as an error). That relay was then never retried again for the rest of the session, no matter how many notes were synced afterwards — silently, since every other relay kept working fine. Restarting the app was the only thing that helped. **Fixed**: removed the memoization. Reconnecting is cheap for a relay that's already up (the underlying library already skips those on its own), so calling it before every publish and fetch is exactly what lets a relay that failed once catch up on its own the next time. Confirmed against a local test relay that only comes up after the first connection attempt. ## ✋ Drag-and-drop that scrolls Reordering notes by dragging one near the top or bottom edge of a long list now auto-scrolls to follow your finger, instead of stalling there with no way to reach the rest of the list. ## 📝 Also - **Underline** joins bold, italic and strikethrough in the formatting toolbar. - **Five more note background colors**: pink, teal, indigo, brown, lime. - A single unreadable note in the local cache (e.g. after rolling back to an older version) no longer takes the whole note list down with it. - Aug 26, 2026 0.4.10# Echoes v0.4.10 — Sync That Doesn't Hang 🔧 A focused fix for note sync and deletion behaving badly whenever a relay was slow or unreachable — this was the biggest thing wrong with recent releases. ## 🔧 The real cause Publishing a note (and retracting one on delete) sent one request **per relay**. Under the hood, that call resets the *entire* relay connection pool whenever the target relay wasn't already connected — so a single flaky relay
More…
(a self-hosted one waking up, or one just having a bad day) could tear down every other relay's connection, or leave the whole operation waiting with no way out. That's the "sync doesn't seem to work" and "deleting a note gets stuck" behaviour from the last few releases, reproduced and confirmed against real relays before this fix, and again after. **Fixed**: publishing is now one broadcast to every relay, with a single 10-second window for all of them to answer — not stacked one after another — and the connection pool is left alone if it's already up. A note that only some relays accept says so plainly ("Synced to 2 of 4 relays") instead of claiming a clean success. ## 📝 Also - **Note previews respect bulleted lists.** A shopping list now shows `milk / bread / coffee` on separate lines on the home screen, instead of running everything together into one unreadable line — and completed checklist items still never appear in the preview. - **Strikethrough** joins bold, italic and heading in the formatting toolbar. --- **Android:** signed with the release key introduced in v0.4.2 (`24e792da…`). Updating from v0.4.2 or later is a normal in-place update. - Aug 20, 2026 0.4.9# Echoes v0.4.9 — App-Drawer Icon, For Real This Time 🖼️ v0.4.8 fixed the icon's opaque background but missed a second bug: the feather's tip sat past the ~61% safe-zone circle every round-mask launcher (Pixel, some Samsung/OnePlus skins) is allowed to clip. That's why the icon still looked cut off in the app drawer on those devices. The adaptive-icon foreground now has a 6% inset, pulling the artwork back inside the safe zone with margin.
- Aug 18, 2026 0.4.8# Echoes v0.4.8 — Photo Backgrounds & a Fixed Icon 🖼️📱 ## 📱 The app icon renders correctly again The launcher icon was built with a **transparent** adaptive-icon background, which Android's own spec doesn't allow: launchers ended up masking empty space, so the icon came out wrong in the app drawer. The legacy icon had the same root cause — it was the transparent foreground artwork used on its own, opaque across barely a fifth of its pixels.
More…
Both layers are now correct: the mark sits on an opaque Echoes-teal tile, comfortably inside the safe zone every launcher mask keeps. ## 🖼️ Give a note its own photo background Pick any photo from your library as a single note's background, from the same palette button that sets its colour — plus a "remove photo" option to go back. - The photo is **copied into the app's own storage**, so the note doesn't break when the original is moved or deleted from your gallery. - It's scrimmed so note text stays readable over any picture, in light and dark mode alike. - Deleting a note deletes its background photo with it. Backgrounds are kept on the device and are not published with the note — the same choice as the manual note order, for the same reason. ## 🔄 Publish on save (optional) New setting: when a note **you already sync** is saved, publish the new version straight away instead of waiting for the next background cycle. On by default, and deliberately narrow — it can never publish a note that has never left your device. Turn it off if you'd rather choose when to publish (metered data, a slow self-hosted relay). ## ✨ Also - **The note title is noticeably larger** than the body text — at the old size the two read as the same thing. - Added tests that pin down what "synced" reports: a note accepted by one relay out of four says so, rather than claiming a clean full publish. --- **Android:** signed with the release key introduced in v0.4.2 (`24e792da…`). Updating from v0.4.2 or later is a normal in-place update. **Linux:** `echoes_0.4.8_amd64.deb` for Debian/Ubuntu-based distributions. - Aug 11, 2026 0.4.7# Echoes v0.4.7 — Reordering, Actually Working 🔧 A focused fix for the drag-and-drop reordering introduced in v0.4.6. ## 🔧 Notes can now actually be reordered Picking a note up worked — it lifted, it followed your finger, the animation ran — but dropping it did nothing. Only the card being dragged was set up to *receive* a drop, which meant there was nowhere for it to land.
More…
Lifting and receiving are two separate abilities: only the selected note can be picked up, but **every** note has to be able to accept it. They were wired to the same switch; now they aren't. Reordering behaves as intended: long-press a note to select it, drag it onto another, and it takes that note's place — in both the grid and the list. ## 🧪 Under the hood Added regression tests that drive a real drag gesture (press, move onto another card, release) rather than inspecting the widget tree. The old bug passed static analysis and looked fine on screen, so only an actual gesture could have caught it — and these tests do: they fail against the previous code and pass against this one. --- **Android:** signed with the release key introduced in v0.4.2 (`24e792da…`). Updating from v0.4.2 or later is a normal in-place update. **Linux:** `echoes_0.4.7_amd64.deb` for Debian/Ubuntu-based distributions. - Aug 11, 2026 0.4.6# Echoes v0.4.6 — Arrange Your Notes ✋🎨 ## ✋ Rearrange notes by hand Notes no longer have to live in the order they were last touched. - **Long-press a note to pick it up, then drag it where you want it.** The card lifts with a shadow as it follows your finger, and the note you're about to drop it on eases aside so it's clear where it will land. - Works in **both layouts** — the post-it grid and the single-column list.
More…
- Newly created (or newly synced) notes always appear **first**, never buried at the bottom of a hand-sorted list. The arrangement is kept on the device rather than published with the note: adding a field to the note format would have older clients strip it again on their next save, and an ordering is a per-device preference, not content. ## 🎨 Fixes - **Short notes no longer float in the middle of the screen.** Text starts at the top-left, as it should — this also quietly fixes the same off-centring in onboarding and settings. - **Coloured notes stay coloured while editing.** The title and body fields were painting a pale slab over the note's own colour; now writing on a yellow note actually looks yellow, title included. - The **record button** has breathing room above the body text instead of sitting right on the first line. ## 🎙️ Voice notes - After a recording, a **checkbox appears right there** to keep or drop its timestamp — ticked by default. Previously the only way to change it was a long-press on the bubble, which nobody found. - Recordings are inserted **at the cursor**, so a captured snippet stays exactly where you were writing — lecture audio sitting under the paragraph it belongs to, rather than at the bottom of the note. --- **Android:** signed with the release key introduced in v0.4.2 (`24e792da…`). Updating from v0.4.2 or later is a normal in-place update. **Linux:** `echoes_0.4.6_amd64.deb` for Debian/Ubuntu-based distributions. - Aug 10, 2026 0.4.5# Echoes v0.4.5 — New Look & Checklists That Behave 🎨✅ ## 🎨 A new visual identity New app icon, splash screen and brand colours across Android, Linux and web. ## ✅ Checklists, reworked Built around how a shopping list is actually used:
More…
- **Previews show only what's left to do.** A ticked-off item no longer appears in the note preview on the home screen — no more buying something you already have because the preview still listed it. - **Completed items move into their own collapsed section**, below the list and one tap away, instead of burying today's few rows under weeks of history. - **Type-ahead against what you've already ticked off.** Typing `o`, then `ol`, then `oli` narrows through your completed items as you go; tap one to put it back on the to-do list. No more retyping a whole entry only to end up with a duplicate, and no more scrolling through dozens of ticked rows to find it. - A new checklist opens with a row ready and a **clearly visible cursor**, so it's obvious you can just start typing. ## 🔄 Sync fixes - **"Synced" now means it.** Publishing reported success as soon as a *single* relay accepted a note, so a note could look synced on one device and be missing on another that read a relay which never got it. Every relay is now tried individually, and a partial write says so plainly: *"Synced to 2 of 4 relays"*. - **Attachments deleted by a file host are re-uploaded.** Hosts garbage-collect blobs to reclaim space and nothing tells the app, leaving images and voice notes broken everywhere for good. Echoes now checks on launch (and on manual refresh) and re-uploads from the local copy when one has gone missing. - **Timestamps travel as UTC.** They previously carried no timezone at all, so a device in another timezone read the same text as a different instant — which could make an edit lose a merge, or be dropped outright. - **Syncing continues when you leave a note**, and reports the result wherever you are — successes *and* failures used to go silent if you navigated away. - Notes are pulled fresh **on app open**, rather than waiting for the next background cycle. ## ✨ Interface - The note editor's action icons get their own row, with the title on a separate line below — no more squeezed or colliding titles. - The **+** button is larger and spins a full turn as it becomes **✕**. - Note text is back to normal left-aligned formatting, and short notes start at the top instead of floating in the middle of the screen. - Checklist **"add item"** uses a muted dark grey, readable on every note colour. --- **Android:** signed with the release key introduced in v0.4.2 (`24e792da…`). Updating from v0.4.2 or later is a normal in-place update. **Linux:** `echoes_0.4.5_amd64.deb` for Debian/Ubuntu-based distributions. - Aug 2, 2026 0.4.4# Echoes v0.4.4 — Bunker Sign-In & Desktop 🔐🐧 ## 🔐 Sign in with a remote signer (NIP-46 "bunker") A third way to sign in, on **every platform** (Android *and* desktop) — your private key stays in a bunker (Amber acting as one, nsec.app, nsecbunker, …) and **never reaches Echoes**. Every signing, encryption and decryption is sent to the signer as an encrypted request over relays. - Paste a `bunker://` token to connect; approve once in your signer.
More…
- Robust and isolated by design: the signer's key is pinned from the token, every response is signature- and author-verified (a relay can neither read nor forge the traffic), the connection uses an ephemeral key on its own transport, and the session lives only in secure storage. - `ws://` bunker relays are supported for self-hosted signers on a trusted LAN or Tailscale. > **Note:** continuous signing means one round-trip to your signer per > operation, and the signer must be reachable while you sync. Live interop with > real bunkers is still being field-tested — please report anything odd. ## 🐧 Debian/Ubuntu package Echoes desktop can now be built as a single `.deb` (`./packaging/deb/build-deb.sh`), with a desktop entry, icons and AppStream metadata — no Java dependency. ## 🐛 Fixes - **Note text renders normally again** — an earlier justify experiment made paragraphs look stretched/centered; reverted to normal left-aligned text. - **Short notes no longer float in the vertical middle** of the reading view. - **Sync on launch** — opening the app now pulls your synced notes right away instead of waiting for the next background cycle (local-only notes are never touched, as always). - Checklist **"add item"** now uses a muted dark-gray, distinct from note text, on every note background color. ## 🔒 Security hardening - All third-party downloads (attachments, NIP-96 discovery, avatars, NIP-05) are streamed with hard size caps and https-only redirects — a hostile host can't feed an endless or downgraded response. - Fetched note events are rejected if their timestamp is unreasonably far in the future or their payload/envelope timestamps disagree — closing a last-write-wins "poisoning" angle. - Stricter URL parsing at every network trust boundary (rejects credential-in-URL obfuscation and malformed values). - Jul 26, 2026 0.4.3# Echoes v0.4.3 — Voice Notes That Stay 🎙️🗒️ ## 🎙️ Voice notes no longer get lost over time (important) A real durability bug is fixed. After a voice note was synced, the only local copy of its audio lived in the app's **OS-purgeable cache**: once the system reclaimed that cache (which it does under storage pressure) the recording survived only as the encrypted blob on its file host — and free hosts eventually garbage-collect blobs, so "after a while" a voice note could vanish entirely.
More…
Voice notes now keep a **durable local copy** (in persistent app storage the OS does not purge), so an OS cache purge — or the host dropping the blob — can no longer make a recording disappear. Images are unchanged (they stay in the re-downloadable cache). Note: recordings already lost before this update can't be recovered — the bytes were gone from every location. This prevents it happening again. ## 🗒️ Notes look like a notes app now - **Post-it grid by default**: the note list opens as a Google-Keep-style masonry grid instead of a single column. Prefer the list? Your choice is remembered — only the never-changed default moved. - **Justified note text** in the reading view, for a cleaner block of text. ## 🔗 Relays - **Two more default relays** (`offchain.pub`, `nostr.mom`) alongside `relay.damus.io` and `nos.lol`, so one relay having a bad day no longer halves your redundancy. (Existing relay lists are untouched — add them in Settings › Relays if you want them.) - **Adding a relay now auto-republishes** your already-synced notes to it, so a newly added relay is backfilled with your history instead of only receiving notes you edit afterwards. ## ✨ Polish - The **+** button does a quick full spin as it turns into the ✕. - Internal: the note editor's source file was split up for maintainability. --- Android note: this build is signed with the dedicated release key introduced in v0.4.2 (`24e792da…`). If you're coming straight from v0.4.1 or older you still need the one-time reinstall described in the v0.4.2 notes; updating from v0.4.2 is a normal in-place update. - Jul 18, 2026 0.4.2# Echoes v0.4.2 — New Signing Identity ⚠️🔑 ## ⚠️ Android users: one-time reinstall required Every release up to v0.4.1 was signed with a development certificate. Starting with v0.4.2, Echoes is signed with a **dedicated release key** (`CN=Echoes`) — a stable, properly managed publishing identity. Android does not allow an app to update in place when its signing certificate changes, so **upgrading from v0.4.1 or older requires a
More…
one-time uninstall + reinstall**: 1. **Before uninstalling**: sync your notes to your relays (or use Settings → export) — uninstalling deletes local-only data 2. Uninstall Echoes 3. Install v0.4.2 4. Sign in again: your synced notes come back from your relays This will never be required again — the new identity is permanent. New certificate fingerprint (SHA-256): ``` 24e792daeba766d1688ee9ba9163d6d49c040373a8f76e96aac3b1e5eb45a1a3 ``` ## 🐛 Fixes - Sync cycles are now serialized: the periodic timer, the connection-restored trigger and pull-to-refresh could previously overlap, occasionally double-uploading attachments and racing each other's sync bookmarks - README now describes sync behavior precisely (explicit per-note opt-in, then automatic for opted-in notes; merges are last-write-wins) Includes everything from v0.4.1 (share-sheet freeze/crash fix) and v0.4.0 (shared notes). - Jul 18, 2026 0.4.1# Echoes v0.4.1 — Share Sheet Fix 🩹 Fixes a serious regression in v0.4.0's share sheet: recipient search and identifier parsing could stop responding while typing, eventually freezing the app until Android killed it. ## 🐛 What was wrong - The contact list powering the autocomplete was being torn down and re-fetched from relays on virtually every keystroke, so suggestions
More…
never had a chance to appear - Profile/contact signature verification (introduced in v0.4.0's hardening pass) ran on the UI thread — with a whole follow list's worth of profiles to verify, that added up to seconds of frozen interface, re-triggered while typing ## ✅ What changed - The contact list is now fetched **once** when the share sheet opens and kept for its whole lifetime — suggestions are ready by the first keystroke - Signature verification now runs on a **background isolate**: same security guarantees (verified against live relay data — byte-for-byte identical verdicts), zero impact on the UI thread All v0.4.0 features and security protections are unchanged. - Jul 17, 2026 0.3.0# Echoes v0.3.0 — Desktop Support, Sync Fix & Security Hardening 🖥️🔒 A big one: Echoes now runs on **Windows and Linux**, alongside a relay-sync bug fix and a round of security hardening. ## 🖥️ Desktop support (Windows & Linux) - Same Dart codebase, no separate fork — notes, checklists, diary, images and encryption all work exactly as on mobile - **Amber sign-in** and **voice notes** are gated to Android/iOS: neither
More…
has a native implementation on desktop (Amber is an Android-only signer app; the voice-note waveform library has no Linux/Windows backend). A voice note synced in from another device still shows up, just without playback, instead of being hidden or erroring - Responsive layouts: note lists and the editor cap their width and center on wide windows instead of stretching edge-to-edge; the notes grid scales its column count with the window size - **Flatpak packaging** (`org.echoes.echoes`) for easy Linux distribution — manifest, `.desktop` file and AppStream metadata included in `flatpak/` ## 🐛 Sync fix Found and fixed a real bug: fetching notes from relays could resolve as soon as the *first* configured relay finished, silently discarding whatever slower relays (e.g. a self-hosted one) were still sending — and worse, the sync bookmark would still advance past whatever didn't make it in time, permanently skipping those notes on every future sync. - Fetches now wait for *every* configured relay to finish (or a timeout) before the sync bookmark is allowed to move forward - Added a **"Force full resync"** action in Settings → Manage relays, next to "Republish all synced notes" — rewinds the bookmark and re-pulls everything, for the rare case syncing gets stuck ## 🔒 Security hardening - Fetched events are now verified (id recomputed, signature checked) before being trusted — closes a gap where a malicious relay could hand back genuine, decryptable content under an id of its own choosing, which would later target the wrong event for deletion - Oversized event content is rejected before any decryption work runs on it (cheap protection against a relay sending junk) - Android: the recents/app-switcher thumbnail is now blanked (API 31+), so minimizing the app doesn't leave decrypted note content visible to anyone who opens the task switcher — deliberate screenshots still work fine - Dropped `relay.nostr.band` from onboarding's suggested relays: as a search-indexing relay, it turns every fetch into a "this account is active right now" signal — and separately, it's proven unreliable ## 🌍 Localization All new strings translated across all 27 supported languages. ## 📦 Downloads | File | Architecture | |------|--------------| | `app-arm64-v8a-release.apk` | Modern 64-bit devices (most phones) | | `app-armeabi-v7a-release.apk` | Older 32-bit devices | Desktop builds aren't attached here yet — build from source with `flutter build windows` / `flutter build linux`, or package the Linux build as a Flatpak using the manifest in `flatpak/`. - Jul 15, 2026 0.2.0# Echoes v0.2.0 A big one — new ways to organize and personalize your notes, a much nicer voice note experience, and several real data-integrity fixes found through actual daily use. ## ✨ New - **Per-note colors** — pick a background for any note from seven pastel options (post-it yellow, red, purple, blue, green, orange, white). Text color is never guessed: it's chosen by comparing WCAG contrast ratios against the actual background, so it stays readable in both light and dark app themes. Picking a color triggers a circular reveal animation that sweeps across the whole screen — title bar included. - **Voice notes, reworked** — recordings are now inline and positionable in the note body, just like images: write a line, drop in a 25-minute recording, keep writing below it. The recorder panel slides in/out, has a proper red record button, keeps the screen awake while recording, and lets you set a custom timestamp on any recording (long-press it). - **Note search** — a search icon in the Home app bar filters the current tab (Notes or Diary) by title, body, or checklist item text. - **Checklist quality-of-life** — hide/show completed items, clear all completed items in one tap, and a live "N of M done" counter. Checklists now always open straight into editing — there's nothing to "read" in a working list.
More…
- **Contextual formatting toolbar** — bold/italic/heading/list/link now appear only when you actually select text, freeing up the space above the body for the voice recorder instead of a permanently-docked ribbon. - **Autosave** — edits are saved locally a moment after you stop typing, as a safety net against the back button or the app closing mid-edit. - **List/grid toggle moved to Home**, next to search, instead of buried in Settings. - The note's own title now lives in the app bar — editable in place, no more redundant "Edit note" label with the real title further down. - Smaller downloads: release APKs are now split per architecture (arm64/armeabi-v7a) alongside the universal one. ## Fixed - **Attachments silently failing to reach relays**: Primal's Blossom host and nostr.build's NIP-96 host both turned out to actively reject encrypted uploads outright (verified by direct probing) — every image/voice note sent through them was doomed from the start. Swapped the built-in defaults to hosts confirmed to store opaque encrypted blobs correctly. - **A real data-loss race**: a background sync cycle uploading an attachment (and deleting the local plaintext) could have its result overwritten by a stale in-memory copy from an open editor's autosave — permanently losing the decryption key while the plaintext was already gone. Fixed at the storage layer (uploaded state can no longer regress to pending), with the in-memory note list and any open editor now kept in sync with what actually lands on disk. - Voice notes always playing back the *first* recording when a note had more than one — missing widget identity (`Key`) caused Flutter to reuse the wrong player state. - New recordings were stored in a cache directory the OS is allowed to purge at any time — losing not-yet-synced voice notes for good. They now live in persistent app storage. - Saving a note (✓) now returns you to the note itself instead of kicking you back to the list. - Jul 12, 2026 0.1.0# Echoes v0.1 — Initial Release 🎉 Echoes is here: an **offline-first, end-to-end encrypted notes app** that syncs privately over the [Nostr](https://nostr.com) protocol, on your own terms. Every note, checklist, image, and voice memo is saved locally first and stays fully usable with no connection at all. Syncing is a separate, explicit action — never automatic, never required — and everything that leaves the device is encrypted before it goes. ## ✨ Highlights - 📝 **Notes, checklists & diary entries** — plain notes, checklists, and a journal-style diary mode (date-tagged, freely backdated) all in one app. - 🔒 **Private by design** — note content is NIP-44 self-encrypted before it ever reaches a relay; images and voice notes are AES-256-GCM encrypted client-side before upload. Relays and file hosts only ever see ciphertext.
More…
- 📡 **Sync on your terms** — per-note or bulk publishing to any Nostr relay you choose, including a self-hosted one over `ws://` on your local network or [Tailscale](https://tailscale.com). - 🎙️ **Rich attachments** — inline images with a lightweight markdown formatting toolbar (bold/italic/heading/list/link), and Telegram-style voice messages with waveform playback. - 🔑 **Flexible sign-in** — import a private key directly, or delegate signing to [Amber](https://github.com/greenart7c3/Amber) (NIP-55) so your key never touches the app. - 🗝️ **Optional at-rest encryption** — password-protect your local note database (PBKDF2 + AES-256-GCM). - 💾 **Backups that make sense** — encrypted JSON export/import, plus a one-tap "republish all" to backfill a newly added relay (e.g. your own backup node). - 🌍 **26 languages**, light/dark themes, and a choice of list or masonry grid layout. ## 📦 Getting started ```bash flutter pub get flutter gen-l10n flutter run ``` See the [README](README.md) for the full feature list, architecture notes, and development instructions. ## 📄 License Released under the [GNU General Public License v3.0](LICENSE). --- This is the first tagged release — feedback and bug reports are welcome via Issues.