Personal portfolio for Uveer Maharaj — dark, minimal, technical. Built with Vite, React, TypeScript, Tailwind CSS, and Framer Motion.
Aesthetic: near-black canvas, monospace display type, restrained cosmic atmosphere (starfield + constellation lines). Content lives in src/data/content.ts.
| Layer | Choice |
|---|---|
| Build | Vite 8 |
| UI | React 19 + TypeScript |
| Styles | Tailwind CSS 4 |
| Motion | Framer Motion |
| Hosting | GitHub Pages (+ custom domain) |
# Install
npm install
# Dev server (hot reload)
npm run dev
# Production build → dist/
npm run build
# Preview production build
npm run previewEdit copy, social links, projects, CV files, Cal.com link, and timeline in:
src/data/content.ts
| Feature | Where to edit |
|---|---|
| Projects | projects.items[] — title, description, tags, links, media (image / video / embed) |
| Project media files | public/projects/* |
| CV downloads | cv.files[] + PDFs in public/cv/ |
| Cal.com booking | booking.calLink (e.g. your-user/30min) |
| About, expertise, path | Matching objects in content.ts |
Example project media:
media: [
{ type: 'image', src: '/projects/my-shot.svg', alt: '…' },
{ type: 'video', src: '/projects/demo.mp4', poster: '/projects/poster.jpg' },
{ type: 'embed', src: 'https://www.youtube.com/embed/VIDEO_ID', title: 'Walkthrough' },
]Cal.com loads only when the Book section approaches the viewport (no impact on starfield or initial JS). Theme is forced dark with CSS variables matching #0a0a0a / white / soft cosmic accents.
src/
components/ # Nav, Hero, Projects, CV, Booking, Starfield, …
data/content.ts # All site copy and metadata
App.tsx
index.css # Design tokens + Tailwind
public/
CNAME
favicon.svg
projects/ # Project images / video assets
cv/ # CV PDF downloads
.github/workflows/deploy.yml
On GitHub: New repository → public (e.g. uveermaharajdotcom or uveermaharaj.github.io).
cd Chaos/uveermaharajdotcom
git init
git add .
git commit -m "Initial portfolio site"
git branch -M main
git remote add origin https://github.com/<your-username>/<repo-name>.git
git push -u origin main- Repo → Settings → Pages
- Build and deployment → Source: GitHub Actions
- Push (or re-run the workflow). The included workflow builds and deploys
dist/.
Alternatively: set Source to Deploy from a branch, build locally (npm run build), and push dist to a gh-pages branch. The Actions path is recommended.
- Ensure
public/CNAMEcontains your domain (default:uveermaharaj.com). Vite copies it intodist/on build. - Repo → Settings → Pages → Custom domain → enter
uveermaharaj.com→ Save. - Enable Enforce HTTPS once DNS has propagated (can take minutes to hours).
For an apex domain (uveermaharaj.com), add A records pointing to GitHub Pages IPs:
| Type | Name | Value |
|---|---|---|
| A | @ |
185.199.108.153 |
| A | @ |
185.199.109.153 |
| A | @ |
185.199.110.153 |
| A | @ |
185.199.111.153 |
For www (optional but recommended):
| Type | Name | Value |
|---|---|---|
| CNAME | www |
<your-username>.github.io |
Confirm current IPs in GitHub’s docs if they change.
If the site is a user/organization site (username.github.io), CNAME for www targets username.github.io. For a project site, the Pages URL is username.github.io/repo-name — custom domains still work with the same A/CNAME pattern; set base in vite.config.ts if you ever serve from a subpath without a custom domain (base: '/repo-name/').
# Edit content or code, then:
git add .
git commit -m "Update portfolio"
git pushThe Actions workflow rebuilds and redeploys on every push to main / master.
- Canvas
#0a0a0a, surfaces#12141a/#1a1c20 - Text pure white + zinc muted tones
- Accent soft cosmic blue
#7dd3fcand dusk purple#a78bfa— interactive / constellation only - Type IBM Plex Mono (display + UI labels) + Inter (body)
- Starfield canvas particles; constellation lines near the cursor; respects
prefers-reduced-motion
Once the base is live:
- Real links — replace placeholder GitHub / LinkedIn / X URLs and email in
content.ts. - Project proof — metrics for alarm rationalization, live demos, or case-study pages.
- Headshot or mark — optional monochrome portrait or refined logo mark in the nav/hero.
- Contact form — wire to Formspree, Resend, or a simple serverless endpoint.
- OG image —
1200×630social card for link previews. - Analytics — privacy-friendly (e.g. Plausible) if you want traffic signal without noise.
- Geist Mono — if you prefer Vercel’s Geist, install
geistand swap the mono stack inindex.css/ HTML.
Private / personal use unless you decide otherwise.