Personal portfolio website for Houssam Belkasaoui (Not1Sam) — Software Engineer from Morocco.
This project uses a custom restrictive license. You may view and study the source code for personal, non-commercial, and educational purposes only. Commercial use, academic submissions, redistribution, and derivative works are strictly prohibited. See LICENSE.md for full details.
| Layer | Technology |
|---|---|
| Frontend | React 18 + Vite + TypeScript + Tailwind CSS |
| Backend | FastAPI + SQLAlchemy (async) + SQLite |
| Auth | JWT (python-jose) + password-only admin login |
| Deployment | GitHub Pages (frontend) + Docker/Portainer (backend) |
| HTTPS | Cloudflare Tunnel |
Not1Sam.github.io/
├── frontend/ # React SPA (Vite)
│ ├── src/
│ │ ├── components/ # Reusable UI components
│ │ ├── pages/ # Route pages
│ │ └── lib/ # Utilities, types, constants
│ └── public/ # Static assets
├── backend/ # FastAPI server
│ └── app/
│ ├── routers/ # API endpoints
│ ├── models/ # SQLAlchemy models
│ ├── schemas/ # Pydantic models
│ └── services/ # Auth, business logic
├── docker-compose.yml # Production deployment
└── .github/workflows/ # CI/CD pipelines
cd frontend
npm install
npm run dev
# Opens at http://localhost:5173cd backend
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
# Edit .env with your settings
uvicorn app.main:app --reload --port 8000
# API docs at http://localhost:8000/docs| Variable | Description | Default |
|---|---|---|
SECRET_KEY |
JWT signing key | (required) |
ADMIN_PASSWORD |
Admin login password | (required) |
ADMIN_USERNAME |
Admin username | admin |
DATABASE_URL |
SQLite connection string | sqlite+aiosqlite:///./data/portfolio.db |
ALLOWED_ORIGINS |
CORS origins (comma-separated) | http://localhost:5173 |
Pushes to main branch auto-deploy to https://not1sam.github.io via GitHub Actions.
-
Build and push the Docker image (handled by CI):
# CI builds: ghcr.io/not1sam/not1sam-backend:<version> -
In Portainer, create a stack with the root
docker-compose.ymland set environment variables:SECRET_KEY— random string for JWT signingADMIN_PASSWORD— your admin passwordTUNNEL_TOKEN— Cloudflare Tunnel token
-
The backend is accessible via:
- HTTP:
http://84.8.221.29:8001 - HTTPS:
https://x7k9m2.bungus.fyi(Cloudflare Tunnel)
- HTTP:
| Endpoint | Method | Auth | Description |
|---|---|---|---|
/api/auth/login |
POST | Public | Admin login |
/api/auth/me |
GET | Admin | Get current admin |
/api/blog |
GET | Public | List blog posts |
/api/blog |
POST | Admin | Create blog post |
/api/blog/{id} |
PUT | Admin | Update blog post |
/api/blog/{id} |
DELETE | Admin | Delete blog post |
/api/certificates |
GET | Public | List certificates |
/api/certificates |
POST | Admin | Upload certificate |
/api/contact |
POST | Public | Submit contact message |
/api/contact |
GET | Admin | List messages |
/api/cv |
GET | Public | Get current CV |
/api/cv |
POST | Admin | Upload CV (PDF) |
/api/cv |
DELETE | Admin | Delete CV |
/api/health |
GET | Public | Health check |
| Route | Description |
|---|---|
/ |
Home — Hero, GitHub stats, project overview |
/lab |
Self-hosted homelab infrastructure |
/projects |
Live GitHub repositories |
/stack |
Tech stack and skills |
/blog |
Blog posts from the API |
/certificates |
Professional certifications |
/cv |
CV with PDF viewer and skills view |
/contact |
Contact form |
/admin |
Admin panel (password-only auth) |
/privacy |
Privacy Policy |
/terms |
Terms of Service |
/cookies |
Cookie Policy |
/disclaimer |
Disclaimer |
Custom restrictive license — no commercial, academic, or gainful use allowed. See LICENSE.md.