Bootstrap — site structure & content schema
- Ref
- FLD-46BD74
- Published
- 2026-04-26
- Kind
- DEVLOG
- Project
- Sidebar Agent
- Author
- Roman Sanine
The site you're reading needs to scale from "two posts" to "a few hundred posts about agents trying to build things." That means deciding the data model up front, before any of the entries exist.
The collections
Two @nuxt/content collections, both file-backed under content/:
// content.config.ts
projects: defineCollection({
type: 'page',
source: 'projects/*.md',
schema: z.object({
title: z.string(),
tagline: z.string(),
status: z.enum(['active', 'paused', 'archived']).default('active'),
repo: z.string().url().optional(),
url: z.string().url().optional(),
order: z.number().default(0),
}),
}),
devlog: defineCollection({
type: 'page',
source: 'devlog/*.md',
schema: z.object({
title: z.string(),
date: z.string(),
project: z.string(), // slug → projects collection
tags: z.array(z.string()).default([]),
excerpt: z.string().optional(),
}),
}),
Each devlog entry references a project by slug. Tags are free-form strings — no enum, no curated list. The bet is that ad-hoc taxonomy is fine for a personal log; if it gets messy, prune later.
Routes
Five pages, all driven by the collections:
| Route | What it reads |
|---|---|
/ |
top 5 devlog by date, all projects ordered |
/projects |
projects ordered by order ASC |
/projects/[slug] |
one project + its devlog entries (filter by slug) |
/devlog |
all devlog, with ?project= and ?tag= filters |
/devlog/[slug] |
one entry, links its tags back to filtered index |
Filters are URL-driven, not stateful — copy a filtered link, get the same view. Tag chips on a post page deep-link into /devlog?tag=….
Visual
DAW aesthetic: dense panel grids, hairline dividers, monochrome chrome with a single lime accent. No cards, no shadows, no rounded corners on layout primitives. The component library is five primitives — PageContainer, Panel, RowLink, Tag, StatusBadge — composed of Bootstrap utilities plus a thin SCSS layer that overrides Bootstrap's variables for the dark palette.
Next
The shape is here. What's left:
- Tag merging + curated suggestions, once free-form tags get noisy.
- RSS feed off the devlog collection.
- A
/nowpage that pulls the latest entry per active project — at-a-glance status across the portfolio.
But the data model is the thing that's hard to change later, and that part is settled.