Three years, but not three years of coding. Some months I shipped every week; some months I opened the repo, stared at it, and closed it. Every design choice felt personal and every unfinished page felt like public evidence I wasn't ready. Version three shipped once I stopped trying to build a final portfolio and started building something boring enough to keep running.
How it fits together
- MDX posts to content-collections (validated, typed): frontmatter checked at build
- content-collections (validated, typed) to Next.js app: typed articles
- @nas/ui (Tailwind + shadcn) to Next.js app: components
- Next.js app to Reader: server-rendered pages
The repo is a #turborepo monorepo on #pnpm, which keeps the app, the UI kit and the content pipeline separate while they share types and tooling.
| Piece | Job |
|---|---|
| #nextjs + #typescript | Server rendering and routing without fighting the framework; content models stay explicit. |
| #mdx + #content-collections | Posts are typed data, not loose text: bad frontmatter fails the build, not the page. |
| #tailwindcss + #shadcn | One visual language, so a new section doesn't need a new design. |
| #figma | Where a design starts. Real content in the browser is where it gets decided. |
Every tool had one job: help me publish faster with less maintenance.
What three years taught me
| I used to | What actually worked |
|---|---|
| Push through late nights to finish | Protecting energy. Tired me rewrote things I'd already solved. |
| Wait for one more polish pass | Shipping rough. Readers cared about clarity and speed, not my spacing system. |
| Get the design right in Figma | Iterating on live pages. A section that looks great in a mock can read heavy. |
| Chase new tools | Boring, reliable ones. Shiny tools become a side quest. |
| Cringe at old versions | Treating each as a milestone: V1 taught momentum, V2 structure, V3 restraint. |
If you're building your own: pick a stack you can maintain when life gets busy, publish before your inner critic is satisfied, and let small, frequent changes do the work. No hero rewrites.