v0.16.0 β theme management
Theme management: fxcss can now keep an installed theme up to date, put it back, say what is installed in every profile, and take over a theme it did not install.
fxcss profiles (#10)
Firefox names profile directories after a hash, so "which profile has the theme in it" is a hard question to answer by looking. This answers it, read-only:
$ fxcss profiles --check
β default-release [Release]
theme AdamXweb/WhiteSurFirefoxThemeMacOS @ v1.6.3
installed 2026-08-14 09:12:44 (tracking the release)
sheets theme-nord
files 137 file(s), 1 edited since install, 1 added by hand
update v2.0.0 available β 2026-08-16Three states are kept apart: a profile fxcss installed into, one with a chrome/ someone put there by hand, and one with no theme at all. --check asks GitHub once per theme and reports five outcomes rather than a boolean β pinned and unknown are distinct from current, because "up to date" that was never actually checked is the one wrong answer someone would act on. --json for scripting.
fxcss upgrade and fxcss rollback (#11)
upgrade re-installs what a profile already has, at whatever is newest of the kind it tracks: the newest tag for a release install, the current commit for a branch, nothing at all for one pinned with --ref.
It stops rather than surprise you in three places β files you have edited since installing, an optional stylesheet the new version renamed or dropped (a missing @import fails silently, so that option would otherwise switch itself off with no output), and, with --audit, selectors the new version needs that your Firefox does not have.
--check changes nothing and answers through its exit code: 0 up to date, 1 an upgrade is available, 2 cannot be told. No scheduler ships with fxcss; this is the piece to point cron or launchd at.
rollback restores a backup, and what was installed becomes a backup in its turn, so it undoes itself. The backup stack describes itself, because the manifest travels inside chrome/:
$ fxcss rollback --list
chrome.backup-20260817014202
AdamXweb/WhiteSurFirefoxThemeMacOS@v1.6.3
chrome.backup-20260817014143 (the original)
your own chrome/, from before fxcssThat last one is what makes uninstall keep meaning what it says: after five upgrades the newest backup holds the theme, not your files, so the original is carried forward and is never pruned by --keep.
Optional sheets that cancel each other out (#12)
A theme's options are separate stylesheets, and installing two is two @imports. Some pairs are alternatives rather than additions: two colour themes means the later one silently wins outright, leaving a browser that looks like neither.
fxcss now measures this instead of guessing at names β two sheets are alternatives when they set the same properties on the same selectors, which is provable from their text and true whatever they are called. install refuses (--force overrides), try reports and continues, and tweaks says so before screenshotting a --combo that cannot take effect.
fxcss adopt (#13)
Most themed profiles were not themed by fxcss β someone ran the theme's install.sh, or copied a folder in by hand. adopt identifies what is there by hashing every file the way git hashes a blob and comparing against the repository's own tree at each recent version, so a match is the same bytes rather than a guess:
$ fxcss adopt AdamXweb/WhiteSurFirefoxThemeMacOS
comparing 148 file(s) against AdamXweb/WhiteSurFirefoxThemeMacOS β¦
v2.0.0: 129/135 files match, 6 edited, 7 addedNothing is installed or replaced: your chrome/ is copied to a backup and then described, so upgrade, rollback and uninstall all start working. Files that already differed from the release are recorded, and an upgrade will not overwrite them without being told.
Also
- The install manifest gained a schema version, structured source fields, a sha256 per file, and the prefs each version asked for. Manifests written by earlier releases are read and filled out in memory; nothing rewrites a file it did not author, and where an old manifest cannot answer, fxcss says so rather than assuming.
429joins403in the rate-limit message pointing atGITHUB_TOKEN.- A duplicated test class was removed (#9).
Upgrading from 0.15: nothing changes for existing installs. Profiles installed by an earlier fxcss keep working; they report as not checked for edits until reinstalled, because no file hashes were recorded at the time.