Skip to content

Releases: useekko/ekko-core

Ekko 0.8.0 — invite links

Choose a tag to compare

@github-actions github-actions released this 19 Jul 03:10
0a5b1f4

First contact is now a link instead of a wall of base64 — plus automatic backups, a WhatsApp LID fix, and bubbles that never flash ciphertext.

Invite links

  • Your invite is a useekko.app/i/# link now — copy it from the popup's Identity tab or the in-page invite pitch. A claimed @handle makes a short link; an identity without one carries its whole public key in the link's fragment, which the browser never sends to any server.
  • With Ekko installed, opening a link stages the invite behind the usual show-key-then-tap add — a link never auto-adds a contact, and the key is previewed by its security code first. Without Ekko, the link lands on a page that explains and routes to install, and the invite survives the install gap.
  • On Instagram, whose composer caps message length, a too-long key link degrades to the plain pitch instead of pasting broken.
  • Hardened after the first cut (#8): a staged invite survives offline popup opens and messenger-mangled links, and links mint in their final /i/ form.

Backup, accounts, onboarding

  • Backups are automatic: the first backup (or a restore) keeps the derived key inside the encrypted vault, and every change re-seals and uploads a current blob. The passphrase still never leaves your device and remains the only thing that opens the blob; deleting the backup forgets the key too.
  • Sessions travel inside the backup (~250 B each, capped at 4 per peer), so a restore no longer orphans readable history.
  • Restore enters the 6-word backup and 24-word recovery phrases one box per word (paste spreads across boxes), validates whole phrases on submit, and offers "wrong account? sign out and pick another". Starting fresh also wipes an unopenable backup.
  • Connected socials are a read-only mirror of your account — manage them on the account page once, not per install.

Bubbles

  • Re-mounts and sends never flash raw ciphertext: a pre-paint cover pass lands cached plaintext (or the cover) before the browser paints.
  • The lock keeps its slot across the reveal toggle; revealed ciphertext is a quiet mono chip.
  • Ekko content takes the platform text's place and native chrome (Telegram's floated timestamp/ticks) stays last, so bubbles lay out like native messages.
  • A message sealed under a secure channel you no longer hold says so, instead of "waiting" forever.

Platforms

  • WhatsApp: peer phones resolve through the contact store in the LID era — records that carry no phone anywhere no longer break identification or dark existing bindings.
  • Telegram: the Ekko bubble preserves in-bubble timestamps/ticks and caches the stripped token that raw textContent used to poison.

Staying current

  • Installs without store auto-update (the GitHub zip, unpacked dev builds, the Safari app) get a quiet "Ekko X.Y.Z is out" notice on the popup's Home tab — one anonymous, day-cached GET against this releases list.
  • The Contacts tab shows an honest freshness stamp: when contacts last synced, and "contacts as of …" when a sync fails.

Repo

  • The release pipeline gains a Safari lane: a Mac runner signs (Developer ID, hardened runtime), notarizes and staples a drag-to-install .dmg and attaches it here. It skips quietly until the Apple signing secrets are configured, so this release ships as the zips below.

Install: unzip, then chrome://extensions → Developer mode → Load unpacked → pick the unzipped folder. The Firefox zip is experimental.

Contributors: @vasilevklart

Nightly (2026-07-19)

Nightly (2026-07-19) Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 17 Jul 20:03
0a5b1f4

Rolling build of main @ 0a5b1f4 (2026-07-19).

Unzip, then chrome://extensions -> Developer mode -> Load unpacked -> pick the unzipped folder. The Firefox zip is experimental.

  • ekko-nightly-chromium.zip sha256 13715332ad1dbf8306cf725ff5b76620d7cdfbaeeb48a4b2e18512558ee03bb1
  • ekko-nightly-firefox.zip sha256 f0f2f553975221928a4e8d4493fb053ec5a25066091af8a2d371739490ff5714

Nightlies are for testing: expect rough edges. Stable installs live in the versioned releases.

Ekko 0.7.1 — first-contact fixes

Choose a tag to compare

@github-actions github-actions released this 18 Jul 18:58

Everything below came out of one day of live cross-client testing (browser ↔ browser and browser ↔ iOS).

Secure-channel setup

  • First contact with an account connection no longer publishes a "Secure-channel setup" message into the chat: the sender checks the account mailbox first (staging its session there, or adopting the one the peer staged). The in-chat setup only remains for peers you aren't connected to on Ekko — or when offline.
  • Restoring on a fresh browser adopts the @handle the identity already owns, so the popup can't show an empty "claim a handle" prompt right after onboarding said "You are @you" (#6).

Chat auto-linking

  • Phone numbers linked on an account are canonicalized to bare digits everywhere. A "+39 333 …" typed on the phone never matched the digits an adapter reads off the page, so chats silently stayed unlinked at "Encrypted with @contact — click the Ekko button to read".
  • Auto-link now matches the platform username or a linked phone number — digits-for-digits against phone-shaped handles only, never against ids that merely contain digits. Telegram exposes a mutual contact's phone, and a phone is often the only identifier two people have linked.
  • When a chat can't be confirmed as a 1:1 but the vault already holds the session that sealed its messages, the glyph offers "Read messages from @contact". Binding unblocks reading only; sending stays paused until the chat is confirmed.

Telegram

  • An identity read landing before Telegram Web wrote its user record was cached as a permanent "no username" for the tab's life, killing auto-link until the next reload. Misses now retry after a short backoff.
  • WebK's thread id no longer falls back to a bubble's peer id, which could belong to the previously open chat. Header id, or the visible "identifying this chat" state — never a guess. Thanks @MN012 for independently running down the same root cause (#5).

Repo

  • The nightly release banks its download counts before replacing assets, so the README badge accumulates instead of resetting.

Install: unzip, then chrome://extensions → Developer mode → Load unpacked → pick the unzipped folder. The Firefox zip is experimental.

Ekko 0.7.0 — open-source alpha

Choose a tag to compare

@vasilevklart vasilevklart released this 17 Jul 19:58

The first public release of the Ekko browser extension. Post-quantum encrypted messages inside Instagram, WhatsApp Web, Telegram Web, and Messenger — sealed on your device, unreadable to the platform.

Install (any Chromium browser)

  1. Download ekko-0.7.0-chromium.zip below and unzip it.
  2. Open chrome://extensions, turn on Developer mode, click Load unpacked, pick the unzipped folder.
  3. The same zip installs on Edge, Brave, Opera, and Arc. (A Chrome Web Store listing is in review right now — this stops being necessary soon.)

What's in 0.7.0

  • Platform ownership verification: link a handle, prove you own it through a one-time code to the verification bot, and discovery only ever trusts verified mappings.
  • Stay unlocked on this device (opt-in): no more passphrase wall on every browser start; the trade is stated plainly where you turn it on.
  • In-chat invites: chats with someone not on Ekko offer a copy-paste invite instead of a dead end.
  • Per-contact linked apps: edit which platform handles belong to a contact, so chat recognition works for off-grid contacts too.
  • Self-hosting is real: point the extension at your own directory under Settings → Advanced (the server is in this repo, AGPL, zero dependencies).
  • Light-theme popup and onboarding, real platform marks, and a long list of send-reliability fixes for WhatsApp and Messenger.

Verify what you install

sha256  f98f940475436d8142a0db4cbfaa1af057cf74329bfca65cc7c10f7eb09dbe96  ekko-0.7.0-chromium.zip

The zip is npm run package over this tree — build it yourself and compare, or read every line first. That is the point of all this.

Honest alpha notes

Messengers redeploy their DOMs without asking us; an adapter can break overnight and the glyph will say so visibly rather than guess. The rolling nightly prerelease carries the newest fixes. Bugs and confusion reports are genuinely welcome — Issues, Discussions, or the Discord.