Configuration
Hush v3 stores repository authority under .hush/. There is no plaintext config tier for the repo structure.
Start with bootstrap
hush bootstrapThat creates the initial v3 layout:
.hush/ manifest.encrypted files/ env/project/shared.encrypted.sops.yamlIt also writes machine-local state at:
~/.hush/state/projects/<project-slug>/active-identity.jsonRepository structure
Manifest
.hush/manifest.encrypted holds the structural config for the repo.
The first bootstrap pass creates:
- identities:
owner-local,member-local,ci - bundle shell:
project - target shells:
runtime,example
Example shape:
version: 3identities: owner-local: roles: [owner] member-local: roles: [member] ci: roles: [ci]bundles: project: files: - path: env/project/sharedtargets: runtime: bundle: project format: dotenv mode: process example: bundle: project format: dotenv mode: exampleFiles
Each file under .hush/files/**.encrypted is one ACL boundary.
The bootstrap pass creates one shared file shell:
path: env/project/sharedreaders: roles: [owner, member, ci] identities: []sensitive: trueentries: {}Inspect the structure
Use hush config show to inspect structural state.
hush config showhush config show identitieshush config show fileshush config show stateAvailable sections:
manifestidentitiesbundlestargetsimportsfilesstate
Active identity
Hush v3 uses an explicit machine-local active identity pointer.
Show the current identity:
hush config active-identitySwitch identities:
hush config active-identity member-localhush config active-identity ciBootstrap sets the initial active identity to owner-local.
File readers
Update file-scoped readers with hush config readers.
hush config readers env/project/shared --roles owner,member,cihush config readers env/project/shared --identities owner-local,member-localhush config readers env/project/shared --roles owner,ci --identities ciRules for the first pass:
--rolesupdates role-based readers--identitiesupdates explicit identity readers- Omitted flags keep the existing value
- The file path must match a declared
.hush/files/**.encrypteddocument
Deprecated init alias
hush init is no longer the canonical setup flow.
hush initIt now prints a deprecation warning and delegates to hush bootstrap.
Legacy note
Legacy hush.yaml repositories still exist for migration work, but the canonical setup path is now .hush/ plus hush config.
Migrate a legacy repo
Use the big-bang migration flow when a repo still depends on hush.yaml.
hush migrate --from v2 --dry-runhush migrate --from v2hush migrate --from v2 --cleanupThe flow is intentionally one-way inside a repository:
--dry-runinventories the legacy repo without mutating ithush migrate --from v2creates.hush/v3 state and machine-local migrated overrides--cleanupremoves validated legacy leftovers such ashush.yamland old encrypted source files
For the full migration walkthrough, see the migration guide for legacy hush.yaml repositories.