Customization¶
The framework's source uses a small set of placeholder strings that should be substituted when forking. They were chosen to be distinctive enough to grep without colliding with unrelated content.
The placeholder convention¶
| Placeholder | Used for | Substitute with |
|---|---|---|
springbig |
Org name, repo paths, kebab-case identifiers | Your org's slug |
springbig.com |
Email domain, public URLs | Your org's domain |
springbig.internal |
Internal infrastructure suffix | Your internal-network suffix |
bastion.springbig.internal |
Specific bastion host | Your bastion host |
staging-db.springbig.internal |
Specific internal DB host | Your staging DB host |
billwoika.com |
Personal domain | Your personal domain |
dev@springbig.com |
Work email / git identity | Your work email |
you@billwoika.com |
Personal email / git identity | Your personal email |
your-username |
SSH user, GitHub username | Your username |
Why these specific strings¶
Distinctive real strings (springbig, billwoika) are easier to
find-and-replace than generic placeholders precisely because they
don't collide with anything else. A sed pass replacing springbig
with acme will only touch the framework's placeholder text, not
something inside an unrelated config or comment.
The personal placeholders (your-username, you@billwoika.com) use
distinctive forms that don't appear naturally in technical content.
After substituting org names, a second pass on the personal
placeholders is clean.
Substitution recipe¶
A blanket sed pass after cloning gets most of the way:
grep -rl 'springbig\|billwoika\|your-username' . | \
xargs sed -i \
-e 's/springbig/your-org/g' \
-e 's/billwoika/your-domain/g' \
-e 's/your-username/your-user/g'
Then audit the result:
What's deliberately not parameterized¶
The framework is not templated with Jinja or similar. Source files
contain literal placeholder strings, not {{ org.name }}-style
variables. The reasoning:
- Literal strings stay readable in any markdown viewer (GitHub,
IDE preview, terminal
less). Templated variables don't render usefully without a build step. grepworks. Finding "where is the org name referenced?" isgrep -r springbig. Finding "where is{{ org.name }}referenced?" works too, but the literal-string version is more concrete.- Substitution is a one-time forking action, not a per-build step. The framework expects you to fork once, customize, then maintain your own copy with your own values.
If you genuinely need multi-deployment support (different builds for
different environments from one source), MkDocs supports the
mkdocs-macros-plugin for true variable substitution. The framework
doesn't ship this; add it if you need it.
Versioning¶
The framework is versioned via the docs site, not the dotfiles.
Dotfile changes that break compatibility get noted in the relevant
docs page; otherwise the dotfiles are continuously developed on
main.
Earlier framework versions (when the manuscript was a Word document)
are preserved in the archive/ directory of the repo. The most
recent of those is v2.7-snapshot.docx, frozen at the start of the
MkDocs migration.
Versioning conventions used here¶
When the docs reference framework versions:
- v2.4 — Container chapter added (Section 21)
- v2.5 — Make as a thin wrapper around mise tasks (Section 7.2)
- v2.6 — Editor and IDE chapter (Section 22, ~50 pages)
- v2.7 — Tool-enforced git practices (Section 17.10), MkDocs migration
These are the versions of the manuscript document. Going forward, the docs site is the source of truth, and version numbers may become less prominent — pages get updated when they need updating, without ceremonial version bumps.