You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 973bf65
Browse filesBrowse the repository at this point in the historyBrowse files
-**Windows: the app froze on some machines — a 10 s black window at launch, then one to two minutes per click, even to resize the window.** The USB-scale detection called `HID.devices()` (synchronous, main thread) at launch and every 5 s; on slow HID / Bluetooth drivers each enumeration took ~10 s, so the main thread was almost never free. It now uses `HID.devicesAsync()` (worker thread) behind an in-flight guard (`_scaleScanning`), and a scan slower than 2 s is logged and slows polling to 60 s (`_scaleSlowPoll`). A user log on v2.32.0 showed the launch freeze persisting after the TD1S scan removal — this enumeration, which runs right after `initTD1S()`, was the cause — `main.js`.
13
+
-**Google sign-in failing with a bare "fetch failed" on some machines.** The OAuth token exchange (`auth:google-loopback`) now uses Electron's `net.fetch` (Chromium stack: system proxy, OS certificate store, same DNS as the browser) instead of Node's `fetch` (undici ignores all three); the failure log now includes `e.cause` — `main.js`.
| 1694-1880 | Read-only MCP server for AI assistants: `<userData>/mcp.json` prefs (enabledFor [uid] / port 5795 / token; server follows the signed-in account via `mcp:set-account`), stdio bridge copied to `<userData>/mcp/`, `tools/call` relayed to the renderer, started by `initMcp()` at boot. Protocol: `services/mcpServer.js`|`mcp:get-config`, `mcp:set-account`, `mcp:set-enabled`, `mcp:new-token`, `mcp:register-tools`, `mcp:call` / `mcp:result`|
| 3767-3890 | Auth: `cloud-send-code`, `cloud-login` (code / password, `verifyCode` + `tfa` branches), `cloud-tfa` (token arrives in a COOKIE), `cloud-uid` (token is NOT a JWT), `cloud-bind` (machines + their LAN access codes), `cloud-device-version`| — |
127
127
| 3891-3991 | ONE cloud-MQTT client per ACCOUNT: `cloud-connect` (us→eu fallback), `cloud-subscribe` (+ `pushall`), `cloud-publish`, `cloud-unsubscribe`, `cloud-disconnect`. Telemetry is emitted on the LAN `bambulab:message` channel — same payload, same parser |`_bblCloudOpen`, `_bblCloudPushAll`|
128
128
129
-
## Anycubic LAN — MQTT, provisioning, FLV camera (L3992-4323)
129
+
## Anycubic LAN — MQTT, provisioning, FLV camera (L4211-4547)
Copy file name to clipboardExpand all lines: FEATURES.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# Tiger Studio Manager — Feature Catalogue
2
2
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.32.0**. 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.32.1**. Per-version release detail lives in `CHANGELOG.md`; forward-looking / in-progress work lives in `ROADMAP.md`.
- Local MCP server for AI assistants (read-only) — full reference `docs/MCP.md`. Turned on **per profile** in *My profile › AI assistants* (off by default; the server runs only while the signed-in account opted in, stops on sign-out or a switch to a profile that did not): a toggle with an ⓘ bubble, then three tiles with the apps' logos (Simple Icons SVGs in `assets/svg/brands/`) — **Claude** (Studio builds a `.mcpb` bundle, MCPB manifest 0.3, URL + token baked in, and opens it → Claude Desktop's install dialog), **Cursor** / **VS Code** (their MCP install links) — plus a *Renew the key* button (new `icon-key`; hold 1.5 s to confirm, hover bubble saying what it breaks — `setupHoldToConfirm` hint extended with an optional `data-hold-tip` lead sentence; once renewed the key turns into a green tick and the button pops for 1.8 s — no message, nothing moves); the tiles and the button stay visible but greyed and inert while the toggle is off (Claude Code, a developer tool, is documented in `docs/MCP.md`, not offered in the UI). 14 tools: `data_guide` (the notice: every field — data1-data7, id_*, tiers — and collection), `account_overview`, `search_inventory`, `get_spool` (own temps, else the material's recommendation), `inventory_summary`, `list_racks`, `list_printers` (model names, online state), `list_friends`, `friend_inventory`, `list_wishlists`, `data_history`, `list_devices`, and raw `firestore_get` / `firestore_query` over the account's own tree + what friends share + public profiles. Every document is returned DECODED next to its raw fields (labels resolved by ID; the seven chip data slots read per product type — filament temps / diameter, resin mixing / work / curing / washing, unused for accessories and spare parts; info1-3 as refill / recycled / filled flags); counts per physical spool (twins de-duplicated). Security: 127.0.0.1:5795 only, bearer token, Host check against DNS rebinding, browser Origins refused, `secrets` / `apiKeys` refused, credentials (passwords, access / check codes, tokens, keys, certs, cloud logins) and the e-mail / Google real name masked — `services/mcpServer.js`, `services/mcpStdioBridge.js`, `main.js`, `preload.js`, `renderer/inventory.{js,html}`, `docs/MCP.md`, `CLAUDE.md`, `renderer/CODEMAP.md`, `CODEMAP-main.md`, `ROADMAP.md`
5
4
6
5
## Changed
7
-
- Printer board (grid view): zoom held between 50 % and 100 % (buttons, typed value and wheel all go through one clamp; a stored zoom outside the range is brought back in on load). The storage and camera plans keep their own 30–200 % range — `renderer/inventory.js` (`PRINTER_ZOOM_MIN/MAX`, `_clampPrinterZoom`)
8
-
- Product photos in the cart (order view), the favorites / order lists and wishlist rows are framed in the product's colour like the grid cards — the cart had no frame at all, and wishlists drew a flat border that could not show a bi / tri-colour. The frame is now the product's real swatch (`colorBg` of its material snapshot, gradients included) painted under a transparent border; a photo that fails to load falls back to that swatch, and while photos are held (scrolling, colour filter) the tile stays a full colour swatch instead of vanishing — `renderer/inventory.js` (`_productThumbHTML`), `renderer/css/70-detail-misc.css`
9
6
10
7
## Fixed
11
-
- Windows launch stuck on a black "not responding" window for 10 s to several minutes on some machines: the TD1S serial-port scan no longer runs at launch (enumerating ports can hang on some drivers and the window waited on it) — it now runs only when a panel that reads the sensor opens; an update check that times out is logged instead of raising an unhandled rejection — `main.js`
12
-
- Windows update that downloaded but never installed for some users: the app now stops every camera ffmpeg process on quit (a leftover `ffmpeg.exe` kept its file locked against the installer), and if the quit for the update stalls (black "not responding" window) it force-exits after 6 s so the installer can run; updater steps are now written to `main.log` — `main.js`
13
-
- MCP security review follow-ups (`docs/reviews/2026-09-29-mcp-security.md`): the ⓘ bubble no longer says the data stays "on this computer" — it says the link is local but what the assistant reads goes to the company behind it (F1, 11 locales); the `.mcpb` bundle that carries the token is written `0600` in a `0700` folder (was world-readable on Linux, F3); friend-authored text is labelled — server `instructions`, notice `untrusted_text`, `authored_by` on friend results (F2); bearer compared with `crypto.timingSafeEqual` and JSON-RPC batches capped at 20 (F5, F6); the dead stdio-bridge copy and `execPath` / `bridgePath` removed from the config handed to the renderer (F7) — `services/mcpServer.js`, `main.js`, `renderer/inventory.js`, locales, `docs/MCP.md`
14
-
- Grid cards: the identical-spools count badge was a 23×20 oval for a single digit; it is now a perfect 22 px circle for one digit and a pill from two (border-box, min-width = height), and the number itself is centred to within half a pixel, measured: it sits in its own block trimmed to cap-height → baseline (`.group-card-count-n`, `text-box: trim-both cap alphabetic`; the font's extra room above figures left it 0.6 px low, and `text-box` does nothing on the flex badge itself), with proportional figures (tabular ones put a lone "1" ~1.2 px off) — `renderer/css/70-detail-misc.css`, `renderer/inventory.js`
15
-
- The TD badge on grid cards (and on small thumbnails) was unreadable in light mode — the themed ink went dark-on-dark on the dark scrim. It sits on a photo whose colours the theme cannot know, so its colours are now fixed: dark frosted pill, white text, hairline ring — `renderer/css/70-detail-misc.css`
16
-
- Printer board (grid view): a newly added printer no longer queues at the left edge below everything (every addition went further down one column, out of sight) nor piles up in the top-left corner. Unplaced machines are laid out FIRST, then their widgets under them (in page order a widget could be placed before its brand-new card and stack under a card that was not anywhere yet); a new machine takes the first free place in reading order big enough for its card AND its widget column (`planFreeSlot`); objects still waiting for a spot no longer count as obstacles at (0, 0) (`planFreeSpot`). After each layout, `_planSettleColumns` pushes down whatever a grown widget now covers (the units box gains rows when CFS / AMS data arrives), carrying on down the column so the fix never makes a new pile — only downward, never an object in the user's hand; two overlapping CARDS are left alone (may be deliberate) — `renderer/inventory.js`
17
-
- The main window now reopens where and how the user left it — size, position, maximized, full screen — instead of a fixed 1280×820 every launch. Saved to `<userData>/window-state.json` on move / resize (debounced) and on close (normal bounds kept while maximized); restored only if it still lands on a connected display (an unplugged monitor no longer opens the app off-screen); maximize / full screen applied at reveal so the hidden splash-gated window is not shown early. First launch (nothing saved) opens maximized — `main.js`
8
+
- Google sign-in failing with a bare "fetch failed" on some machines: the OAuth token exchange now goes through Electron's `net.fetch` (Chromium stack — system proxy, OS certificate store, same DNS as the browser) instead of Node's `fetch`, and the failure log includes the underlying cause — `main.js`
9
+
- Windows: the whole app crawled on some machines (every click, even a window resize, took one to two minutes) — the USB-scale detection enumerated HID devices SYNCHRONOUSLY on the main thread every 5 s (`HID.devices()`), and on slow HID / Bluetooth drivers each call took seconds. It now uses `HID.devicesAsync()` (worker thread) with an in-flight guard, and when a scan takes over 2 s it logs it and slows polling to once a minute. Confirmed by a user log on v2.32.0: the 10 s launch freeze persisted after the TD1S scan was removed — it was this HID enumeration all along (it runs right after the TD1S init) — `main.js`; `CODEMAP-main.md` discovery-probe ranges re-synced
18
10
19
11
## Removed
20
-
- The "Colour" column of the inventory table (spools and groups), the catalogue table and the favorites table — the photo's colour frame now carries the colour, so the round swatch repeated it. Also removed the now-unused `colorCircleHTML` helper and its table CSS (`td.color-cell`, `.pv-table td.color-cell`, two `.color-circle` overrides; the base `.color-circle` stays for TD1S) — `renderer/inventory.{js,html}`, `renderer/css/70-detail-misc.css`, i18n key
21
12
22
13
## i18n
23
-
- Removed: `thColor` (the Colour column is gone) — 11 locales
- Pending cleanup, carried over from v2.23.1: `scaleNoActivity` and `scaleReader` are orphaned — still shipped in all 11 locales, no longer referenced anywhere in `renderer/`
A fix for Windows computers where the app was extremely slow, and for Google sign-in.
2
+
3
+
## Fixed
4
+
5
+
- Fixed an issue where, on some Windows computers, the app was extremely slow: a black window at launch, then a minute or more for each click, even to resize the window.
6
+
- Fixed an issue where signing in with Google could fail with a "fetch failed" error on some computers.
7
+
8
+
---
9
+
10
+
📖 **[Full changelog](https://github.com/TigerTag-Project/TigerTag-Studio-Manager/blob/main/CHANGELOG.md)** · ⬇️ Grab the installer for your OS from the **Assets** below (macOS `.dmg`, Windows `Setup .exe` or `portable .exe`, Linux `.AppImage`).
0 commit comments