Status
Phase 0 (spike), 1 (runtime), 2 (composition + nvim decomposed: rg/fd composed not vendored), 3 (binary cache: pull + push, verified against isolated MinIO with cross-package blob sharing) — DONE. Bash retired.
Distribution — DONE: multi-cache pull, install (URL/nickname/bare +
default-entrypoint fetch), entrypoint layering
(deep_merge(default ⊕ override)), config cat/edit, push --entrypoint.
Source/cache unification — DONE: source (local +
git, form-inferred) replaces the old remote --kind git + env-var + symlink
escape hatches; cache (HTTPS/S3) replaces remote --kind cache. build
resolves Containerfiles + default entrypoints from registered sources.
Verified end-to-end (source add →
config cat → build → run, single + multi-package compose; install forms +
multi-cache fallback unchanged). The cn link-entrypoints recipe is deleted
(replaced by a one-time bubblebox source add personal <cn>/…/bubblebox).
Devshells — DONE (Phase 4 v1): composable, stackable dev environments via
bubblebox shell — reusable base shells + per-project bubblebox.toml
overlays, base inheritance with append-merge, an opt-in constrained init
hook, and the bubblebox-enter-shell helper. See Devshells.
Home management — DONE (Phase B/C): declarative [[files]]/[[units]]
in profile.toml; apply hashes file contents into the store and symlinks
$HOME/<dst> → the blob (units land in ~/.config/systemd/user/ + optional
systemctl --user enable --now). Replaces the old cjust link/cjust units.
Rollback restores a previous file set (generations switch). See
Home-Management-Plan (wiki).
Profile-in-place (v0.3.0) — DONE: --profile / BUBBLEBOX_PROFILE; a
symlinked default profile resolves next to its target, and the lock is mirrored
beside an out-of-config profile. The thinkpad is a pure consumer: it runs the
pinned release engine (cjust bubblebox-install), applies the profile in
place from cn, and pulls only from the signed CI-published cache. See
GC-and-Generations §5 Phase 2.
Flatpak provider (v0.4.0) — [flatpak]: declarative per-user (default) or
system flatpak apps + remotes; ownership/extras/prune, heals manual
uninstalls, generations switch re-converges the declared set, plan --json
gains a flatpak section. See Decisions #14.
Deferred (low priority): config export (fork a baked config — needs in-image
config-path decision); GC / generations / rollback / lockfiles /
upgrade/remove — mostly landed (see GC-and-Generations; Phase 1
digest-addressed descriptors, Phase 2 declarative apply/generations +
profile.toml/profile.lock, Phase 3 gc, list/info introspection,
and the plan dry-run (--json for machines) implemented; only the
install/remove/upgrade sugar over profile.toml
remains); devshell multi-base (transient pull-on-entry + per-project
bubblebox.lock landed — see Devshells §7); authenticated
pull; per-blob content verify; ed25519 descriptor signing; multi-arch (x86_64
only).
Git
Remote: ssh://git@git.crussell.io:2222/chad/bubblebox.git (origin on both
thinkpad + bee since 2026-09-09; this instance is the single source of truth —
the bee/thinkpad divergence was reconciled via a -s ours merge f4dda2a that
keeps thinkpad's tree and records bee's subsumed Phase B/C commits in
ancestry). Commit messages follow <area>: <imperative summary> — see git log --oneline. bubblebox and cn are separate repos; a
change that spans both (e.g. a new entrypoint + the tool that consumes it) lands
as one commit per repo.
Commit policy (maintainer preference, 2026-08-26): commit early and often.
Agents should save their work in small, well-scoped commits as they go instead
of banking a large uncommitted diff, and should not ask before committing —
committing is always safe here. The single hard exception: never trigger
automatic rebuilds/deploys of nix configs against live machines (the cn
repo's deploy surface). Committing to bubblebox/bubblebox-pkgs never does
that; if a change touches deployment automation, leave the deploy itself to
the maintainer.