My personal site — portfolio, dashboard, and a place to try things out. Built from scratch on the Next.js App Router with React 19, TypeScript and Tailwind CSS v4.
All content is static (data/, common/constant/). There is no database.
You can access this feature by opening the command palette [cmd+k], then typing whatever you want to search/ask for.
Note:
/api/chatruns as a serverless function, so a long OpenAI response can hit the execution timeout. Memory andmaxDurationfor that route are raised in vercel.json; bump them further if your plan allows.
- WakaTime — coding activity, fetched server-side from the WakaTime API.
- GitHub — contribution graph, fetched server-side from the GitHub API.
- Spotify — now-playing, fetched client-side through
/api/now-playing.
Project content lives in data/projects.ts and drives generateStaticParams, so every /projects/[slug] page is statically generated at build time. Any slug not in that list 404s.
pnpm install
cp .env.example .env.local # fill in the keys
pnpm dev # http://localhost:3000Requires Node 24 and pnpm.
pnpm build # production build (postbuild runs next-sitemap)
pnpm start # serve the production build
pnpm lint # biome check .
pnpm lint:fix # biome check --write .
pnpm typecheck # tsc --noEmitTooling is Biome, not ESLint/Prettier. Husky runs Biome on staged files pre-commit and commitlint (Conventional Commits) on the message.
Deployed on Vercel. Any push to main triggers a deployment.