1241 lines
106 KiB
Vue
1241 lines
106 KiB
Vue
<script setup lang="ts">
|
|
import { computed, ref, nextTick } from 'vue'
|
|
import { useI18n } from 'vue-i18n'
|
|
import { useAppStore } from '@/stores/app'
|
|
import ControllerIndicator from '@/components/ControllerIndicator.vue'
|
|
import { rpcClient } from '@/api/rpc-client'
|
|
|
|
const { t } = useI18n()
|
|
const store = useAppStore()
|
|
|
|
// Server name
|
|
const serverName = computed(() => store.serverName)
|
|
const editingServerName = ref(false)
|
|
const serverNameDraft = ref('')
|
|
const serverNameInput = ref<HTMLInputElement | null>(null)
|
|
|
|
function startEditServerName() {
|
|
serverNameDraft.value = serverName.value
|
|
editingServerName.value = true
|
|
nextTick(() => serverNameInput.value?.select())
|
|
}
|
|
|
|
async function saveServerName() {
|
|
const name = serverNameDraft.value.trim()
|
|
if (!name || name === serverName.value) {
|
|
editingServerName.value = false
|
|
return
|
|
}
|
|
try {
|
|
await rpcClient.call({ method: 'server.set-name', params: { name } })
|
|
store.updateServerName(name)
|
|
} catch (e) {
|
|
if (import.meta.env.DEV) console.error('Failed to rename server:', e)
|
|
}
|
|
editingServerName.value = false
|
|
}
|
|
|
|
// Version & release notes
|
|
const version = computed(() => store.serverInfo?.version || '0.0.0')
|
|
const showReleaseNotes = ref(false)
|
|
|
|
// Identity
|
|
const serverTorAddressFromStore = computed(() => store.serverInfo?.['tor-address'] || null)
|
|
const torAddressFromRpc = ref<string | null>(null)
|
|
const serverTorAddress = computed(() => serverTorAddressFromStore.value || torAddressFromRpc.value)
|
|
const userDid = computed(() => {
|
|
try {
|
|
return localStorage.getItem('neode_did') || null
|
|
} catch {
|
|
return null
|
|
}
|
|
})
|
|
|
|
const copiedOnion = ref(false)
|
|
const copiedDid = ref(false)
|
|
let copiedTimer: ReturnType<typeof setTimeout> | null = null
|
|
|
|
async function copyOnionAddress() {
|
|
const addr = serverTorAddress.value
|
|
if (!addr) return
|
|
try {
|
|
await navigator.clipboard.writeText(addr)
|
|
} catch {
|
|
const ta = document.createElement('textarea')
|
|
ta.value = addr
|
|
ta.style.position = 'fixed'
|
|
ta.style.opacity = '0'
|
|
document.body.appendChild(ta)
|
|
ta.select()
|
|
document.execCommand('copy')
|
|
document.body.removeChild(ta)
|
|
}
|
|
copiedOnion.value = true
|
|
if (copiedTimer) clearTimeout(copiedTimer)
|
|
copiedTimer = setTimeout(() => { copiedOnion.value = false }, 2000)
|
|
}
|
|
|
|
async function copyDid() {
|
|
if (!userDid.value) return
|
|
try {
|
|
await navigator.clipboard.writeText(userDid.value)
|
|
} catch {
|
|
const ta = document.createElement('textarea')
|
|
ta.value = userDid.value
|
|
ta.style.position = 'fixed'
|
|
ta.style.opacity = '0'
|
|
document.body.appendChild(ta)
|
|
ta.select()
|
|
document.execCommand('copy')
|
|
document.body.removeChild(ta)
|
|
}
|
|
copiedDid.value = true
|
|
setTimeout(() => { copiedDid.value = false }, 2000)
|
|
}
|
|
|
|
// Load Tor address on mount if not in store
|
|
async function init() {
|
|
if (!serverTorAddressFromStore.value) {
|
|
try {
|
|
const res = await rpcClient.getTorAddress()
|
|
torAddressFromRpc.value = res.tor_address ?? null
|
|
} catch (e) {
|
|
if (import.meta.env.DEV) console.warn('Tor address may not be available yet', e)
|
|
}
|
|
}
|
|
}
|
|
init()
|
|
</script>
|
|
|
|
<template>
|
|
<!-- Controller indicator - Mobile only -->
|
|
<div class="md:hidden mb-4">
|
|
<ControllerIndicator />
|
|
</div>
|
|
|
|
<!-- Info Grid -->
|
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 mb-6">
|
|
<!-- Server Name Card (editable) — container: Enter to edit, Enter to save, Escape to exit -->
|
|
<div data-controller-container tabindex="0" class="bg-black/20 rounded-xl px-5 py-4 border border-white/10 transition-all hover:-translate-y-1">
|
|
<div class="flex items-center gap-3 mb-2">
|
|
<svg class="w-5 h-5 text-white/70" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-2-4h.01M17 16h.01" />
|
|
</svg>
|
|
<p class="text-xs font-semibold text-white/60 uppercase tracking-wide">{{ t('settings.serverName') }}</p>
|
|
</div>
|
|
<div v-if="editingServerName" class="flex items-center gap-2">
|
|
<input
|
|
ref="serverNameInput"
|
|
v-model="serverNameDraft"
|
|
type="text"
|
|
maxlength="64"
|
|
class="flex-1 px-3 py-1.5 bg-white/10 border border-white/20 rounded-lg text-white text-lg font-semibold focus:outline-none focus:border-white/40 transition-colors"
|
|
@keydown.enter="saveServerName"
|
|
@keydown.escape="editingServerName = false"
|
|
/>
|
|
<button
|
|
class="px-3 py-1.5 bg-white/10 border border-white/20 rounded-lg text-white/70 hover:text-white hover:bg-white/15 transition-colors text-sm"
|
|
@click="saveServerName"
|
|
>Save</button>
|
|
<button
|
|
class="px-3 py-1.5 text-white/50 hover:text-white/70 transition-colors text-sm"
|
|
@click="editingServerName = false"
|
|
>Cancel</button>
|
|
</div>
|
|
<div v-else class="flex items-center gap-2 group cursor-pointer" @click="startEditServerName">
|
|
<p class="text-lg font-semibold text-white/95">{{ serverName }}</p>
|
|
<svg class="w-4 h-4 text-white/30 group-hover:text-white/60 transition-colors" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z" />
|
|
</svg>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Version Card -->
|
|
<div class="bg-black/20 rounded-xl px-5 py-4 border border-white/10">
|
|
<div class="flex items-center gap-3 mb-2">
|
|
<svg class="w-5 h-5 text-white/70" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A1.994 1.994 0 013 12V7a4 4 0 014-4z" />
|
|
</svg>
|
|
<p class="text-xs font-semibold text-white/60 uppercase tracking-wide">{{ t('common.version') }}</p>
|
|
</div>
|
|
<div class="flex items-center justify-between">
|
|
<p class="text-lg font-semibold text-white/95">{{ version }}</p>
|
|
<button
|
|
@click="showReleaseNotes = true"
|
|
class="glass-button px-3 py-1.5 text-xs"
|
|
>What's New</button>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Release Notes Modal -->
|
|
<Teleport to="body">
|
|
<Transition name="modal">
|
|
<div v-if="showReleaseNotes" class="fixed inset-0 z-[3000] flex items-center justify-center p-4" @click="showReleaseNotes = false">
|
|
<div class="absolute inset-0 bg-black/60 backdrop-blur-sm"></div>
|
|
<div @click.stop class="glass-card p-6 max-w-lg w-full relative z-10 flex flex-col" style="max-height: 85vh">
|
|
<div class="flex items-start justify-between gap-4 mb-5 shrink-0">
|
|
<h3 class="text-xl font-semibold text-white">What's New</h3>
|
|
<button @click="showReleaseNotes = false" class="p-2 rounded-lg hover:bg-white/10 text-white/70 hover:text-white transition-colors" aria-label="Close">
|
|
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" /></svg>
|
|
</button>
|
|
</div>
|
|
<div class="overflow-y-auto flex-1 min-h-0 space-y-6 pr-1">
|
|
<!-- v1.7.72-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.7.72-alpha</span>
|
|
<span class="text-xs text-white/40">May 19, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Settings What'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>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.71-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.7.71-alpha</span>
|
|
<span class="text-xs text-white/40">May 19, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<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>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.70-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.7.70-alpha</span>
|
|
<span class="text-xs text-white/40">May 19, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<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>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.69-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.7.69-alpha</span>
|
|
<span class="text-xs text-white/40">May 19, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<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>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.68-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.7.68-alpha</span>
|
|
<span class="text-xs text-white/40">May 19, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<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's app-session webview.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.67-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.7.67-alpha</span>
|
|
<span class="text-xs text-white/40">May 18, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Home status cards are calmer and more honest now. System, VPN, Bitcoin, and FIPS values keep their last known good state while route changes or short RPC failures are in flight, so the dashboard no longer flashes false "not configured" or "not running" states during normal refreshes.</p>
|
|
<p>Home, Web5 Monitoring, and the full Monitoring page now agree on the headline CPU, memory, disk, uptime, and load numbers. The UI uses one live system-stat snapshot for the visible cards while keeping the Monitoring page's historical store for charts, alerts, and container history.</p>
|
|
<p>The missing What's New history is filled in through this release, including every curated entry from v1.7.44-alpha through v1.7.66-alpha.</p>
|
|
<p>Bitcoin lifecycle specs are aligned again across Rust, first boot, and reconcile. Bitcoin Core/Knots get the intended memory headroom on normal hosts, and pruned Knots uses a larger dbcache when the node has enough RAM, improving IBD throughput without raising pressure on low-memory machines.</p>
|
|
<p>ElectrumX/electrs lifecycle specs now use the same memory policy everywhere, reducing drift between fresh installs, app lifecycle actions, and reconciliation.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.66-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.7.66-alpha</span>
|
|
<span class="text-xs text-white/40">May 18, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Nginx Proxy Manager stale-port repair now catches stopped or Created Podman records that still remember old port mappings. That means a stuck record can be removed and recreated before it blocks the current NPM ports.</p>
|
|
<p>Live recovery on the field node preserved the existing Nginx Proxy Manager data directory while recreating only the stale container metadata with the current 8081, 8084, and 8444 host ports.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.65-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.7.65-alpha</span>
|
|
<span class="text-xs text-white/40">May 18, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Orchestrator-backed app starts now run the same pre-start repair path as the legacy Podman start flow. Nginx Proxy Manager can clean up stale port metadata before the orchestrator tries to bring it online.</p>
|
|
<p>Diagnostics confirmed host nginx was healthy while Nginx Proxy Manager itself had no listeners on its expected ports, narrowing the outage to NPM container lifecycle repair instead of the system proxy.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.64-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.7.64-alpha</span>
|
|
<span class="text-xs text-white/40">May 18, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Authenticated update applies are no longer throttled so aggressively during troubleshooting. The System Update page now allows legitimate retry flows without immediately running into 429 Too Many Requests.</p>
|
|
<p>The release still includes the corrected backend rebuild protection, so OTA artifacts are built from the fresh Rust binary instead of an older compiled version.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.63-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.7.63-alpha</span>
|
|
<span class="text-xs text-white/40">May 18, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>The release script now rebuilds the backend after bumping the version and before hashing artifacts. OTA manifests no longer point at a stale backend binary.</p>
|
|
<p>This corrected the previous stale-artifact issue and carries the Nginx Proxy Manager stale-port repair in a backend binary that nodes can actually install and run.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.62-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.7.62-alpha</span>
|
|
<span class="text-xs text-white/40">May 18, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Nginx Proxy Manager start and restart now repair stale Podman containers that still publish the admin UI on host port 81, which conflicts with host nginx on updated nodes.</p>
|
|
<p>The repair recreates only NPM container metadata while preserving its persistent data and using the current 8081, 8084, and 8444 host mappings.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.61-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.7.61-alpha</span>
|
|
<span class="text-xs text-white/40">May 18, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Multi-container stack installs stay in Installing for up to 20 minutes while dependency containers are being pulled and prepared. BTCPay no longer appears to vanish after two minutes while Postgres and NBXplorer are still being created.</p>
|
|
<p>Lifecycle stale-state recovery remains short for start, stop, restart, update, and removal actions, so genuinely wedged operations still clear quickly.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.60-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.7.60-alpha</span>
|
|
<span class="text-xs text-white/40">May 18, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Meshtastic serial detection now rejects malformed handshakes and skips known non-mesh serial devices such as Sierra Wireless LTE modems and Zooz/Z-Wave sticks.</p>
|
|
<p>Meshtastic config sync sends the correct protobuf wire type, allowing node-info and contact ingestion to work reliably. The mesh udev rule also stops claiming every ttyACM device and now targets known mesh adapters/vendors.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.59-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.7.59-alpha</span>
|
|
<span class="text-xs text-white/40">May 17, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Mobile app launching now keeps known container apps inside Archipelago'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>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.58-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.7.58-alpha</span>
|
|
<span class="text-xs text-white/40">May 17, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<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's existing mesh frame pipeline, and Meshtastic node information appears as normal mesh contacts using stable synthetic public keys.</p>
|
|
<p>Frontend OTA behavior improved: hashed assets no longer fall back to index.html, the HTML shell revalidates on every load, and runtime promotion installs the bundled nginx config on update.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.57-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.7.57-alpha</span>
|
|
<span class="text-xs text-white/40">May 17, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Nginx Proxy Manager now avoids privileged rootless Podman host port 81, preferring 8081 for its admin UI while host nginx keeps a compatibility proxy on :81 for stale launch buttons.</p>
|
|
<p>App installs allocate ports by checking live host bind availability, falling back to a free high port when preferred ports are occupied. Portainer-created launchable containers now appear in a Websites tab through their discovered host ports.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.56-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.7.56-alpha</span>
|
|
<span class="text-xs text-white/40">May 15, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Fresh installs include the full Wi-Fi userspace stack and grant the Archipelago service user NetworkManager PolicyKit access, so Intel Wi-Fi scanning and connection changes work from the web UI.</p>
|
|
<p>Container health and reconciliation are more honest and resilient: stale alerts clear, Stopping containers can be recreated, health states come from Podman, and drifted Quadlet settings trigger proper restarts.</p>
|
|
<p>Bitcoin Knots and ElectrumX get more CPU and memory headroom, LND helpers tolerate container-owned files better, and the screensaver stays out of media-heavy app sessions.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.55-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.7.55-alpha</span>
|
|
<span class="text-xs text-white/40">May 13, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Container reconcile can force-recreate Podman records stuck in Stopping while preserving bind-mounted app data, recovering wedged containers automatically.</p>
|
|
<p>Lifecycle audits on the hardened container layer passed on the validation node, with direct app probes returning healthy responses.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.54-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.7.54-alpha</span>
|
|
<span class="text-xs text-white/40">May 6, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Existing installs now self-repair nginx backend proxy locations for Bitcoin status and app catalog calls, including hosts where the active config is a copied file rather than a symlink.</p>
|
|
<p>LND UI is consistently served on port 18083 across first boot, Tor config, Quadlet reconciliation, OTA runtime payloads, and ISO scripts. OTA frontend tarballs also carry a cleaner runtime payload so startup promotion does not reintroduce stale host assets.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.53-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.7.53-alpha</span>
|
|
<span class="text-xs text-white/40">May 5, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Bitcoin Knots/Core config generation no longer duplicates RPC bind and port settings between bitcoin.conf and container command arguments, fixing startup failures from RPC endpoint binding conflicts.</p>
|
|
<p>Legacy Bitcoin healthchecks no longer depend on bitcoin-cli being present in current images. Update checks now prefer manifest OTA releases over stale git remotes unless git updates are explicitly enabled.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.52-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.7.52-alpha</span>
|
|
<span class="text-xs text-white/40">May 5, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Tailscale now launches its local installed web UI on port 8240 and starts tailscaled before tailscale web, fixing unreachable installs after container creation.</p>
|
|
<p>Grafana lifecycle actions repair missing rootless host listeners on port 3000, and Debian 13 install paths pull security updates from trixie-security during image/install creation.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.49-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.7.49-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 30, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Bitcoin Knots/Core UI now reports connection, reconnecting, syncing, and error states from a backend status bridge instead of showing stale connection failures while the node warms up.</p>
|
|
<p>ElectrumX exposes indexed height, local Bitcoin height, known headers, status, and progress source, making long initial indexing states readable. Bitcoin Core and Bitcoin Knots are now mutually exclusive variants with corrected install conflict handling.</p>
|
|
<p>IndeeHub launches only on its direct web UI port, and BTCPay/NBXplorer Postgres environment formatting was fixed to avoid malformed connection strings.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.48-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.7.48-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 29, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>archipelago.service now creates /run/containers before startup, fixing systemd mount-namespace failures on nodes where that runtime directory did not already exist.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.47-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.7.47-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 29, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Bitcoin Knots/Core sync is significantly faster: containers now use every available core for script verification and have 8 GB of memory so the 4 GB UTXO cache has headroom.</p>
|
|
<p>ElectrumX initial indexing is faster too, with CPU caps removed, 4 GB of container memory, and a 3 GB internal cache.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.46-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.7.46-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 29, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Health monitoring no longer pages auto-restart failures for orphaned containers left behind after Bitcoin variant switches.</p>
|
|
<p>Apps no longer disappear from My Apps when an install fails, and multi-image stack pull progress now advances during the download phase instead of sticking at 20%.</p>
|
|
<p>Several docker.io images were mirrored into Archipelago registries, reducing first-boot install dependency on Docker Hub.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.45-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.7.45-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 29, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Bitcoin RPC auth is durable across container restart, image update, and reboot. The dashboard no longer fails because registry-pulled images shipped stale baked-in credentials.</p>
|
|
<p>Multi-container apps show real install progress, app cards stay visible while containers are being created, IndeedHub installs cleanly on fresh nodes, and Tailscale install no longer fails from a malformed command.</p>
|
|
<p>The installer now allocates swap on the encrypted data partition, capped at 8 GB, so image builds and memory spikes are less likely to OOM the system.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.44-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.7.44-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 28, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Container orchestration migration and release hardening continued, including OTA synchronization for rebuilt UI containers and aligned LND UI port handling across runtime specs.</p>
|
|
<p>Release packaging moved toward tarball-only artifacts with archived ISO build recipes, keeping update payloads focused on the files existing nodes need.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.43-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.7.43-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 23, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Installing, updating, and removing apps no longer freezes the UI. The backend now spawns the actual work in the background and returns immediately, so the progress bar starts moving right away instead of the whole page locking up for 30+ seconds while podman pulls an image.</p>
|
|
<p>Install progress bar actually reflects reality now. It previously stayed at 0% until the very end because podman doesn'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>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.42-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.7.42-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 22, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<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>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.41-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.7.41-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 22, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Updates now self-check. After an update lands, the node probes its own web UI through nginx — if the frontend isn't answering cleanly within 90 seconds, the node automatically rolls back to the previous version and restarts. A bad release can no longer leave the fleet stranded on an unreachable node.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.40-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.7.40-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 22, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Proper fix for the 500 / Internal Server Error after update. The v1.7.38 and v1.7.39 frontend archives had the wrong permissions baked into the archive itself — the tarball's root directory entry was private, so every node that extracted it ended up with a web UI directory nginx couldn't read. v1.7.40 packages the archive with correct world-readable permissions from the start, so no node ever sees the 500 again.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.39-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.7.39-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 22, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Hotfix for v1.7.38 — on some nodes the update landed with the web UI directory set to private file permissions, so nginx returned a 500 / "Internal Server Error" on every page. This release fixes the updater to set world-readable permissions on the new frontend, and the node also now self-heals on boot if it ever finds the UI directory in that state again.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.38-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.7.38-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 22, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Signing in is quiet now. The intro music, welcome voice, and transition sounds belong to the first-boot cinematic and only play before you'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've been through onboarding and takes you straight to the login screen. No more starting over.</p>
|
|
<p>Trimmed the App Store. FIPS, Nostr Relay, Nostr VPN, Routstr, and Penpot have been removed from the catalog and their container images deleted from our registries. Your node's native FIPS transport is untouched — this is just the app-store entries going away.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.37-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.7.37-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 22, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<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't carry it, and the node UI auto-detects which implementation is running so the logo, title, and version line all reflect Core vs. Knots without any manual config.</p>
|
|
<p>The node dashboard now shows a Storage indicator (Full Archive · X GB or Pruned · X GB) right next to Network, so you can tell at a glance whether your node is carrying the full chain history or the last ~550 MB. The Node Settings modal was stripped of its hardcoded Regtest/port-18443 placeholders and now shows real values — network mode, storage mode, transaction index, ZMQ publishing, and RPC port — all read from the running node.</p>
|
|
<p>Fresh installs no longer default to pruned mode. Previously, a new install would write <code>prune=550</code> into bitcoin.conf even on boxes with 2 TB of free space; now the default is full archive and you can opt into pruning by editing the conf yourself.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.36-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.7.36-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 22, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Bitcoin Core joins the App Store as its own entry, with the Umbrel community icon and a description that frames it as a reference alternative to Bitcoin Knots rather than a replacement. A Sovereignty Stack tile on the Discover page now groups your node options together so the choice is obvious.</p>
|
|
<p>The App Store catalog fetch now follows whichever container registries you've set as primary in Settings. Previously the catalog URL was hardcoded to two servers; now the operator's own mirror priority drives where the App Store pulls its listings from, so switching primary actually moves the catalog too.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.35-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.7.35-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 22, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Rootless-netns self-heal: if the container network loses its outbound tap (symptom: Bitcoin Knots and other outbound containers can'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>Your node's Web5 DID, Identities list, and peer-to-peer pubkey now all resolve to the same seed-derived identity instead of drifting apart after onboarding. The Node identity on fresh installs is mirrored from the onboarding seed rather than generated as a separate random keypair.</p>
|
|
<p>Bitcoin Knots (and the new Bitcoin Core slot) now run on bitcoin/bitcoin 28.4 with a realistic 4 GiB memory cap and uncapped CPUs so bitcoind can run -par=auto across every core on your box.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.34-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.7.34-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 22, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>The login background now rotates through six atmospheric images, advancing one each time you land on the login screen, so returning to your node doesn'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's now reserved for the first entry after onboarding. Subsequent logins fade in with just the welcome typing in about 300 ms.</p>
|
|
<p>If you clear site data on a node you'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>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.33-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.7.33-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 22, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<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's local flag is the offline fallback, not the primary answer.</p>
|
|
<p>Already-onboarded nodes no longer show the "boot loader" or "server starting up" screens during an OTA update blip. The health check polls quietly for up to a minute before showing the boot screen, so a 10-second restart no longer looks like a catastrophic failure.</p>
|
|
<p>Logging out and returning to <code>/login</code> no longer replays the full intro video — you get a quiet lock-screen background instead. The full welcome sequence is reserved for genuine first-time entries.</p>
|
|
<p>Upgrading nodes now pick up this release's UI cleanly without a stale cache hanging on. A cache-version bump tells your browser's service worker to ditch the old bundle on first load.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.32-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.7.32-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 22, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<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'd the service because one of the internal threads wasn't releasing. That's been tracked down and fixed, so the service exits promptly and the restart path is snappier.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.31-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.7.31-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 22, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>IndeedHub install is now idempotent — re-running it after a failed first attempt no longer leaves orphaned containers blocking the retry with a "name already in use" error. The installer force-cleans leftover containers and the dedicated network before starting a fresh stack.</p>
|
|
<p>Server 3 (OVH) is now an automatic tertiary mirror for both system updates and app registries. Existing nodes pick it up on next restart without any manual config — another independent network path, so a single-provider outage can't stall downloads.</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>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.30-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.7.30-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 21, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>App installs now show a real download progress bar — same accuracy as the system update bar. You'll see "Downloading: 50.5 / 200.0 MB (25%)" with a live percentage instead of a generic spinner. The bar keeps streaming even when the install falls back from one registry to another, so you'll never see a "stuck at 0%" again.</p>
|
|
<p>Uninstalls now show what's actually happening: "Stopping containers (2/5)", "Cleaning up volumes", "Removing app data" — labelled per app so you can fire off multiple uninstalls in parallel and watch each one'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't take everything down.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.29-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.7.29-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 21, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>New App registries page in Settings — same experience as Update mirrors, but for the container registries your node pulls app images from. Add a mirror, test reachability with one click, pick the primary.</p>
|
|
<p>New nodes default to the VPS registry as the primary for both app installs and the app catalog, with tx1138 as the automatic fallback if the VPS is slow or unreachable. Existing nodes keep whatever registry order they've already set.</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's look so you get something nice to watch while the node comes back up.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.28-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.7.28-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 21, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Reboot now shows a proper progress screen. Click Reboot and you'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've already set — use Set Primary on the System Update page to change it.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.27-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.7.27-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 21, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>The Update page now shows which mirror delivered your update — a small "Served by" line under the new version tells you whether Server 1, Server 2, or a custom mirror was the one your node actually reached. Great for spot-checking that mirror fallback is doing its job.</p>
|
|
<p>Every mirror row has a new lightning-bolt button that pings the mirror and shows whether it'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>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.26-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.7.26-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 21, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<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 'Update mirrors' 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's download URLs were hardcoded to a single server — so even picking a faster mirror couldn'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>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.25-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.7.25-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 21, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<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't reach it; this fixes that without any action needed on your end.</p>
|
|
<p>Upgrading the config happens automatically. On next startup, if the installed FIPS yaml doesn'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>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.24-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.7.24-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 21, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<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's New entries for every release since then had been missing on your node.</p>
|
|
<p>Once this update applies, your node gets the real v1.7.24 frontend: the FIPS Seed Anchors modal (gear icon on the FIPS Mesh card), the current What's New history, the cancel-download button, and every other UI touch from the releases in between.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.23-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.7.23-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 21, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<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>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.22-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.7.22-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 21, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<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's either the public anchor or something you added under Seed Anchors. A federated cluster that routes through its own seed anchor finally reports the truth.</p>
|
|
<p>Reconnect also re-pushes your seed anchors after the restart, so you don't have to wait five minutes for the background apply loop to re-dial them.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.21-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.7.21-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 21, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<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't configure any — the upstream daemon's own defaults keep working as before. This purely adds an operator-controlled list on top.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.20-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.7.20-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 21, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<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'd in and started it manually. The scheduler now hands off cleanly to the same restart path the 'Install Update' button uses, so auto-applied updates come back online on their own.</p>
|
|
<p>Applies to any node configured for 'Check & Apply Daily' — no change required on your end, the fix ships with this update.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.19-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.7.19-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 21, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Your node no longer offers a version you'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's running, your node treats that as "up to date" rather than offering the older version as an update.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.18-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.7.18-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 20, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Nodes discovered through a trusted peer now land as Trusted instead of Observer. When your federated peer shares its own peer list with you, those nodes get the same trust level as a direct invite — the link they came through is already one you vetted, so you no longer need to promote them by hand before they can be used normally.</p>
|
|
<p>The update flow now writes clearer logs at every step. Start of download, cancel, and apply each emit a one-line entry to the system journal with the staging path and the affected files, so if a download misbehaves on your node it's easy to see exactly where it got to.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.17-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.7.17-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 20, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<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 'Download appears stuck — try Cancel and start again' 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're not stuck watching a stuck screen while you wait to unstick it.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.16-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.7.16-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 20, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Federation is now bidirectional and instant. When someone joins using your invite code, their node appears on your Federation page automatically — no need for the inviter to click Sync or wait for the next poll. Names and node details populate within seconds of the handshake finishing.</p>
|
|
<p>New nodes can no longer federate with themselves. Accepting an invite that points back at the local node (by DID, public key, or onion address) is rejected up front, so self-peering no longer clutters the node list with a duplicate card.</p>
|
|
<p>Transitive discovery: if nodes A and B are already federated and node C joins A, all three nodes now learn about each other. The new peer is pulled in as an Observer entry on existing federation members, so you can promote to Trusted with one click instead of trading a second invite code.</p>
|
|
<p>The Federation page auto-refreshes every five seconds while it's open. Status changes, new peers, and incoming join requests surface on their own — clicking Sync remains available for an on-demand pull.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.15-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.7.15-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 20, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<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're up to date.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.14-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.7.14-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 20, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Installing an update now shows a full-screen progress overlay with the Archipelago logo, a status message, and an animated bar. The page reloads itself automatically once the new version is up — no manual refresh. If something stalls, a 'Reload now' button appears after a few minutes.</p>
|
|
<p>Download progress no longer looks frozen near the end. The bar pauses at 95% with a 'Finishing download — verifying checksum…' message and spinner while the last bytes arrive and are hashed.</p>
|
|
<p>FIPS Reconnect now genuinely tries to fix the anchor. It runs a proper recovery sequence (stop → start → wait for the bootstrap window → check peers) and tells you the likely reason it's still unreachable — corrupt identity key, seed not unlocked, network blocking UDP, or the anchor server being down — instead of a generic 'try again'.</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't parse and silently authenticated with a garbage key. The Reconnect button now rewrites the file in the correct binary format and re-installs the config before restarting — nodes stuck with no peers for 'no reason' should come back online.</p>
|
|
<p>AIUI (Claude sidebar) is back. The installer now ships AIUI in the frontend bundle and preserves it across future updates — it was being wiped on every OTA because it lived outside the Vue build.</p>
|
|
<p>Installing a big app (IndeedHub, Bitcoin, Penpot) no longer gives up early and shows 'didn't work' while the download is still running in the background. The client waits up to 45 minutes for the install pipeline to finish.</p>
|
|
<p>'Rollback to Previous' is now labelled 'Rollback Available' — clearer that it's a choice you have, not a status you're stuck with.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.13-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.7.13-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 20, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>App catalog now loads reliably. Before, the Marketplace / Discover page couldn't fetch the catalog of apps because the upstream host wasn't sending the right CORS headers and the node's security policy didn'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>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.12-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.7.12-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 20, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<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>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.11-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.7.11-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 20, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<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>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.10-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.7.10-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 20, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Install Update actually applies now. The installer had to write into system folders that the backend service was sandboxed out of — every earlier 'Failed to apply update' 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'll see 'Active · N peers' (green) when healthy or 'No anchor' (orange) when the network is blocking the bootstrap — same signal as the full FIPS card.</p>
|
|
<p>Pasting an https://… 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>Uploaded profile pictures under 64 KB are now embedded directly in your Nostr profile (as a data URL), so any Nostr client can see them — not just ones routing over Tor. Larger uploads keep the onion URL for now, with a hint to paste a public URL for wider visibility.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.9-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.7.9-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 20, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>OTA verification release — nothing new to see. Click Install Update, grab a coffee, and watch the sidebar flip to 1.7.9-alpha on its own. If this one works end to end, the pipeline is solid and future updates will flow the same way.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.8-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.7.8-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 20, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Install Update finally works end-to-end over the air. The installer was trying to overwrite the running backend binary with a tool that fails on in-use files (ETXTBSY) — swapped it for an atomic rename, which the kernel allows on a live executable. Every previous 'Failed to apply update' attempt was this one root cause.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.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.7.7-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 20, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Over-the-air update test — no feature changes, just a version bump so your node can walk through the whole update flow end-to-end using the new robust installer. Safe to apply; nothing to do afterwards.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.6-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.7.6-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 20, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Install Update is now more robust. Each install gets its own uniquely-named staging folder and then moves files into place — the previous version had a small cleanup step that could hit a transient filesystem hiccup and bail out halfway. 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>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.5-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.7.5-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 20, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<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>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.4-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.7.4-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 20, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Install Update actually installs now. Before, the final step extracted the new UI into the wrong folder and bailed with 'Failed to apply update' — your node ended up backing up cleanly but never swapping in the new files. Fixed.</p>
|
|
<p>Download progress no longer overshoots 100%. You'll see the bar climb smoothly to 95% and then jump to 100% when the download actually finishes.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.3-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.7.3-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 20, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>The version number in the sidebar now always matches the actual running version — no more lying to you about being on an older release after an update.</p>
|
|
<p>FIPS Mesh card on the server page: cleaner layout on desktop (no more awkward gaps), and a one-click Reconnect button when the public anchor is unreachable — it restarts the FIPS daemon so it can re-bootstrap from the anchor.</p>
|
|
<p>Profile pictures now show correctly in the identity list and editor. Before, uploaded images silently failed to render because the URL was only reachable over Tor; the UI now rewrites them to a local path while keeping the external URL for other Nostr clients.</p>
|
|
<p>Identity rows now show your Display Name first (from your Nostr profile) with the internal identity name beside it in parentheses, so you see the name other people will see — not just the one you picked when creating it.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.2-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.7.2-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 20, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Install Update now actually installs. Before, the button would back up your current version then fail with 'Failed to apply update' because the installer couldn't write into system folders.</p>
|
|
<p>The button's also been renamed to 'Install Update' (previously 'Apply Update') and the node restarts itself a moment after you click it — no more manual restart step.</p>
|
|
<p>Your existing identities now show the generated avatar instead of just their initials — same look as freshly created ones.</p>
|
|
<p>Everything from 1.7.0-alpha and 1.7.1-alpha carries over (default avatars on creation, one-click Save publishes to Nostr relays, public blob URLs for profile pictures, 30-minute download window, VPN peer restore on reboot, reconciler-only-repairs, filebrowser fix).</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.1-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.7.1-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 20, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Over-the-air update test — same features as 1.7.0, just a fresh version number so your node can try the new download-and-apply flow end-to-end. Safe to apply; nothing to do afterwards.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.7.0-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.7.0-alpha</span>
|
|
<span class="text-xs text-white/40">Apr 20, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Every identity now gets a personal avatar the moment it'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 'update available'.</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's healthy.</p>
|
|
<p>One-click 'Pull & Rebuild' button works for nodes that update from source (the development path), not just the standard download path.</p>
|
|
<p>The download progress number is now clean (like 45.23%) instead of 45.270894%.</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.3.5 -->
|
|
<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.3.5</span>
|
|
<span class="text-xs text-white/40">Apr 11, 2026</span>
|
|
</div>
|
|
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
|
|
<p>Migrated container registry to git.tx1138.com</p>
|
|
</div>
|
|
</div>
|
|
<!-- v1.3.4 -->
|
|
<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.3.4</span>
|
|
<span class="text-xs text-white/40">Apr 7, 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">NostrVPN — Built-in Mesh VPN</h4>
|
|
<p>NostrVPN is now a native system service. Peer discovery via Nostr relays, WireGuard tunnels. Auto-configured with your node's identity during onboarding — no setup required.</p>
|
|
</div>
|
|
<div>
|
|
<h4 class="text-white font-medium mb-1">New Marketplace Apps</h4>
|
|
<p>FIPS (encrypted mesh network) and Routstr (decentralized AI inference with Cashu payments) available as installable apps. Status UIs included for headless apps.</p>
|
|
</div>
|
|
<div>
|
|
<h4 class="text-white font-medium mb-1">ISO Boot Fix</h4>
|
|
<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>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- v1.3.0 -->
|
|
<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.3.0</span>
|
|
<span class="text-xs text-white/40">Mar 19, 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">Full Security Audit</h4>
|
|
<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>
|
|
</div>
|
|
<div>
|
|
<h4 class="text-white font-medium mb-1">Container Reliability</h4>
|
|
<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>
|
|
</div>
|
|
<div>
|
|
<h4 class="text-white font-medium mb-1">LND Connect Fixed</h4>
|
|
<p>Connect Your Wallet (Zeus, Zap, BlueWallet) now works over both local network and Tor. QR codes generate correctly with REST API access.</p>
|
|
</div>
|
|
<div>
|
|
<h4 class="text-white font-medium mb-1">UI Polish</h4>
|
|
<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>
|
|
</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>
|
|
<button @click="showReleaseNotes = false" class="glass-button w-full mt-4 py-2 text-sm shrink-0">Close</button>
|
|
</div>
|
|
</div>
|
|
</Transition>
|
|
</Teleport>
|
|
|
|
<!-- Session Card -->
|
|
<div class="bg-black/20 rounded-xl px-5 py-4 border border-white/10 md:col-span-2">
|
|
<div class="flex items-center gap-3 mb-2">
|
|
<svg class="w-5 h-5 text-green-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" />
|
|
</svg>
|
|
<p class="text-xs font-semibold text-white/60 uppercase tracking-wide">{{ t('settings.sessionStatus') }}</p>
|
|
</div>
|
|
<p class="text-base font-medium text-white/90">{{ t('settings.loggedIn') }}</p>
|
|
</div>
|
|
|
|
<!-- Identity Card: DID + Tor Address -->
|
|
<div v-if="userDid || serverTorAddress" class="bg-black/20 rounded-xl px-5 py-4 border border-white/10 md:col-span-2 space-y-4">
|
|
<div v-if="userDid">
|
|
<div class="flex items-center justify-between gap-2 mb-2">
|
|
<div class="flex items-center gap-3 min-w-0">
|
|
<svg class="w-5 h-5 text-amber-400 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z" />
|
|
</svg>
|
|
<p class="text-xs font-semibold text-white/60 uppercase tracking-wide">{{ t('settings.yourDid') }}</p>
|
|
</div>
|
|
<button
|
|
@click="copyDid"
|
|
class="shrink-0 px-3 py-1.5 rounded-lg glass-button glass-button-sm text-xs font-medium text-white/90 hover:text-white transition-colors flex items-center gap-1.5"
|
|
>
|
|
<svg v-if="!copiedDid" class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" />
|
|
</svg>
|
|
<span v-else class="text-green-400 text-xs">{{ t('common.copied') }}</span>
|
|
<span v-if="!copiedDid">{{ t('common.copy') }}</span>
|
|
</button>
|
|
</div>
|
|
<p class="text-sm font-mono text-white/90 break-all" :title="userDid">{{ userDid }}</p>
|
|
<p class="text-xs text-white/50 mt-1">{{ t('settings.didHelper') }}</p>
|
|
</div>
|
|
<div v-if="serverTorAddress" :class="userDid ? 'pt-4 border-t border-white/10' : ''">
|
|
<div class="flex items-center gap-3 mb-2">
|
|
<svg class="w-5 h-5 text-amber-400 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9" />
|
|
</svg>
|
|
<p class="text-xs font-semibold text-white/60 uppercase tracking-wide">{{ t('settings.onionAddress') }}</p>
|
|
</div>
|
|
<p class="text-sm font-mono text-amber-400/90 break-all mb-1" :title="serverTorAddress">{{ serverTorAddress }}</p>
|
|
<p class="text-xs text-white/50 mb-3">{{ t('settings.onionHelper') }}</p>
|
|
<button
|
|
@click="copyOnionAddress"
|
|
class="w-full min-h-[44px] rounded-lg glass-button text-sm font-medium text-white/90 hover:text-white transition-colors flex items-center justify-center gap-2"
|
|
>
|
|
<svg v-if="!copiedOnion" class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" />
|
|
</svg>
|
|
<span v-if="!copiedOnion">{{ t('common.copy') }}</span>
|
|
<span v-else class="text-green-400">{{ t('common.copied') }}</span>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|