{"repo":"Donkie/Spoolman","free":true,"listed":false,"github":"https://github.com/Donkie/Spoolman","clone":"git clone https://github.com/Donkie/Spoolman.git","description":"Keep track of your inventory of 3D-printer filament spools.","language":"TypeScript","stars":2718,"topics":["3d-printing","database","inventory","service"],"license":"MIT","category":"dev_tool","readme_excerpt":"<picture>\n  <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://github.com/Donkie/Spoolman/assets/2332094/4e6e80ac-c7be-4ad2-9a33-dedc1b5ba30e\">\n  <source media=\"(prefers-color-scheme: light)\" srcset=\"https://github.com/Donkie/Spoolman/assets/2332094/3c120b3a-1422-42f6-a16b-8d5a07c33000\">\n  <img alt=\"Icon of a filament spool\" src=\"https://github.com/Donkie/Spoolman/assets/2332094/3c120b3a-1422-42f6-a16b-8d5a07c33000\">\n</picture>\n\n<br/>\n\n_Keep track of your inventory of 3D-printer filament spools._\n\nSpoolman is a self-hosted web service designed to help you efficiently manage your 3D printer filament spools and monitor their usage. It acts as a centralized database that seamlessly integrates with popular 3D printing software like [OctoPrint](https://octoprint.org/) and [Klipper](https://www.klipper3d.org/)/[Moonraker](https://moonraker.readthedocs.io/en/latest/). When connected, it automatically updates spool weights as printing progresses, giving you real-time insights into filament usage.\n\n[![Static Badge](https://img.shields.io/badge/Spoolman%20Wiki-blue?link=https%3A%2F%2Fgithub.com%2FDonkie%2FSpoolman%2Fwiki)](https://github.com/Donkie/Spoolman/wiki)\n[![GitHub Release](https://img.shields.io/github/v/release/Donkie/Spoolman)](https://github.com/Donkie/Spoolman/releases)\n\n### Features\n* **Filament Management**: Keep comprehensive records of filament types, manufacturers, and individual spools.\n* **API Integration**: The [REST API](https://donkie.github.io/Spoolman/) allows easy integration with other software, facilitating automated workflows and data exchange.\n* **Real-Time Updates**: Stay informed with live spool updates through Websockets, providing immediate feedback during printing operations.\n* **Central Filament Database**: A community-supported database of manufacturers and filaments simplify adding new spools to your inventory. Contribute by heading to [SpoolmanDB](https://github.com/Donkie/SpoolmanDB).\n* **Web-Based Client**: Spoolman includes a built-in web client that lets you manage data effortlessly:\n  * View, create, edit, and delete filament data.\n  * Search, group and filter your inventory by manufacturer, material, location and more.\n  * Add custom fields to tailor information to your specific needs.\n  * Design and print labels with QR codes for easy spool identification and tracking.\n  * Contribute to its translation into 18 languages via [Weblate](https://hosted.weblate.org/projects/spoolman/).\n* **Database Support**: SQLite, PostgreSQL, MySQL, and CockroachDB.\n* **Multi-Printer Management**: Handles spool updates from several printers simultaneously.\n* **Advanced Monitoring**: Integrate with [Prometheus](https://prometheus.io/) for detailed historical analysis of filament usage, helping you track and optimize your printing processes. See the [Wiki](https://github.com/Donkie/Spoolman/wiki/Filament-Usage-History) for instructions on how to set it up.\n\n**Spoolman integrates with:**\n  * [Moonraker](https://moonraker.readthedocs.io/en/latest/configuration/#spoolman) and most front-ends (Fluidd, KlipperScreen, Mainsail, ...)\n  * [OctoPrint](https://github.com/mdziekon/octoprint-spoolman)\n  * [OctoEverywhere](https://octoeverywhere.com/spoolman?source=github_spoolman)\n  * [Home Assistant](https://github.com/Disane87/spoolman-homeassistant)\n  * [MCP Server](https://github.com/Disane87/spoolman-mcp) - Manage your filament inventory through AI assistants like Claude using the Model Context Protocol\n\n**Web client preview:**\n![The Spoolman web client, showing the spool library with a spool's details open alongside it](.github/media/client-screenshot.png)\n\n<table>\n  <tr>\n    <td width=\"50%\"><img alt=\"The Spoolman dashboard, showing spools as draggable cards grouped by storage location\" src=\".github/media/dashboard-screenshot.png\"></td>\n    <td width=\"50%\"><img alt=\"The Spoolman label designer, showing a 50 by 25 mm spool label with a QR code, filament name and colour swatch\" src=\".github/media/label-designer-screenshot.png\"></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><sub>Dashboard — spools as cards, grouped by location or any other field. Drag one to move it.</sub></td>\n    <td align=\"center\"><sub>Label designer — QR labels built from any spool, filament or vendor field.</sub></td>\n  </tr>\n</table>\n\n## Installation\nPlease see the [Installation page on the Wiki](https://github.com/Donkie/Spoolman/wiki/Installation) for details how to install Spoolman.\n\nIf the new client misbehaves on your setup, set `SPOOLMAN_LEGACY_CLIENT=TRUE` to go back to\nthe previous one. Both ship in every release and talk to the same API, so your data is\nuntouched either way — but please [report the problem](https://github.com/Donkie/Spoolman/issues)\nso it can be fixed.\n","default_branch":"master","files":528,"tree":[".dockerignore",".env.example",".gitattributes",".github/FUNDING.yml",".github/ISSUE_TEMPLATE/bug_report.md",".github/ISSUE_TEMPLATE/feature_request.md",".github/media/client-screenshot.png",".github/media/dashboard-screenshot.png",".github/media/label-designer-screenshot.png",".github/workflows/apidocs.yml",".github/workflows/ci.yml",".github/workflows/guard-translations.yml",".github/workflows/issue-manager.yml",".github/workflows/trigger-release.yml",".github/workflows/weblate-automerge.yml",".gitignore","Dockerfile","LICENSE","README.md","alembic.ini","client/.gitignore","client/.npmrc","client/.prettierignore","client/.prettierrc","client/README.MD","client/eslint.config.js","client/icons/spool.svg","client/icons/spoolman.svg","client/icons/spoolman_monochrome.svg","client/index.html","client/package-lock.json","client/package.json","client/public/apple-touch-icon-180x180.png","client/public/favicon.ico","client/public/favicon.svg","client/public/kofi_s_logo_nolabel.png","client/public/locales/cs/common.json","client/public/locales/da/common.json","client/public/locales/de/common.json","client/public/locales/el/common.json","client/public/locales/en/common.json","client/public/locales/es/common.json","client/public/locales/et/common.json","client/public/locales/fa/common.json","client/public/locales/fr/common.json","client/public/locales/hi-Latn/common.json","client/public/locales/hu/common.json","client/public/locales/it/common.json","client/public/locales/ja/common.json","client/public/locales/ko/common.json","client/public/locales/lt/common.json","client/public/locales/lv/common.json","client/public/locales/nb-NO/common.json","client/public/locales/nl/common.json","client/public/locales/pl/common.json","client/public/locales/pt-BR/common.json","client/public/locales/pt/common.json","client/public/locales/ro/common.json","client/public/locales/ru/common.json","client/public/locales/sk/common.json","client/public/locales/sl/common.json","client/public/locales/sv/common.json","client/public/locales/ta/common.json","client/public/locales/th/common.json","client/public/locales/tr/common.json","client/public/locales/uk/common.json","client/public/locales/zh-Hant/common.json","client/public/locales/zh/common.json","client/public/maskable-icon-512x512.png","client/public/pwa-192x192.png","client/public/pwa-512x512.png","client/public/pwa-64x64.png","client/scripts/check-i18n.js","client/src/App.tsx","client/src/components/column.tsx","client/src/components/dataProvider.ts","client/src/components/dateTimePicker.tsx","client/src/components/extraFields.tsx","client/src/components/favicon.tsx","client/src/components/filamentImportModal.tsx","client/src/components/header/index.tsx","client/src/components/index.ts","client/src/components/inputNumberRange.tsx","client/src/components/layout.tsx","client/src/components/liveProvider.ts","client/src/components/liveify.ts","client/src/components/multiColorPicker.tsx","client/src/components/notificationProvider.tsx","client/src/components/numberField.tsx","client/src/components/otherModels.tsx","client/src/components/qrCodeScanner.tsx","client/src/components/spoolIcon.css","client/src/components/spoolIcon.tsx","client/src/components/version.tsx","client/src/contexts/color-mode/index.tsx","client/src/i18n.ts","client/src/icon.svg","client/src/index.tsx","client/src/pages/filaments/create.tsx","client/src/pages/filaments/edit.tsx","client/src/pages/filaments/functions.ts","client/src/pages/filaments/index.ts","client/src/pages/filaments/list.tsx","client/src/pages/filaments/model.tsx","client/src/pages/filaments/show.tsx","client/src/pages/help/index.tsx","client/src/pages/home/index.tsx","client/src/pages/locations/components/location.tsx","client/src/pages/locations/components/locationContainer.tsx","client/src/pages/locations/components/spoolCard.tsx","client/src/pages/locations/components/spoolList.tsx","client/src/pages/locations/dnd.ts","client/src/pages/locations/functions.ts","client/src/pages/locations/index.tsx","client/src/pages/locations/locations.css","client/src/pages/printing/index.tsx","client/src/pages/printing/printing.tsx","client/src/pages/printing/printingDialog.tsx","client/src/pages/printing/qrCodePrintingDialog.tsx","client/src/pages/printing/spoolQrCodePrintingDialog.tsx","client/src/pages/printing/spoolSelectModal.tsx","client/src/pages/settings/extraFieldsSettings.tsx","client/src/pages/settings/generalSettings.tsx","client/src/pages/settings/index.tsx","client/src/pages/spools/create.tsx","client/src/pages/spools/edit.tsx","client/src/pages/spools/functions.tsx","client/src/pages/spools/index.ts","client/src/pages/spools/list.tsx","client/src/pages/spools/model.tsx","client/src/pages/spools/show.tsx","client/src/pages/vendors/create.tsx","client/src/pages/vendors/edit.tsx","client/src/pages/vendors/functions.ts","client/src/pages/vendors/index.ts","client/src/pages/vendors/list.tsx","client/src/pages/vendors/model.tsx","client/src/pages/vendors/show.tsx","client/src/utils/filtering.ts","client/src/utils/overrides.css","client/src/utils/parsing.tsx","client/src/utils/queryExternalDB.ts","client/src/utils/queryFields.ts","client/src/utils/querySettings.ts","client/src/utils/saveload.ts","client/src/utils/settings.ts","client/src/utils/sorting.ts","client/src/utils/support.ts","client/src/utils/url.ts","client/src/vite-env.d.ts","client/tsconfig.json","client/tsconfig.node.json","client/vite.config.ts","client_v2/.gitignore","client_v2/.npmrc","client_v2/.prettierignore","client_v2/.prettierrc","client_v2/README.md","client_v2/e2e/a11y-mobile.spec.ts","client_v2/e2e/global-setup.ts","client_v2/e2e/global-teardown.ts","client_v2/e2e/report.ts","client_v2/eslint.config.js","client_v2/locales/cs/common.json","client_v2/locales/da/common.json","client_v2/locales/de/common.json","client_v2/locales/el/common.json","client_v2/locales/en/common.json","client_v2/locales/es/common.json","client_v2/locales/et/common.json","client_v2/locales/fa/common.json","client_v2/locales/fr/common.json","client_v2/locales/hi-Latn/common.json","client_v2/locales/hu/common.json","client_v2/locales/it/common.json","client_v2/locales/ja/common.json","client_v2/locales/ko/common.json","client_v2/locales/lt/common.json","client_v2/locales/lv/common.json","client_v2/locales/nb-NO/common.json","client_v2/locales/nl/common.json","client_v2/locales/pl/common.json","client_v2/locales/pt-BR/common.json","client_v2/locales/pt/common.json","client_v2/locales/ro/common.json","client_v2/locales/ru/common.json","client_v2/locales/sk/common.json","client_v2/locales/sl/common.json","client_v2/locales/sv/common.json","client_v2/locales/ta/common.json","client_v2/locales/th/common.json","client_v2/locales/tr/common.json","client_v2/locales/uk/common.json","client_v2/locales/zh-Hant/common.json","client_v2/locales/zh/common.json","client_v2/package-lock.json","client_v2/package.json","client_v2/playwright.config.ts","client_v2/project.inlang/settings.json","client_v2/scripts/convert-locales.mjs","client_v2/scripts/strip-empty-locales.mjs","client_v2/src/app.css","client_v2/src/app.html","client_v2/src/lib/actions/portal.ts","client_v2/src/lib/api/auth.test.ts","client_v2/src/lib/api/auth.ts","client_v2/src/lib/api/config.ts","client_v2/src/lib/api/external.ts","client_v2/src/lib/api/fields.ts","client_v2/src/lib/api/http.test.ts","client_v2/src/lib/api/http.ts","client_v2/src/lib/api/info.ts","client_v2/src/lib/api/labelDesigns.ts","client_v2/src/lib/api/live.ts","client_v2/src/lib/api/liveSync.ts","client_v2/src/lib/api/map.test.ts","client_v2/src/lib/api/map.ts","client_v2/src/lib/api/query.ts","client_v2/src/lib/api/search.ts","client_v2/src/lib/api/settings.ts","client_v2/src/lib/api/spoolSource.ts","client_v2/src/lib/api/types.ts","client_v2/src/lib/components/AddSpoolModal.svelte","client_v2/src/lib/components/Breadcrumbs.svelte","client_v2/src/lib/components/Button.svelte","client_v2/src/lib/components/Card.svelte","client_v2/src/lib/components/ColorEditor.svelte","client_v2/src/lib/components/Combobox.svelte","client_v2/src/lib/components/ConfirmDialog.svelte","client_v2/src/lib/components/DateTimeField.svelte","client_v2/src/lib/components/DetailPane.svelte","client_v2/src/lib/components/EditableField.svelte","client_v2/src/lib/components/ExtraFieldInput.svelte","client_v2/src/lib/components/ExtraFieldsSection.svelte","client_v2/src/lib/components/Field.svelte","client_v2/src/lib/components/FieldGrid.svelte","client_v2/src/lib/components/Footer.svelte","client_v2/src/lib/components/LinkedText.svelte","client_v2/src/lib/components/Logo.svelte","client_v2/src/lib/components/MaterialBadge.svelte","client_v2/src/lib/components/MenuSearch.svelte","client_v2/src/lib/components/NavTabs.svelte","client_v2/src/lib/components/NewFilamentCards.svelte","client_v2/src/lib/components/NumberInput.svelte","client_v2/src/lib/components/Pagination.svelte","client_v2/src/lib/components/ProgressBar.svelte","client_v2/src/lib/components/QrScannerModal.svelte","client_v2/src/lib/components/SearchInput.svelte","client_v2/src/lib/components/SectionLabel.svelte","client_v2/src/lib/components/Splitter.svelte","client_v2/src/lib/components/Swatch.svelte","client_v2/src/lib/components/Toaster.svelte","client_v2/src/lib/components/Toggle.svelte","client_v2/src/lib/components/TopBar.svelte","client_v2/src/lib/components/fieldLabel.ts","client_v2/src/lib/components/labels/ElementInspector.svelte","client_v2/src/lib/components/labels/LabelCanvas.svelte","client_v2/src/lib/components/labels/LabelDesigner.svelte","client_v2/src/lib/components/labels/PrintLayoutPanel.svelte","client_v2/src/lib/components/library/ChangeFilamentModal.svelte","client_v2/src/lib/components/library/ChangeVendorModal.svelte","client_v2/src/lib/components/library/FilamentInspector.svelte","client_v2/src/lib/components/library/FilamentList.svelte","client_v2/src/lib/components/library/GroupHeader.svelte","client_v2/src/lib/components/library/GroupRow.svelte","client_v2/src/lib/components/library/Inspector.svelte","client_v2/src/lib/components/library/ListToolbar.svelte","client_v2/src/lib/components/library/OverrideMark.svelte","client_v2/src/lib/components/library/SearchBox.svelte","client_v2/src/lib/components/library/SpoolInspector.svelte","client_v2/src/lib/components/library/SpoolRow.svelte","client_v2/src/lib/components/library/UnusedRow.svelte","client_v2/src/lib/components/library/VendorInspector.svelte","client_v2/src/lib/components/library/VendorSection.svelte","client_v2/src/lib/components/settings/ExtraFieldsManager.svelte","client_v2/src/lib/components/settings/SettingRow.svelte","client_v2/src/lib/dashboard/fields.test.ts","client_v2/src/lib/dashboard/fields.ts","client_v2/src/lib/dashboard/layout.ts","client_v2/src/lib/dashboard/params.ts","client_v2/src/lib/data/materials.ts","client_v2/src/lib/filament/draft.ts","client_v2/src/lib/i18n/languages.ts","client_v2/src/lib/labels/export/aml.test.ts","client_v2/src/lib/labels/export/aml.ts","client_v2/src/lib/labels/export/index.ts","client_v2/src/lib/labels/export/png.test.ts","client_v2/src/lib/labels/export/png.ts","client_v2/src/lib/labels/export/types.ts","client_v2/src/lib/labels/logo.ts","client_v2/src/lib/labels/migrateV1.test.ts","client_v2/src/lib/labels/migrateV1.ts","client_v2/src/lib/labels/paper.ts","client_v2/src/lib/labels/print.ts","client_v2/src/lib/labels/qr.ts","client_v2/src/lib/labels/render.ts","client_v2/src/lib/labels/template.ts","client_v2/src/lib/labels/types.test.ts","client_v2/src/lib/labels/types.ts","client_v2/src/lib/library/dateFilter.test.ts","client_v2/src/lib/library/dateFilter.ts","client_v2/src/lib/library/deletion.test.ts","client_v2/src/lib/library/deletion.ts","client_v2/src/lib/library/params.test.ts","client_v2/src/lib/library/params.ts","client_v2/src/lib/library/viewPrefs.test.ts","client_v2/src/lib/library/viewPrefs.ts","client_v2/src/lib/settings/params.ts","client_v2/src/lib/stores/collapsedGroups.svelte.ts","client_v2/src/lib/stores/fields.svelte.ts","client_v2/src/lib/stores/inventory.svelte.ts","client_v2/src/lib/stores/labelDesigns.svelte.ts","client_v2/src/lib/stores/listWidth.svelte.ts","client_v2/src/lib/stores/listWidth.test.ts","client_v2/src/lib/stores/serverInfo.svelte.ts","client_v2/src/lib/stores/settings.svelte.ts","client_v2/src/lib/stores/theme.svelte.ts","client_v2/src/lib/stores/toasts.svelte.ts","client_v2/src/lib/stores/ui.svelte.ts","client_v2/src/lib/types.ts","client_v2/src/lib/utils/autosave.ts","client_v2/src/lib/utils/color.test.ts","client_v2/src/lib/utils/color.ts","client_v2/src/lib/utils/datetime.ts","client_v2/src/lib/utils/format.test.ts","client_v2/src/lib/utils/format.ts","client_v2/src/lib/utils/library.test.ts","client_v2/src/lib/utils/library.ts","client_v2/src/lib/utils/links.test.ts","client_v2/src/lib/utils/links.ts","client_v2/src/lib/utils/match.test.ts","client_v2/src/lib/utils/match.ts","client_v2/src/lib/utils/numeric.test.ts","client_v2/src/lib/utils/numeric.ts","client_v2/src/lib/utils/saver.test.ts","client_v2/src/lib/utils/saver.ts","client_v2/src/lib/utils/spoolCode.ts","client_v2/src/lib/utils/validate.ts","client_v2/src/routes/+layout.svelte","client_v2/src/routes/+layout.ts","client_v2/src/routes/+page.svelte","client_v2/src/routes/+page.ts","client_v2/src/routes/dashboard/+page.svelte","client_v2/src/routes/filament/show/[id]/+page.ts","client_v2/src/routes/labels/+page.svelte","client_v2/src/routes/settings/+page.svelte","client_v2/src/routes/spool/show/[id]/+page.ts","client_v2/static/apple-touch-icon-180x180.png","client_v2/static/favicon.svg","client_v2/static/kofi_s_logo_nolabel.png","client_v2/static/manifest.webmanifest","client_v2/static/maskable-icon-512x512.png","client_v2/static/pwa-192x192.png","client_v2/static/pwa-512x512.png","client_v2/static/pwa-64x64.png","client_v2/static/spoolman.svg","client_v2/static/sw.js","client_v2/svelte.config.js","client_v2/tsconfig.json","client_v2/vite.config.ts","entrypoint.sh","lefthook.yml","migrations/README.md","migrations/__init__.py","migrations/env.py","migrations/script.py.mako","migrations/versions/2023_05_27_2146-684d32cf7e4d_initial.py","migrations/versions/2023_05_28_2136-b47376d60c6d_add_extruder_and_bed_temperature_.py","migrations/versions/2023_06_01_1953-db385b808a20_add_filament_color_code.py","migrations/versions/2023_07_14_1217-92186a5f7b0f_add_spool_archived_field.py","migrations/versions/2023_08_12_2121-92793c8a937c_color_hex_alpha.py","migrations/versions/2023_12_30_0839-b82cd9e2aa6f_added_spool_prices.py","migrations/versions/2024_01_03_1346-ccbb17aeda7c_added_settings_table.py","migrations/versions/2024_01_04_2209-b8881bdb716c_added_extra_fields.py","migrations/versions/2024_03_26_0948-aafcd7fb0e84_spool_weights.py","migrations/versions/2024_03_26_1349-304a32906234_spool_weight_population.py","migrations/versions/2024_03_26_1507-5f069e51bd89_vendor_empty_spool_weight.py","migrations/versions/2024_05_12_1930-395d560284b3_added_external_id.py","migrations/versions/2024_05_28_1846-415a8f855e14_multi_colors.py","migrations/versions/2026_08_02_0900-9c1d5f2a7b31_strip_color_hex_hash.py","migrations/versions/__init__.py","pyproject.toml","requirements.txt","scripts/demo_seed.py","scripts/install.sh","scripts/start.sh","scripts/stress_seed.py","spoolman/__init__.py","spoolman/api/__init__.py","spoolman/api/v1/__init__.py","spoolman/api/v1/export.py","spoolman/api/v1/externaldb.py","spoolman/api/v1/field.py","spoolman/api/v1/filament.py","spoolman/api/v1/models.py","spoolman/api/v1/other.py","spoolman/api/v1/router.py","spoolman/api/v1/search.py","spoolman/api/v1/setting.py","spoolman/api/v1/spool.py"],"storefront":"/r/Donkie","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/Donkie/Spoolman/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}