• v1.8.2 ff54b96326

    Morphit v1.8.2
    All checks were successful
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 44s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 35s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 39s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 14s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 26m32s
    morphit-release / Build + publish release tarball (push) Successful in 27m39s
    Stable

    agorise released this 2026-07-20 02:26:26 +00:00 | 39 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Your first message to a brand-new listing no longer goes missing

    If you spotted a listing the instant it was posted and fired off a message right away, that very first message could quietly vanish — and the other person never got a notification about it. Later messages went through fine, which made it all the more confusing.

    The cause was timing. A listing and the first message about it can land in the same block, and Morphit was occasionally trying to file the message before it had filed the listing it referred to — so the message had nothing to attach to and was dropped. Morphit now always records a listing before any message that mentions it, so your first hello always lands and always rings the other person's bell.

    Settings has a new Website or Blog URL field — a spot for your personal site or blog — sitting just above your streaming link. Your profile shows it as a small globe you can click through.

    The streaming field is now simply called Streaming URL, and it happily takes any streaming home you like — YouTube, Twitch, Rumble, Blurt.media, whatever you use — not just one. Both fields accept any normal https:// link (and plain http:// too, so .onion, I2P, and Lokinet addresses work for the privacy-minded). If you paste something that isn't a real web link, Morphit tells you before you save.

    Plainer wording in the help pages

    The FAQ and glossary now say "the blockchain" and "on-chain" in more places instead of leaning on the name of the specific chain underneath. Nothing about how Morphit works changed — just the words, so newcomers have an easier time. Where a coin is genuinely the coin you're paying a listing fee in, it's still named as itself.

    A little polish when posting

    The final step of posting a listing reads more clearly now — about the small listing fee, and about the 15-minute window you get to fix a typo, or to cancel and re-list, after a listing goes up.

    Your data, your keys, your trades — all untouched throughout.

    Downloads
  • v1.8.1 6fbbfbb9fe

    Morphit v1.8.1
    All checks were successful
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 44s
    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 14s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 26m41s
    morphit-release / Build + publish release tarball (push) Successful in 27m20s
    Stable

    agorise released this 2026-07-19 19:14:11 +00:00 | 40 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    The stray text at the top of the page

    For a short while, some pages showed a line of raw developer notes stuck across the very top — something about link previews and JavaScript hydration that was never meant for human eyes. If you saw it, thank you for the double-take; it was as wrong as it looked.

    Here is what happened. There is an internal note inside the site's HTML explaining how Morphit builds link-preview cards. That note mentioned the name of a SvelteKit placeholder — and SvelteKit, doing exactly what it is designed to do, found that name inside the note and swapped in the live page's head content. Modern Svelte wraps that content in tiny hydration markers, and one of them happened to end the comment early — so the second half of the note spilled out onto the page.

    The note now describes the placeholder in plain words instead of naming it, so there is nothing left for SvelteKit to swap. And there is a new build check that fails immediately if anyone ever writes one of those placeholder names inside a comment again, so this exact mistake cannot come back.

    The "Build integrity check failed" banner during updates

    A scary red banner sometimes flashed at the bottom of the screen while an instance was being updated. It was a real safety check — it watches whether the code your browser is running matches what the operator published on-chain — but it was firing at the wrong moment. During an update the server briefly serves the new build before the on-chain record catches up, so for a few seconds the two legitimately disagree, and the check cried wolf. It now stays quiet whenever the served version and the published version differ (an update in progress), and only speaks up for a genuine mismatch at the same version. Real tamper detection is untouched; the false alarm on every update is gone.

    Messages and orders that lagged behind

    Some instances could fall behind the blockchain — new messages and orders taking a long time to appear, or not appearing until later. The cause was outside Morphit: several public Blurt RPC nodes run firewalls that reject the efficient "batched" way Morphit asks for many blocks at once, while happily answering one block at a time. Morphit now detects that rejection and automatically falls back to one-at-a-time requests on those nodes, so a single strict node can no longer stall an instance. Operators get the full node list working again with no manual node-picking.

    Your data, your keys, your trades — all untouched throughout.

    Downloads
  • v1.8.0 b366b9d844

    Morphit v1.8.0
    All checks were successful
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 44s
    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 38s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 14s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 26m13s
    morphit-release / Build + publish release tarball (push) Successful in 27m1s
    Stable

    agorise released this 2026-07-19 09:38:03 +00:00 | 41 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    When you complete a trade, the people you didn't pick now hear back

    You post an order. Fifteen people message you wanting to trade. You pick one, pay them, and leave feedback — done. But the other fourteen are still sitting there, watching a conversation that has quietly become pointless, waiting for a reply that was never coming.

    Now it comes automatically. The moment you complete a trade with someone, everyone else who messaged you about that same order receives a short, friendly note — in their own language — letting them know the order was settled with another trader. You write nothing. You don't reply fourteen times. And their note never names who you traded with.

    It reaches everyone who asked, no matter how busy your inbox is.

    "Three different people asked about my order. Is that three conversations or one?"

    Three. It was always meant to be, and now it provably is.

    Each person who messages you about an order gets their own thread, tagged with that order, that you can answer on its own. If the same trader talks to you about two different orders, that's two threads — because they are two different conversations. Your inbox is organized around discussions, not just people.

    The chat cards on your phone had no room to breathe

    On a narrow screen a chat card was trying to show a name, what the conversation was about, a feedback line, a gold star, and a timestamp — all crammed into the same strip. Something had to give, and it was readability.

    The "2h ago" now lives in a tooltip you can tap for the full timestamp — day, month, and the exact time in UTC. The star moved up to the top corner of the card. And with those two out of the way, the name, subject, and feedback lines finally get the full width of the card, trimming with an ellipsis only when they truly run long.

    The scary red bar after an update is gone

    When your Morphit instance got a new version, some of you saw a large red banner across the bottom of the screen — sometimes with a bluish bar and a Refresh button stuck on top of it. It looked like something had broken. Nothing had; it was only telling you a new version was ready.

    There was never a reason to alarm you about good news. That whole apparatus is gone. When a new version is ready you get the same calm "Load it now" message you already know — take it or dismiss it, your call.

    The browser tab sometimes showed the wrong page

    You would be sitting on the chat page and the tab would announce "Browse Offers." Or you would land somewhere and see "Conversation" for a page that was nothing of the sort. The title is now pinned to the page you are actually on, every time.

    The listing fee floor

    BLURT's price has roughly halved since the floor was last set, so the minimum listing fee — which is measured in real-world value, not a fixed number of coins — is now 125 BLURT, to keep it near the same twelve-and-a-half cents it has always been. If BLURT's price climbs, the number comes back down. It tracks the value, never a hardcoded coin count.

    The missing-message mystery, solved

    A few of you hit something genuinely maddening: a notification badge would light up saying you had a message, you would open your inbox, and there was nothing there. Refreshing didn't help.

    The message was real and it had arrived. What had gone stale was the website itself — served to your browser from a cache that never expired, so you were looking at an old copy of Morphit that didn't yet know how to show the new message. A hard refresh fixed it, but you should never have needed to know that.

    This release hardens how every Morphit instance serves its own updates, so a stale copy can't get stuck on your device — and it ships a check that warns an operator right away if their server is set up to let it happen. The whole class of problem is closed, not patched around.

    For people who run Blurt RPC nodes

    You confirmed you can see Morphit/<version> in your access logs now — thank you. On the strength of that, the old workaround that forced the identifier into place is gone, and the relay's own Blurt traffic now identifies itself the same clean way the indexer does.

    For people setting up a node

    Generating your instance's alt-network (I2P and Tor) addresses can take a few minutes with nothing obvious happening on screen. There is now a spinner and a plain "Stand by, generating alt-dns addresses (this might take a few minutes)…" so you don't assume it has hung and kill it halfway. The node-setup and operations guides also got shorter and steadier where they safely could.

    Smaller things

    • "Cancelled" is now "Canceled" everywhere it appears — it reads the same and takes less room on a crowded card.
    • The last-resort fallback prices, used only if live pricing is briefly unreachable, were refreshed to the current market.

    Under the hood

    • The auto-reply above is end-to-end encrypted per recipient, carries no text on the wire (each person's app renders the note in their own language), and can only ever reach someone who already messaged you — so it can never be turned into a way to message strangers.
    • Removed a pile of dead inbox machinery left over from an older design that the current thread model long ago replaced.
    Downloads
  • v1.7.7 ea8e445ce0

    Morphit v1.7.7
    All checks were successful
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 42s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 35s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 37s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 14s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 25m42s
    morphit-release / Build + publish release tarball (push) Successful in 26m14s
    Stable

    agorise released this 2026-07-18 01:17:31 +00:00 | 42 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    "I archived it. It came back."

    You archived a chat. You refreshed. It was sitting in your inbox again.

    The cause turned out to be your computer's clock. Morphit stamped "I filed this at X" using your device's clock, then compared that stamp against the message's timestamp from the blockchain — two different clocks, and only one of them is right. If your PC ran even ninety seconds slow, Morphit read your archive as older than the message already in the thread, decided something new had arrived, and pulled it back out.

    That's why it happened on one machine and not another, on identical code. It was never the browser.

    Every one of those comparisons now uses blockchain time on both sides. Your clock can be wrong; your inbox will not be.

    "I clicked archive on twenty threads. Did they all stick?"

    Yes — and thank you to whoever asked, because the answer used to be no.

    The same clock problem had a nastier version hiding in it. Morphit waits a moment before writing your filing to the chain, so twenty rapid clicks become one write instead of twenty. But while those clicks were waiting, a background sync could look at the chain, see an older state, believe that was the newer one — again, because it was comparing two different clocks — and quietly undo the lot.

    Fixed. File as fast as you can click; every change lands.

    And if you refresh the tab mid-spree, nothing is lost. Each click is saved to your device the instant you make it, and the pending write is re-armed when the page comes back.

    "I can't reach the Send button"

    On a phone, the Send BLURT window was taller than the screen — with no way to scroll to the button at the bottom. You could fill the whole form in and not be able to send it.

    It's fixed — and so are the seven other windows that had the same flaw, including Pay with BLURT and the warning that appears before you paste a private key. Five more could already scroll but measured the screen in a way that ignores the space behind your phone's address bar, so they could still hide their own bottom edge; those are corrected too.

    Every dialog in Morphit now fits your screen and scrolls if it needs to, and there's a check that fails the build if a new one doesn't.

    Chat threads now move where you can see them

    Archive a thread, restore one, star one, and the card slides out or in instead of vanishing between blinks. If you've asked your device for reduced motion, it still snaps instantly — Morphit checks.

    Review cards on a phone

    Long display names ran off the edge of the card. The (@username) in brackets repeated something the card already told you better — your public key is right underneath it, and the name links to your profile — while eating half the width on a narrow screen. It's gone, the name truncates, and the cards are readable again.

    The push notification privacy setting was telling you something untrue

    There was a "Self-hosted only" option in notification settings, and an FAQ entry promising that with it enabled, "no Google, no Mozilla, no third parties ever see that you received a ping."

    That was not true, and could not have been. Web Push endpoints are minted by your browser — Firefox's go to Mozilla, Chrome's go to Google, and no setting in any web app can redirect them. The option was stored and never read by anything.

    The setting is gone and the FAQ now describes what actually happens: the push service sees that an encrypted blob arrived for an anonymous endpoint. It cannot read it, and Morphit never puts your account name, your counterparty, or your message in one. That was always true — it just wasn't what we'd written down.

    If you want push notifications routed through a server you choose, that needs UnifiedPush, which is a real feature and not a checkbox. Ask, and it gets built.

    BasicSwap comparison, updated and trimmed

    The FAQ entry comparing Morphit to BasicSwap was long-winded and out of date. It's about 20% shorter and now mentions the exploit BasicSwap suffered on 14 July 2026 — over 0.66 BTC, roughly $42,000, confirmed by the project's own developer and by Orangefren.

    We mention it because someone choosing between two ways to trade should know it happened, not to score a point. Atomic swaps remain a beautiful piece of engineering. Morphit has no room to gloat either: we're software, we have bugs. The difference is architectural, not moral — Morphit never holds your coins, so there's no pot to drain — but a bug in our code could still cost you a trade, and we'd rather say so.

    For people who run Blurt RPC nodes

    Morphit's indexer now identifies itself:

    User-Agent: Morphit/1.7.7 (+https://git.agorise.net/agorise/morphit)
    

    It used to send node — the same string as every anonymous script on the internet, which is exactly what bot-traps are written to catch, and which left you nobody to contact. If our traffic is causing you grief, that URL is where to say so.

    Smaller things

    • Long display names now truncate everywhere instead of colliding with the buttons beside them.
    • The RPC pool note in Settings said nothing the page didn't already say. Removed.
    • Region labels on the post and orderbook pages say what they filter.
    • Three documentation errors that would have quietly wasted an operator's afternoon: two environment variables that didn't exist under the names we'd published, and a file path pointing at the wrong directory.

    Under the hood

    • A federated instance's server tells your browser when a chat last had a message. Morphit now checks that timestamp is plausible before trusting it. A dishonest operator could previously have used it to make your own messages look already-read — so you'd never see a counterparty's payment arrive.
    • Chat filing writes to the chain one at a time now, so a slow write can't overwrite a newer one.
    Downloads
  • v1.7.5 8a8e497865

    Morphit v1.7.5
    All checks were successful
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 44s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 36s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 38s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 13s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 26m22s
    morphit-release / Build + publish release tarball (push) Successful in 26m48s
    Stable

    agorise released this 2026-07-17 02:56:27 +00:00 | 43 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    "A message came in and nothing lit up"

    Someone messaged you. The badge stayed dark for a minute. Then the message turned up in Archived instead of your inbox.

    Both symptoms, one cause, and it was a good one. Morphit has a fast path that lights the badge the instant a message lands — and it had been dead code in production the whole time. The notification your browser received was labelled one way and read another way, so every message fell into the gap and quietly waited for the slow, once-a-minute check to notice it.

    It's fixed. Badges light within a couple of seconds now, the way they were always supposed to.

    If you had the tab closed when the message arrived, you'll see the badge as soon as you open it — Morphit now replays the last few minutes of activity on connect, using the message's real arrival time, so a message you already read doesn't come back pretending to be new.

    "I answered them on my laptop. My phone still says unread."

    Because it genuinely didn't know. Morphit tracked what this device had seen, but not who spoke last — so your own reply, sent from your laptop, looked exactly like an unread message when your phone looked at it.

    Your phone now knows the last word was yours, and stays quiet.

    Chat cards on a phone

    Four lines of wrapped name, squeezed into a card with barely room for anything else. The name now truncates properly and the spacing is tuned for a narrow screen — the same cards are about 40% taller on a 360px phone, with the same information in them. Nothing changes on desktop.

    Order cards

    • The rating now comes first, with the trade count next to it in smaller text.
    • The rating chip is as bright as everything else on the card. One thing genuinely was dimmed; it isn't now.
    • "1 trade" instead of "1 trades". Languages with more than two plural forms — Polish and Russian — get all of theirs, properly.
    • Hovering Expires used to say when the order was last touched, which could be hours after you posted it. It now says when it was posted, because that's what it looked like it was saying.

    Chat header

    The star next to someone's name was hand-drawn in two places instead of using the component every other card uses — which is exactly why it was gold when it should have been green, and why it showed a score with no idea how many people it came from. It now uses the same component as everywhere else, so it looks the same and says the same thing. The avatar sits properly centred.

    We're easier on the volunteers who run Blurt

    The public Blurt nodes are run by people, for free, and Morphit leans on them. One of them asked us for four things. This release finishes the list.

    When a Morphit node has been offline and needs to catch up, it used to ask for blocks one HTTP request at a time — thousands of them, as fast as it could, from every Morphit instance at once. That's what earned us a rate-limit. It now asks for twenty blocks per request. A five-thousand-block backlog went from 5,000 requests to 250.

    Nodes that don't support batching aren't asked twice, and aren't penalised for it — they just get the old path, at the old polite pace.

    You don't configure any of this. It's listed here so you know what your node does on your behalf.

    Your IP address, honestly

    Morphit never sees or logs your IP. No cookies, no analytics, no trackers, no telemetry.

    There is exactly one exception, and we chose it on purpose: once per session your browser asks a network node directly for the signed record that says which version of Morphit is current. That's how your browser can tell you if the operator serving you this page has quietly given you a stale or tampered build — a check that's worthless if we route it through the operator we're checking.

    We'd already written this down in three places on the site, and in all three we'd written it down wrong — including on the very page that lists those nodes, which told you your browser never talks to them. It does. All three are corrected, and there's now a FAQ entry that explains exactly what happens, why we chose it, what that node learns (an IP, and nothing that identifies you), and what to do about it.

    Short version: use Tor or a VPN. If you're here for Monero you almost certainly already do, and if so this is already closed for you.

    Settings

    • The display-name card lost a paragraph explaining the two Save buttons. The buttons say what they do.
    • The two Clear buttons on Display name and Short bio are gone. Delete the text and Save — same result, one less button.

    Smaller things

    • Monero's description now mentions that it hides balances too, not just amounts, senders and recipients.
    • One outbound link on the instance page was leaking a referrer. It isn't now.

    For operators

    Upgrading is one command and there is no database migration in this release.

    The Ansible playbook now ends with a loud warning if your node has no alerting configured. It's off by default because it needs a Matrix access token we can't generate for you — but a green Ansible run is exactly when people stop reading, so if your node is silent, that's the last thing you'll see, along with the six steps to fix it.

    Being unmonitored should be a choice you made, not one you defaulted into.

    Block catch-up is batched (see above). Nothing to configure. If you want to confirm it's working, watch the request rate against a node during a catch-up — batching is doing its job if it's roughly a twentieth of the block rate.

    docs/OPERATIONS.md and docs/RUN-A-MORPHIT-NODE.md both cover the new behaviour.

    Downloads
  • v1.7.0 7f2ed9a802

    Morphit v1.7.0
    All checks were successful
    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 36s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 38s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 15s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 25m4s
    morphit-release / Build + publish release tarball (push) Successful in 25m42s
    Stable

    agorise released this 2026-07-16 18:33:15 +00:00 | 44 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    "I just paid, and my order doesn't exist."

    If you posted an order and clicked View my order, Morphit told you your order wasn't there.

    Not sometimes. Every time.

    Here's what was happening. Your order went onto the blockchain in about three seconds, exactly as it should. But the part of Morphit that reads the blockchain deliberately waits until a block can never be undone before trusting it — and on Blurt that takes about a minute. So for that minute, the order was real, it was paid for, it was on the chain — and Morphit's own database hadn't heard of it yet.

    The page waited 24 seconds and then gave up and said "Order not found."

    That's fixed, and not by waiting longer. Waiting longer would only have swapped a scary message for a minute and a half of spinner. Your browser already knows about the order — it's the thing that signed it and sent it. So now it just shows you. Instantly. There's nothing to wait for.

    Everything you do now shows up immediately

    The same fix applies across the app. When you do something, you see it:

    • Post an order — it's there, right away.
    • Cancel or complete an order — the card and the tab counts update on the spot.
    • Edit your profile — see below; this one was its own bug.
    • Reply to someone's review — your reply appears where it belongs.
    • Watch an order someone else posted — if they cancel or complete it while you're reading, the page tells you within a few seconds instead of leaving you looking at a listing that's already gone.

    Chat and notifications were already fast. They stay fast.

    "I saved it, and it reverted"

    If you changed your display name or avatar in Settings, it worked — and then about twelve seconds later it changed back to the old one.

    Morphit was protecting your edit from being overwritten while the blockchain caught up. That protection lasted twelve seconds. Catching up takes about a minute. So the shield dropped roughly forty seconds too early, and the stale copy won.

    Your edit sticks now.

    When something says "confirming", we mean it

    There's a line we're not going to cross to make things feel fast.

    Your trade count and your review score still wait for the blockchain to make it permanent. So do listing fees. Those are the numbers people decide whether to trust you on, and a number that might quietly change its mind an hour later is worse than a number that took a minute to arrive.

    So Morphit tells you which one you're looking at. A brand-new order of yours shows a "Confirming on the blockchain" tag until it's settled. An order that just disappeared from the listings says "No longer available — confirming" — and notably it does not guess whether it was cancelled or completed, because at that moment we honestly don't know yet.

    You get feedback in seconds. You get finality when the chain says so. You're always told which.

    Your order still isn't public until the fee is paid

    Worth being plain about this, because it's the one thing that didn't get faster and shouldn't.

    Your own order appears to you instantly. Strangers browsing the orderbook still don't see it until the block is permanent and your listing fee has been verified — about a minute.

    We could have made new orders show up in everyone's orderbook in seconds. We're not going to. It would mean anyone could fill the orderbook with orders they never paid for, over and over, a minute at a time. We'd rather show a stranger nothing than show them a listing that isn't paid for and might vanish.

    The block explorer was already fast

    We checked. The explorer reads the blockchain directly rather than going through Morphit's database, so it was never affected by any of this.

    Small print

    The honest bit: four separate parts of Morphit had each been built around the same wrong number. Somebody reasoned that the database would catch up in "one or two blocks" — about three to six seconds — and wrote that assumption into a timeout. It's actually forty-five to sixty-three seconds. Every one of those timeouts expired before the answer could possibly have arrived, and each one then produced the exact problem it had been written to prevent.

    The parts of the code that had measured the delay instead of reasoning about it got it right, and had been right all along.

    We also found that our own brag list claimed new orders show up in the orderbook in three seconds. They don't and never did. It's fixed.

    Downloads
  • v1.5.7 457a2049ca

    Morphit v1.5.7
    All checks were successful
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 41s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 34s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 36s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 13s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 25m46s
    morphit-release / Build + publish release tarball (push) Successful in 26m24s
    Stable

    agorise released this 2026-07-16 01:41:26 +00:00 | 45 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Chat notifications now land in seconds, not a minute

    If someone replied to a conversation you'd archived, Morphit did the hard part right: the notification reached you in about six seconds. Then nothing else happened for a minute. No badge. No message in your inbox. If you went looking, you'd eventually find it sitting in your Archived folder.

    Two symptoms, one cause. Morphit has a fast path that tells your browser "a message just arrived", and a slower path that writes it into the searchable history about a minute later. The badge was being lit off the slow one — because an archived conversation doesn't count toward your badge until something pulls it back into your inbox, and the only thing that did that was the slow path.

    So the fast message arrived, was quietly set aside for being archived, and waited a minute for the slow path to catch up and give it permission to matter.

    Now the arriving message does that job itself: a reply to an archived conversation pulls it back into your inbox and lights the badge straight away — whether you're on the chat page, somewhere else on Morphit, or looking at another tab entirely. Same six seconds as the notification.

    Starred conversations are deliberately left alone. A message in a starred conversation already lit your badge correctly, and moving it to your inbox would have thrown away the star you put there on purpose.

    Moving a conversation to a folder sticks now

    Star or archive a conversation, refresh the page straight away, and your change would undo itself — reappearing about a minute later.

    It wasn't slow. It was being reversed. Your change saves instantly on your device and then takes about a minute to travel to the blockchain and come back. Refreshing inside that window asked the blockchain what your folders looked like, got an answer from before your change, and believed it over you.

    Morphit now checks which one is actually newer. Your change wins until the blockchain has caught up; a change you made on your phone still wins on your laptop. Nothing about how folders are stored changed, so other Morphit instances are unaffected either way.

    While fixing this we found something related: a reply that arrived while you were away could get permanently buried in Archived, because every page load quietly reset each conversation's "archived on" date to right now — making every real message look older than the archive. That's fixed too.

    The chat now opens on your newest message

    Opening a conversation was still sometimes dropping you into the middle of it. There was already code meant to hold you at the bottom while the page finished drawing — it just never got the chance to run. Setting the scroll position makes the browser announce that the page scrolled, and Morphit was treating its own announcement as "the user grabbed the scrollbar" and standing down immediately.

    So it jumped to the bottom once and let go, and anything that loaded a moment later — a font, a payment receipt, a message still being decrypted — pushed your newest message back under the fold.

    It now waits until the conversation has actually stopped growing before letting go, and it still gets out of your way the instant you scroll.

    "Pay now" no longer appears on a finished trade

    A conversation about a completed trade was still offering the "Pay now" and "Share crypto address" buttons across the bottom — on a trade that was already paid, closed, and receipted by both sides. That's not just clutter; it's an invitation to pay twice.

    The same was true of cancelled and expired orders. Those buttons now disappear as soon as an order is finished, whatever finished it.

    Payment Receipts read like receipts

    • The date and time now appear on the receipt itself, on the "BLURT SENT" / "BLURT RECEIVED" line: "BLURT SENT on 14 May, 2026 @ 05:03:22 UTC". That's where a receipt should say when it happened.
    • The pop-up date that used to follow your mouse anywhere over the receipt is gone. It was showing you something now printed on the card.
    • The receipt is no longer clickable-looking. It behaved like a link that went nowhere.
    • The "Verify on block explorer" link is no longer permanently underlined. The underline appears — as dots — when you hover or tab to it.

    Ordinary chat messages still reveal their timestamp when you tap them; that's the only place to see it for those.

    Order terms: markdown fixes

    • The markdown help tooltip wouldn't go away. If your mouse happened to rest on the little markdown icon while you typed, its help bubble sat over the text you were writing until you jiggled the mouse — because a hover bubble can only be dismissed by moving, and your hand was on the keyboard. It now disappears the moment you start typing, and you can dismiss it with the Escape key.
    • Blockquotes are now indented. A > quoted line in your order terms had a green bar beside it but sat at the same margin as everything else, so it didn't read as a quote. It's now properly set in from the surrounding text.

    Quotes and lists also now sit on the correct side for right-to-left readers (Persian), where they'd been indenting off the wrong edge.

    For operators

    • No database migration. No on-chain format change. v1.5.7 is backward-compatible in both directions; a federated instance still on an older version keeps working.
    • Morphit is politer to Blurt RPC nodes now. A node operator asked us for four things: slow down, batch requests, back off when refused, and add jitter. Backing off was already in place. The other two we could do, we did:
      • A request-rate ceiling (10/second per node). Normal running is well under one request a second, so you won't notice — but when an indexer catches up after downtime it used to fetch blocks back-to-back as fast as a single node would answer them. That burst is what looks like abuse from the node's side. Catch-up is still roughly thirty times faster than Blurt produces blocks, so a day of downtime still recovers in well under an hour.
      • Jitter on the back-off timers. Every Morphit instance a node turned away was being told to wait the same 30 seconds, so they all came back at the same moment and set the limit off again. The wait is now spread ±25%. The average wait is unchanged — they just stop arriving in lockstep.
      • Batching is not in this release. It needs testing against a live Blurt node, and we won't ship untested code into the part of the indexer that would stop your instance syncing if it were wrong.
    • Nothing in this release changes what /v1/health or /v1/rpc-endpoints return. The rate-limiter's internal state is deliberately not published.
    Downloads
  • v1.5.5 21e4eec62b

    Morphit v1.5.5
    All checks were successful
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 43s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 34s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 37s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 14s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 24m7s
    morphit-release / Build + publish release tarball (push) Successful in 24m49s
    Stable

    agorise released this 2026-07-15 16:21:15 +00:00 | 46 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Finishing a trade now actually finishes it

    This is the big one, and it explains a whole cluster of oddities in one go.

    When you and your counterparty finished a trade — the money sent, the receipt in the chat, both of you leaving reviews — your order stayed "Live". Forever. It kept sitting in the public orderbook waiting for another buyer. It still offered a Cancel this order button for a trade that was already done. It still counted under the Live pill instead of Paid, still appeared under Active orders, and still showed (Live) beside its title in your chat inbox.

    The cause was small and specific: the button on My orders says "Mark complete / review", and the panel in your chat is headed "Mark this trade complete" — but both of them only ever posted the review. The "mark complete" half was never implemented.

    Now it is. Leaving a review on your own order also marks that order complete, and the whole cluster corrects itself: the pills count right, the Cancel button goes away, "Expires on" disappears (it's irrelevant once a trade is done), and the order stops showing up in the orderbook.

    Trades and reviews are now two different numbers

    Before, your "trades" number was really your reviews number wearing a disguise — there was no trade data, so the reviews you'd received stood in for the trades you'd done.

    That quietly cost honest traders. Complete a real trade where neither of you got round to leaving stars, and it counted for nothing. Take someone else's order rather than post your own, and you'd read "0 trades" no matter how many trades you'd completed, because only order posters were ever counted.

    Both are fixed:

    • A completed trade counts as a trade — stars or no stars. If nobody left a review, that's fine; the trade still happened.
    • Both people get credit. Completing a trade credits the person who posted the order and the person they traded with.
    • Your order cards now read "1 trade · ★5.00 (34)" — the trades you've done, and separately the star average with how many ratings back it. The "(34)" means 34 ratings, and now it really does.
    • The 🌱 new trader sprout retires once you've completed 4 trades, rather than once you've collected 4 reviews.

    The Most trades sort and the minimum trades filter now use real trades too, so an experienced trader who's never been reviewed no longer sorts below a chatty newcomer.

    None of this weakens the anti-sock-puppet protections. Naming who you traded with requires the same proof of a real, two-way conversation that leaving a review already required — so nobody can mint trade credit for an account they've never actually spoken to, or attach a public claim to a stranger's name. There's a new protection too: if almost all of an account's trades are with one single partner, those trades stop counting toward the number. Two people who genuinely only ever trade with each other will feel that one — you keep your ratings, but heavily concentrated trade credit doesn't count.

    Notifications: no more doubles, and no more waiting

    • The duplicate is gone. A new chat message could notify you twice — once within a few seconds, then again about a minute later. One message, one notification.
    • Your badges keep up. The avatar and favicon counters used to sit dark for about a minute after the notification had already arrived. They light up with it now.
    • The message is there when you tap. Tapping a notification could land you in a chat that didn't show the message yet — you'd wait, or refresh. It's there when you arrive.
    • Reviews notify you fast. Being reviewed sent no timely notification at all. It now arrives in seconds, like a chat message.

    If you're an established trading partner, you get all of this at full speed. First contact from a total stranger is still held to the slower, stricter path — that hasn't changed, and it's what keeps notifications from becoming a spam channel.

    The chat, tidied up

    • Payment Receipts — the Copy button now lines up with the Transaction field, the field is labelled Transaction ID, and the "verify this yourself" link beside the 🔍 is finally visible and actually works (it led to a Not Found page).
    • Green bubbles are dimmer and the text is bolder, so the thin dark text on them is easier to read.
    • Leaving feedback shows a brief "Feedback sent" message instead of leaving a card pinned to your chat, and the Cancel and Submit feedback buttons now sit side by side, with Submit in the green outline style.
    • Your inbox says "I rated @someone:" instead of "Feedback left:", and shows (Paid) on a finished order.

    Profile and reviews

    • The Reviews heading now says who they're for: "@someone has received reviews from".
    • Every review card shows the person's @username beside their display name, and their truncated public key underneath — including for people who haven't set up a profile, whose key simply never appeared before.
    • Your own review comments now read "I said: …", and a reply you leave sits indented beneath the review it answers.
    • Stars are green everywhere. A reputation star used to render white when it was based on only a couple of ratings; now it stays green and goes hollow instead — same "take this with a grain of salt" signal, but it also works if you can't distinguish the colours.

    Odds and ends

    • The stray green border around the page is gone (it was a focus outline that fired on every page load).
    • The action buttons on My orders are sized to match the Re-list this order button instead of being stretched wide.
    Downloads
  • v1.5.0 b681330aa7

    Morphit v1.5.0
    All checks were successful
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 41s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 33s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 37s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 13s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 24m22s
    morphit-release / Build + publish release tarball (push) Successful in 24m48s
    Stable

    agorise released this 2026-07-15 01:23:33 +00:00 | 47 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Your reputation now counts every review you've earned

    This is the big one. A real, verified review could fail to count toward your reputation — your profile would say "No feedback yet" and your orders would show "0 trades" even though a counterparty had already reviewed you and the review was sitting right there on the page.

    It happened whenever the review pointed at an order you didn't post — for example, when the person who listed the order reviewed the person who took it. That's an ordinary, everyday trade, so this was quietly costing honest traders the reputation they had actually earned.

    Reviews like that now count, your score reflects them, and the "new trader" sprout retires when it should. Nothing about the anti-sock-puppet protections changed — genuine reviews were simply being dropped alongside the fake ones, and only the genuine ones came back.

    Leave feedback right where the trade happened

    Feedback now works in both directions, from the conversation itself:

    • A Leave Feedback panel appears in your chat once you've actually traded — stars, a comment, and send.
    • Your chat inbox shows "Leave Feedback:" on threads that are ready for it, and "Feedback left: ★★★★★" with your comment once you've done it.
    • On My orders, if a trade had one counterparty the form locks to them; if it had several, you pick the right person from a short list with their avatar, so look-alike names can't be confused.

    Your settings now follow you to a new device

    Your preferences — notifications, quiet hours, privacy choices, syndication, hidden and blocked accounts — are now mirrored to the chain, encrypted with your own key. Sign in on a new phone or laptop with your seed and they come back with you. Morphit's operators only ever store an opaque blob; nobody but you can read what's in it.

    Completed trades look completed

    • When a trade is done, the order is marked completed on-chain and the order page shows a clear green Completed & paid.
    • My orders shows a green "Paid by @someone" pill, drops the buttons that no longer make sense on a settled order, and adds a Paid filter alongside All, Live, Cancelled and Expired.
    • View the order from a review now opens the actual order — previously it could land on a "your order is being posted…" screen that never resolved.
    • The Payment Receipt in chat has been redesigned, and reads "BLURT RECEIVED" when you're the one who got paid.

    A clearer profile

    • The card showing who reviewed you now includes their truncated posting key under their name, so a look-alike display name can't impersonate someone.
    • "@someone has left a review for" now lists who they reviewed, with that person's avatar, name, key, and current reputation score — and reads properly on a phone.
    • Replying to a review is clearer: it now says plainly that you're replying to the review above, and notes that a reply isn't a rating (to rate someone, leave feedback from your chat with them). The reply box lost its odd blue tint, and Cancel now sits below Post reply where you'd expect.

    Sharing a crypto address on your phone

    The Share crypto address window used to list every coin as a separate block — sixteen of them — which on a phone pushed the window past the edge of the screen with no way to scroll to the Send button. It's now a single coin picker with logos, and the window fits and scrolls properly. The same fix applies to the window where you report funds sent.

    Your address is checked as you type, with a red outline and a plain explanation when something's off.

    When an RPC node has a problem, we now say what it is

    Settings → RPC endpoints used to mark a node with a flat red "unreachable" no matter what went wrong — which could point the finger at a node that was perfectly healthy. Now you get the actual reason in one line: a TLS certificate problem, blocked by a security policy (HTTP 403), rate-limited, DNS lookup failed, or answered, but the RPC call failed. Plain "Unreachable" is now reserved for a node that genuinely isn't answering.

    Tidier throughout

    • The oversized Post an order button is now half the size, everywhere it appears.
    • The big buttons on Settings are sized sensibly, and the Mute buttons pick up the same gentle hover as everything else.
    • Clear on your display name or short bio now simply empties the field and lights up Save — no more red "are you sure" panel, and no more Save button that refused to do anything.
    • If you have no display name, you now show up as @yourname everywhere, consistently.
    • Reviews you've left now show your comment next to the stars, not just the stars.
    • In chat: your cursor stays in the message box after you send, the action row is easier on the eye, hovering a date divider tells you it's midnight UTC, and the view lands on the newest message.
    • The footer now reads #noaggression #countereconomics.

    For operators

    • No configuration changes. The upgrade delivers everything; there are no new environment variables to set.
    • The RPC-endpoint reasons above are measured by your indexer, server-side — your users' browsers still never contact a Blurt node directly, so their IP addresses are never exposed to third-party node operators. The card publishes only a short reason code and, where relevant, an HTTP status — never raw error text.

    As always: your chats (and every crypto address shared in them) are end-to-end encrypted, your settings are encrypted with your own key before they ever touch the chain, and Morphit still keeps nothing about you.

    Downloads
  • v1.4.12 b6b125a365

    Morphit v1.4.12
    All checks were successful
    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 36s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 37s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 14s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 24m18s
    morphit-release / Build + publish release tarball (push) Successful in 24m41s
    Stable

    agorise released this 2026-07-14 03:52:38 +00:00 | 49 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Message notifications now arrive in seconds, not a minute

    Last release made messages appear right away inside an open conversation. This one does the same for the notification — the pop-up, the little unread dots, and the badge on the app icon.

    Before, if someone messaged you while you were on another tab or had Morphit closed, the alert could take up to a minute to reach you. Now it arrives within a few seconds of the message being sent. If you keep Morphit open in a background tab, its browser-tab icon and your avatar's unread dot light up promptly too — you no longer have to click back to the tab to find out something happened. And if you've installed Morphit as an app, the count on its dock or taskbar icon updates just as quickly.

    Still quiet when it should be

    None of this changes who's allowed to reach you. A stranger still can't ping you out of the blue — a first message from someone you've never spoken to (and who hasn't posted an order you're replying to) still goes through the same gentle gate as before. The fast alerts are for the conversations you're actually part of: people you've talked to, and genuine replies about your own listings. And as always, if you've blocked someone, you hear nothing from them.

    For operators

    • This is delivered entirely by the standard upgrade — there's nothing to configure and no settings to edit. Running the upgrade applies a small database change automatically and turns the faster notifications on.
    • The chat tracer is still here, still switched fully off. If you're ever diagnosing a message-delivery question, you can turn on a detailed, privacy-safe console trace by adding ?chatdebug=1 to a chat URL (or localStorage.setItem('morphit.debug.chat','1')). It logs message metadata only — never contents — and does nothing unless you switch it on.

    As always, Morphit's notifications carry no message content — only a nudge that something happened — and none of this changes what Morphit keeps about you: nothing.

    Downloads