A modern, professional portfolio website built with React, Vite, Tailwind CSS, and Supabase.
- Hero Section - Engaging first impression
- About - Professional background
- Journey/Timeline - Career progression
- Experience - Work history
- Video Portfolio - Visual demonstrations
- Projects - Showcased work
- Skills - Technical expertise
- Certificates - Credentials
- Career Goal - Professional objectives
- Contact - Get in touch
- Responsive Design - Mobile, tablet, desktop
- Dark Mode - Eye-friendly viewing
- Smooth Navigation - Enhanced UX
- Authentication - Secure login with Supabase
- Role-based Access - Admin authorization
- CRUD Operations for:
- Experiences
- Projects
- Videos
- Certificates
- Skills
- Timeline events
- Site settings
- Image Upload - Supabase Storage integration
- Publish/Unpublish - Content control
- Display Order - Custom sorting
- Frontend: React 18 with Vite
- Styling: Tailwind CSS with dark mode
- Routing: React Router v6
- Backend: Supabase (Auth, Database, Storage)
- Icons: Lucide React
- Build Tool: Vite
- Design: Industrial, professional, technical aesthetic
portfolio/
├── src/
│ ├── components/ # Reusable UI components
│ ├── sections/ # Portfolio page sections
│ ├── pages/ # Full pages (Portfolio, Login)
│ ├── admin/ # Admin dashboard pages
│ ├── data/ # Static portfolio data
│ ├── hooks/ # Custom React hooks
│ ├── lib/ # Library configurations
│ ├── utils/ # Utility functions
│ ├── App.jsx # Main app component
│ ├── main.jsx # Entry point
│ └── index.css # Global styles
├── public/ # Static assets
├── index.html # HTML template
├── vite.config.js # Vite configuration
├── tailwind.config.js # Tailwind configuration
├── postcss.config.js # PostCSS configuration
├── SETUP.sql # Supabase database setup
├── .env.example # Environment variables
├── package.json # Dependencies
└── README.md # This file
- Node.js 16+
- npm or yarn
- Supabase account (for admin features)
- Clone the repository:
git clone https://github.com/abdou-fd/portfolio.git
cd portfolio- Install dependencies:
npm install- Create
.env.localfile:
cp .env.example .env.local- Add your Supabase credentials to
.env.local:
VITE_SUPABASE_URL=your_supabase_project_url
VITE_SUPABASE_ANON_KEY=your_supabase_anon_key
- Start development server:
npm run devThe portfolio will open at http://localhost:5173
npm run build
npm run previewThe optimized build will be in the dist/ directory.
- Create a new Supabase project at https://supabase.com
- Copy your project URL and Anon Key
- In the SQL Editor, run all contents of
SETUP.sql - Create a storage bucket named
portfolio-images - Set up storage policies (see SETUP.sql for RLS policies)
- Create an admin user in the
admin_userstable - Add credentials to
.env.local
admin_users- Admin user authorizationsite_settings- Global site configurationexperiences- Work experience entriesprojects- Portfolio projectsvideos- Video portfolio entriescertificates- Certificates and credentialsskills- Technical skillstimeline- Career timeline events
/- Portfolio homepage
/login- Admin login
/admin- Admin redirect/admin/dashboard- Main dashboard/admin/experiences- Manage experiences/admin/experiences/new- Create experience/admin/experiences/:id- Edit experience/admin/projects- Manage projects/admin/projects/new- Create project/admin/projects/:id- Edit project/admin/videos- Manage videos/admin/videos/new- Create video/admin/videos/:id- Edit video/admin/certificates- Manage certificates/admin/certificates/new- Create certificate/admin/certificates/:id- Edit certificate/admin/skills- Manage skills/admin/skills/new- Create skill/admin/skills/:id- Edit skill/admin/timeline- Manage timeline/admin/timeline/new- Create timeline entry/admin/timeline/:id- Edit timeline entry/admin/settings- Site settings
The public portfolio uses static data from src/data/portfolioData.js and does NOT require Supabase to function. This ensures the portfolio works even without:
- Supabase credentials
- Database connection
- Authentication setup
All portfolio content (about, experience, projects, skills, etc.) is defined in src/data/portfolioData.js and can be easily edited without backend changes.
- Secure login with Supabase Auth
- Session persistence
- Auto-logout on token expiry
- Role-based access control
- Only users in
admin_userstable can access dashboard - Protected routes with automatic redirect
- Create, read, update, delete operations for all content types
- Image upload to Supabase Storage
- Publish/unpublish toggle
- Display order management
- Real-time updates
- Admin routes protected with authentication
- Row-level security (RLS) policies on all tables
- Image uploads restricted to authenticated admins
- Admin authorization verified via
admin_userstable - Environment variables for sensitive data
VITE_SUPABASE_URL # Your Supabase project URL
VITE_SUPABASE_ANON_KEY # Your Supabase anonymous key
vercelAdd environment variables in Vercel project settings.
Configure with GitHub Actions to build and deploy from the main branch.
# Development server
npm run dev
# Build for production
npm run build
# Preview production build
npm run previewFeel free to customize this portfolio for your own use.
MIT