Publishing a piece of content
Step by step for creating a post, a project, a doc or a newsletter issue in this repository.
2 min read
Every piece of content on this site is an .mdx file versioned in Git. There's no
admin panel: publishing means creating a file and pushing.
1. Pick the collection and the locale
Files live under content/{locale}/{collection}/:
| Collection | Shows up at | Purpose |
|---|---|---|
projects | /en/projects | Portfolio |
blog | /en/blog | Articles and notes |
docs | /en/docs | Technical reference |
newsletter | /en/newsletter | Issues |
Available locales are pt and en.
2. Create the file
The filename is the URL slug. content/en/blog/my-post.mdx becomes
/en/blog/my-post.
Use the same filename in both locales. That's what lets the language switcher take a reader from the Portuguese post straight to the English version. If the translation doesn't exist yet, switching lands on the section index instead of erroring.
3. Fill in the frontmatter
The YAML block at the top of the file. title and date are required:
---
title: "Post title"
description: "One or two sentences. Shows in the listing and in search results."
date: "2026-07-26"
tags: ["Next.js", "TypeScript"]
---The full field list, including the collection-specific ones, is in the frontmatter reference.
4. Write
Regular Markdown, with a few extras:
- Tables, task lists and strikethrough work (GitHub Flavored Markdown).
- Code blocks get automatic syntax highlighting in both themes — just name the language after the backticks.
##and###headings are picked up automatically by the "On this page" sidebar.
Start the body at ##. There's no #: the page title already comes from the
frontmatter.
5. Keep it as a draft (optional)
To write without publishing, add:
published: falseThe file disappears from listings, RSS and the sitemap, but stays reachable by direct URL during development.
6. Publish
git add content/
git commit -m "post: post title"
git pushVercel builds and deploys in about a minute. Since pages are generated statically at build time, new content only appears after a deploy — editing a file on GitHub triggers one too.
Running it locally first
npm run devThe server reloads on every save. Before pushing, it's worth running:
npm run buildThe build fails if any file is missing title or date — the safety net that keeps
broken frontmatter out of production.