Documentation

Content model

Every document type, every field, what it does.


The Sanity schemas live in studio/schemas/index.ts. Four document types.

post

The workhorse. Every blog article is one of these.

FieldTypeRequiredNotes
titlestringyesPost title
slugslugyesAuto-derived from title; edit if you want
descriptiontext (2 rows)yesMeta description, OG description, card summary. ≤200 chars
tldrtext (3 rows)noSurfaces as <meta tldr> for AI summarizers + blockquote at post top
pubDatedatetimeyesPublish date shown on the post
updatedDatedatetimenoOptional last-updated marker
authorreference → authornoAuthor bio
categorystring (dropdown)noOne of: AI Agents, Engineering, Cloudflare, MSP, Meta, Philosophy
tagsstring[]noFree-form tag list
keywordsstring[]noBecomes <meta keywords> for SEO
heroImageimage (hotspot)noFull-width banner + og:image
bodyportable textnoThe article content
draftbooleannoDefault true in Studio, false from CLI

Body block types

Portable text with these types:

  • block (paragraph, H2, H3, blockquote) with marks: strong, em, code, link
  • image with hotspot support (crops cleanly on any aspect ratio)
  • codeBlock — custom object with language, code, filename

page

For static pages (About, Uses, Now, colophon).

FieldTypeRequired
titlestringyes
slugslugyes
descriptiontextno
updatedDatedatetimeno
bodyportable textno
draftbooleanno

Every page in Sanity gets an automatic route at /{slug} on the site (except /about, which has a dedicated route).

author

Bio + socials for post attribution.

FieldTypeNotes
namestringDisplay name
slugslugFor future author archive pages
rolestringShows under name on posts (“Lead Engineer · Builder”)
biotextLong bio
avatarimageNot currently rendered on posts (uses initials)
socials.githuburl
socials.twitterurl
socials.websiteurl

project

Public build-work entries shown on /projects.

FieldTypeNotes
namestringProject name
slugslugFor future project detail pages
taglinetext (2 rows)One-sentence description
statusstring (dropdown)Active / Live / Alpha / Paused / Archived
urlurlWhere to send visitors (GitHub, live site, etc.)
stackstring[]Tech tags shown on the card
ordernumberLower = higher on the page

Field-to-render mapping

Everything renders through src/lib/sanity.ts. If you want a new field to appear on the site:

  1. Add it to the schema in studio/schemas/index.ts
  2. Add it to POST_PROJECTION (or page/project projection) in src/lib/sanity.ts
  3. Add it to UnifiedPost.data type
  4. Add it to mapPost so it flows into the interface
  5. Reference it in the layout that renders it (BlogPost.astro, index.astro, etc.)

Deploy the schema change (cd studio && bun run deploy), publish a document that uses the field, and it appears on the site after the next build.