A skin that survives git pull
Dressing a site differently used to mean editing a file the engine owns. It worked, right up until the next git pull, which is the moment you find out that customisation and updates were the same file all along.
Four things that needed a modified template are settings now.
Both of these sites are this engine, built from the same commit on the same evening:


The second one uses all four of the settings below and not one edited engine file — git status in that installation is empty, which is the entire point of the exercise.
Your own stylesheet
site.extra_css takes a path, or a list of them, loaded after the engine's own. A skin lives in a file of yours and updates never see it.
site:
extra_css: /assets/css/mine.css
Local paths only. Every page carries style-src 'self', so a stylesheet on another host would be discarded by the browser with no error you would ever notice — the page would simply render undressed. The build refuses it out loud instead, and doctor names the line it had to skip.
Your own menu
Without nav: the bar is derived from the content types that actually have posts, exactly as before. With it, the site says what belongs there:
nav:
- { label: "Home", url: "/" }
- { label: "Photographs", tag: "photo" }
An entry missing either half is skipped rather than rendered as an empty link. An empty list is a decision rather than a mistake — the menu then renders nothing at all, which is also how a site turns the menu off, so there is no second key for that.
./style.sh edits it and does the tedious part: it offers your busiest tags and your pages by name, so you pick rather than type slugs. doctor reports an entry whose target has since gone missing, and the url: "about" spelling that works from the front page and nowhere else.
Two regions, on or off
layout.sidebar switches the right-hand column off and lets the content take the full width. layout.hero lifts a post's first usable image out of the text and runs it above the title — off unless you ask, because it reshapes every post page it touches, and a single post can still decide for itself with hero: in its own header. A tracking pixel is never promoted to lead picture.
They are switches for regions, not for how a region looks. What things look like belongs in a stylesheet, and a key per visual property would turn the config into a stylesheet written in YAML.
All of it from the wizard
./style.sh grew a Layout section, so palette, banner, fonts, menu, regions and your own stylesheets are one conversation. A site can now be dressed entirely from the wizard, which was the whole point of making these settings rather than documentation about which template to edit. Entering a section and pressing through it changes nothing.
The one thing that changed without being asked
The menu bar follows you down the page now. It took over the job of the menu that used to be repeated under the content — which only existed because the bar didn't — so that one is gone, key and all. Two copies of the same menu on one screen is not a preference.
The line that menu used to draw above the footer is drawn without it, and anything that scrolls a target into view now stops short of the bar rather than under it.

Comments