Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
250 commits
Select commit Hold shift + click to select a range
6023f72
feat: implement skillet configuration tool with containerized integra…
gbagnoli Mar 21, 2026
3b2b4e4
refactor: address PR review comments
gbagnoli Mar 21, 2026
d24fa66
refactor: replace expect with proper error propagation in cli crates
gbagnoli Mar 21, 2026
8c0debc
ci: add skillet quality checks to GitHub workflow
gbagnoli Mar 21, 2026
f48e380
fix: resolve clippy type complexity warning in test_utils
gbagnoli Mar 21, 2026
d1b48fa
refactor: simplify integration test container setup
gbagnoli Mar 23, 2026
dd5fa62
feat: implement service management and systemctl restart
gbagnoli Mar 23, 2026
3504d39
refactor(skillet): address code review comments
gbagnoli Mar 23, 2026
e218cdc
feat(skillet): implement ssh hardening and enforce pedantic clippy lints
gbagnoli Apr 3, 2026
04350eb
test(skillet): update beezelbot integration test recording
gbagnoli Apr 3, 2026
1a43b81
refactor(skillet): address second round of review comments
gbagnoli Apr 3, 2026
a511656
refactor(skillet): address review comments including systemd DBus int…
gbagnoli Apr 4, 2026
cf8889f
refactor(skillet): optimize file hashing and verify directory types
gbagnoli Apr 4, 2026
500dc70
refactor(skillet): address review comments on file hashing and direct…
gbagnoli Apr 4, 2026
5f1ad94
refactor(skillet): improve file/directory type verification and handl…
gbagnoli Apr 4, 2026
43462ec
refactor(skillet): optimize systemd unit handling and improve test ru…
gbagnoli Apr 4, 2026
2753cac
refactor(skillet): fix Sha256 usage and use constant for group existe…
gbagnoli Apr 4, 2026
d51f0f7
refactor(skillet): ensure I/O errors are not ignored during hashing a…
gbagnoli Apr 5, 2026
b006b7e
refactor(skillet): optimize file metadata calls and hashing, and refi…
gbagnoli Apr 5, 2026
f619913
refactor(skillet): update architectural docs and consolidate director…
gbagnoli Apr 6, 2026
3edc0bd
refactor(skillet): improve robustness of file operations and optimize…
gbagnoli Apr 7, 2026
72bf238
chore(skillet): commit missing files from previous refactor
gbagnoli Apr 7, 2026
930e25c
Apply suggestions from code review
gbagnoli Apr 7, 2026
c8d830d
feat(clamps): add skillet run for clamps host
gbagnoli Apr 7, 2026
fea6303
refactor(skillet): ensure deterministic Quadlet generation and optimi…
gbagnoli Apr 8, 2026
edfcaa8
feat(podman): implement podman_container resource with UID/GID mappin…
gbagnoli Apr 8, 2026
bff478b
refactor(skillet): implement host-specific configuration and pihole c…
gbagnoli Apr 8, 2026
a424b24
refactor(skillet): implement pihole as standalone crate and support h…
gbagnoli Apr 8, 2026
551ec40
feat(skillet): implement host-specific config dispatch and pihole con…
gbagnoli Apr 8, 2026
9b8b6ed
feat(pihole): pass pihole user configuration from host and run as unp…
gbagnoli Apr 8, 2026
ce6007b
feat(pihole): update pihole UID/GID to 40000 on clamps
gbagnoli Apr 8, 2026
38a6eb2
docs(skillet): add README.md with basic info
gbagnoli Apr 8, 2026
92bd884
fix(test): make entrypoint executable and use absolute path for skill…
gbagnoli Apr 8, 2026
7065786
fix(test): properly copy and chmod skillet binary in container
gbagnoli Apr 8, 2026
c26a61f
feat(pihole): implement unprivileged user execution and fix group nam…
gbagnoli Apr 8, 2026
9a3cd84
feat(pihole): update pihole UID to 40000
gbagnoli Apr 8, 2026
b3f7dc4
Remove unused code
gbagnoli Apr 8, 2026
51fc85e
feat(cli): add --inspect flag to test subcommands and fix binary copy…
gbagnoli Apr 9, 2026
b68fc5f
feat(skillet): implement secure secret management and quadlet integra…
gbagnoli Apr 11, 2026
32f8f3d
refactor(core): implement robust resource management and address PR c…
gbagnoli Apr 11, 2026
6577088
refactor(core): improve idempotency and address PR review comments
gbagnoli Apr 11, 2026
18c826f
refactor(core): refine symlink and metadata handling in files module
gbagnoli Apr 11, 2026
408feca
feat(cli): restore --inspect flag to test subcommands
gbagnoli Apr 11, 2026
fd6c829
refactor: address PR review comments for skillet configuration tool
gbagnoli Apr 14, 2026
8dbf310
refactor: implement architectural and security improvements from PR r…
gbagnoli Apr 14, 2026
750a91f
build: default to static musl target for skillet binaries
gbagnoli Sep 22, 2026
ab6b3bf
Fix clippy lints blocking skillet-checks
gbagnoli Sep 22, 2026
3ed81b1
Fix next batch of clippy lints blocking skillet-checks
gbagnoli Sep 22, 2026
0b4e806
Hoist similar_names allow to fn level
gbagnoli Sep 22, 2026
def96e7
Fix clippy lints in skillet bin crate
gbagnoli Sep 22, 2026
e4e1e46
Merge pull request #50 from gbagnoli/musl-static-build
gbagnoli Sep 22, 2026
d3c6bc9
skillet: unify per-host apply logic in skillet_cli_common::hosts
gbagnoli Sep 22, 2026
22a90cf
skillet: construct CredentialManager lazily, only for hosts that need…
gbagnoli Sep 22, 2026
0a49871
skillet: move Pi-hole placeholders into per-host config, use real cre…
gbagnoli Sep 22, 2026
40d1f40
skillet: add SELinux :z relabeling to Pi-hole volume mounts
gbagnoli Sep 22, 2026
0e56062
skillet: restart the unit when its quadlet file changes
gbagnoli Sep 22, 2026
708c416
skillet: add service_enable and auto-enable quadlets with [Install]
gbagnoli Sep 22, 2026
7781781
skillet: make service start/restart blocking and verify with is-active
gbagnoli Sep 22, 2026
9197de2
skillet: fix UID/GID mapping arithmetic and host GID lookup
gbagnoli Sep 22, 2026
f2046d4
skillet: reject path traversal in CredentialManager::read_secret
gbagnoli Sep 22, 2026
da7b3c1
skillet: pass --host explicitly when integration tests use the generi…
gbagnoli Sep 22, 2026
fde0742
skillet: apply cargo fmt to new/changed code
gbagnoli Sep 22, 2026
a8c15a7
skillet: fix clippy pedantic warnings under --all-targets
gbagnoli Sep 22, 2026
e10d265
systemd: use systemctl --wait instead of polling is-active
gbagnoli Sep 22, 2026
aaeb78e
skillet: fix shellcheck SC2006 in test_entrypoint.sh mock comment
Sep 22, 2026
2fb029a
Merge pull request #51 from gbagnoli/skillet-fixes-batch-1
gbagnoli Sep 22, 2026
e4c5b7e
Use virt-install for CoreOS VMs
gbagnoli Sep 22, 2026
1fa4fd4
clamps: autorebase to ghcr.io/gbagnoli/ucore-clamps on first boot
Sep 25, 2026
6ad2c0e
clamps: add baseline convergence and VM bootstrap checks
gbagnoli Sep 26, 2026
d36a22e
skillet: restore integration test runner command
gbagnoli Sep 26, 2026
13d1fc3
skillet: auto-select smoke test binaries
gbagnoli Sep 26, 2026
b1556e1
skillet: manage disposable smoke VM lifecycle
gbagnoli Sep 26, 2026
8019d66
butane: avoid oversized Ignition fw_cfg payload
gbagnoli Sep 26, 2026
fa5904f
butane: execute clamps bootstrap and skillet from labeled bin path
gbagnoli Sep 26, 2026
304dca3
skillet: preserve ignition SSH access across clamps rebase
gbagnoli Sep 26, 2026
832d784
Share uCore bootstrap and disposable VM tooling
gbagnoli Sep 26, 2026
67852af
Use host and instance arguments for test VMs
gbagnoli Sep 26, 2026
918c9cb
Repair Skillet container integration runner
gbagnoli Sep 26, 2026
91ae212
Skip unavailable Cookstyle in pre-push hook
gbagnoli Sep 26, 2026
c3ae98a
Support Flatpak libvirt for disposable test VMs
gbagnoli Sep 27, 2026
426930c
Document secret delivery and VM lifecycle; organize migration plans
gbagnoli Sep 27, 2026
a4b6c37
Provision clamps Pi-hole credentials from XDG vault
gbagnoli Sep 27, 2026
c4f3b77
Document clamps Btrfs data layout and migration steps
gbagnoli Sep 27, 2026
cbe8e38
Record fresh clamps VM smoke acceptance
gbagnoli Sep 27, 2026
970f846
Share Btrfs data and Podman storage across uCore hosts
gbagnoli Sep 27, 2026
c7a356c
fix(butane): support native libvirt on Rocky Linux
gbagnoli Sep 28, 2026
db3e53c
feat(skillet): create and deliver KeePass host credentials
gbagnoli Sep 28, 2026
db58bf0
fix(skillet): cache vault unlock in expiring session keyring
gbagnoli Sep 28, 2026
76f0f35
docs(plan): record clamps rebase and recovery checks
gbagnoli Sep 28, 2026
2885014
fix(ci): run container checks with base phase
gbagnoli Sep 28, 2026
60fa0b5
feat(pihole): add shared DNS network
gbagnoli Sep 28, 2026
10a407d
feat(syncthing): provision clamps service
gbagnoli Sep 28, 2026
b35bb8d
docs(access): choose private tailnet UI routing
gbagnoli Sep 28, 2026
802880a
docs(plan): hand off clamps btrbk milestone
gbagnoli Sep 28, 2026
3e3d9ed
feat(btrbk): add host-configurable snapshot convergence
gbagnoli Sep 29, 2026
8a34887
fix(systemd): avoid waiting for unit termination
gbagnoli Sep 29, 2026
aba3f91
docs(btrbk): require leaf snapshot sources
gbagnoli Sep 29, 2026
58782e2
docs(tailscale): document provisioning and split DNS
gbagnoli Sep 29, 2026
afb6f40
feat(tailscale): provision and clean up host identities
gbagnoli Sep 30, 2026
86c7c2a
docs(tailscale): document provisioning and DNS decisions
gbagnoli Sep 30, 2026
732634f
fix(syncthing): keep the GUI on the private container network
gbagnoli Oct 1, 2026
8ffaf39
feat(credentials): allow installation before service activation
gbagnoli Oct 1, 2026
875deca
feat(caddy): add private UI configuration and credential delivery
gbagnoli Oct 1, 2026
5d4e5d0
docs(ublue): plan generic UI provisioning and record validation
gbagnoli Oct 1, 2026
4391246
feat(skillet): generalize private UI provisioning
gbagnoli Oct 1, 2026
a0fb991
test(caddy): verify idempotent generic apply
gbagnoli Oct 1, 2026
eb2bc4e
docs: record generic private UI provisioning
gbagnoli Oct 1, 2026
bb35651
docs(ublue): define Cloudflare UI lifecycle and aliases
gbagnoli Oct 1, 2026
3af993e
feat(skillet): manage Cloudflare UI credentials and DNS
gbagnoli Oct 2, 2026
1f9f9f5
docs(ublue): record Cloudflare UI lifecycle
gbagnoli Oct 2, 2026
25244ff
docs(cloudflare): clarify token issuer permissions
gbagnoli Oct 2, 2026
0d5dc72
docs(skillet): record local musl compiler setup
gbagnoli Oct 2, 2026
4b9ef6a
docs(acceptance): record musl build and vault unlock blocker
gbagnoli Oct 2, 2026
67c81e8
docs(storage): plan TPM encrypted root and acceptance tests
gbagnoli Oct 2, 2026
0937807
fix(cloudflare): explain zone preflight permission requirements
gbagnoli Oct 2, 2026
b40b7ac
feat(caddy): derive relative UI namespace from Cloudflare zone
gbagnoli Oct 2, 2026
8fcb583
feat(cloudflare): support account-owned token issuers
gbagnoli Oct 2, 2026
f91c63a
test(cloudflare): cover mutation retry recovery
gbagnoli Oct 2, 2026
b6a26e6
test(caddy): probe non-tailnet UI denial in VM
gbagnoli Oct 2, 2026
404c92c
docs(pihole): record smoke DNS checks
gbagnoli Oct 2, 2026
d3a9657
docs(plan): group deferred network acceptance checks
gbagnoli Oct 2, 2026
37fc526
feat(unifi): add clamps controller container
gbagnoli Oct 2, 2026
6765ecb
fix(unifi): support numeric container ownership
gbagnoli Oct 3, 2026
6f450ad
docs(unifi): record VM acceptance
gbagnoli Oct 3, 2026
471068f
docs(skillet): define architecture refactoring prerequisite
gbagnoli Oct 3, 2026
544b8e5
refactor(vm): add typed manifests and strict legacy import
gbagnoli Oct 3, 2026
d799ace
fix(vm): centralize owned disposal and recover absent guests
gbagnoli Oct 3, 2026
cbfa1c2
refactor(vm): share catalog and Cargo artifact discovery
gbagnoli Oct 3, 2026
67d8f54
fix(vm): preserve manifests through artifact cleanup failures
gbagnoli Oct 3, 2026
fc88433
refactor(vm): add bounded shared SSH transport
gbagnoli Oct 3, 2026
4c7092e
refactor(vm): migrate retained binary updates to Rust
gbagnoli Oct 3, 2026
a9c00d3
refactor(vm): migrate guest readiness checks to Rust
gbagnoli Oct 3, 2026
0a0de81
fix(vm): recover failed readiness retries safely
gbagnoli Oct 3, 2026
226c661
docs(vm): link readiness recovery evidence
gbagnoli Oct 3, 2026
fd9ec85
feat(vm): persist recoverable creation intents
gbagnoli Oct 3, 2026
e4da712
refactor(vm): render native domain XML in Rust
gbagnoli Oct 3, 2026
45eec4b
refactor(vm): move local artifact preparation to Rust
gbagnoli Oct 3, 2026
cfe3872
refactor(vm): move Butane staging to Rust
gbagnoli Oct 3, 2026
ea61803
refactor(vm): move native define and start into Rust
gbagnoli Oct 3, 2026
ba1142e
refactor(vm): move reboot and guest access into Rust
gbagnoli Oct 3, 2026
b259119
refactor(vm): add Rust Flatpak creation adapter
gbagnoli Oct 3, 2026
d341498
refactor(vm): move create orchestration into Rust
gbagnoli Oct 3, 2026
7b8dd0a
docs(vm): record Rust lifecycle migration
gbagnoli Oct 3, 2026
c031aee
refactor(hosts): centralize host profiles
gbagnoli Oct 3, 2026
4144af4
refactor(core): inject host identity and credentials
gbagnoli Oct 3, 2026
fe181f2
refactor(core): split file effect capabilities
gbagnoli Oct 3, 2026
0e6d7ab
refactor(core): split system effect capabilities
gbagnoli Oct 3, 2026
6cf9d54
refactor(vm): share credential delivery transport
gbagnoli Oct 3, 2026
d97b454
refactor(tailscale): replace curl with Rust HTTP client
gbagnoli Oct 3, 2026
e77c001
refactor(workstation): extract vault and guest credentials
gbagnoli Oct 3, 2026
f767151
refactor(workstation): extract Cloudflare provider
gbagnoli Oct 3, 2026
798cca4
refactor(workstation): extract Tailscale provider
gbagnoli Oct 3, 2026
badc341
refactor(workstation): model provisioning policy
gbagnoli Oct 3, 2026
4da7571
refactor(podman): move DNS policy to host baseline
gbagnoli Oct 3, 2026
bb94318
refactor(podman): model process identity explicitly
gbagnoli Oct 3, 2026
d436803
refactor(podman): type networks and port bindings
gbagnoli Oct 3, 2026
3ef996b
refactor(podman): share data mount dependencies
gbagnoli Oct 4, 2026
9c54351
refactor(skillet): unify activation and recording
gbagnoli Oct 4, 2026
25cf3a7
test(skillet): isolate smoke fixture and verify artifacts
gbagnoli Oct 4, 2026
a597a54
refactor(skillet): share credential guest transport
gbagnoli Oct 4, 2026
c24cc9d
test(skillet-core): share file adapter contracts
gbagnoli Oct 4, 2026
6700e1b
test(skillet-core): verify account lookup adapters
gbagnoli Oct 4, 2026
2fb6f64
test(skillet-core): verify system effect contracts
gbagnoli Oct 4, 2026
fd423f9
refactor(skillet-podman): type volume root ownership
gbagnoli Oct 4, 2026
72397e2
refactor(workstation): own provider cleanup journals
gbagnoli Oct 4, 2026
5bfbb1c
refactor(workstation): share private UI provisioning plan
gbagnoli Oct 4, 2026
b442dfc
refactor(tailscale): parse guest status in provider
gbagnoli Oct 4, 2026
9d00748
refactor(tailscale): share enrollment retry policy
gbagnoli Oct 4, 2026
430f2f6
fix(skillet): fail closed on Tailscale probe errors
gbagnoli Oct 4, 2026
3fe5e1a
refactor(vm): install deferred credentials as a set
gbagnoli Oct 4, 2026
f74119b
refactor(workstation): own disposable Tailscale enrollment
gbagnoli Oct 4, 2026
0023a3c
refactor(workstation): own disposable UI DNS provisioning
gbagnoli Oct 4, 2026
dc987a3
build(skillet): record workstation VM dependency
gbagnoli Oct 4, 2026
980af4a
refactor(workstation): own disposable Cloudflare cleanup
gbagnoli Oct 4, 2026
ab7d5f3
refactor(workstation): own disposable Tailscale cleanup
gbagnoli Oct 4, 2026
7055abe
refactor(workstation): own persistent UI delivery
gbagnoli Oct 4, 2026
ed791d7
refactor(workstation): own disposable Caddy delivery
gbagnoli Oct 4, 2026
d93ca42
refactor(workstation): own host credential delivery
gbagnoli Oct 4, 2026
c516a4c
docs(skillet): record remaining ownership boundary gap
gbagnoli Oct 4, 2026
9f1a79d
refactor(vm): use owned manifests for provisioning
gbagnoli Oct 4, 2026
d3066b7
docs(skillet): record provisioning ownership boundaries
gbagnoli Oct 4, 2026
b4b4506
refactor(core): unify file ownership inputs
gbagnoli Oct 4, 2026
ccd5eba
docs(skillet): record unified ownership contract
gbagnoli Oct 4, 2026
8b14b76
feat(cli): add standalone vault unlock command
gbagnoli Oct 4, 2026
6177483
docs(skillet): record clamps smoke acceptance
gbagnoli Oct 4, 2026
103167b
fix(vm): handle fresh host provisioning prerequisites
gbagnoli Oct 4, 2026
5ab6e05
docs: record fresh VM acceptance and shared zone path
gbagnoli Oct 4, 2026
43cfe66
fix(workstation): scope Cloudflare zone by environment
gbagnoli Oct 4, 2026
72f9d4c
fix(workstation): use prod and test vault groups
gbagnoli Oct 4, 2026
06f4989
docs: record successful test ACME acceptance
gbagnoli Oct 4, 2026
5cd2e22
docs(skillet): reconcile refactor acceptance status
gbagnoli Oct 4, 2026
3f750a3
fix(ci): install required tools
gbagnoli Oct 5, 2026
511447b
docs(skillet): complete refactor acceptance record
gbagnoli Oct 5, 2026
24c0d6c
refactor(vm): move smoke lifecycle under Rust
gbagnoli Oct 5, 2026
4b92b58
test(core): align resource fakes with runtime contracts
gbagnoli Oct 5, 2026
0985c1d
ci: run bootstrap state regression suite
gbagnoli Oct 5, 2026
161ba63
docs: track refactor follow-up acceptance
gbagnoli Oct 5, 2026
fc62cdb
fix(workstation): probe Caddy through its bridge address
gbagnoli Oct 5, 2026
b5d6716
fix(test): check the managed Btrfs timer unit
gbagnoli Oct 5, 2026
5f856ff
docs: record live application acceptance
gbagnoli Oct 5, 2026
9fb43fd
test(vm): script interrupted reboot recovery
gbagnoli Oct 5, 2026
43438e3
fix(syncthing): map container identity to data owner
gbagnoli Oct 5, 2026
126004f
fix(cli): improve application smoke diagnostics
gbagnoli Oct 5, 2026
71eb002
docs(plan): park Syncthing VM acceptance
gbagnoli Oct 5, 2026
c8f5d7e
docs(clamps): audit parity and plan Cloudflare DDNS port
gbagnoli Oct 6, 2026
0c6bed4
fix(ci): satisfy Rust 1.99 and scoped ShellCheck checks
gbagnoli Oct 6, 2026
82465cc
feat(ddns): add optional updater and scoped credential delivery
gbagnoli Oct 6, 2026
c378ce6
feat(ddns): add disposable ownership lifecycle
gbagnoli Oct 6, 2026
1f286d1
docs(ddns): record disposable acceptance status
gbagnoli Oct 6, 2026
e3674fc
feat(config): resolve vault references in service templates
gbagnoli Oct 6, 2026
ce68783
feat(datadog): add optional rootful agent and service monitoring
gbagnoli Oct 7, 2026
bbfcae8
feat(secrets): audit vault requirements and unused entries
gbagnoli Oct 7, 2026
28ed7a3
fix(podman): preserve literal Quadlet directives
gbagnoli Oct 7, 2026
511de06
fix(datadog): share API key and preserve Agent integrations
gbagnoli Oct 7, 2026
869c438
docs(acceptance): record DDNS and Datadog VM results
gbagnoli Oct 7, 2026
196ce80
fix(datadog): order boot discovery after monitored workloads
gbagnoli Oct 8, 2026
59fea9d
feat(datadog): separate lab telemetry from production regions
gbagnoli Oct 8, 2026
69e908d
docs(datadog): record test monitor exclusions and setup key
gbagnoli Oct 8, 2026
7b01e86
fix(datadog): enable perf events under Podman seccomp
gbagnoli Oct 8, 2026
db7ff94
feat(vm): forward local UI ports through owned SSH sessions
gbagnoli Oct 8, 2026
a1da068
test(unifi): prepare fenced backup restore acceptance
gbagnoli Oct 8, 2026
81f11c4
docs(unifi): record restored-data acceptance and email follow-up
gbagnoli Oct 9, 2026
62fb216
docs(unifi): reconcile migration acceptance summary
gbagnoli Oct 9, 2026
b1945ac
docs(unifi): close isolated restore acceptance
gbagnoli Oct 9, 2026
0a3d8b7
docs(smtp): plan shared Postfix relay provisioning
gbagnoli Oct 9, 2026
556fb22
feat(secrets): validate structured SMTP vault fields
gbagnoli Oct 9, 2026
b145f49
feat(smtp): provision shared native fleet relay with isolated tests
gbagnoli Oct 9, 2026
9925265
fix(smtp): initialize persistent Postfix state on ostree hosts
gbagnoli Oct 9, 2026
a792859
feat(smtp): opt in to live provider checks on owned VMs
gbagnoli Oct 9, 2026
1944f78
fix(smtp): prepare trusted TLS and confined credential access
gbagnoli Oct 9, 2026
c784001
docs(smtp): record Mailjet delivery and Gmail acceptance
gbagnoli Oct 9, 2026
b5c9774
docs(clamps): park UniFi email and identify exit-node milestone
gbagnoli Oct 9, 2026
3d15abe
feat(tailscale): configure caller-selected production exit nodes
gbagnoli Oct 9, 2026
cdeb737
docs(clamps): audit host access and baseline parity
gbagnoli Oct 9, 2026
eb38ba2
feat(access): finalize sudo and first-login password policy
gbagnoli Oct 9, 2026
3a5accc
docs(storage): audit TPM encryption and boot prerequisites
gbagnoli Oct 10, 2026
de914bf
feat(vm): add native TPM-encrypted root profile
gbagnoli Oct 10, 2026
b65777d
feat(storage): archive verified root recovery keys in KeePassXC
gbagnoli Oct 10, 2026
bfc7ed7
docs(storage): record live vault recovery acceptance
gbagnoli Oct 10, 2026
3f0d75d
feat(storage): archive verified LUKS headers in KeePassXC
gbagnoli Oct 10, 2026
ec8ac14
feat(vm): add isolated TPM-loss recovery acceptance
gbagnoli Oct 10, 2026
83725c2
docs(storage): record TPM-loss recovery acceptance
gbagnoli Oct 10, 2026
3b8028a
feat(installation): prepare guarded physical USB install media
gbagnoli Oct 10, 2026
3ca517e
docs(installation): record USB media and VM regression acceptance
gbagnoli Oct 10, 2026
4237755
docs(fleet): reconcile clamps gates and plan boxy replacement
gbagnoli Oct 11, 2026
13961a1
feat(beelzebot): compose boxy services and shared VM bootstrap
gbagnoli Oct 11, 2026
e9a00c6
docs(pihole): track private DNS convergence before cutover
gbagnoli Oct 11, 2026
bf2230f
docs(beelzebot): record fresh boot and fixture acceptance
gbagnoli Oct 11, 2026
93cbbdb
docs(home-assistant): plan deployment and encrypted backups
gbagnoli Oct 11, 2026
ad1a08c
refactor(fleet)!: rename replacement hosts to joey and donbot
gbagnoli Oct 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 67 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: CI

on:
push:
branches: [ main, master ]
branches: [ main, master, skillet ]
pull_request:
branches: [ main, master ]
branches: [ main, master, skillet ]

jobs:
chef-lint:
Expand Down Expand Up @@ -47,5 +47,68 @@ jobs:
- uses: actions/checkout@v4
- name: Run ShellCheck
run: |
find . -name "*.sh" -not -path "./.venv/*" -not -path "./berks-cookbooks/*" -exec shellcheck -x {} +
shellcheck -x run
find . -type f \
\( -name '*.sh' -o -name run -o -name butane -o -name flatpak-virt \
-o -name test-vm -o -name test-vm-ready -o -name virsh -o -name virt-install \
-o -name install-hardware \
-o -name setup-llama-server -o -name update-llama \) \
-not -path './.git/*' -not -path './.venv/*' -not -path './berks-cookbooks/*' \
-not -path '*/target/*' -not -path './ublue/llama/files/update-llama' \
-exec shellcheck -x {} +
# This desktop helper intentionally ignores a failed best-effort stop.
shellcheck -x --exclude=SC2015 ublue/llama/files/update-llama

skillet-checks:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dorny/paths-filter@v3
id: filter
with:
filters: |
rust:
- 'ublue/skillet/**'
- 'ublue/butane/**'
- 'ublue/AGENTS.md'
- '.github/workflows/ci.yml'

- name: Set up Rust
if: steps.filter.outputs.rust == 'true'
uses: dtolnay/rust-toolchain@stable
with:
components: clippy, rustfmt
targets: x86_64-unknown-linux-musl

- name: Install musl linker
if: steps.filter.outputs.rust == 'true'
run: sudo apt-get update && sudo apt-get install --yes musl-tools

- name: Rust Cache
if: steps.filter.outputs.rust == 'true'
uses: Swatinem/rust-cache@v2
with:
workspaces: ublue/skillet

- name: Run Clippy
if: steps.filter.outputs.rust == 'true'
run: cd ublue/skillet && cargo clippy --workspace --all-targets -- -D warnings

- name: Check formatting
if: steps.filter.outputs.rust == 'true'
run: cd ublue/skillet && cargo fmt --all -- --check

- name: Run Unit Tests
if: steps.filter.outputs.rust == 'true'
run: cd ublue/skillet && cargo test --workspace --all-targets

- name: Run Integration Tests
if: steps.filter.outputs.rust == 'true'
run: |
cd ublue/skillet
cargo run --bin skillet -- test run joey --phase base --image fedora:latest

- name: Run installation and bootstrap regressions
if: steps.filter.outputs.rust == 'true'
run: |
bash ublue/butane/tests/bootstrap.sh
bash ublue/butane/tests/hardware.sh
96 changes: 96 additions & 0 deletions SECRETS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
# Skillet secrets checklist

Vault: `$XDG_DATA_HOME/skillet/secrets.kdbx` (default:
`~/.local/share/skillet/secrets.kdbx`). Paths are **group path + entry title**.
Unless an entry documents other fields, put its value in **Password** and
leave **Username** empty. `<environment>` is `prod` or `test`; `<host>` is the
canonical host name. Only prepare entries for enabled modules.

Audit with `skillet secrets check` (all declared hosts, production), or
`skillet secrets check --host clamps --environment test`. It checks required fields and their formats, without provider calls or generating secrets.
Missing optional/generated/planned entries do not fail the check.

<!-- Generated from ublue/skillet/crates/workstation/src/secret-requirements.json. -->

## Btrbk

No vault entries for the current local snapshot configuration.

## Caddy

Prepare the shared Cloudflare entries. [UI setup](ublue/skillet/README.md#caddy-ui-credentials).

| Entry | Status | Fields / how to obtain them |
| --- | --- | --- |
| `skillet/environments/<environment>/hosts/<host>/cloudflare/acme-token` | Generated | Skillet creates the persistent scoped token; do not create disposable VM tokens manually. |
| `skillet/hosts/<host>/cloudflare/acme-token` | Generated | Legacy production token read during migration. Do not create new entries at this path. |

## Cloudflare

Shared inputs for Caddy and DDNS.

| Entry | Status | Fields / how to obtain them |
| --- | --- | --- |
| `skillet/cloudflare/token-creator` | Required | Create an account-owned Cloudflare API token with Account API Tokens Write and Zone Read, restricted to the selected zones. [Permissions guide](ublue/skillet/README.md#secret-setup-and-delivery). |
| `skillet/environments/<environment>/dns/cloudflare-zone-id` | Required | Copy the Zone ID from the selected zone's Cloudflare Overview page. |
| `skillet/environments/<environment>/dns/ui-domain` | Optional | Choose a relative UI prefix, such as ui; absent defaults to ui. Skillet appends the zone domain. Do not enter a full domain. |

## Datadog

One shared key serves production and test. No application key required for ingestion. Site is public template configuration, defaulting to datadoghq.com. [Setup](ublue/skillet/README.md#datadog).

| Entry | Status | Fields / how to obtain them |
| --- | --- | --- |
| `skillet/datadog/api-key` | Required | Create an ingestion API key in Datadog Organization Settings → API Keys. [Key guide](https://docs.datadoghq.com/account_management/api-app-keys/). |
| `skillet/datadog/monitor-setup-key` | Optional | For workstation monitor administration only: create a scoped Application Key in Datadog Organization Settings → Application Keys with monitors_read and monitors_write. Never deliver this key to hosts. [Key guide](https://docs.datadoghq.com/account_management/api-app-keys/). |

## DDNS

Prepare the shared Cloudflare token creator and Zone ID. [DDNS setup](ublue/skillet/README.md#optional-cloudflare-ddns).

| Entry | Status | Fields / how to obtain them |
| --- | --- | --- |
| `skillet/environments/<environment>/hosts/<host>/cloudflare/ddns-dns-name` | Required | Choose the relative DNS record name, not a full domain. |
| `skillet/environments/prod/hosts/<host>/cloudflare/ddns-token` | Generated | Skillet creates the persistent scoped token; disposable tokens are lifecycle-owned. |

## Pi-hole

[Delivery](ublue/skillet/README.md#secret-setup-and-delivery).

| Entry | Status | Fields / how to obtain them |
| --- | --- | --- |
| `skillet/hosts/<host>/pihole/web-password` | Generated | Skillet generates and saves the web admin password for a fresh host; optionally create it to choose a password. For an existing host, restore its entry rather than inventing a replacement. |

## SMTP

Production-only native Postfix relay credentials; smoke machines use a local sink without these values. [SMTP plan](ublue/plan/CLAMPS-EMAIL.md).

| Entry | Status | Fields / how to obtain them |
| --- | --- | --- |
| `skillet/smtp` | Required | Create one entry using your Mailjet SMTP credentials: Username = SMTP username; Password = SMTP password. Custom fields: host = in-v3.mailjet.com; port = 587; tls = starttls (required TLS with certificate verification); sender = a Mailjet-verified sender email address. [Mailjet credentials](https://documentation.mailjet.com/hc/en-us/articles/360043229473-How-can-I-configure-my-SMTP-parameters). |

## Storage

Generated independent LUKS root recovery passphrases. [Enrollment](ublue/skillet/README.md#root-recovery-keys). Password contains the printable passphrase; custom luks-uuid and recovery-state fields and the protected root-luks.header attachment are managed by Skillet.

| Entry | Status | Fields / how to obtain them |
| --- | --- | --- |
| `skillet/hosts/<host>/storage/root-recovery-key` | Generated | Run skillet secrets root-recovery-key before finishing production provisioning. The command unlocks the vault, saves before enrollment, and verifies the key against this volume. |
| `skillet/environments/test/hosts/<host>/instances/<instance>/storage/root-recovery-key` | Generated | Run skillet test vm recovery-key HOST INSTANCE. Archived test keys remain in the vault after VM disposal; delete the instance entry before reusing its name for a new disk. |

## Syncthing

No vault entries currently required; Skillet manages the private UI configuration.

## Tailscale

Create an OAuth client in Tailscale Trust credentials with Auth Keys Write and Devices Core Read/Write, restricted to the provisioner tag. [Tag and scope guide](ublue/skillet/README.md#tailscale-setup-for-skillet). Skillet mints enrollment keys; do not create per-host auth-key entries.

| Entry | Status | Fields / how to obtain them |
| --- | --- | --- |
| `skillet/tailscale/provisioner-client-id` | Required | Copy the OAuth Client ID from the creation page; use Password, not Username. |
| `skillet/tailscale/provisioner-client-secret` | Required | Copy the OAuth Client secret from the creation page. |

## UniFi

No vault entries currently required. Controller/UI accounts are managed in UniFi, separately from Skillet provisioning.
8 changes: 6 additions & 2 deletions hooks/pre-push.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,14 @@
set -eu

pushd "$(git rev-parse --show-toplevel)" >/dev/null
cinc exec cookstyle site-cookbooks roles
if command -v cinc >/dev/null 2>&1 && cinc --version >/dev/null 2>&1; then
cinc exec cookstyle site-cookbooks roles
else
echo "Skipping Cookstyle: cinc is not installed" >&2
fi
uv run ruff check --diff .
uv run ruff format --diff .
uv run mypy --ignore-missing-imports site-cookbooks fabfile.py
find . -name "*.sh" -not -path "./.venv/*" -not -path "./berks-cookbooks/*" -exec shellcheck -x {} +
git ls-files -z -- "*.sh" | xargs -0 -r shellcheck -x
shellcheck -x run
popd >/dev/null
Loading
Loading