Versioning and Release Metadata
This guide defines how CBF versions Rust crates and GitHub release artifacts.
It separates crate compatibility from packaged Chromium runtime revisions so
maintainers can publish crate-specific releases and can re-release
Chromium.app and cbf_bridge without forcing an unrelated crate publish.
1. Goals
CBF publishes two kinds of versioned outputs:
- Rust crates on crates.io
- GitHub Releases for crate history and prebuilt runtime bundles
These outputs have different compatibility concerns:
cbfandcbf-chromeexpose Rust APIs and should follow normal SemVer rules.cbf-chrome-systracks the Chromium generation that defines the low-level FFI and wire boundary.- GitHub Releases serve two purposes:
- crate-specific release history
- packaged runtime bundle distribution
2. Crate Versioning
cbf
cbf uses normal SemVer.
- Major/minor indicate public API compatibility in the browser-generic Rust API.
- Patch indicates compatible bug fixes and documentation-only corrections.
- Before
1.0.0, maintainers should treat minor bumps as the main signal for breaking public API changes.
Examples:
0.1.00.2.00.2.1
cbf-chrome
cbf-chrome also uses normal SemVer.
- Its version tracks the Chrome-specific safe Rust API surface.
- It is versioned independently from
cbf. - Its release cadence may be higher than
cbfbecause it sits closer tocbf-chrome-sys, Chromium integration, and backend-specific behavior.
Examples:
cbf = 0.3.0cbf-chrome = 0.7.2
cbf-chrome-sys
cbf-chrome-sys uses a Chromium-generation-oriented version scheme:
<chromium-milestone>.<minor>.<patch>
Rules:
major: Chromium milestone, such as146or147minor: additive compatible changes to the FFI/wire boundary within that Chromium milestone linepatch: compatible fixes only
Examples:
146.1.0146.1.1146.2.0147.0.0
Do not encode the full Chromium revision in SemVer build metadata as the
primary compatibility signal. For example,
146.1.0+chromium-146.0.7632.160 is acceptable as descriptive metadata, but
Cargo dependency resolution does not treat build metadata as part of version
precedence.
3. Compatibility Model
The expected compatibility split is:
cbfandcbf-chromedefine the Rust-side API contract.cbf-chrome-sysdefines the Rust-to-bridge ABI contract for a Chromium milestone line.- crate releases identify changes to one Rust crate at a time.
- runtime bundle releases identify the concrete prebuilt runtime bundle that
contains:
Chromium.applibcbf_bridge.dylib
As a result:
- A crate may receive a GitHub Release even when no new runtime bundle is published.
cbfandcbf-chromedo not need matching version numbers.- Compatibility between
cbfandcbf-chromeshould be expressed through Cargo dependency requirements and release notes, not version-number alignment. - A
Chromium.apporcbf_bridgerebuild may require a new GitHub Release without requiring a newcbf-chrome-syscrate release. - A new
cbf-chrome-sysrelease is required when the ABI/wire boundary changes in a way that should be represented to Cargo users.
4. GitHub Release Types
CBF uses two GitHub Release types:
- crate releases
- runtime bundle releases
These release types should use different tag namespaces.
Crate releases
Create a GitHub Release for each public crate publish so maintainers and users can track crate-specific changes independently.
Canonical tag format:
<crate-name>-v<crate-version>
Examples:
cbf-v0.1.0
cbf-chrome-v0.1.0
cbf-chrome-sys-v146.1.0
cbf-compositor-v0.1.0-alpha.1
cbf-cli-v0.1.0
Recommended title format:
<crate-name> v<crate-version>
Examples:
cbf v0.1.0
cbf-chrome v0.1.0
cbf-chrome-sys v146.1.0
cbf-compositor v0.1.0-alpha.1
cbf-cli v0.1.0
Crate release notes should focus on:
- what changed in that crate
- compatibility expectations for downstream users
- links to related runtime bundle releases when relevant
Runtime bundle releases
GitHub Release tags identify the packaged runtime bundle, not just crate versions.
The canonical tag format is:
cbf-chrome-runtime-v<cbf-chrome-version>+chromium-<chromium-version>-r<release-revision>
Example:
cbf-chrome-runtime-v0.1.0+chromium-146.0.7632.160-r1
Field meanings:
<cbf-chrome-version>: the publishedcbf-chromecrate line for this bundle<chromium-version>: the full Chromium runtime version included in the bundle<release-revision>: packaging and redistribution revision for the same crate/runtime combination, starting at1
Release revision increments when maintainers republish artifacts for the same crate versions and the same Chromium version, for example:
- refreshed
Chromium.app - rebuilt
libcbf_bridge.dylib - corrected packaging or bundled notices
- regenerated archives due to packaging mistakes
Examples:
cbf-chrome-runtime-v0.1.0+chromium-146.0.7632.160-r1cbf-chrome-runtime-v0.1.0+chromium-146.0.7632.160-r2cbf-chrome-runtime-v0.1.0+chromium-147.0.7651.5-r1
5. Runtime Bundle Release Titles
Use a human-readable title that mirrors the tag and makes the bundled Chromium version obvious.
Recommended format:
CBF Chrome v<cbf-chrome-version> for Chromium v<chromium-version> (Release <n>)
Examples:
CBF Chrome v0.1.0 for Chromium v146.0.7632.160 (Release 1)CBF Chrome v0.1.0 for Chromium v146.0.7632.160 (Release 2)
6. Release Notes Metadata
Each runtime bundle release should explicitly record:
cbfversioncbf-chromeversioncbf-chrome-sysversion- bundled Chromium version
- release revision (
r1,r2, …) - notable changes since the previous release revision or version
The runtime bundle release notes should be derived from:
chromium/CHANGELOG.md- the crate changelogs when a runtime release depends on crate-side changes that should be called out explicitly
Recommended release note structure:
Crates
- cbf: 0.1.0
- cbf-chrome: 0.1.0
- cbf-chrome-sys: 146.1.0
Bundled runtime
- Chromium: 146.0.7632.160
- Release revision: r1
Notes
- Initial public prebuilt release for Chromium milestone 146.
Each crate release should explicitly record:
- crate name
- crate version
- notable changes in that crate
- compatibility notes
- related runtime bundle release tags when the crate expects a specific runtime
Each crate release note should be derived from that crate’s local
CHANGELOG.md.
7. Changelog Layout
CBF keeps changelogs close to the release unit they describe.
Recommended changelog files:
crates/cbf/CHANGELOG.mdcrates/cbf-chrome/CHANGELOG.mdcrates/cbf-chrome-sys/CHANGELOG.mdcrates/cbf-compositor/CHANGELOG.mdcrates/cbf-cli/CHANGELOG.mdchromium/CHANGELOG.md
Rules:
- Each crate changelog tracks only that crate’s public release history.
chromium/CHANGELOG.mdtracks runtime bundle history forChromium.app,libcbf_bridge.dylib, and other Chromium-side packaging changes that affect prebuilt runtime releases.- GitHub Release notes should summarize and link back to the corresponding changelog entry instead of becoming the only source of change history.
- Maintainers may include only the relevant excerpt in GitHub Release notes, but the full changelog entry should remain in the repository.
8. Maintainer Guidance
- Treat crate versions and GitHub Release tags as separate identifiers with different responsibilities.
- Create crate releases for public crate publishes so each crate has its own visible release history.
- Maintain one changelog per public crate and one runtime changelog under
chromium/CHANGELOG.md. - Do not try to keep
cbfandcbf-chromenumerically aligned when their actual release cadence differs. - Do not force a
cbf-chrome-syspublish only because a runtime bundle was rebuilt. - Publish a new
cbf-chrome-sysversion when ABI or wire-boundary compatibility changes should be visible to Cargo users. - Keep runtime bundle release notes explicit about both the crate line and the packaged Chromium revision.
- Keep the crate tag namespace and runtime tag namespace distinct.