Modern portfolio built with Next.js 16 (App Router) + TypeScript + Tailwind v4, powered by Supabase (Postgres) CMS, deployed on Vercel.
🌐 Live: masudulhasan.me · 🛠️ Admin: masudulhasan.me/admin
⚠️ COPYRIGHT NOTICE: This repository and all its contents are protected under copyright law. Copying, reusing, or redistributing any part of this project without explicit written permission is strictly prohibited. SeeLICENSEfor full terms.
- Home — Hero (typed effect), About, Skills, Education, Experience, Leadership, live CP stats (Codeforces/AtCoder/CodeChef/LeetCode), Projects, Contact form
- CV Generator (
/cv) — role-tailored ATS CV with PDF print + clipboard copy - Payment Portal (
/payment) — bKash/Nagad/Upay/Rocket + PDF receipt (simulated) - Admin Panel (
/admin) — secure login, contact-message inbox (mark-read/delete), CMS content editor for all profile data, password change - Full CMS — every piece of content (profile, skills, education, experience, projects, org roles, activities, CV targets) is stored in Supabase and editable from the admin panel. Static fallback guarantees the site never renders blank.
| Layer | Tech |
|---|---|
| Framework | Next.js 16 (App Router, RSC) + TypeScript |
| Styling | Tailwind CSS v4 + brand tokens (#00f2ff/#4d4dff, Outfit/Space Grotesk) |
| Database | Supabase (Postgres) — 9 tables with RLS |
| Auth | Supabase email/password (public signup disabled, single admin) |
| Animations | Framer Motion (replaces AOS), Typed.js |
| Deploy | Vercel (custom domain masudulhasan.me) |
| Table | Purpose | anon | authenticated |
|---|---|---|---|
contact_messages |
Contact form submissions | INSERT only | full |
profile |
Personal info | SELECT active | full |
skills / education / experience / projects / org_roles / activities / cv_targets |
CMS content | SELECT active | full |
- Schema:
supabase/schema.sql(idempotent) - Seed:
supabase/seed.sql(generated fromsrc/lib/profile-data.ts— the canonical fallback) - RLS: anon can only read active public content; authenticated (admin) has full CRUD.
service_roleis never exposed to the client.
- URL:
https://masudulhasan.me/admin - Credentials: stored locally in
ADMIN_CREDENTIALS.txt(gitignored). Change the password immediately after first login via the Change Password option in the admin panel. - Recovery: if you forget the password, reset it in Supabase Dashboard → Authentication → Users.
npm install
cp .env.example .env.local # fill in your Supabase values
npm run dev # http://localhost:3000Env vars (all also set in Vercel):
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYREVALIDATE_SECRET(on-demand ISR invalidation)SUPABASE_SERVICE_ROLE_KEY(server-only, optional)
- GitHub
main→ Vercel auto-deploy → masudulhasan.me legacy/contains the original static site (frozen, kept for reference)- On-demand revalidation:
POST /api/revalidate?secret=<REVALIDATE_SECRET>
git revert HEAD— undo last changegit reset --hard backup/pre-supabase— full restore to the pre-Supabase baselinegit push origin main— deploy again