Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
64d32fe
Remove forced vertical scrollbar from location spool containers
claude Jun 29, 2026
d344773
Use configured external DB sync interval instead of hardcoded default
claude Jun 29, 2026
b0c4341
Allow including archived spools in spool export
claude Jun 29, 2026
57320f1
Publish spoolman_build_info Prometheus metric at startup
claude Jun 29, 2026
0d815c1
docs: add spoolman-mcp server to the integrations list
claude Jun 29, 2026
cb0c684
Add Docker HEALTHCHECK and a sample docker-compose.yml
claude Jun 29, 2026
c2ef30d
Reload page on 401 to recover from forward-auth proxies
claude Jun 29, 2026
d9c5c25
Handle comma decimal separators in numeric inputs
claude Jun 29, 2026
ed92758
Update client npm dependencies (upstream dependabot bumps)
claude Jun 29, 2026
a128477
Update Python dependencies cryptography and mako (upstream dependabot…
claude Jun 29, 2026
baf14b1
Address Copilot review feedback on numeric inputs and 401 handler
claude Jun 29, 2026
3379c8d
Format spoolman/main.py with ruff to fix style CI
claude Jun 29, 2026
51bb274
Include weight_delta in spool update websocket events
claude Jun 29, 2026
7e22453
Add filament import from 3dfilamentprofiles.com
claude Jun 29, 2026
d462941
Add filtering and sorting for extra/custom fields in table views
claude Jun 29, 2026
7100b86
Conform ported feature PRs to fork lint/format/type rules
claude Jun 29, 2026
9c9b47d
Fix CockroachDB extra-field filtering and address review feedback
claude Jun 29, 2026
6e2c032
Add filament calibration feature
claude Jun 29, 2026
6b905a9
Fix calibration migration for PostgreSQL/CockroachDB/MariaDB
claude Jun 29, 2026
b4ce814
Fix calibration session cascade-delete on SQLite
claude Jun 29, 2026
2eac8d0
Fix calibration migration column-drop for MySQL/MariaDB
claude Jun 29, 2026
62b0a79
Collapse calibration migrations to create filament_id directly
claude Jun 29, 2026
d756994
Fix correctness issues found in review (calibration, filtering, weigh…
sherrmann Jun 29, 2026
e8f92e3
Harden testing, CI, and Docker (unit tests, dependabot, type/i18n che…
sherrmann Jun 29, 2026
b3ed419
ci: add unit-tests, CodeQL, and Hadolint jobs
sherrmann Jun 29, 2026
3824431
Cleanup and minor-correctness pass from review
sherrmann Jun 29, 2026
c25e0dd
ci: satisfy hadolint on the Dockerfile
claude Jun 29, 2026
e09812c
Deduplicate the entity-type -> extra-field-table mapping
sherrmann Jun 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,19 @@ client/node_modules
*.pyc
*.swp
__pycache__

# Version control and editor/IDE metadata
.git
.github
.vscode
.idea

# Test artifacts and suites (not needed for the image build)
.pytest_cache
tests
tests_integration

# Environment files (keep the example for reference)
.env
.env.*
!.env.example
10 changes: 10 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
version: 2
updates:
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "weekly"
- package-ecosystem: "npm"
directory: "/client"
schedule:
interval: "weekly"
58 changes: 58 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,64 @@ jobs:
- name: Run pre-commit
run: uv run lefthook run ci
#
# Fast (non-Docker) Python unit tests + coverage
#
unit-tests:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6

- name: Install uv
uses: astral-sh/setup-uv@v7
with:
version: "0.9.26"

- name: "Set up Python"
uses: actions/setup-python@v6
with:
python-version-file: "pyproject.toml"

- name: Run unit tests
run: uv run pytest tests/ --cov=spoolman --cov-report=term-missing
#
# Static analysis with CodeQL
#
codeql:
runs-on: ubuntu-latest
permissions:
security-events: write
strategy:
fail-fast: false
matrix:
language: ["python", "javascript-typescript"]
steps:
- name: Checkout
uses: actions/checkout@v6

- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}

- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
with:
category: "/language:${{ matrix.language }}"
#
# Lint the Dockerfile with hadolint
#
hadolint:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6

- name: Lint Dockerfile
uses: hadolint/hadolint-action@v3.1.0
with:
dockerfile: ./Dockerfile
#
# Build the Spoolman client for baking into the docker images
# This is done on native hardware to speed things up, vite is very slow on emulated hardware
#
Expand Down
11 changes: 11 additions & 0 deletions .hadolint.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# hadolint configuration
#
# DL3008 (pin apt package versions) and DL3013 (pin pip package versions) are
# ignored on purpose. The image is built on the rolling `python:3.x-slim-bookworm`
# base, whose apt package index moves over time; pinning exact apt/pip versions
# would break the build as soon as those versions are superseded in the index.
# Real Python dependencies are already locked via uv.lock, so reproducibility is
# handled there rather than by pinning the build-time toolchain packages.
ignored:
- DL3008
- DL3013
13 changes: 11 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ ENV UV_NO_DEV=1
ENV UV_PYTHON_DOWNLOADS=0

# Install system dependencies
RUN apt-get update && apt-get install -y \
RUN apt-get update && apt-get install -y --no-install-recommends \
g++ \
python3-dev \
libpq-dev \
Expand Down Expand Up @@ -38,7 +38,7 @@ LABEL org.opencontainers.image.description="Keep track of your inventory of 3D-p
LABEL org.opencontainers.image.licenses=MIT

# Install gosu for privilege dropping
RUN apt-get update && apt-get install -y \
RUN apt-get update && apt-get install -y --no-install-recommends \
gosu \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
Expand Down Expand Up @@ -74,4 +74,13 @@ RUN echo "GIT_COMMIT=${GIT_COMMIT}" > build.txt \

# Run command
EXPOSE 8000

# Add healthcheck to verify the API is responsive using the internal Python interpreter
HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \
CMD python3 -c "import os, urllib.request; \
port = os.getenv('SPOOLMAN_PORT', '8000'); \
base = os.getenv('SPOOLMAN_BASE_PATH', '').strip('/'); \
path = f'/{base}/api/v1/health'.replace('//', '/'); \
urllib.request.urlopen(f'http://localhost:{port}{path}', timeout=5)" || exit 1

ENTRYPOINT ["/home/app/spoolman/entrypoint.sh"]
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ Spoolman is a self-hosted web service designed to help you efficiently manage yo
* [OctoPrint](https://github.com/mdziekon/octoprint-spoolman)
* [OctoEverywhere](https://octoeverywhere.com/spoolman?source=github_spoolman)
* [Home Assistant](https://github.com/Disane87/spoolman-homeassistant)
* [MCP Server](https://github.com/Disane87/spoolman-mcp) - Manage your filament inventory through AI assistants like Claude using the Model Context Protocol

**Web client preview:**
![image](https://github.com/Donkie/Spoolman/assets/2332094/33928d5e-440f-4445-aca9-456c4370ad0d)
Expand Down
1 change: 1 addition & 0 deletions client/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
.env.development.local
.env.test.local
.env.production.local
.env.production

npm-debug.log*
yarn-debug.log*
Expand Down
Loading
Loading