- Alerts shown below QuickStats without hover reveal
- Alerts also listed after usage analytics section
- Usage cost now shows cost of material consumed (unit cost * usage)
instead of all-time purchase total which was misleading
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Alerts now appear below the quick stats badges and are collapsed by
default, showing just a subtle "N alerts" indicator that expands
on mouseover.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- #42: Allow spools heavier than theoretical max (remove weight clamps)
- #43: Show filament custom fields on spool detail page
- #25: Sort spools by custom fields and remaining weight
- #35: Global search box for spool list
- #20: Gallery view for spools (color grid with progress bars)
- #36: Spool-level color override with ColorPicker
- #39: Cost analytics endpoint, total spent & avg cost/kg stats
- Fix: Filament select refresh after inline creation
- Fix: Parse temperatures from filament comments
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Extra Weight Field (#14): Track DryPods, custom holders in spool weight
calculations. New extra_weight field on spool with DB migration.
- Price/Cost Tracking: Compute remaining_value based on remaining weight
and price. Added column to spool list, inventory value on dashboard.
- Print History: Show print job history on spool detail page with
collapsible table showing filename, filament used, status, dates.
- Usage Analytics: New dashboard component with time-series chart
showing daily consumption, period selector (7/30/90 days), and
material breakdown. New API endpoints for analytics data.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add optional color column to spool list showing filament color swatches
with multi-select filtering capability.
Backend:
- GET /api/v1/color endpoint to list distinct filament colors
- filament.color_hex query param on spool list for filtering
Frontend:
- ColorFilterColumn component renders color swatches
- useSpoolmanColors() hook fetches available colors
- Filter dropdown shows swatches with hex codes
- Column hidden by default (enable via column selector)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Set data-theme attribute on body for CSS dark mode detection
- Add white border (30% opacity) to spool icons in dark mode
- Add --swatch-border-color CSS variable for consistent theming
- Dark/black filament colors now visible against dark backgrounds
Fixes upstream issue: https://github.com/Donkie/Spoolman/issues/597
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Auth enabled state now stored in database setting (auth_enabled)
- Add POST /auth/toggle endpoint to enable/disable auth from UI
- Add auth toggle section to Settings > General page
- Enabling auth without users prompts to create first admin
- Disabling auth requires admin password confirmation
- Auth setting cached in memory and loaded on startup
Removes need for SPOOLMAN_AUTH_ENABLED env var
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Backend:
- Add User model with username, hashed password, role, is_active
- Add passlib[bcrypt] and python-jose[cryptography] dependencies
- Create auth.py with JWT utilities, password hashing, role checking
- Add /auth endpoints: status, setup, login, me, users CRUD
- Add role-based permission system (viewer/operator/editor/admin)
- Environment: SPOOLMAN_AUTH_ENABLED, SPOOLMAN_AUTH_SECRET_KEY
- Migration for user table
Frontend:
- Add AuthProvider context with login/logout/setup
- Add LoginPage component with setup mode for first user
- Add ProtectedRoute wrapper for auth-required pages
- Add axios interceptor to attach JWT token to requests
- Add User Management tab in Settings (admin only)
- Add translation keys for auth UI
When SPOOLMAN_AUTH_ENABLED=true:
- Users must login to access the app
- First visit shows setup page to create admin account
- Role-based access control for future endpoint protection
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add sticky positioning to form action buttons (always visible at bottom)
- Add Ctrl+S / Cmd+S keyboard shortcut to save forms
- Create reusable useFormShortcuts hook
- Apply to all create forms: spool, filament, vendor
Fixes: https://github.com/Donkie/Spoolman/issues/274
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add remaining_weight_lt and remaining_weight_gt filter params to spool API
- Filter uses computed formula: initial_weight - used_weight (falls back to filament.weight)
- Update home page to use queryParams instead of Refine filters
- Fixes low stock badge count on dashboard
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Use 'currentPage' instead of 'current' for pagination
- Remove explicit ISpool type on filter callback (inferred)
- Add type assertion for Table dataSource
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Fix TypeScript errors by using { result, query } destructuring:
- result.data and result.total for list data
- query.isLoading for loading state
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Enhances SpoolIcon component with optional showHex prop:
- Displays hex color code next to swatch when enabled
- Click to copy hex code to clipboard
- Shows tooltip with copy hint
- Supports both single and multi-color filaments
Enabled on detail pages:
- Filament show page
- Spool show page
Added translation keys for copy feedback messages.
Closes#33
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Adds computed spool statistics to filament list:
- spool_count: Number of non-archived spools of this filament
- total_remaining_weight: Sum of remaining weight across all spools
Backend changes:
- Modified database/filament.py find() to compute stats via subquery
- Added fields to Filament pydantic model in api/v1/models.py
- Updated filament API endpoint to include stats in response
Frontend changes:
- Added fields to IFilament interface
- Added columns to filament list table
- Added translation keys
Closes#15
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replaces stat card layout with functional dashboard:
- Prominent spool count with "Add Spool" button
- Paginated list of all spools sorted by last used
- Low stock alert badge (< 100g threshold)
- Color swatch, name, material, and remaining weight columns
- Clickable rows navigate to spool detail
- Secondary stats for filaments and vendors
Closes#12
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
3dfilamentprofiles.com has Vercel bot protection blocking automated requests.
Their GitHub repo only has sample data (~3 filaments).
SpoolmanDB already has 6,957+ filaments, making this unnecessary.
Removed:
- spoolman/externaldb.py: ExternalSource enum, Filament3DFP model, 3dfp sync
- client/src/utils/queryExternalDB.ts: ExternalSource enum, source field
- client/src/components/filamentImportModal.tsx: Source filter tabs
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The integration is partial: backend/frontend exist but only sample-filaments.json
(~3 filaments) is available. Full dataset requires their parser.py or website API.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Create Print Queue page showing pending/completed/cancelled jobs
- Add needs_weighing filter to spool API for flagged spools
- Add IPrintJob interface and needs_weighing to ISpool model
- Add slicer_post_process.py for Elegoo/Orca Slicer integration
- Add translations for print queue feature
- Bump version to 0.23C.3
The workflow:
1. Slicer post-processing script creates pending print job
2. After print, user confirms (deducts filament) or cancels (flags for weighing)
3. Spools needing weigh-in are shown in Print Queue UI
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Backend for tracking print jobs from Elegoo/Orca Slicer:
- PrintJob model: tracks pending/completed/cancelled jobs
- API endpoints: create, list, complete, cancel jobs
- needs_weighing flag on Spool: for cancelled print recalibration
- Database migration for new table and column
Workflow:
1. Slicer post-processing script creates pending job
2. User completes job → auto-deducts filament
3. User cancels job → flags spool for manual weigh-in
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fixed temp range display in show page and label templates
- Added prev/next navigation buttons to edit pages
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Filament, spool, and vendor edit pages now have Prev/Next buttons
- Navigate between items without returning to the list
- Buttons are disabled at the beginning/end of the list
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- parse_temps_api.py - Parse temps via API (for remote instances)
- parse_temps_from_comments.py - Parse temps via direct DB access
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Show page now displays temp ranges (min-max) instead of single values
- Fixed label template rendering to handle multiple tags in conditional blocks
- Added "not_set" translation key
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Features in this release:
- Clickable dashboard cards
- Theme color selector (orange, teal, red, green, blue)
- Temperature range fields in filament edit page
- QR code size setting
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Dashboard cards now link to list page when clicked (except + button)
- Added theme color selector in Settings (orange, teal, red, green, blue)
- Theme persists in localStorage
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Backend:
- New /api/v1/backup/export endpoint - exports all data as single JSON
- New /api/v1/backup/import endpoint - imports JSON with merge or replace
- Handles vendors, filaments, spools, adjustments, settings
- Remaps IDs to maintain relationships during import
Frontend:
- Added Backup & Restore section to Settings page
- Download Backup button for export
- Import with merge or replace options
- Warning confirmation for replace mode
This enables migrating between PostgreSQL and SQLite databases.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Backend: Added ExternalSource enum, Filament3DFP model, and transform function
- Backend: Updated _sync() to fetch from both SpoolmanDB and 3dfilamentprofiles
- Frontend: Added source tabs to FilamentImportModal (All/SpoolmanDB/3DFP)
- Frontend: Updated ExternalFilament interface with source and temp range fields
- Frontend: Updated filament import handler to use temp range fields
Also includes:
- Dev mode styling (teal theme, DEV badge and banner)
- Translation keys for source filtering
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>