Skip to content

Commit 5b93e65

Browse files
committed
v2.15.0 — TigerData+, catalogue search, new app icon
Opens the TigerData+ tier: a fully-digital spool with no chip and no UID that is nonetheless tied to a real product in the official catalogue, so the digital tier finally knows what it is holding. Derived from the data (`isCloud` + a real `id_product`), never stored — `protocol` stays "TigerData" for every chipless spool, so the version filter and the telemetry rollup are untouched — and given its own badge and stat tile so it can never read as a TigerTag+. A new Search view segment browses the whole official catalogue (grid + table, Type/Brand/Series/Material filters at parity with the public catalogue page). The catalogue is imported once into a local cache and searched entirely in memory, self-refreshing past 24 h with a Re-sync button in Settings -> Tools; one builder feeds both the Product-card preview and the write, so what you see is what gets stored. Every product type is browsable, Filament alone is creatable until the other slot contracts are ratified. Also: the .ttag record contract is now enforced at import (24 chip-payload fields required, twins atomic, refusals counted rather than silently dropped), authored in a new dev tool and documented in docs/TTAG-FIELDS.md; the product card, spool detail and grouped-spools deck share one action row including a shopping button that works on a friend's shelf; the grouped deck stamps each spool with when it was added; scroll cues (fade + scrollbar) reach every list; the container picker is alphabetical, gains Inslogic and Jayo, and three brand ids that pointed at the wrong record are fixed; and every app icon is regenerated from a single TigerSystem vector master via scripts/make-icons.mjs.
1 parent b5a2565 commit 5b93e65

50 files changed

Lines changed: 3465 additions & 135 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎CHANGELOG.md‎

Lines changed: 54 additions & 0 deletions
Large diffs are not rendered by default.

‎CLAUDE.md‎

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,41 @@ Every release ships the **same changes described three times**, at three altitud
240240

241241
---
242242

243+
## 📐 `.ttag` field contract — the source of truth, edited via a dev tool
244+
245+
The `.ttag` interchange format (export/import — see the *`.ttag`* entries in the CODEMAP and
246+
`docs/TTAG-EXPORT-BRIEF.md`) has a **field-level contract**: for every field, its wire **type**,
247+
whether it is written **on the chip**, and whether it is **Required / Optional / N-A** — and that
248+
last axis is **per product type** (`id_type`: 142 Filament, 116 Accessories, 41 Spare Part, 173
249+
Resin, more to come). The three axes are independent (e.g. `color_name` is on-chip yet optional).
250+
251+
**The contract is NOT hand-edited in Markdown. It is authored in a dedicated dev tool:**
252+
253+
> **`playground/ttag-fields-editor/index.html`** — a standalone, dependency-free page (open it in a
254+
> browser, no server). The founder toggles each field's on-chip flag and per-type contract, annotates
255+
> a per-type "Why" note (e.g. the meaning of `data1`–`data7`, which differs per type), and clicks
256+
> **Download** to regenerate **`docs/TTAG-FIELDS.md`** verbatim. This is the deliberate,
257+
> everyone-agrees workflow for evolving the contract — when an anomaly is found, or a new product
258+
> type needs its rules.
259+
260+
**`docs/TTAG-FIELDS.md` is the generated source of truth** (chip byte layout comes from
261+
`renderer/rfid_protocol/tigertag/parser.js` + the `saveAddProduct` schema; don't invent ranges — read
262+
them there). **Studio's importer must match it**: the record validation
263+
(`_ttagRecordValid` / `_ttagMaterialValid` / `TTAG_REQUIRED_NUM` in `renderer/inventory.js`) enforces
264+
the ratified **Filament (142)** required set, and the importer currently **accepts only `id_type ==
265+
142`** (other types are drafts). When the founder hands back an updated `TTAG-FIELDS.md`:
266+
267+
1. **Re-align the importer** to the new contract (required set, per-type gates), keeping the
268+
"refuse-and-count, never silently import bad data" behaviour.
269+
2. **Drop the regenerated `docs/TTAG-FIELDS.md`** into the repo.
270+
3. **Propagate** the format changes to TigerSystem-Docs (`ttag-format` spec) and the mobile app as
271+
relevant (same reflex as the Firestore-schema propagation rule).
272+
273+
Never change the importer's contract on your own initiative — the tool + `docs/TTAG-FIELDS.md` are
274+
the authority; a code change follows a founder-ratified contract, not the reverse.
275+
276+
---
277+
243278
## Stack
244279
Electron (no bundler) + vanilla HTML/CSS/JS. Entry: `main.js`. Renderer: `renderer/inventory.html` + modular CSS in `renderer/css/` + `renderer/inventory.js`. Preload bridge: `preload.js`.
245280

‎CODEMAP-main.md‎

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ L3810-3870 App lifecycle (whenReady, window-all-closed, activate)
3838

3939
---
4040

41-
## App bootstrap, static server, splash & main window (L1-442)
41+
## App bootstrap, static server, splash & main window (L143-381)
4242

4343
| L | What | Anchors |
4444
|---|---|---|
@@ -47,21 +47,22 @@ L3810-3870 App lifecycle (whenReady, window-all-closed, activate)
4747
| 311-335 | UID hex→decimal + TigerTag SDK payload builder | `normalizeUid`, `_sdkPayload` |
4848
| 336-442 | `BrowserWindow` creation, preload wiring, CSP, devtools | `createWindow` |
4949

50-
## NFC / RFID reader + chip write (L443-1137)
50+
## NFC / RFID reader + chip write (L526-1337)
5151

5252
| L | What | Anchors / IPC |
5353
|---|---|---|
5454
| 443-625 | Reader connect/disconnect lifecycle, card-present events, auto-read | `_onNfcMessage`, `initNFC` |
5555
| 626-716 | USB scale (Dymo M-series) — HID open + hot-plug poll, frame decode, `usb-scale-update` / `usb-scale-data` events, `usb-scale:state` IPC | `_scaleDecode`, `_tryOpenScale`, `initUsbScale` |
5656
| 717-1137 | IPC: `rfid:read-now` / `rfid:write-now` / `rfid:repair` (restore from backup) / `rfid:format` (reinitialize via `TigerTag.asInit`) / `rfid:encode-cloud` / `rfid:burn-one` / `rfid:refresh-api` / `rfid:lookup-product`; surgical page diff before write | `_pagesFromBytes`, `_pagesToWrite` |
57+
| 1281-1333 | IPC `catalog:fetch-all` — pages the WHOLE product catalogue (`product/get/all`, `per_page` 1000, follows `nextPage`) so the renderer can cache and search it offline | `XANO_PRODUCT_ALL_URL` |
5758

58-
## TD1S color sensor (L1138-1379)
59+
## TD1S color sensor (L1353-1353)
5960

6061
| L | What | Anchors / IPC |
6162
|---|---|---|
6263
| 1138-1379 | Serial-port watcher, TD/color line parse, state replayed to renderer on reload; IPC `td1s:need` / `td1s:release` | `initTD1S` |
6364

64-
## Auto-updater + migration gate (L1380-1553)
65+
## Auto-updater + migration gate (L1599-1650)
6566

6667
| L | What | Anchors / IPC |
6768
|---|---|---|
@@ -75,7 +76,7 @@ L3810-3870 App lifecycle (whenReady, window-all-closed, activate)
7576
| 1554-1702 | Google OAuth loopback sign-in (`auth:google-loopback`); `shell:open-external` | — |
7677
| 1703-1749 | Detached camera-wall `BrowserWindow` (`cam:open-detached`); `update:check-now` | — |
7778

78-
## Printer discovery probes (L1750-2471)
79+
## Printer discovery probes (L2094-2478)
7980

8081
| L | What | Anchors / IPC |
8182
|---|---|---|
@@ -103,15 +104,15 @@ L3810-3870 App lifecycle (whenReady, window-all-closed, activate)
103104
| 2661-2733 | Elegoo MQTT 1883 bridge (`elegoo:connect` / `disconnect` / `publish`) | — |
104105
| 2734-2765 | Shared `ffmpeg` binary detection (Bambu RTSP + Anycubic FLV cameras) | — |
105106

106-
## Bambu Lab — MQTT + JPEG-TCP/RTSP cameras (L2766-3019)
107+
## Bambu Lab — MQTT + JPEG-TCP/RTSP cameras (L3121-3121)
107108

108109
| L | What | Anchors / IPC |
109110
|---|---|---|
110111
| 2766-2825 | MQTTS 8883 control bus (`bambulab:connect` / `disconnect` / `publish`) | — |
111112
| 2826-2910 | JPEG-TCP camera, port 6000 (`bambulab:cam-start` / `cam-stop`) — 80-byte auth packet, retry/timeout | `_bambuCamAuthPacket` |
112113
| 2911-3019 | RTSP camera via ffmpeg, port 322 (`bambulab:cam-start-rtsp` / `cam-stop-rtsp`) — 30 fps + low-latency flags | — |
113114

114-
## Anycubic LAN — MQTT, provisioning, FLV camera (L3020-3343)
115+
## Anycubic LAN — MQTT, provisioning, FLV camera (L3507-3515)
115116

116117
| L | What | Anchors / IPC |
117118
|---|---|---|
@@ -120,7 +121,7 @@ L3810-3870 App lifecycle (whenReady, window-all-closed, activate)
120121
| 3213-3235 | Slicer on-disk credential reader (`anycubic:read-slicer-config`) — keyless deobfuscation | `_acuDeobfuscate`, `_acuConfCandidates` |
121122
| 3236-3343 | LAN scan: TCP probe (`anycubic:tcp-probe`), FLV liveness (`anycubic:flv-probe`, accepts 200/206), `/info` (`anycubic:http-info`) | — |
122123

123-
## Anycubic cloud — REST + cloud MQTT (L3344-3986)
124+
## Anycubic cloud — REST + cloud MQTT (L3660-4021)
124125

125126
| L | What | Anchors / IPC |
126127
|---|---|---|

‎FEATURES.md‎

Lines changed: 7 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, live 3D-printer integration across six brands, physical storage/rack management, a Firebase-backed social layer (friends, shareable wishlists, public profiles), and companion hardware (TD1S color sensor, TigerScale, TigerPOD dual-reader stand). This document catalogues every **shipped** feature, grouped by domain, current as of **v2.14.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 six brands, physical storage/rack management, a Firebase-backed social layer (friends, shareable wishlists, public profiles), and companion hardware (TD1S color sensor, TigerScale, TigerPOD dual-reader stand). This document catalogues every **shipped** feature, grouped by domain, current as of **v2.15.0**. Per-version release detail lives in `CHANGELOG.md`; forward-looking / in-progress work lives in `ROADMAP.md`.
44

55
---
66

@@ -24,6 +24,8 @@ Tiger Studio Manager is the Electron desktop companion to the TigerTag ecosystem
2424
- TD1S button in the header auto-fills color + TD on scan (v1.4.13).
2525
- Per-account **container-weight calibration** — correct a container's empty weight against your own scale, with a guided "how to measure" step (a Masterspool keeps its cardboard core, other types do not), a catalogue-vs-yours comparison, and a choice of whether the spools already using that container adopt the new value. Stored in `users/{uid}/containerOverrides/{containerId}` and applied over the bundled catalogue at read time — the shipped JSON is never modified (v2.13.0).
2626
- **TigerData** — fully-digital spools with no physical chip (`CLOUD_<id>`), atomically promoted to a real hex UID (with all fields, twin pointers, rack assignment and friend ACLs carried over) the moment a chip is programmed; dedicated purple tier badge and stat tile (v1.4.12; stat tile v1.4.13).
27+
- **TigerData+** — the catalogue-identified rung of the digital tier: a chipless spool carrying a real `id_product`, so it knows the exact brand, colour, material, temperatures, diameter, SKU and EAN of a product in the official catalogue instead of only what was typed into it. Derived from the data, never stored; explicitly not a TigerTag+ (no chip, no UID) and given its own badge and stat tile so the two are never confused (v2.15.0).
28+
- **Catalogue search** — a dedicated **Search** view (grid + table) over the whole official TigerTag+ product catalogue, with Type · Brand · Series · Material filters and sorting at parity with the public catalogue page. The catalogue is imported once into a local cache and searched entirely in memory (self-refreshing after 24 h, plus a *Re-sync the catalogue* button in Settings → Tools); selecting a product previews it in the standard product card, and one `+` turns it into a TigerData+. Every product type is browsable, filament is creatable (v2.15.0).
2729
- **Chip history & backup** — private list of every physical chip ever programmed, with the repairable TigerTag+ signature backed up on first read; a green "Backed up" shield badge marks protected spools (v1.10.28, badge v1.10.29). Product ID shown as a clickable catalogue link (v1.10.29).
2830
- Grouping of identical spools — table view first (v1.10.15), then grid view + a dedicated group side panel with a live speedometer gauge of combined remaining weight (v1.10.18); grouping includes TigerData spools (v1.10.16) and distinguishes different colours/aspects within the same brand+material (v1.10.31).
2931
- Multi-select mode (grid + table) — tick spools or printers and delete together with a hold-to-confirm, header master checkbox to select all visible (v2.0.0; header checkbox v2.1.0).
@@ -36,7 +38,7 @@ Tiger Studio Manager is the Electron desktop companion to the TigerTag ecosystem
3638
- Inline **"Add price"** action in the inventory table for unpriced filaments (single rows and group headers) (v2.6.0).
3739
- Header KPI stats count-animate (odometer-style roll on open and on change) (v2.7.0).
3840
- Terminology: every user-facing "RFID" renamed to "NFC" across the UI and all 9 locales (internal identifiers untouched) (v2.5.0).
39-
- **`.ttag` inventory interchange** — export a spool, a selection, or a whole batch to a portable `.ttag` file (keep it, carry it on a USB stick, share it) and import it back anywhere. Works for TigerData, TigerTag and TigerTag+ alike, keeps twins atomic, and imports through a validate → preview table → accept flow with a per-material include picker. Two modes: **Restore** (verbatim, keeps ids/TigerTag+/backups) or **Import** (fresh chipless `TigerData_` spools you own, weight reset to full). Multi-file import via browse, paste-a-link, or drag-and-drop anywhere on the window (v2.14.0).
41+
- **`.ttag` inventory interchange** — export a spool, a selection, or a whole batch to a portable `.ttag` file (keep it, carry it on a USB stick, share it) and import it back anywhere. Works for TigerData, TigerTag and TigerTag+ alike, keeps twins atomic, and imports through a validate → preview table → accept flow with a per-material include picker. Two modes: **Restore** (verbatim, keeps ids/TigerTag+/backups) or **Import** (fresh chipless `TigerData_` spools you own, weight reset to full). Multi-file import via browse, paste-a-link, or drag-and-drop anywhere on the window (v2.14.0). Import enforces the ratified record contract — a material missing any of the 24 chip-payload fields is refused whole (twins all-or-nothing) and counted back to you rather than silently dropped (v2.15.0).
4042

4143
## Cloud & real-time sync / data layer
4244

@@ -115,9 +117,12 @@ Tiger Studio Manager is the Electron desktop companion to the TigerTag ecosystem
115117
- Per-user `products` collection — one record per product identity (buy link, tax-free price, minimum stock, note, tags, SKU/EAN, ❤/★ flags, display snapshot, sanitised `cloudSeed`) shared by every matching spool and surviving spool deletion (v2.1.0).
116118
- Product-info side card — buy link, price, min stock, note, tags, SKU/EAN, ❤/★, and a "+ Material" action minting a chipless TigerData spool of this exact filament, fully auto-saving (v2.1.0; action renamed v2.2.0).
117119
- Info (ⓘ) button on a product opens its reorder panel (price / buy-link / min-stock) alongside the product card (v2.10.0; present and left-aligned on all three product side-cards, and toggling, v2.12.0).
120+
- The product card, the spool detail and the grouped-spools deck expose the SAME action row — ⓘ, "+ Material", shopping, add-to-a-list, ❤, ★ — in the same order, whichever card you opened (v2.15.0).
121+
- Shopping button — one control, two jobs: shop-green and opening the store when the product has a buy link, plain and landing on the buy-link field when it has none (v2.15.0).
118122
- 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).
119123
- Favorites view — Grid, Table and "To order" modes, sortable table (v2.1.0; sortable v2.2.0).
120124
- 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).
125+
- 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).
121126
- Interest hierarchy — ❤ Love ⊆ ★ Favorite ⊆ tracked-for-reorder, coupled automatically on write (v2.1.0).
122127
- ❤ flag rebranded from "Love" to an "Add to cart" action with a shopping-cart glyph, forcing a minimum stock ≥1 (v2.5.0 forced-min behaviour; icon/label rebrand v2.9.0).
123128

‎README.md‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ Manage your spool inventory, connect your 3D printers, and keep everything in sy
4444

4545
Tiger Studio Manager is an Electron desktop app that bridges your physical filament collection with the TigerTag cloud. Scan a spool's NFC chip, see its full profile (material, color, weight, print settings), update its weight on the scale, and push filament data directly to your connected printers — all in one window.
4646

47+
Since **2.15.0** it does not even need a chip to know what a spool is: the official product catalogue is searchable
48+
from inside the app, and any product in it can be added as a **TigerData+** — a fully-digital spool carrying that
49+
product's real identity. Buy a chip when you want one on the shelf; until then, the app is no longer guessing.
50+
4751
It works standalone (no reader needed), but unlocks its full potential with:
4852
- an **ACR122U NFC reader** for automatic spool identification, chip encoding and Cloud-to-chip promotion
4953
- a **TigerScale** ESP32 scale for live weight tracking
@@ -108,9 +112,12 @@ The **TigerTag SDK** is the low-level library that handles all NFC chip operatio
108112
- Weight tracking — slider or manual entry; instant cloud sync after update
109113
- **Container weight calibration** — correct a container's empty weight against your own scale, with a guided "how to measure" step; kept on your account and applied to every spool in that container (the bundled catalogue is never modified)
110114
- **TigerData** — create fully-digital spools with no chip; promote to a real chip later, atomically
115+
- **TigerData+** *(new in 2.15.0)* — a fully-digital spool that is nonetheless tied to a **real product in the official catalogue**: the exact brand, colour, material, temperatures, diameter, SKU and EAN, straight from the source instead of from whatever you typed. No chip to buy, nothing to stick on — and it is not a TigerTag+, so it carries its own badge and never pretends to be one
116+
- **Catalogue search** *(new in 2.15.0)* — browse the whole official TigerTag+ catalogue from inside the app, in grid or list, filtered by type, brand, series and material. Pick a product to see its real spec sheet, then add it as a TigerData+ in one click, already filled in. The catalogue is downloaded once and searched locally, so it is instant and works offline
111117
- Custom product image for DIY & Cloud spools
112118
- Manufacturing date, twin-tag detection and manual repair
113119
- Spool toolbox — scan color (TD1S), scan TD, link twin, remove from rack, delete
120+
- **One action row on every card** — the product card, the spool detail and the stack of identical spools all offer the same buttons, including a shopping button that opens the shop when the filament has a buy link (and takes you to where you'd add one when it hasn't)
114121
- **Multi-select** — tick several spools (or printers) and delete them together, with a hold-to-confirm
115122
- **Guided chip update** — a step-by-step panel to re-write an existing chip: place it on the reader, UID-match check, verified write
116123
- **Export / import `.ttag` files** — back up a spool or a whole selection to a portable file, keep it, carry it on a USB stick or share it, then import it back anywhere. Works for TigerData, TigerTag and TigerTag+ alike; import through a validate → preview → accept flow and choose **Restore** (put everything back exactly as it was) or **Import** (fresh spools you own). Pull in several files at once by browsing, pasting a link, or dragging them onto the window

0 commit comments

Comments
 (0)