# Bug Bounty Platform A production-ready, enterprise-grade bug bounty platform built with modern web technologies. This platform enables companies to run coordinated vulnerability disclosure programs, allowing security researchers to submit findings and receive rewards. **Live Demo:** [bugbounty.carterperez-dev.com](https://bugbounty.carterperez-dev.com) **API Documentation:** [bugbounty.carterperez-dev.com/api/docs](https://bugbounty.carterperez-dev.com/api/docs) --- ## Overview This project demonstrates enterprise-level software architecture with: - Async-first FastAPI backend with strict type safety - Modern React frontend with TypeScript - Production-ready security (JWT with refresh token rotation, Argon2id hashing) - Advanced design patterns (Dependency Injection, Repository Pattern, Layered Architecture) - Docker containerization with multi-stage builds - Database migrations with Alembic - Comprehensive testing and linting infrastructure **Part of:** [Cybersecurity-Projects Repository](https://github.com/CarterPerez-dev/Cybersecurity-Projects) (60+ security-focused projects) --- ## Features ### Security Researcher Features - User registration and authentication - Browse public bug bounty programs - Submit vulnerability reports with markdown support - Track report status and receive updates - Earn reputation and rewards ### Company Features - Create and manage bug bounty programs - Define program scope (assets, reward tiers, SLA) - Triage incoming vulnerability reports - Assess severity using CVSS scoring - Award bounties to researchers - Communicate via comments and attachments ### Platform Features - Role-based access control (Researcher, Company, Admin) - JWT authentication with refresh token rotation - Token versioning for instant session invalidation - Multi-device session management - Rate limiting on all endpoints - Comprehensive audit logging - OpenAPI/Swagger documentation --- ## Tech Stack ### Backend - **FastAPI** 0.123.0+ - Modern async Python web framework - **Python** 3.12+ - Strict typing with mypy - **PostgreSQL** 18 - Primary database with asyncpg driver - **Redis** 7 - Caching and session storage - **SQLAlchemy** 2.0+ - Async ORM - **Alembic** - Database migrations - **Pydantic** v2 - Data validation and settings - **JWT** - Token-based authentication with rotation - **Argon2id** - Password hashing via pwdlib ### Frontend - **React** 19.2+ - UI library - **TypeScript** 5.9 - Static typing - **Vite** 7 - Build tool with Rolldown - **React Router** 7.1 - File-based routing - **TanStack Query** v5 - Server state management - **Zustand** - Client state management - **Axios** - HTTP client - **SASS** - CSS preprocessing ### Infrastructure - **Docker** + **Docker Compose** - Containerization - **Nginx** - Reverse proxy and static file serving - **Cloudflare Tunnel** - Zero-config deployment (optional) - **Gunicorn** + **Uvicorn** - Production ASGI server ### Development Tools - **Ruff** - Python linting and formatting - **Biome** - JavaScript/TypeScript linting - **MyPy** - Static type checking - **Pytest** - Testing framework - **Just** - Task runner (30+ commands) - **Pre-commit hooks** - Automated quality checks --- ## Getting Started You have two options: ### Option 1: Use the Live API (Easiest) The platform is already deployed and running! You can: - Use the web interface: [bugbounty.carterperez-dev.com](https://bugbounty.carterperez-dev.com) - Access the API directly: [bugbounty.carterperez-dev.com/api/](https://bugbounty.carterperez-dev.com/api/) - View API documentation: [bugbounty.carterperez-dev.com/api/docs](https://bugbounty.carterperez-dev.com/api/docs) You can build your own client application using the deployed API endpoints. See the OpenAPI documentation for available endpoints and schemas. ### Option 2: Run It Yourself If you want to run the entire platform locally or deploy your own instance: #### Prerequisites - [Docker](https://docs.docker.com/get-docker/) and [Docker Compose](https://docs.docker.com/compose/install/) - [Just](https://github.com/casey/just) (task runner) - `cargo install just` or see [installation guide](https://github.com/casey/just#installation) - Git #### Quick Start 1. **Clone the repository:** ```bash git clone https://github.com/CarterPerez-dev/Cybersecurity-Projects.git cd Cybersecurity-Projects/PROJECTS/bug-bounty-platform ``` 2. **Configure environment variables:** ```bash cp .env.example .env ``` Edit `.env` and update these critical values: - `SECRET_KEY` - Generate a secure random string (minimum 32 characters) - `POSTGRES_PASSWORD` - Set a strong database password - `ADMIN_EMAIL` - (Optional) First user with this email becomes admin - `CORS_ORIGINS` - Update if using different ports 3. **Start the platform (development mode with hot reload):** ```bash just dev-up ``` Or in production mode: ```bash just up ``` 4. **Access the platform:** - **Frontend:** http://localhost:8420 - **API:** http://localhost:8420/api - **API Docs:** http://localhost:8420/api/docs - **Backend (direct):** http://localhost:5420 - **Frontend Dev Server:** http://localhost:3420 (dev mode only) 5. **Apply database migrations:** ```bash just migrate head ``` 6. **Create your first account:** - Navigate to http://localhost:8420 - Click "Register" - If you set `ADMIN_EMAIL` in `.env`, registering with that email grants admin privileges #### Common Commands The `justfile` provides 30+ commands for development: ```bash just # List all available commands # Development just dev-up # Start in development mode (hot reload) just dev-down # Stop development containers just dev-logs backend # View backend logs just dev-shell backend # Open shell in backend container # Production just up # Start in production mode just down # Stop production containers just build # Build all containers just rebuild # Rebuild without cache # Database just migrate head # Apply all migrations just migration "message" # Create new migration just rollback # Rollback last migration just db-current # Show current migration # Linting & Type Checking just lint # Run ruff + pylint just ruff-fix # Auto-fix linting issues just mypy # Type check with mypy just biome-fix # Fix frontend linting issues just typecheck # Run all type checks # Testing just test # Run all tests just test-cov # Run tests with coverage report # CI just ci # Run full CI pipeline (lint + typecheck + test) ``` #### Project Structure ``` bug-bounty-platform/ ├── backend/ # FastAPI backend (~7,000 lines) │ ├── src/ │ │ ├── app/ │ │ │ ├── core/ # Base classes, database, security, constants and enums, etc. │ │ │ ├── user/ # User domain │ │ │ ├── auth/ # Authentication │ │ │ ├── program/ # Bug bounty programs │ │ │ ├── report/ # Vulnerability reports │ │ │ └── admin/ # Admin functionality │ │ └── config.py # configuration values │ │ └── factory.py # essentially the 'main.py' file │ │ └── __main__.py # Where the run command lives │ ├── alembic/ # Database migrations │ ├── tests/ # Unit and integration tests │ └── pyproject.toml # Python dependencies │ ├── frontend/ # React + TypeScript frontend │ ├── src/ │ │ ├── routes/ # Pages │ │ ├── api/ # API client and hooks │ │ ├── components/ # Reusable components │ │ ├── styles/ # SCSS global values │ │ └── core/ # App configuration, zustand stores (ui state management), api configuration │ └── package.json │ ├── infra/ # Docker and Nginx configs │ ├── nginx/ │ └── docker/ │ ├── learn/ # Educational documentation (see below) ├── compose.yml # Production Docker Compose ├── dev.compose.yml # Development Docker Compose ├── justfile # Task runner commands └── .env.example # Environment variables template ``` --- ## Configuration ### Environment Variables All configuration is done via `.env` file. Key variables: | Variable | Description | Default | |----------|-------------|---------| | `NGINX_HOST_PORT` | External port for Nginx | 8420 | | `BACKEND_HOST_PORT` | External port for backend API | 5420 | | `FRONTEND_HOST_PORT` | External port for frontend dev server | 3420 | | `POSTGRES_HOST_PORT` | External port for PostgreSQL | 4420 | | `REDIS_HOST_PORT` | External port for Redis | 6420 | | `SECRET_KEY` | JWT signing key (min 32 chars) | **MUST CHANGE** | | `POSTGRES_PASSWORD` | Database password | **MUST CHANGE** | | `ADMIN_EMAIL` | Auto-promote this email to admin | (empty) | | `ENVIRONMENT` | dev/staging/production | development | | `ACCESS_TOKEN_EXPIRE_MINUTES` | JWT access token lifetime | 15 | | `REFRESH_TOKEN_EXPIRE_DAYS` | Refresh token lifetime | 7 | | `CORS_ORIGINS` | Allowed origins for CORS | `["*"]` (all origins) | See `.env.example` for all available options. ### Port Configuration If the default ports conflict with other services, update these in `.env`: ```bash NGINX_HOST_PORT=8420 # Change to any available port BACKEND_HOST_PORT=5420 # Change to any available port FRONTEND_HOST_PORT=3420 # Change to any available port POSTGRES_HOST_PORT=4420 # Change to any available port REDIS_HOST_PORT=6420 # Change to any available port ``` ### CORS Configuration The API is configured to accept requests from **all origins** by default: ```bash CORS_ORIGINS=["*"] # Allows all origins (public API) ``` If you need to restrict access to specific origins: ```bash CORS_ORIGINS=["https://yourdomain.com","https://app.yourdomain.com"] ``` --- ## Deployment ### Option 1: Cloudflare Tunnel (Recommended for beginners) No port forwarding or reverse proxy configuration needed! 1. Create a Cloudflare account and add your domain 2. Go to Zero Trust Dashboard > Access > Tunnels 3. Create a new tunnel, name it, and copy the token 4. Add the token to `.env`: ```bash CLOUDFLARE_TUNNEL_TOKEN=your-token-here ``` 5. Configure public hostname in Cloudflare: - Public hostname: `yourdomain.com` - Service: `http://nginx:80` 6. Start the platform: ```bash just up ``` Your platform is now live at `https://yourdomain.com`! ### Option 2: Traditional Hosting (VPS) 1. Rent a VPS (DigitalOcean, AWS, Linode, etc.) 2. Install Docker and Docker Compose 3. Clone the repository and configure `.env` 4. Point your domain's A record to your VPS IP 5. Configure SSL (Let's Encrypt with Certbot) 6. Start the platform: ```bash just up ``` ### Option 3: Use the Existing Deployment Just use the API at `bugbounty.carterperez-dev.com/api/` - no deployment needed! --- ## Learning Resources This project includes comprehensive educational documentation in the `learn/` directory: - **[ARCHITECTURE.md](learn/ARCHITECTURE.md)** - Deep dive into system architecture and design decisions - **[PATTERNS.md](learn/PATTERNS.md)** - Explanation of design patterns used (DI, Repository, etc.) - **[GETTING-STARTED.md](learn/GETTING-STARTED.md)** - Step-by-step tutorial for building similar applications - **[DATABASE.md](learn/DATABASE.md)** - Database schema design and migration strategies - **[SECURITY.md](learn/SECURITY.md)** - Security features and best practices explained These documents are designed to help you understand not just *what* the code does, but *why* it's architected this way and *how* you can apply these patterns to your own projects. --- ## API Documentation ### Interactive Documentation When running locally, access interactive API docs at: - **Swagger UI:** http://localhost:8420/api/docs - **ReDoc:** http://localhost:8420/api/redoc For the live deployment: - **Swagger UI:** [bugbounty.carterperez-dev.com/api/docs](https://bugbounty.carterperez-dev.com/api/docs) ### Key Endpoints **Authentication:** - `POST /api/v1/auth/register` - Create new account - `POST /api/v1/auth/login` - Login (returns access + refresh tokens) - `POST /api/v1/auth/refresh` - Refresh access token - `POST /api/v1/auth/logout` - Logout (invalidates refresh token) - `POST /api/v1/auth/logout-all` - Logout from all devices **Users:** - `GET /api/v1/users/me` - Get current user profile - `PATCH /api/v1/users/me` - Update profile - `GET /api/v1/users/{id}` - Get public user profile **Programs:** - `GET /api/v1/programs` - List all programs (paginated) - `GET /api/v1/programs/{slug}` - Get program details - `POST /api/v1/programs` - Create program (company only) - `PATCH /api/v1/programs/{slug}` - Update program (owner only) - `DELETE /api/v1/programs/{slug}` - Delete program (owner only) **Reports:** - `GET /api/v1/reports` - List your reports - `GET /api/v1/reports/{id}` - Get report details - `POST /api/v1/reports` - Submit vulnerability report - `PATCH /api/v1/reports/{id}` - Update report (various endpoints for status changes) **Admin:** - `GET /api/v1/admin/stats` - Platform statistics - `GET /api/v1/admin/users` - Manage users - `GET /api/v1/admin/programs` - Manage programs - `GET /api/v1/admin/reports` - Manage reports All endpoints return JSON and use standard HTTP status codes. --- ## Development ### Running Tests ```bash just test # Run all tests just test-cov # Run with coverage report ``` ### Type Checking ```bash just mypy # Check backend types just tsc # Check frontend types just typecheck # Check all types ``` ### Linting ```bash just lint # Backend: ruff + pylint just ruff-fix # Auto-fix backend linting issues just biome-fix # Auto-fix frontend linting issues just stylelint-fix # Auto-fix SCSS linting issues ``` ### Database Migrations ```bash just migration "Add user reputation field" # Create new migration just migrate head # Apply all migrations just rollback # Rollback last migration just db-history # View migration history ``` ### Docker Management ```bash just dev-shell backend # Open shell in backend container just dev-shell db # Open psql in database container just dev-logs nginx # View nginx logs just ps # List running containers ``` --- ## Architecture Highlights ### Dependency Injection FastAPI's dependency injection system is used extensively: ```python from fastapi import Depends from typing import Annotated CurrentUser = Annotated[User, Depends(get_current_user)] @router.get("/me") async def get_me(user: CurrentUser) -> UserSchema: return user ``` ### Repository Pattern All database operations go through repositories: ```python class UserRepository(BaseRepository[User]): async def find_by_email(self, email: str) -> User | None: stmt = select(User).where(User.email == email) result = await self.session.execute(stmt) return result.scalar_one_or_none() # Usage in service layer async def authenticate_user(email: str, password: str) -> User: user = await user_repo.find_by_email(email) if not user or not verify_password(password, user.password_hash): raise InvalidCredentialsError() return user ``` ### Type Safety Strict type checking with mypy and TypeScript: ```python from typing import Generic, TypeVar ModelT = TypeVar("ModelT", bound=Base) class BaseRepository(Generic[ModelT]): def __init__(self, session: AsyncSession, model: type[ModelT]) -> None: self.session = session self.model = model ``` ### Security Multiple layers of security: - JWT tokens with HS256 algorithm - Token versioning (instant invalidation on password change) - Refresh token rotation (prevents replay attacks) - Argon2id password hashing - Rate limiting (100 req/min default, 20 req/min for auth) - CORS protection - Input validation with Pydantic See [learn/SECURITY.md](learn/SECURITY.md) for detailed explanations. --- ## Contributing This is an educational project demonstrating production-level architecture. Feel free to: - Fork the repository and build upon it - Use it as a reference for your own projects - Submit issues if you find bugs - Share feedback and suggestions --- ## License This project is part of the [Cybersecurity-Projects](https://github.com/CarterPerez-dev/Cybersecurity-Projects) repository. © AngelaMos | 2026 --- ## Links - **Live Platform:** [bugbounty.carterperez-dev.com](https://bugbounty.carterperez-dev.com) - **API Docs:** [bugbounty.carterperez-dev.com/api/docs](https://bugbounty.carterperez-dev.com/api/docs) - **Parent Repository:** [Cybersecurity-Projects](https://github.com/CarterPerez-dev/Cybersecurity-Projects) --- ## Support For questions, issues, or discussions: 1. Check the [learn/](learn/) directory for detailed documentation 2. Review the API documentation at `/api/docs` 3. Open an issue in the parent repository 4. Email: [contact information if applicable] --- **Happy Hacking! 🔒**