Skip to content
Β 
Β 

Latest commit

Β 

History

3,736 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Grove Control Logo

Your printers. Your rules.
Self-hosted control center for Bambu Lab printers

Why Grove Control?

  • 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.

Scope and direction

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.


✨ Features

Grove Control brings together printer monitoring, scheduling, automation, and production management in one local-first interface.

Core Features

  • 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.


πŸ“Έ Screenshots

Click to expand screenshots

Grove Control single-printer cockpit
Real-time printer monitoring

Grove Control printer list
List view of all connected machines

Grove Control machine health details
At-a-glance machine health with actionable status details

Grove Control streamlined print modal
Streamlined queue-first print setup with model targeting and scheduling

Grove Control fleet kiosk mode
Read-only fleet and queue view for workshop displays


πŸš€ Quick Start

Requirements

  • 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

Installation

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 to ghcr.io/edwardchamberlain/grove-control:1.0.0 for a reproducible 1.0.0 deployment; stable tags use the bare X.Y.Z version with no v prefix.

Docker Compose

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 -d

Option B: Build the Docker image locally

git clone https://github.com/EdwardChamberlain/grove-control.git
cd grove-control
docker compose up -d --build

Open http://localhost:8000 in your browser.

Multi-architecture support: Pre-built images are available for linux/amd64 and linux/arm64 (Raspberry Pi 4/5).

macOS/Windows users: Docker Desktop doesn't support network_mode: host. Edit docker-compose.yml: comment out network_mode: host and uncomment the ports: 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/London

Keep 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 --build

The 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:dev

Use 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/bash

Queue 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 -d

The 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 -d

It 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 3000

Reverse 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: host

Note: 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.

Enabling Developer Mode

Developer Mode allows third-party software like Grove Control to control your printer over the local network.

  1. On printer: Settings β†’ Network β†’ LAN Only Mode β†’ Enable
  2. Enable Developer Mode (appears after LAN Only Mode is enabled)
  3. Note the Access Code displayed
  4. Find IP address in network settings
  5. 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.

Slicer Settings

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.

  1. Open Bambu Studio or OrcaSlicer
  2. Go to the Device tab for your printer
  3. In Print Options, enable Store Sent Files on External Storage

πŸ–¨οΈ Supported Printers

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

πŸ› οΈ Tech Stack

Component Technology
Backend Python, FastAPI, SQLAlchemy
Frontend React, TypeScript, Tailwind CSS
Database SQLite (default) or PostgreSQL
3D Viewer Three.js
Communication MQTT (TLS), FTPS

🀝 Contributing

Contributions welcome! Ways to help:

  1. πŸ“ Document β€” Improve the wiki and guides
  2. Test β€” Report issues with your printer model
  3. Translate β€” Add new languages
  4. Code β€” Submit PRs for bugs or features

See CONTRIBUTING.md for guidelines.


πŸ“„ License

AGPL-3.0 License β€” see LICENSE for details.


πŸ™ Acknowledgments

  • 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

About

A self-hosted print archive and management system for Bambu Lab 3D printers

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages