Skip to content

Commit 1461f76

Browse files
committed
v2.35.0 — Prusa printers and Elegoo Centauri Carbon 1 (beta); catalogue product card with + Inventory / Wishlist / Cart / Favorite; one redesigned product card with Info / Documents / Notes tabs; right container on new spools, favourite MasterSpools and container filters; inventory search and cards aligned with the catalogue
1 parent 2e62641 commit 1461f76

39 files changed

Lines changed: 2629 additions & 483 deletions

‎CHANGELOG.md‎

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,46 @@ Versions follow [Semantic Versioning](https://semver.org/).
55

66
---
77

8+
## v2.35.0 — 2026-10-09
9+
10+
### Added
11+
12+
- **Prusa printers (beta).** Every Prusa running PrusaLink — MK4/MK4S, MK3.9/MK3.9S, Core One, XL (1/2/5 tools), MINI/MINI+, MK3S+ / MK2.5S via Raspberry Pi — with or without MMU, with or without camera. LAN only (Prusa Connect has no public API). First shipped as `v2.35.0-beta.1`.
13+
- Transport in main: `prusa:http` (HTTP Digest auth with a cached challenge, optional `X-Api-Key`, tight path allowlist, GET/PUT/DELETE/HEAD, binary for thumbnails/snapshots) + `prusa:probe` (one unauthenticated `GET /api/version`: 401 Digest "Printer API" / PrusaLink server header / version body); `window.prusa` in `preload.js`.
14+
- Driver `renderer/printers/prusa/index.js`: 2 s `/api/v1/status` poll (state map incl. `ATTENTION`, nozzle/bed/chamber temps, progress, time left, fans, speed/flow), `/api/v1/job` on a new job + every 10 s (name, thumbnail → data URL, G-code metadata), `/api/v1/info` + `/api/version` once (MMU, serial, camera, firmware); reconnect backoff + re-find (`refind.js`, ARP MAC); auth / old-API / command errors as banners + one toast.
15+
- Slots: MMU → 5 bays (one "MMU" board unit), XL → T1…Tn from the model catalog `tools`, else E1; filled from the job's `filament_type` / `extruder_colour` metadata while it runs (PrusaLink reports no loaded filament).
16+
- Pause / resume / stop on the side card and the printer board (`controlJob`, hold-to-confirm 1.2 s / 1.5 s).
17+
- Camera: Buddy3D over local RTSP (`rtsp://<ip>/live`, ffmpeg → JPEG, `prusa:cam-start-rtsp`) or PrusaLink `/api/v1/cameras/snap` every 2 s; one feed per printer shared by side card, board and camera wall (not in the detached camera window yet).
18+
- Add flow: HTTP `/api/version` sweep of the local /24s + extra subnets, or manual `host[:port]`, then PrusaLink password, optional user, optional Buddy3D address. Model catalog `data/printers/prusa_printer_models.json`; placeholder brand mark + model image.
19+
- Marked beta: "Beta" tag in the add-printer picker (`meta.beta`), beta notice at the top of the live block.
20+
- **Elegoo Centauri Carbon 1 (beta) — SDCP v3** as a second Elegoo transport (issue #41): `M99999` discovery on UDP 3000 (`elegoo:sdcp-discover` sweep + `elegoo:sdcp-probe`, in parallel with the CC2's MQTT probe), WebSocket `:3030/websocket` without auth from the renderer (`renderer/printers/elegoo/sdcp.js`): status (Cmd 0 + pushes) → state / progress / layers / time left / temps / fans / speed; attributes (Cmd 1, MAC kept for the IP re-find); camera (Cmd 386 → MJPEG :3031); pause / resume / stop (129 / 131 / 130 — not yet confirmed on firmware 1.4.x). Every exported entry point of `elegoo/index.js` hands over when `printer.protocol === "sdcp"`. CC1 form asks only the IP (`sdcpSchema`, writes `protocol: "sdcp"`); catalog entry "Centauri Carbon (Beta)"; `PROTOCOL.md` §25.
21+
- **Per-printer settings schemas within a brand**: `schemaFor(printer | prefill)` on the brand + `fixed` values written with the doc; used by the form, the save, the scan multi-select (`scan-pick.js`, required fields asked per candidate) and multi-add (`_printerSchemaFor`, `printerRequiredFields(brand, prefill)`).
22+
- **Catalogue product card.** A product opened from the Catalogue views gets its own side card (`#productCardPanel`, catalogue mode): illustration, identity + chips, "Already N in your inventory", a **Product sheet** button (opens the full product card beside it; a second press closes it), then a 2 × 2 grid of calls to action — **+ Inventory** (`_catalogCreate`), **+ Wishlist** (list picker), **+ Cart**, **+ Favorite** (✓ states) — then description, print settings, documents and details; no weight bar. ★ / cart / lists use the row "+ Inventory" would create (`catalogRow`), so they land on the same product record as the spools. Picking another product while the card is open slides the new card over a ghost of the old one (`_ghostSwapPanel`, ghost one z-slot under panels at z ≤ 100) and closes a product sheet left on the old product.
23+
- **Catalogue — nothing found.** A search / filter set with no match shows an empty state with **Create it by hand**, opening the Add-product card (`[data-cv-create]` → `openAddProductPanel`).
24+
- **Full catalogue data on catalogue spools.** Spools created from the catalogue, converted to TigerTag+ or refreshed from the API store `catalogProduct`: the local `id_catalog.json` entry enriched field by field with what `product/get` adds (description, documents, images, filament block, nozzle / dryer / bed, fan speeds, slicer profiles in `metadata`, brand logo / site, dates); the chip still gets only protocol fields (`_catalogFullRecord`, `_productApiFields`, `_refreshApiData`, `normalizeRow`). Documented in `docs/firestore-schema.md`, the backend `README.md` and the MCP data guide.
25+
- **Favourite MasterSpools.** A ☆ on every MasterSpool in the container picker (`favorite: true` on `users/{uid}/containerOverrides/{id}`, beside the weight correction — resetting one keeps the other). Favourites get their own group at the top of the picker; a refill with favourites always asks, the picker narrowed to the favourites (any brand) + the brand's own MasterSpools, skipped only when the favourite is the brand's only MasterSpool (`containerIsFavorite`, `_cpToggleFavorite`, `_containerChoice`).
26+
- **Container picker filters**: Cardboard / Plastic / MasterSpool chips under the search (one at a time, press again for all; reset on open; combined with the search and a narrowed list) — `_cpSetKind`, `CONTAINER_KIND`.
27+
28+
### Changed
29+
30+
- **One product card instead of two** (PR #39 by @Ptitlouis6012, then redesigned): "Product info" and "Product card" merged into one wide card — hero (illustration flush top-left, 236 px with a 20 px colour frame; identity; aspect / weight chips; HEX colour badges; 2-line description), two figures (**In stock** — "N spools" or "stock/minimum" — and **Estimated value**, stock × unit price HT/TTC), buy-link / price buttons, actions (+, list, to-order, ★) in a row beside the ✕ that scrolls with the content, then three tabs kept across re-renders: **Info** (print settings as 2 × 3 tiles; **Product details** — brand linked to its site with a globe, range, material, colour, net weight, product id → catalogue, type, diameter, fan speed; **Stock** — minimum, current, value; **Slicer profiles** — Bambu Studio / Creality Print, when known; note with a 0/500 counter; personal links), **Documents** (documents + video, orange count bubble on the tab) and **Notes** (tags, SKU / EAN, raw JSON in debug). Friend products keep the read-only card. i18n `reorderPanelTitle`, `reorderOpenProductCard` removed.
31+
- **Container on a new spool** (`_containerChoice`, keyed on `brandId` == `id_brand`): not a refill → the brand's only container silently, several → picker narrowed to the brand's, none → narrowed to the generic ones ("Without MasterSpool" never offered); refill (`info1`) → the brand's only MasterSpool, several → narrowed to them, none → every MasterSpool. The narrowed picker says why and has "Show all"; questions are queued one at a time and only for spools added during the session. Replaces the old fallback to the first generic entry ("Without MasterSpool", 0 g).
32+
- **Inventory reads like the catalogue** (issue #43): grid cards titled with the product name ("PETG HF - Blue" — the catalogue title for a catalogue spool, else "<series> - <colour>") over "Brand · Material" (`spoolCardTitle`, `spoolCardSub`); the table and grouped spools show the material with its series (`materialWithSeriesAspect`).
33+
- Elegoo: the Centauri Carbon 2 is named as such everywhere (catalog typo "Centaury" fixed, tutorial), a Centauri found over MQTT is no longer mistaken for another model, the empty scan names the supported models.
34+
- `docs:check` accepts prerelease versions.
35+
36+
### Fixed
37+
38+
- **Inventory search finds what the catalogue finds** (issue #43): one word-based search shared by the inventory, the Products views and the catalogue — every word must appear among brand, series, product name, material, aspects, colour, note, SKU / EAN, UID, tags, capacity — instead of the whole phrase in one field ("Bambu PETG HF" found nothing). Exact-code shortcut unchanged (`_searchTokens`, `_hayHasAll`, `_rowSearchHay`).
39+
- **Product card showed "In stock: 0" for a catalogue product you own**, and a minimum / ★ set there landed on another record: the preview was built on a "PRODUCT_" row instead of as the TigerData+ the catalogue creates ("tt:<id>"). Now built on a chipless id, keyed by `_spoolProductKey`; rows synthesised from a product record carry `_productHash` and stock / row lookups match on it. A one-time `_healGhostProducts` merges the ghost records the bug left (flags OR-ed, larger minimum, empty fields filled, tags united) and deletes them.
40+
- Printer board: dropping a printer group onto another no longer pushes the other printer's widgets down (PR #40 by @Ptitlouis6012; follow-up issue #42) — `_planSettleColumns`.
41+
42+
### i18n
43+
44+
- Added the Prusa set (`printerHintPrusa*`, `printerLblPrusa*`, `printerHelperPrusa*`, `prusa*`), `printerHintElegooSdcpIP`, `elgSdcpCmdRefused`, `betaTag`, `printerBetaNote`, `cpHint*`, `cpShowAll`, `cpFavorites`, `cpFavAdd`, `cpFavRemove`, `cpKindCardboard`, `cpKindPlastic`, `pcCta*`, `pcCatOwned`, `pcOpenSheet`, `det*` (fan, profiles, brand site, …), `sectionDescription`, the `ro*` product-card set, `roPanelSlicer`, `catEmptyTitle`, `catEmptySub`, `catEmptyCta` — 11 locales. Changed `elegooScanEmpty`. Removed `reorderPanelTitle`, `reorderOpenProductCard`.
45+
46+
---
47+
848
## v2.34.0 — 2026-10-05
949

1050
### Added

‎CLAUDE.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,7 @@ Each brand under `renderer/printers/<brand>/PROTOCOL.md` is a **self-contained a
442442
|-------|------------------------|-----------------|
443443
| **Bambu Lab** | LAN: MQTTS 8883 TLS, AMS 16-slot, SSDP+TLS scan, JPEG TCP 6000 / RTSP 322. Cloud (§17): REST behind Cloudflare — needs Electron's `net` — + one account MQTT broker; same `push_status`, so the LAN parser is reused | ✅ implemented (LAN + cloud) |
444444
| **Creality** | WS 9999, heartbeat `"ok"`, CFS boxsInfo type 0/1, WebRTC port 8000 | ✅ implemented |
445-
| **Elegoo** | MQTT 1883, UDP spray port 52700, filament 4 slots canvas/tray | ✅ implemented |
445+
| **Elegoo** | CC2: MQTT 1883, UDP spray port 52700, filament 4 slots canvas/tray. CC1 (§25): SDCP v3 — `M99999` UDP 3000, WebSocket 3030 no auth, `elegoo/sdcp.js` | ✅ implemented (CC1 🧪 beta) |
446446
| **FlashForge** | HTTP poll 8898, TCP M-codes 8899, UDP multicast 225.0.0.9:19000 | ✅ implemented |
447447
| **Snapmaker** | WS 7125 Moonraker + proprietary, RRGGBBAA color, HTTP scan | ✅ implemented |
448448
| **Prusa** | PrusaLink HTTP 80 (Digest auth, via main `prusa:http`), status poll 2 s, MMU 5 slots / XL tools from the model catalog, camera = Buddy3D RTSP (own IP) or PrusaLink `/cameras/snap`, HTTP `/api/version` sweep scan | 🧪 beta (LAN) |

‎FEATURES.md‎

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Tiger Studio Manager — Feature Catalogue
22

3-
Tiger Studio Manager is the Electron desktop companion to the TigerTag ecosystem: a filament-inventory manager built around RFID/NFC-tagged spools ("TigerTag" chips), a fully-digital "TigerData" tier (and its catalogue-identified "TigerData+" rung), live 3D-printer integration across seven brands, physical storage/rack management, a Firebase-backed social layer (friends, shareable wishlists, public profiles), and companion hardware (TD1S color sensor, TigerScale, TigerSpool printer reader, TigerPOD dual-reader stand). This document catalogues every **shipped** feature, grouped by domain, current as of **v2.35.0-beta.1**. Per-version release detail lives in `CHANGELOG.md`; forward-looking / in-progress work lives in `ROADMAP.md`.
3+
Tiger Studio Manager is the Electron desktop companion to the TigerTag ecosystem: a filament-inventory manager built around RFID/NFC-tagged spools ("TigerTag" chips), a fully-digital "TigerData" tier (and its catalogue-identified "TigerData+" rung), live 3D-printer integration across seven brands, physical storage/rack management, a Firebase-backed social layer (friends, shareable wishlists, public profiles), and companion hardware (TD1S color sensor, TigerScale, TigerSpool printer reader, TigerPOD dual-reader stand). This document catalogues every **shipped** feature, grouped by domain, current as of **v2.35.0**. Per-version release detail lives in `CHANGELOG.md`; forward-looking / in-progress work lives in `ROADMAP.md`.
44

55
---
66

@@ -60,6 +60,9 @@ Tiger Studio Manager is the Electron desktop companion to the TigerTag ecosystem
6060
- `updatedAt` field standardised (`FieldValue.serverTimestamp()`) across writes, ISO with the printer data model (v1.7.4).
6161
- Container auto-assignment — every spool without a `container_id` is matched to one by brand on the next live snapshot (v1.7.4).
6262
- **Refill** container for a spool kept with no masterspool at all — a zero-weight generic entry pinned to the top of the picker, so the weight shown is the filament's own (v2.23.1).
63+
- **Right container on a new spool** — the brand's own container is set when there is one; several (or none) → the picker opens narrowed to the candidates with a line saying why; a refill always goes into a MasterSpool, never "Without MasterSpool" (v2.35.0).
64+
- **Favourite MasterSpools** — star the MasterSpools you own: they head the picker, and every refill asks between them and the brand's own (v2.35.0).
65+
- **Container filters** — Cardboard / Plastic / MasterSpool chips in the container picker (v2.35.0).
6366
- Legacy data migrations: decimal → hex-uppercase UID migration with consent + progress UI (v1.4.5), flat rack fields → nested `rack{}` object migration (v1.4.7).
6467
- Instant cold start — IndexedDB snapshot cache plus an on-disk product-thumbnail cache served over a local HTTP server, so inventory/racks/printers render before the network round-trip completes and the app stays usable offline (v1.8.15; app-wide launch-cache + splash screen v1.8.24).
6568
- Persistent rotating log file via `electron-log` for post-mortem diagnostics (v1.7.5).
@@ -139,6 +142,9 @@ Tiger Studio Manager is the Electron desktop companion to the TigerTag ecosystem
139142
- Product web-link attachments — datasheets, tutorials or videos attached to a product identity and shared by every spool of it, tier-capped free 1 / plus 2 / premium 5 and enforced server-side (v2.12.0).
140143
- Favorites view — Grid, Table and "To order" modes, sortable table (v2.1.0; sortable v2.2.0).
141144
- **Catalogue multi-select** — tick products in the table or grid (shift-click for a range) and ★ favourite, 🛒 add to order or add to a list the whole selection at once (v2.34.0).
145+
- **Catalogue product card** — a product opened from the catalogue gets its own card: + Inventory, + Wishlist, + Cart, + Favorite, and a button opening the full product card beside it; spools added from the catalogue keep the full catalogue record (description, documents, slicer profiles, fan, brand site) (v2.35.0).
146+
- **Catalogue "nothing found"** — an empty search offers to create the spool by hand (v2.35.0).
147+
- **Unified product card** — one card instead of two: stock and estimated value, then Info / Documents (with a count) / Notes tabs, product details, stock management and slicer profiles (v2.35.0; merge contributed in PR #39).
142148
- Grouped-spools side-card exposes the product's flag toggles (add-to-cart ❤, favourite ★, add-to-a-list +) as one icon-only row, in own and friend-view (v2.11.0).
143149
- Grouped-spools deck stamps each member with when it was added ("just now", "3 days ago", "2 months ago", exact date on hover) — the only thing distinguishing otherwise identical spools (v2.15.0).
144150
- Interest hierarchy — ❤ Love ⊆ ★ Favorite ⊆ tracked-for-reorder, coupled automatically on write (v2.1.0).
@@ -185,10 +191,11 @@ Live integrations across seven brands, each with real-time temperatures, per-slo
185191
- **Bambu Lab** — LAN (MQTTS 8883 TLS) **and cloud**: sign in with a Bambu account and every printer on it is offered with its picture, ticked one or several at a time, arriving with the LAN access code the cloud hands over; cloud machines report from anywhere and learn their own address from telemetry, so their camera starts unattended on the same network (cloud v2.26.0; **China-mainland accounts, phone-number sign-in by SMS** v2.29.0). Job/temp/AMS cards, camera (JPEG-TCP + RTSP by model), full machine controls over LAN (jog/home/light/fans/speed/heated chamber where supported), print-plate thumbnails via FTPS+3mf extraction, H2-series dual-nozzle display (v1.6.0; full controls v1.10.7; thumbnails v2.1.0). A CLOUD connection is read-only — the machine accepts no command but its light, so only that one is offered (v2.27.3).
186192
- **Creality** — WebSocket 9999 with heartbeat; job/temp cards, CFS colour-box grid, WebRTC camera, full machine controls (jog/home/temps/fans), per-slot CFS load/unload (v1.4.15; controls v1.10.13).
187193
- **Elegoo** — MQTT 1883 + UDP discovery 52700; job/temp/filament (mono + 4-slot Canvas) cards, XY-jog control card, fan cards, files/history sheet, filament edit sheet (v1.6.0).
194+
- **Elegoo Centauri Carbon 1 (beta)** — the first Centauri Carbon over SDCP v3 (UDP 3000 discovery, WebSocket 3030): live state, progress, layers, temps, fans, MJPEG camera, pause/resume/stop; added by IP alone (v2.35.0).
188195
- **FlashForge** — HTTP polling 8898 + MJPEG camera; 5-slot matlStation grid, tool-changer support (Creator 5 Pro), official 24-swatch colour-palette constraint, lifetime-stats info panel (v1.4.11; monitoring & controls v1.10.10).
189196
- **Snapmaker** — Moonraker WebSocket 7125; job card with thumbnail, temperature pills, 4-slot filament grid with inline editor, WebRTC camera, mDNS + port-scan discovery (v1.4.7; discovery v1.4.8).
190197
- **Anycubic** — LAN (MQTTS 9883 TLS) and cloud (cross-platform web login + cloud-MQTT + signed REST), ACE multi-slot filament box, full controls, HTTP-FLV / Agora WebRTC camera, on-printer + USB + cloud file browser with print/delete (v1.9.0; cloud v1.10.0; file management v1.10.11; cloud camera v1.10.8; integration contributed by [@ennisj](https://github.com/ennisj), John Ennis).
191-
- **Prusa (beta)** — PrusaLink HTTP with Digest auth, every Prusa that runs it (MK4/MK4S, MK3.9, Core One, XL 1/2/5 tools, MINI/MINI+, MK3S+/MK2.5S via Raspberry Pi): live state, temps, progress, preview, fans/speed/flow, pause/resume/stop, MMU 5-slot and XL tool slots filled from the running job, Buddy3D RTSP or PrusaLink camera, network scan + manual IP, re-find after an IP change (v2.35.0-beta.1).
198+
- **Prusa (beta)** — PrusaLink HTTP with Digest auth, every Prusa that runs it (MK4/MK4S, MK3.9, Core One, XL 1/2/5 tools, MINI/MINI+, MK3S+/MK2.5S via Raspberry Pi): live state, temps, progress, preview, fans/speed/flow, pause/resume/stop, MMU 5-slot and XL tool slots filled from the running job, Buddy3D RTSP or PrusaLink camera, network scan + manual IP, re-find after an IP change (v2.35.0).
192199
- Per-brand model catalogues with thumbnails, brand logos across list/grid/add-picker (v1.10.11).
193200
- Unified "Add a printer" flow — brand picker, model picker, docked options panel, connection tutorials (LAN-only mode / access code / IP walkthroughs, screenshots, all 9 locales) surfaced from both the add flow and printer settings (v1.8.19; flow redesign v1.10.26; **Bambu Lab A2L and X2D** recognised on discovery and given their walkthroughs v2.27.0).
194201
- LAN discovery per brand — mDNS/SSDP/UDP scans plus a persisted, account-synced shared "extra subnets" list and a manual "Add by IP" path across all six brands (v1.4.8 → v1.10.0; unified extra-subnets store v1.8.20; **tick one or several scan results and add them in one go**, each machine's own code asked on its card, v2.29.0).

0 commit comments

Comments
 (0)