A terminal-style portfolio website with integrated CMS for managing content. Built with React, TypeScript, Tailwind CSS, and Supabase.
- Interactive Terminal UI - Unique terminal-style portfolio with functional commands
- Admin CMS - Full CRUD operations for all portfolio content
- Authentication - Email/password, Google, and GitHub OAuth
- Role-Based Access - Restrict CMS access to specific email addresses
- Real-time Data - Portfolio data fetched from Supabase database
- Responsive Design - Works on desktop and mobile devices
- Vercel Deployment - Optimized for Vercel hosting
- Frontend: React 18, TypeScript, Tailwind CSS
- UI Components: shadcn/ui, Radix UI
- State Management: TanStack Query
- Routing: React Router DOM
- Database: Supabase (PostgreSQL)
- Authentication: Supabase Auth
- Build Tool: Vite
- Deployment: Vercel
- Node.js 18+ and npm
- A Supabase account and project
- (Optional) Vercel account for deployment
git clone https://github.com/yourusername/nexus.ilramdhan.dev.git
cd nexus.ilramdhan.devnpm installCopy the example environment file and fill in your values:
cp .env.example .envEdit .env with your Supabase credentials:
VITE_SUPABASE_URL=https://your-project-ref.supabase.co
VITE_SUPABASE_ANON_KEY=your-anon-key-here
VITE_ALLOWED_ADMIN_EMAILS=youremail@gmail.com,another@email.com
VITE_SITE_URL=https://yourdomain.com
VITE_SITE_NAME=Your Portfolio NameRun the SQL migrations in your Supabase dashboard:
- Go to your Supabase project dashboard
- Navigate to SQL Editor
- Execute the migration files in order:
supabase/migrations/001_initial_schema.sqlsupabase/migrations/002_storage_policies.sql
In Supabase dashboard:
- Navigate to Storage
- Create a new bucket named
ilramdhan.dev - Set it to Public for public file access
After creating your admin account, you can populate test data:
- Sign up through the CMS (
/admin/login) - Get your User ID from Supabase dashboard: Authentication → Users
- Open
supabase/seed.sql, replace allYOUR_USER_UUIDwith your actual UUID - Run the SQL in Supabase SQL Editor
npm run devOpen http://localhost:8080 to view the portfolio.
In your Supabase dashboard:
- Go to Authentication → Providers
- Enable Google:
- Get OAuth credentials from Google Cloud Console
- Add authorized redirect URI:
https://your-project-ref.supabase.co/auth/v1/callback - Enter Client ID and Client Secret in Supabase
- Enable GitHub:
- Create OAuth app in GitHub Developer Settings
- Add callback URL:
https://your-project-ref.supabase.co/auth/v1/callback - Enter Client ID and Client Secret in Supabase
In Supabase Authentication → URL Configuration:
- Site URL:
https://yourdomain.com - Redirect URLs: Add
https://yourdomain.com/admin/callback
For local development, also add:
http://localhost:8080/admin/callback
Set allowed admin emails in your .env:
VITE_ALLOWED_ADMIN_EMAILS=your.email@gmail.com,github-email@users.noreply.github.comOnly these emails can access the CMS. Leave empty to allow all authenticated users.
nexus.ilramdhan.dev/
├── public/ # Static assets
│ ├── favicon.svg # Terminal-themed favicon
│ └── robots.txt
├── src/
│ ├── components/ # React components
│ │ ├── admin/ # Admin panel components
│ │ └── ui/ # shadcn/ui components
│ ├── contexts/ # React contexts (Auth)
│ ├── hooks/ # Custom hooks
│ ├── integrations/ # Supabase client
│ ├── pages/ # Page components
│ │ └── admin/ # CMS pages
│ ├── types/ # TypeScript types
│ ├── App.tsx # Main app with routing
│ └── main.tsx # Entry point
├── supabase/
│ ├── migrations/ # SQL migrations
│ └── seed.sql # Seed data
├── .env.example # Environment template
├── vercel.json # Vercel config
└── README.md
The portfolio terminal supports these commands:
| Command | Description |
|---|---|
help |
Show all available commands |
about |
Display bio/about information |
projects |
List all portfolio projects |
project <n> |
Show detailed project info |
articles |
List published blog posts |
article <n> |
Read specific article |
skills |
Display tech stack by category |
experience |
Show work experience |
contact |
Display contact information |
social |
Show social media links |
ascii |
Display ASCII art logo |
tree |
Show file structure |
ls |
List directory contents |
cd <dir> |
Change directory |
pwd |
Print working directory |
whoami |
Display current user |
date |
Show current date/time |
clear |
Clear terminal screen |
- Push your code to GitHub
- Connect repository to Vercel
- Add environment variables in Vercel dashboard
- Deploy
Add these in Vercel project settings:
VITE_SUPABASE_URLVITE_SUPABASE_ANON_KEYVITE_ALLOWED_ADMIN_EMAILSVITE_SITE_URLVITE_SITE_NAME
Vercel should auto-detect these settings:
- Framework: Vite
- Build Command:
npm run build - Output Directory:
dist
Access the CMS at /admin:
- Dashboard - Overview of all content counts
- Projects - Manage portfolio projects
- Blogs - Write and publish articles
- Resume - Add work experience and education
- Services - List services you offer
- Certificates - Showcase certifications
- Tech Stack - Manage skills by category
- Messages - View contact form submissions
- Settings - Profile and site configuration
# Run development server
npm run dev
# Build for production
npm run build
# Preview production build
npm run preview
# Run linter
npm run lintMIT License - feel free to use this project for your own portfolio!
Contributions are welcome! Please open an issue or submit a pull request.
Built with ❤️ by Ilham Ramadhan