Blog Relaunch, 5-Theme Identity System & Agentic Writing Skills — Design Specification
Blog Relaunch, 5-Theme Identity System & Agentic Writing Skills — Design Specification
Date: 2026-11-10
Repository: hawzy.github.io (c:\github\agy\recipes, branch feat/agentic-recipe-blog)
Scope: Project-sized design covering:
- Sub-project A — Site Identity, Layout C Homepage & 5-Theme Palette Switcher
- Sub-project B — 3-Skill Blog Writing Pipeline (
blog-voice,blog-research,blog-author) +audit_posts.py - Sub-project C — Relaunch Post #1 Draft & 5-Post Backlog
1. Intent & Why
The site began in 2022 as a #100DaysOfCode Jekyll blog and was recently expanded with a dual-surface (Human UI + Business-to-Agent JSON) recipe and weekly meal-planning system under the working title “Hawzy’s Kitchen & Code”.
Before going live, the site needs to reflect what it actually is: a builder’s blog by hawzy about writing code and using AI agents (Google Antigravity) to automate real-life chores and hobbies, where the agentic kitchen and weekly grocery planner is one flagship project alongside other home-automation and hobby tools added as they are published.
At the same time, publishing new posts should follow an agent-assisted workflow: the human author provides raw stream-of-consciousness notes and quips (notes.md), and the agent researches the target repository for verified facts (facts.md), drafts the post in the author’s voice (voice-profile.md), prepares a companion X/Twitter hook and thread (twitter-thread.md), and validates the output with a deterministic Python stdlib auditor (audit_posts.py) plus a zero-context Editorial/Voice critic subagent.
2. Goals, Non-Goals & Anti-Goals
Goals
- Quiet, high-craft identity: Replace “Hawzy’s Kitchen & Code” with a quiet
hawzywordmark whose header styling adapts to 5 distinct editor/terminal-inspired themes (Gruvbox,Telemetry,Catppuccin,Kitchen,Paper). - Blog-first homepage (Layout C): Make
/the blog and project hub (featured latest post card, project filter shelf, chronological post list, and the soft-archived 2022#100DaysOfCodedrawer), while moving the Active Weekly Dinner Plan + Recipe Catalog to/recipes/(kitchenin the top nav). - Palette button with live mini-previews: Provide a top-bar palette button opening a 5-theme picker with CSS mini-thumbnails, persisted in
localStorage(hawzy-theme) with zero flash of unstyled content (FOUC). - 3-skill blog writing pipeline in
.agents/skills/: Buildblog-voice(including a copy-paste Gemini Web Personal Intelligence@Gmail/@Docsvoice-extraction prompt),blog-research(cross-repo fact extraction fromc:\github\agy\<project>), andblog-author(post + Twitter thread drafting +scripts/audit_posts.py+ zero-context Editorial/Voice critic). - Draft Relaunch Post #1: Produce the first relaunch post (Redesigning My Blog in Antigravity: Jekyll, Visual View Loops, and Spec-Driven Subagents) and its companion Twitter thread using the new pipeline, keeping recipe-specific critic/script deep dives reserved for Post #2.
Non-Goals
- No external runtime dependencies: No npm frontend frameworks, no third-party Python packages (stdlib only), and no custom Jekyll Ruby plugins unsupported by GitHub Pages.
- No changes to B2A recipe/menu JSON contracts:
/api/recipes.json,/api/weekly-menu.json,/llms.txt, and the 7 modularrecipe-*skills remain intact. - No resurrection of 2022
#100DaysOfCodeposts: The 17 archived 2022 posts stay soft-archived (archived: true,noindex, hidden from main feed/sitemap/search, accessible via the collapsible archive drawer).
Anti-Goals (Failure Conditions Even If Technically Working)
- Cringe or try-hard branding: No slogans like “Hawzy Labs” or “Hawzy on Automation” in the masthead; no heavy
// TRANSMISSION_LOG :: OPERATOR_DOSSIERroleplay chrome on the blog hub. - Invented technical claims or AI-slop prose: Every command, file path, test count, or metric in a blog post must trace to
_drafts/posts/<slug>/facts.mdornotes.md(or be flaggedTODO-source). Banned AI filler phrases (delve,testament to,it's not just X—it's Y,tapestry,buckle up, etc.) must failaudit_posts.py. - Fake Windows prompt paths in headers: Powerline/pill headers use clean
hawzy/~/blog/mainsegments rather than longC:\github\...paths.
3. Constraints
- Git Safety Invariant (
AGENTS.md§3): Autonomous agents must NEVER rungit push. All commits stay strictly local onfeat/agentic-recipe-blog. - Python 3 Standard Library Only:
.agents/skills/blog-author/scripts/audit_posts.pyand all unit/E2E tests undertests/must use Python 3 stdlib only. - Jekyll & Existing Test Suite Compatibility:
bundle exec jekyll buildandpython -m unittest discover -s tests -vmust pass with 0 failures and 0 skipped tests when the local server is running. Existing E2E tests intests/test_e2e_verification.pythat assert the pre-relaunch room layout (test_10,test_11) must be updated to verify the new Layout C homepage,/recipes/kitchen hub, and 5-theme system while preserving all recipe, B2A API, JSON-LD, and draft-isolation checks.
4. Approaches Considered
- Approach 1 — Single All-in-One Skill (
blog-writer):- One skill file that reads raw notes, scans the repo, writes
_posts/YYYY-MM-DD-<slug>.md, and drafts a tweet thread in one pass. - Tradeoff: Fast to write, but mixes fact extraction and prose drafting in one context window and lacks a deterministic script check. Rejected.
- One skill file that reads raw notes, scans the repo, writes
- Approach 2 — 3-Skill Pipeline (
blog-voice,blog-research,blog-author) +audit_posts.py(Selected):- Separates voice profiling (
blog-voice), verified cross-repo fact extraction (blog-research), and prose + social drafting + deterministic auditing (blog-author+audit_posts.py+ 1 zero-context Editorial/Voice critic subagent). - Why chosen: Prevents hallucinated project details, enforces the author’s voice without 7-skill ceremony, and gives Post #1 a clean blog-specific verification script to showcase.
- Separates voice profiling (
- Approach 3 — Full 6-Skill Mirror of the Recipe Pipeline:
- Separate skills and multi-round
review-r1.mddiffing for every blog post. - Tradeoff: Too much ceremony for blog posts. Rejected.
- Separate skills and multi-round
5. Detailed Design
5.1 Sub-project A: Site Identity, Layout C & 5-Theme System
Configuration & Metadata (_config.yml & _data/navigation.yml)
- Site Identity (
_config.yml):title: "hawzy"masthead_title: "hawzy"subtitle: ""(empty—no slogan in the header)name: "Nick Hasenoehrl (hawzy)"description: "Code, AI agents, and home automation projects by hawzy."twitter.username: "hawzy"(enables Twitter/X summary card meta tags via_includes/seo.html)
- Top Navigation (
_data/navigation.yml):projects→/projects/kitchen→/recipes/about→/about/@hawzy→https://x.com/hawzy- Plus the Palette Theme Button and Search Toggle inside
_includes/masthead.html.
Five Themes & Header Wordmark Variants
The theme system is controlled by document.documentElement.dataset.theme ("gruvbox" | "telemetry" | "catppuccin" | "kitchen" | "paper").
- Default theme resolution (inline
<script>in_includes/head/custom.htmlbefore paint):- Read
localStorage.getItem("hawzy-theme"). If it is one of the 5 valid theme IDs, apply it. - Otherwise, read
document.documentElement.dataset.defaultTheme(set to"kitchen"on/recipes/andlayout: recipepages, and"gruvbox"on all other pages). - Set
document.documentElement.dataset.themeand update<meta name="theme-color">.
- Read
| Theme ID | Mode | Palette (--hz-bg / --hz-surface / --hz-text / --hz-heading / --hz-accent / --hz-accent-2) |
Fonts (--hz-head-font / --hz-body-font / --hz-mono) |
Header Wordmark Variant (.hz-brand) |
Syntax Highlighting (--syn-kw / --syn-fn / --syn-ty / --syn-st / --syn-cm) |
|---|---|---|---|---|---|
gruvbox (default on blog/home) |
Warm Dark (Antigravity editor preset) | #141617 / #1D2021 / #D4BE98 / #DDC7A1 / #E78A4E / #D8A657 |
Inter/system sans / Inter/system sans / JetBrains Mono |
Rounded diamond pills: hawzy (#E78A4E), ~/blog (#D8A657), main (#A9B665) |
#EA6962 / #A9B665 / #D8A657 / #A9B665 / #7C6F64 |
telemetry |
Cool Dark | #080C14 / #0E1525 / #CBD5E1 / #F1F5F9 / #38BDF8 / #FBBF24 + subtle cyan radial glow |
Inter/system sans / Inter/system sans / JetBrains Mono |
Plain monospace + blinking bar cursor (\|): hawzy + .hz-caret (2px wide vertical bar, 1.06s step blink) |
#F472B6 / #38BDF8 / #FBBF24 / #34D399 / #64748B |
catppuccin |
Pastel Dark (Mocha) | #1E1E2E / #181825 / #BAC2DE / #CDD6F4 / #CBA6F7 / #A6E3A1 + pastel gradient top border on featured card |
JetBrains Mono / Inter/system sans / JetBrains Mono |
Powerline triangular arrows: hawzy (#F5C2E7) ▸ ~/blog (#CBA6F7) ▸ main ✓ (#89B4FA) |
#CBA6F7 / #89B4FA / #F9E2AF / #A6E3A1 / #6C7086 |
kitchen (default on /recipes/) |
Warm Light | #FAF7F2 / #FFFFFF / #44403C / #1C1917 / #C84B31 / #9A6B1F |
Fraunces serif / Plus Jakarta Sans / JetBrains Mono |
Serif wordmark + blinking bar cursor (\|): hawzy in Fraunces + .hz-caret |
#C84B31 / #3F6B4E / #9A6B1F / #5B7A2E / #A8A29E |
paper |
Stark Light | #FFFFFF / #FFFFFF / #24292F / #1F2328 / #1A7F37 / #0E7490 |
JetBrains Mono / system sans / JetBrains Mono |
robbyrussell prompt: ➜ (#1A7F37) hawzy (#0E7490) git:(main) (#1D4ED8 / #B91C1C) |
#CF222E / #8250DF / #953800 / #0A3069 / #6E7781 |
Palette Popover Component (_includes/masthead.html + assets/css/main.scss)
- A compact
<button class="hz-theme-btn" aria-label="Change color theme" aria-expanded="false">in the masthead showing a line-art palette SVG icon and a9pxdot invar(--hz-accent). - Clicking toggles
<div class="hz-theme-menu" role="menu">containing the 5 options (gruvbox,telemetry,catppuccin,kitchen,paper), each with a50x30pxCSS.hz-theme-minipreview swatch, theme title, and 2–3 word subtitle (warm dark · rounded pills,cool navy · blinking cursor,pastel dark · powerline,warm light · serif,stark light · robbyrussell ➜). - Clicking an option or pressing
Escape/ clicking outside closes the popover.
Page Routes & Layouts
- Homepage (
/,index.md) — Layout C:- Uses a shared
_includes/blog-hub.htmlpartial so/and/blog/stay synchronized. - Featured Latest Post Card (
.hz-feature-card): Displays the newest non-archived post (where_exp: "item", "item.archived != true"), with eyebrow tags (Latest · #tag1 · #tag2), linked title, and excerpt. (If zero non-archived posts exist, shows a fallback card). - Project Chips Shelf (
.hz-project-shelf): Clickable pills linking to/projects/#<slug>or tag filters:blog-relaunch,dinner-planner(additional projects added as posts are published). - Chronological Post List (
.hz-post-list): CleanYYYY-MM-DDtabular date + linked post title for all remaining non-archived posts. - Collapsible 2022 Archive Drawer (
.scifi-archive-drawer/.hz-archive-drawer): Retains<details class="scifi-archive-drawer">at the bottom with// 2022 ARCHIVE — 17 logs (#100DaysOfCode)so existing archive links and E2E archive checks continue working.
- Uses a shared
- Kitchen Hub (
/recipes/,recipes/index.md):- Houses the Active Weekly Dinner Plan (
weekly-menu-containermoved fromindex.md) at the top, followed by the From the Recipe Box catalog grid (`
- Houses the Active Weekly Dinner Plan (
Crispy Mongolian Beef with Broccoli and White Onion
Tender flank steak velveted with baking soda and dry Marsala wine (30-minute chill), crusted in cornstarch, and tossed with blistered broccoli florets, sweet whit...
Blackstone Shabu Steak and Egg Fried Rice
Hibachi-style fried rice on a flat-top griddle: Costco shabu-shabu beef seared hard and glazed with Bachan's, day-old rice crisped in garlic butter, soft-scramble...
Homemade Pork and Napa Cabbage Dumplings (Potstickers & Steamed)
Thirty-six from-scratch Northern Chinese dumplings wrapped in 58.3%-hydration half-scalded dough, stuffed with a four-layer ground pork and salt-purged napa cabba...
`).
- Sets
surface: kitchen(data-default-theme="kitchen"), while respectinglocalStorage.getItem("hawzy-theme")when the user switches themes.- Projects Page (
/projects/,_pages/projects.md):
- Projects Page (
- Structured project index with anchor cards (
#blog-relaunch,#dinner-planner) summarizing each publishedc:\github\agyproject, its stack, and links to related posts.- Post Page (
_layouts/single.htmlfor posts):
- Post Page (
- Replaces heavy
RETURN_TO_LOGS/// TRANSMISSION_LOGtext with clean Layout C post header: post title,YYYY-MM-DD · N min read · #tag1 #tag2metadata line, and body prose styled by the active theme’s CSS custom properties (--hz-*and--syn-*).
5.2 Sub-project B: 3-Skill Blog Writing Pipeline (.agents/skills/)
All three skills live in c:\github\agy\recipes\.agents\skills\ and store per-post working artifacts in _drafts/posts/<slug>/ (which is already excluded from Jekyll publishing).
.agents/skills/
blog-voice/
SKILL.md
voice-profile.md
prompts/
gemini-personal-intelligence-handoff.md
blog-research/
SKILL.md
blog-author/
SKILL.md
scripts/
audit_posts.py
_drafts/posts/<slug>/
notes.md # Human author's raw brain dump / quips / stream-of-consciousness
facts.md # Verified repo facts, commit hashes, metrics, file paths, commands
twitter-thread.md # Companion X/Twitter hook tweet + 3-6 tweet thread
review.md # Zero-context Editorial/Voice critic report + audit_posts.py status
Skill 1: blog-voice (.agents/skills/blog-voice/)
- Purpose: Maintains
.agents/skills/blog-voice/voice-profile.md—the authoritative style guide for Nick (hawzy)’s writing voice—and provides.agents/skills/blog-voice/prompts/gemini-personal-intelligence-handoff.md. - Gemini Web Personal Intelligence Handoff Prompt (
prompts/gemini-personal-intelligence-handoff.md):- Ready-to-paste prompt for Gemini Web (
@Gmail,@Google Docs,@Google Drive) that instructs Gemini to sample Nick’s sent casual/technical emails and notes and extract:- Sentence length distribution and paragraph pacing
- Humor style, self-deprecating asides, and parenthetical quips
- How technical problems and frustrations are introduced
- Transition phrases and sign-offs actually used
- “Anti-voice” patterns (words/openers Nick never uses)
formatted as a drop-in YAML/Markdown update to
voice-profile.md.
- Ready-to-paste prompt for Gemini Web (
- Initial Baseline
voice-profile.md:- Seeded immediately from Nick’s existing writing and conversation style:
- Pragmatic, first-person builder voice (“I wanted X because Y was annoying me”).
- Short punchy sentences mixed with concrete technical specifics; parenthetical dry asides.
- Never salesy, never breathless, never roleplaying a sci-fi operator.
- Banned AI-slop list (enforced by
audit_posts.py):delve,delving,tapestry,testament to,buckle up,game-changer,game changer,in today's fast-paced,let's dive in,without further ado,it's not just,unleash,supercharge,symphony,realm of.
- Seeded immediately from Nick’s existing writing and conversation style:
Skill 2: blog-research (.agents/skills/blog-research/)
- Purpose: Turns
_drafts/posts/<slug>/notes.md(the human brain dump) + one or more project paths (c:\github\agy\<project>) into_drafts/posts/<slug>/facts.md. - Workflow:
- Reads
_drafts/posts/<slug>/notes.md(or creates it from the user’s inline prompt if they pasted their brain dump directly in chat). - Inspects the target project directory (
git log,README.md,docs/superpowers/specs/,docs/superpowers/plans/, test files, scripts) and extracts verified facts with[f1],[f2]citations (exact filenames, line counts, test counts, CLI flags, commit messages, error cases). - Flags any claim from
notes.mdthat cannot be verified in the repo asTODO-confirm-with-authorso the author can clarify before or during review.
- Reads
Skill 3: blog-author + scripts/audit_posts.py (.agents/skills/blog-author/)
- Purpose: Drafts
_posts/YYYY-MM-DD-<slug>.mdand_drafts/posts/<slug>/twitter-thread.mdfromnotes.md+facts.md+voice-profile.md, runsscripts/audit_posts.py, and dispatches 1 zero-context Editorial/Voice critic subagent. - Deterministic Post Auditor (
.agents/skills/blog-author/scripts/audit_posts.py):- Uses Python 3 stdlib only.
- Skips archived 2022 posts (
archived: true). - Validates every non-archived post in
_posts/(or a specific post passed via--post <path>):- Frontmatter schema: Requires
title,date(orYYYY-MM-DD-filename prefix),categories,tags(>=1tag from the canonical tag taxonomy or lowercase slug format^[a-z0-9-]+$),excerpt(20..220chars for Twitter/X card descriptions). - Zero banned AI-slop phrases: Scans prose outside fenced code blocks against the banned phrase list in
voice-profile.md. - Zero unresolved
TODO-source/TODO-confirmmarkers: Fails if anyTODO-marker remains in a published post. - Internal link & asset integrity: Verifies relative internal links (
/recipes/...,/projects/...,/assets/...) resolve in the repo. - Companion Twitter thread check (when
--dossier _drafts/posts/<slug>is provided): Verifiestwitter-thread.mdexists and every numbered tweet (1/,2/, …) is<= 280characters (counting URLs as 23 chars per X’st.cowrapper rule).
- Frontmatter schema: Requires
5.3 Sub-project C: Relaunch Post #1 & 5-Post Backlog
Relaunch Post #1 (To Be Drafted & Published in This Build)
- File:
_posts/2026-11-10-rebuilding-my-blog-with-antigravity-and-view-loops.md - Dossier:
_drafts/posts/rebuilding-my-blog-with-antigravity-and-view-loops/{notes.md,facts.md,twitter-thread.md,review.md} - Tags:
["antigravity", "jekyll", "superpowers", "view-loops", "themes"] - Scope & Structure:
- Why relaunch now: Moving from a single-purpose recipe/2022 log site to a general home-automation & coding blog (
hawzy), and why static Jekyll on GitHub Pages is still ideal when agents write and maintain the templates. - How Antigravity + Superpowers skills work together: Using
brainstorming,writing-plans, andsubagent-driven-developmentinstead of one-shot prompting. - The Visual Companion View Loop: How the
brainstormingvisual server let us iterate live in a browser tab from initial homepage wireframes (Krebs vs.jvns.cavs.blog.fsck.comvs. Hybrid C) to a palette switcher with 5 distinct editor and Oh My Posh themes (Gruvboxfrom Antigravity settings,Telemetry,Catppuccin,Kitchen,Paper). - The Verification & Code Review Loop: How
spec-reviewerandcode-reviewersubagents plus deterministic Python stdlib scripts (test_e2e_verification.pyagainstbundle exec jekyll serveandaudit_posts.py) keep the site honest. - What’s next: Teaser for Post #2 (the 7-skill Agentic Kitchen & 3-critic recipe pipeline); additional project posts tracked in private
blog-ops/BACKLOG.mduntil published.
- Why relaunch now: Moving from a single-purpose recipe/2022 log site to a general home-automation & coding blog (
Backlog Stubs Recorded in Private c:\github\agy\blog-ops\BACKLOG.md
- Post #2: The Agentic Kitchen: Deep-Research PDFs, a 3-Critic Panel & Automated Grocery Carts (
recipesrepo:audit_recipes.py,review_report.py,consolidate_menu.py,generate_recipe_visuals.py,/api/*.json,/llms.txt) - Future hobby & home-automation posts are kept in private
blog-opsuntil published.
6. Builder Decisions & Defaults (Explicitly Marked)
The following defaults were chosen by the agent during design and can be overridden by the human author at any time:
- Default Theme Per Surface:
gruvboxis the default theme on/,/blog/,/projects/,/about/, and post pages;kitchenis the default theme on/recipes/and individual recipe pages, unless the visitor has explicitly selected a theme in the palette menu (localStorage["hawzy-theme"]). - Kitchen Hub Location: Moving the homepage to Layout C moves the Active Weekly Dinner Plan section from
/to the top of/recipes/(recipes/index.md) so thekitchennav link gives the complete kitchen experience on one page. - Canonical Post URL Pattern: New 2026+ posts live in
_posts/YYYY-MM-DD-<slug>.mdwithcategories: [Blog](rendering at/blog/<slug>/per_config.yml’spermalink: /:categories/:title/), while soft-archived 2022 posts retain their explicit frontmatter permalinks (/blog/2022/...) so zero legacy URLs break. - Post #1 Author Brain Dump: The initial
notes.mdfor Post #1 will be seeded from the user’s statements in this conversation, and the user can add or tweak any quips when reviewing the Post #1 draft.