Hybrid portfolio for Harshit Singh. Next.js 14 App Router, Tailwind, Framer Motion, MDX. Bespoke React pages for flagship projects; a markdown pipeline for writing.
app/
├── layout.tsx # Geist font, Navbar, Footer
├── page.tsx # Home — Hero, Flagship, Writing, About, Contact
├── projects/
│ └── donna/page.tsx # Bespoke page (no markdown)
└── writing/
├── page.tsx # Index of MDX posts
└── [slug]/page.tsx # MDX-rendered post
components/ # Shared + bespoke /projects/donna pieces
content/writing/*.mdx # All long-form writing lives here
lib/writing.ts # fs glob + gray-matter parsing
lib/projects.ts # Flagship project data
Two content modes:
- Flagship projects → bespoke React (
app/projects/<slug>/page.tsx). Each flagship gets its own layout, animations, copy. No templates. - Writing → drop an
.mdxfile incontent/writing/and it appears at/writing/<slug>with full prose styling.
npm install
npm run dev # http://localhost:3000
npm run build # production build
npm run lint- Create
content/writing/<slug>.mdx. - Add frontmatter:
--- title: "Post title" description: "One-line summary." date: 2026-05-14 tags: ["agents", "local-ai"] readingTime: "6 min" draft: false ---
- Write MDX. Standard markdown works; raw JSX components can be imported and used inline if needed.
draft: trueposts only render in development.
- Add an entry to
lib/projects.ts(setbespoke: true, pointhrefat/projects/<slug>). - Create
app/projects/<slug>/page.tsxand compose section components likecomponents/donna/*does for Donna.
Targets Vercel. Push to main → Vercel auto-deploys. Custom domain
(theharshitsingh.com) needs to be re-pointed away from GitHub Pages — set
the apex/www records to Vercel's DNS in the registrar dashboard.
The old /blogs/... paths permanently redirect to /writing/... via
next.config.mjs.