A personal blog and portfolio platform built with React + FastAPI.
| Layer | Technology |
|---|---|
| Frontend | React 18, TypeScript, Vite, Tailwind CSS, Framer Motion |
| Backend | FastAPI, Python 3.12, asyncpg, Pydantic v2 |
| Database | PostgreSQL |
| Storage | Local filesystem |
| Analytics | Umami |
| Resend | |
| Containerization | Docker / Docker Compose |
blog/
├── frontend/ # React + Vite SPA
├── backend/ # FastAPI REST API
└── docker-compose.yml
The easiest way to run backend + analytics together is Docker Compose.
Prerequisites: Docker, Docker Compose, Node 18+
cp backend/.env.example backend/.env
# Fill in all required variables in backend/.envdocker compose up| Service | URL |
|---|---|
| Backend API | http://localhost:8000 |
| API Docs (Swagger) | http://localhost:8000/docs |
| Umami Analytics | http://localhost:3000 |
cd frontend
cp .env.example .env
npm install
npm run devFrontend runs at http://localhost:5173.
See the individual READMEs for full details:
After starting the backend, create the admin user:
cd backend
python scripts/create_admin.pyThen log in at http://localhost:5173/admin.
# Frontend (ESLint — zero warnings tolerance)
cd frontend && npm run lint
# Backend (Ruff — linter + formatter)
cd backend && ruff format --check .
cd backend && ruff format .
cd backend && ruff check --fix .Tip: Install backend dev dependencies first with
pip install -r backend/requirements-dev.txt.
# Frontend
cd frontend && npx vitest run
# Backend
(.venv) cd backend && python -m pytest