Devlog — 2026-05-19
Today was layout day. Got the bento grid working and the nested routes wired end-to-end.
Work done
- add ProjectSubPost type
- folder-walking loader with draft + dup-slug checks
- projects{slug}/{post} route
- 301 redirect for legacy project{slug}
- bento grid CSS with featured first card
- richer summary rendering on cards
Bento layout
The grid uses `auto-fit` + `minmax(220px, 1fr)`, and the first card gets a modifier class that spans 2 columns and 2 rows. On screens under 640px the featured span collapses back to a normal cell.
.project-subposts-grid {
display: grid;
gap: 1rem;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
grid-auto-rows: minmax(140px, auto);
}
.project-subpost-card--featured {
grid-column: span 2;
grid-row: span 2;
}
Search updates
Subposts now show up in search with the correct nested URL. Added a `ParentSlug` field to `SearchDoc` so `docURL` can build `projects{parent}/{slug}` when present.
func docURL(doc content.SearchDoc) string {
if doc.Type == "projects" {
if doc.ParentSlug != "" {
return "/projects/" + doc.ParentSlug + "/" + doc.Slug
}
return "/projects/" + doc.Slug
}
return "/post/" + doc.Slug
}
Tomorrow
- wire RSS to include subposts
- bigger featured tile typography
- maybe a tag chip per card
Shipped feels good. The route reorg was the scariest piece and it landed without breaking the existing tag and post routes.