dyadmisha

dyadmisha synced commits to main at dyadmisha/dune-weaver from mirror

  • 7ddb7f6067 fix: correct VERSION to 4.1.4 and add release tag guard (#141) The v4.1.3 and v4.1.4 tags were both cut before their version bump commits landed, so each release shipped the previous release's number in VERSION. Since the web UI reports the current version by reading VERSION and comparing it to the latest GitHub release tag, 4.1.4 users saw themselves as 4.1.3 with a permanent "update available" prompt -- their updates had in fact succeeded. Correct VERSION to 4.1.4 and add a version-check workflow that fails any release tag whose VERSION file doesn't match, so the drift can't recur silently. Verified against history: the guard fails v4.1.3 and v4.1.4 and passes v4.1.1 and v4.1.2. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

3 days ago

dyadmisha synced commits to v4.1.4 at dyadmisha/dune-weaver from mirror

4 days ago

dyadmisha synced new reference v4.1.4 to dyadmisha/dune-weaver from mirror

4 days ago

dyadmisha synced commits to main at dyadmisha/dune-weaver from mirror

  • 66f59b8630 chore: sync frontend lockfile with GPL-3.0 license field Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
  • 099ed30b9c fix(mqtt): allow custom client ID override, stop writing literal default (#125) Rebased onto main's random-suffix client ID generation: - set_mqtt_config no longer stores the literal 'dune_weaver' when the field is empty (which shadowed auto-generation until restart) - Settings UI gains an optional Client ID field; empty = auto-generated unique ID, so multiple tables no longer kick each other off the broker Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
  • 73139b99d9 fix(mqtt): apply clear pattern when selecting a single pattern (#123) This fixes an inconsistency in MQTT behavior between single pattern runs and playlist runs. Before this change, selecting a pattern from Home Assistant started that pattern directly, even if a clear pattern was configured. The clear pattern setting was only respected when starting a playlist. Now the single-pattern MQTT path passes the configured clear_pattern into run_pattern, so both flows behave the same way. If clear_pattern is set to none, behavior stays unchanged.
  • ea8477a2a3 fix(backend): re-shuffle playlists on each repeat cycle (#139) Shuffle ran once before the playlist loop, so playlists in a repeat mode played the same random order on every cycle: shuffle appeared to work on the first pass and then froze. Move the shuffle to the top of each cycle so every pass through a repeating playlist gets a fresh order. Single-pass playlists still shuffle exactly once. Adds unit coverage for both, and drops two unused imports flagged by ruff in the touched test file. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
  • 51eee178a2 fix(backend): repeat playlists when run_mode is loop (#138) Auto-play and MQTT start playlists with run_mode=loop, but run_theta_rho_files only restarted the playlist when run_mode was indefinite (the value the manual Run Playlist dialog sends). As a result, auto-play playlists ran a single pass and stopped instead of looping. Accept both repeat spellings in the restart check and add unit coverage for the single/indefinite/loop run modes (loop fails without the fix). Also drop two unused imports flagged by ruff in the touched test file. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
  • View comparison for these 5 commits »

4 days ago

dyadmisha synced commits to backend-fluidnc-http at dyadmisha/dune-weaver from mirror

  • b741afbc06 docs(touch): refresh Usage section for the reworked app Drop the stale swipe-navigation / WebSocket / Clear In-Out quick-action descriptions: navigation is bottom tabs, status is polled over HTTP, and clear modes are chips on the pattern detail page. Add the key Python modules to the project-structure tree. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
  • 64d0cd6c0b docs: update README for the 5.0 firmware-delegated architecture The board now executes patterns on its own over Wi-Fi/HTTP (no USB, no G-code streaming); the Pi backend is the web UI + ecosystem layer. Point firmware references at the dune-weaver-firmware fork and refresh the LED, multi-table discovery, and firmware-OTA feature bullets. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
  • View comparison for these 2 commits »

4 days ago

dyadmisha synced commits to backend-fluidnc-http at dyadmisha/dune-weaver from mirror

  • 3912fcb84d fix: light-mode preview contrast + resolve board SD paths to host catalog - Light-mode pattern previews deepen to #7A5A2E (same sand hue, 6:1 contrast on the paper card) — thin lines were washing out at #A87F45. Dark mode unchanged. - _from_sd_path now re-finds the playing pattern in the host catalog (path suffix, then unique basename — the reverse of make_sd_path_resolver) when the board-reported SD path doesn't exist locally, so Now Playing previews, play history, and favorites work for custom patterns that upload to the SD patterns/ root. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
  • d0fae4a477 release: Dune Weaver 5.0.0 Finish the 5.0 release work on the FluidNC HTTP backend branch: - Touch app rework: themed component set (ChoiceChip, DwSlider, DwSwitch, Icon, SectionLabel, SettingsCard), bundled fonts, supersampled sand-hued pattern previews with local-catalog rendering, page-level redesign - Frontend: Table Wi-Fi management card, crash-homing orientation aligner dialog, firmware LED ring preview, sand-tinted pattern previews (previews now match the mobile/touch golden sand hue instead of reading white) - Backend: firmware OTA updater module, board Wi-Fi/password/log endpoints, reconnect watchdog and mDNS relocate refinements, test updates - Bump VERSION to 5.0.0; ignore the harvested board_log.txt runtime artifact Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
  • View comparison for these 2 commits »

5 days ago

dyadmisha synced commits to backend-fluidnc-http at dyadmisha/dune-weaver from mirror

  • 3857993ed6 MAESTRO: frontend retheme pass 4 — tint pattern previews to theme foreground Replace the approximate invert/sepia dark-mode filter with numerically solved filter chains that recolor the black-ink preview webps exactly to the shared foreground tokens (#292219 day, #F2EAD9 night) — the web equivalent of the mobile app's tintColor. Verified pixel-identical (max 0.2/255 deviation) against a canvas source-in tint reference. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
  • 6acf161544 MAESTRO: frontend retheme pass 3 — palette-driven canvas sim, PlaylistsPage display type - BrowsePage preview simulation canvas now reads colors from the theme tokens (basalt/walnut ground, bone stroke) instead of hardcoded neutral grays; position marker is the live-teal glowing ball instead of stock blue, matching the mobile app's live treatment - font-display (Bricolage Grotesque) on PlaylistsPage headings, playlist names, and pattern-name labels, matching BrowsePage Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
  • 442245ec54 MAESTRO: frontend retheme pass 2 — semantic tokens, display type, outlined-ember destructive - Replace stock blue/green/red/yellow classes with semantic tokens (success/primary/destructive) in WiFiSetupPage, UpdateDialog, BrowsePage - Destructive button variant: outlined ember instead of filled red, matching mobile (stop reads as boundary, not rival CTA) - font-display (Bricolage Grotesque) on CardTitle/DialogTitle/SheetTitle primitives and BrowsePage headings + pattern names - Dark-mode pattern previews warmed toward Bone instead of stark invert Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
  • ae8b32f614 MAESTRO: frontend design foundation — Basalt/Dune palette, Bricolage + Plex Mono type roles Retheme the web frontend to the shared 'table at night' design language (token source: dune-weaver-mobile/src/theme/index.ts): - index.css @theme/.dark rewritten to day/night sand palettes; new live/success/card-elevated/input-background tokens - body -> system face; Bricolage Grotesque (display) + IBM Plex Mono (telemetry) self-hosted via fontsource; Jakarta/Noto imports dropped - PWA theme-color -> basalt #171310 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
  • 47b822a29b fix(mqtt): apply clear pattern when selecting a single pattern (#123) Adapted from PR #123 onto the firmware-delegated execution path: run_pattern's clear_pattern kwarg now maps to the $Sand/Run clear mode via map_clear_mode, so the HA-configured clear pattern runs before a single pattern, matching the web UI's pre_execution behavior. (cherry picked from commit ef7771464bbaba39d24dfb7c0c59a82aa7863418) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
  • View comparison for these 5 commits »

5 days ago

dyadmisha synced commits to backend-fluidnc-http at dyadmisha/dune-weaver from mirror

  • 9fe64d2cce feat(touch): wire touch app directly to FluidNC firmware HTTP API Replace the dune-weaver host FastAPI dependency with direct communication to the headless FluidNC sand-table firmware. The QML interface (properties/slots/signals) is preserved unchanged. - firmware_client.py: shared async HTTP client singleton (status, $-commands, /sand_* routes, /upload file-ops, LED + clear-mode maps) - discovery.py: mDNS auto-discovery of _http._tcp tables (model=dune-weaver) - thr_preview.py: render .thr polar paths to cached PNG previews - backend.py: WebSocket status -> /sand_status polling; all actions remapped to firmware; local screen/LCD control kept - models: PatternModel/PlaylistModel now firmware-backed - requirements (+zeroconf), .env.example, run.sh, README, .gitignore - FIRMWARE_MIGRATION.md: progress notes, mapping decisions, follow-ups Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
  • 613070a8ce feat: delegate all execution to FluidNC firmware; drop serial and host GPIO LEDs Rework the backend into a thin proxy + status observer over the FluidNC firmware HTTP API. The board now owns kinematics, .thr playback, playlist sequencing, pre-execution clears, quiet hours, auto-home and homing; the backend's job is the continuous/historical layer the headless firmware omits (previews, play history, MQTT/HA, WLED, mDNS multi-table, file management). Execution (new modules/core/execution.py): - Command proxy: run_pattern ($Sand/Run), start_playlist ($Playlist/* NVS + $Playlist/Run, idle-gated so run-while-running stops first), stop/pause/ resume/skip, set_speed, move_polar. - translate_status(): pure /sand_status -> /ws/status mapping (strips GRBL substate suffixes like "Hold:0"). - BoardObserver: single poll loop (1s active / 2s idle) that logs play history on file transitions, runs the clear-speed shim, the WLED quiet-hours watcher, and broadcasts. Replaces the host sequencing loop, board_status_poller and broadcast_progress. Removed (~1900 lines): pattern_manager execution core + MotionControlThread, playlist_manager.run_playlist, state stop/skip event machinery and the serial/kinematics/dw_led/auto_play fields, fluidnc_config.py, the dw_leds NeoPixel stack, the debug-serial block, /api/fluidnc/*, /controller_restart, SetupPage.tsx. Live queue editing dropped (/reorder_playlist + /add_to_queue removed; NowPlayingBar queue read-only; dnd-kit removed). Serial terminal replaced by a firmware command console (POST /api/board/command). Dropped pyserial and all Adafruit/RPi GPIO deps. Settings: board NVS is canonical for table-behavior settings shared with the mobile apps. New modules/core/board_settings.py syncs auto-play on boot ($Playlist/Autostart*), Still Sands quiet hours ($Sands/*), the board clock, and mirrors playlists/clear files to the board SD. Web Settings adapted from the mobile app; "Device Connection" is now a board-address field. LEDs: new board provider (modules/led/board_led_controller.py) drives the table's own ring via the firmware, duck-typed to the existing /api/dw_leds/* contract. Added the firmware-native "ball" tracker (blob that follows the sand ball) with blob/background colour, brightness, direction, alignment, glow size and background sub-effect; all params persist to board NVS. WLED kept; host GPIO NeoPixels removed. Also: atomic metadata-cache writes (fixes truncation on kill mid-write that forced full preview regeneration). Verified live on the FluidNC board and via unit tests (143 passing). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
  • e317f0ed10 chore: add generated pattern previews and time-based LED brightness script Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
  • 4b852bcbe0 feat: drive FluidNC board over HTTP instead of streaming G-code The backend now delegates pattern execution to the FluidNC firmware: FluidNCClient talks to the board's HTTP API ($SD/Run + /sand_status polling) instead of streaming coordinates over serial/websocket with Python-side kinematics. Adds a configurable board_url in state, an idle-rate board status poller, and reworks the connection manager and pattern manager accordingly. main.py also wires mDNS discovery into the app lifecycle and adds GET /api/discovered-tables. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
  • fa9b74d937 feat: mDNS auto-discovery of tables Each backend advertises itself as _dune-weaver._tcp.local. and browses for peers (modules/core/mdns_discovery.py, best-effort if zeroconf is missing). The frontend merges live peers into the table selector: an mDNS announcement marks a saved table online and refreshes its URL (heals DHCP address changes), and switching to a discovered table persists it to known-tables first. Clearer error when the entered address is a controller board rather than a Dune Weaver server. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
  • View comparison for these 10 commits »

1 week ago

dyadmisha synced new reference backend-fluidnc-http to dyadmisha/dune-weaver from mirror

1 week ago

dyadmisha synced commits to main at dyadmisha/AI-on-the-edge-device from mirror

  • 384079b5d4 Merge pull request #4135 from SybexX/main Update submodules, Refactor OTA update process and clean up code
  • 54a04174c1 Update submodules
  • ca3beaea1c Refactor OTA update process and clean up code
  • ef85bb100e Refactor OTA update process and clean up code Refactored OTA update handling and removed unused code. Improved error handling and logging during firmware updates.
  • View comparison for these 4 commits »

1 week ago

dyadmisha synced commits to frontend-audit-fixes at dyadmisha/dune-weaver from mirror

  • 19d08e9587 fix: retry on any FluidNC error with exponential backoff The motion thread only ever sends simple G1/$J moves, so any error:XX response means the line was garbled in transit (serial corruption on the Pi 3B UART), not a genuinely bad command. Previously only a hardcoded whitelist of error codes was retried; an out-of-list code like error:35 (a G2/G3 arc error that a linear move can't produce) was treated as fatal and stopped the pattern. Now any error response is retried with exponential backoff (20ms → 1s, max 10 attempts) before giving up. Alarms remain a hard stop — those are real machine states where resending could be unsafe. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

1 month ago

dyadmisha synced commits to frontend-audit-fixes at dyadmisha/dune-weaver from mirror

  • 40148b198f fix: persist direction pin changes via config file rewrite + XModem FluidNC v3.7+ rejects runtime $/path writes to Pin objects but still replies "ok", so direction toggles were silently dropped and $CD then persisted the unchanged config. Direction fixes now read config.yaml from flash ($LocalFS/Show with a raw, indentation-preserving reader), toggle :low host-side, and upload the edited file back over XModem, verifying the result. The connection lock is held across the whole sequence so status polls or pattern traffic can't corrupt the transfer, and failures now surface as errors instead of saved:true. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

1 month ago

dyadmisha synced commits to frontend-audit-fixes at dyadmisha/dune-weaver from mirror

  • 968d9163bc calibration: auto-restart controller after direction fix Direction pin changes only take effect after a FluidNC reboot, so "Fix Automatically" now sends $Bye after saving. Wrong axes are patched in a single request (the toggle semantics make per-axis restarts unsafe when both are inverted), the manual restart button is removed, and verification is gated on reconnection. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
  • a7149c5a39 frontend: audit-driven fixes — bugs, UX, accessibility, bundle Code-quality fixes: - preserve playlist order when editing patterns (Set insertion-order bug) - sync manual rotation baseline from hardware theta - fix NowPlayingBar coordinate refetch loop and stale-response race - fix preview cache eviction over-deleting (~20MB on first eviction) - identity-stable requestPreview in Browse/Playlists (observer churn) - fix draggable button snap-back (stale closure on drag offset) - WebSocket reconnect backoff with jitter; guard against ghost sockets on table switch; IndexedDB env guard; log pagination raw-offset fix - remove unused deps (react-colorful dup, react-resizable-panels) UX: - app-wide disconnected banner + disabled hardware actions (Stop exempt) - escape paths on blocking overlays (cache init, backend disconnect) - hide Not Playing pill when idle (incl. Still Sands is_paused edge); body scroll lock only when player expanded - replace all six native confirm()s with styled AlertDialogs (playlist/pattern delete, logo, security-off, restart, shutdown with reconnect/power-off screens) - LED page: remove success-toast spam, add color failure feedback, WLED reachability check, idle-timeout save-on-blur - Settings: instant-save enable switches, setup wizard surfaced at top, Still Sands slot validation, version-check retry, single fetchPorts - playlists: drag-to-reorder (dnd-kit), picker discard guard, double-submit guards, compact clear-pattern menu on mobile - Browse: incremental grid rendering (60/page sentinel), aggregated upload toasts, friendly start/end copy, est. duration, empty-state CTA Accessibility: - aria-labels on ~26 icon-only buttons; aria-hidden on ~290 icon spans - keyboard operability for playlist rows, pattern picker, table switcher - form label associations; dialog roles on custom overlays - aria-live playback announcements; prefers-reduced-motion support - pointer-fine gating for hover-revealed controls; 44px touch targets Bundle & platform: - route-level code splitting + vendor chunks: 1041kB -> 280kB main - react-color -> react-colorful (~140kB saved) - PWA registerType prompt + UpdatePrompt UI (no mid-session SW swap) - 100dvh expanded player; theme-color meta follows dark/light Tests: - hermetic test setup: module-scope WebSocket stub (real local backend was leaking live status into tests), localStorage + baseUrl resets - updated tests for dialogs, disabled states, new empty-state copy Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
  • c4917ace3f release: v4.1.4 — serial resilience, scheduled reboot, MQTT light fix - pattern_manager: treat FluidNC extended errors 170-181 (expression/ flow-control parser) as serial corruption and retry the command instead of stopping the pattern; fixes intermittent pattern aborts from UART line noise (e.g. error:176 on Pi 3B+) - scheduled reboot: new setting to reboot the host board daily at a set time; defers while a pattern is drawing, uses Still Sands timezone - mqtt: fix HA LED Color light registering without a color picker — declare supported_color_modes for the JSON schema and align command/state payloads (nested color object, on/off state) - main: add_to_queue inserted the bare filename instead of the THETA_RHO_DIR-joined path, so queued patterns were silently skipped and only clearing patterns ran (#130) - requirements-nonrpi: add pyyaml, required by FluidNC config (#126) - playlists: per-day pacing option — N plays per day with the interval timed from pattern start (pause_from_start) - bump VERSION to 4.1.4, rebuild frontend bundle Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
  • c285d74e3d fix: stop defaulting mqtt_client_id to the literal 'dune_weaver' The handler's random-client_id fallback never fired because state.py seeded mqtt_client_id with the literal 'dune_weaver' at both init and load. That value was never user-configurable (no UI field exists), so any stored 'dune_weaver' is a stale default, not an explicit choice. Treat it as unset on load so the handler's unique-id fallback kicks in. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
  • a851d933b6 chore: log client_id and symbolic MQTT error names on disconnect Makes it possible to verify the randomized client_id is in use and to see which MQTT_ERR_* code triggered a disconnect without looking it up. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
  • View comparison for these 10 commits »

1 month ago

dyadmisha synced new reference frontend-audit-fixes to dyadmisha/dune-weaver from mirror

1 month ago

dyadmisha synced commits to main at dyadmisha/AI-on-the-edge-device from mirror

1 month ago

dyadmisha synced and deleted reference update-platform-espressif32-to-6.11.0 at dyadmisha/AI-on-the-edge-device from mirror

1 month ago

dyadmisha synced and deleted reference PowerResetCamera_fix at dyadmisha/AI-on-the-edge-device from mirror

1 month ago

dyadmisha synced commits to release/v4.1.4 at dyadmisha/dune-weaver from mirror

  • c4917ace3f release: v4.1.4 — serial resilience, scheduled reboot, MQTT light fix - pattern_manager: treat FluidNC extended errors 170-181 (expression/ flow-control parser) as serial corruption and retry the command instead of stopping the pattern; fixes intermittent pattern aborts from UART line noise (e.g. error:176 on Pi 3B+) - scheduled reboot: new setting to reboot the host board daily at a set time; defers while a pattern is drawing, uses Still Sands timezone - mqtt: fix HA LED Color light registering without a color picker — declare supported_color_modes for the JSON schema and align command/state payloads (nested color object, on/off state) - main: add_to_queue inserted the bare filename instead of the THETA_RHO_DIR-joined path, so queued patterns were silently skipped and only clearing patterns ran (#130) - requirements-nonrpi: add pyyaml, required by FluidNC config (#126) - playlists: per-day pacing option — N plays per day with the interval timed from pattern start (pause_from_start) - bump VERSION to 4.1.4, rebuild frontend bundle Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
  • c285d74e3d fix: stop defaulting mqtt_client_id to the literal 'dune_weaver' The handler's random-client_id fallback never fired because state.py seeded mqtt_client_id with the literal 'dune_weaver' at both init and load. That value was never user-configurable (no UI field exists), so any stored 'dune_weaver' is a stale default, not an explicit choice. Treat it as unset on load so the handler's unique-id fallback kicks in. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
  • a851d933b6 chore: log client_id and symbolic MQTT error names on disconnect Makes it possible to verify the randomized client_id is in use and to see which MQTT_ERR_* code triggered a disconnect without looking it up. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
  • 69dbe1d9f5 fix: generate random MQTT client_id to prevent reconnect loop Two instances sharing the default client_id 'dune_weaver' caused the broker to kick each off in an endless connect/disconnect cycle. Fall back to {device_id}-{random} when no explicit client_id is set. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
  • 3ad3f3c620 fix starry night. fix corruption issue with playlists.yml
  • View comparison for these 10 commits »

1 month ago

dyadmisha synced new reference release/v4.1.4 to dyadmisha/dune-weaver from mirror

1 month ago

dyadmisha synced commits to PowerResetCamera_fix at dyadmisha/AI-on-the-edge-device from mirror

2 months ago