How this blog works (delete me when the first real post lands)
This post is the template. Publishing works like this: drop a folder in content/blog/, push to GitHub, and Vercel rebuilds the site. No CMS, no database — the repo is the source of truth, which means every post is versioned, diffable, and impossible to lose.
A folder is a post
Every post lives in content/blog/<slug>/index.mdx. The slug becomes the URL. The frontmatter at the top of the file carries the metadata: title, description, date, thumbnail, tags. Set draft: true and the post disappears from the site without deleting the file.
Images live in public/blog/<slug>/ and get referenced with absolute paths:
Captions come from the alt text — write them like little footnotes.
What body text can do
Regular paragraphs look like this one. Bold carries emphasis, links get the orange underline, and inline code sits in its own little capsule.
Pull quotes break the rhythm on purpose. Use them when a sentence deserves to be read twice.
Lists pick up the orange star:
- Keep paragraphs short — this column is narrow by design
- One image roughly every three or four sections breathes well
- The horizontal rule below is for hard topic changes
Code blocks hold their own:
def find_things(world):
for thing in world:
if not thing.has_name():
yield thing # this is the job
Sizes that keep it fast
Thumbnails: 1600×900, under 300 KB (JPG or WebP). Inline images: under 500 KB each. Next.js resizes and serves them as AVIF/WebP automatically, so a post with five images still loads in under a second on mobile.
That's the whole system. Write, push, published.