This document describes the concrete steps required to move BrowserBox/BrowserBox-distribution from packaging exploration to a production distribution system.
It is written against the repo as it exists today:
- upstream binary source:
BrowserBox/BrowserBox - sync workflow:
.github/workflows/sync-from-public-release.yaml - Linux package build workflow:
.github/workflows/build-linux-packages.yaml - generator:
scripts/sync-release.mjs - Linux package builder:
scripts/build-linux-packages.sh
This repo is production-ready only when all of these are true:
- package surfaces update automatically from a public BrowserBox release only after the public saga is green
- each surface installs or locates the release manifest correctly at runtime
- Linux packages are built, retained, and published from a repeatable workflow
- Windows and macOS package channels are published from a repeatable workflow
- at least smoke-install verification exists for each supported surface
- rollback to a prior tag is documented and reversible without manual archaeology
- secrets, tokens, and publication permissions are scoped narrowly and documented
What is already in place:
- The repo tracks the newest
BrowserBox/BrowserBoxrelease whose public saga succeeded. - Linux
debandrpmpackages can be built as workflow artifacts. - Homebrew, Chocolatey, and Nix package surfaces are generated from upstream release metadata.
- Runtime release-manifest handling is wired into all current package surfaces.
What is not yet in place:
- no immediate upstream-to-downstream dispatch from the public saga
- no publication workflow for
deb/rpmrepositories - no dedicated Homebrew tap publication flow
- no Chocolatey feed publication flow
- no Winget publication flow in this repo
- no install CI for package-manager surfaces
- no rollback or release-ops runbook
Goal: make repo updates deterministic and low-latency.
-
Add upstream dispatch from
BrowserBox/BrowserBox. The sender should be the public saga workflow after success, not the release-publish step. Userepository_dispatchwith payload{ tag, source_repo, source_workflow }. -
Add a narrowly scoped token in the upstream repo. Required capability: trigger workflows or write repository_dispatch events on
BrowserBox/BrowserBox-distributiononly. Do not reuse a broad org-wide PAT. -
Keep schedule polling as fallback. The hourly schedule is still useful if dispatch breaks or the upstream workflow is temporarily edited.
-
Broaden success detection in
scripts/sync-release.mjs. Today it looks only atrelease-event saga runs. Before production it should also recognize explicit successful reruns or accept the dispatch payload as authoritative. -
Add generator parity protection. Add a workflow step that runs
node ./scripts/sync-release.mjsand fails if generated files differ from checked-in files.
Goal: define what is actually supported and remove ambiguity.
-
Pick the publication model for
aptanddnf. Options:- publish signed
debandrpmrepos from GitHub Pages or another static host - publish via a managed package repository service
- keep GitHub artifact-only for internal use
- publish signed
-
Add repository metadata generation. For production, package files alone are not enough. You need:
- Debian repo metadata and signing
- RPM repo metadata and signing
-
Decide the supported distributions. Minimum recommended explicit support list:
- Ubuntu LTS
- Debian stable
- Rocky or RHEL-compatible
- Fedora or another
dnffamily target
-
Add install instructions for repository bootstrap. Document:
- repo URL
- signing key install
- package install command
- how to pass
BROWSERBOX_HOSTNAMEandBROWSERBOX_EMAILwhen desired
-
Decide whether this repo remains the cask source or whether Homebrew gets a dedicated tap repo. A dedicated tap is usually cleaner operationally.
-
Move from cask file generation only to tap publication. Production requires a repeatable push to the tap branch/repo.
-
Revisit manifest delivery. Current behavior downloads the manifest in
postflight. For production, consider shipping a tarball or installer artifact that already contains:- the binary
release.manifest.jsonrelease.manifest.json.sig
-
Keep macOS signing aligned with upstream binary release policy. If upstream macOS binaries are notarized or otherwise signed, this repo should not introduce a second unsigned wrapper artifact.
-
Choose the supported Windows channels. Recommended production target:
- Chocolatey
- Winget
-
Import the existing Winget scaffolding from
BrowserBox-source. Reuse the existing manifests underBrowserBox-source/spread-channels/packages/wingetinstead of inventing a second Winget shape. -
Decide the Chocolatey publication target. Options:
- private/internal feed
- Chocolatey Community repository
-
If Winget is in scope, automate manifest updates and submission packaging. The repo should own the generated Winget manifests and the submission/runbook.
-
Keep manifest placement consistent with BrowserBox runtime lookup. Preferred order remains:
- global location
- user-config fallback
-
Decide whether the production target is:
- this repo as a flake input
- an overlay exported from this repo
- a submission path into another Nix package set
-
Add a basic
nix buildvalidation workflow. -
Document the unfree policy clearly. Nix users need to know they are opting into unfree redistributable software.
The repo intentionally skipped install CI at the exploration stage. That is no longer acceptable in production.
Before calling this production, add at least one smoke test per surface:
- Linux
deb: install package on an Ubuntu runner/container and verifybrowserbox --version - Linux
rpm: install package on a Rocky or Fedora runner/container and verifybrowserbox --version - Homebrew: install the cask on a macOS runner and verify:
browserboxexists- release manifest files were placed correctly
- Chocolatey: install on a Windows runner and verify:
browserbox.exeexists- release manifest files were placed correctly
- Nix:
nix buildand verify the wrapped binary exposesBBX_RELEASE_MANIFEST_PATH
The tests do not need to perform a full BrowserBox session claim or license flow at first. The first production gate is: package install succeeds and the binary can start its integrity path without missing-manifest failure.
Production needs immutable outputs.
-
Publish Linux packages somewhere durable. The current workflow only uploads GitHub Actions artifacts. Those are not a production distribution channel.
-
Add release attachment strategy for this repo. Recommended shape:
- one tag in this repo per synced BrowserBox tag
- attach built
deb/rpmfiles there - attach repo metadata if using static hosting
-
Publish tap/feed updates transactionally. Avoid a state where:
- package metadata points to one BrowserBox tag
- but the package files were not published yet
-
Keep the source of truth monotonic.
packages/release/current-release.jsonshould always match the published package content.
Production means failure recovery is routine, not improvised.
Document all of this in the repo:
-
How to pin this repo back to a previous BrowserBox tag.
-
How to republish only one surface if a single ecosystem fails. Examples:
- rebuild only Linux packages
- republish only the Homebrew cask
- rerun only Chocolatey publication
-
How to stop auto-advance temporarily. Recommended mechanism:
- disable the dispatch sender upstream, or
- disable the schedule in this repo, or
- pin
workflow_dispatchto a chosen tag during incident handling
-
How to inspect whether a repo version is safe to publish. Minimum checks:
- target tag in
packages/release/current-release.json - successful upstream public saga
- generated package surfaces committed
- package publication workflow green
- target tag in
Do not treat package publication as a pure metadata problem.
Before production:
-
Scope all tokens narrowly. Separate:
- upstream dispatch token
- publication tokens per ecosystem
- any package repository signing keys
-
Decide where Linux repository signing keys live and who rotates them.
-
Preserve upstream checksum authority. Package generation must continue deriving release artifact checksums from the upstream BrowserBox release assets, not from ad hoc local files.
-
Avoid introducing a second opaque installer authority unless necessary. If you add platform-native installer bundles later, document why they exist and how they preserve manifest integrity.
If you want the shortest path from current state to something operational, do it in this order:
- Upstream saga dispatch into this repo
- Success detection that handles dispatch and reruns cleanly
- Linux package publication and repository metadata
- Winget surface import and publication plan
- Homebrew tap publication
- Chocolatey feed publication
- Minimal smoke-install CI across all supported surfaces
- Rollback runbook and incident handling doc
These decisions should be made explicitly before production work starts:
- Does this repo publish only Linux packages, while macOS and Windows publish metadata to external channels?
- Is Winget in scope for production, or is Chocolatey the only Windows package-manager surface?
- Does Homebrew stay in this repo or move to a dedicated tap repo?
- Are Linux repos hosted statically, through GitHub releases/pages, or through a managed package repository?
- Is the first production milestone "internal feed only" or "public ecosystem publication"?
This repo is ready to be called production when:
- a green public BrowserBox saga causes this repo to update automatically without manual polling
- package outputs are published through stable channels, not just workflow artifacts
- each supported surface has at least one smoke-install verification path
- rollback is documented and exercised once
- secrets, signing, and operator ownership are documented in-repo