Personal portfolio for Saket Kumar — Senior Data Engineer, Bengaluru. Built with Astro, deployed on Cloudflare Pages, blog powered by whiz.pub.
npm install
npm run dev
# → http://localhost:4321Build for production:
npm run build
npm run preview # serve the dist/ folder locally.
├── src/
│ ├── config.ts # ⭐ All content lives here — edit this, not the components
│ ├── layouts/BaseLayout.astro
│ ├── components/
│ │ ├── Nav.astro
│ │ ├── Hero.astro
│ │ ├── Projects.astro
│ │ ├── About.astro
│ │ ├── Experience.astro
│ │ ├── Skills.astro
│ │ ├── BlogPreview.astro # Fetches whiz.pub RSS at build
│ │ ├── Contact.astro
│ │ └── Footer.astro
│ ├── pages/index.astro
│ └── styles/global.css
├── public/
│ ├── favicon.svg
│ ├── upvote-pls.png
│ └── SaketKumar_Resume_2026.pdf # replace with your latest résumé PDF
├── astro.config.mjs
├── package.json
├── wrangler.toml # Cloudflare Pages config (optional)
└── .github/workflows/deploy.yml # Auto-deploy on push
Everything customizable is in src/config.ts — bio, projects, jobs, skills, certs, links, and the whiz.pub blog URL. Components read from it.
Cloudflare Pages is free forever, unlimited bandwidth, no credit card, global edge network. Best host for a job-search portfolio.
- Push this repo to GitHub (see push instructions at the bottom).
- Go to https://dash.cloudflare.com/ → sign up (free, no CC).
- Workers & Pages → Create → Pages → Connect to Git.
- Authorize GitHub, select
Saketkr21/Saketkr21.github.io. - In the build settings, choose these values:
- Framework preset: Astro
- Build command:
npm run build - Build output directory:
dist - Root directory:
/(default) - Node.js version:
22
- Click Save and Deploy. First build takes ~2 minutes.
Your site is live at https://saketkr21-portfolio.pages.dev (or whatever project name you picked). Every push to main triggers a new deploy automatically.
- Best: get a free real domain via is-a.dev — submit a PR pointing
saket.is-a.dev(or similar) at your CF Pages URL. - Then in Cloudflare Pages → Custom domains → add
saket.is-a.dev.
The included GitHub Actions workflow at .github/workflows/deploy.yml builds Astro and publishes to GitHub Pages automatically. Because this is a user site (repo named <user>.github.io), the deployment target is the root of https://saketkr21.github.io.
- Push this repo (see below).
- Repo → Settings → Pages → Source:
GitHub Actions. - Push a commit to
main. The workflow builds Astro and deploys.
Site is live at https://saketkr21.github.io. Every push to main redeploys.
The Blog section is powered by whiz.pub — a free, API-first blogging platform.
- Sign up at https://app.whiz.pub/auth/signup and pick your subdomain (e.g.
saket). - Publish your first post via web dashboard, CLI (
whiz publish post.md), or API. - Edit
src/config.ts:urls: { ... blogUrl: 'https://saket.whiz.pub', // ← your subdomain blogRssEnabled: true, // ← flip to true }
- Commit + push. The next build fetches your RSS feed at
https://saket.whiz.pub/rss.xmland renders your 4 latest posts inline on the homepage.
Until you set that, the Blog section shows a friendly placeholder and the nav Blog link points to whiz.pub's landing page.
- Dark mode is the default.
- Respects
prefers-color-schemeon first load. - Toggle button in the nav flips between dark/light and remembers your choice in
localStorage.
Colors are defined as CSS variables in src/styles/global.css under :root and :root[data-theme='light'].
You said you'd handle the git commits. When you're ready:
cd Saketkr21.github.io/
git init
git add .
git commit -m "portfolio: initial astro build"
git branch -M main
git remote add origin git@github.com:Saketkr21/Saketkr21.github.io.git
git push -u origin main --force # --force replaces the existing repo contentsNote: the old vanilla-HTML
index.htmlat the repo root is a legacy stub that redirects to/. After the first successful deploy, safe to remove:git rm index.html git commit -m "portfolio: remove legacy vanilla index.html" git push
- Astro 5 — static site generator, ships zero JS by default.
- Vanilla CSS — custom design system with CSS variables.
- Google Fonts — Inter (UI), JetBrains Mono (mono).
- whiz.pub — API-first blog, RSS-integrated at build time.
- Cloudflare Pages — free static host, unlimited bandwidth.
Personal portfolio, all rights reserved. Feel free to take inspiration from structure/patterns.