Commit Graph
1981 Commits
Author SHA1 Message Date
maziggy f3b2a24fa0 Fix external folder scan 500 on 3MF files (#846)
scan_external_folder stored raw 3MF metadata containing _thumbnail_data
  bytes directly in the JSON column, causing a serialization error. Applied
  the same clean_metadata() pattern used by upload/zip extraction and
  removed the call to the non-existent parser.extract_thumbnail().
2026-03-30 08:36:39 +02:00
maziggy 86693b4f75 Fix archives capped at 50 items, add pagination (#843)
The archives page only fetched the 50 most recent prints due to a
  hardcoded API limit default. Added client-side pagination with
  configurable page sizes (25/50/100/200/All) and bumped the fetch
  limit to return all archives. Page size is persisted to localStorage.
2026-03-30 08:27:34 +02:00
maziggy eaf0a1c281 Add queue timeline view, visual refresh, and fix plate thumbnail auth
Queue page redesign: compact stats bar replaces summary cards, color-
  coded left borders for status scanning, collapsible history with
  condensed rows, and a new production schedule timeline view (#823)
  showing estimated completion times grouped by hour with filter tabs
  and day navigation. i18n keys added for all 7 languages.

  Fix plate thumbnails returning 401 in print modal when auth is enabled
  (missing stream token). Fix schedule calendar picker opening off-screen
  (hidden input positioned with sr-only instead of near the date field).
2026-03-28 13:45:37 +01:00
maziggy 24a5217d46 Fix filament usage not recorded when auto-archive is disabled
on_print_complete returned early when no archive_id was found (auto-
  archive off), skipping both internal inventory tracking (AMS remain%
  deltas) and Spoolman usage reporting. Moved the filament usage tracking
  block to run before the archive_id early-return so consumption is
  always recorded regardless of the auto-archive setting.
2026-03-28 12:30:45 +01:00
maziggy 68dce24cc9 Add staggered batch start for multi-printer queue jobs (#752)
When adding a print to the queue for multiple printers, users can now
  enable "Stagger printer starts" to avoid power spikes from simultaneous
  bed heating. Configurable group size and interval — first group starts
  immediately (ASAP) or at scheduled time, subsequent groups get offset
  scheduled_time values. No backend queue/scheduler changes — leverages
  existing scheduled_time field.

  Also adds a dedicated Queue tab in Settings (stagger defaults + auto-
  drying moved from Filament tab), i18n keys for all 7 locales, frontend
  and backend tests.
2026-03-28 12:11:22 +01:00
maziggy a4b927f2d2 Fix SpoolBuddy add-to-inventory, dashboard crash, and kiosk display issues
- Round scale weight to integer before sending to backend (Pydantic
    rejects non-whole floats for int fields), move modal close to finally
    block, add error toast with actual API message
  - Fix null-field crash in SpoolInfoCard prop construction: pick one
    source object instead of per-field ?? fallbacks that crash when
    displayedSpool has null subtype/brand/rgba and matchedSpool is null
  - Add React ErrorBoundary to App so crashes show error instead of
    black screen
  - Remove --max-old-space-size=128 and --enable-low-end-device-mode
    from kiosk Chromium flags (crashed renderer/display)
  - Append kiosk flags to Pi GPU defaults instead of resetting them
  - Add wlr-randr keep-alive and screenBlankTimeout=0 to prevent
    display blanking on labwc 0.9.x
  - Fix tests: add ToastProvider to Dashboard test wrapper, update
    StatusBar tests for removed animate-pulse class
2026-03-28 10:51:51 +01:00
maziggy 208793c934 Fix swapped nozzle comment and update changelog for 0.2.2.2 release (#836)
Corrected left/right nozzle labels in ams_mapping2 comment
  (255=main/right, 254=deputy/left). Added [0.2.2.2] release header
  and #836 changelog entry noting the nozzle routing fix was already
  included via the #797 ams_mapping2 format change.
2026-03-28 09:25:34 +01:00
maziggy a077fd138d Fix native install misdetected as Docker in LXC containers
The _is_docker_environment() fallback assumed Docker when .git/ was
  absent, which is also true for native installs in Proxmox LXC
  containers. Replace the .git/ fallback with a check of
  /run/systemd/container (only matches docker/podman/oci, not lxc).
2026-03-27 14:35:08 +01:00
maziggy 09ebac1c09 Reduce SpoolBuddy kiosk idle CPU load from ~3.3 to ~0.9
Frontend: replace expensive idle dashboard animations (3x animate-ping
  with scale transforms, blur-2xl glow, continuous animate-pulse on
  status dots) with static NFC rings and slow 5s color-cycling spool.
  Chromium: add --disable-extensions, --disable-background-timer-throttling,
  --memory-pressure-off, --disable-renderer-backgrounding, --disable-breakpad,
  and --js-flags=--max-old-space-size=128. Install script: mask stripped
  services (not just disable) to prevent socket/dbus reactivation; use
  /etc/systemd/user/ global overrides for user services instead of
  unreliable su-based systemctl --user. Remove chromium/upower from
  strip_packages since kiosk reinstalls them immediately.
2026-03-27 14:04:11 +01:00
maziggy 5fe4134d86 Reduce SpoolBuddy kiosk CPU/memory pressure
Add Chromium flags to cut overhead on Pi: disable extensions, crash
  reporter, background timer throttling, renderer backgrounding, and cap
  V8 heap at 128MB. Mask (not just disable) stripped system services to
  prevent socket/dbus reactivation, and add xdg-permission-store to the
  disable list. Remove chromium and upower from strip_packages since the
  kiosk needs them — they were being uninstalled then immediately
  reinstalled on every run.
2026-03-27 13:32:49 +01:00
maziggy 70382ec55c Add Chromium flags to cut overhead on Pi: disable extensions, crash
reporter, background timer throttling, renderer backgrounding, and cap
  V8 heap at 128MB. Also mask (not just disable) stripped system services
  to prevent socket/dbus reactivation, and add xdg-permission-store to
  the disable list.
2026-03-27 13:28:12 +01:00
maziggy 3887938e8f Security: add token-based auth for all media endpoints
Camera streams, snapshots, thumbnails, timelapse videos, photos, QR
  codes, and cover images served via <img>/<video> tags were previously
  unauthenticated because browser media elements cannot send Authorization
  headers. When auth is enabled, these endpoints are now protected by a
  reusable stream token (?token=xxx) obtained from POST
  /printers/camera/stream-token (requires CAMERA_VIEW permission).
2026-03-27 12:58:08 +01:00
maziggy 7a0ea8faed Revert " Optimize SpoolBuddy kiosk performance on Raspberry Pi"
This reverts commit 24cda842af.
2026-03-27 12:00:14 +01:00
maziggy a8b50e809f Optimize SpoolBuddy kiosk performance on Raspberry Pi 2026-03-27 11:45:28 +01:00
maziggy 24cda842af Optimize SpoolBuddy kiosk performance on Raspberry Pi
Replace Chromium with cog (WPE WebKit) for the kiosk browser. Cog is
  purpose-built for embedded kiosk displays with a fraction of Chromium's
  CPU and memory footprint on Pi hardware.

  Add React Query `select` to SpoolBuddyLayout and SpoolBuddyDashboard
  printer status queries so only `connected` is extracted. Temperature,
  fan, and progress changes no longer trigger re-renders on every MQTT
  tick.

  Expand service/package stripping to disable pipewire audio stack, CUPS
  printing, rpcbind, upower, polkit, accounts-daemon, xdg-desktop-portal,
  and mpris-proxy. Add user-level service masking for pipewire/portals.

  Update SSH update cache clearing to handle both WPE WebKit and legacy
  Chromium cache paths.
2026-03-27 11:43:55 +01:00
maziggy f9ae9f83cc Optimize SpoolBuddy kiosk performance on Raspberry Pi
Chromium: override Debian defaults via /etc/chromium.d/spoolbuddy-kiosk
  to disable GPU rasterization, enable low-end device mode, and disable
  smooth scrolling/background networking. The system default
  --enable-gpu-rasterization conflicted with per-launch flags.

  WebSocket: add React Query `select` to SpoolBuddyLayout and
  SpoolBuddyDashboard printer status queries so only `connected` is
  extracted. Temperature/fan/progress changes no longer trigger
  re-renders on every MQTT tick (~10/sec idle).

  Services: expand install script to strip pipewire, CUPS, rpcbind,
  upower, polkit, accounts-daemon, xdg-desktop-portal, mpris-proxy.
  Add user-level service masking for pipewire/portals.
2026-03-27 11:37:15 +01:00
maziggy 54c67f9e4e Optimize SpoolBuddy kiosk performance on Raspberry Pi
Override Debian's default Chromium flags via /etc/chromium.d/spoolbuddy-kiosk
  to disable GPU rasterization, enable low-end device mode, and disable smooth
  scrolling/background networking. The system default --enable-gpu-rasterization
  conflicted with per-launch flags — the new config replaces all system defaults
  so kiosk flags take effect cleanly.

  Expand service/package stripping to disable pipewire audio stack, CUPS
  printing, rpcbind, upower, polkit, accounts-daemon, xdg-desktop-portal,
  and mpris-proxy. Add user-level service masking for pipewire/portals
  that system-level disable misses.
2026-03-27 10:44:58 +01:00
maziggy 26c2549a56 Optimize SpoolBuddy kiosk performance on Raspberry Pi
Add Chromium performance flags (disable-gpu-rasterization,
  enable-low-end-device-mode, disable-smooth-scrolling,
  disable-background-networking, disable-dev-shm-usage) to reduce
  CPU load from ~54% to manageable levels on Pi 4B.

  Expand service/package stripping to disable pipewire audio stack,
  CUPS printing, rpcbind, upower, polkit, accounts-daemon,
  xdg-desktop-portal, and mpris-proxy. Add user-level service
  masking for pipewire/portals that system-level disable misses.
2026-03-27 10:26:56 +01:00
maziggy 866103bb96 Fix ruff format check for spool_assignment_notifications.py 2026-03-27 09:33:28 +01:00
maziggy 3dbfda9661 @renovate - Bump minimatch to 10.2.5 2026-03-27 08:44:31 +01:00
maziggy 886fb90339 Fix print failing on files with spaces in filename (#824)
Filenames with spaces (e.g. "Junktion Box PRO 90.3mf") broke the MQTT
  print command because the url field (ftp://file name.3mf) contained
  unencoded spaces the firmware can't parse. FTP upload succeeded but the
  printer silently ignored the command and stayed IDLE. Replace spaces
  with underscores in the remote filename before upload and print command.
2026-03-27 08:38:08 +01:00
maziggy 6b93cf806e Fix SpoolBuddy virtual keyboard layout and number input support
Virtual keyboard now participates in flex layout instead of fixed
  overlay, eliminating dead space between content and keyboard. Bottom
  nav and status bar hide when keyboard is open. Number inputs (e.g.
  Weight field on Write Tag) now accept virtual keyboard input.
2026-03-27 08:29:48 +01:00
maziggy c6f62f9cd9 Add persistent auto-off option for smart plugs (#826)
Auto-off now has a "Keep Enabled" toggle that keeps it active between
  prints instead of disabling after each use (one-shot). Useful for HA
  accessories like BentoBox filters that should always power off after
  prints. Default behavior (one-shot) is unchanged.
2026-03-27 07:50:47 +01:00
maziggy 94c6696469 Add Ukrainian Hryvnia to known currencies (#815) 2026-03-26 17:25:35 +01:00
maziggy a05b880a0b Fixed backend/tests/unit/test_spoolbuddy_system_stats.py 2026-03-26 16:35:29 +01:00
Keybored eb3450b1d0 Spoolbuddy init and diagnostic improvements (#814)
Spoolbuddy init and diagnostic improvements (#814)
2026-03-26 16:16:09 +01:00
maziggy b75f65fe64 Fix SpoolBuddy low filament warning missing slot number
Status bar showed "AMS B" instead of specific slot like "B2". Now uses
  formatSlotLabel with tray index to display the full slot label.
2026-03-26 15:56:59 +01:00
maziggy 9c6a374843 Add SpoolBuddy Inventory page to kiosk UI
Catalog-style spool grid with colored spool circles (matching AMS page
  style), material/subtype labels, color dots, fill level bars, remaining
  weight percentages, and AMS location badges. Touch-friendly search bar
  and inline filter pills (All, In AMS, per-material). Full-screen detail
  view with slicer filament, PA K-profiles, weight breakdown, temperature,
  cost, tag ID, AMS assignment, and notes — updates live from query data.
  Shows Spoolman iframe when Spoolman is enabled. Navigation item added
  between Write and Settings in the bottom bar.
2026-03-26 15:28:32 +01:00
maziggy 0969ec0a59 Add SpoolBuddy Inventory page to kiosk UI
Catalog-style spool grid with colored spool icons, material/subtype
  labels, color dots, remaining weight percentages, and AMS location
  badges. Search bar with inline filter pills (All, In AMS, per-material).
  Detail bottom sheet on tap. Shows Spoolman iframe when enabled.
  Navigation item added between Write and Settings in the bottom bar.
2026-03-26 15:11:03 +01:00
maziggy c834a0bd00 Add SpoolBuddy Inventory page to kiosk UI
New page at /spoolbuddy/inventory with compact 2-column spool card grid,
  search bar, material filter chips, sort options, and tap-to-open detail
  sheet. Shows Spoolman iframe when Spoolman is enabled. Navigation item
  added between Write and Settings in the bottom bar.
2026-03-26 15:04:41 +01:00
maziggy 161015a577 Fix rapid MQTT disconnect/reconnect bouncing (#813)
The stale connection fix force-closed the socket on every frontend
  status poll, causing a tight close→reconnect→stale→close loop. Added
  a 30-second cooldown between stale reconnect attempts so paho has time
  to re-establish the connection. Also added reconnect backoff (1-30s)
  and unique-per-process MQTT client IDs to prevent broker session
  takeovers.
2026-03-26 14:33:23 +01:00
maziggy 7841d2f997 Housekeeping 2026-03-26 14:20:11 +01:00
maziggy ba991702e5 Housekeeping 2026-03-26 14:08:10 +01:00
maziggy ac75d4957f Changed pipeline 2026-03-26 13:52:52 +01:00
dependabot[bot] 27bf1a4e28 Bump picomatch in /frontend in the npm_and_yarn group across 1 directory (#821)
Bumps the npm_and_yarn group with 1 update in the /frontend directory: [picomatch](https://github.com/micromatch/picomatch).


Updates `picomatch` from 4.0.3 to 4.0.4
- [Release notes](https://github.com/micromatch/picomatch/releases)
- [Changelog](https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/picomatch/compare/4.0.3...4.0.4)

---
updated-dependencies:
- dependency-name: picomatch
  dependency-version: 4.0.4
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-26 13:39:25 +01:00
maziggy 6c2df27860 Fix MQTT connected/disconnected UI bouncing caused by stale reconnect
The stale connection fix (6ac375a) force-closed the socket to trigger
  paho reconnect, but paho's disconnect callback redundantly broadcast
  state changes, causing rapid connected/disconnected cycling in the UI.
  Now sets a flag before the force-close so _on_disconnect skips the
  redundant broadcast. Also relaxed keepalive from 15s to 30s — the
  aggressive interval caused spurious disconnects on transient hiccups.

  Moved _disconnection_event.set() to the top of _on_disconnect so no
  early-return filter can prevent it from unblocking disconnect() callers.

  Removed leftover debug payload dump.
2026-03-26 13:32:38 +01:00
maziggy e4999f48fb Polish SpoolBuddy boot splash and reduce initramfs rebuilds
New splash shows only the SpoolBuddy logo with green glow bloom,
  radial gradient, light rays, and vignette. Removed Bambuddy branding.
  Includes generator script for easy customization.

  Defers initramfs rebuild during install until after Plymouth theme
  is configured, avoiding redundant rebuilds from apt hooks.
2026-03-26 13:05:20 +01:00
maziggy 12c2b57962 Polish SpoolBuddy boot splash and reduce initramfs rebuilds
New splash shows only the SpoolBuddy logo with green glow bloom,
  radial gradient, light rays, and vignette. Removed Bambuddy branding.
  Includes generator script for easy customization.

  Defers initramfs rebuild during install until after Plymouth theme
  is configured, avoiding redundant rebuilds from apt hooks.
2026-03-26 13:00:06 +01:00
maziggy b1f2670058 Revert install.sh to Plymouth, keep polished splash
Reverts the fim/fbi experiment — Plymouth is the only splash tool
  that reliably handles Pi KMS/DRM from early boot. install.sh is
  restored to the original Plymouth setup. The new polished splash
  image and generator script are kept.
2026-03-26 12:52:14 +01:00
maziggy dd6b022bba Polish SpoolBuddy boot splash image
New splash shows only the SpoolBuddy logo with baked-in green glow,
  radial gradient background, subtle light rays, and vignette effects
  (66KB vs 205KB). Removed Bambuddy branding. Includes generator
  script for easy customization.
2026-03-26 12:48:07 +01:00
maziggy 58b5e3ae09 Replace Plymouth with fim for SpoolBuddy boot splash
Plymouth ran as a persistent daemon throughout boot, consuming memory
  and competing for framebuffer allocation. fim renders via DRM (Pi KMS
  doesn't expose a usable legacy framebuffer), displays the image, and
  exits — zero ongoing resource cost.

  New splash image shows only the SpoolBuddy logo with baked-in glow,
  radial gradient, light rays, and vignette effects (66KB vs 205KB).
  Install script auto-purges Plymouth on existing installs in a single
  pass to avoid redundant initramfs rebuilds.
2026-03-26 12:22:29 +01:00
maziggy 387aafaee4 Replace Plymouth with fbi for SpoolBuddy boot splash
Plymouth ran as a persistent daemon throughout boot, consuming memory
  and competing for framebuffer allocation. fbi writes pixels directly
  to the framebuffer and exits — zero ongoing resource cost.

  New splash image shows only the SpoolBuddy logo with baked-in glow,
  radial gradient, light rays, and vignette effects (66KB vs 205KB).
  Install script auto-purges Plymouth on existing installs in a single
  pass to avoid redundant initramfs rebuilds.
2026-03-26 12:10:42 +01:00
maziggy 4c7141f738 Replace Plymouth with fbi for SpoolBuddy boot splash
Plymouth ran as a persistent daemon throughout boot, consuming memory
  and competing for framebuffer allocation. fbi writes pixels directly
  to the framebuffer and exits — zero ongoing resource cost.

  New splash image shows only the SpoolBuddy logo with baked-in glow,
  radial gradient, light rays, and vignette effects (66KB vs 205KB).
  Install script auto-removes Plymouth on existing installs.
2026-03-26 12:03:49 +01:00
maziggy fa705102b4 Fix slot picker stretched and double scroll in Assign Spool modal
Narrowed CSS selector to only target max-w-2xl modals (Assign Spool)
  not max-w-sm ones (slot action picker). Removed inner max-h-96 on
  the spool grid to eliminate nested scrollbars.
2026-03-26 11:46:05 +01:00
maziggy e7c81e3f08 Fix Assign Spool modal clipping on SpoolBuddy display
CSS rules scoped via data-spoolbuddy-kiosk force the modal panel to
  90vh with flex column layout. Content area scrolls, header/footer
  pinned. Uses height (not just max-height) so flex-basis auto works
  correctly. No flash — CSS applies before paint.
2026-03-26 11:40:44 +01:00
maziggy eed1498d40 Fix Assign Spool modal clipping on SpoolBuddy display
useEffect in SpoolBuddyAmsPage applies inline styles to the modal
  panel after render (requestAnimationFrame + setTimeout) to cap it
  at 90vh with scrollable content. Targets the DOM directly to avoid
  CSS specificity issues with Tailwind v4.
2026-03-26 11:36:35 +01:00
maziggy e0f0718dfc Fix Assign Spool modal clipping on SpoolBuddy display
Used a ref callback wrapper in SpoolBuddyAmsPage to directly apply
  inline styles (max-height 90vh, flex column, scrollable content) to
  the shared AssignSpoolModal DOM elements without modifying the
  shared component.
2026-03-26 11:29:22 +01:00
maziggy d4a997db34 Fix Assign Spool modal clipping on SpoolBuddy display
Added data-spoolbuddy-kiosk attribute to the SpoolBuddy layout and
  global CSS rules that cap modals at 90vh with scrollable content on
  the small touchscreen, without modifying shared components.
2026-03-26 11:26:12 +01:00
maziggy 702b201aa6 Fix Assign Spool modal clipping on SpoolBuddy display
Added scoped CSS in SpoolBuddyAmsPage that constrains the shared
  AssignSpoolModal to 90vh with scrollable content and pinned
  header/footer, without modifying the shared component.
2026-03-26 11:22:15 +01:00
maziggy 1b0c97538f Fix Assign Spool modal clipping on SpoolBuddy display
Added scoped CSS in SpoolBuddyAmsPage that constrains the shared
  AssignSpoolModal to 90vh with scrollable content, without modifying
  the shared component used by the main Bambuddy frontend.
2026-03-26 11:18:34 +01:00