Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5ffdcc9936 | ||
|
|
9cf07e1eac | ||
|
|
e7854702c0 |
@@ -1,5 +1,11 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## v1.8.7-alpha (2026-08-31)
|
||||||
|
|
||||||
|
- **What's New really does stop at v1.8.0 now.** 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.
|
||||||
|
|
||||||
|
- **The installer carries the same corrected release, Companion 0.5.28, and complete crash tooling.** Its artifact gate now checks the companion APK version, the v1.8.0 What's New floor, and every kdump package inside the finished ISO; `makedumpfile` is installed explicitly rather than accidentally relying on a recommended dependency that the minimal image deliberately omits.
|
||||||
|
|
||||||
## v1.8.6-alpha (2026-08-31)
|
## v1.8.6-alpha (2026-08-31)
|
||||||
|
|
||||||
- **Companion 0.5.28 is included in the node download this time, with the work that missed v1.8.5.** The companion hub can back up and restore its node list, act as a NIP-46 remote signer, and shows each paired node's FIPS mesh address with tap-to-copy. For Termux users, the included `fipssh` helper turns a durable node npub into its mesh address, so `fipssh user@npub1…` can reach SSH once that node has explicitly allowed port 22. The node-side “SSH over mesh” firewall toggle is not claimed here—it still needs implementation and remains off by default.
|
- **Companion 0.5.28 is included in the node download this time, with the work that missed v1.8.5.** The companion hub can back up and restore its node list, act as a NIP-46 remote signer, and shows each paired node's FIPS mesh address with tap-to-copy. For Termux users, the included `fipssh` helper turns a durable node npub into its mesh address, so `fipssh user@npub1…` can reach SSH once that node has explicitly allowed port 22. The node-side “SSH over mesh” firewall toggle is not claimed here—it still needs implementation and remains off by default.
|
||||||
|
|||||||
@@ -573,7 +573,7 @@ RUN mkdir -p /etc/polkit-1/rules.d && \
|
|||||||
# already-deployed nodes over OTA (idempotent no-op here once applied).
|
# already-deployed nodes over OTA (idempotent no-op here once applied).
|
||||||
RUN set -eu; \
|
RUN set -eu; \
|
||||||
apt-get update; \
|
apt-get update; \
|
||||||
apt-get install -y --no-install-recommends kdump-tools kexec-tools rasdaemon; \
|
apt-get install -y --no-install-recommends kdump-tools kexec-tools makedumpfile rasdaemon; \
|
||||||
apt-get clean; rm -rf /var/lib/apt/lists/*; \
|
apt-get clean; rm -rf /var/lib/apt/lists/*; \
|
||||||
CONF=/etc/default/kdump-tools; \
|
CONF=/etc/default/kdump-tools; \
|
||||||
sed -i 's|^#\?USE_KDUMP=.*|USE_KDUMP="1"|' "$CONF"; \
|
sed -i 's|^#\?USE_KDUMP=.*|USE_KDUMP="1"|' "$CONF"; \
|
||||||
|
|||||||
@@ -362,6 +362,17 @@ init()
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="overflow-y-auto flex-1 min-h-0 space-y-6 pr-1">
|
<div class="overflow-y-auto flex-1 min-h-0 space-y-6 pr-1">
|
||||||
|
<!-- v1.8.7-alpha -->
|
||||||
|
<div>
|
||||||
|
<div class="flex items-center gap-2 mb-3">
|
||||||
|
<span class="text-xs font-mono px-2 py-0.5 rounded bg-orange-500/20 text-orange-300">v1.8.7-alpha</span>
|
||||||
|
<span class="text-xs text-white/40">August 31, 2026</span>
|
||||||
|
</div>
|
||||||
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
||||||
|
<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, Companion 0.5.28, and complete crash tooling.</strong> Its artifact gate now checks the companion APK version, the v1.8.0 What's New floor, and every kdump package inside the finished ISO; makedumpfile is installed explicitly rather than accidentally relying on a recommended dependency that the minimal image deliberately omits.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<!-- v1.8.6-alpha -->
|
<!-- v1.8.6-alpha -->
|
||||||
<div>
|
<div>
|
||||||
<div class="flex items-center gap-2 mb-3">
|
<div class="flex items-center gap-2 mb-3">
|
||||||
@@ -459,100 +470,6 @@ init()
|
|||||||
<p><strong>The Receive window now tells you when the money is on its way.</strong> Previously it showed a QR code and left you to check elsewhere whether anything happened. Now, the moment the sender'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>
|
<p><strong>The Receive window now tells you when the money is on its way.</strong> Previously it showed a QR code and left you to check elsewhere whether anything happened. Now, the moment the sender'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>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- alpha.9 -->
|
|
||||||
<div>
|
|
||||||
<div class="flex items-center gap-2 mb-3">
|
|
||||||
<span class="text-xs font-mono px-2 py-0.5 rounded bg-white/10 text-white/60">v1.2.0-alpha.9</span>
|
|
||||||
<span class="text-xs text-white/40">Mar 18, 2026</span>
|
|
||||||
</div>
|
|
||||||
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
||||||
<div>
|
|
||||||
<h4 class="text-white font-medium mb-1">Security Hardening Complete</h4>
|
|
||||||
<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>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h4 class="text-white font-medium mb-1">7 Bugs Squashed</h4>
|
|
||||||
<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>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- alpha.8 -->
|
|
||||||
<div>
|
|
||||||
<div class="flex items-center gap-2 mb-3">
|
|
||||||
<span class="text-xs font-mono px-2 py-0.5 rounded bg-white/10 text-white/60">v1.2.0-alpha.8</span>
|
|
||||||
<span class="text-xs text-white/40">Mar 18, 2026</span>
|
|
||||||
</div>
|
|
||||||
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
||||||
<div>
|
|
||||||
<h4 class="text-white font-medium mb-1">Pentest Remediation (9/12)</h4>
|
|
||||||
<p>Fixed 9 of 12 security findings: session auth on LND connect info, DEV_MODE removed from production, ed25519 signature verification on node messages, path traversal protection, NIP-07 origin validation, AIUI session checks, strict onion validation.</p>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h4 class="text-white font-medium mb-1">UI Polish Batch</h4>
|
|
||||||
<p>Fedimint renamed to "Fedimint Guardian". Tab-launch icons. Marketplace sorts installed apps to end. Mesh mobile layout fixed. On-Chain first in receive modals. Federation shows names instead of DIDs. Cleaner iframe error screens.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- alpha.7 -->
|
|
||||||
<div>
|
|
||||||
<div class="flex items-center gap-2 mb-3">
|
|
||||||
<span class="text-xs font-mono px-2 py-0.5 rounded bg-white/10 text-white/60">v1.2.0-alpha.7</span>
|
|
||||||
<span class="text-xs text-white/40">Mar 18, 2026</span>
|
|
||||||
</div>
|
|
||||||
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
||||||
<div>
|
|
||||||
<h4 class="text-white font-medium mb-1">Marketplace & Credentials</h4>
|
|
||||||
<p>29 containers running rootless. Marketplace app aliases working. Credential injection for inter-container authentication.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- alpha.4-6 -->
|
|
||||||
<div>
|
|
||||||
<div class="flex items-center gap-2 mb-3">
|
|
||||||
<span class="text-xs font-mono px-2 py-0.5 rounded bg-white/10 text-white/60">v1.2.0-alpha.4-6</span>
|
|
||||||
<span class="text-xs text-white/40">Mar 18, 2026</span>
|
|
||||||
</div>
|
|
||||||
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
||||||
<div>
|
|
||||||
<h4 class="text-white font-medium mb-1">Rootless Podman Migration</h4>
|
|
||||||
<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>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- alpha.2-3 -->
|
|
||||||
<div>
|
|
||||||
<div class="flex items-center gap-2 mb-3">
|
|
||||||
<span class="text-xs font-mono px-2 py-0.5 rounded bg-white/10 text-white/60">v1.2.0-alpha.2-3</span>
|
|
||||||
<span class="text-xs text-white/40">Mar 18, 2026</span>
|
|
||||||
</div>
|
|
||||||
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
||||||
<div>
|
|
||||||
<h4 class="text-white font-medium mb-1">Systemd Hardening Restored</h4>
|
|
||||||
<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>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- alpha.1 -->
|
|
||||||
<div>
|
|
||||||
<div class="flex items-center gap-2 mb-3">
|
|
||||||
<span class="text-xs font-mono px-2 py-0.5 rounded bg-white/10 text-white/60">v1.2.0-alpha.1</span>
|
|
||||||
<span class="text-xs text-white/40">Mar 18, 2026</span>
|
|
||||||
</div>
|
|
||||||
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
||||||
<div>
|
|
||||||
<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>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h4 class="text-white font-medium mb-1">Off-Grid Bitcoin</h4>
|
|
||||||
<p>Receive Bitcoin block headers over mesh radio. Dead man's switch broadcasts location to trusted contacts if you go silent. GPS sharing is opt-in only.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<button @click="showReleaseNotes = false" class="glass-button w-full mt-4 py-2 text-sm shrink-0">Close</button>
|
<button @click="showReleaseNotes = false" class="glass-button w-full mt-4 py-2 text-sm shrink-0">Close</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+16
-18
@@ -1,31 +1,29 @@
|
|||||||
{
|
{
|
||||||
"changelog": [
|
"changelog": [
|
||||||
"**Cuprate — an independent Monero node — is now an app.** Monero consensus validated by a second, unrelated codebase (Rust), the same layer of security-in-depth Bitcoin gets from Knots. Review caught two problems before anything shipped: the unrestricted RPC that can move funds stayed bound to the container'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.",
|
"**Companion 0.5.28 is included in the node download this time, with the work that missed v1.8.5.** The companion hub can back up and restore its node list, act as a NIP-46 remote signer, and shows each paired node's FIPS mesh address with tap-to-copy. For Termux users, the included `fipssh` helper turns a durable node npub into its mesh address, so `fipssh user@npub1…` can reach SSH once that node has explicitly allowed port 22. The node-side “SSH over mesh” firewall toggle is not claimed here—it still needs implementation and remains off by default.",
|
||||||
"**A frozen node now explains itself — and comes back on its own.** The host now captures a memory dump into /var/crash when the kernel panics *or* 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's own updater now carries OS-level packages and settings to already-deployed machines — the crash-kernel's memory reservation is the one part that waits for a reboot, and the node says so rather than pretending.",
|
"**What's New now starts cleanly at v1.8.0 and is guaranteed to be newest-first.** 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.",
|
||||||
"**Uninstalling an app can no longer report success when it failed.** 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\".",
|
"**A release can no longer advertise itself before its files exist.** 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's New item instead of silently stopping after the first ten physical changelog lines."
|
||||||
"**Pictures to internet-only mesh contacts work now.** 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't receive. Both fixed: inline sends route over the federation when that's the only way to reach the peer, and the advice no longer offers radio-only transfers to radio-unreachable contacts.",
|
|
||||||
"**Disk cleanup finally has honest numbers.** 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's supposed to kick in at 90% never triggered and stale container images piled up unnoticed. Reserved space now counts as used, which is what the threshold was always meant to measure."
|
|
||||||
],
|
],
|
||||||
"components": [
|
"components": [
|
||||||
{
|
{
|
||||||
"current_version": "1.8.5-alpha",
|
"current_version": "1.8.6-alpha",
|
||||||
"download_url": "https://source.archipelago-foundation.org/lfg2025/archy/releases/download/v1.8.5-alpha/archipelago",
|
"download_url": "https://source.archipelago-foundation.org/lfg2025/archy/releases/download/v1.8.6-alpha/archipelago",
|
||||||
"name": "archipelago",
|
"name": "archipelago",
|
||||||
"new_version": "1.8.5-alpha",
|
"new_version": "1.8.6-alpha",
|
||||||
"sha256": "54e91944c6395a53c8ac87ea97f61e8a7fc5ffd133f017180931ba4fa9566239",
|
"sha256": "6171e1f46b0e2c2754a18e668f16810338a09b71a68dc365d65173ca1e4d400a",
|
||||||
"size_bytes": 63934504
|
"size_bytes": 63930112
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"current_version": "1.8.5-alpha",
|
"current_version": "1.8.6-alpha",
|
||||||
"download_url": "https://source.archipelago-foundation.org/lfg2025/archy/releases/download/v1.8.5-alpha/archipelago-frontend-1.8.5-alpha.tar.gz",
|
"download_url": "https://source.archipelago-foundation.org/lfg2025/archy/releases/download/v1.8.6-alpha/archipelago-frontend-1.8.6-alpha.tar.gz",
|
||||||
"name": "archipelago-frontend-1.8.5-alpha.tar.gz",
|
"name": "archipelago-frontend-1.8.6-alpha.tar.gz",
|
||||||
"new_version": "1.8.5-alpha",
|
"new_version": "1.8.6-alpha",
|
||||||
"sha256": "a5d773e8225bfd8a34dfc74acf38bdc2c39bc138c62bf9f4137d0efd72cce3e9",
|
"sha256": "1a5b54c516f91a4ea4491e08182f0f9521ee7e27935388814007f91695f06e0f",
|
||||||
"size_bytes": 97657151
|
"size_bytes": 97769923
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"release_date": "2026-08-31",
|
"release_date": "2026-08-31",
|
||||||
"signature": "f0bcec4935588ee428ebabfbb6e08e00dbd42202af92763073a7f98f4785925ca3565bf96fecbdd1695eff77fcf906783fd9053d82730b11c75441c6f5a60b05",
|
"signature": "c21dc5cb5a6caa3253c08835b65d0417a312bc8c51acdf92df990ad2110ae762b77287c479a523a8521827ec7b4695114ff9c39924cf1d30d0d622abb53b9208",
|
||||||
"signed_by": "did:key:z6Mkfu5LT8d4DjETtrkATvHh9Dvcbnr7zBCUwfau8Sw7DLWT",
|
"signed_by": "did:key:z6Mkfu5LT8d4DjETtrkATvHh9Dvcbnr7zBCUwfau8Sw7DLWT",
|
||||||
"version": "1.8.5-alpha"
|
"version": "1.8.6-alpha"
|
||||||
}
|
}
|
||||||
|
|||||||
+16
-18
@@ -1,31 +1,29 @@
|
|||||||
{
|
{
|
||||||
"changelog": [
|
"changelog": [
|
||||||
"**Cuprate — an independent Monero node — is now an app.** Monero consensus validated by a second, unrelated codebase (Rust), the same layer of security-in-depth Bitcoin gets from Knots. Review caught two problems before anything shipped: the unrestricted RPC that can move funds stayed bound to the container'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.",
|
"**Companion 0.5.28 is included in the node download this time, with the work that missed v1.8.5.** The companion hub can back up and restore its node list, act as a NIP-46 remote signer, and shows each paired node's FIPS mesh address with tap-to-copy. For Termux users, the included `fipssh` helper turns a durable node npub into its mesh address, so `fipssh user@npub1…` can reach SSH once that node has explicitly allowed port 22. The node-side “SSH over mesh” firewall toggle is not claimed here—it still needs implementation and remains off by default.",
|
||||||
"**A frozen node now explains itself — and comes back on its own.** The host now captures a memory dump into /var/crash when the kernel panics *or* 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's own updater now carries OS-level packages and settings to already-deployed machines — the crash-kernel's memory reservation is the one part that waits for a reboot, and the node says so rather than pretending.",
|
"**What's New now starts cleanly at v1.8.0 and is guaranteed to be newest-first.** 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.",
|
||||||
"**Uninstalling an app can no longer report success when it failed.** 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\".",
|
"**A release can no longer advertise itself before its files exist.** 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's New item instead of silently stopping after the first ten physical changelog lines."
|
||||||
"**Pictures to internet-only mesh contacts work now.** 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't receive. Both fixed: inline sends route over the federation when that's the only way to reach the peer, and the advice no longer offers radio-only transfers to radio-unreachable contacts.",
|
|
||||||
"**Disk cleanup finally has honest numbers.** 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's supposed to kick in at 90% never triggered and stale container images piled up unnoticed. Reserved space now counts as used, which is what the threshold was always meant to measure."
|
|
||||||
],
|
],
|
||||||
"components": [
|
"components": [
|
||||||
{
|
{
|
||||||
"current_version": "1.8.5-alpha",
|
"current_version": "1.8.6-alpha",
|
||||||
"download_url": "https://source.archipelago-foundation.org/lfg2025/archy/releases/download/v1.8.5-alpha/archipelago",
|
"download_url": "https://source.archipelago-foundation.org/lfg2025/archy/releases/download/v1.8.6-alpha/archipelago",
|
||||||
"name": "archipelago",
|
"name": "archipelago",
|
||||||
"new_version": "1.8.5-alpha",
|
"new_version": "1.8.6-alpha",
|
||||||
"sha256": "54e91944c6395a53c8ac87ea97f61e8a7fc5ffd133f017180931ba4fa9566239",
|
"sha256": "6171e1f46b0e2c2754a18e668f16810338a09b71a68dc365d65173ca1e4d400a",
|
||||||
"size_bytes": 63934504
|
"size_bytes": 63930112
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"current_version": "1.8.5-alpha",
|
"current_version": "1.8.6-alpha",
|
||||||
"download_url": "https://source.archipelago-foundation.org/lfg2025/archy/releases/download/v1.8.5-alpha/archipelago-frontend-1.8.5-alpha.tar.gz",
|
"download_url": "https://source.archipelago-foundation.org/lfg2025/archy/releases/download/v1.8.6-alpha/archipelago-frontend-1.8.6-alpha.tar.gz",
|
||||||
"name": "archipelago-frontend-1.8.5-alpha.tar.gz",
|
"name": "archipelago-frontend-1.8.6-alpha.tar.gz",
|
||||||
"new_version": "1.8.5-alpha",
|
"new_version": "1.8.6-alpha",
|
||||||
"sha256": "a5d773e8225bfd8a34dfc74acf38bdc2c39bc138c62bf9f4137d0efd72cce3e9",
|
"sha256": "1a5b54c516f91a4ea4491e08182f0f9521ee7e27935388814007f91695f06e0f",
|
||||||
"size_bytes": 97657151
|
"size_bytes": 97769923
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"release_date": "2026-08-31",
|
"release_date": "2026-08-31",
|
||||||
"signature": "f0bcec4935588ee428ebabfbb6e08e00dbd42202af92763073a7f98f4785925ca3565bf96fecbdd1695eff77fcf906783fd9053d82730b11c75441c6f5a60b05",
|
"signature": "c21dc5cb5a6caa3253c08835b65d0417a312bc8c51acdf92df990ad2110ae762b77287c479a523a8521827ec7b4695114ff9c39924cf1d30d0d622abb53b9208",
|
||||||
"signed_by": "did:key:z6Mkfu5LT8d4DjETtrkATvHh9Dvcbnr7zBCUwfau8Sw7DLWT",
|
"signed_by": "did:key:z6Mkfu5LT8d4DjETtrkATvHh9Dvcbnr7zBCUwfau8Sw7DLWT",
|
||||||
"version": "1.8.5-alpha"
|
"version": "1.8.6-alpha"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
{
|
|
||||||
"changelog": [
|
|
||||||
"**Companion 0.5.28 is included in the node download this time, with the work that missed v1.8.5.** The companion hub can back up and restore its node list, act as a NIP-46 remote signer, and shows each paired node's FIPS mesh address with tap-to-copy. For Termux users, the included `fipssh` helper turns a durable node npub into its mesh address, so `fipssh user@npub1…` can reach SSH once that node has explicitly allowed port 22. The node-side “SSH over mesh” firewall toggle is not claimed here—it still needs implementation and remains off by default.",
|
|
||||||
"**What's New now starts cleanly at v1.8.0 and is guaranteed to be newest-first.** 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.",
|
|
||||||
"**A release can no longer advertise itself before its files exist.** 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's New item instead of silently stopping after the first ten physical changelog lines."
|
|
||||||
],
|
|
||||||
"components": [
|
|
||||||
{
|
|
||||||
"current_version": "1.8.6-alpha",
|
|
||||||
"download_url": "https://source.archipelago-foundation.org/lfg2025/archy/releases/download/v1.8.6-alpha/archipelago",
|
|
||||||
"name": "archipelago",
|
|
||||||
"new_version": "1.8.6-alpha",
|
|
||||||
"sha256": "6171e1f46b0e2c2754a18e668f16810338a09b71a68dc365d65173ca1e4d400a",
|
|
||||||
"size_bytes": 63930112
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"current_version": "1.8.6-alpha",
|
|
||||||
"download_url": "https://source.archipelago-foundation.org/lfg2025/archy/releases/download/v1.8.6-alpha/archipelago-frontend-1.8.6-alpha.tar.gz",
|
|
||||||
"name": "archipelago-frontend-1.8.6-alpha.tar.gz",
|
|
||||||
"new_version": "1.8.6-alpha",
|
|
||||||
"sha256": "1a5b54c516f91a4ea4491e08182f0f9521ee7e27935388814007f91695f06e0f",
|
|
||||||
"size_bytes": 97769923
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"release_date": "2026-08-31",
|
|
||||||
"signature": "c21dc5cb5a6caa3253c08835b65d0417a312bc8c51acdf92df990ad2110ae762b77287c479a523a8521827ec7b4695114ff9c39924cf1d30d0d622abb53b9208",
|
|
||||||
"signed_by": "did:key:z6Mkfu5LT8d4DjETtrkATvHh9Dvcbnr7zBCUwfau8Sw7DLWT",
|
|
||||||
"version": "1.8.6-alpha"
|
|
||||||
}
|
|
||||||
@@ -165,16 +165,35 @@ else
|
|||||||
sudo rm -rf "$TMPBIN"
|
sudo rm -rf "$TMPBIN"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ── Frontend payload present ─────────────────────────────────────────
|
# ── Frontend + companion payload ─────────────────────────────────────
|
||||||
if [ -f "$MNT/archipelago/web-ui/index.html" ]; then
|
WEB_UI="$MNT/archipelago/web-ui"
|
||||||
|
if [ -f "$WEB_UI/index.html" ]; then
|
||||||
ok "frontend payload (archipelago/web-ui/index.html)"
|
ok "frontend payload (archipelago/web-ui/index.html)"
|
||||||
if [ -f "$MNT/archipelago/web-ui/aiui/index.html" ]; then
|
if [ -f "$WEB_UI/aiui/index.html" ]; then
|
||||||
ok "AIUI included in frontend payload"
|
ok "AIUI included in frontend payload"
|
||||||
else
|
else
|
||||||
warn "AIUI missing from archipelago/web-ui (verify rootfs copy before shipping)"
|
bad "AIUI missing from archipelago/web-ui"
|
||||||
|
fi
|
||||||
|
|
||||||
|
COMPANION_META="$WEB_UI/packages/archipelago-companion.json"
|
||||||
|
COMPANION_APK="$WEB_UI/packages/archipelago-companion.apk"
|
||||||
|
if [ -s "$COMPANION_APK" ] && [ "$(jq -r '.versionName // empty' "$COMPANION_META" 2>/dev/null)" = "0.5.28" ] \
|
||||||
|
&& [ "$(jq -r '.versionCode // empty' "$COMPANION_META" 2>/dev/null)" = "48" ]; then
|
||||||
|
ok "Companion 0.5.28 (versionCode 48) APK included"
|
||||||
|
else
|
||||||
|
bad "Companion 0.5.28 APK/metadata missing or stale"
|
||||||
|
fi
|
||||||
|
|
||||||
|
SETTINGS_BUNDLE="$(grep -rlF "v$EXPECTED_VERSION" "$WEB_UI/assets" 2>/dev/null | head -1)"
|
||||||
|
if [ -n "$SETTINGS_BUNDLE" ] \
|
||||||
|
&& grep -qF 'v1.8.0-alpha' "$SETTINGS_BUNDLE" \
|
||||||
|
&& ! grep -qE 'v1\.[0-7]\.|v1\.2\.0-alpha' "$SETTINGS_BUNDLE"; then
|
||||||
|
ok "What's New is v1.8.6-first with a v1.8.0 history floor"
|
||||||
|
else
|
||||||
|
bad "What's New payload is missing v1.8 history or still contains pre-v1.8 entries"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
warn "no archipelago/web-ui payload on ISO (frontend may live in rootfs.tar only)"
|
bad "no archipelago/web-ui payload on ISO"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo
|
echo
|
||||||
|
|||||||
@@ -73,10 +73,15 @@ def undated_versions():
|
|||||||
|
|
||||||
|
|
||||||
def ordered_versions():
|
def ordered_versions():
|
||||||
"""Return modal versions in display order (top to bottom)."""
|
"""Return generated modal versions in display order (top to bottom)."""
|
||||||
return re.findall(r"<!-- (v\d+\.\d+\.\d+\S*) -->", MODAL.read_text())
|
return re.findall(r"<!-- (v\d+\.\d+\.\d+\S*) -->", MODAL.read_text())
|
||||||
|
|
||||||
|
|
||||||
|
def legacy_blocks():
|
||||||
|
"""Return old hand-written alpha blocks that predate generated markers."""
|
||||||
|
return re.findall(r"<!-- (alpha\.[^ ]+) -->", MODAL.read_text())
|
||||||
|
|
||||||
|
|
||||||
def version_key(version):
|
def version_key(version):
|
||||||
match = re.match(r"v(\d+)\.(\d+)\.(\d+)", version)
|
match = re.match(r"v(\d+)\.(\d+)\.(\d+)", version)
|
||||||
return tuple(map(int, match.groups()))
|
return tuple(map(int, match.groups()))
|
||||||
@@ -85,7 +90,10 @@ def version_key(version):
|
|||||||
def sort_modal_blocks(entries):
|
def sort_modal_blocks(entries):
|
||||||
"""Re-render current release-note blocks newest-first and remove old history."""
|
"""Re-render current release-note blocks newest-first and remove old history."""
|
||||||
lines = MODAL.read_text().splitlines(keepends=True)
|
lines = MODAL.read_text().splitlines(keepends=True)
|
||||||
marker = re.compile(r"^\s*<!-- (v\d+\.\d+\.\d+\S*) -->\s*$")
|
# Include the old hand-written `alpha.*` blocks in the replace range so
|
||||||
|
# normalization can delete them. Previously the checker saw only generated
|
||||||
|
# vX.Y.Z markers and falsely claimed the v1.8.0 history floor was enforced.
|
||||||
|
marker = re.compile(r"^\s*<!-- ((?:v\d+\.\d+\.\d+\S*)|(?:alpha\.[^ ]+)) -->\s*$")
|
||||||
blocks = []
|
blocks = []
|
||||||
|
|
||||||
for start, line in enumerate(lines):
|
for start, line in enumerate(lines):
|
||||||
@@ -115,7 +123,10 @@ def sort_modal_blocks(entries):
|
|||||||
raise RuntimeError("unexpected content between What's New release blocks")
|
raise RuntimeError("unexpected content between What's New release blocks")
|
||||||
|
|
||||||
by_version = {entry["ver"]: entry for entry in entries}
|
by_version = {entry["ver"]: entry for entry in entries}
|
||||||
retained = [b for b in blocks if version_key(b[2]) >= MIN_VISIBLE_VERSION]
|
retained = [
|
||||||
|
b for b in blocks
|
||||||
|
if b[2].startswith("v") and version_key(b[2]) >= MIN_VISIBLE_VERSION
|
||||||
|
]
|
||||||
sorted_segments = [
|
sorted_segments = [
|
||||||
render_block(by_version[b[2]]).splitlines(keepends=True)
|
render_block(by_version[b[2]]).splitlines(keepends=True)
|
||||||
if b[2] in by_version else b[3]
|
if b[2] in by_version else b[3]
|
||||||
@@ -181,6 +192,7 @@ def main():
|
|||||||
expected_order = sorted(displayed, key=version_key, reverse=True)
|
expected_order = sorted(displayed, key=version_key, reverse=True)
|
||||||
out_of_order = displayed != expected_order
|
out_of_order = displayed != expected_order
|
||||||
too_old = [v for v in displayed if version_key(v) < MIN_VISIBLE_VERSION]
|
too_old = [v for v in displayed if version_key(v) < MIN_VISIBLE_VERSION]
|
||||||
|
too_old.extend(legacy_blocks())
|
||||||
|
|
||||||
if not missing and not out_of_order and not too_old:
|
if not missing and not out_of_order and not too_old:
|
||||||
changed = False if check else sort_modal_blocks(entries)
|
changed = False if check else sort_modal_blocks(entries)
|
||||||
|
|||||||
Reference in New Issue
Block a user