A premium, interactive developer portfolio built with React 19, TypeScript, and Vite. Designed to feel like a developer's environment — a terminal, a command palette, global search, keyboard shortcuts, and per-project case studies — all content-driven from a single source of truth in src/data/.
No fake stats. No fake screenshots. Planned projects are labeled
planned, missing demos show "coming soon" placeholders, and the GitHub section reads live data from the public GitHub API.
- Live Demo
- Features
- Screenshots
- Tech Stack
- Getting Started
- Project Structure
- Configuration
- Adding Your Content
- Deployment
- Roadmap
- License
Deployed to Vercel:
Replace https://your-domain.vercel.app above with your deployed URL once you deploy (see Deployment).
To let users open your live site from the README, simply keep this badge or swap it for a plain link:
### Live Demo https://www.krishkamani.online
- Themes — dark / light / system preference, persisted, animated transitions, no-flash on load.
- Interactive terminal (
Ctrl+`/K t) —help,about,skills,projects,open <id>,github,contact,theme,clear,whoami,date,ls+ asudo admineaster egg. Arrow-key history. - Command palette (
Ctrl+K) — jump to any section, toggle theme, open GitHub, contact. Tracks recent commands. - Global search (
/orCtrl+Shift+F) — live content index over projects, skills, experiments, timeline, and pages. - Keyboard shortcuts —
g s / g w / g a / g k / g l / g r / g c,Ctrl+K,Ctrl+Shift+F,Ctrl+`,?for help. - Case studies — per-project pages with problem/solution cards, tech breakdown, architecture diagram, media viewer (zoom, arrows, ESC), and prev/next navigation.
- GitHub section — real profile, pinned-style repos, language breakdown, and a contribution grid with loading/error/rate-limit states and a 15-minute cache.
- Animations — scroll reveals, magnetic buttons, self-drawing timeline, aurora/grid/noise background — all respecting
prefers-reduced-motion. - SEO — Open Graph + Twitter cards, canonical URL,
robots.txt,sitemap.xml, generated OG image. - Accessibility — semantic HTML, skip link, visible focus states, ARIA labels, keyboard-operable overlays.
To add screenshots: drop your images into
public/images/and reference them fromsrc/data/projects.ts:hero: '/images/linux-system-monitor.png', // card / case-study cover media: [ { type: 'image', src: '/images/dashboard.png', alt: 'Dashboard view', caption: 'Real-time CPU + memory' }, ],
hero: nulland thevisualfield render a designed placeholder until a real image exists. For GIFs/videos usetype: 'gif'/type: 'video'.
- React 19 + TypeScript (strict,
verbatimModuleSyntax) - Vite (rolldown) with code-split routes
- Framer Motion — animations
- Tailwind CSS 3.4 + CSS custom-property design system
- lucide-react icons + inline brand SVGs
- oxlint for linting
- Resend — optional serverless contact email (Vercel function in
api/)
npm install
npm run dev # local dev serverQuality gates:
npx tsc --noEmit # type check
npm run lint # oxlint
npm run build # production build
npm run preview # preview the production build.
├── api/
│ └── contact.ts # Vercel serverless function (Resend email)
├── public/
│ ├── favicon.svg
│ ├── og-image.png # 1200×630 social preview
│ ├── robots.txt
│ ├── sitemap.xml
│ └── images/ # add your project screenshots here
├── src/
│ ├── components/ # Navbar, Terminal, CommandPalette, GlobalSearch, ...
│ ├── data/ # profile, projects, skills, timeline, experiments, commands
│ ├── hooks/ # useTheme, useGithub, useKeyboardShortcuts, ...
│ ├── lib/ # router, app-context, search, github, toast, cn
│ ├── pages/ # HomePage, ProjectCaseStudy
│ ├── sections/ # Hero, About, Skills, Projects, Timeline, Lab, Resume, ...
│ ├── styles/index.css # design tokens + component styles
│ ├── types/index.ts
│ ├── App.tsx
│ └── main.tsx
├── .env.example
├── index.html # SEO metadata, theme no-flash script
└── package.json
Copy .env.example to .env and adjust:
VITE_GITHUB_USERNAME=your-username
.env is git-ignored. No API keys are required for the public site — the GitHub section uses only public, unauthenticated API data.
Contact form (optional): set these in your host's environment variables (never commit them):
RESEND_API_KEY=re_...
CONTACT_TO_EMAIL=you@example.com # where messages are delivered
CONTACT_FROM_EMAIL=onboarding@resend.dev
All content lives in src/data/ — edit the data files and the site updates everywhere:
profile.ts— name, role, bio, interests, links, education, site URL.projects.ts— add/edit projects: tags, GitHub links,demoURL,demoState(live | coming-soon | local),heroscreenshot,mediagallery, and full case-study content.skills.ts,timeline.ts,experiments.ts,commands.ts— skills, timeline entries, lab snippets, palette commands.
Live demo links per project — set these two fields:
demo: 'https://your-project.vercel.app', // shown as a "Live demo" button
demoState: 'live',Your own site URL — used for the canonical tag and sitemap:
// src/data/profile.ts
site: { url: 'https://your-domain.vercel.app' },<!-- index.html -->
<link rel="canonical" href="https://your-domain.vercel.app" /><!-- public/sitemap.xml -->
<loc>https://your-domain.vercel.app/</loc>Output is plain static HTML/CSS/JS — works on any static host:
- Vercel / Netlify — connect the repo: build command
npm run build, output directorydist. Vercel also auto-detects and deploys theapi/serverless function. - GitHub Pages — push
dist/to thegh-pagesbranch or use the official action (note:api/won't run).
After deploying, update the canonical URL in index.html and the domain in public/sitemap.xml, then add your URL to the Live Demo section above.
- Add real project screenshots (
public/images/) - Publish planned projects and point their links at real repositories
- Add a real PDF resume
- Optional: blog/write-ups section, analytics
MIT — see LICENSE.