<p><strong>Lightningsendsworkagain.</strong>v1.8.9's move to LND 0.21'ssupportedpaymentrouteshippedwithoutafeebudget,andtheAPItreatsamissingoneaszeroallowedfees—soeverywalletsendfailed"No route to the recipient"allday,onperfectlyhealthychannels.Paymentsnowcarryaproperfeebudgetandatestkeepsitfromeverregressing.</p>
<p><strong>Achannelthatdropsitspeerlinknowhealsitself—oneverynode.</strong>RestartingLND(anappupdate,areboot,containerchurn)canleaveachannel's peer connection down for hours while both endpoints keep the channel flagged disabled in the routing graph: the node looks perfectly healthy, the wallet shows balance, and every payment in either direction fails "no route to the recipient". The daemon now watches the channel graph as desired state — every open channel should have a live peer — and reconnects any that don't.NodeswithoutLNDareuntouched;anunreachablepeerisretriedgently.</p>
<p><strong>TheLightningwalletsayswhat's actually wrong, instead of "you have no channel".</strong> Trying to send while a channel you just opened was still confirming — or when all its balance sits on the far side — produced a modal claiming you had no channel at all, and payment routing failures even showed the receiving copy. The gate now reads your real channel list: a confirming channel gets "it unlocks automatically once confirmed, nothing is needed from you", a far-side balance gets "you can receive, but there'snothingtosendrightnow", and only a genuinely channel-less node is sent to open one.</p>
<p><strong>Lightning sends work again after the LND 0.21.2 update.</strong> LND 0.21 removed the payment route the node's backend used — every send answered "NotFound". Payments now go through LND's supported v2 router route, slow multi-hop payments are still tracked to completion (never falsely declared failed), failures explain themselves in plain language, and a new test speaks the payment route directly at release-gate time so an image/backend mismatch like this can never ship silently again.</p>
<p><strong>HTTP and HTTPS both work, and no longer break each other.</strong> The HTTPS listener used to pin a year-long browser policy (HSTS); once your browser had visited HTTPS, it silently rewrote the HTTP dashboard's calls to HTTPS — cross-origin, so everything showed "Failedtofetch"/CORS errors while the node was healthy. The pin is gone, the HTTPS listener now actively clears the stale policy browsers already cached (visit HTTPS once after this update to clear yours), and plain-HTTP access — which is deliberate on nodes whose self-signed certificate you haven't installed — keeps working exactly as before.</p>
<p><strong>Apps open over HTTPS again, including Mempool, Bitcoin and IndeeHub.</strong> The launcher looked each app's port policy up in the signed catalog under the name you click, but the catalog lists that port under the app that owns it — so Mempool "didnotconnect", Bitcoin opened a plain-http tab, and Nostr sign-in on IndeeHub silently did nothing over HTTPS. Launches now follow the alias to the owning manifest, the catalog is loaded before the first app you open (not just in the App Store), and the Nostr bridge replies to the app frame's real origin instead of a stale recorded address.</p>
<p><strong>Nginx Proxy Manager starts again.</strong> Its manifest was missing two things its image requires — the LetsEncrypt folder mount and the permission to bind low ports — leaving it in an endless restart loop on nodes that had it installed. Both are declared now; your existing certificates are untouched, and the fix arrives via the signed catalog without waiting for this release.</p>
<p><strong>Portainer's first-run token is on the app page, not buried in "serverlogs".</strong> New Portainer versions hand the first admin a one-time setup token that was only printed in the container logs — on this box, that token now appears with your app's other credentials, with a copy button, and disappears once setup is done.</p>
<p><strong>The Lightning wallet says what's actually wrong, instead of "youhavenochannel".</strong> Trying to send while a channel you just opened was still confirming — or when all its balance sits on the far side — produced a modal claiming you had no channel at all. The gate now looks at your real channel list: a confirming channel gets "itunlocksautomaticallyonceconfirmed,nothingneededfromyou", a far-side balance gets "youcanreceivebutthere's nothing to send right now", and only a genuinely channel-less node is sent to open one.</p>
<p><strong>SSH over the mesh is now a first-class setting.</strong> Settings gains an "SSH over mesh" card: off by default, and when you allow it the node'smeshfirewallopensport22—eithertoeverymeshpeer(behindanexplicit"I understand"confirmation,becausethat's a real exposure) or only to the mesh addresses you list. The rule is owned by the node (the 90-ssh.nft drop-in), so it survives upgrades and daemon reinstalls, and the card tells you up front whether sshd is running, whether it listens on IPv6 (the mesh is IPv6-only — this is what a broken attempt looks like before it happens), and whether password login is on (keys-only is the recommended pairing). From Termux on your phone, fipssh <user>@<node-npub> connects once the toggle is on — the npub is the durable address, and the command is shown with a copy button on the card.</p>
<p><strong>The App Store now lists apps — not parts of apps.</strong> The signed catalog carries every manifest because the node'supdatelayerneedstheirpins,andthestorebrieflylistedthemall:MempoolAPI,LNDUI,BitcoinUI,thePinevoiceengines,theIndeeHubandImmichbackends,themeshrouterandfriends.Componentsarehiddenfromthestorelisting(theystillappearwheretheybelong—theServicestabofMyApps,onceinstalled),andfourentriesthatneverearnedatilearegoneoutright:MorphOSserver(old),theWeb5DIDwallet,LightningStack(anuntrackedupstreambundle—LNDcoverstheneed),andCryptPad(nevertested).</p>
<p><strong>What's New really does stop at v1.8.0 now.</strong> The first correction removed old generated release blocks but missed six much older hand-written v1.2 sections at the bottom of the modal. Those sections are gone, and the release check now recognizes and rejects that legacy format too, so the history floor cannot falsely pass again.</p>
<p><strong>The installer carries the same corrected release and Companion 0.5.28.</strong> Its artifact gate now checks the companion APK version and the v1.8.0 What'sNewfloorinsidethefinishedISO,soastalefrontendorphoneappcannotbepublishedunderthecurrentreleaselabel.</p>
<p><strong>AppsopenoverHTTPSwhenyournodedoes.</strong>ConnecttoyournodeoverHTTPSandtheappsyouopen—Vaultwardeninitsowntab,BTCPay,Grafana,andtherest,onaremotebrowserorinthephone's in-app browser — now open on the same secure connection instead of silently dropping to plain HTTP. The node'sappgatealreadyservedTLSoneveryappport;thedashboardwashandingouthttp:// addresses regardless of how you reached it. Ports the gate does not front (plain-HTTP publishes, and the API ports like Cuprate's RPC) deliberately stay on http — https there would simply fail to connect. Plain-HTTP access (the kiosk, LAN browsing) is unchanged.</p>
<p><strong>Everyappinthestoreisnowafirst-classplatformapp.</strong>Thelaststragglers—NginxProxyManager,Tailscale,Ollama,CryptPad,andAdGuardHome—nowcarryfullmanifests:thenode's app gate fronts their web ports (TLS on the same port, the node login where appropriate, embedding fixes, Tor), installs go through the orchestrator like every other app, and their pins live in the signed catalog. Ollama stays loopback-only — it is the assistant'slocalmodelbackend,notawebapp.Thefourappsretiredearlier(FIPS,NostrVPN,Routstr,Penpot)arefinallydroppedfromthecatalog,andCuprate's manifest — which carried a duplicated metadata block that strict parsers reject — is fixed.</p>
<p><strong>Newly signed apps appear in the App Store immediately.</strong> The App Store now serves the release-signed catalog the node has already fetched and verified — so publishing a signed app (like Cuprate) makes it appear for every updated node without waiting for a dashboard release. The unsigned community catalog remains only as a fallback for nodes that can'treachtheregistry.ThesamesignedcatalognowalsodecideswhichportsserveTLS,sonothingisupgradedtohttpsthatcan't answer it.</p>
<p><strong>Companion 0.5.28 is included in the node download this time, with the work that missed v1.8.5.</strong> The companion hub can back up and restore its node list, act as a NIP-46 remote signer, and shows each paired node'sFIPSmeshaddresswithtap-to-copy.ForTermuxusers,theincludedfipsshhelperturnsadurablenodenpubintoitsmeshaddress,sofipsshuser@npub1…canreachSSHoncethatnodehasexplicitlyallowedport22.Thenode-side“SSHovermesh”firewalltoggleisnotclaimedhere—itstillneedsimplementationandremainsoffbydefault.</p>
<p><strong>What's New now starts cleanly at v1.8.0 and is guaranteed to be newest-first.</strong> Older alpha history no longer overwhelms the useful recent changes, the three stray v1.7 entries that appeared above current releases are gone, and the release check now fails if either the ordering or the v1.8.0 history floor drifts again.</p>
<p><strong>A release can no longer advertise itself before its files exist.</strong> New releases are prepared behind a pending manifest; the publisher uploads the backend and frontend, downloads both back and verifies their size and hash, and only then promotes the signed manifest to the path nodes read. The manifest generator also includes every curated What'sNewiteminsteadofsilentlystoppingafterthefirsttenphysicalchangeloglines.</p>
<p><strong>Cuprate—anindependentMoneronode—isnowanapp.</strong>Moneroconsensusvalidatedbyasecond,unrelatedcodebase(Rust),thesamelayerofsecurity-in-depthBitcoingetsfromKnots.Reviewcaughttwoproblemsbeforeanythingshipped:theunrestrictedRPCthatcanmovefundsstayedboundtothecontainer's loopback (never published to the node, let alone the LAN — anything on the node could previously have reached it), and its restricted RPC moved off port 18089 to avoid colliding with Penpot. Honest caveat: upstream has cut no stable release yet, so the pin tracks an exact preview build (0.1.0-preview-18-g618ff14) and moves to their first tagged release when there is one.</p>
<p><strong>A frozen node now explains itself — and comes back on its own.</strong> The host now captures a memory dump into /var/crash when the kernel panics <em>or</em> wedges (a hung kiosk used to sit dead until someone power-cycled it; now it dumps, reboots itself, and leaves the evidence behind), and records failing-memory signals (ECC errors) into a database as they happen. This is the first change delivered by a new host-update channel: the node'sownupdaternowcarriesOS-levelpackagesandsettingstoalready-deployedmachines—thecrash-kernel's memory reservation is the one part that waits for a reboot, and the node says so rather than pretending.</p>
<p><strong>Uninstalling an app can no longer report success when it failed.</strong> The declarative path used to swallow every teardown error and report the app uninstalled, leaving the tile behind and the truth in the logs. A failed uninstall now stops and shows the real per-app errors, so "still there" is never presented as "gone".</p>
<p><strong>Pictures to internet-only mesh contacts work now.</strong> Sending an attachment inline always took the radio path and failed with "Peer is federation-only (no radio twin)" for contacts reachable only over the internet — and the size-adviser kept recommending a radio transfer those peers can'treceive.Bothfixed:inlinesendsrouteoverthefederationwhenthat's the only way to reach the peer, and the advice no longer offers radio-only transfers to radio-unreachable contacts.</p>
<p><strong>Disk cleanup finally has honest numbers.</strong> Space "free" on a drive was counted including the slice the filesystem keeps reserved for root — roughly 5% of the disk, 92 GB on one dev box — so the automatic cleanup that'ssupposedtokickinat90%nevertriggeredandstalecontainerimagespiledupunnoticed.Reservedspacenowcountsasused,whichiswhatthethresholdwasalwaysmeanttomeasure.</p>
<p><strong>Threesmallscreensthatwerelyingtoyou,fixed.</strong>The"Bitcoin is synced — fund your wallet"toastnolongerappearsonanodewherethewalletitmeans(LND)isn't installed — it points at installing LND instead. The seed-reveal screen hides its third prompt unless the password actually fails to decrypt (the backup passphrase only exists if you set one). And multi-version store cards stop quoting a version number you'llbeaskedtochooseonthenextscreenanyway.</p>
<p><strong>Meshnotificationssurvivearefresh,andastalerouternolongerhidesthefix.</strong>Radiomessageunreadcountsarenowrememberedpercontactinsteadofguessedfromsessionstate(the"one new message showed 11 unread"bug),coverMeshtastic,MeshCoreandReticulumalike,anddeep-linktotherightconversation;asinglenewmessageannouncesitselfonce.Separately,whenthecachedrouteraddressgoesstale,theerrorcardgainsa"Reconfigure router"actioninsteadofaRetryloopthatcanneversucceed.</p>
<p><strong>Theappupdaternowknowswhatupstreamshipped.</strong>Everyapp's manifest records where it comes from — including the odd corners (GitLab-only projects, ghcr-only images) — and a checker sweeps all of them against upstream releases, so a pin that quietly rots for months is now visible instead of invisible. The first full sweep found 27 pins behind; the safe patch-level ones shipped with this release (strfry, BTCPay Server 2.4.3, the two nginx frontends), and the major jumps that may carry data migrations are deliberately held for their own careful passes.</p>
<p><strong>Apps with their own login can now skip the node'sloginscreen—GiteaandBTCPayServerdosooutofthebox.</strong>Someappsbringacompleteaccountsystemoftheirown,andputtingthenode's password page in front of them broke real workflows: git clients can'tanswerabrowserlogin,andaBTCPaycheckoutlinkhandedtoacustomermustopenforthatcustomer.Theseappsarenowserveddirectlyontheirownlogin,whilethenodestillfrontstheconnectionforeverythingelseitdoes(embeddingfixes,the"app is restarting"page,Tor).Everyappgetsanew<strong>Settings→app→Accesscontrol</strong>switch,soyoucanputthenodeloginbackinfrontofanyapp—ortakeitawayfromone—withoneclick,effectiveimmediately.Appdevelopersdeclarethedefaultintheirmanifest(auth:open),documentedinthedeveloperguide.</p>
<p><strong>ThephoneremotenowworksinsideappsontheTV—tap,scroll,andtypeeverywhere.</strong>Thecompanionremoteandkeyboarddrovethedashboardbeautifullybutdiedattheedgeofanyappscreen(Gitea,BTCPay,andfriends):forthebrowser,eachappisaseparatewebsiteembeddedinthepage,andsimulatedinputisforbiddenfromcrossingthatwall.Theon-screendisplaynowacceptstheremote's input the way a real mouse and keyboard arrive — below the page, through the browser itself — so it lands anywhere on screen, app screens and tabs included. Taps click, two-finger scrolling scrolls the app, and typing goes into whichever field you tapped. Existing kiosks pick this up with the update, no reinstall needed.</p>
<p><strong>While you'redrivingwiththephoneremote,theoldmousepointergetsoutoftheway.</strong>Thecomputer's own pointer used to sit frozen wherever the physical mouse last left it — a second, dead cursor next to the live orange one. It now hides while the remote is in use and returns half a minute after the last remote input.</p>
<p><strong>"Are you sure?" questions no longer freeze the remote.</strong> A handful of confirmations (clearing mesh history, rebooting, deleting a backup, uninstalling an app) used the browser'sbuilt-inpopup,whichstopsthewholepage—includingremoteinput—untilsomeoneclicksitwitharealmouse.Fromthecouch,thatmeantaskingaquestionyoucouldn't answer. All of them are now proper in-app windows in the house style, fully driveable by remote.</p>
<p><strong>A mesh radio now connects no matter which port it'spluggedinto—orrepluggedinto.</strong>MovingaradiotoadifferentUSBportcouldleavethemeshsilentlydown:thenodeonlycheckedashortfixedlistofportnames(aradiolandingoutsideitwasinvisible),ahand-setserial-portoverridequietlyoutrankedthedeviceyou'd just approved in the "Radio detected" window, and one whole family of boards (Espressif-based radios like recent Heltec/T-Deck models) never received a stable device name at all — the exact combination found live on a fleet machine this week. All three are fixed: every serial port is scanned, choosing a radio in the detection window clears any stale override, and Espressif boards get the same stable name as everyone else.</p>
<p><strong>Mesh signal strength is honest now.</strong> Every peer heard over Reticulum radio reported a signal strength of exactly 0 — which is also what you'dseewithnoradioatall,andwhatpeersreachedovertheinternetshowed.Realreceptionsnowshowtheirtruesignalreading,andanythingthatarrivedoverarelayortheinternetsayssobyshowingnone—so"the radio is working"and"the internet is doing the radio's job"nolongerlookidentical.(Thereadingdependsontheradio's firmware reporting it; boards that don'treportper-packetsignalstatsshow"unknown"ratherthanamade-upnumber,andthenewradiodiagnosticsshowataglancewhetheryoursreportsthem.)</p>
<p><strong>ThenetworkmaponTVs:nomoreblankpage,nomorefrozenpage—anditmovesagain.</strong>Themap's entrance animation needed a smoothness that TV kiosk hardware can'talwaysdeliver,sothepagecouldsitblankuntilarefresh;thepreviousfixcuredthefreezebystoppingtheanimationentirely,whichwenttoofar.Nowthemapappearsinstantlywitheverythingalreadyinplace,thenresumesitscalmorbitalmotionatagentlerpacesuitedtoTVs.Resizingorrotatinganyscreenalsoredrawsthemapproperlyinsteadofleavingittiny,stretched,orempty.</p>
<p><strong>Thedashboard's corner logo is back to normal.</strong> The new glossy paint finish was meant for the big emblem on the screensaver, intro, and login screens — it had quietly spread to the small logo in the dashboard header, where it looked wrong. Each screen now gets exactly the treatment intended for it.</p>
<p><strong>App icons no longer vanish in My Apps.</strong> The freshly restyled Alby Hub and phoenixd icons could render as blank squares in some views — a subtlety in how the icon files declared their size. Fixed at the source, and the icon tool app developers use now produces immune files.</p>
<p><strong>An app that can'tbeshowninsidethedashboardnowbecomesatabappbyitself.</strong>Afewappsrefusetorenderinsideanotherpagenomatterwhat—theybreakoutwiththeirowncodeorinsistonowningthewholebrowserwindow.Openingoneusedtomeanstaringatagreypane.Nowthedashboardnotices,offerstheappinitsowntab,andremembers:fromthenonthatapp's button opens a tab directly (with the little launch icon that tab apps carry), first click, every time. If a later update makes the app embeddable after all, the dashboard notices that too and goes back to embedding it.</p>
<p><strong>The logo emblem got its glossy black paint finish — properly this time.</strong> The circle behind the A on the screensaver, intro, and login now wears a deep wet-paint look: warm light blooming from the top edge, fine grain so the dark tones stay smooth instead of banding, and no more ring border. (An earlier rougher version of this experiment briefly shipped by accident and then vanished depending on which screen you were on — this is the finished, deliberate one, everywhere.)</p>
<p><strong>New app icons now match the store'slook,oneveryscreen.</strong>AlbyHubandphoenixdarrivedwithedge-to-edgelogosthatignoredthebreathingroomeveryotherappiconhas,andtheappdetailpageskippedtheiconbackdropentirely.Bothiconsarere-setonthestandardcanvas,thedetailpagenowappliesthesameicontreatmentasthestoretiles,andappdevelopersgetaone-commandtoolthatputsanylogoontothehousecanvasautomatically.</p>
<p><strong>Appsthatrefusedtoopeninsidethedashboardnowembedlikeeverythingelse.</strong>Someappsshipbrowserheadersthatforbidbeingshowninsideanotherpage—correcthardeningontheopenweb,butinsideArchipelagoitproducedadeadgreypanewhenyouopenedthemfromMyApps(AlbyHubwasthefirsttohitit).Theappgate,whichalreadychecksyourloginoneveryrequesttoanapp,nowremovesjustthoseframingheadersonthewaythrough;eachapp's own content-security rules pass through untouched. No more per-app proxy workarounds.</p>
<p><strong>The network map no longer freezes kiosk TVs.</strong> The animated federation map at 4K was too much for the deliberately conservative graphics settings the on-screen display used on every machine — settings chosen years back to stop audio crackle on much older hardware. Two fixes: on kiosk screens the map now opens in its flat 2D view (the 3D globe is one tap away, and remembered) and animates at half rate — invisible from the couch, half the work. And the display itself now recognizes what machine it runs on: older kiosk boxes keep the proven careful settings, modern ones finally get real GPU rendering.</p>
<p><strong>New Settings → Display → Graphics choice for the on-screen display.</strong> Auto (recommended) picks the right rendering mode for the machine by itself; Compatibility forces the most conservative mode if a screen ever stutters, tears, or crackles; Quality forces full GPU rendering on hardware the automatic detection doesn'trecognize.Changingitrestartstheon-screendisplay,likethesizepresets.</p>
<p><strong>Installinganupdateisreliableagain,andtellsyouwhathappenedwhenitisn't.</strong> Some nodes could download an update but never apply it — the button stayed on "Install", and no amount of retrying worked. The cause: applying the update consumed the downloaded files as it went, so if any one step hit a snag partway through, the leftover files were incomplete and every later attempt failed the safety re-check forever, needing a technician to recover. Applying no longer consumes the download — a failed apply can always be retried from the same files — and the pieces are now applied in a fixed order with the program itself last, so a hiccup can'tleaveahalf-swappednode.Whenanapplydoesfail,thescreennowshowstherealreasonandwhattodo("download the update again"),andoffersDownloadagaininsteadofadead"Install"button,ratherthanageneric"it failed".</p>
<p><strong>Videoonthekioskstopstearing.</strong>Thekiosk's display had no vertical sync at all, so fast motion — IndeedHub films especially — showed horizontal tearing lines. The display driver now syncs every frame to the panel (no extra hardware needed, existing kiosks pick it up with this update), and on machines with a GPU, video decoding moves off the CPU onto the video hardware — smoother playback that also leaves more headroom for audio, not less.</p>
<p><strong>The Back button finally does what you expect.</strong> Pressing Back — the mouse'ssidebuttononakiosk,aswipeonaphone,thetoolbarbuttoninanybrowser—usedtonavigatethescreenunderneathanopenwindow,orleavethedashboardentirely.Backnowclosesthetopmostopenwindowfirst,oneperpress,exactlylikeanativeapp;closingawindowyourselfneverleavesaphantomentrythatmakesyoupressBacktwice.</p>
<p><strong>NomorebareIPaddressesinyourupdateorapp-registrysettings.</strong>Theupdatemirrorsandtheappregistryeachlistedthesameservertwice—oncebyitspropername,onceasarawhttp://146… address left over from before the domain existed. The raw-address entries are retired: new nodes never see them, and existing nodes clean them out of their saved lists automatically on the next read. Everything now goes through the named, TLS-protected origin — which was always the same machine.</p>
<p><strong>TheReceivewindownowtellsyouwhenthemoneyisonitsway.</strong>PreviouslyitshowedaQRcodeandleftyoutocheckelsewherewhetheranythinghappened.Now,themomentthesender's transaction is broadcast, the QR gives way to a clock: the amount, the transaction ID (tap to copy), and a note that the funds arrive on their own — with a single Done button. If you keep the window open, the clock becomes a green check at the first confirmation. Verified live on a real node: payment detected within seconds of broadcast.</p>