A minimal, performant portfolio built with Next.js (App Router), TypeScript, and Tailwind. Features glass UI, pixel-font accents, responsive sections, and static export for GitHub Pages with a custom domain.
Live: https://sarthak-wadegaonkar.me
- Next.js 15 (App Router) + TypeScript
- Tailwind CSS v4
- next/font (Geist, Jersey_10 as
--font-pixel) - Bun for dependency installation and CI
- GitHub Actions → GitHub Pages (static export)
- Responsive hero, skills, projects, about, and contact sections
- Optimized images for static export; lazy-loading where possible
- Accessibility-minded (focus-visible, reduced motion fallback)
- Custom social icons and pixel-style headings
- Resume modal with PDF embed and fallback open/download
Install dependencies (Bun recommended):
bun installRun the dev server:
bun dev
# or
npm run devdev– start dev server (Turbopack)build– Next.js production buildbuild:export– production build (static export is emitted automatically toout/viaoutput: "export")lint– run ESLint
src/
app/ # App Router, layout, global styles
components/ # UI components (Hero, Section, ProjectCard, etc.)
lib/ # data loaders (reads public/*.json)
public/
assets/langs/ # logos for skills
*.json # data files (languages, projects)
*.gif|*.png|*.jpg # static assets
- Static export (
next.config.ts:output: "export") withimages.unoptimized = truefor GitHub Pages - Limited image variants (
deviceSizes,imageSizes) to reduce export size LangToggleImageuses JPG on small screens and whenprefers-reduced-motionis set, falling back to GIF only on desktop- Global initial loader (
InitialLoader) to avoid jank on first paint
This repo contains a GitHub Actions workflow: .github/workflows/deploy.yml.
Pipeline (default branch pushes):
- Checkout
- Setup Bun + Node
bun install --frozen-lockfilebun run build:export→ emitsout/- Upload and deploy to GitHub Pages with
actions/deploy-pages@v4
Static Export settings (next.config.ts):
output: "export"- Auto
basePath/assetPrefixon CI for repo Pages (disabled if apublic/CNAMEis present) images.unoptimized = true
Custom domain is configured via public/CNAME:
sarthak-wadegaonkar.me
DNS records (at your DNS provider):
- A records (apex/root): 185.199.108.153, 185.199.109.153, 185.199.110.153, 185.199.111.153
- Optional:
www→ CNAME to<username>.github.io
GitHub → Repo Settings → Pages:
- Source: GitHub Actions
- Custom domain: sarthak-wadegaonkar.me
- Enforce HTTPS: enabled
- Skills & language logos:
public/languages.jsonorpublic/lang.json - Projects:
public/projects.json - Text content: mostly in
src/app/page.tsxand component files
MIT