• v1.15.4 4513d839b6

    Morphit v1.15.4
    All checks were successful
    morphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 17s
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 34s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 30s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 40s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 12s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 24m31s
    morphit-release / Build + publish release tarball (push) Successful in 32m36s
    Stable

    agorise released this 2026-09-03 02:51:50 +00:00 | 40 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Morphit v1.15.4

    The one-command installer now says up front that it needs Ubuntu 24.04, instead of a fresh box getting several steps in and hitting a confusing dead-end.

    Fixed

    The installer tells you the OS requirement before it does anything. The one-command installer provisions the Ubuntu 24.04 "noble" base (or a 24.04-based derivative — Linux Mint 22, Pop!_OS 24.04, Zorin OS 17); the playbook pins its apt repos and package paths to that base and has always asserted it. But a box on an older base (e.g. Ubuntu 22.04 "jammy") only learned this when Ansible reached the check several steps in and stopped with an assertion the installer didn't recognise — so it pointed the operator at support instead of at the fix. Now the installer reads /etc/os-release first and, if the base isn't noble, stops immediately — before writing any secrets or running Ansible — with plain guidance to provision a 24.04 machine. If a run somehow still reaches the playbook's assertion (an unusual derivative, a bypassed pre-check), the failure summariser maps that assertion to the same guidance rather than the "email support" last resort.

    The wizard and docs no longer imply 22.04 is a supported one-command target. The pre-check remediation text and the run-a-node guide referenced Ubuntu 22.04 as the baseline; they now reference the actual supported base, Ubuntu 24.04 (whose stock apt PostgreSQL 16 and Ansible 2.16 clear Morphit's floors comfortably). The general system-check still recognises other Ubuntu/Debian-based systems as fine operating systems — Morphit still supports by-hand installs on them (Kicksecure, Debian, …) — it's only the one-command path that is noble-only.

    Carried forward from the unreleased v1.15.3 (see the correction note below): the BunkerWeb step calls the docker compose v2 CLI plugin directly (no dependency on a newer ansible-core), and every upgrade re-captures a node's Tor onion into its config if it went missing, so a clearnet-censored node stays reachable over Tor.

    Notes

    • v1.15.3 was never published. Its headline — "installs on a stock Ubuntu 22.04 box" — was incorrect: the one-command installer has targeted the Ubuntu 24.04 "noble" base since the beta. v1.15.4 supersedes it and corrects the installer's messaging; the genuinely useful v1.15.3 code changes (the docker compose CLI call and the onion self-heal) are included here.
    • A new os-support-parity smoke ties the installer's noble pre-check, the playbook's morphit_ubuntu_codename == "noble" assertion, and the run-a-node guide together, so this class of "the surfaces disagree about the supported OS" drift can't recur silently.
    • Everything from v1.15.2 is included. No database migration beyond v1.15.0's additive orders.lang (schema v56). Upgrade in place.
    Downloads
  • v1.15.3 4f68231fe4

    Morphit v1.15.3
    All checks were successful
    morphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 16s
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 34s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 30s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 40s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 12s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 24m35s
    morphit-release / Build + publish release tarball (push) Successful in 32m28s
    Stable

    agorise released this 2026-09-02 20:08:10 +00:00 | 41 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Morphit v1.15.3

    The fix for the failing fresh install: Morphit now installs on a stock Ubuntu 22.04 box with no Ansible or Postgres upgrade required.

    Fixed

    The BunkerWeb step no longer needs a modern Ansible. The install was failing with couldn't resolve module/action 'community.docker.docker_compose_v2' on Ubuntu 22.04's default Ansible (2.10). That module only exists in community.docker 3.x, which needs ansible-core ≥ 2.15 — so the distro-default Ansible couldn't load it. The playbook now calls the docker compose v2 CLI plugin directly (present on every box that has Docker) instead of that module. It works on Ansible 2.10 with no upgrade, and behaves the same (brings the stack up using the already-built image).

    The pre-checks now match what actually works, instead of demanding upgrades that aren't needed:

    • Ansible floor lowered to 2.10. Since the only thing that required a newer Ansible is gone, Ubuntu 22.04's stock 2.10 is fine. The check only flags genuinely ancient versions (< 2.10, where the ansible.builtin module path may not resolve).
    • PostgreSQL floor lowered to 14. Morphit's own playbook installs the distro Postgres (14 on Ubuntu 22.04), the indexer enforces no minimum, and the schema uses no 15-only features — so 14 is what Morphit actually runs on. The earlier 15 gate contradicted the playbook and would have forced an unnecessary upgrade.

    Net effect: a plain apt install ansible postgresql docker.io on Ubuntu 22.04 is now enough — the wizard stops asking the operator to upgrade tooling that already works.

    Censored nodes advertise their Tor onion automatically. The onion is generated a few seconds after Tor first starts, so on some boxes the install-time config write lost the race and left MORPHIT_INSTANCE_TOR_ADDRESS empty — the node then advertised tor: null and was unreachable over Tor, which is fatal for a node whose clearnet is blocked (e.g. in Iran). Every upgrade now re-captures the onion from /var/lib/tor/morphit/hostname into the config if it's missing, so /v1/instance advertises it and the federation can reach the node over Tor. (The operator still broadcasts it once with morphit-ops → Alt addresses so peers learn it on-chain.)

    Notes

    • Everything from v1.15.2 is included (the pre-flight/backstop/watchdog/spinner hardening, the DNS + locale + port/subnet checks, the DB-host auto-normalize, the language feature).
    • No database migration beyond v1.15.0's additive orders.lang (schema v56). Upgrade in place.
    Downloads
  • v1.15.2 9c392f8607

    Morphit v1.15.2
    All checks were successful
    morphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 18s
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 35s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 30s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 41s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 12s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 24m9s
    morphit-release / Build + publish release tarball (push) Successful in 31m45s
    Stable

    agorise released this 2026-09-02 00:59:05 +00:00 | 43 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Morphit v1.15.2

    Installer robustness + quieter output. Every failure is now diagnosable in one shot instead of a wall of raw Ansible.

    Added / Changed

    A failed install now tells you exactly what broke and how to fix it. The whole Ansible run is captured to a log, and if it fails the wizard prints a plain-English summary — the failed step, what Ansible said, and a likely fix — instead of a generic "exit code N, check the messages above." Recognised failures (Postgres unreachable, apt lock held, Docker permission, missing sudo, disk full, old ansible-core, DNS/network, port in use) come with the specific remedy. An unrecognised failure points you at the full log and support — so even a brand-new edge case is a captured, actionable artifact, not a dead end.

    Quieter, calmer install output.

    • npm's "New major version available!" and funding banners are suppressed during install/upgrade — we vendor a pinned npm, so those were noise you couldn't act on.
    • The "stopping leftover process(es)" step during an upgrade is now a single calm line ("Superseding N stale worker process(es) from the previous version…"). It only prints the detail — PIDs and a manual-kill command — in the rare case it can't stop them, which is the only case worth your attention.

    Notes

    • Builds on the v1.15.x installer hardening: the ansible-core ≥ 2.15 pre-check, the port/subnet/localhost pre-checks, and the automatic localhost127.0.0.1 database-host fix all remain.
    • No database migration beyond v1.15.0's additive orders.lang (schema v56). Upgrade in place; everything from v1.15.1 is included.

    Robustness: the installer never dead-ends now

    A full end-to-end audit of the install path closed every place a failure could still surface as a raw stack trace or a cryptic one-liner:

    • A global error backstop. Any error anywhere in the wizard — a system call, a prompt, a file write, an apt/collections step, even a bug in our own code — is now turned into a plain-English message that names the likely cause, gives the fix, points to the run log, and (only when we don't recognise it) hands you support (agorise@pm.me / @agorise:matrix.org). Node system errors (permission, port-in-use, disk-full, missing command, DNS/network) are mapped to their fixes.
    • Process-level crash handlers catch any async rejection that escapes the normal flow, so the worst case is still a clean sanitized line — never a V8 stack dump.
    • A non-interactive-terminal guard: running the wizard through a pipe or a non-interactive SSH command now fails fast with "run it in a real terminal" instead of looping forever on empty input.
    • Censored/limited networks: a blocked Ansible Galaxy fetch (a missing-collection failure) now maps to a clear "the release bundles these — just re-run" message.
    • Dependency hygiene: patched a build-time browserslist advisory (dev/build only, never in the shipped bundle).

    More pre-flight checks (catch the environment, not just the code)

    A second audit — this time of the server's real-world state, not the wizard's control flow — added up-front checks for the conditions that silently break a fresh install:

    • PostgreSQL version gate. Morphit needs PostgreSQL 15+, but Ubuntu 22.04's apt install postgresql is 14 — the same distro-too-old trap as the Ansible one. The wizard now flags it before the migrations run, with the PGDG-repo upgrade path.
    • DNS-points-here. Right after you enter your domain, the wizard resolves it and checks it points at this server — the single most common reason a self-hosted HTTPS install fails (the cert can't be issued if DNS isn't pointed/propagated). It distinguishes not-resolving-yet, behind-NAT (with port-forward guidance), and a plain mismatch, and reminds you that a cloud firewall must also allow inbound 80 + 443. Non-blocking — you can point DNS while the install runs.
    • Locale. Warns on a non-UTF-8 locale (LANG=C/POSIX on minimal images), which would otherwise make Postgres default a new database to SQL_ASCII and garble multilingual + RTL content.

    Hand-holding: a grandma can hit Enter all the way through

    A usability pass so the install is smooth for any experience level, on any topology (Tor-only or clearnet, home box or VPS):

    • Press Enter = the recommended answer, everywhere. An up-front tip says so, every yes/no question has a safe default, and the offered auto-fixes (add swap, install Docker, add the localhost hosts entry) now default to yes and say "recommended — just press Enter", so an operator who doesn't understand a question can keep pressing Enter and end up with a working node. The only things they must type are their own domain, account names, and key.
    • The braille spinner now runs during every silent step — the system checks, the on-chain account lookup, and the DNS check — so a slow network moment never looks frozen. (It degrades to a one-line label when there's no terminal to animate.)
    • Tor-only nodes skip the domain + DNS + certificate questions entirely; home boxes behind NAT get port-forwarding guidance from the DNS check; VPS boxes get the public-IP comparison. Each topology only sees the questions that apply to it.
    • A no-output watchdog on the long install run. The setup step streams Ansible's progress live, and if the run goes quiet for a few minutes (a big download, a first database migration, or issuing the HTTPS certificate) it prints a calm reassurance with the recommendation — just wait, it will continue, and a re-run is always safe. A slow step never looks like a dead hang, and the operator never has to make a decision to keep going.
    Downloads
  • v1.15.1 44d4a08a5c

    Morphit v1.15.1
    All checks were successful
    morphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 18s
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 46s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 38s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 40s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 15s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 30m11s
    morphit-release / Build + publish release tarball (push) Successful in 38m46s
    Stable

    agorise released this 2026-09-01 08:16:59 +00:00 | 44 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Morphit v1.15.1

    A fix release on top of v1.15.0: the release build is fixed, and the installer now catches an old-Ansible trap that was silently failing fresh installs. Includes all of v1.15.0 (the orderbook language feature + the v1.14.3 rollup).

    Fixed

    The release build no longer fails. v1.15.0's web bundle pulled the server-only @morphit/operator-config module (with its node:fs/node:path/node:util imports) into the browser build, which broke vite build. The web now derives its order-language codes from its own SUPPORTED_LOCALES (a smoke keeps them in lockstep with the indexer's list), so nothing Node-only reaches the browser bundle.

    Old Ansible no longer fails a fresh install with a misleading error. Ubuntu 22.04's apt install ansible installs the EOL 2.10, which can't load the modern collections the playbook needs — and the old installer misreported that as "the installer found no machine to configure (0 hosts)." Two changes address it:

    • The setup wizard's system check now verifies ansible-core ≥ 2.15 up front. If it's too old (or the legacy pre-core 2.10), it fails the check with a clear explanation and offers a one-keystroke upgrade (via pipx), instead of letting the playbook fail cryptically later.
    • Combined with v1.15.0's honest pre-flight (which already replaced the phantom "0 hosts" with the real Ansible error), an operator on old Ansible now gets told exactly what to do before anything runs.

    The bundled morphit-node-doctor.sh diagnostic was likewise updated to flag Ansible below the floor instead of marking it OK.

    Notes

    • Upgrade in place; everything from v1.15.0 is included. No database migration beyond v1.15.0's additive orders.lang (schema v56).
    • New operators on Ubuntu 22.04 should either install this version's wizard-guided setup (which will prompt to upgrade Ansible) or upgrade Ansible to core ≥ 2.15 first.
    Downloads
  • v1.15.0 4028510762

    Morphit v1.15.0
    All checks were successful
    morphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 23s
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 51s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 44s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 42s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 16s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 29m34s
    morphit-release / Build + publish release tarball (push) Successful in 38m31s
    Stable

    agorise released this 2026-09-01 05:37:53 +00:00 | 45 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Morphit v1.15.0

    Headline: the orderbook now speaks your language. Plus a rollup of installer, UX, and hardening fixes.

    Added

    Per-order language + an orderbook language filter. A first visit to a busy instance no longer means scrolling past orders in languages you don't read. You tell Morphit which languages you understand, and the orderbook shows you orders written in those — nothing is translated, it's simply filtered.

    • Tag your post's language. The order form (new and edit) has a "This post is in …" selector under "Listing expires," defaulted to your last-used post language → your primary preferred language → the language the site is set to. The choice rides along in the order's on-chain broadcast.
    • Set your preferred languages. A new "Preferred languages" card in Settings lets you pick a primary (the default for your own posts) plus any other languages you read. It's saved to your on-chain profile, so it follows you across devices.
    • Filter the orderbook. A searchable "Language" field (green removable pills, next to "Payment methods accepted") defaults to your preferred set — or, for a first-time visitor, just the language the site is in. Clear it to see every language.
    • Nothing disappears. Orders posted before this release carry no language tag, and the filter never hides an untagged order — it only ever hides orders that declared a different language. The orderbook fills in over time as new orders carry a language.

    Changed / Fixed (rollup)

    • morphit-ops menu order restored — "Upgrade to the latest version" is option 2 again (a fast-sync entry had shifted it to 3), matching the release ceremony and muscle memory.
    • Account names accept dots — the setup wizard now allows Blurt-valid names like my.relay (it had been stricter than the rest of the software).
    • No more "morphit" in name suggestions — the wizard, its fallbacks, and the docs now suggest brand-your-own names for relay/fees accounts and addresses instead of the reserved morphit namespace.
    • Single-domain nginx reality — the manual (non-BunkerWeb) install path installs one web.conf that path-routes everything on one domain; Morphit deploys cleanly on a subdomain.
    • RPC endpoints card tells the truth on refresh — a node you shut down now shows "offline at the moment" instead of a stale latency (a failed probe is retried once; only a genuine double-miss reads as down).
    • A self-healing installer — pre-flight checks for port/subnet/localhost conflicts, honest errors when Ansible can't run (instead of a misleading "0 hosts"), consented one-keystroke fixes for what's safely fixable, and a final report of everything fixed/skipped. agorise@pm.me / @agorise:matrix.org appear only as a genuine last resort.
    • fail2ban ignoreip baked into the standard hardening so an admin can't lock themselves out mid-release.

    Notes

    • No database migration is required beyond the automatic additive orders.lang column (schema v56); no breaking on-chain changes — the new order/profile fields are optional and backward-compatible.
    • Everything from v1.14.2 and earlier is included.
    Downloads
  • v1.14.2 62469acf37

    Morphit v1.14.2
    All checks were successful
    morphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 19s
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 48s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 39s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 40s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 14s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 28m57s
    morphit-release / Build + publish release tarball (push) Successful in 36m50s
    Stable

    agorise released this 2026-08-30 22:33:56 +00:00 | 47 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Morphit v1.14.2

    A bugfix + polish release. No new features, no database migration, no on-chain changes. Includes everything from v1.14.1.

    Fixed

    The morphit-ops menu no longer moves "Upgrade" out from under your muscle memory. In v1.14.0/v1.14.1 the new fast-sync entry was inserted as menu item 2, shifting "Upgrade to the latest version" to item 3 — so selecting option 2 during a release landed on fast-sync (which then refused, because the indexer was running). The order is restored to Install (1) → Upgrade (2) → Fast-sync (3), matching the release ceremony's "choose option 2" and everyone's habit.

    The setup wizard now accepts dots in relay/fees account names. Blurt account names can contain dots (e.g. my.relay), but the wizard's validation rejected them — it used a stricter rule than the rest of the software. It now matches Blurt's real account-name rules (lowercase letters, digits, dots, and dashes; each dot-separated part starting with a letter), so valid names like my.relay are accepted while malformed ones are still caught with a clear message.

    Changed

    Account and domain name suggestions no longer use "morphit". The setup wizard, its fallback examples, and the docs previously suggested names like my-morphit-relay, morphit.eth, and morphit.mydomain.org for an operator's own relay/fees accounts and addresses. Those are now neutral, brand-your-own examples — operators should name their accounts and domains after their own instance, not the reserved "morphit" namespace. (The canonical protocol accounts @morphit-fees / @morphit-relay are unchanged — those are factual references, not suggestions.)

    The manual (non-BunkerWeb) nginx instructions match the single-domain reality. The wizard's manual-nginx path used to hand operators three server blocks for a split relay/indexer/frontend subdomain layout that is no longer the design. It now installs a single web.conf that serves the frontend and reverse-proxies /relay/, /v1/, /rss/, and /mcp on one domain — which also means Morphit deploys cleanly on a subdomain (e.g. trade.yourdomain.com), verified end to end. The optional split-service configs remain for advanced operators, with neutral example hostnames instead of stale ones.

    Notes

    • Upgrade in place; everything from v1.14.1 and earlier is included.
    Downloads
  • v1.14.1 d8dcb48af8

    Morphit v1.14.1
    All checks were successful
    morphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 21s
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 46s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 37s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 39s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 15s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 28m34s
    morphit-release / Build + publish release tarball (push) Successful in 37m17s
    Stable

    agorise released this 2026-08-30 17:58:34 +00:00 | 48 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Morphit v1.14.1

    A UX + hardening follow-up to v1.14.0. No new features, no database migration, no on-chain changes.

    Changed

    Fast-sync is now the default when setting up a new node. The guided install wizard (morphit-ops install) now offers fast-sync as a default-yes step: a new operator just presses Enter to restore the newest signed federation snapshot and be live in minutes, and has to actively decline to fall back to a full replay. This is what v1.14.0's release notes described; in v1.14.0 fast-sync existed only as a separate command, so this closes that gap.

    Fixed

    The stats-page RPC endpoints card now tells the truth on refresh. Clicking the card's refresh button (or reloading the page) fires a live re-probe of every node — but a node that had just been shut down kept showing its stale last-known latency instead of going offline. The card's anti-flicker rule (which correctly ignores a single jittery Tor/I2P miss on a node that's actually up) was suppressing every fresh miss, because a failed probe always reported exactly one failure. Now a missed probe is retried once, and only a genuine double-miss is reported as a real outage — so a node you shut down shows as "offline at the moment" on the next refresh, while a merely-flaky-but-alive node still doesn't false-alarm.

    fail2ban can no longer lock out your admin machine. The standard node hardening (both the Ansible role and the manual OPERATIONS.md §34 steps) now writes an ignoreip whitelist into fail2ban's jail.local, with a fail2ban_ignoreip variable for your admin IP. This prevents the failure mode where a noisy release ceremony (repeated SSH passphrase prompts → failed auths) got the operator's own IP banned mid-release.

    Notes

    • Upgrade in place; everything from v1.14.0 and earlier is included.
    Downloads
  • v1.14.0 9d0796e0dc

    Morphit v1.14.0
    All checks were successful
    morphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 20s
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 45s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 37s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 40s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 15s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 28m2s
    morphit-release / Build + publish release tarball (push) Successful in 37m37s
    Stable

    agorise released this 2026-08-30 03:51:06 +00:00 | 49 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Morphit v1.14.0

    Theme: a brand-new node reaches a live orderbook in minutes instead of days — and while it catches up, its operator sees exactly what's happening.

    Added

    Fast-sync a fresh node from a signed, verifiable snapshot. Standing up a new instance no longer means replaying millions of blocks over (often slow or censored) RPC for days. A caught-up federation node now publishes a snapshot of its indexed state to IPFS and anchors a signed pointer to it on-chain; a fresh node fetches it, verifies it three independent ways, restores it, and only catches up the short remaining tail. Days become minutes.

    • New operator command: sudo morphit-ops fast-sync (offered as the recommended path when setting up a new node). It reads the newest snapshot pointer published by a signer you trust, downloads it (with an HTTPS mirror fallback), and proves the download against the on-chain hash — the manifest, the file, and the signed pointer must all agree — before anything is restored.
    • The trust surface is explicit and layered: you trust the publisher only for the older, settled state; the recent tail is re-verified by normal indexing, and a built-in spot-check confirms the snapshot's records genuinely match the chain before the node serves. Prefer zero trust? A full trustless replay is always one setting away.
    • Publishing side: a daily auto-publish timer keeps a fresh snapshot available, and only ever publishes from a node that is itself fully caught up and healthy.

    The orderbook now explains itself while an instance is still catching up. Instead of an empty or broken-looking orderbook on a node that hasn't finished syncing, visitors see a clear banner — how far along the sync is, and roughly when orders should be available (in UTC) — in all ten languages. The estimate is derived from the node's actual catch-up rate and shown as "estimating" until there's enough signal to be meaningful.

    Changed

    • The public censorship-resistant RPC roster carried by every node now includes the newly-online hidden-service nodes alongside the existing ones, so a fresh install reaches the whole set immediately.
    • The RPC-endpoints status card now reads "offline at the moment" rather than "unreachable" for a node that didn't answer on its last check — clearer, and less alarming for a node that's merely re-establishing.

    Notes

    • No database migration and no on-chain changes are required to upgrade.
    • Everything from v1.13.2 and earlier is included.
    Downloads
  • v1.13.2 5f6b50161e

    Morphit v1.13.2
    All checks were successful
    morphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 18s
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 46s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 38s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 40s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 15s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 27m59s
    morphit-release / Build + publish release tarball (push) Successful in 36m37s
    Stable

    agorise released this 2026-08-29 22:05:48 +00:00 | 50 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Morphit v1.13.2

    Theme: a node can never come up with a broken or missing web frontend again — online or from a USB stick with no internet at all.

    Fixed

    An incomplete frontend build can no longer take a whole node dark. If the web build ever finished without its root entry point (index.html) — every per-locale page present but the root missing — the site returned HTTP 500 on every request: nginx's fallback rewrote /index.html → /index.html in an endless loop. A real operator's node went completely dark this way while the box itself was perfectly healthy. Three independent guards now make that impossible:

    • The build guard verifies index.html is actually present before trusting a shipped frontend, and rebuilds rather than serving an incomplete one; after any fresh build it fails loudly if index.html didn't appear, so an incomplete build can never pass as success.
    • The install now stops with a clear message (and a memory hint) if the frontend is missing its entry point, instead of deploying a dark site.
    • The frontend web server now degrades to a clean error instead of an infinite redirect loop if the entry point is ever absent.

    Offline / USB installs now carry the prebuilt frontend. The offline "appliance" bundle — the one you can hand someone on a USB stick for a node with no internet — was shipping everything except the built frontend, forcing the air-gapped machine to build it on-target. That on-target build is memory-heavy, isn't byte-for-byte reproducible with the canonical release, and (as above) could fail silently. The bundle now builds the canonical frontend once and ships it, so an air-gapped node serves the exact same bytes as an online one, with no build required on the target. The bundle refuses to ship if that frontend didn't make it in.

    Notes

    • Display-and-packaging release: no database migration and no on-chain changes.
    • Operators on a node whose site is currently returning 500 or was hand-patched will have it made permanent by upgrading to this release.
    • Everything from v1.13.1 and earlier is included.
    Downloads
  • v1.13.1 c588f1c5cb

    Morphit v1.13.1
    All checks were successful
    morphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 19s
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 48s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 40s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 40s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 15s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 28m17s
    morphit-release / Build + publish release tarball (push) Successful in 36m41s
    Stable

    agorise released this 2026-08-29 04:06:29 +00:00 | 51 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Morphit v1.13.1

    Theme: the node-status display finally tells the truth about a slow or reconnecting RPC node — a healthy-but-onion-routed node no longer looks dead.

    Improved

    A reconnecting hidden node is no longer mislabelled "unreachable." In the RPC-endpoint list, a Tor or I2P transport that's momentarily down but whose same node is answering on its other transport is now shown as amber "re-establishing" instead of a red "unreachable." The reasoning is honest: if a node answers over I2P, the box is clearly up, so its quiet Tor onion is just re-publishing its descriptor (which takes a few minutes after any reconnect) — not gone. A node that's genuinely down on every transport still shows red. This is inferred purely from what the pool already measures, with no cooperation needed from the node.

    RPC latency is now colour-coded to what it actually means. Endpoint round-trip time reads green under 5 seconds, amber from 5–10 seconds, and red at 10 seconds or more. Tor and I2P legitimately take a few seconds, so onion-routed nodes running 1–5 s now read as the healthy green they are, instead of a washed-out "slow" grey — and only a genuinely sluggish node turns amber or red.

    Both changes apply consistently to the in-app RPC-endpoints card and to morphit-ops health on the server, so the browser and the CLI agree.

    Notes

    • Display-only release: no database migration, no on-chain changes, no behaviour change to how the pool selects nodes.
    • Everything from v1.13.0 and earlier is included.
    Downloads