Question
How can a production installation discover and apply new versions without tracking main, reducing product functionality, or losing a working version on failure?
Distribution architecture · stable channel
OpenProgram considers only complete, stable GitHub Releases verified against the manifest to be installable updates. Desktop automatically discovers and verifies platform installers: DMG on macOS and Authenticode-signed EXE on Windows; managed CLI/server verifies the complete runtime before switching atomically. New repository commits do not constitute user updates.
How can a production installation discover and apply new versions without tracking main, reducing product functionality, or losing a working version on failure?
Developers and release maintainers responsible for Release, Desktop, CLI/server, Settings, and installation documentation.
macOS/Windows Desktop, macOS/Linux/Windows managed CLI/server, and explicit routing for source checkouts.
Windows sandboxing, macOS signing, Linux Desktop, PyPI product installation, and background replacement of a running application.
Platform actions differ, but version sources, complete-product definitions, and verification results must agree.
Do not update the wheel, Web, Program, OCR, Browser, or models separately. Every supported artifact satisfies the unified capability manifest and includes a pinned CPython.
The main process selects the DMG or EXE for the current platform and architecture and verifies bytes and SHA-256; Windows also verifies Authenticode. The renderer cannot provide URLs, hashes, or filenames.
openprogram upgrade verifies the Release, runtime, capabilities, and cold start, then finally replaces current; it does not automatically restart the existing worker.
Source checkouts continue to use explicit refs, preflight, build, and probe, without presenting a development branch as a stable Release.
The two user paths separate after strict verification. Any missing, duplicate, or inconsistent data stops processing before download or installation.
vX.Y.Z.current.The renderer never receives asset URLs, filenames, or hashes; CLI subprocesses inherit only the minimum environment required for installation.
“Check,” “download,” and “install” each correspond to verifiable actions. The two platforms use different replacement mechanisms.
Automatic discovery + complete download + explicit installation handoff
process.arch..app.Automatic discovery + complete download + signature verification + explicit installation handoff
OpenProgram-<version>-win-x64.exe.Explicit execution + complete runtime verification + atomic activation
openprogram upgrade --check reports current and latest versions read-only.os.replace to switch current; the user explicitly restarts the worker.The following are actual information states in the same Settings section, not separate product versions. Use the buttons or left/right arrow keys to switch.
The cache is absent or expired. Automatic checks are enabled by default.
All windows reuse one in-flight Promise, preventing concurrent metadata requests.
The same or a lower version is shown as up to date; stable downgrades are disallowed.
Release Notes appear as plain-text summaries inside the app; the full body opens only the fixed GitHub Release page.
The main process publishes progress at most every 250ms and guarantees a final state on completion.
An error state retains verified release metadata, so users can retry directly without checking again.
Automatic checks affect discovery only; they do not trigger unattended installation. Manual checks always force a refresh.
lastSuccessAt determines the next automatic check.lastAttemptAt provides failure backoff, avoiding continuous GitHub requests.update-state.jsonSave automaticChecks, lastAttemptAt, lastSuccessAt, and the latest verified release metadata using a temporary file plus rename. POSIX can specify file mode; Windows inherits the current user-directory ACL.
Invalid JSON, unknown schemas, future timestamps, version/architecture mismatches, and missing releases are normalized and rewritten. A write failure must not commit hidden in-memory setting changes.
Verification occurs in the privileged process; the lower-privilege UI receives only projected display state.
HTTPS, fixed host, at most 5 redirects, per-hop validation, size limit, and body idle timeout; also require draft === false and prerelease === false.
vX.Y.ZPreload exposes only getState, check, boolean settings, download, openRelease, and state subscriptions.
Desktop uses random exclusive temporary files and handles short writes; Windows inherits directory ACLs and additionally verifies Authenticode. CLI verifies the complete runtime in a new version directory before replacing current.
Managed upgrade pins the repository and target version, passing only allowed entries such as PATH/HOME/temp/locale/proxy/XDG/OpenProgram state.
--json always emits a single JSON documentEvery error states where processing stopped and what was preserved; vague “update failed” messages do not replace transaction boundaries.
current replacement.Installation detection identifies only the current execution mode; it does not create product variants with different functionality.
pip_wheel is not an official product installation type. Developer wheels may be build inputs, but do not provide an incomplete ordinary-user product.
References establish platform constraints and state models; the final approach follows OpenProgram’s unsigned Desktop and complete-runtime contracts.
Latest stable metadata, Release Notes, and assets. Clients still independently validate stable fields, tags, unique assets, and manifests.
Adopt the check / available / download / error state model; Desktop completes by opening the verified platform installer, without automatic replacement.
Native macOS automatic installation requires signing, and Electron provides no built-in Linux updater; these do not match current artifacts and platform contracts.
The existing Release manifest, Node/Electron APIs, Python, and shell cover this phase; a new package cannot change the current Desktop installation boundary.
Links point to current main-branch public compatibility entry points and official implementations; design conclusions do not depend on copied code on this page.
Desktop metadata, state, cache, scheduling, platform asset selection, download, hash, and public projection.
apps/desktop/windows-signature.jsWindows updater Authenticode status, certificate subject, and thumbprint verification.
apps/desktop/main.jsAutomatic-check timer, resume, IPC handlers, and multi-window state broadcast.
apps/desktop/preload.jsFixed renderer bridge without URL parameters.
apps/web/components/settings/general-section.tsxDesktop update status and CLI-instruction fallback for ordinary Web.
apps/cli/python/openprogram_cli/_impl/commands/upgrade.pyInstallation-type routing, managed Release gate, dry-run/JSON, and installer execution.
openprogram/updater/github.pyGitHub stable metadata, manifest, and immutable installer retrieval.
scripts/install-release.shPreserve the published macOS/Linux URL compatibility entry point; download the official implementation from the same immutable tag.
scripts/install-release.ps1Preserve the published Windows PowerShell URL compatibility entry point; download the official implementation from the same immutable tag.
scripts/release/install-release.shmacOS/Linux complete-runtime download, verification, cold start, launcher staging, and atomic activation.
scripts/release/install-release.ps1Windows ZIP download, verification, cold start, launcher staging, and atomic activation.
.github/workflows/release.ymlComplete artifact publication and the latest-endpoint gate after creating a Release.
Implemented facts and facts still requiring Release-environment verification are recorded separately. This page does not retain dated change logs or commit lists.
Stable metadata, platform/architecture selection, state cache, 24h/6h scheduling, minimal IPC, verified download, Windows Authenticode, Settings states, and Web fallback are implemented.
npm run check --workspace apps/desktopThe Release manifest gate, immutable installer, environment isolation, dry-run/JSON, real old→new current switching, and old-version retention on launcher failure are covered.
uv run pytest -q tests/component/config/test_formal_release_updates.py tests/component/config/test_distribution_release.pyPer-hop host validation, metadata/download stall abort, short writes, random exclusive temporary files, checksum/size cleanup, concurrent Promises, and state repair are verified.
apps/desktop/scripts/check-update-service.jsBilingual installation/upgrade documentation, Release latest verification, documentation build, links, Desktop/Web/TypeScript, and workflow static gates are included in release checks.
python -m scripts.docs_site.checklinksThe repository’s v0.8.1 acceptance records runtime, CLI, Desktop, manifest, and checksum artifact boundaries. The source version does not prove the current GitHub published release; this page does not revisit GitHub latest or treat historical remote-artifact checks as acceptance of a currently running client.
The current user window has not been operated to verify version discovery, opening the platform installer, long-running behavior, or sleep/resume scheduling; release-artifact smoke tests do not replace these interactions. Windows must additionally pass the Authenticode gate with a real certificate on an official release runner.
Historical records require Desktop to manually install the first updater-equipped v0.7.0 DMG, and CLI/server to rerun the public installer. This is v0.7.0 migration background, not the current v0.8.1 release state.
v0.7.0 was historically the first official release with the updater; the current source and installer version baseline is v0.8.1. Migration instructions for v0.6.6 and earlier Desktop remain as historical context; current evidence excludes foreground-client update interactions, so installed-client acceptance still requires separate verification.