Skip to content

Latest commit

 

History

80 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

website

A minimal dev portfolio with a built-in blog — Next.js App Router, Tailwind v4, shadcn/ui, and a headless Fumadocs content pipeline for writing posts in MDX.

Stack

  • Next.js 16 (App Router, Turbopack) + React 19
  • Tailwind CSS v4
  • shadcn/ui — components in src/components/ui are generated by the shadcn CLI; treat them as vendored, not hand-edited
  • Fumadocs — headless MDX loader for the blog (no Fumadocs UI theme; pages are rendered with this site's own components)

Quickstart

pnpm install
pnpm dev

Open http://localhost:3000.

Make it yours

Everything you're likely to want to change lives in src/config/:

  • author.ts — your name, role, blurb, location, avatar, and time zone
  • socials.ts — your links; the mailto: entry renders as a hover-to-copy email instead of a mailto: link
  • work.ts — work history
  • projects.ts — featured projects
  • site.ts — site title, description, URL, keywords, and your GitHub username (used for the contributions graph)

A few other things to swap:

  • Avatar — set AUTHOR.avatarUrl in src/config/author.ts
  • OG image — replace the file behind SITE_CONFIG.ogImage in src/config/site.ts

Writing posts

Add a .mdx file to content/blog/ with frontmatter:

---
title: Your post title
description: A short summary (optional)
date: "2026-01-15"
author: Your Name
tags:
  - meta
published: true
---

Your content here.
  • title, date are required; description, author, tags are optional.
  • published defaults to true — set it to false to keep a draft out of the sorted post list without deleting the file.
  • Posts are sorted newest-first and the home page teases the latest three.

Notes

  • src/components/ui/** is shadcn-generated — regenerate with the shadcn CLI rather than hand-editing.
  • The GitHub contributions graph calls an unofficial API and fails closed: if it errors or returns no data, that section just doesn't render.

About

My personal website

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages