Source for my personal portfolio — a single Next.js app showcasing AI/PM projects and writing.
This is my portfolio, open-sourced honestly. It's not a generic template, but the structure is straightforward enough that you can fork it, swap the content, and have your own. There's no setup wizard and no CMS — adding a project is editing an MDX file and pushing.
- Next.js 16 App Router, TypeScript, Tailwind v4, shadcn/ui
- Velite for typed content collections (projects + writing) with Zod
- Modern AI aesthetic — restrained palette, monospace accents, subtle signature on the hero. Lucide for UI icons, simple-icons for tech brands. No emojis.
- Light + dark themes with toggle
- Static — no database, no auth, no admin. Adding content is a git push.
- MIT licensed
The full design and architecture decisions live in PLAN.md.
pnpm install
pnpm devVelite runs once before dev and build to generate typed content. To live
reload content changes during dev, run pnpm velite:watch in a second
terminal.
pnpm new-projectWalks you through title / slug / summary / tech stack / URLs and writes
content/projects/<slug>.mdx with the section skeleton plus an empty
public/projects/<slug>/ folder for the hero image.
Then:
- Drop a hero image at
public/projects/<slug>/hero.{png,jpg,webp,svg}. - Fill in the four MDX sections.
- Flip frontmatter
statusfrom"draft"to"published"when ready. - Push. Vercel deploys it.
Drafts are visible in pnpm dev and on Vercel preview deploys, hidden in
production.
Writing entries are link cards — they point to where the post actually lives (Substack, Medium, etc.). To add one:
-
Create
content/writing/<slug>.mdxwith frontmatter only:--- title: "Post title" slug: "post-slug" summary: "One-line blurb." external_url: "https://example.substack.com/p/..." platform: "Substack" date: "2026-05-08" status: "published" ---
-
Drop a hero image at
public/writing/<slug>/hero.{png,jpg,webp,svg}(typically the social preview image from the post). -
Push.
Connect the repo to Vercel and push to main. No env vars are required for
v1. Push to a branch to get a free preview URL with drafts visible — useful
for sharing in-progress projects before publishing.
MIT © Rafael Oliveira