Skip to content
Ship every weekUI and contentblog

Blog built in

Publish a post by adding one entry. The rest is handled.

Write a post, add it to one list, and it's live: reading time, categories, search, related posts, and search-engine markup all happen for you. Every post uses the same clean layout, so publishing never turns into a design task.

  • 5 kinds of content blocks
  • 1 featured story at a time
  • 0 CMS services to run

How it works

The mechanism end to end, as implemented in the repository.

  1. 1

    Add a typed post

    Define the post in one content file with its slug, date, description, author, tags, and content blocks. Required fields are enforced by types.

  2. 2

    Discovery derives itself

    The featured story, category filters, search, reading time, and listing cards are computed from the catalog. No wiring per post.

  3. 3

    One shell renders every post

    The shared article component renders all five block types, and related links must point at real posts, so they can't go stale.

  4. 4

    Crawlers see what readers see

    The post page emits article markup from the same metadata that renders on screen, so SEO stays in lockstep with the content.

Interactive example

See it working

This walkthrough demonstrates the implemented backend contract without using an account, credentials, or provider calls.

Interactive example

Explore the implemented decisions

Choose a sample state
Typed article card

Deterministic sample data only. No account, provider, or network connection is used by the interaction.

The problem this solves

Without a shared foundation, every team rebuilds these edge cases — differently.

A CMS project before your first post

You wanted to publish one launch post. Instead you're setting up a hosted CMS, API tokens, and preview environments. Here, a post is an entry in a file, and it ships with your next deploy.

Posts with holes in them

One post has no date, another no author, a third no description. Search engines get scraps. Here, those fields are required, so an incomplete post won't even build.

Every post its own frontend task

Each article hand-rolls its own markup, so callouts and code blocks drift in style, and writing becomes coding. Here, five block types and one shared layout make every post consistent.

Highlights

Why it matters

One entry, fully wired

Add a post to one typed file and the listing, filters, reading time, and related stories all update on their own.

Rich posts, zero layout work

Paragraphs, lists, callouts, code blocks, and quotes all render through one shared article shell, so every post looks consistent.

Search engines get the full story

Each post publishes proper article markup from the same required fields (date, author, description) that readers see.

Engineering guarantees

What this does and does not promise

Safety boundary

Posts live in your repo and get checked at build time. RSS, stored feedback, and dynamic social images aren't included yet, and the disabled Sanity scaffold isn't presented as an active CMS.

Implementation evidence

The boundary above is code, not a claim. These files carry the contract:

  • src/modules/blog/content.ts
  • src/modules/blog/BlogArticle.tsx
  • src/routes/_public/blog
Questions

Frequently asked questions

Build on the blog built in foundation

The docs describe the same contracts this page demonstrates.