{{ t('systemUpdate.subtitle') }}
{{ t('common.version') }}
{{ $ver(currentVersion) }}
{{ t('systemUpdate.lastChecked') }}
{{ lastCheckDisplay }}
{{ t('common.status') }}
{{ statusLabel }}
Version {{ updateInfo.version }} — {{ updateInfo.release_date }}
Served by {{ manifestMirrorLabel }}
{{ t('systemUpdate.componentsToUpdate', { count: updateInfo.components }) }}
{{ t('systemUpdate.gitMethodHint') }}
{{ t('systemUpdate.upToDateMessage') }}
{{ downloadStalled ? t('systemUpdate.downloadStalled') : downloadFinishing ? t('systemUpdate.finishingDownload') : t('systemUpdate.percentComplete', { percent: downloadPercentFormatted }) }}
{{ t('systemUpdate.applyWarning') }}
{{ t('systemUpdate.subtitle') }}
Where this node fetches updates and apps. Stable origin is the known-good default. DHT swarm pulls content-addressed blobs from peers first and falls back to the origin automatically — use it to live-test the swarm; flip back any time.
This build doesn't include the swarm engine, so DHT mode currently behaves exactly like origin. A swarm-enabled build is required for true peer fetching.
Provide to the swarm
Let other nodes fetch updates and apps from this one (seeding). On by default so the network has providers. Turn off if this node shouldn't serve content to peers — it won't change how this node fetches.
Sources this node checks for updates. The primary is tried first; if it's slow or unreachable, the next one is tried automatically. Downloads always come from the source that served the manifest — switching primary switches where files come from.
The two built-in entries are the same server, not two servers: the second reaches it by IP without DNS or TLS, which recovers a node whose DNS is broken or whose clock is wrong. It does not help if the server itself is down. Every update is signature-checked whichever source serves it, so an unencrypted fetch can't substitute a tampered build. For real redundancy, add a mirror on a different host.
{{ m.label || `Mirror ${i + 1}` }}
PRIMARY{{ m.url }}
{{ t('systemUpdate.overlayTarget', { version: installTargetVersion }) }}
{{ installElapsedLabel }}
The URL should point directly at a manifest.json served by a Gitea mirror or equivalent. It's added to the end of the list; use "Make primary" to change order.
{{ confirmAction === 'rollback' ? t('systemUpdate.rollbackMessage') : confirmAction === 'git-apply' ? t('systemUpdate.gitApplyMessage') : confirmAction === 'cancel-download' ? t('systemUpdate.cancelDownloadConfirm') : t('systemUpdate.applyMessage') }}