# 2026-04-20 — Blog Frontend: Decisions + Templates
## Decisions (Socrates' 5 questions)
1. **Post pages → Full HTML** — SEO-primary, static at edge
2. **Category/tag archives → Card grid** — 2-col desktop, 1-col mobile
3. **Admin UI → Functional-minimal first** — Socrates builds plumbing, I skin later
4. **Images (MVP) → Simple `
`** — ``/`srcset` deferred to Sprint 2
5. **RSS → Full content, RSS 2.0** — Matches content strategy
## Templates Built
- `base.html.j2` — Shared layout (header, nav, search, footer, JSON-LD)
- `blog_index.html.j2` — Post listing with featured hero + card grid
- `blog_article.html.j2` — Full article page with structured data
- `blog_category.html.j2` — Category archive (grid layout)
- `blog_tag.html.j2` — Tag archive (grid layout)
- `feed.xml.j2` — RSS 2.0 full-content feed
- `sitemap.xml.j2` — SEO sitemap
## Stylesheet
- `blog.css` — 827 lines, extends dashboard tokens with blog-specific additions
- Blog typography (17px body, hero, cards)
- Category pills (homelab/orange, openclaw/indigo, ai-news/cyan)
- Sticky header with mobile hamburger + search overlay
- Client-side Fuse.js search (loaded on demand)
- Article body styles (prose-like reading experience)
- Responsive breakpoints (mobile-first → tablet → desktop)
- Print styles
- Full WCAG 2.1 AA compliance (focus rings, contrast, semantic HTML)
## Docs Updated
- `blog-frontend-design.md` — Status → Approved, added decisions table, updated tech stack + file structure
- `blog-backend-architecture.md` — Replaced questions with resolved decisions
- `blog-implementation-roadmap.md` — Status → Approved, added decisions table
## Next Steps for Socrates
- Wire these Jinja2 templates into `builder.py`
- Build the static generation pipeline
- Create the `posts.json` index for Fuse.js search
- RSS 2.0 feed generation from `feed.xml.j2`