Your printers. Your rules.
Self-hosted control center for Bambu Lab printers
- Local-first by design: Keep control of your printers, jobs, and production data on your own network.
- Own your workflow: Schedule prints, manage queues, control smart sockets, and automate routine production tasks.
- Fleet management built in: Monitor and manage multiple printers from a single interface designed for busy workshops and print farms.
Grove Control is a focused tool for reliably running Bambu Lab printers and small fleets. It is intentionally narrower than Bambuddy and does not aim for feature parity or to support every possible workflow.
We focus on clear workflows, predictable state, safe recovery, and low maintenance over maximum flexibility. A feature may be simplified, declined, or left in Bambuddy when it adds too much complexity.
Bambuddy is the broader toolbox. Grove Control is the focused tool.
Grove Control brings together printer monitoring, scheduling, automation, and production management in one local-first interface.
- Printer monitoring and control: View live printer status, camera feeds, temperatures, fan states, AMS data, HMS errors, and job progress from a central dashboard.
- Production scheduling: Queue, schedule, and dispatch prints across multiple printers with support for batch jobs, model-based assignment, filament validation, and clear-plate workflows.
- Print archive and history: Automatically archive completed prints with metadata, thumbnails, reprint support, print logs, cost tracking, and failure history.
- Multi-printer fleet management: Manage multiple Bambu Lab printers from one interface, with filtering, search, bulk actions, and per-printer configuration.
- File and project management: Organise sliced files, library folders, MakerWorld imports, project groups, plates, parts, and related print assets.
- Spool and filament tracking: Track spool inventory, AMS assignments, filament usage, remaining weight, material profiles, costs, and low-stock alerts.
- Automation and smart power control: Integrate smart plugs, automate printer power, track energy usage, manage drying workflows, and reduce manual intervention.
- Notifications and alerts: Send print events, errors, queue updates, plate detection warnings, and completion alerts through services such as Discord, Telegram, WhatsApp, email, ntfy, Pushover, Home Assistant, and webhooks.
- Virtual printer and remote workflows: Send jobs from Bambu Studio or OrcaSlicer into Grove Control using virtual printer modes for archiving, review, queueing, or proxy printing.
- Integrations and extensibility: Supports MQTT, Home Assistant, Prometheus, Spoolman, webhooks, API keys, local profiles, cloud profile sync, and backup workflows.
- Optional authentication: Add user accounts, permissions, activity tracking, API protection, SSO, 2FA, and per-user notification settings when needed.
- Maintenance and diagnostics: Track maintenance intervals, view logs, generate support bundles, monitor firmware versions, and access diagnostic tools.
For upgrade and release guidance, see UPDATING.md, CHANGELOG.md, and the Docker install guide.
Click to expand screenshots
List view of all connected machines
At-a-glance machine health with actionable status details
Streamlined queue-first print setup with model targeting and scheduling
- Docker Engine 20+ with Docker Compose, or Docker Desktop on macOS/Windows
- Bambu Lab printer with Developer Mode enabled (see below)
- "Store sent files on external storage" enabled in Bambu Studio/OrcaSlicer
- Same local network as printer
Supported install path: Docker Compose is the supported production install path.
Stable release: The pre-built stable image is available as
ghcr.io/edwardchamberlain/grove-control:latest. Pin the image toghcr.io/edwardchamberlain/grove-control:1.0.0for a reproducible 1.0.0 deployment; stable tags use the bareX.Y.Zversion with novprefix.
Option A: Pre-built image (fastest)
mkdir grove-control && cd grove-control
curl -O https://raw.githubusercontent.com/EdwardChamberlain/grove-control/main/docker-compose.yml
docker compose up -dOption B: Build the Docker image locally
git clone https://github.com/EdwardChamberlain/grove-control.git
cd grove-control
docker compose up -d --buildOpen http://localhost:8000 in your browser.
Multi-architecture support: Pre-built images are available for
linux/amd64andlinux/arm64(Raspberry Pi 4/5).
macOS/Windows users: Docker Desktop doesn't support
network_mode: host. Edit docker-compose.yml: comment outnetwork_mode: hostand uncomment theports:section. Printer discovery won't work - add printers manually by IP.
Linux users: If you get "permission denied" errors, either prefix commands with
sudo(e.g.,sudo docker compose up -d) or add your user to the docker group.
For a source/native installation, use the main branch for the stable source
tree and confirm the root VERSION file reports 1.0.0. The dev branch and
the :dev image are development channels, not stable releases. Docker Compose
remains the supported production install path; source setup details are in
CONTRIBUTING.md.
Docker Configuration & Commands
Environment Variables:
| Variable | Default | Description |
|---|---|---|
TZ |
UTC |
IANA timezone for local scheduled times (e.g., America/New_York, Europe/Berlin) |
PORT |
8000 |
Port Grove Control runs on (with host networking mode) |
DEBUG |
false |
Enable debug logging |
LOG_LEVEL |
INFO |
Log level: DEBUG, INFO, WARNING, ERROR |
LOG_TO_FILE |
true |
Write rotating logs to bambuddy.log |
For Docker Compose, the TZ value in .env or the container environment is
authoritative for local scheduled times, including scheduled backups. Compose
and the application both fall back to UTC when it is unset. For a
source/native installation, export TZ in the shell or service environment
before starting Grove Control; setting it only in .env is not sufficient for
the native process. Database timestamps are stored in UTC and converted for
local display. The installer scripts detect a host timezone and write it to
.env; override it with --tz or -TimeZone.
export TZ=Europe/LondonKeep DEBUG=false for normal operation: enabling it also turns on SQLAlchemy
engine query logging and can be noisy. For temporary application diagnostics
without SQL query echoing, leave DEBUG=false and set LOG_LEVEL=DEBUG.
Data Persistence:
| Volume | Purpose |
|---|---|
bambuddy_data |
/app/data: database, archived 3MF files, thumbnails, and other application data |
bambuddy_logs |
/app/logs: application logs |
Updating:
# Create and download a backup from Settings β Backup before updating.
# Pre-built stable image:
docker compose pull
docker compose up -d
docker compose logs --tail=100 grove-control
# Locally built stable image: update the main checkout, then rebuild
git fetch origin
git checkout main
git pull --ff-only origin main
docker compose up -d --buildThe default Compose file tracks stable latest. To pin the current release,
change its image line to
ghcr.io/edwardchamberlain/grove-control:1.0.0. Do not use docker compose down -v, because removing volumes deletes the persistent database and
application data. Existing Grove Control databases are migrated automatically
when the updated application starts; see UPDATING.md for the
backup, migration, and recovery procedure.
Development Builds:
Development builds are published from the dev branch and use a separate
container tag:
# Pull the current development build
docker pull ghcr.io/edwardchamberlain/grove-control:devUse Watchtower to automatically update when new development builds are pushed, but do not use this channel for production data.
Useful Commands:
# View logs
docker compose logs -f
# Stop/Start
docker compose down
docker compose up -d
# Shell access
docker compose exec grove-control /bin/bashQueue recovery (SQLite only): If support has confirmed that a legacy
BambuBuddy-to-Grove-Control migration left the queue table incompatible, stop
the service and run the recovery script. It creates a timestamped .backup
copy of the database before deleting and recreating only the queue table; all
queued jobs are removed.
docker compose down
docker compose run --rm --no-deps grove-control \
python /app/scripts/rebuild_print_queue.py --yes
docker compose up -dThe command requires an image that includes this recovery tool. Do not use it with an external PostgreSQL database.
BambuBuddy-to-Grove SQLite recovery: This last-resort one-way conversion builds a fresh Grove Control schema and preserves IDs and rows for printers, users, groups and permissions, settings, archives, library files, inventory, and print logs. It intentionally resets queues and other transient runtime, sensor, notification, and auth-session data.
The reset tables are print_queue, active-print state, pending uploads,
sensor and smart-plug snapshots, notification logs/digests, and ephemeral auth
and rate-limit records. Durable configuration and history outside that list is
copied when it exists in both applications.
docker compose down
docker compose run --rm --no-deps grove-control \
python /app/scripts/rebuild_database.py --yes
docker compose up -dIt is SQLite-only. A timestamped .backup is retained beside the database;
keep it until the rebuilt installation has been verified. BambuBuddy-only
pipeline, bug-report, and sponsor UI tables are also exported to a timestamped
*.bambuddy-unsupported.json file beside the backup. Any unknown source-only
table, row-count mismatch, or foreign-key failure aborts without replacing the
live database.
Legacy databases may contain dangling references because SQLite foreign-key
checks were historically disabled on some connections. During conversion,
nullable references (for example a print log whose original user was deleted)
are cleared while retaining the record. Orphan rows are removed only when the
current schema explicitly declares ON DELETE CASCADE; all other unresolved
foreign-key problems still abort the replacement and leave the backup intact.
Custom Port:
ports:
- "3000:8000" # Access on port 3000Reverse Proxy (Nginx):
server {
listen 443 ssl http2;
server_name grove-control.yourdomain.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://localhost:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 86400;
}
}Note: WebSocket support is required for real-time printer updates.
Network Mode Host (required for printer discovery and camera streaming):
services:
grove-control:
build: .
network_mode: hostNote: Docker's default bridge networking cannot receive SSDP multicast packets for automatic printer discovery. When using
network_mode: host, Grove Control auto-detects your network subnet and can discover printers via subnet scanning in the Add Printer dialog.
Developer Mode allows third-party software like Grove Control to control your printer over the local network.
- On printer: Settings β Network β LAN Only Mode β Enable
- Enable Developer Mode (appears after LAN Only Mode is enabled)
- Note the Access Code displayed
- Find IP address in network settings
- Find Serial Number in device info
Note: Developer Mode disables cloud features but provides full local control. Standard LAN Mode (without Developer Mode) only allows read-only monitoring.
In Bambu Studio or OrcaSlicer, enable "Store sent files on external storage" so that print files (3MF) are saved to the printer's SD card. Grove Control needs these files to extract thumbnails and 3D model previews.
- Open Bambu Studio or OrcaSlicer
- Go to the Device tab for your printer
- In Print Options, enable Store Sent Files on External Storage
| Series | Models |
|---|---|
| X1 | X1, X1 Carbon, X1E |
| X2 | X2D |
| H2 | H2D, H2D Pro, H2C, H2S |
| P1 | P1P, P1S |
| P2 | P2S |
| A1 | A1, A1 Mini |
| A2 | A2L |
| Component | Technology |
|---|---|
| Backend | Python, FastAPI, SQLAlchemy |
| Frontend | React, TypeScript, Tailwind CSS |
| Database | SQLite (default) or PostgreSQL |
| 3D Viewer | Three.js |
| Communication | MQTT (TLS), FTPS |
Contributions welcome! Ways to help:
- π Document β Improve the wiki and guides
- Test β Report issues with your printer model
- Translate β Add new languages
- Code β Submit PRs for bugs or features
See CONTRIBUTING.md for guidelines.
AGPL-3.0 License β see LICENSE for details.
- Bambuddy by MartinNYHC β Grove Control is built on and forked from the Bambuddy project, and owes a great deal to the strong foundation and awesome work behind it.
- Bambu Lab for amazing printers
- All testers and contributors
Made with β€οΈ for the 3D printing community


