<p><strong>FreshIndeedHubinstallsnolongershareafleet-wideencryptionroot.</strong>TheAPInowgeneratesapersistentper-nodeAESmastersecretandsharesitwiththemediaworkerthroughtheplatform's protected secret environment. Existing nodes migrate the exact legacy value they are already using before any container can be recreated, preserving access to encrypted data; an unreadable or empty existing root fails safely instead of being silently replaced. The manifest path, retired fallback installer, and container repair script follow the same rule.</p>
<p><strong>The Companion download advertises and re-announces the APK it actually serves.</strong> The Discover banner and its install prompt now share the no-cache APK metadata, visibly report Companion 0.5.32 build 52, and remember dismissal per Android build rather than forever, so an existing browser gets one useful update prompt when the APK changes. The ISO gate reads the expected version from the Android build itself instead of accepting the stale 0.5.28 payload.</p>
<p><strong>Cashureceivegainsahuman-readableMinibitsLightningaddress.</strong>Thenodederivestheprofilefromtheexistingecashrecoveryphrase,collectspaymentsfromtheMinibitsNostrdeliveryrelays,andredeemsthemintotheCashuwallet.Claimpollingissingle-flight,stateandalready-consumedtokensarewrittenatomicallywithprivatepermissions,same-secondeventsarededuplicatedwithoutbeingskipped,restoredseedscannotreuseanotherwallet's profile, and pending claims retain the service key that encrypted them across key rotations. The UI identifies Minibits as a third-party beta service and recommends small balances.</p>
<p><strong>Nostr sign-in returns directly to the app instead of a black or grey frame.</strong> The top-level signer broker now stays loaded as a 1px non-interactive surface parked physically off-screen; removing or display-hiding its full-screen cross-origin iframe could leave stale compositor pixels above IndeeHub or GitWorkshop in Android WebView and mobile Chromium until refresh. One retained broker also keeps identity selection and its immediately following signing request in a continuous UI, while Companion no longer adds a separate 180ms cover that made GitWorkshop visibly flicker.</p>
<p><strong>Gitea is sized for source and release hosting, not an empty demo.</strong> Its manifest storage allowance is now 50GiB, release attachments accept individual files up to 10GiB, container-package owner storage remains unlimited, and HTTP/HTTPS proxy uploads share a streamed 10GiB ceiling. Existing repository, package, LFS and release data is unchanged.</p>
<p><strong>Companion browser-tab signing now accepts the app gate'scompletesession.</strong>Afreshexternalbrowsernolongerneedsapriordashboardlogin/localStoragemarkerbeforethedashboard-originsignercanload.TheappgatenowissuesboththesharedHttpOnlynodesessionanditsmatchingreadableCSRFtoken,soidentitydiscoveryandsigningRPCsworkafterthatonelogininsteadofrenderingamisleading“Noidentitiesfound”state.Normaldashboardlogout/sessioncheckskeeptheirexistingbehavior.</p>
<p><strong>FastNostridentitychoicesnowsurviveappstartupandCompaniontabs.</strong>Thetab/WebViewbrokerwaitsfortheapplicationloadeventbeforeopeningitsfirst-runpicker,queueseveryNIP-07calluntilthesignerisinitialized,andhandsthejust-selectedpublickeydirectlytotheimmediateloginrequest.GitWorkshopnowturnsthatfirst-runchoiceintoitsnormalextensionaccountautomatically,eliminatingthestartupracethatsurfacedasIndeedHub's “Could not get public key from extension.”</p>
<p><strong>GitWorkshop makes network projects and Archipelago login explicit.</strong> Its signed-in dashboard now includes recent repositories from the Nostr git index, the NIP-07 action reads “Extension / Archipelago,” and explicit Archipelago logins reopen the node identity chooser instead of silently reusing the first identity. Direct, user-triggered NIP-07 logins receive the same account-switch behavior for upstream apps such as IndeedHub.</p>
<p><strong>IndeedHub tab signing now tracks the dashboard signer.</strong> The injected provider supports the contained signer broker in direct tabs, is cache-busted, and is reconciled after dashboard-only updates as well as app installs and starts.</p>
<p><strong>App launches now honor credentials everywhere.</strong> Home, Spotlight, Discover, My Apps, and app-detail launches all pass through one platform-owned credential handoff, so Portainer'sfirst-runtokenandtheFileBrowser/PhotoPrismlogindetailscannolongerbeskippedbylaunchingfromtheHomegrid.</p>
<p><strong>GitWorkshopnolongerprobesadesktop-onlylocalhostrelayorunauthenticatedmanifest.</strong>Thepackagedupstreamclientdisablesitsdefaultlocalhost:4869nostrdbprobe,usescredentialedmanifestloading,dropsdeadlookuprelays,andpermitsthedashboard's contained signer broker in its frame policy.</p>
<p><strong>Rootless app ports self-heal when pasta drops a listener.</strong> The five-minute container doctor compares every running container'sdeclaredPodmanportbindingswithactualhostlistenersandrestartsonlyacontainerwhoselistenervanished.TCPandUDParecheckedseparately,avoidingfalserestartsofservicessuchasNetBird's UDP port 3478. This covers the intermittent Nginx Proxy Manager port 8081 rebind failure without requiring a node reboot.</p>
<p><strong>Nostr identity actions now use one contained, companion-safe signing experience.</strong> The old full-screen signer has been replaced by the same in-app consent surface used by embedded apps, with the animated identity circle as a brief signing indicator and an explicit completion state. Editing an identity now ends on a dedicated success screen that reports relay coverage and the event ID instead of disappearing back into the form. The app developer guide defines this platform-owned NIP-07 flow and its browser/Companion test matrix so apps do not add a second signer UI.</p>
<p><strong>Discovery merchandising is now owned by the signed app registry.</strong> The catalog declares the Popular Apps set and contribution promotion; Discover renders two desktop rows of popular apps, then the “Your node. Your source.” banner, then the remaining apps. GitWorkshop uses a cache-busted copy of its current upstream mark, and its catalog entry identifies the canonical Archipelago maintainer npub.</p>
<p><strong>Companion opens Source in its native WebView and installs the node certificate.</strong> GitWorkshop is a top-level page in the Companion in-app browser—not a dashboard iframe—and its injected provider uses the contained, consent-gated signer broker. The generic native launcher turns relative app paths into complete URLs before handing them to Android. The Node certificate button uses Android'ssystemcredentialinstallerinthecompanioninsteadofanunsupportedWebViewdownload.</p>
<p><strong>The App Store now makes Archipelago'ssourceaninvitationtocontribute.</strong>GitWorkshophasitsrealupstreamiconandsource-focuseddescription,plusadedicated“Yournode.Yoursource.”bannerexplainingthatuserscanbrowsethecode,clonewithngit,andsendissues,patches,andreviewsoverNostr.</p>
<p><strong>SourcenowpackagesGitWorkshopinsteadofmaintainingaseparateNostrGitinterface.</strong>Thepinnedupstreamclientrunsread-onlybehindtheauthenticatedappgate,launchesatthedashboard's same origin under /app/archipelago-source/, and uses the node'sconsent-gatedNIP-07bridge.Theupstreamrevisiondeclaresnolicense;Archipelago's owner accepted that redistribution risk without representing the client as licensed. Production publication still requires a tested canonical Archipelago NIP-34/GRASP announcement.</p>
<p><strong>Changing the node password now reports a wrong current password directly.</strong> The backend was already rejecting the request before changing either the web or SSH password, but its error sanitizer replaced that safe, actionable explanation with “check server logs.” The real validation error now reaches the password dialog.</p>
<p><strong>The periodic container doctor runs from the same canonical path used by OTA updates.</strong> Its systemd unit and embedded bootstrap still pointed at the retired source-checkout path while release updates installed the script under /opt/archipelago/scripts, leaving the doctor failed on nodes without that checkout. ISO, OTA bootstrap, and the deployment smoke test now agree on the /opt path.</p>
<p><strong>Cuprate now syncs without burning a core for days.</strong> The app'sshippedconfignowenablesCuprate's checkpoint-backed fast_sync path, raises the database cache to 8 GiB, and gives the container a 10 GiB memory limit so the cache has real headroom. A live comparison that motivated the change saw the affected node sit around 45% CPU while the corrected config held near low single digits at the same chain height and block rate. The restricted RPC remains fronted through the safe app gate/Tor path.</p>
<p><strong>OpenWrt Gateway setup is documented from a real install, and two setup bugs are fixed.</strong> The new guide walks a node operator through flashing a GL.iNet AX3000 to stock OpenWrt, pairing it with Archipelago, and installing TollGate pay-as-you-go WiFi. The installer now finds opkg/apk through the router'sactualPATHinsteadofassuming/usr/bin,theUInolongersendsanemptypasswordoverasavedrouterconnection,andthepinnedTollGatepackagemovestov0.5.0withanative.apkinstallpathwhereupstreamprovidesone.</p>
<p><strong>Lightningsendsworkagain—v1.8.9's payment switch lost the fee budget.</strong> Moving payments to LND 0.21'ssupportedroute(Router.SendPaymentV2)shippedwithoutafeelimit,andthev2APItreatsanabsentlimitas<strong>zeroallowedfees</strong>:everyrealroutecarriesaroutingfee,sothepathfinderrejectedthemallandthewalletanswered"No route to the recipient"oneverysend—allday,onhealthychannelswithplentyofliquidity.Therouterdebuglogmadeitunambiguous(fee_limit=0mSAToneveryfailingwalletpayment;thesamepaymentsucceededbyhandthemomentafeelimitwasset).Paymentsnowcarrylncli's default budget (the payment amount), the wallet'samounthandlingforzero-valueinvoicesispreserved,andaunittestpinsthelimitcanneverbezeroagain.</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". Observed live: a node'sonlychannelsatunroutablefor~17hoursaftertheLND0.21.2update,withnosignofitinanydashboard.Thedaemonnowwatchesthechannelgraphasdesiredstate—everyopenchannelshouldhavealivepeer—andreconnectsanythatdon't, using the peer'sadvertisedaddresses.NodeswithoutLNDareuntouched;anunreachablepeerisretriedgently,nothammered.</p>
<p><strong>TheLightningwalletstatesthenode's real funding state instead of "you have no channel."</strong> Trying to send while a freshly opened channel was still waiting for on-chain confirmations — or when all its balance sits on the far side — raised a modal that claimed the node had NO channel at all (the outbound sum is legitimately zero in both states), pointed the user at opening a second channel, and — for payment routing failures — even showed the <em>receiving</em> copy. The funding gate now reads the channel list it already fetched: 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", a routing/liquidity payment failure says so instead of claiming channel problems, and only a genuinely channel-less node keeps the open-one guidance.</p>
<p><strong>Lightning sends work again after the LND 0.21.2 update.</strong> LND 0.21 removed the old synchronous payment route the node's backend paid through (/v1/channels/transactions) — every Lightning send answered the literal "NotFound" and the wallet showed "Paymentfailed:NotFound". The backend now pays through the supported Router.SendPaymentV2 route, keeps the same settle-then-report behaviour (a slow multi-hop payment is still tracked to completion, never falsely declared failed), and translates LND's failure reasons into plain advice. A new gate test speaks the payment route directly against the running LND, so an image/backend skew like this can never ship silently again.</p>
<p><strong>The node no longer pins HSTS — HTTP access is a supported mode, and it stays working.</strong> The HTTPS listener used to send Strict-Transport-Security: max-age=31536000; includeSubDomains; browsers that visited HTTPS once cached that and then silently upgraded the still-open HTTP dashboard's calls to HTTPS, which is a scheme change — cross-origin — so every request died as "CORSblocked/Failedtofetch" while the node was perfectly healthy. The HTTPS listener now actively clears the cached policy (max-age=0) and port 80 sends no HSTS at all, which is deliberate: the node's certificate is optional and self-signed, and devices that haven't installed the CA must keep plain-HTTP access (that's what Settings → Node certificate is for). If your browser already cached the old policy, visiting the dashboard over HTTPS once after this update clears it; a gate test now refuses any config that reintroduces the pin.</p>
<p><strong>App frames open over HTTPS again — including the ones that "didnotconnect."</strong> The launcher asked the signed catalog for each app's port policy under the name you click ("MempoolWeb", "BitcoinKnots"), but the catalog declares those ports under the manifest that owns them (the Mempool web container, Bitcoin UI). The lookup missed, the launcher handed the iframe an http:// address, and the browser blocked it as mixed content — the app tile went blank or spun forever. Port resolution now follows launch aliases (mempool-web, bitcoin-knots/bitcoin-core, lnd, electrs and friends), falls back to a port-wide catalog scan when the id is unknown, and the catalog is warmed as soon as the dashboard loads rather than only in the App Store, so the very first app you open already knows which ports serve TLS.</p>
<p><strong>Signing in to IndeeHub with Nostr works over HTTPS.</strong> The NIP-07 bridge compared the app frame's origin for exact equality with the recorded http:// app URL — a frame the browser upgraded to HTTPS (or any scheme change) was silently ignored, and replies addressed to the stale origin were refused outright, so Nostr sign-in quietly did nothing. The bridge now matches host and port (scheme intentionally ignored) and always replies to the frame's real origin.</p>
<p><strong>Nginx Proxy Manager starts again.</strong> Converting it to a platform manifest dropped two things its image needs: the /etc/letsencrypt mount its boot script hard-requires, and the NET_BIND_SERVICE capability its internal nginx needs to bind ports 80/443/81 under the orchestrator's --cap-drop=ALL. The result was an endless start/die loop (a node watched it restart 3,176 times). Both are declared in its manifest now, its certs live on unchanged under the same persistent app directory, and the signed catalog carries the fix so installed nodes heal on the next update.</p>
<p><strong>Portainer's first-run token is in the app page, not buried in "serverlogs."</strong> New Portainer versions mint a one-time setup token on a fresh install and print it only to the container logs — on an appliance that meant telling the user to go read a server log to get into their own app. The token now appears in the same launch interstitial as app login credentials (with a copy button), only while first-run setup is actually pending; once the admin account exists the card disappears on its own.</p>
<p><strong>The Lightning wallet states the node's real funding state instead of "youhavenochannel."</strong> Trying to send while a freshly opened channel was still waiting for on-chain confirmations — or when all its balance sits on the far side — raised a modal that claimed the node had no channel at all (the outbound sum is legitimately zero in both states). The funding gate now reads the channel list it already fetched: a confirming channel gets "itunlocksautomaticallyonceconfirmed,nothingisneededfromyou", a far-side balance gets "youcanreceive,butthere's nothing to send right now", a routing/liquidity payment failure says so instead of pointing at channel setup, 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>