Steering
The key words “MUST”, “MUST NOT”, “SHOULD”, “SHOULD NOT”, and “MAY” in this document are to be interpreted as described in RFC 2119.
Voice & Tone
- Recipes MUST be minimal and direct. There MUST NOT be storytelling or preamble.
- Steps MUST use imperative mood: “Sift matcha into a bowl”, not “You should sift the matcha”.
- Notes are where personality, expertise, substitutions, and science SHOULD live.
Front Matter
titleMUST be included.categoryMUST be included. Valid values:drinks,sweets,mains,soups,sides,pantry,articles,colophon. This places the recipe in its section on the homepage and drives the breadcrumb label. A new category MAY be created if a recipe does not fit an existing one.numberMUST be included for recipes. Use the next sequential number (chronological). Articles and style guide pages MUST NOT have a number.sourceSHOULD be included if the recipe is adapted from an external source.chefMAY be included if the source chef is notable.yieldMAY be included to indicate servings or pieces.descriptionMAY be included to set the page’s meta/share description (the search-result + social-card snippet). If omitted, one is derived automatically (articles use their opening sentence; recipes get a synthesized “title — a {category} recipe … No. N” line) — so a hand-writtendescriptionis only needed when the auto one reads poorly. It MUST be a single plain sentence, ~150 chars, no markdown.layoutMUST NOT be included — it inherits from the default.
Measurements
- All weights and volumes MUST use grams (g). Cups, tablespoons, teaspoons, and milliliters MUST NOT be used.
- Exception — cocktails: Cocktail recipes MUST use ounces (oz) for spirits, liqueurs, juices, and syrups. Cocktails are built with jiggers, not scales.
- Temperatures MUST be in Fahrenheit (°F).
- Whole items (eggs, vanilla beans, chili peppers) SHOULD use counts.
- Ranges SHOULD use an en dash:
115–140g. - Volumetric measurements from sources MUST be converted to grams before writing (except cocktails).
Ingredients
- Ingredients MUST use the headerless table format: amount in the left column, ingredient and prep notes in the right.
- Ingredients SHOULD be listed in the order they are used.
- Prep instructions SHOULD be included inline: “unsalted butter, cubed”.
- Sub-components MAY be grouped with labels like
(A)and(B)if mixed at different stages.
Steps
- Steps MUST be a numbered list.
- Each step SHOULD be one logical action or a tightly related sequence.
- Temperatures and times MUST be included inline: “Bake at 350°F for 15 minutes”.
- Steps MUST NOT omit critical details for the sake of brevity.
Notes
- Notes MUST use a styled wrapper div for de-emphasized styling.
- Notes MUST be in bullet list format.
- Notes MUST be actionable — they should help someone make, modify, store, or scale the recipe. Commentary, trivia, and “watch the video” references MUST NOT be in notes.
- Notes SHOULD cover: substitutions, storage, scaling, science, technique tips.
- The Notes section MAY be omitted entirely if there is nothing useful to add.
Naming
- Titles MUST be as short as possible. Use the simplest recognizable name for the dish.
- Cooking technique modifiers (e.g., “triple-fried”, “reverse-seared”, “chargrilled”) MUST NOT appear in the title. Technique belongs in the steps and notes.
- Ingredient modifiers that materially change the flavor (e.g., “brown butter”, “miso”) MAY appear in the title when they distinguish the recipe from a base version.
- Parenthetical descriptions (e.g., “Pork & Cabbage Dumplings”, “Salmon Hot Pot”) MUST NOT appear in the title. If the dish name is unfamiliar, explain it in the notes.
- Chef or brand names (e.g., “Robuchon”) SHOULD NOT appear in the title unless the dish is universally known by that name. Credit the chef in the
cheffront matter field or notes instead. - Article titles MUST NOT include subtitles after colons. Keep to the core topic.
- When a variant exists (e.g., lazy tortilla, OJ whiskey sour), use the shortest distinguishing modifier.
- In
index.md, the base recipe MUST be listed before its variants (e.g., Gateau au Chocolat before Matcha Gateau au Chocolat, Highball before Yuzu Highball).
File Naming & Linking
- Filenames MUST be kebab-case in the
r/directory (e.g.,r/doenjang-jjigae.md). - A link to the recipe MUST be added to
index.mdunder the appropriate category. - Recipes not linked from
index.mdwill not appear on the site. - Cross-links in recipe/article body text MUST use Jekyll’s
relative_urlfilter, not a bare root path: write[Purin](/recipes/r/purin), NOT[Purin](/r/purin). A bare/r/slugrenders as a root-absolute link that drops the site’s/recipesbaseurl and 404s. (Links inindex.mduse relative./r/slugpaths and are fine as-is.)
Design system — Swiss modernist (Müller-Brockmann grid)
The site follows the International Typographic Style (Swiss modernism), in the Müller-Brockmann grid-system lineage: one typeface (Helvetica), a visible modular grid every element snaps to, tabular/objective data, baseline rhythm, and pure monochrome — NO color at all. Hierarchy comes from size, weight, and position on the grid. The one expressive flourish is the oversized lowercase type-as-image wordmark (the recipe title / home masthead) — a nod to Experimental Jetset, but the system is otherwise strictly grid-Swiss, not EJ’s poster expressiveness.
(History: the site was first a two-ink risograph look with Bricolage Grotesque, then a
per-section-color Experimental-Jetset phase; both are retired. The old illustration
and color-swatch archive pages (/illustrations, /illustrations-riso, /colors) and
their 50MB of retired assets have been removed; the riso-color article is the only
remaining record of that era. There is no live accent color.)
- Type:
Helvetica Neue, Helvetica, Arial, sans-serif— one family, no serif, no mono (code excepted). Base 15px / 1.5. Sentence/lower case for content; the only placetext-transform: uppercase+ letter-spacing is used is the small section kicker (and masthead/caption labels). Large type is tight-negative tracking; body ~0. Hierarchy is the type ramp + weight (400 body / 700 heads), never color. - Type ramp (
$fs-*tokens, anchored to 15px body):11kicker/caption ·13secondary (notes, analysis, tables, lists, step numbers) ·15body/ingredients/steps ·21lede + section head ·26category head ·clamp(2.6rem,9vw,5rem)hero title. Everyfont-sizeMUST reference a$fs-*token (or the hero clamp / an em-relative counter) — no ad-hoc px/rem sizes. See the/typepage and “Univers Stepped”. - The grid: a responsive modular grid underlies every page —
--cols12 (desktop) → 8 → 4, with1.25remgutters. Blocks span whole column ranges; recipe bodies, ingredient tables, steps, notes, and analysis all place onto it. Nothing floats. - Monochrome tones — no accent, no per-section color. Ink
#111on paper#fff(light), inverting to#f2f2f0on#0c0c0d(dark), plus grey#6b6b6b(secondary text) and hair#e4e4e4(rules); dark variants#9a9a98/#2a2a2c. These are the entire palette. Do NOT add a section/spot color or a filled color block. (The$sectionscolor map and per-category accent are gone; don’t reintroduce them.) - Rules & structure: hard 1px/hairline rules, hard corners, flat fills — no shadows, gradients, or radii. Emphasis is weight or a hairline, never a hue.
print-color-adjust: exactSHOULD be used only where the risograph article’s ink swatches need their colors to survive printing (scoped to those elements in the print block — not global).
Illustrations — none
- Recipe/article pages have no illustrations. The type + the numbered hero carry the page. Do NOT add illustration stamps to recipe pages, and do NOT generate riso PNGs for new recipes. (Photography is a separate system — recipes DO carry a hero photo; see “Recipe Photos”. “No illustrations” means no drawn/riso art, not no photos.)
- The old per-recipe SVG set, the AI-generated riso PNGs, and their
/illustrations/illustrations-risogallery pages have been deleted (50MB of retired assets reachable from nowhere in the nav). Don’t recreate them.
AI Artifacts
- Articles and recipes MUST NOT contain meta-commentary about how content was produced, rephrased, or licensed. No “content rephrased for compliance” or similar.
- Source attribution belongs in a Sources section at the end of the article, as plain links. Inline parenthetical citations (e.g., “from Source Name”) MAY be used sparingly when the source is directly relevant to a specific claim.
- AI tool instructions (compliance notices, verbatim reproduction limits, attribution boilerplate) MUST NOT leak into published content.
Changelog
- All meaningful changes to recipes, styling, or site structure MUST be logged in
changelog.mdwith the current date. - Changelog MUST be updated in the same commit as the change, not retroactively.
- Entries SHOULD be grouped by date, newest first.
- Each entry SHOULD be a single bullet describing what changed. Keep it concise.
- Changelog MUST be the last item in the Colophon section of
index.md.
Analysis (baking recipes)
- Baking recipes (batters and doughs — canelés, cakes, cookies, brownies, chiffon, quick breads, clafoutis, mochi, and custard/pastry desserts) MUST include an
## Analysissection. - Non-baking recipes (drinks, sauces, no-bake sweets like jelly/panna cotta/affogato, savory mains/soups/sides) MUST NOT have an Analysis section.
- The Analysis section MUST appear between Steps and Notes.
- It MUST use a
<div class="analysis" markdown="1">wrapper and contain, in order: a total batter weight line, a component table (fat, sugar, structure solids, liquid, egg/protein) with grams and percentages, an optional benchmark comparison, and a 1–3 sentence plain-language takeaway. - Percentages MUST be of total batter weight and displayed to one decimal place.
- Coatings, glazes, frostings, and dustings MUST NOT count toward the batter weight; note them separately if significant.
- Inert solids (matcha, hojicha) MUST NOT be counted as structure solids.
- The decomposition values and texture benchmarks are defined in the
batter-analysisskill (.kiro/skills/batter-analysis.md), which is the single source of truth. The on-page block format is documented there. - Component grams MUST sum to within ~2g of the stated total, and percentages to ~100%. If a component is outside its benchmark range, the takeaway MUST acknowledge it.
Recipe Photos
A recipe page MAY show a full-width 16:9 hero photo under the title. This is distinct from the retired illustration system (see “Illustrations — none”): photos are real food photography, not per-item art.
Resolution order (handled by _layouts/page.html), first match wins:
- Front-matter
image:on the recipe (a full URL) — an explicit override. Rare; prefer the registry. _data/photos.yml→specific:keyed by the recipe slug (filename without.md). Value is an Unsplash CDN stem (photo-<id>); the layout appends sizing.
There is NO fallback. A recipe not in the registry (and with no front-matter
image:) shows no hero photo. This is deliberate: a generic or wrong photo
(e.g. a tortilla on the steak page) is worse than none. Only add a photo you have
verified depicts that specific dish.
Rules:
- A
specific:entry MUST actually depict THAT dish and MUST crop cleanly to 16:9 (subject centered, not cut off). When unsure, leave it out — no photo is fine. - Variants SHOULD reuse one good photo where honest (e.g. all plain-canelé variants can share a canelé shot) but MUST NOT borrow an unrelated dish’s photo.
- Photos MUST be free-licensed (Unsplash
images.unsplash.com/photo-…), never Unsplash+ (plus.unsplash.com/premium_photo-…) or other paid/unlicensed sources. image_creditdefaults to “Photo — Unsplash”. If a photo is kept long-term, the real photographer SHOULD be credited (Unsplash guideline).- Articles/colophon pages get a photo ONLY via explicit front-matter
image:.
How to find and verify a photo (the procedure)
- On unsplash.com (logged in), search the dish with landscape+free filters:
https://unsplash.com/s/photos/<dish>?orientation=landscape&license=free. - Scrape free CDN stems from the rendered grid (the
napisearch API returns 401; scrapeimg[srcset]instead), keeping onlyimages.unsplash.com/photo-…(droppremium_photo-). Collect thephoto-<id>stem + its alt text. - Verify visually — do not trust alt text. Download each candidate cropped to
16:9 (
?w=640&h=360&fit=crop&q=70&auto=format) and LOOK at it. A “flan” result is often panna cotta; a “tortilla” is often a wrap. Reject anything that isn’t the dish, isn’t appetizing, or loses its subject in the 16:9 crop. - Add the winning stem to
photos.ymlunderspecific:with a# commentnaming what it shows. Rebuild and eyeball the recipe page before pushing.
A contact-sheet harness (download many candidates into a 16:9 grid, screenshot once)
is the efficient way to verify a batch — build it under work/understand/…, not in
this repo.
New Recipe Checklist
When adding a new recipe, ALL of the following MUST be completed:
- Create
r/{slug}.mdwith front matter (title,category,number— next sequential). - Add a link to
index.mdunder the appropriate category. Base recipes MUST be listed before variants. (A recipe is invisible until it’s linked here — the homepage is the gate.) - Update
changelog.mdwith the new recipe, in the same commit. - For baking recipes (batter/dough), add an
## Analysissection between Steps and Notes, computed via thebatter-analysisskill. - SHOULD add a verified
specific:photo to_data/photos.ymlif a good one exists (see Recipe Photos). If none is found, leave it out — there is no fallback and no photo is fine.
No illustration is needed — recipe pages are type-only (see Illustrations above); the hero photo is separate and comes from the photo registry.
The homepage recipe count (the “124” on the masthead) is computed at build time from the number of pages in r/ (_includes/header.html), so it stays in sync automatically — do NOT hardcode or hand-update it.