A modern, production-ready affiliate platform with multi-language support, performance optimization, and clean architecture.
Features β’ Architecture β’ Quick Start β’ Production β’ Development β’ Testing
- π Multi-Language Support: English (default), Italian, and Hebrew with automatic RTL layout
- π± Dynamic Currency: Support for multiple currencies (USD, EUR, ILS, GBP, CAD, AUD, JPY, CNY) with user preferences
- π SEO Optimized: Comprehensive hreflang tags, schema markup, sitemaps, and breadcrumbs
- β‘ High Performance: Static Site Generation (SSG) / Incremental Static Regeneration (ISR) with <3s load times and Lighthouse scores >90
- ποΈ Clean Architecture: Domain-driven design with clear separation of concerns and SOLID principles
- π§ͺ Test-First Development: Comprehensive testing infrastructure
- π Secure: Affiliate link generation, GDPR compliance, secure credential management
- π± Responsive Design: Mobile-first approach with Tailwind CSS
- π¨ Headless CMS: Strapi integration with full content management capabilities
Docker - Install for your platform:
- macOS: Docker Desktop or
brew install colima docker docker-compose docker-buildx - Linux:
curl -fsSL https://get.docker.com -o get-docker.sh && sudo sh get-docker.sh - Windows: Download Docker Desktop
mkcert - For HTTPS development certificates:
- macOS:
brew install mkcert - Linux:
sudo apt install mkcertor build from source - Windows:
choco install mkcertor download from releases
# Clone and setup
git clone https://github.com/rdrkr/affilibuster.git
cd affilibuster
# Complete first-time setup (installs tools, dependencies, certificates, and hooks)
make setup
# Start all services
make devβ±οΈ Wait ~30 seconds for all services to be ready.
| Service | URL | Notes |
|---|---|---|
| TheGreenBrother | https://localhost:3001 | Next.js Affiliate Site |
| Backend API | https://localhost:8000 | FastAPI REST API |
| API Docs | https://localhost:8000/docs | Swagger UI |
| CMS Admin | https://localhost:1337/admin | Strapi admin panel |
Note: All services run on HTTPS with mkcert certificates. Your browser should trust them automatically after running
mkcert -install.
make stopAffilibuster follows a single source of truth architecture where all content originates from Strapi CMS and flows through the backend to the TheGreenBrother frontend:
TheGreenBrother (Next.js 16, React 19, TypeScript)
β (API calls only)
Backend API (FastAPI, Python 3.13)
β (syncs from)
Strapi CMS (Headless, PostgreSQL)Key Rule: TheGreenBrother NEVER talks to Strapi directly. All content flows through the backend API.
affilibuster/ # Monorepo root
βββ backend/ # FastAPI backend
β βββ src/affilibuster_backend/
β β βββ config/ # Configuration & settings
β β βββ domain/ # Business logic (Clean Architecture)
β β β βββ entities/ # Domain models
β β β βββ repositories/ # Repository interfaces
β β β βββ services/ # Domain services
β β β βββ use_cases/ # Business logic
β β βββ infrastructure/ # External integrations
β β β βββ api/ # FastAPI routes, models, middleware
β β β β βββ routes/ # API endpoints
β β β βββ cache/ # Redis implementation
β β β βββ cms/ # Strapi HTTP client
β β β βββ database/ # SQLAlchemy setup & models
β β β β βββ alembic/ # Database migrations
β β β β βββ models/ # Database models
β β β β βββ repositories/ # Repository implementations
β β β βββ email/ # Email service integration
β β β βββ middleware/ # Custom middleware
β β β βββ dependencies.py # Dependency injection
β β βββ main.py # Application entry point
β βββ tests/
β βββ fixtures/ # Test data and helpers
β βββ integration/ # Integration tests
β β βββ infrastructure/ # Infrastructure integration tests
β βββ unit/ # Unit tests
β βββ config/ # Configuration tests
β βββ domain/ # Domain layer tests
β βββ infrastructure/ # Infrastructure layer tests
β
βββ the-green-brother/ # Next.js 16 affiliate site (TheGreenBrother)
β βββ src/
β β βββ app/ # Next.js App Router pages
β β βββ components/ # React components
β β β βββ about/ # About page components
β β β βββ call-to-actions/ # CTA components (Newsletter, etc.)
β β β βββ elements/ # Shared UI elements (Header, Label, TextBlock, etc.)
β β β βββ footer/ # Footer components
β β β βββ homepage/ # Homepage composition (HomeSections)
β β β βββ layout/ # Layout components
β β β βββ menus/ # Menu components (Language, Search, Theme)
β β β βββ navigation/ # Navigation (Navbar, MobileMenu)
β β β βββ sections/ # Reusable section components (Hero, FeaturedProducts, etc.)
β β βββ lib/ # Utilities, API clients, hooks (feature-based subdirs)
β β βββ i18n/ # Internationalization configuration
β β βββ styles/ # Global styles and theme
β βββ Dockerfile # TheGreenBrother dev server container
β βββ Dockerfile.prod # Production 3-stage build (standalone Next.js)
β βββ Dockerfile.test-runner # Lightweight Playwright test container
β
βββ cms/ # Strapi 5 headless CMS
β βββ config/ # Strapi configuration files
β βββ src/
β β βββ api/ # Content types (25+ types including:)
β β β βββ about/ # About page content
β β β βββ author/ # Blog authors
β β β βββ blog/ # Blog listing page
β β β βββ blog-post/ # Blog posts
β β β βββ blog-post-tag/ # Blog post tags
β β β βββ contact-us/ # Contact page content
β β β βββ currency/ # Currency configuration
β β β βββ footer/ # Footer content
β β β βββ homepage/ # Homepage content
β β β βββ navigation/ # Navigation structure
β β β βββ product/ # Product content type
β β β βββ product-category/ # Product categories
β β β βββ product-tag/ # Product tags
β β β βββ [+11 more types] # FAQ, Privacy, Terms, Error pages, etc.
β β βββ components/ # UI component schemas
β β βββ plugins/ # Custom Strapi plugins
β β β βββ strapi-plugin-nested-populator/ # Deep nested content population via REST API
β β β βββ strapi-plugin-relation-filter/ # Admin panel relation dropdown filtering
β β βββ index.ts # Strapi entry point
β β βββ utils/ # Utility functions
β βββ scripts/ # Build and utility scripts
β
βββ contracts/ # OpenAPI specifications (source of truth)
β βββ template.openapi.yaml # Backend API specification (version controlled)
β # Note: strapi.openapi.yaml and affilibuster.openapi.yaml are
β # generated at runtime by CMS and Backend respectively
β
βββ specs/ # Feature specifications & designs
βββ scripts/ # Development & deployment scripts
β βββ audit.sh # Security audit
β βββ backup-db.sh # Production PostgreSQL backup (30-day retention)
β βββ build.sh # Build all services
β βββ clean.sh # Clean build artifacts
β βββ format.sh # Format code
β βββ lint.sh # Lint code
β βββ setup.sh # Development setup
β βββ test.sh # Run tests
β
βββ .github/
β βββ workflows/
β βββ ci.yaml # CI pipeline (tests, lint, type-check)
β βββ deploy.yaml # CD pipeline (SSH deploy to Hetzner VPS)
β
βββ .specify/ # SpecKit project configuration
β βββ memory/constitution.md # Project constitution & principles
β βββ scripts/ # SpecKit automation scripts
β βββ templates/ # Documentation templates
β
βββ .claude/ # Claude AI configuration
β βββ commands/ # Custom AI commands
β
βββ data/ # Static data files
β βββ assets/ # Uploaded media assets
β βββ backend-seed.jsonl # Backend seed data
β βββ configuration/ # Configuration exports
β βββ entities/ # Entity data exports
β βββ links/ # Link data
β
βββ docs/ # Project documentation
β βββ eco-friendly-affiliate-website-prd.md
β βββ specs/
β
βββ Caddyfile # Production reverse proxy (auto SSL, routing, security headers)
βββ Caddyfile.remote # Local proxy for remote-backend development
βββ docker-compose.yaml # Local development environment (all services)
βββ docker-compose.remote.yaml # Remote-backend development (local frontend β prod backend)
βββ docker-compose.prod.yaml # Production environment (Hetzner VPS)- TheGreenBrother: Next.js 16, React 19, TypeScript 5.7+, Tailwind CSS 4, next-intl
- Backend: FastAPI 0.120+, Python 3.13+, PostgreSQL 15+, Redis, Alembic
- CMS: Strapi 5+, PostgreSQL 15+, i18n plugin
- Infrastructure: Docker & Docker Compose, Caddy (production reverse proxy + auto SSL)
- Clean Architecture: Business logic isolated from framework dependencies
- SOLID Principles: Single responsibility, open/closed, Liskov substitution, interface segregation, dependency inversion
- Test-First Development: Tests written before implementation (TDD)
- API-First Design: OpenAPI specifications as source of truth
- Modular Architecture: Reusable components across affiliate sites
- Performance & SEO Standards: <3s load times, Lighthouse scores >90
- Strong Typing: Strict type safety with explicit annotations and generated model usage
Affilibuster implements Clean Architecture with strict dependency rules to ensure business logic remains isolated from external concerns:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Frameworks & Drivers β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β Next.js β β FastAPI β β Strapi β β
β β React β β PostgreSQL β β Redis β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Interface Adapters β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β Routes β β Controllers β βRepositories β β
β β Views β β Presenters β β Gateways β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Use Cases β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β Business β β Application β β Domain β β
β β Rules β β Services β β Logic β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Entities β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β Product β β User β β Language β β
β β Currency β β Locale β β Config β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββ- Core business objects and enterprise-wide business rules
- Pure domain models with no framework dependencies
- Examples:
Product,User,Language,Currencyentities
- Application-specific business rules
- Orchestrate data flow between entities and interface adapters
- Contain the application's use case logic
- Convert data from/to external formats
- Presenters, controllers, repositories, gateways
- Interface between use cases and frameworks
- Examples: FastAPI routes, React components, repository implementations
- UI frameworks, databases, external APIs
- All technical infrastructure details
- Examples: Next.js, FastAPI, PostgreSQL, Strapi, Redis
Critical Rule: Dependencies point inward only - outer layers depend on inner layers, never the reverse:
Frameworks β Interface Adapters β Use Cases β EntitiesThis ensures:
- Business logic isolation - no framework dependencies in domain layer
- Testability - inner layers can be tested independently
- Flexibility - frameworks can be replaced without affecting business logic
- Maintainability - clear separation of concerns
Affilibuster runs on a self-hosted Hetzner VPS with Docker, Caddy for automatic SSL, and GitHub Actions for continuous deployment.
Internet
β
βΌ
Caddy (ports 80/443) ββ automatic Let's Encrypt SSL
βββ thegreenbrother.com β the-green-brother:3000 (Next.js standalone)
βββ thegreenbrother.com/api/* β backend:8000 (FastAPI, /api prefix stripped)
βββ cms.thegreenbrother.com β strapi:1337 (Strapi CMS)
Internal Docker network (HTTP only):
βββ postgres:5432
βββ redis:6379
βββ strapi:1337
βββ backend:8000
βββ the-green-brother:3000All inter-service communication is plain HTTP inside Docker. Caddy terminates SSL at the edge.
| File | Purpose |
|---|---|
docker-compose.prod.yaml |
Caddy, resource limits, restart policies, log rotation |
docker-compose.remote.yaml |
Local frontend + Caddy proxy β production backend |
Caddyfile |
Auto SSL, path-based routing, security headers |
Caddyfile.remote |
Local proxy: /api/* β prod, rest β local frontend |
cms/Dockerfile.prod |
Multi-stage Strapi (node:22-alpine, non-root) |
backend/Dockerfile.prod |
Multi-stage FastAPI (python:3.13-slim, non-root) |
backend/docker-entrypoint.prod.sh |
Wait for PG, alembic migrate, uvicorn |
the-green-brother/Dockerfile.prod |
3-stage Next.js standalone (non-root) |
.env.prod.example |
Production env template |
.github/workflows/deploy.yaml |
CD: SSH deploy, health checks, image prune |
scripts/setup-vps.sh |
Server hardening + Docker installation |
scripts/generate-env.sh |
Interactive .env.prod generator with auto secrets |
scripts/backup-db.sh |
Daily pg_dump, 30-day retention |
# On the VPS:
# 1. Setup environment (install Docker, etc.)
make setup-vps
# 2. Generate production secrets
make generate-env
# 3. Build and Start
make build-prod
make start-prod
# View logs
make logs-prod
# Stop services
make stop-prod
# Check service health
curl -sf https://thegreenbrother.com
curl -sf https://thegreenbrother.com/api/v1/health
curl -sf https://cms.thegreenbrother.com/api/healthPushing to main triggers:
- CI (
.github/workflows/ci.yaml): Tests, lint, type-check - CD (
.github/workflows/deploy.yaml): SSH into VPS, pull, build, deploy, health check, prune old images
Required GitHub secrets: VPS_HOST, VPS_USER, VPS_SSH_KEY, VPS_SSH_KNOWN_HOSTS.
- Daily DB backups:
scripts/backup-db.shvia cron at 3 AM UTC to Hetzner Cloud Volume (/mnt/backups/) - 30-day retention with automatic cleanup
- Hetzner server snapshots: Built-in full server backup
Affilibuster uses Uptime Kuma for self-hosted monitoring of all services.
- URL:
https://uptime.thegreenbrother.com - Configuration: Defined in code at
uptime-kuma-monitors.yaml - Auto-Provisioning: Monitors are automatically synced on every deployment via
scripts/provision_uptime.py.
- Edit
uptime-kuma-monitors.yamlin the root directory. - Commit and push your changes.
- The deployment pipeline will automatically update Uptime Kuma.
If you need to sync monitors manually without a full deployment:
# SSH into VPS
make ssh
# Run provisioning script
docker compose -f docker-compose.prod.yaml exec backend /app/.venv/bin/python scripts/provision_uptime.py# Show all available commands
make help
# Complete first-time setup
make setup
# Start all services (Docker + TheGreenBrother + Backend + CMS)
make dev
# Start only Docker services
make start
# Stop services
make stop
# Restart services
make restart
# View logs
make logs # All services
make logs-backend # Backend only
make logs-the-green-brother # TheGreenBrother only
# Check service status
make ps
make healthDevelop the frontend locally while using the production backend and CMS. A local Caddy proxy mirrors
the production routing pattern (/api/* β production backend), eliminating CORS issues.
# Start frontend against production backend & CMS
make start-remote
# Start with log tailing
make dev-remote
# View logs
make logs-remote
# Stop
make stop-remote
# Rebuild frontend image
make build-remoteHow it works: A local Caddy reverse proxy listens on localhost:3000 and routes /api/* requests to
thegreenbrother.com (production), while all other requests go to the local Next.js dev server with hot reload.
| File | Purpose |
|---|---|
docker-compose.remote.yaml |
Frontend + local Caddy proxy |
Caddyfile.remote |
Routes /api/* to prod, rest to local frontend |
- Environment Setup:
make setuphandles all prerequisites - Start Development:
make devstarts everything you need - Code Changes: Edit files in your preferred editor
- Testing: Run
make testto ensure quality - Code Quality: Use
make lintandmake formatto maintain standards - Deployment: Use
make buildfor production builds
Affilibuster uses Alembic for database schema migrations in the backend.
# Run migrations (apply pending migrations)
cd backend
uv run task migrate
# Create a new migration (auto-generate from model changes)
uv run task migrate-create "description of changes"
# View migration history
uv run task migrate-history
# Check current migration version
uv run task migrate-current
# Rollback one migration
uv run task migrate-downgrade- Models First: Define your SQLAlchemy models in
backend/src/affilibuster_backend/infrastructure/database/models/ - Auto-Generate: Alembic detects model changes and generates migration files
- Version Control: Migration files in
backend/alembic/versions/are committed to git - Docker Integration: Migrations run automatically on
make devviadocker-entrypoint.sh
- Migration Config:
backend/alembic.ini(required by Alembic) - Task Commands: Defined in
backend/pyproject.tomlunder[tool.taskipy.tasks] - Database URL: Loaded from
affilibuster_backend.config.settingsinalembic/env.py
- Never delete migrations - they're part of your schema history
- Always test migrations before committing (up and down)
- Review auto-generated migrations - Alembic may miss some changes
- Docker handles migrations - no manual
migrateneeded when usingmake dev
Affilibuster tests are divided into two distinct categories with different purposes:
- Purpose: Verify that features work correctly
- NO explicit timeouts - tests use global timeout (5 minutes)
- NO
waitForTimeout()calls - wait for elements/states, not arbitrary time - Tests should pass regardless of system load
- Focus on "Does it work?" not "Is it fast?"
- Purpose: Verify performance requirements are met
- Production builds only - skip on development builds
- Strict timing thresholds - defined in
tests/config/performance-thresholds.ts - Network throttling - simulate real-world conditions (3G)
- Focus on "Is it fast enough?"
Affilibuster uses a dedicated test-runner container for all Playwright E2E and performance tests, providing:
- Lightweight Container: Uses
Dockerfile.test-runner- only Playwright dependencies, no Next.js build - Resource Isolation: Tests run in a separate container from the dev server, eliminating resource contention
- Dedicated Resources: 4 CPU cores and 4GB RAM allocated specifically for test execution
- Improved Stability: Webkit tests no longer timeout due to system load from dev server hot-reload/compilation
- Better Performance: Tests can run in parallel without degrading the dev server
- Persistent Browser Cache: Playwright browsers are installed once and cached across test runs
Architecture:
βββββββββββββββββββ βββββββββββββββββββββ βββββββββββββββ
β test-runner ββββββΆβ the-green-brother ββββββΆβ backend β
β (Playwright) β β (Dev Server) β β (FastAPI) β
β 4 CPU / 4GB β β 1 CPU β β β
βββββββββββββββββββ βββββββββββββββββββββ βββββββββββββββTests execute in test-runner, hitting the the-green-brother dev server, which calls the backend API.
# Run all tests with coverage
make test
# Run tests in parallel (faster)
make test-parallel
# Individual modules
make test-backend # Backend (pytest)
make test-the-green-brother # TheGreenBrother (Jest)
make test-cms # CMS (when custom code added)
# E2E tests with specific browser
make test-the-green-brother-integration BROWSER=webkit
make test-the-green-brother-integration BROWSER=chromium
make test-the-green-brother-integration BROWSER=firefox
# Performance tests
make test-performance BROWSER=chromium
# Coverage reports
make coverage-merge # Merge all module reports
make coverage-view # Open merged HTML report# Check code style
make lint # Check all code style
make lint-fix # Auto-fix linting issues
# Format code
make format # Format all code
make format-check # Check formatting without changes
# Specific modules
make lint-python # Check Python code
make lint-typescript # Check TypeScript/JavaScript
make lint-openapi # Validate OpenAPI specs- Python: Ruff (linter/formatter), MyPy (type checker)
- TypeScript: ESLint (linter), Prettier (formatter)
- OpenAPI: Redocly (validation)
- Pre-commit hooks: Automatically installed with
make setup
Affilibuster uses a layered OpenAPI architecture with auto-generated types for type safety across all services.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β OpenAPI Specifications β
ββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββ€
β Layer 1: Strapi Content β Layer 2: Backend Services β
ββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββ€
β β’ Product β β’ Currencies API β
β β’ Homepage β β’ Preferences API β
β β’ Navigation β β’ Language Detection β
β β’ Pages β β’ Content Proxy Endpoints β
β (i18n, rich fields) β (extends Strapi types) β
ββββββββββββββββββββββββββββ΄ββββββββββββββββββββββββββββββββ
β β
β references via $ref β
βββββββββββββββββββββββββββββββ
β
ββββββββββββββ΄βββββββββββββ
β β
βΌ βΌ
Code Generators Code Generators
@hey-api/openapi-ts datamodel-code-generator
β β
βΌ βΌ
TypeScript Types Python Pydantic Models
generated/ backend/src/
infrastructure/api/generated/- Template (Backend API):
contracts/template.openapi.yaml- Defines all backend endpoints and types - Strapi Content:
contracts/strapi.openapi.yaml- Auto-generated content schemas (generated by CMS during startup) - Merged Specification:
contracts/affilibuster.openapi.yaml- Merged spec (generated by Backend during startup) - Backend references Strapi via external
$reffor clean separation of concerns
- Swagger UI: https://localhost:8000/docs
- ReDoc: https://localhost:8000/redoc
- OpenAPI JSON: https://localhost:8000/openapi.json
# Validate OpenAPI specifications
make lint-openapi
# Regenerate Strapi OpenAPI (when content types change)
cd cms && npm run openapi:generateAll user-facing content originates from Strapi CMS, ensuring consistency and scalability.
- Collection Types: Products, languages, currencies, locales
- Single Types: Navigation, footer, homepage, about, contact, legal pages
- Add new locale in Strapi admin panel
- Update
backend/scripts/seed.pywith new language seeding data - Run
make seedor let it happen automatically on startup - Zero backend code changes required
Affilibuster includes two custom Strapi plugins managed in-house under cms/src/plugins/:
Automatically populates deeply nested content structures in Strapi REST API responses. When a query includes
customPopulate=nested, the plugin intercepts the request via a Document Service middleware and recursively builds a
full populate tree for all components, dynamic zones, relations, and media fields. Supports configurable maximum depth
(defaultDepth), field ignore lists, and automatic circular reference prevention. Creator fields (admin::user) are
skipped by default to reduce response size.
Filters relation dropdowns in the Strapi admin panel based on pluginOptions configuration defined in content type
schemas. When editing content in the admin panel, relation fields normally show all available entries. This plugin
overrides the findAvailable handler on the content-manager's relations controller to automatically apply filters
defined in each attribute's pluginOptions, restricting which related entries appear in the dropdown.
- Page load <3s on 3G connections
- Lighthouse scores >90
- LCP <2.5s, FCP <1.8s, TTFB <600ms
- Comprehensive hreflang tags for multi-language support
- Schema markup (Product, BreadcrumbList, Organization)
- Sitemaps for each language
- Meta tags, OG tags, image optimization
- Critical CSS inlined, pagination instead of infinite scroll
Affilibuster is built on the shoulders of giants. We are deeply grateful to the open-source community and the maintainers of the following projects:
- Next.js (MIT) - React framework for production
- React (MIT) - JavaScript library for building user interfaces
- FastAPI (MIT) - Modern Python web framework
- Strapi (MIT) - Headless CMS
- Python (PSF) - Programming language
- Node.js (MIT) - JavaScript runtime
- PostgreSQL (PostgreSQL License) - Advanced open-source database
- Redis (BSD-3-Clause) - In-memory data structure store
- Docker (Apache 2.0) - Containerization platform
- Caddy (Apache 2.0) - Production reverse proxy with automatic HTTPS
- uvicorn (bsd-3-clause) - asgi server
- SQLAlchemy (MIT) - Python SQL toolkit and ORM
- Alembic (MIT) - Database migration tool
- Pydantic (MIT) - Data validation using Python type annotations
- **asyncpg ** (Apache 2.0) - Fast PostgreSQL client library
- HTTPX (BSD-3-Clause) - HTTP client for Python
- **python-jose ** (MIT) - JavaScript Object Signing and Encryption ( JOSE) for Python
- Passlib (BSD) - Password hashing library
- **TypeScript ** (Apache 2.0) - Typed superset of JavaScript
- **Tailwind CSS ** (MIT) - Utility-first CSS framework
- next-intl (MIT) - Internationalization for Next.js
- next-seo (MIT) - SEO plugin for Next.js
- pytest (MIT) - Python testing framework
- Jest (MIT) - JavaScript testing framework
- Playwright (Apache 2.0) - End-to-end testing framework
- **Testing Library ** (MIT) - Testing utilities for React
- Ruff (MIT) - Extremely fast Python linter and formatter
- ESLint (MIT) - JavaScript/TypeScript linter
- Prettier (MIT) - Code formatter
- MyPy (MIT) - Static type checker for Python
- uv (MIT/Apache 2.0) - Extremely fast Python package manager
- pre-commit (MIT) - Git hooks framework
- @hey-api/openapi-ts (MIT) - OpenAPI TypeScript code generator
- **datamodel-code-generator ** (MIT) - Pydantic model generator from OpenAPI
- Redocly CLI (MIT) - OpenAPI validation and bundling
- **actions/checkout ** (MIT) - Checkout repository code
- **actions/setup-python ** (MIT) - Set up Python environment
- **actions/setup-node ** (MIT) - Set up Node.js environment
- **astral-sh/setup-uv ** (MIT) - Set up uv package manager
- **docker/setup-buildx-action ** (Apache 2.0) - Set up Docker Buildx
- **actions/upload-artifact ** (MIT) - Upload build artifacts
- actions/cache (MIT) - Cache dependencies
- **appleboy/ssh-action ** (MIT) - SSH remote commands for deployment
For a complete list of all dependencies, please see:
- Backend:
backend/pyproject.toml - TheGreenBrother:
the-green-brother/package.json - CMS:
cms/package.json
We are grateful to all the maintainers and contributors of these projects. Without their dedication and hard work, Affilibuster would not be possible. Thank you! π
Made with β€οΈ by the Affilibuster Team
