Profiles¶
A profile is a declarative YAML manifest under templates/profiles/ that tells the installer what to install and how to brand it. Profiles replaced the old if/elif --minimal | --full | --fork | --remote | --github mode dispatcher.
Schema¶
name: <slug> # required, must match filename stem
display_name: <Pretty Name> # required
description: <one-liner> # required, shown in `install list-profiles`
legacy_flag: --<mode> # required, the install.sh flag this maps to
recommended_for: <use case> # optional, free-form hint
includes: # optional, human-readable list of what gets installed
- Gemfile
- _config.yml
- pages/index.md
- ...
excludes: [] # optional, anything explicitly omitted
deploy_targets: # optional, suggested defaults for `install deploy`
- github-pages
- azure-swa
- docker-prod
ai_features: # optional, what `install agents` ships by default
agent_files: [copilot, claude] # any of: copilot, cursor, claude, aider
Currently shipped profiles¶
| Profile | Legacy flag | When to pick it |
|---|---|---|
full |
--full |
Default. Starter pages, navigation, admin settings, dev wizard. |
minimal |
--minimal |
Smallest viable site. No starter pages. |
fork |
--fork |
Fork of the theme repo; resets identity, removes example content. |
remote |
--remote |
Consume the theme as a remote theme on GitHub Pages. |
github |
--github |
GitHub-Pages-targeted layout with workflow scaffolding. |
Run ./scripts/bin/install list-profiles to see what's installed locally.
Picking a profile¶
./scripts/bin/install init --profile full /path/to/site # default
./scripts/bin/install init --profile minimal /path/to/site
./scripts/bin/install init --profile fork # in a fresh fork checkout
install wizard (without --ai) discovers profiles dynamically and prompts you to pick one.
Authoring a custom profile¶
- Create
templates/profiles/<your-slug>.ymlmatching the schema above. Thename:field must equal the filename stem. - Map
legacy_flag:to whichever existinginstall.shmode flag (--full,--minimal,--fork, …) most closely matches your intent — that's what the dispatcher hands to the bootstrap. - List your profile in
templates/profiles/README.md. - Test:
./scripts/bin/install list-profiles # confirm it shows up
./scripts/bin/install init --profile <your-slug> /tmp/test-profile
- Optional: open a PR against
bamr87/zer0-mistakesto upstream it.
What profiles cannot do¶
Profiles are declarative only. They cannot:
- Run shell commands. (Use a deploy module for that.)
- Conditionally include files based on user input. (Compose with a CLI flag instead.)
- Mutate other profiles. (Each profile is self-contained.)
If you need procedural logic, write a small library module under scripts/lib/install/ and call it from the CLI dispatcher — keep YAML pure.
Programmatic access¶
The pure-bash YAML reader lives in scripts/lib/install/profile.sh:
source scripts/lib/install/profile.sh
list_profile_names # -> full minimal fork remote github
profile_path full # -> templates/profiles/full.yml
profile_get_scalar full legacy_flag # -> --full
profile_get_list full deploy_targets # -> github-pages\nazure-swa\ndocker-prod
profile_print_summary full # human-readable summary
Bash 3.2 compatible — no yq, no python, no external deps.
Last updated: 2026-04-20 — Phase 7.