A modern, brutalist-style portfolio website built with Next.js 16, Supabase, and TailwindCSS.
- 🎨 Brutalist Design - Bold, high-contrast UI with monospace fonts
- 📝 CMS Dashboard - Full content management for hero, about, contact, projects, and blog
- 📊 Analytics - Built-in page view and event tracking
- 🔐 Supabase Auth - GitHub OAuth with admin role-based access
- 📱 Responsive - Mobile-first design
- ⚡ Fast - Server-side rendering with Next.js App Router
- Framework: Next.js 16.1 (App Router)
- Database: Supabase (PostgreSQL)
- Auth: Supabase Auth with GitHub OAuth
- Styling: TailwindCSS
- Language: TypeScript
git clone <your-repo>
cd portfolio
npm install- Go to supabase.com and create a new project
- Go to Project Settings > API and copy your URL and anon key
- Update your
.envfile:
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_keyGo to SQL Editor in your Supabase dashboard and run the migration file:
# Copy contents from:
supabase/migrations/20260113000000_init.sql- In Supabase, go to Authentication > Providers
- Enable GitHub
- Create a GitHub OAuth App at github.com/settings/developers
- Set callback URL to:
https://your-project.supabase.co/auth/v1/callback
- Set callback URL to:
- Add your GitHub Client ID and Secret to Supabase
npm run devOpen http://localhost:3000 to see your site.
src/
├── app/
│ ├── page.tsx # Homepage
│ ├── blog/ # Blog pages
│ ├── dashboard/ # Admin CMS
│ └── auth/ # Auth pages
├── components/
│ └── dashboard/ # CMS components
└── lib/
├── db.ts # Database functions
├── analytics.ts # Analytics tracking
├── actions.ts # Server actions
└── supabase/ # Supabase client
The first user to sign in with the email [email protected] will automatically be assigned the admin role.
To change this, update the email in supabase/migrations/20260113000000_init.sql:
IF NEW.email = '[email protected]' THEN- Push to GitHub
- Connect to Vercel
- Add environment variables in Vercel dashboard
- Deploy!
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_anon_key
GITHUB_TOKEN=ghp_xxx (optional, for repo star sync)MIT