Backend API server for Boards - AI creative toolkit with GraphQL, auth adapters, and generation workers
Project description
Boards Backend
Backend for the Boards open-source creative toolkit for AI-generated content.
Features
- ๐จ Multi-provider support (Replicate, Fal.ai, OpenAI, etc.)
- ๐ Pluggable architecture for generators and providers
- ๐ GraphQL API with Strawberry
- ๐๏ธ PostgreSQL with SQLAlchemy 2.0
- ๐ Migrations with Alembic (async) and timestamped filenames
- ๐ฅ Multi-tenant support with tenant isolation
- ๐ Pluggable authentication (Supabase, Clerk, Auth0, JWT)
- ๐ฆ Flexible storage backends (Local, S3, GCS, Supabase)
Installation
Minimal Install
The minimal installation includes core functionality with local filesystem storage only:
pip install weirdfingers-boards
Install with Specific Generators
Install only the generator providers you need:
# OpenAI generators (DALL-E 3, Whisper)
pip install weirdfingers-boards[generators-openai]
# Replicate generators (Flux Pro, Lipsync)
pip install weirdfingers-boards[generators-replicate]
# fal.ai generators (nano-banana)
pip install weirdfingers-boards[generators-fal]
# Multiple generators
pip install weirdfingers-boards[generators-openai,generators-replicate]
# All generators
pip install weirdfingers-boards[generators-all]
Install with Storage Backends
Add cloud storage providers as needed:
# S3 storage (AWS, MinIO, DigitalOcean Spaces)
pip install weirdfingers-boards[storage-s3]
# Supabase storage
pip install weirdfingers-boards[storage-supabase]
# Google Cloud Storage
pip install weirdfingers-boards[storage-gcs]
# All storage backends
pip install weirdfingers-boards[storage-all]
Full Installation
Install everything (all generators and storage backends):
pip install weirdfingers-boards[all]
Development Installation
For local development with all providers for type checking and testing:
# Clone the repository
git clone https://github.com/weirdfingers/boards.git
cd boards/packages/backend
# Install with dev dependencies (includes all providers)
uv sync
Configuration
Copy .env.example to .env and configure your settings:
cp .env.example .env
Key configuration options:
BOARDS_DATABASE_URL: PostgreSQL connection string (e.g. postgresql://user:pass@localhost:5433/db)BOARDS_REDIS_URL: Redis connection for job queueBOARDS_STORAGE_PROVIDER: Storage backend (local, s3, gcs, supabase)BOARDS_AUTH_PROVIDER: Authentication provider
Database Setup
1. Create the database
createdb boards_dev
2. Apply initial schema via Alembic
# Use Alembic to create all tables
uv run alembic upgrade head
Development
Quick Start
# Start the API server (after installation and configuration)
boards-server
# Run database migrations
boards-migrate upgrade head
# Start background workers
boards-worker
Development Server
# Using uvicorn directly
uvicorn boards.api.app:app --reload --port 8088
# Or using the module
python -m boards.api.app
Access the GraphQL playground
Open http://localhost:8088/graphql in your browser.
Database migrations
When you need to change the database schema, use Alembic.
# Create a new migration (autogenerate from models in boards.dbmodels)
uv run alembic revision -m "add feature" --autogenerate
# Apply latest migrations
uv run alembic upgrade head
# Roll back one revision
uv run alembic downgrade -1
๐ For detailed migration workflow, see docs and examples under apps/docs.
Project Structure
packages/backend/
โโโ alembic/ # Alembic migration scripts
โ โโโ versions/ # Timestamped revision files
โโโ alembic.ini # Alembic config
โโโ src/boards/
โ โโโ api/ # FastAPI application
โ โโโ dbmodels/ # SQLAlchemy ORM models (authoritative)
โ โโโ database/ # Connection helpers and compatibility shim
โ โโโ graphql/ # GraphQL schema and resolvers
โ โโโ providers/ # Provider implementations
โ โโโ generators/ # Generator implementations
โ โโโ storage/ # Storage backends
โ โโโ config.py # Configuration management
โโโ tests/
Community & Social
Join the Weirdfingers community:
- TikTok: https://www.tiktok.com/@weirdfingers
- X (Twitter): https://x.com/Weirdfingers
- YouTube: https://www.youtube.com/@Weirdfingers
- Discord: https://discord.gg/rvVuHyuPEx
- Instagram: https://www.instagram.com/weirdfingers/
Testing
Boards uses pytest for testing with both unit tests (mocked) and optional live API tests.
Running Tests
# Run all unit tests (excludes live API tests)
make test-backend
# Or using pytest directly
cd packages/backend
uv run pytest tests/
# Run with coverage
uv run pytest tests/ --cov=src/boards --cov-report=html
# Run specific test file
uv run pytest tests/generators/implementations/test_flux_pro.py -v
Unit Tests vs Live API Tests
Unit tests (default):
- Use mocked provider SDKs
- Fast and free
- Run automatically in CI/CD
- Located:
tests/**/test_*.py
Live API tests (opt-in only):
- Make real API calls to providers
- Consume API credits
- Never run by default
- Located:
tests/**/test_*_live.py
Running Live API Tests
Live tests verify real connectivity with provider APIs but cost money. They are excluded from default test runs.
# Set up API key
export BOARDS_GENERATOR_API_KEYS='{"REPLICATE_API_TOKEN": "r8_..."}'
# Run a specific generator's live test
uv run pytest tests/generators/implementations/test_flux_pro_live.py -v -m live_api
# Run all live tests for one provider
uv run pytest -m live_replicate -v
# Run all live tests (not recommended - expensive!)
uv run pytest -m live_api -v
For detailed information on live API testing, see:
Test Organization
tests/
โโโ conftest.py # Shared fixtures (database, etc.)
โโโ generators/
โ โโโ implementations/
โ โโโ conftest.py # Generator-specific fixtures
โ โโโ test_flux_pro.py # Unit tests (mocked)
โ โโโ test_flux_pro_live.py # Live API tests (opt-in)
โ โโโ ...
โโโ graphql/ # GraphQL API tests
โโโ storage/ # Storage backend tests
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file weirdfingers_boards-0.10.0.tar.gz.
File metadata
- Download URL: weirdfingers_boards-0.10.0.tar.gz
- Upload date:
- Size: 180.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d585fec071011b528dbf89612e5009315c5cfb933bcbcf6128db38c6dc294dd6
|
|
| MD5 |
885adbbacf5f4aa3174342075dbe3a19
|
|
| BLAKE2b-256 |
a30cea543cd22100bd442ed021da603aca1403f78c334116d4cb505d3ce5f76b
|
File details
Details for the file weirdfingers_boards-0.10.0-py3-none-any.whl.
File metadata
- Download URL: weirdfingers_boards-0.10.0-py3-none-any.whl
- Upload date:
- Size: 338.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
778e3a83f14e7f3b03f7d2cde16c9fc1538d074a4d6dc659707dd34237780230
|
|
| MD5 |
1e0bdb96e4aba694723a783958630905
|
|
| BLAKE2b-256 |
e8eb0a18f2296069a1888db4469d228897687bbe454eb60777ef6f9e996ec127
|