Self-host background removal. Docker images and FastAPI for the withoutBG open weights ONNX model — CPU or NVIDIA GPU.
Run a browser UI, a headless API, or both. Same open-weights quality as the Python package and Mac app, on your own server.
Docker docs → · GPU docs → · Local API docs →
Open Weights results → · Cloud API results → · Compare →
| Image | Description |
|---|---|
withoutbg-openweights-v3-service-cpu |
Inference API only (CPU), headless |
withoutbg-openweights-v3-service-gpu |
Inference API only (GPU), headless |
withoutbg-openweights-v3-app-cpu |
Web UI + API (CPU) |
withoutbg-openweights-v3-app-gpu |
Web UI + API (GPU) |
Docker Hub: withoutbg/withoutbg-openweights-v3-*
CPU images are published for linux/amd64 and linux/arm64 (Intel/AMD and Apple Silicon / ARM servers). GPU images are linux/amd64 only (NVIDIA CUDA).
App image (web UI + API) — drag-and-drop background removal in the browser, same API under /api:
Service image (API only / headless) — FastAPI with no UI. Interactive OpenAPI / Swagger at /docs:
# Web UI + API (CPU) — open http://localhost:8080
docker run --rm -p 8080:8080 withoutbg/withoutbg-openweights-v3-app-cpu:latest
# API only (CPU) — OpenAPI at http://localhost:8000/docs
docker run --rm -p 8000:8000 withoutbg/withoutbg-openweights-v3-service-cpu:latestGPU images require an NVIDIA GPU and the NVIDIA Container Toolkit:
docker run --rm --gpus all -p 8000:8000 withoutbg/withoutbg-openweights-v3-service-gpu:latest
docker run --rm --gpus all -p 8080:8080 withoutbg/withoutbg-openweights-v3-app-gpu:latestAfter baking locally, use Compose:
docker compose up app-cpudocker buildx bake -f docker-bake.hclBuild a single image:
docker buildx bake -f docker-bake.hcl app-cpuBuild for one platform locally (faster on Apple Silicon):
docker buildx bake -f docker-bake.hcl app-cpu --set '*.platform=linux/arm64'CI downloads the ~1.5 GB model bundle once via huggingface_hub. Add a HF_TOKEN repository secret for reliable Hugging Face downloads from GitHub Actions.
Production Docker images bake the ~1.5 GB model bundle at build time and do not hot-reload. For day-to-day work, use native dev with a one-time model download:
# 1. Download model once (~1.5 GB, cached in .cache/model/)
./scripts/dev-download-model.sh
# 2. API with hot reload (port 8000)
./scripts/dev-api.sh
# 3. UI with hot reload (port 3000, proxies /api → :8000)
cd ui && npm install && npm run devEdit Python under service/ or model/ and uvicorn reloads automatically. Edit React under ui/src/ and Next.js hot-reloads.
UI-only work (no real inference): NEXT_PUBLIC_USE_MOCK=true npm run dev in ui/.
Docker dev (same hot reload, cached model mount):
./scripts/dev-download-model.sh
docker compose -f docker-compose.dev.yml up --buildThe first docker compose -f docker-compose.dev.yml build installs Python deps only (no model download). Rebuild only when pyproject.toml changes.
Production-like testing still uses docker buildx bake + docker compose up service-cpu.
This repo is the self-host path: HTTP API and browser UI on your own machine or server. Same open-weights technology powers the rest of the ecosystem:
| Surface | Choose when |
|---|---|
| Python package | You want to embed withoutBG in scripts, notebooks, or backends |
| Mac app | You want a native desktop cutout tool, with an optional Local API for plugins and scripts |
| GIMP plugin | You edit in GIMP 3 and want a private, mask-first workflow via Mac Local API or this Docker service |
| Hugging Face · Space | You want to try a demo or download the ONNX weights directly |
| Cloud API | You need maximum quality without running inference yourself |
# In-process Python (no Docker)
# https://github.com/withoutbg/withoutbg-python
uv add withoutbgThe withoutBG Open Weights Model (10.8.0) is hosted at withoutbg/withoutbg-openweights-onnx. It is three ONNX graphs described by withoutbg-open-weights.onnx.json:
| File | Role |
|---|---|
withoutbg-open-weights-backbone.onnx |
Shared DINOv3 ConvNeXt backbone: router logits and matting features |
withoutbg-open-weights.onnx |
withoutBG matting (Depth Anything V2 small depth + ConvNeXt-fused matting) |
birefnet-general.onnx |
BiRefNet segmentation |
A trained router picks one branch per image. Fine strands, soft detail, and transparency go to the withoutBG matting branch. Hard opaque objects, flat scenes, and vehicles go to BiRefNet. Only the selected branch runs, and its alpha is upsampled to native resolution. The API reports the decision in the X-Route-Category / X-Route-Pipeline headers (routeCategory / routePipeline in JSON responses).
Builds download the bundle at a pinned Hugging Face revision (HF_REVISION in docker-bake.hcl), and every graph is SHA256-checked on load. Older single-graph bundles still load with their original behavior.
The model is licensed under the withoutBG Open Weights license. Upstream components keep their own licenses: DINOv3 (DINOv3 License), Depth Anything V2 (Apache-2.0), and BiRefNet (MIT).
Apache-2.0 for this repository's code. Built with DINOv3. See THIRD_PARTY_NOTICES.md for upstream model attribution.
- Bugs / questions: GitHub Issues
- Docker docs: withoutbg.com/docs/open-model/docker
- Commercial: contact@withoutbg.com





