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.