Skip to content

Commit 973bf65

Browse files
committed
v2.32.1 — Windows no longer freezes on slow USB drivers (async scale detection), Google sign-in goes through the browser's network stack
1 parent 60977b4 commit 973bf65

9 files changed

Lines changed: 139 additions & 39 deletions

File tree

‎CHANGELOG.md‎

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

66
---
77

8+
## v2.32.1 — 2026-09-29
9+
10+
### Fixed
11+
12+
- **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`.
14+
15+
---
16+
817
## v2.32.0 — 2026-09-29
918

1019
### Added

‎CODEMAP-main.md‎

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,12 @@ L3810-3870 App lifecycle (whenReady, window-all-closed, activate)
6262
|---|---|---|
6363
| 1505-1746 | Serial-port watcher, TD/color line parse, state replayed to renderer on reload; IPC `td1s:need` / `td1s:release` | `initTD1S` |
6464

65-
## Auto-updater + migration gate (L1826-1877)
65+
## Auto-updater + migration gate (L1977-2115)
6666

6767
| L | What | Anchors / IPC |
6868
|---|---|---|
69-
| 1380-1402 | Auto-update on/off preference (on disk) | `readAutoUpdatePref`, `writeAutoUpdatePref` |
70-
| 1403-1553 | Updater event wiring; IPC: `migration:set-in-flight`, `install-update`, `update:set-auto` | `wireUpdaterEvents`, `initUpdater` |
69+
| 1977-1999 | Auto-update on/off preference (on disk) | `readAutoUpdatePref`, `writeAutoUpdatePref` |
70+
| 2000-2115 | Updater event wiring; IPC: `migration:set-in-flight`, `install-update`, `update:set-auto` | `wireUpdaterEvents`, `initUpdater` |
7171

7272
## Google auth loopback, shell, detached cam window (L1554-1749)
7373

@@ -82,17 +82,17 @@ L3810-3870 App lifecycle (whenReady, window-all-closed, activate)
8282
|---|---|---|
8383
| 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` |
8484

85-
## Printer discovery probes (L2362-2746)
85+
## Printer discovery probes (L2395-3130)
8686

8787
| L | What | Anchors / IPC |
8888
|---|---|---|
89-
| 1940-2059 | FlashForge — HTTP POST bridge (`ffg:http-post`), UDP multicast (`ffg:multicast-discover`) | — |
90-
| 2060-2161 | FlashForge — UDP identity probe port 19000 (`ffg:udp-probe`, returns model+serial credential-free), TCP M115 probe (`ffg:tcp-probe`) | `_ffgParseUdpIdentity` |
91-
| 2162-2193 | Creality — TCP 9999 open-check (`cre:tcp-probe`) | — |
92-
| 2194-2442 | Bambu Lab — SSDP multicast (`bambu:ssdp-discover`) + TLS cert sniff (`bambu:tls-probe`) + print thumbnail via FTPS | `_parseBambuSsdp` |
93-
| 2443-2560 | Elegoo — UDP discovery/probe (`elegoo:udp-discover` / `elegoo:udp-probe`) | `_parseElegooReply` |
94-
| 2561-2610 | Snapmaker — HTTP GET bridge (`snap:http-get`) | — |
95-
| 2611-2661 | Creality — Moonraker HTTP IPC port 7125, live controls (`cre:http`) | — |
89+
| 2395-2531 | FlashForge — HTTP POST bridge (`ffg:http-post`), UDP multicast (`ffg:multicast-discover`) | — |
90+
| 2532-2615 | FlashForge — UDP identity probe port 19000 (`ffg:udp-probe`, returns model+serial credential-free), TCP M115 probe (`ffg:tcp-probe`) | `_ffgParseUdpIdentity` |
91+
| 2616-2700 | Creality — TCP 9999 open-check (`cre:tcp-probe`) | — |
92+
| 2701-2900 | Bambu Lab — SSDP multicast (`bambu:ssdp-discover`) + TLS cert sniff (`bambu:tls-probe`) + print thumbnail via FTPS | `_parseBambuSsdp` |
93+
| 2901-3015 | Elegoo — UDP discovery/probe (`elegoo:udp-discover` / `elegoo:udp-probe`) | `_parseElegooReply` |
94+
| 3016-3065 | Snapmaker — HTTP GET bridge (`snap:http-get`) | — |
95+
| 3066-3130 | Creality — Moonraker HTTP IPC port 7125, live controls (`cre:http`) | — |
9696

9797
## Infra IPC — image cache, subnets, mDNS, app info, DB (L2663-2818)
9898

@@ -126,7 +126,7 @@ L3810-3870 App lifecycle (whenReady, window-all-closed, activate)
126126
| 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` | — |
127127
| 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` |
128128

129-
## Anycubic LAN — MQTT, provisioning, FLV camera (L3992-4323)
129+
## Anycubic LAN — MQTT, provisioning, FLV camera (L4211-4547)
130130

131131
| L | What | Anchors / IPC |
132132
|---|---|---|
@@ -135,7 +135,7 @@ L3810-3870 App lifecycle (whenReady, window-all-closed, activate)
135135
| 3403-3425 | Slicer on-disk credential reader (`anycubic:read-slicer-config`) — keyless deobfuscation | `_acuDeobfuscate`, `_acuConfCandidates` |
136136
| 3426-3533 | LAN scan: TCP probe (`anycubic:tcp-probe`), FLV liveness (`anycubic:flv-probe`, accepts 200/206), `/info` (`anycubic:http-info`) | — |
137137

138-
## Anycubic cloud — REST + cloud MQTT (L4324-4789)
138+
## Anycubic cloud — REST + cloud MQTT (L4548-5023)
139139

140140
| L | What | Anchors / IPC |
141141
|---|---|---|
@@ -145,8 +145,8 @@ L3810-3870 App lifecycle (whenReady, window-all-closed, activate)
145145
| 3858-3894 | Cloud-uploaded files (§9c): `cloud-files-list` (POST `/work/index/files`), `cloud-file-delete` (POST `/work/index/delFiles`); print reuses `cloud-send-order` order 1 | — |
146146
| 3895-3999 | Shared cloud-MQTT client (one per user): `cloud-connect` / `subscribe` / `publish` / `unsubscribe`; RSA-encrypted token login | `_buildCloudLogin`, `_routeCloudMessage`, `_ensureCloudClient` |
147147

148-
## App lifecycle (L4790-4855)
148+
## App lifecycle (L5024-5089)
149149

150150
| L | What |
151151
|---|---|
152-
| 4790-4855 | `app.whenReady` (img cache dir, server, window, NFC/TD1S/updater init), `window-all-closed`, `activate` |
152+
| 5024-5089 | `app.whenReady` (img cache dir, server, window, NFC/TD1S/updater init), `window-all-closed`, `activate` |

‎FEATURES.md‎

Lines changed: 1 addition & 1 deletion
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 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`.
44

55
---
66

‎WORKLOG.md‎

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,13 @@
1-
# Worklog — v2.32.0
1+
# Worklog — v2.32.1
22

33
## Added
4-
- 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`
54

65
## 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`
96

107
## 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
1810

1911
## 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
2112

2213
## i18n
23-
- Removed: `thColor` (the Colour column is gone) — 11 locales
24-
- Added: `stgMcpTitle`, `stgMcpToggleSub` (the ⓘ bubble), `eacMcpRow`, `stgMcpAddClaude`, `stgMcpAddCursor`, `stgMcpAddVscode`, `stgMcpAddOpened`, `stgMcpAddFailed`, `stgMcpNewKey`, `stgMcpNewKeyTip`, `stgMcpError` — 11 locales
25-
- 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/`

‎data/release-notes/v2.32.1.md‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
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

Comments
 (0)