<p>SettingsWhat's New is caught up again. The modal now includes the missing entries for v1.7.68-alpha through v1.7.71-alpha instead of stopping at v1.7.67-alpha.</p>
<p>The release lockfile metadata is also kept in sync with the previous release bump.</p>
<p>NetBird stack installs now create the exact persistent data directory before binding it into the server container, fixing the failed install path seen on the test node.</p>
<p>NetBird start and restart actions bring up the control-plane server before the dashboard, so lifecycle actions use the correct dependency order.</p>
<p>App-session fallbacks now return to My Apps under /dashboard, mobile iframe-blocked apps stay inside Archipelago with an explicit fallback, and installed Gitea containers show the packaged Gitea icon with rounder app icon masks.</p>
<p>NetBird was corrected from the peer/client daemon image to the self-hosted control-plane stack, with a launchable dashboard on port 8087, management/signal/relay server on 8086, and STUN on UDP 3478.</p>
<p>Local app launches use direct host ports and carry an explicit dashboard return target, so closing an app session goes back to the launching dashboard screen instead of falling through to browser history or a 404.</p>
<p>Mobile launches ignore stale desktop panel state and route into the full app-session webview. The desktop sidebar also keeps top and bottom regions pinned while only the middle navigation scrolls on short screens.</p>
<p>App installs now allow up to 10 minutes for slow initial install RPCs, matching large container pulls and preventing apps from disappearing from My Apps while the backend is still pulling or retrying mirrors.</p>
<p>Gitea is now categorized as a known Data app and stays visible during slow registry pulls. Live diagnostics confirmed the Gitea container came up healthy on port 3001 after the frontend had previously timed out too early.</p>
<p>NetBird was added to the catalog as a recommended networking app, and the Archipelago terminal includes nano on new installs and existing-node self-update fallback.</p>
<p>BTCPay Server now ships on the official btcpayserver image, fixing the plugin catalog crash caused by newer plugin dependency metadata while preserving existing data and Postgres databases.</p>
<p>BTCPay health checks no longer require curl inside the container, and Nginx Proxy Manager certificate challenge handling now avoids hijacking local API traffic while syncing issued public proxy hosts into host nginx.</p>
<p>System Update confirmation and mirror modals now cover the whole app, app-session close returns to the previous dashboard screen, and mobile app launches stay inside Archipelago'sapp-sessionwebview.</p>
<p>Home,Web5Monitoring,andthefullMonitoringpagenowagreeontheheadlineCPU,memory,disk,uptime,andloadnumbers.TheUIusesonelivesystem-statsnapshotforthevisiblecardswhilekeepingtheMonitoringpage's historical store for charts, alerts, and container history.</p>
<p>MobileapplaunchingnowkeepsknowncontainerappsinsideArchipelago's app-session flow instead of forcing desktop-only new-tab behavior.</p>
<p>App sessions on mobile respect the status-bar safe area, while the fullscreen backdrop remains edge-to-edge. The Apps page also gained a compact sideload button and modal for trusted Docker images.</p>
<p>Sideloaded app title and description metadata now persist through backend app config, and Meshtastic contact discovery retries config sync when the radio contact cache is empty.</p>
<p>Mesh networking now supports Meshtastic radios over the serial API alongside existing MeshCore Companion USB radios. The shared listener probes preferred and auto-detected serial paths for both firmware families.</p>
<p>Meshtastic text packets are translated into Archipelago'sexistingmeshframepipeline,andMeshtasticnodeinformationappearsasnormalmeshcontactsusingstablesyntheticpublickeys.</p>
<p>Installprogressbaractuallyreflectsrealitynow.Itpreviouslystayedat0%untiltheveryendbecausepodmandoesn't emit parseable progress when run without a TTY. Replaced byte-counting with seven clearly-labelled phases — Preparing, Pulling image, Creating container, Starting, Waiting for health, Finalizing, Done — each mapped to a fixed percentage so the bar only moves forward.</p>
<p>Launch button now appears the moment an install finishes, instead of waiting up to 60 seconds for the next container scan. After a successful install or update, the backend kicks the scanner and waits for a fresh manifest to land before flipping the app to Running, so the UI always has real port and UI-route info by the time the card becomes clickable.</p>
<p>Retired the decommissioned .23 Hetzner VPS mirror. New nodes default to OVH (146.59.87.168) as Server 1 and tx1138 as Server 2 for both system updates and the app registry. Existing nodes auto-purge any saved .23 entries on next load so they stop paying connection-timeout penalties against a dead host.</p>
<p>Update-available badges and version comparisons work again across every app. The backend was looking for its pinned-image catalog at the wrong path and silently getting an empty result on deployed nodes, which meant the UI never showed "update available" even when a newer image was ready. The search path now matches where the image recipe actually installs the file.</p>
<p>Nodes with a 2 TB data drive are no longer silently configured as pruned Bitcoin nodes. The disk-size check that decides whether to enable pruning was measuring the tiny OS partition instead of the large encrypted data partition, so every archy install with a separate data volume was flipping into prune=550 mode on reconcile and deleting its historical blocks on the next bitcoin-knots restart. The check now measures the actual data partition, so full-archive nodes stay full-archive.</p>
<p>Recovery from a failed update no longer leaves a container permanently missing. When an app update failed partway through, the rollback path tried to restart the old container by name even though the forward path had already deleted it, leaving a hole in the node that required manual intervention. The reconcile tool now supports a --create-missing flag that rebuilds any registered container from its canonical spec, giving the update flow a safe recovery path.</p>
<p>OTA self-updates now refresh the container-reconcile helper scripts alongside the backend and frontend. Previously, updates only shipped new versions of the backend binary and web UI while the reconcile scripts stayed frozen at whatever version was baked into the original ISO — which meant fixes to those scripts (including the two above) never actually reached existing nodes. Every self-update now installs the latest reconcile-containers.sh, container-specs.sh, and image-versions.sh to /opt/archipelago/scripts/.</p>
<p>The container-install audit log is now actually written to disk. The backend runs as an unprivileged user and was trying to append every install, update, and lifecycle event to /var/log/archipelago-container-installs.log — a path only root can create. Every write failed silently, so the log stayed empty on every node. Logs now land at /var/log/archipelago/container-installs.log, a directory pre-created at boot and on self-update with the right ownership, and they rotate daily under the existing logrotate rule.</p>
<p>Mesh messages larger than one LoRa frame are no longer corrupted. The chunked-payload encoder was writing its 4-byte length header on top of the first 4 bytes of user data before running Reed-Solomon, so bytes 0 through 3 of every multi-chunk payload were lost in transit. The encoder now reserves the header up front, copies the data after it, and runs the forward-error-correction pass once, so chunked mesh payloads now round-trip intact.</p>
<p>Avatars no longer crash the backend on certain identities. The hue and accent colour computation multiplied a 16-bit seed byte by 360, which overflows for any seed value of 182 or greater. Debug builds panicked outright, release builds silently wrapped and drew the wrong colour. The math now runs in 32-bit space so every possible seed renders correctly.</p>
<p>Mesh outbox entries with a zero-second TTL now expire immediately instead of lingering forever. The expiry check used a strict greater-than comparison, so a message whose age had not yet ticked over one second was considered live even when its TTL was set to zero. It now uses greater-or-equal, matching the intuitive meaning of TTL.</p>
<p>The pinned-image parser no longer treats arbitrary environment-style keys as container images. The loader retained every key ending in _IMAGE regardless of the value, which meant a stray variable like NOT_AN_IMAGE="something" would be registered as a pinned image and pollute version checks. The parser now requires the value to look like an actual image reference (a registry path with a tag) before accepting it.</p>
<p>The AI Assistant tab no longer disappears after updates. Self-updates rebuilt the frontend from source and then used rsync --delete to swap it into place while passing --exclude aiui to preserve the existing bundle; that worked only as long as a previous install had already put AIUI on disk. Any node whose web UI directory got replaced wholesale (including by a manual redeploy of just the dist tarball) lost AIUI entirely and the AI Assistant tab fell through to a "needs to be enabled" placeholder. Every update and every ISO build now ships the canonical AIUI bundle from demo/aiui in the repo, so AIUI is a first-class versioned part of each release and cannot be wiped by a swap.</p>
<p>Bitcoin dashboards no longer flicker errors during initial chain sync. When bitcoind is busy validating a fresh block it can take up to 10 seconds to answer RPC — the old code gave up after exactly 10 seconds, so any call that landed during that window surfaced as a failure even though the node was perfectly healthy. The RPC client now retries transient timeouts transparently (3 attempts, ~500ms + 1500ms backoff between them) and only surfaces errors that bitcoind itself reported. Connection refused is still fast-failed so genuinely-dead bitcoinds are reported in under a second.</p>
<p>Updates now self-check. After an update lands, the node probes its own web UI through nginx — if the frontend isn'tansweringcleanlywithin90seconds,thenodeautomaticallyrollsbacktothepreviousversionandrestarts.Abadreleasecannolongerleavethefleetstrandedonanunreachablenode.</p>
<p>Properfixforthe500/InternalServerErrorafterupdate.Thev1.7.38andv1.7.39frontendarchiveshadthewrongpermissionsbakedintothearchiveitself—thetarball's root directory entry was private, so every node that extracted it ended up with a web UI directory nginx couldn'tread.v1.7.40packagesthearchivewithcorrectworld-readablepermissionsfromthestart,sononodeeverseesthe500again.</p>
<p>Hotfixforv1.7.38—onsomenodestheupdatelandedwiththewebUIdirectorysettoprivatefilepermissions,songinxreturneda500/"Internal Server Error"oneverypage.Thisreleasefixestheupdatertosetworld-readablepermissionsonthenewfrontend,andthenodealsonowself-healsonbootifiteverfindstheUIdirectoryinthatstateagain.</p>
<p>Signinginisquietnow.Theintromusic,welcomevoice,andtransitionsoundsbelongtothefirst-bootcinematicandonlyplaybeforeyou've finished onboarding — every login after that is silent. Typing sounds in the search bar and on the dashboard are unaffected.</p>
<p>Fixed a bug where clearing your browser cache, updating the node, or rebooting could bounce you back through the onboarding wizard even though your node was already fully set up. The node now self-heals: if your password is set, it knows you'vebeenthroughonboardingandtakesyoustraighttotheloginscreen.Nomorestartingover.</p>
<p>TrimmedtheAppStore.FIPS,NostrRelay,NostrVPN,Routstr,andPenpothavebeenremovedfromthecatalogandtheircontainerimagesdeletedfromourregistries.Yournode's native FIPS transport is untouched — this is just the app-store entries going away.</p>
<p>Bitcoin Core (the reference implementation) now installs from the App Store and runs cleanly alongside Bitcoin Knots as a first-class option. The install flow pulls the official docker.io/bitcoin image directly if your internal mirrors don'tcarryit,andthenodeUIauto-detectswhichimplementationisrunningsothelogo,title,andversionlineallreflectCorevs.Knotswithoutanymanualconfig.</p>
<p>TheAppStorecatalogfetchnowfollowswhichevercontainerregistriesyou've set as primary in Settings. Previously the catalog URL was hardcoded to two servers; now the operator'sownmirrorprioritydriveswheretheAppStorepullsitslistingsfrom,soswitchingprimaryactuallymovesthecatalogtoo.</p>
<p>Rootless-netnsself-heal:ifthecontainernetworklosesitsoutboundtap(symptom:BitcoinKnotsandotheroutboundcontainerscan't reach the internet even though container-to-container still works), the node now detects it and restarts the network from scratch on its own. No more having to SSH in and bounce podman.</p>
<p>Every app card on the Apps page now has an Update button whenever a newer version of the app is available — same flow as the detail view, one click away. Updating apps used to require drilling into each card individually.</p>
<p>Theloginbackgroundnowrotatesthroughsixatmosphericimages,advancingoneeachtimeyoulandontheloginscreen,soreturningtoyournodedoesn't keep showing the same wallpaper. The chosen index is remembered across logouts.</p>
<p>Re-logging in is noticeably snappier. The dashboard entry animation used to replay the full 1.2-second zoom reveal on every login; that'snowreservedforthefirstentryafteronboarding.Subsequentloginsfadeinwithjustthewelcometypinginabout300ms.</p>
<p>Ifyouclearsitedataonanodeyou've already onboarded, the intro video no longer fires again on the login screen. The onboarding cache is re-seeded from the backend automatically, so /login stays quiet instead of replaying the whole intro sequence.</p>
<p>The onboarding wizard no longer gets skipped on genuinely-fresh nodes when you connect from a browser that onboarded a different node earlier. The backend is now the source of truth for "has this node been onboarded yet?" — the browser'slocalflagistheofflinefallback,nottheprimaryanswer.</p>
<p>Upgradingnodesnowpickupthisrelease's UI cleanly without a stale cache hanging on. A cache-version bump tells your browser'sserviceworkertoditchtheoldbundleonfirstload.</p>
<p>Hotfix:v1.7.31's frontend tarball was packaged with an extra wrapper directory, which left some nodes serving 403/500 after applying the update instead of the new UI. This release ships the tarball with the correct flat layout, and broken nodes heal automatically when this update applies.</p>
<p>Updates now finalize cleanly instead of being force-killed by systemd. Previously the node logged "shut down cleanly" during an update, then systemd waited 15 seconds and SIGKILL'dtheservicebecauseoneoftheinternalthreadswasn't releasing. That'sbeentrackeddownandfixed,sotheserviceexitspromptlyandtherestartpathissnappier.</p>
<p>IndeedHubinstallisnowidempotent—re-runningitafterafailedfirstattemptnolongerleavesorphanedcontainersblockingtheretrywitha"name already in use"error.Theinstallerforce-cleansleftovercontainersandthededicatednetworkbeforestartingafreshstack.</p>
<p>The reachability test on the Registries page no longer reports false "unreachable" for Gitea-backed registries. The probe now hits the Docker V2 API at the correct host-root path and accepts HTTP 405 in addition to 200/401 as "registry alive".</p>
<p>App installs now show a real download progress bar — same accuracy as the system update bar. You'llsee"Downloading: 50.5 / 200.0 MB (25%)"withalivepercentageinsteadofagenericspinner.Thebarkeepsstreamingevenwhentheinstallfallsbackfromoneregistrytoanother,soyou'll never see a "stuck at 0%" again.</p>
<p>Uninstalls now show what'sactuallyhappening:"Stopping containers (2/5)","Cleaning up volumes","Removing app data"—labelledperappsoyoucanfireoffmultipleuninstallsinparallelandwatcheachone's stage on its own card.</p>
<p>OVH (146.59.87.168) is now baked in as Server 3 by default for both updates and the app registry — extra mirror, completely independent network path so a single-provider outage can'ttakeeverythingdown.</p>
<p>App installs now genuinely honor the primary registry: the first pull attempt rewrites the image URL to use your primary, and only falls through to the secondary if that fails. Before, installs always hit whichever registry the image was hardcoded to.</p>
<p>Reboot screen now shows the animated "a" logo in the center of the ring — matching the screensaver'slooksoyougetsomethingnicetowatchwhilethenodecomesbackup.</p>
<p>Rebootnowshowsaproperprogressscreen.ClickRebootandyou'll see a full-screen overlay with the familiar pulsing ring animation, a rebooting / reconnecting / back-online status, and an elapsed counter — no more black screen of mystery while you wait.</p>
<p>The overlay auto-reloads the page the moment your node is back up; if it takes longer than three minutes it surfaces a manual Reload button.</p>
<p>New nodes now default to the VPS mirror as Server 1 (primary) and tx1138 as Server 2 (fallback). Existing nodes keep whatever mirror order they'vealreadyset—useSetPrimaryontheSystemUpdatepagetochangeit.</p>
<p>Everymirrorrowhasanewlightning-boltbuttonthatpingsthemirrorandshowswhetherit's reachable, plus the round-trip latency in milliseconds. No more guessing if a mirror you just added is responding.</p>
<p>The Update mirrors section got a visual refresh: Set Primary, Remove, and the new Test action are compact icon buttons instead of crowded text, and adding a mirror now happens in a dedicated dialog that matches the rest of the UI.</p>
<p>Update downloads now have a mirror list. If the primary update server is slow or unreachable, your node automatically tries the next mirror and downloads the files from there — no more waiting on a stalled server with no recourse.</p>
<p>A new 'Updatemirrors' section on the System Update page lets you see the list, add your own mirror URL, reorder which is tried first (Set primary), or remove one. The primary is tagged with a green PRIMARY pill.</p>
<p>Downloads automatically follow the mirror that served the manifest. Previously every mirror served the same manifest, and the manifest'sdownloadURLswerehardcodedtoasingleserver—soevenpickingafastermirrorcouldn't speed up the actual download. Now the backend rewrites download URLs to match whichever mirror succeeded.</p>
<p>Ships with two defaults: Server 1 (tx1138) and Server 2 (VPS). Add the URL format <code>https://host/.../releases/manifest.json</code> for custom mirrors.</p>
<p>Your node can now reach the broader FIPS public mesh, not just your own federated cluster. The FIPS daemon now binds both UDP (fast mesh forwarding) and TCP (NAT-friendly bootstrap) transports — matching the upstream factory default. The public anchor currently answers on TCP, so UDP-only nodes couldn'treachit;thisfixesthatwithoutanyactionneededonyourend.</p>
<p>Upgradingtheconfighappensautomatically.Onnextstartup,iftheinstalledFIPSyamldoesn't match the new two-transport schema, the node reinstalls and restarts the daemon so the TCP transport comes online. No manual Reconnect required.</p>
<p>Side benefit: TCP also helps on networks that block outbound UDP (corporate, some guest wifi) — your node falls back to TCP/8443 automatically and still joins the mesh.</p>
<p>Frontend updates now actually ship. Since roughly v1.7.17 the release pipeline had been rebuilding the backend every version but silently skipping the frontend bundle — a permissions issue on the build server meant vue-tsc failed before vite ever ran, and nobody noticed because the published tarballs still extracted cleanly. The result was the backend moving forward while the UI stayed frozen at its v1.7.9-era state, which is why the FIPS gear icon and the What'sNewentriesforeveryreleasesincethenhadbeenmissingonyournode.</p>
<p>Oncethisupdateapplies,yournodegetstherealv1.7.24frontend:theFIPSSeedAnchorsmodal(geariconontheFIPSMeshcard),thecurrentWhat's New history, the cancel-download button, and every other UI touch from the releases in between.</p>
<p>FIPS Seed Anchors are now one click away. A small gear icon sits next to the status pill on the FIPS Mesh card — click it to open a modal where you can add, remove, and re-apply anchors. No more needing to go digging for the card or editing JSON by hand.</p>
<p>The modal lists each anchor with its label, truncated npub, address, and transport, plus an Apply button to force-redial the full list and a Remove button per entry. The add form right below validates that the address is host:port and the npub is bech32 before saving.</p>
<p>The FIPS Reconnect and Restart buttons now work on every node, regardless of which systemd unit is actually supervising the daemon. Previously they targeted only the archipelago-managed unit — nodes that were running the upstream unit instead saw the buttons silently do nothing. Both paths now auto-detect which unit is up and act on that one.</p>
<p>The FIPS anchor status no longer shows red just because one specific public anchor is unreachable. It now lights green whenever any authenticated peer is a recognised anchor — that'seitherthepublicanchororsomethingyouaddedunderSeedAnchors.Afederatedclusterthatroutesthroughitsownseedanchorfinallyreportsthetruth.</p>
<p>Reconnectalsore-pushesyourseedanchorsaftertherestart,soyoudon't have to wait five minutes for the background apply loop to re-dial them.</p>
<p>FIPS bootstrap no longer depends on a single public anchor. You can now add your own anchors — other archipelago nodes or a VPS you control — and the node will dial every one of them to join the mesh on startup. If one anchor is down, the next one seeds the routing layer instead, so a flaky public anchor no longer strands a fresh install.</p>
<p>Anchors persist across restarts and are re-applied every five minutes, so a daemon that got temporarily isolated reconnects on its own without anyone having to SSH in. Each anchor carries an operator-editable label so you can remember which is which.</p>
<p>No behavior change if you don'tconfigureany—theupstreamdaemon's own defaults keep working as before. This purely adds an operator-controlled list on top.</p>
<p>Fixed a critical bug where nodes on the automatic daily-update schedule could end up offline after their nightly update. The scheduler was killing the service a moment too early, before the built-in restart handler had a chance to bring the new version back up — leaving the node dead until someone SSH'dinandstarteditmanually.Theschedulernowhandsoffcleanlytothesamerestartpaththe'Install Update'buttonuses,soauto-appliedupdatescomebackonlineontheirown.</p>
<p>Appliestoanynodeconfiguredfor'Check & Apply Daily'—nochangerequiredonyourend,thefixshipswiththisupdate.</p>
<p>Yournodenolongeroffersaversionyou've already passed as an "available update". If you sideload or skip a release, any stored pointer to an earlier version is dropped on next restart, and the System Update page offers only the genuinely newer release — no more seeing an older version listed as something to install.</p>
<p>Version comparison is now numeric, not alphabetic. 1.7.10 correctly outranks 1.7.9 (earlier naive string-order would have got this backwards once the patch number hits double digits), so update prompts and "up to date" checks stay accurate past the nines.</p>
<p>A stale manifest from a slow cache or proxy can no longer downgrade your node. If the manifest reports a version equal to or behind what'srunning,yournodetreatsthatas"up to date"ratherthanofferingtheolderversionasanupdate.</p>
<p>Theupdateflownowwritesclearerlogsateverystep.Startofdownload,cancel,andapplyeachemitaone-lineentrytothesystemjournalwiththestagingpathandtheaffectedfiles,soifadownloadmisbehavesonyournodeit's easy to see exactly where it got to.</p>
<p>When a download gets stuck, you can now cancel it. A new Cancel Download button sits next to the progress bar — it stops the transfer, clears the partial file, and returns you to a clean state so you can retry. No more staring at a frozen bar with no way to recover.</p>
<p>Downloads that stall for 30 seconds or more now say so. The progress bar turns amber and shows 'Downloadappearsstuck—tryCancelandstartagain' instead of just sitting silently at whatever percent it reached.</p>
<p>Canceling is fast. It no longer has to wait out the retry timer — the download bails within half a second, so you'renotstuckwatchingastuckscreenwhileyouwaittounstickit.</p>
<p>TheFederationpageauto-refresheseveryfivesecondswhileit's open. Status changes, new peers, and incoming join requests surface on their own — clicking Sync remains available for an on-demand pull.</p>
<p>Updates survive network hiccups. Downloads now resume from exactly where a dropped connection left off, and retry up to 6 times with increasing gaps between attempts, instead of restarting from byte zero or giving up.</p>
<p>The download progress bar now shows real progress. Instead of a fake number that creeps to 95% and freezes, you see the actual bytes arriving, and it continues to update correctly even if you navigate away and come back.</p>
<p>Update check itself retries on slow responses. If git.tx1138.com is momentarily overloaded, the node tries three times with a five-second wait between attempts before concluding you'reuptodate.</p>
<p>FIPSReconnectnowgenuinelytriestofixtheanchor.Itrunsaproperrecoverysequence(stop→start→waitforthebootstrapwindow→checkpeers)andtellsyouthelikelyreasonit's still unreachable — corrupt identity key, seed not unlocked, network blocking UDP, or the anchor server being down — instead of a generic 'tryagain'.</p>
<p>Healed a latent FIPS identity bug: the public-key file was being written in text form (an 'npub1…' string) on some nodes, which the daemon couldn'tparseandsilentlyauthenticatedwithagarbagekey.TheReconnectbuttonnowrewritesthefileinthecorrectbinaryformatandre-installstheconfigbeforerestarting—nodesstuckwithnopeersfor'no reason'shouldcomebackonline.</p>
<p>Installingabigapp(IndeedHub,Bitcoin,Penpot)nolongergivesupearlyandshows'didn'twork' while the download is still running in the background. The client waits up to 45 minutes for the install pipeline to finish.</p>
<p>'RollbacktoPrevious' is now labelled 'RollbackAvailable' — clearer that it'sachoiceyouhave,notastatusyou're stuck with.</p>
<p>App catalog now loads reliably. Before, the Marketplace / Discover page couldn'tfetchthecatalogofappsbecausetheupstreamhostwasn't sending the right CORS headers and the node'ssecuritypolicydidn't allow the fallback URL either. The node now fetches the catalog server-side and serves it same-origin to the browser — no more blank app lists.</p>
<p>Nothing new — version bump so freshly-installed nodes (from the 1.7.11 ISO) have something to OTA down, confirming the end-to-end update pipeline out of the box.</p>
<p>OTA proof release — first version where Install Update should run clean from the UI with no manual steps. Click it and watch the sidebar flip to 1.7.11-alpha on its own.</p>
<p>Install Update actually applies now. The installer had to write into system folders that the backend service was sandboxed out of — every earlier 'Failedtoapplyupdate' was a layer of that onion. Fixed by running the file swaps in a separate system context.</p>
<p>FIPS status on the Home and Server pages now reflects whether the public anchor is reachable. You'llsee'Active · N peers'(green)whenhealthyor'No anchor'(orange)whenthenetworkisblockingthebootstrap—samesignalasthefullFIPScard.</p>
<p>Pastinganhttps://… URL into the profile picture or banner now previews correctly. Before, if the URL failed to load, the UI would silently blank out instead of showing your initial as a placeholder.</p>
<p>InstallUpdatefinallyworksend-to-endovertheair.Theinstallerwastryingtooverwritetherunningbackendbinarywithatoolthatfailsonin-usefiles(ETXTBSY)—swappeditforanatomicrename,whichthekernelallowsonaliveexecutable.Everyprevious'Failed to apply update'attemptwasthisonerootcause.</p>
<p>InstallUpdateisnowmorerobust.Eachinstallgetsitsownuniquely-namedstagingfolderandthenmovesfilesintoplace—thepreviousversionhadasmallcleanupstepthatcouldhitatransientfilesystemhiccupandbailouthalfway.You'll also still see a rollback folder after a successful install.</p>
<p>Dev-box OTA: nodes that build archipelago from source can now opt into the standard Download → Install flow instead of Pull & Rebuild, by setting ARCHIPELAGO_UPDATE_URL in the service environment. Useful when the dev machine has a checked-out repo but you want to test the regular update path.</p>
<p>Over-the-air update test — no feature changes, just a fresh version number so your node can walk through the whole update flow end-to-end: check, download, install, auto-restart. Safe to apply; nothing to do afterwards.</p>
<p>Install Update actually installs now. Before, the final step extracted the new UI into the wrong folder and bailed with 'Failedtoapplyupdate' — your node ended up backing up cleanly but never swapping in the new files. Fixed.</p>
<p>Download progress no longer overshoots 100%. You'llseethebarclimbsmoothlyto95%andthenjumpto100%whenthedownloadactuallyfinishes.</p>
<p>InstallUpdatenowactuallyinstalls.Before,thebuttonwouldbackupyourcurrentversionthenfailwith'Failed to apply update'becausetheinstallercouldn't write into system folders.</p>
<p>Everyidentitynowgetsapersonalavatarthemomentit's created. Your main node identity gets a distinctive hexagonal-network icon; other identities get a colourful generated pattern unique to each one.</p>
<p>Profile editor: upload a profile picture and a banner, then tap Save — your Nostr profile now goes out to the relays in one step. No more 'Save' vs 'Save&Publish' confusion.</p>
<p>Profile pictures and banners you upload are now reachable by other Nostr clients across the network — not just your own browser. Anyone who sees your profile on a relay can load the image.</p>
<p>Update downloads on slow connections no longer cut out right at the end. The client waits up to 30 minutes for each component instead of giving up after 15 seconds.</p>
<p>When you move a node to a new version without going through Check for Updates (for example via a reinstall or manual copy), it now reports the new version correctly instead of endlessly saying 'updateavailable'.</p>
<p>Your VPN peers come back automatically after a reboot. No more rescanning QR codes on your phone or laptop.</p>
<p>Fresh installs stay lean — only File Browser is included out of the box. Other apps wait in the Marketplace until you pick them.</p>
<p>File Browser stops rebooting itself every few hours — the housekeeper now leaves it alone once it'shealthy.</p>
<p>One-click'Pull & Rebuild'buttonworksfornodesthatupdatefromsource(thedevelopmentpath),notjustthestandarddownloadpath.</p>
<p>NostrVPNisnowanativesystemservice.PeerdiscoveryviaNostrrelays,WireGuardtunnels.Auto-configuredwithyournode's identity during onboarding — no setup required.</p>
<p>FIPS (encrypted mesh network) and Routstr (decentralized AI inference with Cashu payments) available as installable apps. Status UIs included for headless apps.</p>
<p>Fixed backend service crash on fresh ISO installs caused by overly restrictive systemd security settings. Fresh installs now boot cleanly.</p>
</div>
<div>
<h4 class="text-white font-medium mb-1">Bootstrap from Trusted Node</h4>
<p>New installs auto-connect to a trusted Bitcoin node via Tor during initial sync. ElectrumX, LND, and BTCPay work immediately while your local chain catches up.</p>
<p>33 security findings from a comprehensive penetration test — all fixed. Backend now only accessible through nginx. Path traversal, SSRF, and XSS vulnerabilities eliminated. Federation requires cryptographic signatures. Session tokens rotate after 2FA. Destructive operations now require password confirmation.</p>
<p>Memory limits on every container prevent one app from crashing the whole system. Crashed apps now show a red "crashed" badge with a restart button instead of disappearing. Smart health status shows "starting up", "healthy", or "unhealthy" in real time. Apps you stop stay stopped — no more auto-restart fighting.</p>
</div>
<div>
<h4 class="text-white font-medium mb-1">Wallet on Home</h4>
<p>The Home dashboard now shows your Bitcoin wallet with on-chain, Lightning, and ecash balances. Send, receive, and view transaction history right from the home screen. New Transactions modal shows your full history with confirmations.</p>
<p>Mesh view redesigned. New glass button styles throughout. Restart button on running apps. Improved app status badges. Cleaner navigation on the Apps page.</p>
<p>All 12 pentest findings fixed. CSRF tokens now survive restarts. Password hashing upgraded to Argon2id. Bitcoin RPC gets a unique random password on every install. Federation messages require ed25519 signatures.</p>
<p>Random logouts fixed (P0). Uninstall dialog is now a proper full-screen modal with an "Uninstalling..." overlay. App cards no longer flicker between Start/Launch during container scans. ElectrumX index estimate corrected.</p>
</div>
<div>
<h4 class="text-white font-medium mb-1">Bitcoin Sync on Dashboard</h4>
<p>Homepage System card now shows Bitcoin Core sync progress, block height, and green/orange status indicator when Bitcoin is running.</p>
<p>Migrated all containers from root to rootless Podman. UID namespace mapping, volume ownership fixes, sysctl tuning. Bitcoin RPC verified, all web services confirmed healthy. 29 containers up and running.</p>
<p>Full systemd security sandbox restored now that containers run rootless. NoNewPrivileges, restricted namespaces, and system call filtering re-enabled. Session persistence and boot sequence fixes.</p>
<h4 class="text-white font-medium mb-1">Mesh Radio & Container Stability</h4>
<p>LoRa mesh radio auto-detects USB port changes with a new Connect button. Fixed container crash loops — all apps start cleanly and stay stable. Apps starting up show progress instead of re-appearing in the store. Tor routing enabled by default for Bitcoin and Lightning.</p>