Use any filament like Bambu filaments while OpenSpoolMan automatically subtracts the estimated usage from the SpoolMan-managed spool records (see AUTO SPEND). BambuLab filament is auto-tracked once it shows up in a tray; only third-party spools must be assigned manually through the UI.
No need for cloud or additional hardware—NFC Tags are optional and you can rely solely on the web GUI. In SpoolMan you can generate QR-code stickers that link straight back to OpenSpoolMan so users can tap a label from their mobile device; change the base URL in SpoolMan settings to OpenSpoolMan before generating the sticker (see SpoolMan stickers).
Similar functionality to https://github.com/spuder/OpenSpool using only your phone, server, and NFC tags integrated with SpoolMan.
Everything works locally without cloud access; you can use scripts/init_bambulab.py to fetch your PRINTER_ID/PRINTER_CODE if the printer does not expose them.
Docker: https://ghcr.io/drndos/openspoolman Helm: https://github.com/drndos/openspoolman/pkgs/container/openspoolman%2Fhelm%2Fopenspoolman
- v0.2.0 - 07.12.2025 — Adds material-aware tray/spool mismatch detection, tray color cues, print reassign/pagination, spool material filters, and SpoolMan URL handling with refreshed responsive layouts.
- v0.1.9 - 25.05.2025 — Ships post-print spool assignment, multi-platform Docker images, customizable spool sorting, timezone config, and compatibility/uI polish.
- v0.1.8 - 20.04.2025 — Starts importing each filament’s SpoolMan
filament_idfor accurate matching (requires thefilament_idcustom field). - v0.1.7 - 17.04.2025 — Introduces print cost tracking, printer header info, SPA gating improvements, and fixes for drawer colors/local prints.
- 0.1.6 - 09.04.2025 — Published container images (main service + Helm chart) and packaged artifacts for easier deployments.
Overview over the trays and the assigned spools and spool information
Desktop screenshots (expand to view)
Overview over the trays and the assigned spools and spool information
Assign a spool to a tray with quick filters.
Track every print with filament usage, used spools and costs.
Shows informations about the spool and allows to assign it to a tray.
Assign and refresh NFC tags so you can scan them with you mobile and get directly to the spool info.
Change or remove the spool assignment after a print Useful when the wrong spool was assigned or the print was canceled.
Mobile screenshots (expand to view)
- Android Phone with Chrome web browser or iPhone (manual process much more complicated if using NFC Tags)
- Server to run OpenSpoolMan with https (optional when not using NFC Tags) that is reachable from your Phone and can reach both SpoolMan and Bambu Lab printer on the network
- Active Bambu Lab Account or PRINTER_ID and PRINTER_CODE on your printer
- Bambu Lab printer https://eu.store.bambulab.com/collections/3d-printer
- SpoolMan installed https://github.com/Donkie/Spoolman
- NFC Tags (optional) https://eu.store.bambulab.com/en-sk/collections/nfc/products/nfc-tag-with-adhesive https://www.aliexpress.com/item/1005006332360160.html
SpoolMan can print QR-code stickers for every spool; follow the SpoolMan label guide (https://github.com/Donkie/Spoolman/wiki/Printing-Labels) to generate them. Before printing, update the base URL in SpoolMan’s settings to point at OpenSpoolMan so every sticker redirects to OpenSpoolMan instead of SpoolMan.
Python / venv deployment (see Environment configuration below)
- Clone the repository and switch to the desired branch:
git clone https://github.com/drndos/openspoolman.git cd openspoolman git checkout <branch>
- Create and activate a virtual environment, then install the dependencies:
python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt - Configure the environment variables (see below).
- Run the server with:
OpenSpoolMan listens on port
python wsgi.py
8001by default so it does not clash with SpoolMan on the same host.
Docker deployment (see Environment configuration below)
- Make sure
dockeranddocker composeare installed. - Configure the environment variables (see below).
- Copy
docker-compose.yamlto your deployment directory (or ensure./docker-compose.yamlmatches your environment) and adjust any host volumes or ports as needed. - Build and start the containers:
docker compose up -d
Kubernetes (Helm) deployment (see Environment configuration below)
- Use the bundled Helm chart under
./helm/openspoolman:helm dependency update helm/openspoolman
- Create a
values.yaml(or usehelm/openspoolman/values.yaml) that overrides the sameconfig.enventries and configures an ingress with TLS for your cluster. - Install or upgrade the release:
helm upgrade --install openspoolman helm/openspoolman -f values.yaml --namespace openspoolman --create-namespace
- Verify the pods and ingress:
kubectl get pods -n openspoolman kubectl describe ingress -n openspoolman
-
Rename
config.env.templatetoconfig.envor set environment properties and:- set
OPENSPOOLMAN_BASE_URL— the HTTPS URL where OpenSpoolMan will be available on your network (no trailing slash, required for NFC writes). - set
PRINTER_ID— find it in the printer settings under Setting → Device → Printer SN. - set
PRINTER_ACCESS_CODE— find it in Setting → LAN Only Mode → Access Code (the LAN Only Mode toggle may stay off). - set
PRINTER_IP— found in Setting → LAN Only Mode → IP Address. - set
SPOOLMAN_BASE_URL— the URL of your SpoolMan installation without trailing slash. - set
AUTO_SPENDtoTrueto enable legacy slicer-estimate tracking (no live layer tracking). - set
TRACK_LAYER_USAGEtoTrueto switch to per-layer tracking/consumption whileAUTO_SPENDis alsoTrue. IfAUTO_SPENDisFalse, all filament tracking remains disabled regardless ofTRACK_LAYER_USAGE. - set
AUTO_SPENDtoTrueif you want automatic filament usage tracking (see the AUTO SPEND notes below). - set
DISABLE_MISMATCH_WARNINGtoTrueto hide mismatch warnings in the UI (mismatches are still detected and logged todata/filament_mismatch.json).
- set
-
By default, the app reads
data/3d_printer_logs.dbfor print history; override it throughOPENSPOOLMAN_PRINT_HISTORY_DBor via the screenshot helper (which targetsdata/demo.dbby default). -
Run SpoolMan.
-
Add these extra fields in SpoolMan:
- Filaments
- "type","Type","Choice", "AERO,CF,GF,FR,Basic,HF,Translucent,Aero,Dynamic,Galaxy,Glow,Impact,Lite,Marble,Matte,Metal,Silk,Silk+,Sparkle,Tough,Tough+,Wood,Support for ABS,Support for PA PET,Support for PLA,Support for PLA-PETG,G,W,85A,90A,95A,95A HF,for AMS"
- "nozzle_temperature","Nozzle Temperature","Integer Range","°C","190 - 230"
- "filament_id","Filament ID", "Text"
- Spools
- "tag","tag","Text"
- "active_tray","Active Tray","Text"
- Filaments
-
Add your Manufacturers, Filaments and Spools to SpoolMan (consider 'Import from External' for faster workflow).
-
The filament id lives in
C:\Users\USERNAME\AppData\Roaming\BambuStudio\user\USERID\filament\base(same for each printer/nozzle). -
Open the server base URL in your mobile browser.
-
Optionally copy Bambu Lab RFIDs into the extra tag on spools so they match automatically; read the tag id from logs or the AMS info page.
- The spool's
materialmust match the AMS tray'stray_type(main type). - For Bambu filaments, the AMS reports a sub-brand; this must match the spool's sub-brand. You can model this either as:
material= full Bambu material (e.g.,PLA Wood) and leavetypeempty, ormaterial= base (e.g.,PLA) andtype= the add-on (e.g.,Wood). Both must correspond to what the AMS reports for that tray.
- You can wrap optional notes in parentheses inside
material(e.g.,PLA CF (recycled)); anything in parentheses is ignored during matching. - If matching still fails, please file a report using
.github/ISSUE_TEMPLATE/filament-mismatch.mdor temporarily hide the UI warning viaDISABLE_MISMATCH_WARNING=true(mismatches are still logged todata/filament_mismatch.json).
With NFC Tags:
- For non-Bambu filament, select it in SpoolMan, click 'Write,' and tap an NFC tag near your phone (allow NFC).
- Attach the NFC tag to the filament.
- Load the filament into AMS, then bring the phone near the NFC tag so it opens OpenSpoolMan.
- Assign the AMS slot you used in the UI.
Without NFC Tags:
- Click 'Fill' on a tray and select the desired spool.
- Done.
Once the server is running (via wsgi.py, Gunicorn, Docker, or Helm), open https://<host>:8443 if you used the built-in adhoc SSL mode, or http://<host>:8001 when the service listens on the default port 8001. Replace <host> with your server's IP/DNS and ensure the port matches your chosen deployment (PORT env var or docker-compose mapping). For Docker deployments, you can also use docker compose port openspoolman 8001 to see the mapped host port.
You can turn this feature on to automatically update the spool usage in SpoolMan. This feature is using slicer information about predicted filament weight usage (and in future correlating it with the progress of the printer to compute the estimate of filament used).
This feature has currently following issues/drawbacks:
- Spending on the start of the print
- Not spending according to print process and spending full filament weight even if print fails
- Don't know if it works with LAN mode, since it downloads the 3MF file from cloud
- Not tested with multiple AMS systems
- Not handling the mismatch between the SpoolMan and AMS (if you don't have the Active Tray information correct in spoolman it won't work properly)
- If you change the BASE_URL of this app, you will need to reconfigure all NFC TAGS
- Filament remaining in AMS (I have only AMS lite, if you have AMS we can test together)
- Filament spending based on printing
- TODO: handle situation when the print doesn't finish
- TODO: test with multiple AMS
- Code cleanup
- Video showcase
- Docker compose SSL
- TODOs
- Reduce the amount of files in docker container
- Cloud service for controlled redirect so you don't have to reconfigure NFC tags
- QR codes
- Add search to list of spools