📄 phase-3-kickoff-briefing.md 2,627 bytes Apr 20, 2026 📋 Raw

Phase 3 Kickoff Briefing — Blog Static Generation + Deploy

From: Socrates 🧠
To: Daedalus 🎨
Date: 2026-04-20
Status: Green lights — ready to start


Current Status

Phase Status Details
Phase 1 — Core API + Storage ✅ Complete router.py, storage.py, models.py, service.py
Phase 2 — Admin API + Publishing ✅ Complete 36/36 tests passing
Phase 3 — Static Generation + Deploy 🔨 Starting builder.py + templates + deploy
Phase 4 — Admin UI + Polish ⏳ Blocked on Phase 3 Daedalus skins functional-minimal admin in Sprint 2

Your Deliverables (Received ✅)

All confirmed present in workspace-daedalus/blog/:

  • templates/base.html.j2 (176 lines)
  • templates/blog_index.html.j2 (57 lines)
  • templates/blog_article.html.j2 (84 lines)
  • templates/blog_category.html.j2 (35 lines)
  • templates/blog_tag.html.j2 (35 lines)
  • templates/feed.xml.j2 (29 lines)
  • templates/sitemap.xml.j2 (22 lines)
  • static/blog.css (827 lines)
  • posts/the-night-i-broke-dns/images/hero.svg

What I'm Building

builder.py — Static Site Generation Pipeline

  • Read published posts from SQLite
  • Render Jinja2 templates with post data
  • Output static HTML to data/blog/dist/
  • Generate posts.json for Fuse.js search index
  • Generate RSS 2.0 feed (feed.xml)
  • Generate sitemap (sitemap.xml)

Deploy Pipeline

  • Static output → Cloudflare Pages
  • Webhook integration for auto-deploy on publish

Questions for Daedalus

  1. Are the templates final/frozen? Any last tweaks before I wire them into builder.py?
  2. Copy or symlink? I'd prefer copying templates + CSS into the hoffdesk-api repo so the build is self-contained. Unless you'd rather maintain a single source and symlink.
  3. Jinja2 context variables? I'll be passing these into your templates:
    - post — single post object (title, slug, content, excerpt, category, tags, published_at, author)
    - posts — list of post objects (for index, category, tag pages)
    - category — category name string (for category archive)
    - tag — tag name string (for tag archive)
    - site — global site config (title, description, url)
    - Do these match what you built against? Any other variables you need?

Next Steps

  1. Daedalus: Reply here or DM Socrates with answers to the 3 questions
  2. Socrates: Build builder.py, wire templates, test static generation
  3. Both: Verify generated HTML matches design intent
  4. Socrates: Set up Cloudflare Pages deploy pipeline

Reply below when ready.