-
Morphit v1.12.21
StableAll checks were successfulmorphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 21smorphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 47smorphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 38smorphit-ci / Integration tests (real Postgres 16) (push) Successful in 38smorphit-ci / ansible-lint (playbook quality gate) (push) Successful in 15smorphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 27m7smorphit-release / Build + publish release tarball (push) Successful in 36m12sreleased this
2026-08-27 06:33:15 +00:00 | 0 commits to main since this releaseMorphit v1.12.21
Theme: a faster, calmer, self-tidying upgrade — and a status label that tells the truth.
Improved
Upgrading no longer downloads the same release twice. After an upgrade, the box re-seeds the release to IPFS so it becomes an origin host. That seeding step used to re-fetch the ~13 MB release tarball over the network — the very tarball the upgrade had just downloaded seconds earlier — which was painfully slow on a Tor-only node. The upgrade now hands the seed the tarball it already has (a local copy, no second download), and cleans up the download scratch afterward so nothing is left on disk.
A braille spinner now runs during any slow step. The seed's
ipfs addand DHT announce, and the stager's download, previously printed a line and then sat silent for minutes with no sign of life. They now show an animated spinner with a message whenever the terminal is interactive, so an operator is never left wondering whether the process hung. (Piped or logged runs stay clean — the spinner only shows on a real terminal.)Leftover processes from the previous install are stopped automatically. When a process was still running with its working directory inside the old install (now the
.bakbackup), the upgrade used to only print a warning and leave it running stale code alongside the new services. It now stops those superseded processes automatically — a graceful signal first, then a forced stop for any straggler — touching only processes rooted in the backup directory.The install summary now checks the IPNS keep-alive timer. The health roll-up already checked the hourly IPFS pin timer; it now also checks
morphit-ipns-rebroadcast.timer, the 4-hourly job that re-publishes the signed IPNS record to the DHT soipns://<name>stays resolvable (DHT records expire in ~48h). A box that seeds content but silently isn't keeping its name alive now gets surfaced.Fixed
An RPC endpoint no longer reads as "cooling down" one moment and "unreachable" the next. A failing hidden node showed a gray "cooling down" label from the passive health snapshot, then flipped to a red "unreachable" from the live probe — the same node described two contradictory ways. The status now shows the actual failure reason ("timed out", "connection refused", …) consistently, and treats cooldown as the internal backoff detail it is. A node that isn't answering inside its probe window (12s for Tor, 20s for I2P) now reads coherently as what it is, pointing the operator at the real problem instead of a vague one.
Notes
- No database migration in this release.
- Everything from v1.12.20 and earlier is included.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Morphit v1.12.20
StableAll checks were successfulmorphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 19smorphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 45smorphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 39smorphit-ci / Integration tests (real Postgres 16) (push) Successful in 40smorphit-ci / ansible-lint (playbook quality gate) (push) Successful in 15smorphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 26m26smorphit-release / Build + publish release tarball (push) Successful in 34m30sreleased this
2026-08-26 22:52:56 +00:00 | 1 commits to main since this releaseMorphit v1.12.20
Theme: two fixes for things that silently didn't work.
Fixed
Editing your instance title (or fee account) now actually takes effect on an Ansible install. On a default install,
/etc/morphit/indexer.envwas sourced aftermorphit.config.envand carried its own copies of the branding keys (MORPHIT_INSTANCE_NAME,_TAGLINE,_CONTACT_URL) and the fee recipient — so a change made withmorphit-ops editwas silently overridden by the install-time copy, and the instance kept self-reporting its old name to the federation directory. Those operator-editable keys now live only inmorphit.config.env(the single source of truth the edit command writes), and the fee recipient moved there too. A guard keeps them from ever creeping back intoindexer.env.Existing Ansible installs: re-converge the playbook to re-render
/etc/morphit/indexer.envwithout the stale branding, or remove those keys from it by hand and restart the indexer. Fresh installs and ops-cli installs are unaffected.Firefox no longer paints saved-login fields olive-yellow. The CSS that suppresses the browser autofill tint had
-webkit-and-moz-autofill selectors combined in one list; because a CSS selector list is all-or-nothing, each browser rejected the other's prefix and dropped the whole rule — so the override worked in neither. It's now split into one self-contained rule per engine, and the field keeps the app's dark surface in Chrome and Firefox alike.Notes
- No database migration in this release.
- Everything from v1.12.19 and earlier is included.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Morphit v1.12.19
StableAll checks were successfulmorphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 19smorphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 47smorphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 40smorphit-ci / Integration tests (real Postgres 16) (push) Successful in 39smorphit-ci / ansible-lint (playbook quality gate) (push) Successful in 15smorphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 26m15smorphit-release / Build + publish release tarball (push) Successful in 35m26sreleased this
2026-08-26 21:19:05 +00:00 | 2 commits to main since this releaseMorphit v1.12.19
Theme: renaming your instance is now a one-step, in-menu action.
Changed
morphit-ops editnow offers to publish a title change to the chain, right there. Previously the "re-publish to the federation" reminder only fired when you changed your origin or operator tag — a change to your instance title (display name) triggered nothing at all, so it was easy to edit the title, restart, and never realize the on-chain record still said the old thing. Now a title change is treated like any other on-chain-relevant edit: the menu tells you it needs publishing and asks to broadcast it for you on the spot (using the same env and key the edit just read — no commands to remember, no env-sourcing). Decline, and it names the command for later.Fixed
Clearer guidance when
morphit-ops registeris missing its environment. On a default install the config and Active key live in a root-owned/opt/morphit, so the old "runset -a; . ./morphit.env" hint failed with a permission error and sent operators in circles. The message now shows the working one-shot root form (sudo bash -c 'set -a; . /opt/morphit/… ; morphit-ops register') and keeps the plain form for operators running from their own checkout.Notes
- No database migration in this release.
- Everything from v1.12.18 and earlier is included — the optional operator names on
/v1/rpc-endpoints(latency-sorted), the stats-card false-"unreachable" fix, and the live on-chain hidden-RPC directory. - Reminder for renaming an instance: the federation directory shows each instance's self-reported name, so after changing your title, restart your indexer so it serves the new name — other instances refresh it on their next probe.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Morphit v1.12.18
StableAll checks were successfulmorphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 21smorphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 46smorphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 38smorphit-ci / Integration tests (real Postgres 16) (push) Successful in 41smorphit-ci / ansible-lint (playbook quality gate) (push) Successful in 15smorphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 26m2smorphit-release / Build + publish release tarball (push) Successful in 35m1sreleased this
2026-08-26 20:03:17 +00:00 | 3 commits to main since this releaseMorphit v1.12.18
Theme: name your hidden-RPC nodes, and stop the stats card crying wolf.
Added
Optional operator names for hidden-RPC nodes. A node pinned to the on-chain directory (
morphit_rpc_v1) can now carry an optional handle — a hostname likeoldpc, or a Blurt@handle— so a misbehaving node can be identified and its operator reached. The name is opt-in (omit it and nothing lands on the chain), cosmetic, and never used to route or trust a node. Names appear on the public/v1/rpc-endpointsJSON, and — like adding or removing a node — a name change propagates to every instance within about a minute, no release required./v1/rpc-endpointsis now sorted by latency. The endpoint list (clearnet and hidden together) is returned fastest-first, with unmeasured nodes last — matching the stats page's ordering.Fixed
The stats page no longer flags a healthy node as "unreachable" on a single blip. The card shows the smoothed pool health, then fires one fresh probe and repaints with it — so a node on flaky WiFi or a jittery Tor/I2P circuit could miss that one ping and flash red while being up the vast majority of the time. A lone transient miss on a node the smoothed snapshot still considers healthy now stays up with its last-known latency. A genuine outage still shows red — the smoothed health drops and the failures climb.
Notes
- Database migration in this release: an additive, idempotent column on
rpc_directoryfor the optional node names (safe on a running database; nothing to do by hand). - Everything from v1.12.17 and earlier (the live on-chain hidden-RPC directory on the stats page, the attack-resilience edge hardening, and the incident runbook) is included.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Database migration in this release: an additive, idempotent column on
-
Morphit v1.12.17
StableAll checks were successfulmorphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 20smorphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 48smorphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 45smorphit-ci / Integration tests (real Postgres 16) (push) Successful in 39smorphit-ci / ansible-lint (playbook quality gate) (push) Successful in 15smorphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 25m33smorphit-release / Build + publish release tarball (push) Successful in 33m56sreleased this
2026-08-24 22:33:59 +00:00 | 4 commits to main since this releaseMorphit v1.12.17
Theme: the hidden-RPC directory is now live on the stats page — pin a node, everyone sees it, no release required.
Changed
The stats page's RPC list now reflects the on-chain directory, network-wide, automatically. Previously the hidden-service (Tor/I2P) nodes shown on the stats card came from a value baked into each indexer at startup, so a node pinned to the chain (
morphit_rpc_v1) never appeared without a rebuild. Now every indexer serves its RPC list as its configured seed plus the live on-chainrpc_directory, re-derived per request (cached ~60s). The effect:- Pin a hidden node on-chain → it appears on every instance's stats page within the indexer's normal indexing lag, on the user's next visit. No per-operator action, no Morphit release.
- Remove one → it drops off (the directory is latest-wins).
- Clearnet nodes are unchanged (still hardcoded), still mixed in and sorted by latency.
- Privacy is preserved: a tor-only instance still never probes clearnet nodes; hidden directory nodes are reached over Tor/I2P as before.
This is the one-time wiring change. After this release, adding, updating, or removing hidden-RPC nodes is release-free forever.
Fixed / Hardened
- CI can no longer be tripped by a stray
vendor/folder. The offline-appliance build output (vendor/) is now git-ignored (root-anchored, so the realops/ansible/roles/vendoris untouched), and the source-scan smoke skips broken symlinks instead of crashing on them.
Notes
- No database migration in this release.
- Everything from v1.12.16 and earlier (the attack-resilience edge hardening, the incident runbook, the security-audit set, the CI supply-chain gate) is included.
Downloads
-
Source code (ZIP)
1 download
-
Source code (TAR.GZ)
0 downloads
-
Morphit v1.12.16
StableAll checks were successfulmorphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 21smorphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 46smorphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 38smorphit-ci / Integration tests (real Postgres 16) (push) Successful in 39smorphit-ci / ansible-lint (playbook quality gate) (push) Successful in 15smorphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 25m6smorphit-release / Build + publish release tarball (push) Successful in 33m15sreleased this
2026-08-24 00:23:19 +00:00 | 6 commits to main since this releaseMorphit v1.12.16
Theme: attack-resilience hardening — tighter edge limits, faster slow-drip shedding, and a one-page incident runbook.
Hardened
Per-IP concurrent-connection cap at the edge. Every public vhost (relay, indexer, web) now caps simultaneous connections per client IP (
limit_conn), so a single host can't exhaust connection slots even while staying under the request-rate limits. The cap is set generously so shared IPs (carrier-grade NAT, Tor exits) aren't affected.Slow-drip (slowloris) timeouts on all vhosts. The indexer and web vhosts now apply the same tight
client_body/client_header/sendtimeouts the relay already used, instead of falling back to nginx's longer defaults — slow-header/slow-body connections are dropped quickly.Added
Operator incident runbook (
docs/INCIDENT-RUNBOOK.md). A single-page, top-to-bottom playbook for responding to an active attack, with exact reversible commands: halt signups instantly via the runtime kill switch (no restart), watch the balance/ceiling and price-disagreement alerts, ban abusive IPs/ASNs at the edge, and disclose privately. Consolidates controls that already existed into one sheet you can act on in seconds.Changed
FAQ wording. The "What is Morphit?" answer now describes Morphit as a decentralised/distributed bulletin board service (DBBS) rather than a plain bulletin board service (BBS), across all supported locales.
Notes
- No database migration in this release.
- The edge-config changes ship in
ops/nginx/*.conf; apply them on the host withsudo nginx -t && sudo systemctl reload nginx. - Everything from v1.12.15 and earlier (the federation brand↔relay display fix, the relay/indexer security hardening, the block-explorer op labels, and the CI supply-chain gate) is included.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Morphit v1.12.15
StableAll checks were successfulmorphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 24smorphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 49smorphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 40smorphit-ci / Integration tests (real Postgres 16) (push) Successful in 41smorphit-ci / ansible-lint (playbook quality gate) (push) Successful in 17smorphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 25m0smorphit-release / Build + publish release tarball (push) Successful in 32m3sreleased this
2026-08-21 20:48:12 +00:00 | 8 commits to main since this releaseMorphit v1.12.15
Theme: instances that share a brand — a public identity account and a separate relay account — now display correctly across the federation.
Fixed
A federated instance is no longer flagged as a spoof for using a separate relay account. The federation directory verifies that the account a peer advertises as its relay matches the account that registered its origin on-chain — a guard against one instance claiming another's identity. That guard required the two to be the same account, which flagged a legitimate and secure setup: registering under a public brand account (which holds the reserved brand tag) while doing operational signing from a separate relay account. The probe now accepts this pairing when both accounts are reserved brand names — reserved names can only ever be registered by their rightful owner, so two reserved accounts are provably controlled by the same operator. This does not weaken the guard: reserved names cannot be registered by anyone else in the first place, and an instance advertising a relay account that is not reserved and does not match its operator is still flagged. No on-chain re-registration is required.
A signup invite can no longer be used twice by two simultaneous requests. A single-use invite is verified up front but only marked spent once the account actually lands on-chain, so a failed broadcast doesn't burn a legitimate user's invite. Under a precisely-timed pair of concurrent requests, both could pass verification before either marked the invite spent — creating two accounts from one invite, and since each account creation spends real BLURT from the relay wallet, draining more than intended. The invite is now claimed atomically at the moment of broadcast: a second concurrent request presenting the same invite is rejected, and the claim is released on a failed broadcast so retries still work.
Hardened
The relay's decrypted key can no longer be paged to disk. The relay systemd unit now disables swap for the process (core dumps were already disabled), so the active-key material held in memory during signing cannot be written to disk by the kernel.
A shared-relay-account misconfiguration is now detected. If two instances were accidentally pointed at the same relay account, each would credit the same signup's welcome bonus from its own independent database. The federation probe now detects when another instance advertises this instance's relay account and alerts the operator, converting a documented footgun into an enforced check.
A supply-chain gate now guards dependencies. CI fails on any new high- or critical-severity dependency advisory that isn't in a triaged baseline, so a newly-vulnerable dependency can't enter the tree unnoticed. This release also completed a full security review of the relay, indexer, web/edge, and dependency surfaces.
Changed
The block explorer labels three more op types specifically instead of the generic "Other app": blockchain snapshots ("Blockchain snapshot"), the hidden RPC node directory ("Hidden RPC nodes"), and notifications ("Notification"). Translated across all supported locales.
Notes
- No database migration in this release.
- Everything from v1.12.14 and earlier (the relay-health fix, auto-detect hardening, instances-page copy) is included.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Morphit v1.12.14
StableAll checks were successfulmorphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 49smorphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 39smorphit-ci / Integration tests (real Postgres 16) (push) Successful in 41smorphit-ci / ansible-lint (playbook quality gate) (push) Successful in 16smorphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 25m2smorphit-release / Build + publish release tarball (push) Successful in 35m19sreleased this
2026-08-20 21:53:37 +00:00 | 9 commits to main since this releaseMorphit v1.12.14
Theme:
/v1/healthreports the relay's true state — the fix, verified live. Plus the auto-detect hardening around it and a small instances-page copy change.Fixed
A healthy relay no longer reads as
up:falseon/v1/health. On a node whose indexer runs under a systemd sandbox,os.networkInterfaces()— called while building the relay-probe candidate list — threwEAFNOSUPPORT("Unknown system error 97") because the unit'sRestrictAddressFamiliesdid not includeAF_NETLINK, the address family libuv needs to enumerate interfaces. That exception rejected the entire relay probe before any network request was made, so the health snapshot kept its defaultfalseand never recovered — a running, reachable relay reported as down. Two changes fix it: the probe's interface enumeration is now wrapped so it can never throw out of the probe (it falls back to the configured URL and loopback), and the indexer service unit now grantsAF_NETLINKso interface enumeration works and the relay auto-detection functions fully. Verified on a live node: the endpoint flips fromup:falsetoup:true.Changed
- The relay-reachability probe auto-discovers the relay across every local address it could bind — loopback, each host interface (including the docker bridge a container-fronted relay uses), and the gateway — with no configuration required; a configured
MORPHIT_INDEXER_RELAY_HEALTH_URLis still honoured. The local probe usesnode:httpdirectly. - Instances page: the bookmarking tip now reads "bookmark a few of these instances — and their Tor, I2P, Lokinet or ENS addresses" and notes that because the orderbook lives on the public blockchain, the same orders and trades are reachable in many other places if any one site is inaccessible.
Removed
- Two internal coordination documents (
HIDDEN-RPC-Q2-RESPONSE.md,HIDDEN-RPC-SNAPSHOT-INSTRUCTIONS.md) removed from the repository.
Notes
- No database migration in this release.
- Operators upgrading from a build that showed
relay:up:falsewhilemorphit-ops healthshowed the relay up: this release is that fix. The unit change takes effect once the updatedmorphit-indexer.serviceis installed by the upgrade. - Everything from v1.12.13 and earlier is included.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- The relay-reachability probe auto-discovers the relay across every local address it could bind — loopback, each host interface (including the docker bridge a container-fronted relay uses), and the gateway — with no configuration required; a configured
-
Morphit v1.12.13
StableAll checks were successfulmorphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 50smorphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 41smorphit-ci / Integration tests (real Postgres 16) (push) Successful in 41smorphit-ci / ansible-lint (playbook quality gate) (push) Successful in 16smorphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 31m44smorphit-release / Build + publish release tarball (push) Successful in 37m53sreleased this
2026-08-20 18:23:01 +00:00 | 10 commits to main since this releaseMorphit v1.12.13
Theme: the real fix for
/v1/healthreporting a healthy relay as down. The probe was being routed through the wrong network layer.Fixed
/v1/healthnow reports the relay's true up/down state on a node that uses hidden (Tor/I2P) RPC endpoints. A node configured with Tor or I2P Blurt RPC installs a global request-routing dispatcher so chain reads go over those networks. The relay-health probe used the ordinary global fetch, so its request to the local relay was sent through that same Tor/I2P routing layer — which breaks a local connection — and a perfectly healthy relay read asup:false. (This is why the earlier candidate-selection fixes didn't resolve it: the probe was finding the right address, but the request itself was being misrouted.) The probe now connects to the relay directly, bypassing the global router entirely — a local health check has no business going through the Tor/I2P layer. Verified with a dispatcher-bypass test: a request through the router fails, the same request direct succeeds.Notes
- No database migration in this release.
- Diagnosis note for operators: this only affected nodes that have hidden RPC endpoints configured (which install the global router). A clearnet-only node was unaffected. If your node showed
relay:up:falsewhilemorphit-ops healthshowed the relay up, this is the fix. - Everything from v1.12.12 and earlier is included.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Morphit v1.12.12
StableAll checks were successfulmorphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 47smorphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 39smorphit-ci / Integration tests (real Postgres 16) (push) Successful in 40smorphit-ci / ansible-lint (playbook quality gate) (push) Successful in 17smorphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 29m44smorphit-release / Build + publish release tarball (push) Successful in 35m50sreleased this
2026-08-20 05:21:25 +00:00 | 11 commits to main since this releaseMorphit v1.12.12
Theme: the relay's health shows up correctly with zero configuration. One fix, applying a principle: a node should auto-detect its own topology, not make the operator hand-configure it.
Fixed
/v1/healthnow reports the relay's real up/down state without any configuration. The relay-reachability probe only worked when the operator setMORPHIT_INDEXER_RELAY_HEALTH_URL, and even the fallback only tried loopback. But the relay doesn't always listen on loopback: behind a containerized web front (BunkerWeb/nginx), it binds the docker bridge address (e.g.172.18.0.1) so the container can reach it. With the probe URL unset — the default — a perfectly healthy relay read asup:false, disagreeing withmorphit-ops healthand a direct request. The probe now always auto-discovers the relay across every address it could bind — loopback, each host interface (which includes the docker bridge), and the default gateway — at the relay's canonical/v1/healthpath. No configuration required; a configured URL is still honoured verbatim when present, and a public URL can no longer misdirect the local probe onto:443or a reverse-proxy path.Notes
- No database migration in this release.
- This continues the direction from v1.12.11 (the warrant canary auto-detecting tor-only and its own hidden RPC): a node should discover its own topology rather than depend on the operator getting a config value exactly right. Required configuration for things a node can determine itself is a source of silent, hard-to-diagnose breakage.
- Everything from v1.12.11 (the tor-only canary routing, the operator-tag live display, the Matrix link, and the federation mismatch reclassification) is included.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
1 download