Skip to content

v0.10.6

Latest

Choose a tag to compare

@github-actions github-actions released this 23 Jun 07:49

A sync-and-reliability release. The cross-machine sync path got re-architected, the database schema is now forward-compatible with newer builds, and a batch of cross-host sync-storm fixes landed during soak.

Highlights

  • Sync re-architecture — cross-machine sync is now notify-driven: a daemon pushes a wake to its peers when something actually changes, instead of leaning on a fixed timer to go looking for work. The old fixed 60-second sync poll is gone (legacy sync_interval config keys are now ignored); a periodic check still runs as a safety net for missed notifications. Idle daemons go quiet (no more steady drip of heartbeat commits on the a-sync branch), and busy clusters stop drowning in sync chatter. Messages now write to a new messages-v2/ path.
  • Schema forward-compatibility — a v0.10.6 binary can open and operate on a database created by a newer-schema build without the one-way migration that used to brick the older binary. This kills the footgun where running two binaries against one shared worktree DB could leave the v0.10.6 binary unable to reopen it. DB-open compatibility only — no behavior change.
  • Cross-host sync-storm fixes — a duplicate message_id in relayed history no longer stalls inbound sync (message.create apply is idempotent now), and the daemon backstop only nudges locally-resident recipients, so a host stops waking its local sessions every 15 minutes for other hosts' mail and stops accumulating spool envelopes without bound.
  • Safer sync exposure — the a-sync exposure guard gates on repository visibility: the daemon probes origin anonymously and refuses to push message history to a publicly readable repo unless you explicitly override it.
  • Read-state unification — read truth is unified on a single source of truth, with a one-time backfill that clears historically-stuck "phantom unread."
  • Quality-of-life — inbox defaults to newest-first (chronological is opt-in via --chronological / --oldest); thrum send, reply, and message edit take --stdin / --body-file so bodies with backticks or $(...) arrive verbatim; thrum team gained --daemon / --host filters plus local and daemons subviews; and the permission-reminder ladder stops nagging once the approval modal has cleared.

Upgrade notes

  • Upgrade all peers in one window (mixed-cluster). A v0.10.5 peer can't read messages written by an upgraded v0.10.6 peer — v0.10.6 writes only to the new messages-v2/ path. Upgrade every peer in the mesh together rather than piecemeal.
  • The read-state migration is one-way. Back up your .thrum/ directory before upgrading if you might need to roll back.
  • One-time spool cleanup. Spool envelopes that accumulated before the backstop fix aren't removed automatically — you can safely delete non-resident directories under .thrum/spool/.
  • Public-repo sync. If you intentionally sync message history over a publicly readable repo, set daemon.sync.public_exposure_override to the exact remote; otherwise the daemon refuses the push.

Install

curl -fsSL https://raw.githubusercontent.com/leonletto/thrum/main/scripts/install.sh | sh
thrum daemon restart

Or with Homebrew:

# On Homebrew 6.0+ you may first need: brew trust leonletto/tap
brew install leonletto/tap/thrum

Full change list: CHANGELOG.md. More detail and migration notes: What's New.