Changelog
v0.76.1 — 2026-09-02
Fixes
- fix(rings): a ring drags towards the pointer whichever end it hugs (13.44); a wheel notch glides to its step (13.45) (7eae3ed)
Other
- docs(tasks): v0.76.0 shipped and verified (13.43) (83c3147)
v0.76.0 — 2026-09-02
Features
- feat(rings): one to three rings per set of cables, Unbind takes one ring, rings stand square and clear of the tile (13.36–13.39); C arms the connector tool (13.41); a wheel notch is a step (13.40c) (92b0e23)
Fixes
- fix(rings): a new ring never inherits a stale registry entry (13.42) (b922047)
- fix(pwa): a browser "skip this version" covers the waiting worker, not the running version (13.32) (8f9593d)
Other
- docs(ai-qa): directed run report for v0.76.0 (0c01da3)
- docs(tasks): v0.75.0 tag run green (13.35) (e814447)
- docs(tasks): v0.75.0 shipped and verified (13.35) (1d2bd80)
v0.75.0 — 2026-09-02
Features
- feat(drawio): a saved file carries each tile's icon, so draw.io shows the drawing you made (13.19) (00a4c52)
Other
- docs(ai-qa): directed run report for v0.75.0 (13.19) (c5dc24f)
- docs(tasks): 13.19 investigated — embedded icons cost ~700 B per device and render as the tile in draw.io (05b339e)
- docs(tasks): v0.74.1 tag run green (13.34) (6b18919)
- docs(tasks): v0.74.1 shipped and verified (13.34) (253b31f)
v0.74.1 — 2026-09-02
Fixes
- fix(collab,pwa): a stale tab says so before hosting, and the agent names the right host (13.8, 13.9) (6406279)
- fix(canvas): a port label is placed from where the cable leaves the tile (13.28) (3054cf2)
Other
- test(e2e): read the toolbar's Import/Export pair as one settled snapshot (13.33) (5c4f706)
- test(api): the parity test compares the drawing, not the pixels (11.616) (05fa410)
- docs(tasks): v0.74.0 shipped and verified (13.31) (cec089e)
v0.74.0 — 2026-09-02
Features
- feat(import): Cisco LLDP detail and both Aruba LLDP families import (13.26) (1468114)
- feat(import,legend,drawio): feedback round — merge on import, FortiSwitch LLDP, sticky legend rows, no draw.io arrowheads (13.18, 13.20, 13.21, 13.22) (e5dd67c)
- feat(deploy): the feedback relay watches its own token expiry, and publish.sh reads it (13.24) (e6b5273)
Fixes
- fix(import,legend): the pre-v0.74.0 QA run's three findings (13.27, 13.29, 13.30) (b6210d8)
- fix(deploy,ci): two mirrors for the render image, and Playwright on Linux (13.16, 13.17) (c93516c)
Other
- docs(deploy): the attachment token is rotated — expires 2027-08-31 (13.25) (1bffe1b)
v0.73.0 — 2026-09-01
Features
- feat(editor): a resize sticks at a neighbour's size, and Shift keeps the proportions (13.11) (c77d4e4)
Fixes
- fix(ci): the two Linux-only failures that blocked the release (13.13, 13.14) (eeaf909)
Other
- docs(ci): the hosted gate is wasm + linux e2e, not ubuntu + windows (13.12) (2536ce3)
- docs(tasks): 13.10 — v0.72.1 released and verified (723a7a1)
v0.72.1 — 2026-08-31
Fixes
- fix(collab): a damaged invite explains itself, and the share popover anchors to the toolbar (12.36, 13.7) (e5df40e)
Other
- docs(release): v0.72.1 notes — damaged-invite explanation and share-panel placement (e75fac5)
- docs(qa): invite-path verification run — flow proven live, friend's failure diagnosed as 12.36; findings 13.7–13.9 filed (f7e2ee4)
- docs(tasks): 13.6 — v0.72.0 released and verified (97f0c15)
v0.72.0 — 2026-08-30
Features
- feat(shapes): a custom icon inside the device tile (13.4) (5d1dd7b)
- feat(model): a device carries a Link — sixth asset-data field, draw.io's own link attribute (13.3) (fe66353)
- feat(export): PDF exports the whole document, one sheet per page (13.2) (2ceb100)
- feat(files): compressed legacy draw.io pages inflate and open editable (13.1) (3422aca)
Other
- docs(ai-qa): close out the pre-v0.72.0 run report — observation filed as 13.5 (2fa3a2f)
- docs(release): v0.72.0 notes, pre-release directed run, and finding 13.5 (526112f)
- docs(tasks): 13.2 shipped in 2ceb100 — record the result (53d9c74)
- docs(tasks): phase 13 — four parity features chosen from the 2026-08-30 draw.io scout (13.1–13.4) (7998694)
v0.71.0 — 2026-08-30
Features
- feat(collab): a 20-minute open door, and browser sharing finished (12.13, 12.6) (80ad30a)
- feat(license): move from Apache-2.0 to PolyForm Shield 1.0.0 (12.35) (96dbf8e)
Fixes
- fix(release): let publish.sh forward --no-qa, and record why (12.45) (be11d8b)
Other
- docs(tasks): 12.35 licence page is live on the website, /app/ deliberately unchanged (da9727c)
- docs(tasks): 12.33 shipped in v0.70.0, verified from the artifacts users get (005a518)
v0.70.0 — 2026-08-28
Features
- feat(agent): an AI joins the session and draws while you watch (12.33) (23452ab)
- feat(release): ask whether anyone looked at the product before a minor ships (b27d81f)
- feat(deploy): the render stack follows the tag, and its drift has a number (e5bc245)
Other
- docs(qa): directed pre-v0.70.0 run — the agent feature proven on the real relay (60854d2)
- docs(tasks): an AI can join a live session — the peer already exists as test code (12.33) (69af580)
- docs(release): announce the MCP page rewrite, and correct 12.32's note (c596551)
- docs(mcp): the hosted door leads the page, and the site says it exists (10c6e2f)
- docs(qa): run the pass v0.69.0 shipped without, and file what it exposed (34046c4)
- docs: the MCP door's missing concurrency check was an isolation gap, not a slow path (0989b9f)
v0.69.0 — 2026-08-28
Features
- feat(hosted): unrestricted quotas, per-request usage detail, shortfall autoscaling (25daa82)
Fixes
- fix(render-edge): the relay's pid limit was the whole door's connection limit (d341885)
- fix(mcp): the hosted MCP door queued without bound, and health could not see it (5ae6bdf)
- fix(privacy): the hosted-API disclosure had lost its edit, and nothing noticed (68b3bfc)
- fix(autoscale): reach the warm floor from below, not only refuse to fall past it (0a0a826)
Other
- docs: what the hosted door actually does, measured from outside (acca235)
- docs(tasks): 12.16-12.18 shipped in v0.68.0 (a6e31e6)
v0.68.0 — 2026-08-26
Fixes
- fix(collab): let a browser and a desktop actually share a session (f44b441)
Other
- docs(release): notes for browser-and-desktop sessions, and the rebuilt share panel (745c7de)
- docs(tasks): close 12.9, and log the two things I had left unwritten (cbbe215)
- docs(tasks): 12.12 shipped and verified; record the open-door request as 12.13 (30e752e)
v0.67.0 — 2026-08-26
Features
- feat(collab): point browser peers at the same-origin relay, and revert the CSP (1c2b3da)
- feat(deploy): gate the relay transport to our own origin (c3c1d3c)
Other
- docs: say plainly that a browser session now relays through our server (b396a35)
v0.66.0 — 2026-08-26
Features
- feat(collab): self-hosted relay, single-relay clients, and a short invite link (2e9b248)
Other
- docs(release): notes for the shorter invite link (f3fda58)
- docs(tasks): promote the relay self-hosting work to 12.12 (93da7eb)
- docs(tasks): self-hosting the relay, reframed around one firewall opening (a80c70f)
v0.65.0 — 2026-08-26
Features
- feat(collab): rename yourself mid-session, without reconnecting (7731d99)
Other
- docs(tasks): cost out self-hosting the collab transport (5ec99d7)
v0.64.1 — 2026-08-26
Fixes
- fix(collab): the share panel, the join toast, and pasting a web invite (a42684a)
v0.64.0 — 2026-08-26
Features
- feat(collab): collaboration in the browser (afe3d67)
- feat(collab): build the browser iroh binding, and settle the CSP question (a64deb6)
Fixes
- fix(collab): actually commit the collab wasm artifact (6dcd1b7)
Other
- docs(release): notes for collaboration in the browser (82ede96)
- refactor(collab): put the transport on a runtime seam so a browser can run it (07cd128)
- refactor(collab): make the auth handshake runtime-agnostic (WebCrypto) (f13d15b)
- docs(collab): task 12.8 — session labels carried in the link (48186b1)
- test(collab): prove browser-to-browser, and mark the gap it does not close (0bcc499)
- docs(collab): Phase 12 — hosted collab, and the spike that unblocked it (4defb47)
- docs(tasks): 11.618 shipped in v0.63.2 (ae48b82)
v0.63.2 — 2026-08-26
Fixes
- fix(app): the Role and Functions fields now show what they know (80576df)
v0.63.1 — 2026-08-25
Features
- feat(mcp): tell the client how to use the server, before it asks (4605fb1)
Other
- docs(release): notes for the MCP handshake instructions and kind vocabulary (be34f1a)
v0.63.0 — 2026-08-25
Features
- feat(api): the MCP tools teach the product, not just the contract (0d30c55)
- feat(desktop): watch the open document for changes made by anything else (bafb282)
- feat(api): every result suggests what to call the files (c919f1f)
- feat(app): device role and functions, drawn and reaching every surface (d467c44)
- feat(model): device role and functions — the model, collab and repaint halves (77b214f)
Fixes
- fix(site): a #heading deep link landed behind the sticky header (da5eeba)
- fix(hosting): the Debian mirror is a deploy-time choice (ebd57b6)
Other
- docs(release): notes for the role/functions, file-watch and MCP guidance release (4c0ca03)
- docs(tasks): 11.613 + 11.614 from Discord feedback on the MCP door (fe798d3)
- docs(tasks): 11.612 done — device role and functions (1375da7)
- docs(manual): local models on the MCP page — LM Studio, Ollama, DIY, hosted door (3941791)
- docs: tasks 11.607-11.609 (replicas, scaler, mirror), and the local-LLM MCP cookbook (16da438)
v0.62.1 — 2026-08-24
Features
- feat(hosting): queue-driven autoscaling for the render replicas (a346c85)
- feat(hosting): one render per container — N replicas, MAX_CONCURRENT=1 (8effaf3)
- feat(hosting): go-live wiring — edge, stats and the hosted disclosure (fe83c01)
Fixes
- fix(test): the autoscale shims must beat Git bash's own curl on Windows (e2f32f7)
- fix(test): unblock the v0.62.1 gate — parity is the drawing, fixtures leave RFC 1918 (ffc6627)
- fix(hosting): autoscaler freezes on version skew instead of mis-scaling (5b27dcd)
- fix(stats): the api section's empty state no longer contradicts the Today tile (a858ad8)
- fix(stats): the today block shows API + MCP calls the hour they happen (06e7c68)
- fix(hosting): socat relay — caddy's file caps refuse exec under NNP + cap_drop ALL (0c9427e)
Other
- docs(tasks): v0.62.0 shipped, the hosted door is live (11.604-11.606) (60e632d)
v0.62.0 — 2026-08-24
Features
- feat(hosting): identity, quotas, and MCP over HTTP (11.602) (c8d0b9d)
- feat(hosting): the hardened render service, built dark (11.601) (75899e6)
- feat(api): the local HTTP door + OpenAPI (11.600) (80cccb4)
- feat(mcp): the disclosure — privacy, docs page and manual (11.599) (b3f327d)
- feat(mcp): create_diagram, and the quality bar it had to clear (11.598) (65671ab)
- feat(mcp): export over MCP, and --doc reaches every kind (11.597) (51a668c)
- feat(site): search across /docs/, using the app's own manual matcher (11.603) (642c4f5)
- feat(mcp): describe — the document as structured JSON (11.596) (79e5e80)
- feat(mcp): core API handlers and
Drawbridge --mcpstdio door (11.595) (6421b0f)
Other
- docs(tasks): both front doors — a public API and MCP (11.594, +11.600-11.602) (4852e37)
- docs(tasks): decompose the MCP build into 11.595-11.599 (3004cbb)
- docs(tasks): the MCP decision, and a correction about hosting (11.594) (8cd3126)
- docs(tasks): what an MCP server would mean for the product (11.594) (99b7e51)
- docs(tasks): v0.61.4 released (11.593) (48e58ad)
v0.61.4 — 2026-08-24
Features
- feat(minimap): the overview draws notes, callouts and group frames (11.498, 11.512) (aa25d66)
- feat(marketing): the banner IS the canvas (11.590) (0c5dfba)
- feat(marketing): a profile-picture and banner kit drawn from the app's own art (3e93414)
Fixes
- fix(annotations): a connector annotation's caption takes its colour (11.576) (b6a7372)
- fix(ci): the collab suite gets the release gate to itself (11.582) (e4efd1e)
- fix(connections): naming a ring reveals where its caption goes (11.588) (0dceb94)
Other
- docs(release): the notes for v0.61.4 (3a87703)
- docs(qa): the second directed run before v0.61.4 — REG-05 passes now (11.592) (d202eb6)
- docs(tasks): close 11.498, 11.512, 11.575, 11.576, 11.582, 11.589; file 11.591 (550c849)
- docs(connectors): unlinking leaves the join, and both sides now say so (11.575) (e0a2fb0)
- docs(qa): Setup A's real dismissal, and four gestures that fake a defect (11.589) (a5a5b75)
- docs(qa): the directed run before v0.61.4 (f5a3919)
- docs(qa): the short run's second sitting — exports, pages, shell, REG-23 (c9077d5)
- docs(qa): the post-v0.61.3 short run, and what it found about the suite (2c14550)
- docs(qa): the v0.61.3 release record (9f8fb26)
v0.61.3 — 2026-08-23
Fixes
- fix(branding): the watermark fits the drawing instead of running off it (11.581) (03f9711)
- fix(manual,trail): word-start search, and a closed page is never silent (11.584) (095654d)
- fix(export): the print document carries no style text at all (11.566) (5713a24)
- fix(model): the already-marked placement button clears a dragged caption (11.573) (5887256)
- fix(inspector): a run plus a connector extends the run (11.574) (1f14a43)
- fix(inspector): ring colour asks which ring instead of hiding (11.572) (a9dc04d)
Other
- docs(release): the notes for the six QA fixes (a8fa2e2)
- docs(qa): the pre-v0.61.2 directed run, and the release record (fb9eaca)
v0.61.2 — 2026-08-23
Fixes
- fix(trail,manual): finish 11.565, and undo 11.567's precision regression (7a6bb23)
- fix(trail,manual): a page switch is not a mass delete; city finds cities (b245b8a)
- fix(test): drop an unnecessary cast lint rejected (2a39d70)
- fix(map): Add place… does not join a same-named device layer (5480bde)
Other
- docs(release): the notes match what the fixes actually cover (e5ba5d1)
- docs(release): the v0.61.2 notes (7dd94ab)
- docs(tasks): record the v0.61.1 release (7784a06)
v0.61.1 — 2026-08-23
Fixes
- fix(import): an import is one undo step, title and all (665e41e)
- fix(canvas): a grab halo stays invisible, and handles track the zoom (c2cce14)
- fix(shell): a hidden object leaves the selection, and ⋯ stays usable (2d27bce)
- fix(export): the printed sheet carries the branding (17b3187)
- fix(rack): a mounted unit drags to another U again (c058f09)
Other
- docs(tasks): the stale-knock transport test is 16ms from flaky (9fee436)
- docs(qa): the pre-v0.61.1 directed run, and one observation filed (0855030)
- docs(release): the v0.61.1 notes (efc514c)
- docs(tasks): record the v0.61.0 release (dff695f)
v0.61.0 — 2026-08-23
Features
- feat(shapes): a Shape section for the basic shapes' Dashed and Filled (9bfbcb7)
Fixes
- fix(canvas): a pan must never re-write the zoom, overview included (1f039c9)
- fix(map): place a crowded extent's city names around the cluster (8a20fa9)
- fix(canvas): let Fit go below the zoom floor, but not the buttons (b77b857)
Other
- docs(tasks): renumber three task IDs that were already taken (4ee572e)
- docs(qa): the pre-v0.61.0 full run, and five more findings (24b5a40)
- docs(qa): four findings from the containers and files pass (cc0341d)
- docs(qa): four findings from the containers and files pass (e45ac45)
- docs(qa): four findings from the app-menu and pages pass (9bc10ce)
- docs(qa): two findings from the pre-v0.61.0 full run (f6f40fb)
- docs(release): the v0.61.0 notes (8218193)
- chore(ci): pause the hosted CI gate until 2026-09-01 (c6daaed)
v0.60.2 — 2026-08-23
Fixes
- fix(align): step the gap rank by rank, not box by box (40e4cd8)
- fix(app): empty a generated block instead of removing it (f64459c)
- fix(app): judge the subnet hint on Management IP, not only the label (725b6b2)
- fix(app): boot with local storage denied instead of dying in a dead zone (54b676b)
Other
- docs(qa): the pre-v0.60.2 targeted run, and the release notes (dcdbf8f)
- docs(tasks): record the three product decisions, and file the rule gap (5f6d5e4)
- docs(tasks): record the v0.60.1 release (17eaf1d)
v0.60.1 — 2026-08-22
Features
- feat(keys): bind ⌘B / ⌘I / ⌘U, and make every shortcut platform-correct (11.539) (8136125)
Fixes
- fix(compare): the panel says read-only, so the document is (11.554) (0833701)
- fix(bug-report): one answer to how big an attachment is (11.557) (9b19d74)
- fix(inspector): three from the containers pass — subnet, cities, unit rows (11.553) (6e28c0c)
- fix(bounds): export and fit follow a grown bubble's drawn height (11.558) (26909e2)
- fix(iso): bound a billboarded node as it is drawn, not as a rhombus (11.545) (d8fc62d)
- fix(paint): stop painting labelPos and align where the renderer ignores them (11.535) (96584cc)
- fix(color): one drag is one undo step, and the accents follow the theme (11.486) (1e8cbdd)
- fix(build): stamp the bundle with a date, not a millisecond (11.513) (26f4de8)
- fix(canvas): the resize handles follow the drawn height too (11.547) (2a0eb82)
- fix(schedule): ⌘Z reaches the schedule even when focus never entered it (11.551) (25d453c)
- fix(canvas): the selection ring follows the height a callout is DRAWN at (11.547) (4d36fb2)
- fix(canvas,iso,docs): callouts grow, captions clear the chassis, Space activates, and the QA suite tells the truth (11.489, 11.497, 11.492, 11.337, 11.487, 11.350, 11.360, 11.342, 11.365, 11.490, 11.496, 11.463, 11.538, 11.540) (c014baa)
- fix(store,canvas): the wrong layer was being deleted, and fit-to-view clipped captions (11.440, 11.441, 11.340, 11.341, 11.358) (bc7cda5)
- fix(schedule,links): undo reaches inside the dialog, and a broken link says something a person can read (11.494, 11.495) (8fc9e92)
- fix(collab): a host cannot be read-onlyed by a straggler, and NaN stops at the write side (11.344, 11.349) (84e75d5)
- fix(files,ui): New starts a new file, a refused revision says so, and four smaller lies (11.347, 11.348, 11.493, 11.500, 11.366, 11.363) (75a340b)
- fix(chrome,bug-report): legible under a clamped font, and a report a triager can trust (11.435-11.439, 11.364) (f451810)
- fix(inventory,objects): the CSV lists devices, and the object list sorts A-Z (11.362, 11.443) (e2d8f5e)
- fix(scripts,deploy): one main-module guard, and a scan that cannot abort (11.329, 11.330) (9fe317a)
- fix(drawio): one owner per style key — no kind writes verticalAlign twice (11.332) (ed9566f)
- fix(routing): an annotation is not an obstacle (11.444) (33029c4)
- fix(canvas): the lock holds on racks and zones too (11.338) (9973c59)
- fix(site): inlined markdown is content, not a template (11.352) (732c331)
- fix(clipboard): a copy carries every field of the node it copied (11.462) (810e2b1)
Other
- docs(qa): the pre-v0.60.1 targeted run, and one observation filed (beebafa)
- docs(release): notes for the next release (0ba9084)
- docs(qa): PAL-03 counts thirteen sections, and a test keeps it counting (11.559) (9995669)
- docs(qa): the 2026-08-22 full run — 222 scenarios, no regression, six defects filed (a41651e)
- docs(qa): file the shell/palette findings, and record two traps that cost a lane real time (11.548-11.550) (403771b)
- docs(qa): repair three malformed watchlist rows and two scenario ids that point at nothing (6cc2ad5)
- docs(qa): the 2026-08-22 full run — gate green on all eight legs, scenarios in flight (928551a)
- test(keys): the DOM suite presses the platform's own modifier (11.539) (655eec7)
- docs(tasks): close five tasks whose only remaining value was historical (99b7af4)
- docs(tasks): audit the 80 open tasks against the tree — six were already done (c535b19)
- docs(tasks): 11.531 — v0.60.0 released; the gate's one abort was the test budget, fixed (1714adb)
v0.60.0 — 2026-08-21
Features
- feat(connectors): an Auto cable leaves within the middle half of a side (11.519, 11.520) (43dbfb9)
Fixes
- fix(connectors): a direct run's corner is the average, not the intersection (11.529) (f0fe9b7)
- fix(connectors): weld run corners on the routed geometry, not the ideal (11.528) (66ad3c8)
- fix(connectors): trim the corner overshoot, derive the missing side (11.527) (6dd46e2)
- fix(connectors): tiles touching edge-to-edge no longer collapse the pair onto one line (11.526) (40e4049)
- fix(connectors): a straight-through run is a straight line (11.525) (78c7352)
- fix(connectors): a run's corner is the true intersection of its two lanes (11.524) (05049ff)
- fix(connectors): the lane moves the whole route, spaced alike on both axes (11.523) (2ac065f)
- fix(connectors): the clamp scales a side's whole fan instead of piling it up (11.522) (6786890)
- fix(connectors): a parallel pair keeps the same lane at both ends (11.521) (b88f841)
- fix(connectors): two parallel Auto cables never coincide (11.521) (79c2d04)
- fix(connectors): the corner's real branch — a 64px tile misses a 28px cap (11.518) (36ffa36)
Other
- test: subprocess tests in ci-linux.test.ts get a load-proof budget (4242032)
- docs(release): the day's routing work, in the notes (7584ed2)
- style: no assertions in the weld terminal reader (03e722f)
- style: eslint --fix on the weld pass (non-nullable assertions) (a61da2f)
- docs(tasks): 11.517 — v0.59.1 released, third billing abort in a row (aae04e6)
v0.59.1 — 2026-08-21
Fixes
- fix(connectors): a linked run's corner, and the overview that was an edit behind (11.515, 11.516) (b9f5401)
Other
- docs(tasks): 11.514 — v0.59.0 released, and the pre-flight skipped on evidence (1b76932)
v0.59.0 — 2026-08-21
Features
- feat(connectors): a cable run acts as one cable (11.507) (d5796b4)
- feat(connectors): two runs through one icon run parallel, not knotted (11.507) (6bdb83a)
- feat(connectors): cable runs — link connectors into one line (11.507, WIP) (d4546e9)
- feat(updates): the offer says what is coming, and hands out the newest (11.503) (cb279e3)
Fixes
- fix(connectors): crossings always bump, and a through cable's own ends stay on the border (11.510, 11.511) (379a6b5)
- fix(connectors): if cables cross, they bump — no silent exceptions (11.510) (16439b0)
- fix(connectors): the bend always closes, and an icon can cover a through cable (11.509) (703a0e5)
- fix(connectors): lanes get their own pins, and runs nest at corners (11.508) (23b60fb)
- fix(connectors): three cables between one pair, three visible cables (11.506) (03f3f3f)
- fix(connectors): a through cable keeps the icon's centre, whatever runs beside it (11.506) (16cf3dc)
- fix(connectors): two through cables turning a corner read as one line (11.504) (9b09995)
Other
- docs(qa): the pre-v0.59.0 FULL run, its two findings, and the last release notes (bc221a1)
- docs(tasks): 11.507 — cable runs, the product decision and the design sketch (98245c8)
- docs(qa): the pre-v0.59.0 targeted run, and 11.506 from it (4abdcf4)
- ci: the Windows leg runs locally, on a real machine over ssh (11.505) (c32002e)
- docs(tasks): 11.502 — v0.58.0 released, and the deploy trigger's fallback exercised (25a2421)
v0.58.0 — 2026-08-20
Features
- feat(app): cables that run through the icons, and a colour picker (11.483–11.486) (67e4bc0)
Fixes
- fix(inspector): every row of the colour sheet reads as a row (11.488) (a40f008)
- fix(inspector): the colour picker's hex field shows the selection's colour (11.484) (491b6de)
Other
- docs(qa): the pre-v0.58.0 targeted run, and 11.497–11.501 from it (dff6d8c)
- docs(tasks): 11.492–11.496 — what the connector QA pass found (4d7cf1f)
- docs(tasks): 11.487 — updateHover reads the canvas rect twice per move (3fb4a38)
- docs(release): notes for the through connectors, the colour picker and the painter fix (5ddf4bf)
- build(ci): cut the hosted run to what it alone can answer (11.480) (5081550)
- build(ci): run the Linux leg locally, and trim hosted CI to what this Mac cannot do (11.479) (7bbd77d)
- docs(tasks): 11.478 — v0.57.3 released, cross-OS gap recorded (d71a6d2)
v0.57.3 — 2026-08-20
Fixes
- fix(toolbar): Import and Export fold together, because now something makes them (11.476) (e7de27a)
Other
- docs(tasks): 11.477 — the 4-second billing aborts are back and blocked v0.57.3 (f0d6e8f)
- docs(release-notes): Import and Export fold together, for the next release (bb3c737)
- docs(tasks): 11.475 — tag run read, green on all four jobs (f18b1de)
- docs(tasks): 11.475 — v0.57.2 released; 11.476 — toolbar sheds Import, keeps Export (e3543e7)
v0.57.2 — 2026-08-20
Fixes
- fix(canvas): a Direct crossing bumps unless the device itself hides it (11.472) (e0b38ed)
Other
- build(release): give dmgbuild longer to detach its staging volume (11.473) (01595c1)
- docs(release-notes): the crossing-bump fix, for the next release (3a6c7aa)
- docs(tasks): 11.471 — v0.57.0 released; first publish exited 0 and did nothing (7c18f0f)
v0.57.0 — 2026-08-18
Features
- feat(layers): choose the layer you are drawing on, and never land out of reach (11.470) (fed4458)
- feat(canvas): a cable and its annotations follow their layer (11.442) (69975bb)
- feat(canvas): layers decide what is on top, and Send to back means it (11.442) (8e10b46)
- feat(site): the feedback form asks WHERE to reach you, not just for an email (11.469) (3c98c80)
Other
- docs(tasks): 11.468 — re-verify on a fresh v0.56.0 build; first repro was stale (e3ea6f0)
- docs(tasks): 11.469 deployed to the live site and verified there (087cbdd)
- docs(tasks): 11.468 — layers don't work around it either, proven by probe (25886fe)
- docs(tasks): file 11.468 — an image can never be put behind a connector (issue #21) (6292ac1)
- docs(tasks): v0.56.0 released and verified end to end (11.465) (5a5de32)
v0.56.0 — 2026-08-18
Features
- feat(shapes): the line and the arrow behave like connectors (11.433) (1f76153)
- feat(layers): hidden means hidden, locked means locked, and the list reads top-first (11.430) (e386c77)
- feat(search): ship our own clear ✕ on every search field (11.432) (7d4dc75)
Fixes
- fix(tests): two guards from the 11.430-11.433 batch only passed on macOS (11.466, 11.467) (4d9b50e)
- fix(review-a): connector gestures — the drag issues the drop's commands (11.447, 11.448, 11.452, 11.457, 11.458) (15ea627)
- fix(review-b): geometry writes re-seat fastened ends; four lock refusals; line inspector controls (11.449–11.451, 11.453, 11.454) (3504b7d)
- fix(review-c): format-paint size trade, view switches, ingestion invariants, IME Escape (11.446, 11.455, 11.456, 11.459) (7084ef6)
- fix(palette): degrade gracefully under foreign font metrics (11.431) (cfcc62b)
Other
- docs(release): notes for v0.56.0; fix a lint error the fix pass left on main (950bf2d)
- docs(tasks): tick 11.446–11.459 — the review fix pass is merged; file 11.461–11.463 (d85a1c6)
- test(inspector): a line's caption buttons write, not merely show (11.447+11.451 seam) (c78af66)
- docs(tasks): file the 11.430–11.433 code-review findings as 11.446–11.460 (c33c5d9)
- docs(tasks): 11.430–11.433 shipped by four Opus 5 workers; 11 findings filed as 11.435–11.445 (a45a7fd)
- chore(e2e): make dev-server ports env-overridable for parallel worktrees (cd35b04)
- docs(tasks): file 11.434 — v0.55.0 shipped through the outage; add worker agent definition (b61362e)
v0.55.0 — 2026-08-17
Features
- feat(groups): tab strip on one line, canvas name labels, auto-naming (11.426–11.428) (9b2cf02)
Fixes
- fix(e2e): title-block divider spec measures with one stick — closes 11.429 (c2cf485)
Other
- docs(tasks): 11.433 — user summary is the spec; recording is optional background (05878b1)
- docs(tasks): file 11.433 — line and arrow should behave like connectors, not squares (e301ccd)
- docs(tasks): file 11.432 — icon-search clear button is the browser's own; ship a real one (9294625)
- docs(tasks): 11.430 gains the popover dismissal finding — canvas clicks must not close the Layers panel mid-flow (4f4324e)
- docs(tasks): 11.430 gains the locked-layer delete bug — lock must disable the popover's delete (1b46843)
- docs(tasks): 11.430 gains the hidden-layer adornment bug — port labels and ring markers survive hiding every layer (875aead)
- docs(tasks): file 11.431 — left palette breaks under foreign font metrics (9c7b778)
- docs(tasks): file 11.430 — validate layers, top-first dropdown order, drag-to-reorder (1ba95dc)
- docs(release): notes for the groups polish (b479dad)
- docs(tasks): file 11.429 — title-block divider e2e red on main after 11.426 merge; do not release until green (3d075fb)
- docs(tasks): file 11.425 — v0.54.0 shipped; tag CI run read, green (9371d04)
v0.54.0 — 2026-08-17
Features
- feat(groups): named groups and a Groups inspector tab (11.423) (0d83abf)
- feat(align): space evenly per row, and a gap stepper (11.416–11.422) (b6dd256)
Fixes
- fix(export): print-iframe styles survive the production CSP (11.424) (1417303)
Other
- docs(release): notes for the PDF export fix and the Groups view (7102ee5)
- docs(tasks): v0.53.5 tag CI run read — green on all four jobs, 227 e2e (8ed80f8)
- docs(tasks): file 11.414 — an undeclared access-pair ISL demotes a declared tier-1 peer (c9b1c4e)
v0.53.5 — 2026-08-17
Fixes
- fix(import): read FortiLink dumps from stacks whose switches have names (11.413) (4f19ec5)
Other
- test(import): drive the real Import dialog with a named FortiLink stack (11.413) (5d96d33)
- docs(tasks): pin how long the named-stack import was broken — 53 releases (11.413) (c0dfb25)
- docs(tasks): v0.53.4 tag CI run read — green on all four jobs (11.412) (8e70415)
- docs(tasks): v0.53.4 shipped — the toolbar arranged by purpose (11.412) (9cee802)
v0.53.4 — 2026-08-17
Other
- refactor(toolbar): group the top bar by purpose (11.411) (c5a8590)
- docs(tasks): v0.53.3 shipped — the label-wrap bound, proven on the tag run (11.410) (c37f8a4)
v0.53.3 — 2026-08-16
Fixes
- fix(labels): recalibrate the wrap bound from CI, not from one platform (11.407) (3887631)
- fix(labels): make the wrap table an upper bound, measured (11.407, 11.409) (274d9d5)
Other
- docs(release): notes for the label-wrap bound fix (014404f)
- docs(tasks): 11.407 confirmed green on the runner that failed it (449109b)
- docs(tasks): v0.53.2 shipped, and the tag run read (11.408, 11.409) (f47f482)
v0.53.2 — 2026-08-16
Fixes
- fix(tests): LABEL-06 sentence measured against Linux font metrics (11.407) (3d719ca)
Other
- chore(naming): vendor names only where vendor functionality lives (11.406) (c269c83)
- docs(tasks): v0.53.1 tag CI run read — green on all four jobs (11.405) (16cfcf4)
- docs(tasks): v0.53.1 shipped — the carry-forecast repair, verified live and installed (f0d82d9)
v0.53.1 — 2026-08-16
Fixes
- fix(canvas): the carry forecast dims what stays behind, and the inspector counts it (11.404) (6c9f014)
- fix(canvas): show what a selected container leaves behind, not a pin on every detached object (11.403) (53acde7)
Other
- docs(tasks): v0.53.0 shipped — the zone feedback round, verified live and installed (4162e24)
v0.53.0 — 2026-08-16
Features
- feat(canvas): containers carry by keyboard and Align, and objects can be detached (11.397-11.399) (a84ef69)
- feat(stats): graphs of downloads and app usage over time, all-time retention (11.396) (57c892f)
Fixes
- fix(stats): the app chart claimed a fixed order between opens and addresses (11.396) (5ca41e1)
- fix(stats): say where the release markers run out (11.396) (ded37c1)
Other
- docs(release): notes for the zone carry fixes and the detach mark (bcccff8)
- test(qa): the 2026-08-16 run — report, the export guard, and a stale catalog count (11.400) (97594a9)
- docs(tasks): v0.52.0 shipped — the six fixes, verified live and on the packaged app (c41f2ca)
v0.52.0 — 2026-08-15
Fixes
- fix(legend,manual,fonts,qa): the five open findings, plus one found verifying (df808fc)
Other
- docs(tasks): v0.51.0 shipped — the fixes the QA run paid for (1881d96)
v0.51.0 — 2026-08-15
Features
- feat(files): dropping a .drawio or .vsdx on the canvas opens it (11.387) (3adf70f)
Fixes
- fix(manual): render emphasis, and recurse into bold (11.361, half) (43438de)
- fix(iso,layers): cable captions read forwards, and hide with their layer (11.354, 11.385, 11.346) (29f6f22)
Other
- docs(release): v0.51.0 notes — the file drop and three label fixes (fc4cffa)
- docs(qa): fold three duplicate findings back into the tasks that already had them (1388a2d)
- docs(qa): v0.50.0 run finished at 39/204 — five CSV/DOT exports verified, PDF blocked (607ea0b)
- docs(qa): v0.50.0 run continued — 34 scenarios by hand, 5 findings, one systemic (20bc492)
- docs(qa): v0.50.0 full run — 3 findings, and the harness that nearly faked three more (e5e17b4)
- docs(tasks): v0.50.0 shipped — three bundled typefaces and the font drop-down (73477d4)
v0.50.0 — 2026-08-15
Features
- feat(fonts): three bundled typefaces and a typeface drop-down (11.379) (c8c2382)
Other
- docs(tasks): v0.49.0 shipped — font repaint, the whole format painter, opacity (6a438d3)
v0.49.0 — 2026-08-14
Features
- feat(shapes,zones): opacity, in all four homes at once (11.377) (670f303)
- feat(format-paint): carry the whole formatting, and end the forgotten-list pattern (11.376) (d6b27ea)
Fixes
- fix(canvas): changing the font repaints text you already wrote (11.375) (ce38f60)
Other
- docs(release): v0.49.0 notes and the census re-verification (4e346be)
- docs(tasks): v0.48.0 shipped — typography and basic shapes, verified end to end (0bd0547)
v0.48.0 — 2026-08-14
Features
- feat(drawio,vsdx): basic shapes and typography through both file formats (11.372, 11.373) (ff34d6c)
- feat(shapes): eight resizable basic shapes, parametric rather than iconic (11.373) (3e8f2dd)
- feat(app): typography controls, and rename FontFace before it bites (11.372) (c8cacee)
- feat(drawio): typography through the codec, keeping the bits we do not own (11.372) (790583a)
- feat(render): paint typography, and teach the wrapper that it changes metrics (11.372) (9f90c7c)
- feat(model,collab): typography fields, and a guard for the seam that had none (11.372) (3fe10b4)
Other
- docs(release): v0.48.0 notes, and the licence census a minor requires (2435bac)
- docs(qa,manual): scenarios, manual paragraphs and traceability for both features (d4ea0d8)
- docs(tasks): record the typography and basic-shapes product decisions (11.372, 11.373) (6e3625c)
v0.47.2 — 2026-08-14
Fixes
- fix(electron): overlapping saves no longer fail on Windows with EPERM (11.370) (3dfcb26)
Other
- ci(release): hosted CI gates the release instead of reporting on it (11.371) (7c3331f)
- docs(release): notes for the Windows overlapping-save fix (975b9ff)
- docs(tasks): 11.370 — overlapping saves can fail on Windows with EPERM (ba2b6d9)
- docs(tasks): v0.47.1 shipped — the palette scrollbar fix, verified end to end (e623472)
v0.47.1 — 2026-08-14
Fixes
- fix(app): the palette's scrollbar no longer shrinks the palette (11.368) (bea0189)
Other
- docs(release): notes for the palette scrollbar fix (c155a79)
- docs(tasks): v0.47.0 shipped — the 2026-08-13 review closed, 13 QA findings filed (017f669)
v0.47.0 — 2026-08-13
Fixes
- fix(routing,site,deploy,docs): close the last fifteen review findings, including the one that routed cables through devices (11.274, 11.308-11.311, 11.314, 11.316, 11.317, 11.319, 11.320, 11.323, 11.325, 11.327, 11.328, 11.331) (70f5048)
- fix(app,routing,electron): eighteen robustness and performance defects, with the numbers (11.278, 11.286, 11.288-11.298, 11.302, 11.303, 11.313, 11.315, 11.324) (ad1f47a)
- fix(store,collab,electron,export): close seven model and boundary defects, and the credential window one of them opened (11.275, 11.276, 11.282, 11.284, 11.285, 11.287, 11.312) (72f5f3e)
- fix(interactions,canvas): the lock holds on the way in, a focused control owns its keys, and captions keep their scale (11.279, 11.280, 11.281) (459daea)
- fix(drawio,vsdx,diff): stop the file round-trip losing fields it was told to keep (11.277, 11.283, 11.299, 11.300, 11.304, 11.305) (71107b6)
- fix(release,deploy): close the six ship-path checks that reported success while doing nothing (11.301, 11.306, 11.307, 11.318, 11.321, 11.322) (b8951c5)
Other
- docs(release): v0.47.0 notes, refreshed licence census, and the pre-release QA run (c15390e)
- docs(review): file the 2026-08-13 full-tree code review as tasks 11.273-11.328 (8233f1c)
- docs(tasks): 11.271 and 11.272 shipped in v0.46.0 (0599b16)
v0.46.0 — 2026-08-12
Features
- feat(palette): one control for every map, and a tool row that reads right (11.271, 11.272) (2fa2874)
- feat(stats): backfill three weeks the aggregator never recorded (11.266, 11.267) (f8e687d)
- feat(stats): count builds picked up, chunks loaded and /app errors (11.262-11.264) (cdf5a56)
- feat(stats): count the bytes the release files cost, and what checking them costs us (11.261) (68e42c8)
Fixes
- fix(stats): take our own release checks out of the history too (11.270) (9cccce2)
- fix(stats): name both causes of a 4xx, and ship the tile that never rendered (11.268, 11.269) (04e6700)
- fix(stats): say plainly that the chunk table measures installs, not feature use (11.265) (085ff02)
- fix(stats): stop counting our own release verification as downloads (11.258) (8ea85b9)
- fix(stats): refresh the code figures and wire the generator to both publish paths (11.257, 11.259, 11.260) (b12e147)
Other
- docs(tasks): record 11.270 — the history is robot-free too (66e9027)
- chore(stats): commit the code.json the site deploy regenerated (65be518)
- chore(stats): commit the code.json the site deploy regenerated (a536433)
- chore(stats): commit the code.json the site deploy regenerated (20cd9ee)
- chore(stats): commit the code.json the site deploy regenerated (bb83e29)
- chore(stats): commit the code.json the site deploy regenerated (fbc5d1f)
- docs(tasks): record 11.261 shipped — the download bytes are 15x the app's (4d489f0)
- chore(stats): commit the code.json the site deploy regenerated (25b3baf)
- docs(tasks): record 11.258 shipped — the release robot is out of the download counts (390ba69)
- chore(stats): commit the code.json the site deploy regenerated (8370c30)
- chore(stats): commit the code.json the site deploy regenerated (11.257) (82b0c73)
- docs(tasks): record v0.45.3 shipped — the inspector's height is a constant (d658483)
v0.45.3 — 2026-08-10
Fixes
- fix(inspector): pin the section-heading line-height; unbreak the red tag run (11.256) (6452b44)
Other
- docs(release-notes): the minimap keeps its corner a little longer (11.256) (461a031)
- docs(tasks): 11.256 verified green on the runners (dispatched CI run) (ffe37f5)
- docs(tasks): record v0.45.2 shipped — one set of sizes across the app (1aa382e)
v0.45.2 — 2026-08-10
Fixes
- fix(ui): one size per control across the dialogs, inspector and palette (11.255) (5ceb879)
- fix(toolbar): one row treatment across every menu (11.254) (7d68f0d)
Other
- docs(tasks): record v0.45.1 shipped — menus open under their button (f3539ac)
v0.45.1 — 2026-08-10
Fixes
- fix(toolbar): menus hang under the button that opened them (11.253) (be00191)
Other
- docs(tasks): record v0.45.0 shipped — the Blocks menu is three switches (00cc38f)
v0.45.0 — 2026-08-10
Features
- feat(blocks): the Blocks menu is three switches, and it stays open (11.252) (03ac1b4)
Fixes
- fix(test): point the draw.io compat spec at the Blocks switches (11.252) (a688327)
Other
- docs(tasks): record v0.44.0 shipped — remove a block from the Blocks menu (6a3e0a9)
v0.44.0 — 2026-08-10
Features
- feat(blocks): remove a block from the Blocks menu, not the canvas (11.251) (496a831)
Other
- docs(release-notes): remove a block from the Blocks menu (11.251) (f5d3ec3)
- docs(tasks): record v0.43.1 shipped — one toolbar menu at a time (c5af59a)
v0.43.1 — 2026-08-10
Fixes
- fix(toolbar): one menu at a time — opening one closes the one already open (11.250) (a3cc663)
Other
- docs(tasks): record v0.43.0 shipped — the View menu (df37348)
v0.43.0 — 2026-08-10
Features
- feat(view): a View menu — toggle labels and objects behind the toolbar eye (11.249) (666e225)
Other
- docs(tasks): record v0.42.0 shipped — the SD-WAN generator wires every box (d1b9c31)
v0.42.0 — 2026-08-10
Fixes
- fix(sdwan): arch the non-facing inter-region tunnels over the hub row (11.248) (ae5442e)
- fix(sdwan): wire every box, and add an overview detail level (11.246, 11.247) (6af333e)
Other
- docs(release): the SD-WAN generator wires every box, and draws less when you ask (146520b)
- docs(tasks): record v0.41.1 shipped — the overview map fixes and the import-paste dialog (9ef3d91)
v0.41.1 — 2026-08-10
Fixes
- fix(minimap): draw the routed path and the link type, not a straight hairline (11.245) (3524d3f)
- fix(minimap,dialogs): draw the overview for very large imports; keep a paste when its rows are edited (11.242, 11.243) (e8b7e52)
Other
- docs(release): the overview map fixes and the vanishing import paste (a21f0b4)
- build(beta-bundle): refuse to package a dmg older than the source (11.244) (53cf761)
- docs(tasks): record v0.41.0 shipped — the performance chain + CI-flake fix (f466def)
v0.41.0 — 2026-08-10
Features
- feat(routing): cluster-local routing ships — per-edit reroutes at island cost (11.241) (bda0a30)
- feat(routing): ClusterRouter M1 — per-cluster child routers, identity-tested (11.241) (7134498)
- feat(routing): adaptive drag-hold keeps route-heavy drags smooth (11.239) (aa0da25)
- feat(routing): staged full quality off the main thread, with old-vs-new bench (11.237) (194f7bd)
- feat(publish): refuse to release without 20% free on the host (11.236) (5296bcb)
- feat(updates): the amber panel says what is in the update it offers (11.233) (78c867d)
Fixes
- fix(publish): require 20 GB free, not 20% (11.236) (21957b1)
- fix(publish): survive the deploy race, and recover without a wasted version (11.235) (75bb203)
Other
- ci(collab): run the collab suite one file at a time to end the tag-run flake (11.228) (4365f44)
- docs(ai-qa): pre-release run report for the performance chain — shippable pending human list (f9b751d)
- docs(release): Unreleased covers the whole performance chain (11.223–11.241) (372e338)
- docs(tasks): 11.241 go-ahead — design settled, milestone/resume checklist opened (21ad269)
- perf(canvas): segment-grid jumps, fan jump-exemption, nudge-run hold (11.240) (ed6e48b)
- perf(canvas): line jumps off the per-edit critical path (11.238) (a6ed5ce)
- docs(tasks): record the evaluation findings — jumps outcost routing per edit (11.238), drag-feel decision (11.239) (b92085a)
- perf(routing): hub-fan bypass keeps huge documents routable (11.223) (537a416)
- docs(tasks): correct the collab-CI evidence — two tag runs never ran the step (416c75b)
- docs(tasks): record the publish 502 race and how v0.40.1 was recovered (11.235) (900dec9)
v0.40.1 — 2026-08-09
Fixes
- fix(tests): the upright-window check no longer times out on CI runners (11.234) (8ba2974)
v0.40.0 — 2026-08-09
Features
- feat(about): What's new — this version's release notes, in the app (11.232) (6dd2004)
v0.39.0 — 2026-08-09
Features
- feat(map): country and state maps stand upright — re-projected on their own meridian (11.231) (f8b13c6)
- feat(app): rename Add country… to Add place… — the picker holds US states too (11.230) (6fca6e2)
v0.38.0 — 2026-08-08
Features
- feat(map): no key below 0.9 without a named physical reason — median IoU 0.981 (11.229 second pass) (fcba969)
- feat(map): the whole world regenerated from Natural Earth 10m, topologically — 56 new countries, states matched (11.229) (64aa5dc)
Other
- docs(tasks): 11.228 — v0.37.0 CI green on third attempt, evidence appended (914b20f)
- ci: retry the isolated real-endpoint collab suite once; record 11.228 triage (8224318)
v0.37.0 — 2026-08-08
Features
- feat(map): geometry verified against Natural Earth, US states as countries, top-ten cities (11.225–11.227) (b91606c)
Other
- chore(docs): prettier pass on the map verification run report (e43f13d)
- test(qa): IMPORT-07 — the 586-device hub-and-spoke import becomes a scenario (11.224) (7030ff0)
- docs(tasks): 11.223 — hub-and-spoke routing at import scale measured, mitigations sized (e1dc12b)
v0.36.1 — 2026-08-07
Fixes
- fix(legend): a flow arrow is not a device symbol — no legend row (11.222) (fd37ca3)
Other
- docs(tasks): 11.220 + 11.221 closed — shipped in v0.36.0 (f74b82f)
v0.36.0 — 2026-08-07
Features
- feat(flow): standalone flow arrow annotation — drag-to-draw, connector-grade labels, in-plane isometric (11.220) (009aeab)
Fixes
- fix(export): PDF always prints the light theme — a dark editor exported black boxes (11.221) (47762b7)
Other
- docs(tasks): 11.218 + 11.219 closed — shipped in v0.35.0 (d16a75f)
v0.35.0 — 2026-08-07
Features
- feat(palette): ★ Favorites section + toolbar Quick menu, individually configurable (11.219) (79681df)
Fixes
- fix(text): a text block's writing follows its box — wrap at width, re-flow on resize (11.218) (483c19d)
- fix(shapes): the malicious file owns the word 'malware' (11.217); QA delta run for v0.33.0–v0.34.1 (dfb66d0)
- fix(optics): a User group buys no module (11.214); watchlist rows for the 0.34.1 collab fixes (bd79b6b)
Other
- docs(release): unreleased note for the text-block wrap fix (11.218) (e82a559)
- docs(tasks): 11.209 — 300/300 quiet soak green post-MIGRATE_ACK; loaded overnight soak is the decisive test (6e05b4f)
v0.34.1 — 2026-08-07
Fixes
- fix(collab): MIGRATE_ACK + AUTH_PENDING ordering; ci: prune artifact storage every run (11.215) (044fc95)
Other
- ci: run the real-endpoint collab suite as its own step (11.215) (acf8e9f)
- docs(tasks): 11.215 falsifier fired on the v0.34.0 tag run — flush width was not the mechanism; MIGRATE_ACK is the fix to evaluate (d393e22)
- docs(tasks): 11.216 shipped in v0.34.0 (c3e3a89)
v0.34.0 — 2026-08-07
Features
- feat(shapes): colour carries the verdict; attack vocabulary under one heading (11.216) (47fadd8)
Fixes
- fix(collab): make the close-flush bound injectable; widen it in tests (11.215) (d84a3ec)
Other
- docs(tasks): 11.215 — first tag-fired CI run verified; one relay-flaky transport test (11.212 follow-up) (af15554)
- docs(tasks): 11.213 shipped in v0.33.0 — downloads and linux artifacts verified (a8503dc)
v0.33.0 — 2026-08-07
Features
- feat(shapes): attack-flow shapes — attacker, home, verdict trios, infected laptop (11.213) (d922b2c)
Fixes
- fix(ci): pin LF for the whole tree — windows runners check out CRLF (11.211) (32f2ff8)
Other
- docs(tasks): CI round 3 blocked by the storage-overage recalc window (11.212) (da7451a)
- test(ci): normalize --list paths on windows; make CI uploads advisory (11.212) (f50f18a)
- test(ci): make the suite honest across the OS matrix (11.212) (8918f44)
- ci: fire on tags + dispatch only, drop the macOS leg (11.210) (7ffdcaf)
- docs(tasks): 10.46 fixes shipped in v0.32.3; 11.209 notes the release (469cc27)
v0.32.3 — 2026-08-06
Features
- feat(labels): an inside caption overhangs whole instead of breaking mid-word (11.199) (fc05ed9)
Fixes
- fix(collab): hand-over survives an early peer close, and a dial is bounded (10.46) (46631a2)
- fix(files): New resets the view to 100% (11.207) (f80712e)
- fix(import): a skipped line is reported once, not once per defect (11.206) (ed55561)
Other
- docs(release-notes): the 10.46 hand-over fix, in the user's terms (eaf94f9)
- docs(tasks): close 11.193/11.194 (stale checkboxes), 11.204-11.208; suite lessons into SELECTORS.md; 10.46 hunt note (ad65b3c)
- docs(ai-qa): 2026-08-06 agent full run on v0.32.2 — findings filed as 11.204–11.208 (44cf578)
- style: prettier pass on the 2026-08-06 run report (5ae732f)
- docs(ai-qa): full gate + browser verification run 2026-08-06 — 14/14 green (aa80aaf)
- docs(tasks): 11.203 shipped in v0.32.2 (3ad1e2d)
v0.32.2 — 2026-08-06
Fixes
- fix(files): New gives you a genuinely new document (11.203) (1af1705)
Other
- docs(tasks): 11.201 and 11.202 shipped in v0.32.1 (9ac9a66)
v0.32.1 — 2026-08-06
Fixes
- fix(canvas): the font size now reaches every object that offers it (11.201) (5bab2ba)
v0.32.0 — 2026-08-06
Features
- feat(editor): document text scale, per-object override, and Update all (11.198) (ff441fc)
Fixes
- fix(ui): the document text scale was filed under Branding (11.200) (54e1e45)
- fix(canvas): Alt-drag moves a container alone, and the carry respects layers (11.195, 11.196) (73cdc8f)
- fix(canvas): the ring caption's Above rendered below, and Below above (11.197) (0602be2)
- fix(site): the docs sidebar scrolls itself (11.192) (39642b0)
Other
- docs(release): notes for the text scale, zone carry and ring label release (545998e)
- docs(tasks): font-size inventory and the zone carry findings (11.193-11.196) (78bb2ff)
- docs(tasks): 11.192 is live on the site (db66fb4)
- perf(test): run tests within a file in parallel too (11.185) (35eab1d)
- docs(tasks): the publish is 5m04s, measured on v0.31.0 (11.181) (62b5c8c)
v0.31.0 — 2026-08-06
Features
- feat(toolbar): the page is named in one place, not two (11.190) (ba4e450)
Fixes
- fix(release): the gate's own cleanup test was flaky (11.186) (259c5ca)
- fix(release): the ssh control socket was too long to open (11.187) (4a430c8)
Other
- docs(release): notes for the next version (4583369)
- perf(release): overlap the publish steps that share no resource (11.181-11.191) (f3ef9d7)
v0.30.0 — 2026-08-06
Features
- feat(shapes): PAM and User group, two new icons (11.180) (17dc4ee)
v0.29.0 — 2026-08-06
Features
- feat(layers): mark the selection's layer and refuse the move that does nothing (11.31) (8d65e8f)
- feat(deploy): hold the site's download history to 10 versions (11.50) (f88555a)
Fixes
- fix(feedback): one honest answer to "how big is this file" (11.179) (640b53f)
Other
- docs(tasks): attachment uploads are live and verified (11.12) (56572be)
- docs(edge): replace the Server banner on our vhost only (11.55) (bcc625b)
- test(dot): close 11.177 — fontname is irrelevant, the warning is the engine (2eb0632)
- test(iso): guard rack paint order; close 11.15 as not reproducible (7bd6495)
v0.28.0 — 2026-08-05
Features
- feat(palette): every shape hands you its DOT name (11.60) (575121c)
- feat(toolbar): collapse the wordmark to the mark before stashing controls (11.178) (2499ce7)
Fixes
- fix(toolbar): ellipsise the document title instead of slicing a glyph (10.34) (dd6f0c5)
- fix(dot): newrank=true, so Graphviz stops dismantling our own clusters (11.84) (3244f9c)
- fix(collab): say "Waiting to be let in", not "Reconnecting" (11.176) (6eaf5c4)
- fix(collab): flush the verdict before closing, so a rejected joiner is told why (11.175) (af66d44)
- fix(deploy): pin /app/* to the image so a site deploy cannot ship it (11.48) (dd60260)
Other
- docs(tasks): remeasure 11.50 — the host volume was grown, 91% is stale (b61684a)
- docs(deploy): the config-only deploy needs --force-recreate (11.173, 11.174) (170c927)
v0.27.1 — 2026-08-05
Fixes
- fix(collab): a stale knock no longer evicts a live one (11.134) (1fab4ee)
- fix(hygiene): navigation origin, teardown, IPC shape checks, repaint (11.135-11.138, 11.144, 11.146) (994cd36)
- fix(files): bound character refs, keep speed spelling, export the registries (11.149-11.151) (30b2050)
- fix(canvas): reveal a paste using the viewport rect, not client corners (11.142, 11.143, 11.145) (2bd84c7)
- fix(collab): a kicked peer must knock again after Regenerate link (11.133) (5eb9d7e)
- fix(files): drop XML-invalid characters on save; validate vsdx ids (11.148, 11.147) (ed4c44b)
- fix(select): geometric selection respects locked and hidden layers (11.139-11.141) (bcd36d3)
- fix(collab): a view-only guest stays view-only across a hand-over (11.132) (2d33ea1)
- fix(stats): say what the address count counted (11.130) (0548998)
- fix(publish): verify downloads AFTER the deploy settles, and retry 502s (11.129) (6d27953)
Other
- test: close the four missing guards found by the pre-release QA (11.142-11.146) (6b2ad20)
- docs(release): notes for the code-review fixes (878f9b0)
- docs(tasks): record the 11.169 decision (028e20d)
- refactor(origin): cross-reference the three site-origin declarations (11.169) (497891f)
- docs(deploy): give the stats validator a runbook entry (11.172) (a3d84af)
- build(electron): stop packing already-bundled deps into the asar (11.166) (b9deadc)
- test(qa): a hostile .vsdx fixture and the FILE-11 scenario (11.170) (5bea430)
- chore(deps): caret the cross-env pin, and resync the lock (11.167) (52c3c5e)
- docs(licenses): regenerate the census against the real tree (11.168, 11.171) (c360af0)
- chore(cleanup): remove dead code found by the review (11.152-11.165) (044b53f)
- docs(review): full-repo code review findings as tasks 11.131-11.169 (6493e39)
v0.27.0 — 2026-08-04
Features
- feat(branding): watermark, background logo and classification (11.114-11.118) (eba83dd)
- feat(publish): verify every artifact downloads intact (11.127) (5f8503e)
Other
- docs(release): notes for enterprise branding and smaller revisions (4ac8c59)
- perf(revisions): hold each embedded image once per file (11.122) (fc0d6de)
- test(compat): open our .drawio in the real draw.io, every release (11.128) (88e77b6)
- docs(tasks): record v0.26.0 as shipped (11.107-11.126) (193c0bd)
v0.26.0 — 2026-08-04
Features
- feat(toolbar): Revisions replaces Compare with…, which is removed (11.123) (0580cb1)
- feat(files): save a revision of a drawing and load it back (11.121) (a54565a)
- feat(editor): a title block, so a drawing says who made it (11.107-11.113) (56e378a)
Fixes
- fix(title-block): column dividers, because the handles were unfindable (11.126) (fd64cdb)
- fix(revisions,title-block): give revisions an identity; stop cells escaping (475d81b)
- fix(title-block): label the revision row, and make revisions manual (11.120) (feeedbd)
- fix(inspector): stop offering controls the generated blocks throw away (11.119) (eadb20f)
Other
- docs(release): notes for the title block, revisions and the Blocks menu (1b1d1da)
- refactor(toolbar): Revisions joins the File group, Blocks menu shortened (11.124) (32a514b)
- refactor(toolbar): one Blocks menu for the three generated blocks (11.124) (71b6d5c)
- docs(tasks): plan the title block (11.107-11.113) (0dac39d)
- docs(tasks): record v0.25.0 as shipped (11.100-11.106) (f5636fa)
v0.25.0 — 2026-08-04
Features
- feat(canvas): even-spacing guides, and a country map you can put sites on (11.102, 11.104) (08cf3e0)
- feat(connectors): drag a caption, and grab a centre-anchored end (11.100, 11.101) (a9414ea)
- feat(cables): tick progress as a text code, replacing the sync server (11.99) (30f5d7b)
Fixes
- fix(ui): name a ring by double-clicking it, say Ctrl on Windows, fix the dropdown (11.105, 11.106, 11.103) (26b38f8)
Other
- docs(tasks): correct 11.102 — drag-time alignment guides already exist (be986b3)
- docs(tasks): record v0.24.0/v0.24.1 as shipped (11.86-11.97) (919156a)
v0.24.1 — 2026-08-02
Other
- docs(release-notes): 0.24.1 notes — where a share link works (1c7ae3b)
- docs: say where an install link works, and that ticks do not come back (d941740)
v0.24.0 — 2026-08-02
Features
- feat(optics,cables): count the optics, schedule the cabling, share the checklist (36335ea)
Other
- docs(tasks): record v0.23.0 as shipped (11.79-11.85) (f0ca2b2)
v0.23.0 — 2026-08-01
Features
- feat(dot): zones and every other inventory item ride the round trip (11.82) (5c69e0f)
- feat(dot): the round trip keeps the drawing (11.79-11.81, 11.83) (ad445de)
Fixes
- fix(site): "MB" now means MB, in the one size formatter (11.78) (bb926d7)
Other
- docs(tasks): 11.85 closed — the template wedge was a confirm() dialog (cd0864b)
- docs(tasks): DOT round-trip loss investigation lands as 11.79-11.85 (eb033d3)
- docs(tasks): record v0.22.0 as shipped (11.74–11.77) (31258cb)
v0.22.0 — 2026-08-01
Features
- feat(export): the page leaves as Graphviz DOT, as a file and as text (11.74) (f53a999)
- feat(stats): coding stats on /stats/ — commits, lines, size, tasks (11.69) (29b78fb)
- feat(stats): the page refreshes hourly and shows today (11.68) (fc430ae)
Fixes
- fix(format-paint): say when there is nothing to paint (11.75, 11.76) (59f9bda)
- fix(deploy): stats passes land on the clock, not on the uptime (11.71) (847adf6)
Other
- test(import): pin the two DOT defects the round trip exposed (11.77) (9802ef1)
- chore(stats): regenerate code.json, and keep prettier off it (11.73) (23c1a66)
- test(stats): validate the displayed numbers against the raw logs (11.72) (d161da9)
- refactor(deploy): the stats schedule moves into the container (11.70) (8d03477)
v0.21.0 — 2026-07-30
Fixes
- fix(layers): a map's layer lives and dies with its map (11.67) (9ef9db9)
v0.20.0 — 2026-07-30
Features
- feat(import): Purdue levels ride the import — clusters declare bands, the backdrop seats them (11.66) (981e9f6)
Other
- docs(manual): anchor ENG-01 at level 3 in the Purdue example (dbe7a47)
- docs(manual): level the Purdue PLC/SIS pair; document the rank=same row nuance (e47f86b)
- docs(manual): the Purdue model as tiers — new OT example, rendered both themes (bef61e5)
- docs(manual): it's a spine–leaf fabric, not leaf–spine (user correction) (0b7e2a5)
- docs(site): wider code column + tighter mono in example pairs — no scrolling left but the verbatim dump (11.65) (34781d0)
- docs(site+manual): copy bar outside the box, Prism highlighting, wrap reverted (11.65) (c748ad2)
- docs(site+manual): copy buttons, image lightbox, theme-matched renders, no snippet scrolling (11.64) (89c258f)
- docs(site+manual): example code and its render side by side (11.63) (1ae2236)
- docs(manual): every DOT example now shows its real render (11.62) (c28959d)
- chore: drop stray screenshot committed by a mis-pathed check (a4d6d97)
- docs(manual): icon thumbnails in the DOT reference + CI pipeline recipes (11.61) (939d22f)
- docs(manual): the Diagrams-from-code chapter — five pages, executable examples (11.59) (2c47129)
- docs(tasks): 11.58 — v0.19.0 released and live-verified; publish 502 resume recorded (b438bf5)
v0.19.0 — 2026-07-30
Features
- feat(import): the open API — DOT/FortiLink import, import links, headless CLI, docs (11.57) (2f027ed)
Other
- docs(release): notes for the open-API release; 11.58 go recorded (a097756)
- docs(tasks): 11.56 — the quality bar; v1 consumes tier declarations (292edb5)
- docs(tasks): 11.56 addendum — own the vocabulary, not the grammar (a945586)
- docs(tasks): 11.56 — open-API/diagram-as-text investigation; DOT import is the road (a6f2ff0)
- docs: the edge default site answers 444, not a Congratulations page (777e85a)
- docs(tasks): 11.54 — the gateway change is half applied, finish it in the UI (9cd07cc)
- chore: ignore .claude/settings.local.json (94f0825)
- docs(tasks): 11.54 — edge sweep results, and the headers-more inheritance trap (cfb86a9)
- docs(tasks): 11.54 — the gateway default site advertises NPM (beta report) (43d9e96)
v0.18.0 — 2026-07-30
Features
- feat(map): sorted country pickers, frame show/hide toggles, Map: layer names (3e12442)
- feat(scripts): prune old desktop artifacts instead of keeping all 58 (00d414a)
- feat(deploy): mount the Caddyfile so config ships without a release (abc3b4a)
Fixes
- fix(stats): read rolled logs, stop the false rotation warning, show warnings (63d7995)
Other
- docs(tasks): 11.52 — sort the country pickers alphabetically (user decision) (dc8a38d)
- docs(tasks): 11.51 done — host root filesystem grown to 97 G (37bf366)
- docs(tasks): the host disk is 100 GB, the root LV is 49 (11.51) (fdf04d1)
- docs: clarify how a deploy/ change ships under the website-only rule (3dc4a43)
- docs(tasks): record the stats-pipeline verification and two findings (0b4d147)
- docs(tasks): record the v0.17.0 release (3040569)
v0.17.0 — 2026-07-29
Features
- feat(shapes): router, L3 switch and switch as one system (0e589b9)
Other
- docs(tasks): record the v0.16.1 patch release (5fecb77)
v0.16.1 — 2026-07-29
Fixes
- fix(rings): a drag no longer deletes the ring's name (e1392e3)
Other
- docs(release): notes for the ring-label fix (781680e)
- docs(tasks): record the v0.16.0 release (e13b212)
v0.16.0 — 2026-07-29
Features
- feat(rings): place a ring's caption the way a connector's label is placed (78c11f8)
- feat(rings): a cable can be in several aggregates, each with its own label (e08a818)
- feat(connections): one card per cable, positional arrows, aggregates as rings (ef7a2fb)
- feat(stats): count web-app usage and load, not just downloads (f0cc9a4)
- feat(stats): gate /stats at the edge by IP, not with a password (9bf1bd2)
- feat(site): a password-protected /stats/ page for the download counts (1fe1d25)
- feat(scripts): read the download counts from this machine over ssh (5709a88)
Fixes
- fix(connections): MC-LAG captions, a ring control inside the ring, taller inspector (8dfed09)
- fix(deploy): pass the /stats/ credentials into the container (5f98ec9)
Other
- docs(release): notes for the multi-ring aggregates release (8c5761e)
- docs(tasks): selection + Bind is the primary gesture for making rings (f12b8cb)
- docs(tasks): record the /stats deploy, the edge IP gate and the compose bug (e61b185)
- docs(tasks): download counting is fully live — units installed and verified (08f66fc)
- docs(tasks): record the v0.15.0 release, its verification, and queue 11.31 (b9be827)
v0.15.0 — 2026-07-29
Features
- feat(layers): map layers follow the map, one per map, and the inspector says which (b22383b)
- feat(deploy): count downloads in aggregate only — no identifiers, ever (13cad6f)
- feat(scene): draw the LAG badge as the aggregate ring in miniature (8d38be2)
- feat(paint): size + font size paint, named trail entries, row delete in Connections (3e85860)
Fixes
- fix(iso): cables meet the slab's bottom face — the ground they run on (d03d22a)
Other
- docs(release): notes for v0.15.0 + targeted pre-release QA run (8/8) (6ef277f)
- docs(tasks): record the v0.14.0 release and its post-deploy verification (1825cfb)
v0.14.0 — 2026-07-28
Features
- feat(export): copy the page as a Mermaid flowchart for markdown articles (e0abf49)
Other
- test(export): give the mermaid parse test the timeout its import needs (8ffcd58)
- docs(qa): targeted pre-release run for v0.14.0 — 4/4 on the built bundle (15d5317)
- docs(release): write the Copy Mermaid notes into Unreleased as the work lands (e014383)
- docs(tasks): record the v0.13.0 release and its post-deploy verification (4c6f5d1)
v0.13.0 — 2026-07-28
Features
- feat(vsdx): import a foreign Visio file faithfully, and export pictures back (cb48ce5)
Other
- docs(qa): run the v0.13.0 pre-release short run, and fix what it found (1033053)
- docs(release): write the Visio-import notes for the next release (af0a1d0)
v0.12.1 — 2026-07-28
Features
- feat(feedback): file each attachment as its own comment, and stop cutting logs (111103f)
Fixes
- fix(format-paint): paint a label's alignment, and stop failing silently (07f1236)
- fix(iso): let a cable cross its own chassis instead of diving behind it (c0cd464)
Other
- docs(release): write the v0.12.1 notes, and the run that checked them (653b993)
- docs(tasks): record the v0.12.0 release, and the config it still needs (70dbbae)
v0.12.0 — 2026-07-28
Features
- feat(feedback): give the bug report's .zip somewhere to go (b0a37cc)
Fixes
- fix(feedback): a sent report must not linger, and an oversize file must not trap one (3917ca9)
v0.11.0 — 2026-07-28
Features
- feat(objects): document-wide object list, with connections and search (c316c1f)
- feat(inspector): Connections tab — edit a device's cables without selecting them (3107594)
- feat(maps, layers): country map objects, layer lock, bottom map layer (4d7796c)
- feat(connectors): per-end port label placement; fix 10.41, 10.42, 10.46 (591c023)
- feat(connectors): align and rotate connector and port labels (10.45) (c84fc53)
Fixes
- fix(collab): flush the MIGRATE frame before closing on a graceful host exit (fb9e83f)
Other
- test(e2e): settle the route before unbinding an aggregate (11.7) (3b3021c)
- docs(release): write the v0.11.0 notes (5c6f218)
- docs(tasks): record v0.10.0, verified from the published arm64 image (e99772a)
v0.10.0 — 2026-07-27
Features
- feat(release): publish an arm64 docker image beside the amd64 one (bdba113)
Other
- docs(site): make the arm64 install instructions stand on their own (a638672)
- docs(tasks): confirm 10.41 by building the bundle, and file 10.42 (c61c8b8)
- docs(qa): trace the arm64 image gap in the regression watchlist (d640d5e)
- docs(qa): record v0.9.1, and correct the session-0 claim it disproved (d3779ef)
v0.9.1 — 2026-07-27
Fixes
- fix(windows): ship the MSVC runtime beside iroh's native module (a8995e7)
Other
- docs(tasks): v0.9.0 shipped and verified end to end (10.36) (aa6015d)
v0.9.0 — 2026-07-27
Features
- feat(collab): the session survives the host leaving (6.12) (f24c0d5)
- feat(collab): self-hosted relays (6.14); 6.15 blocked upstream (c126a9d)
- feat(collab): view-only invite links (6.11) (0a33498)
- feat(collab): every guest goes to the lobby, always (6.17) (f8f212c)
- feat(collab): follow a participant's view (6.10), split 6.8 (7bcd628)
- feat(connectors): auto link detection (2.109) (35cbae3)
Fixes
- fix(packaging): the .deb could not start on a minimal Ubuntu (9.7) (3ffe2eb)
- fix(connectors): a shaped cable travels whole (10.31), close 7.9 (432ae61)
- fix(deploy): the tag poller runs as the checkout's owner, not root (10.30) (6445f01)
Other
- qa: pre-release run for the next minor (10.33, 10.34, 10.35) (c7bc86e)
- docs(release): notes for the collaboration work (6.10-6.14, 6.17) (d66c771)
- test(connectors): pin that auto link detection touches NEW cables only (2.109) (bcd57d2)
- docs(release): notes for the next release (9d3eae6)
- test(qa): every Playwright-owned scenario now has a spec (10.20, 10.32) (edd9fdc)
- docs(tasks): v0.8.10 shipped and REG-13 verified (10.27, 10.28, 10.29) (feed758)
v0.8.10 — 2026-07-27
Fixes
- fix(about): the update panel lines up, and never claims two versions (10.27) (b451db5)
Other
- docs: record that the GitHub workflows are disabled at the repo level (2b606a2)
- docs(tasks): v0.8.9 shipped and REG-13 verified against the live site (10.26) (55099fe)
v0.8.9 — 2026-07-27
Fixes
- fix(updates): a manual check now lights the shield and is remembered (10.26) (f667181)
v0.8.8 — 2026-07-27
Features
- feat(canvas): a selected cable keeps its speed colour (10.22, 10.23) (aec99a8)
Other
- docs(ai-qa): close 10.25 — the legend backdrop is the zone contract, not a defect (def4247)
- docs(ai-qa): short run before the halo release — clean product, seven harness defects (10.24, 10.25) (376d44b)
- docs(tasks): record what shipped in v0.8.7 and how it was verified (10.21) (a75201b)
v0.8.7 — 2026-07-26
Features
- feat(updates): the browser button reads "Update now" (10.21) (5dfc912)
- feat(updates): the shield lights amber when a new version is waiting (10.21) (92791db)
Fixes
- fix(lint): clear five errors my own gate hid behind tail -1 (10.21) (31cbff5)
- fix(release): stamping release notes must leave the tree passing format:check (d2a3f2c)
Other
- docs(tasks): agreed design for the new-version dot (10.21) (89c895b)
- test(e2e): 15 specs for scenarios nobody drove, and two tasks closed (10.16, 10.18, 10.20) (9cfbac7)
- docs(qa): split the suite by runner, and enumerate what nobody drives (10.19, 10.20) (86c9131)
- test(qa): full-run attempt — 37 verified, and a wrong diagnosis corrected (10.16-10.19) (94be347)
- test(qa): first run of the suite — seven suite defects, zero product defects (10.14, 10.15) (c773965)
- docs(qa): audit both nets, document the four undocumented features (10.13) (c247d51)
- test(qa): 134 browser scenarios an AI agent runs before every release (10.12) (76e09ae)
- docs(tasks): record 10.8-10.10 as shipped in v0.8.6, and add 10.11 (215ce6d)
v0.8.6 — 2026-07-26
Fixes
- fix(app): the kind picker offers devices only, and the trail counts the change (10.8, 10.9, 10.10) (c605612)
- fix(publish): a release publishes its own website (10.6) (13100f8)
Other
- style: prettier formatting, and correct the action-log module header (10.9) (c5015da)
- docs(release): notes for the issue #14 fixes (e43fdcb)
- perf(release): build the shared app bundle once, not once per platform (10.7) (a3f4d44)
v0.8.5 — 2026-07-25
Features
- feat(feedback): attached logs travel inside the report (10.5) (4511d43)
- feat(callout): an optional bubble around a callout (10.3) (3b9ce19)
- feat(app): report a bug from the app menu, with the trail and files (10.4) (11d4b63)
- feat(site): docker guide follows its tab, compact release archive (9.9, 9.10) (5931a39)
Fixes
- fix(labels): port labels stop vanishing on multi-homed devices (10.1, 10.2) (544d99f)
- fix(release): re-staging an old version no longer advertises it as current (dae5fc6)
- fix(deploy): preflight the site dir, not the downloads dir (task 9.11) (5288fa0)
Other
- docs(release): notes for the beta-feedback round (4dfbf69)
v0.8.4 — 2026-07-25
Features
- feat(dist): ship Linux and Windows on every release (tasks 9.1-9.6, 9.8) (d607ba2)
v0.8.3 — 2026-07-25
Features
- feat(app): honour the PWA file associations, add a bug-report copy button (tasks 8.55, 8.56) (dc71217)
Other
- docs: require release notes before handing over the publish command (00375db)
- docs(release): notes for the next release (a737d6f)
- docs(tasks): Phase 8 shipped as v0.8.2 (c02c17b)
v0.8.2 — 2026-07-25
Features
- feat(callout): let the leader be aimed (task 8.53) (44df663)
- feat(collab)!: remove the host allow-list — every join needs approval (task 8.46) (7f0d5df)
Fixes
- fix(canvas): click-to-place a Callout or Text actually places it (task 8.54) (52e3fb8)
- fix(tests): stop pwa.spec masking the failure it exists to catch (tasks 8.40, 8.49) (0eccf22)
- fix(release-notes): stop the placeholder shipping in published notes (tasks 8.15, 8.32, 8.42, 8.45) (67c3f5d)
- fix(css): delete four dead selectors, wire up four inert tokens (task 8.23) (d44747e)
- fix(files): give the Firefox save path the detached-anchor fix (task 8.9) (bbfa5f9)
- fix(electron): make --smoke actually fail when a lazy chunk is dead (task 8.8) (a3b390b)
Other
- docs(release): notes for the next release (c43885e)
- docs(tasks): file 8.54 — click-to-place is broken for text kinds (214c080)
- docs: close Phase 8 — exported types are documentation, not dead surface (task 8.52) (0a013f3)
- docs(tasks): record the result for 8.44 (a878859)
- test: give the 18 node factories one shared base (task 8.44) (acd6119)
- style: enforce prettier, and fix two docs against the code (tasks 8.29, 8.50, 8.51) (e630b7f)
- docs(tasks): record results for 8.47 and 8.48 (4e2bad6)
- refactor(manual): drop the unbuilt deep-link params, pin the authoring subset (tasks 8.47, 8.48) (975aa42)
- test: share the Playwright editor helpers, so every spec gets the chrome guard (task 8.39) (39bc253)
- docs(tasks): record results for 8.41 and 8.43 (d7c6c4a)
- test: verify the snapshot baselines, share four duplicated helpers (tasks 8.41, 8.43) (357e382)
- docs(tasks): record results for 8.24-8.26 (30daa5e)
- refactor: tokenise the dialog surfaces, guard the brand mark (tasks 8.24-8.26) (92a6d1a)
- docs(tasks): record results for 8.16-8.20, file 8.53 (be709a7)
- refactor: settle five legacy seams (tasks 8.16-8.20) (a2236d5)
- refactor: sunset the FortiKnight localStorage carry-overs (task 8.14) (7df8417)
- refactor: stop exporting 50 symbols nothing outside their module reads (task 8.4) (963e25b)
- refactor: factor the legend specimen and the export payload (tasks 8.12, 8.13) (3e7995c)
- refactor: one owner for the snap grid and the filename sanitizer (tasks 8.21, 8.22) (f7fc82c)
- refactor: one owner for the image guard and the rack-containment rule (tasks 8.10, 8.11) (60d51af)
- refactor(theme): delete the theme.css fallback that had already drifted (task 8.7) (076c76c)
- refactor(providers): drop the unreachable module-absent seam (tasks 8.5, 8.6) (e12bacb)
- docs: correct the documentation that had gone false (tasks 8.31, 8.33-8.38) (e4ddf43)
- ci: stop desktop.yml clobbering the release feed, drop Phase-1 scaffolding (tasks 8.27, 8.28, 8.30) (963907a)
- refactor(shapes): delete FAMILY_ORDER and the test guarding a false invariant (task 8.3) (8ffafa7)
- refactor: delete four functions nothing calls (task 8.2) (670f9d3)
- chore(repo): delete the stale committed build output at the repo root (task 8.1) (b90c643)
- docs(tasks): Phase 8 — code health audit, 49 verified cleanup tasks (02ed803)
- test: kill the aggregate-ring flake at its real cause, widen the collab auth window (task 7.27) (e69db24)
v0.8.1 — 2026-07-24
Fixes
- fix(pwa): re-check for a release, so the update prompt can actually fire (task 2.126) (870f55e)
v0.8.0 — 2026-07-24
Features
- feat(shapes): a CPE shape in the Network section (task 2.125) (2339976)
- feat(editor): align a node's label left, centre or right (task 2.124) (6242b92)
v0.7.0 — 2026-07-24
Features
- feat(editor): multi-line labels and a label editor you can type in (task 2.123) (850ca7b)
- feat(site): a real vulnerability disclosure route (task 7.32) (30008ed)
- feat(installer): fetch and verify releases from the site (task 7.28) (f2fb334)
Fixes
- fix(security): route reports through the form, which a private repo makes confidential (task 7.32) (30fd3e4)
- fix(security): drop style-src 'unsafe-inline' from the app CSP (tasks 7.30, 7.31) (3eae94c)
- fix(installer): the site identifies the build, not mtime (task 7.29) (81a5267)
v0.6.2 — 2026-07-24
Fixes
- fix(shapes): VDOM and VSYS are security family, not network (task 2.122) (e2ac61d)
Other
- docs(release): notes for the VDOM/VSYS colour change (b86295d)
v0.6.1 — 2026-07-24
Other
- docs(tasks): 7.27 also covers the flaky collab transport spec (6b220be)
- docs(release): notes for the donate-height fix and the loader cleanup (4869281)
- refactor: delete two dead dynamic-import fossils; publish the site without a release (17d7b75)
- chore: record v0.6.0, and two fixes the publish log surfaced (task 7.24) (73dcf3b)
v0.6.0 — 2026-07-24
Features
- feat(app): a Website row in the app menu (task 2.121) (c8d8e04)
- feat(site): Ko-fi tip panel on /donate/, click-to-load and theme-aware (7.22) (07a19cd)
- feat(app): icon library dialog + restyle the sponsor row (task 2.121) (ed550f0)
Other
- refactor(css): make
hiddenhide globally, and write both rules down (7.23) (c270e3e) - docs(release): notes for the icon library and the inline tip panel (6b15380)
v0.5.0 — 2026-07-24
Features
- feat(palette): sibling sections, decoupled from the accent family (task 2.120) (2615dbf)
- feat(purdue): snap devices into a level, and fix backdrops taking connectors (5f8e14f)
- feat(editor): Purdue plant template, conduit/fieldbus links, OT docs (task 2.119) (eb5cdd2)
- feat(shapes): the vertical OT equipment (task 2.119) (098d5cb)
- feat(shapes): Purdue level backdrop (task 2.119) (71a78cf)
- feat(shapes): add the OT family and the 18-shape OT batch (task 2.119) (1490090)
Other
- docs(release): notes and tester checklist for the OT release (3d716d7)
- docs(tasks): record the v0.4.4 release and its post-release verification (0f23110)
v0.4.4 — 2026-07-24
Fixes
- fix(map): pressing Map again selects the existing map instead of stacking one (task 7.19) (83b0476)
- fix(security): harden headers, drop site CSP unsafe-inline, fix /app/ caching (task 7.18) (f813ba5)
Other
- docs(release): write the notes for the upcoming release (08fee2b)
- chore(publish): trigger site rebuild on publish + trim docker build context (f5c34ca)
v0.4.3 — 2026-07-23
Features
- feat(publish): Docker image download + Windows/Linux artifact support (task 7.16) (b81ac78)
v0.4.2 — 2026-07-23
Features
- feat(site): first-launch install help on the download page (task 7.15) (56c8ee6)
v0.4.1 — 2026-07-23
Other
- docs(release-notes): v0.4.1 desktop-parity maintenance note (207be10)
- docs(deploy): TLS 1.3-only enforced gateway-wide (5bec92b)
- docs(deploy): external pentest results + edge header hardening (2026-07-23) (3889bf4)
v0.4.0 — 2026-07-23
Fixes
- fix(site): declutter the download card — teaser notes + folded checksums (task 7.14) (a3dd7cc)
Other
- docs(release-notes): v0.3.1 download-page cleanup note (e122571)
v0.3.0 — 2026-07-23
Features
- feat(site): OS-aware download page + full license texts served (tasks 7.12, 7.13) (a5ea102)
- feat(release): human release notes, on site and gated into every release (task 7.10) (a7812c3)
- feat(site): feedback form relaying to GitHub issues (task 7.9) (62f75d2)
- feat(site): SEO polish + site build joins the release gate (task 7.8) (13ea1f3)
- feat(updates): desktop update feed defaults to drawbridge.fortiknight.com (task 7.7) (55192a1)
- feat(publish): upload release artifacts to the site downloads volume (task 7.6) (231c988)
- feat(deploy): tag-poll auto-deploy — deploy.sh + systemd timer + runbook (task 7.5) (7c53c50)
- feat(deploy): container stack for drawbridge.fortiknight.com (task 7.4) (7ffa431)
- feat(site): download, donate, privacy, licenses and 404 pages (task 7.3) (c022e83)
- feat(site): generate /docs/ from the in-app manual + changelog (task 7.2) (1c8641e)
- feat(site): distribution website scaffold + landing page (task 7.1) (55fcdba)
Fixes
- fix(deploy): parameterize the web container's host ports (4d0d6bc)
- fix(deploy): skip release tags that predate the site deploy files (231f511)
- fix(site): serve the LGPL text from a committed root copy (task 7.13) (51f6bfa)
Other
- docs(deploy): URL allowlist for fronting-proxy provisioning (1bfca07)
- docs(tasks): Phase 7 — public distribution site at drawbridge.fortiknight.com (a38906b)
v0.2.9 — 2026-07-22
Features
- feat(templates): Global template cards draw the real world map (task 2.118) (9ded23c)
- feat(app): discreet 'Buy me a ☕' sponsor link in the app menu (task 2.117) (311860f)
Other
- docs(beta): checklist item for the Global template map thumbnails (task 2.118) (d6677a0)
- docs(beta): checklist item for the sponsor link (task 2.117) (8165b7e)
v0.2.8 — 2026-07-22
Fixes
- fix(minimap): honour pinned connector sides — anchor with the bridge's anchorPoint (b8c02c8)
v0.2.7 — 2026-07-22
Fixes
- fix(minimap): render the bus as its bar with spread taps (task 2.116) (3fda365)
Other
- docs(tasks): record the v0.2.6 release of the bus shape (73d79ce)
v0.2.6 — 2026-07-22
Features
- feat(shapes): bus / shared-segment bar with spreading taps and auto-grow (task 2.116) (2ef2c3e)
Other
- test(e2e): fix the border re-attach flake — poll and capture the handle box in one attempt (829d9b2)
- docs(tasks): record the v0.2.5 release of the minimap dodge (3b4a6c2)
v0.2.5 — 2026-07-22
Fixes
- fix(minimap): dodge left of the inspector instead of being covered (task 2.115) (1ff9385)
v0.2.4 — 2026-07-22
Fixes
- fix(minimap): draw shaped connectors faithfully — arc bows and custom bends (task 2.114) (e67fd4a)
v0.2.3 — 2026-07-22
Features
- feat(edges): multi-point arc shapes — Custom's gestures on a smooth curve (task 2.114) (97d2f8f)
Other
- docs(tasks): record the v0.2.2 release of the adjustable arc (4c92e9a)
v0.2.2 — 2026-07-22
Features
- feat(edges): adjustable arc — drag the crest handle to tune the bow (task 2.113) (6e101af)
Other
- docs(tasks): record the v0.2.1 release of the Arc connector (1b0dc86)
v0.2.1 — 2026-07-22
Features
- feat(edges): add the Arc connector type (task 2.112) (278f9aa)
Other
- docs(beta): Arc on the tester checklist; fix(manual): don't swallow keys after close (tasks 2.112, 2.111) (470b7e7)
- docs(beta): add the Arc connector to the tester checklist (task 2.112) (6ce5804)
- docs(tasks): record the v0.2.0 release of the in-app manual (323822a)
- docs(beta): add the manual to the tester checklist (task 2.111) (6279a45)
v0.2.0 — 2026-07-22
Features
- feat(manual): ship a complete manual inside the app (task 2.111) (3aa3cbe)
v0.1.10 — 2026-07-22
Features
- feat(release): publish the tester bundles from publish.sh (66a3ea2)
v0.1.9 — 2026-07-22
Fixes
- fix(shapes): file VDOM under security, not network (c6762b6)
Other
- refactor(export): derive export colours from the catalog family (b863af9)
- chore(release): add scripts/publish.sh one-command release wrapper (5a67971)
v0.1.8 — 2026-07-22
Features
- feat(editor): remove Tidy up, promote Align to the toolbar (2.110) (9fb7cf9)
- feat(edge): wireless link type — dash-dot line, radio badge at the midpoint (2f46ba5)
- feat(map): "Show neighbours" for regions — solo a region, not just a country (1a0bb50)
- feat(map): name a map after the extent it draws, until you name it yourself (d117aed)
- feat(map): resize a map to the extent it draws, and carry its devices (58e5a84)
- feat(map): 132 country extents, a searchable picker, and the borders back (cc613ad)
- feat(map): show a country alone or with its neighbours (db8667b)
- feat(map): country extents for Europe, generated from the source geometry (82b5af0)
- feat(map): zoom out to 8%, and a Nordics extent (863c92f)
- feat(map): a real world map, and AMER/EMEA/APAC layouts (3d2739e)
- feat(map): narrow a world underlay to a region (ee1a9cb)
- feat(templates): global operations on a world underlay, on its own layer (dbad928)
- feat(shapes): network-area shapes — WAN, MAN, WLAN, PSTN and the site scales (cc3ac59)
- feat(shapes): redraw the VDOM icon, add a LAN icon (d960df3)
- feat(shapes): virtual domains and contexts, as a container and as icons (b0c30d9)
- feat(toolbar): auto-save moves into the app menu (2676885)
- feat(draw): a connector tool, zones you can cable, and room in the toolbar (8b60a49)
- feat(palette): collapse or expand every icon family at once (99ed185)
- feat(beta): Docker bundle for testers, install guide in the checklist (8cd57cb)
Fixes
- fix(beta): publish the checklist from the stamped copy, not from docs/ (b7993c9)
- fix(edge): the wireless badge drew the route instead of its own arcs (ef5a671)
- fix(map): geographic audit against trusted sources; three regions cut land (dc4df81)
- fix(minimap): draw map underlays, not an empty container box (ece70a8)
- fix(map): another 35% bigger, so a device needs no resizing (b49f583)
- fix(map): make underlays big enough for a device to read as a site (7939221)
- fix(map): measure the extent bounds instead of eyeballing them (7bbad11)
- fix(map): extents show the region they name, and nothing else (fdda3d7)
- fix(map): cables no longer attach to it, it can be grabbed, and a button adds it (995a962)
- fix(connector): centre starts pick their own side, endpoint handles are catchable (5f86de1)
- fix(palette): pin the connector tool and collapse toggle (caf2cf9)
- fix(image): paste an icon and it lands device-sized, not five tiles wide (474b711)
- fix(zone): a pasted zone no longer drags the original's devices away (ede7597)
- fix(toolbar): export/layers/more menus were clipped away by the bar (354b487)
- fix(layout): tidy up pins top-level zones and widens peer-link detection (e660d6f)
- fix(layout): tidy up treats zones as layout scopes, not rigid bodies (72969e5)
Other
- ... (71572f1)
- docs(tasks): 2.109 — the learned connector memory lives in the app (1f03ef2)
- docs(tasks): 2.109 gains a toggle and learned per-pair connector defaults (bfa671b)
- docs(tasks): 2.109 — infer the link type from the devices a cable joins (eb2f224)
- chore(beta): 0.1.7 (6196460)
- chore(beta): 0.1.6, with the wireless link type in the checklist (dc1be81)
- build(beta): install what you built, and archive what it replaces (5e513d2)
- chore(beta): 0.1.5, with region solo in the checklist (283bb2e)
- chore(beta): 0.1.4, with the geography audit in the checklist (9fdf624)
- chore(beta): 0.1.3, with map naming in the checklist (5c2c111)
- chore(beta): 0.1.2, with the minimap fix in the checklist (22894db)
- chore(beta): 0.1.1, and a checklist section for maps (8700e98)
- style(palette): give the collapse toggle a chevron and tie it to the categories (744f577)
- style(palette): left-align the collapse toggle (ca92c13)
- docs(beta): checklist for v0.1.0 (bb7072a)
v0.1.0 — 2026-07-19
Features
- feat(iso): draw a rack as one real cabinet, orbit for the rear (1207805)
- feat(iso): draw a rack as two joined halves (fde669f)
- feat(rack): dropping a device into a rack MOUNTS it (af21602)
- feat(iso): one deep cabinet, front and rear mounted inside it (4fae283)
- feat(iso): close the cabinet and give mounted units real depth (5ccc277)
- feat(iso): stand a two-elevation rack as two cabinets (bb9bbd5)
- feat(iso): give racks real depth, with front and rear elevations (ad6edba)
Fixes
- fix(rack): bound both sides of every rail (c0b8576)
- fix(iso): wall the near side of the cabinet, and sit the elevation flush (1b6855d)
- fix(iso): deepen the cabinet, and stop burying a rear unit's name (5841397)
- fix(iso): compare marks and peer selections follow the view (e82937d)
- fix(iso): paint order, and every gesture that still read the floor (df4b7be)
- fix(export): stand racks up in isometric exports too (1497d02)
- fix(iso): cables, minimap, rear mounting, and unit labels (42d10c0)
- fix(iso): make the standing rack look right (d123b45)
- fix(iso): keep mounted units on the rack face when anything moves (405fdbe)
- fix(iso): put a mounted unit's ring and handles on the rack face (7efd5b1)
- fix(iso): keep a rack's selection ring and handles on its face (bbec717)
- fix(beta): stamp the checklist with the version it ships beside (03ac7f4)
Other
- chore(dev): add the visual-check harness as a script (1eaeb39)
v0.0.5 — 2026-07-19
Features
- feat(iso): stand racks up as cabinets (ee857e3)
- feat(rack): a dedicated rack builder (88c4fdd)
- feat(rack): half/full depth and front/rear elevations (debafd5)
- feat(inspector): searchable, grouped device picker (a0fa6df)
- feat(import): read FortiOS "diagnose lldp rx neighbor" (812e0a3)
- feat(beta): fill the tester's Mac details in automatically (8a4b0ec)
- feat(export): a self-contained HTML viewer, one file, no server (d52a780)
- feat(compare): visual diff between the document and another .drawio (85b873f)
- feat(import): paste CDP/LLDP output or CSV and get a laid-out diagram (b1ce495)
- feat(layout): "Tidy up" auto-layout via ELK, as a separate chunk (79200c9)
- feat(layers): named layers with visibility, on draw.io's own model (d5c5186)
- feat(inspector): asset data on devices, and a CSV inventory export (555b047)
- feat(dist): script the beta bundle, and verify it before it ships (8454a87)
- feat(view): rotate the isometric camera a quarter turn per press (9c48430)
- feat(view): isometric view behind one toolbar button (72fd7f9)
- feat(dist): add macOS install script that fixes the Gatekeeper "damaged" block (5ab1dc9)
- feat(shapes): add Auth server (RADIUS/AAA) icon, distinct from NAC (c95f51f)
- feat(palette): collapsible categories, icon search, + SASE/managed-client icons (b8d77f2)
- feat(toolbar): consolidate export controls into an Export menu (9e272c2)
- feat(model): true groups — group a multi-selection into one movable unit (task 2.44) (4199bd8)
- feat(model): free text / callout annotation (task 2.43) (06454c2)
- feat(editor): bulk find-replace in labels (task 2.42) (2b47993)
- feat(inspector): format painter — copy/paint presentational style (task 2.41) (b9d073b)
- feat(canvas): overview minimap navigator (task 2.39) (e2b1bcc)
- feat(app): canvas find (⌘F) — quiet find box with ranked node search (c5e9363)
- feat(export): theme override + transparent-background for PNG/SVG/PDF (5ebd520)
- feat(shapes): expand catalog with 13 on-brand device kinds (task 2.37) (10e6d4c)
- feat(export): copy the diagram to the clipboard as an image (32923ba)
- feat(collab): saved sessions, approval lobby, and "joinable now" (9d96e84)
- feat(collab): reusable personal link + per-page presence; fix desktop close (0399575)
Fixes
- fix(rack): front/rear legibility, a missing token, and a depth-change move (cd8b955)
- fix(toolbar): move controls into a "More" menu instead of clipping them (ea0103d)
- fix(desktop): serve the renderer over app:// instead of file:// (4750849)
- fix(export): exports never reached disk in the desktop app (661bc07)
- fix(editor): connector handles, welded zone copies, toolbar order (cb66f22)
- fix(duplicate): carry layer and shared asset traits onto a copy (d3621a6)
- fix(collab): only save an invite secret a host actually gates (4570430)
- fix(updates): key the feed by platform, and keep nested comments (8208fd1)
- fix(release): gate releases on the local CI run, not hosted checks (0de86be)
- fix(playground): surface failures and fix the scenario race (fb36ae2)
- fix(electron): close the arbitrary-path hole and harden the shell (7595f6c)
- fix(editor): repair undo integrity in gesture handling (d0d48e0)
- fix(collab): validate peer-supplied presence and image data (14c97db)
- fix(format): stop losing edits and model data on save (5df0201)
- fix(minimap): project the overview with the isometric camera (92afd6d)
- fix(legend): preserve label edits and delete the whole legend as one unit (fb34b39)
- fix(duplicate): carry edge speed/bundle/router/waypoints on copy+paste (7beeae6)
- fix(minimap): render a faithful thumbnail (real tiles, icons, edge colors) (e71f30a)
- fix(canvas): keep the minimap below the inspector so it never steals clicks (d267522)
- fix(text): remove empty text/callout on commit (task 2.43) (6eeab90)
- fix: multi-agent code-review pass — correctness, x-platform, docs (5895dce)
Other
- docs(beta): v0.0.4 checklist covering the six new features (1753c70)
- docs(tasks): record the six gap-closing features as 2.53–2.58 (1dbb339)
- docs(beta): ship the feedback checklist inside the bundle (84fa00f)
- docs(beta): write down how a beta bundle is built and published (d849fe9)
- chore(beta): bump to 0.0.3 and cover the isometric view in the checklists (2d66e02)
- style(docs): prettier-format the versioning note (bacb6a1)
- docs(release): agree CalVer YY.M.PATCH for the first production release (b01426d)
- docs(beta): use the real Drawbridge brand mark in the checklist header (4d82583)
- docs(beta): add interactive HTML checklist with feedback capture (28e3861)
- docs(beta): add a macOS beta-tester checklist (165fd3b)
- docs(claude): run the full CI pipeline locally as the gate until release (3ae9f3a)
- docs(tasks): record 2.37–2.45 feature round (product decision 2026-07-14) (e39a63a)
- docs(licenses): complete npm license report + ship LGPL-2.1 text (task 5.3) (46b947f)
- docs(collab): add how-it-works overview + post-6.4 admission deviations (7ddd1f2)
- docs: add desktop v0.0.2 evaluation checklist (331108c)
v0.0.3 — 2026-07-18
Beta build. The headline change is the isometric / 3D view — one button tilts the whole diagram, a second orbits the camera. Device labels also now sit inside the tile by default.
Features
- feat(view): rotate the isometric camera a quarter turn per press (9c48430)
- feat(view): isometric view behind one toolbar button (72fd7f9)
- feat(dist): add macOS install script that fixes the Gatekeeper "damaged" block (5ab1dc9)
- feat(shapes): add Auth server (RADIUS/AAA) icon, distinct from NAC (c95f51f)
- feat(palette): collapsible categories, icon search, + SASE/managed-client icons (b8d77f2)
- feat(toolbar): consolidate export controls into an Export menu (9e272c2)
- feat(model): true groups — group a multi-selection into one movable unit (task 2.44) (4199bd8)
- feat(model): free text / callout annotation (task 2.43) (06454c2)
- feat(editor): bulk find-replace in labels (task 2.42) (2b47993)
- feat(inspector): format painter — copy/paint presentational style (task 2.41) (b9d073b)
- feat(canvas): overview minimap navigator (task 2.39) (e2b1bcc)
- feat(app): canvas find (⌘F) — quiet find box with ranked node search (c5e9363)
- feat(export): theme override + transparent-background for PNG/SVG/PDF (5ebd520)
- feat(shapes): expand catalog with 13 on-brand device kinds (task 2.37) (10e6d4c)
- feat(export): copy the diagram to the clipboard as an image (32923ba)
- feat(collab): saved sessions, approval lobby, and "joinable now" (9d96e84)
- feat(collab): reusable personal link + per-page presence; fix desktop close (0399575)
Fixes
- fix(minimap): project the overview with the isometric camera (92afd6d)
- fix(legend): preserve label edits and delete the whole legend as one unit (fb34b39)
- fix(duplicate): carry edge speed/bundle/router/waypoints on copy+paste (7beeae6)
- fix(minimap): render a faithful thumbnail (real tiles, icons, edge colors) (e71f30a)
- fix(canvas): keep the minimap below the inspector so it never steals clicks (d267522)
- fix(text): remove empty text/callout on commit (task 2.43) (6eeab90)
- fix: multi-agent code-review pass — correctness, x-platform, docs (5895dce)
Docs & chores
- style(docs): prettier-format the versioning note (bacb6a1)
- docs(release): agree CalVer YY.M.PATCH for the first production release (b01426d)
- docs(beta): use the real Drawbridge brand mark in the checklist header (4d82583)
- docs(beta): add interactive HTML checklist with feedback capture (28e3861)
- docs(beta): add a macOS beta-tester checklist (165fd3b)
- docs(claude): run the full CI pipeline locally as the gate until release (3ae9f3a)
- docs(tasks): record 2.37–2.45 feature round (product decision 2026-07-14) (e39a63a)
- docs(licenses): complete npm license report + ship LGPL-2.1 text (task 5.3) (46b947f)
- docs(collab): add how-it-works overview + post-6.4 admission deviations (7ddd1f2)
- docs: add desktop v0.0.2 evaluation checklist (331108c)
v0.0.2 — 2026-07-13
Note: some commits below (STUN servers, the hostable signaling server, and "collaboration over WebRTC") belong to an earlier collaboration line that was superseded before this release. The shipped collaboration transport is iroh (peer-to-peer, no signaling server); the WebRTC/signaling code is not in the shipped tree. See
docs/INCIDENT-2026-07-13-divergence.md.
Features
- feat(desktop): build the iroh desktop app for Windows + Linux (1cf30a4)
- feat(collab): STUN servers so peers connect across different networks (533d5ad)
- feat(collab): C3 presence — live remote cursors with names (2c7fbaf)
- feat(collab): deployable free-hostable signaling server + live demo (ac3b652)
- feat(collab): C2 complete — live editor collaboration over WebRTC, verified (938ccd8)
- feat(collab): C2 (part 1) — sync engine seam + share-link codec (4ae468d)
- feat(collab): C1 — CRDT model bridge for real-time collaboration (232f741)
- feat(desktop): offline assertion + platform info in About (Phase 6.5) (d7fcc1b)
- feat(desktop): Electron desktop app for macOS/Windows/Linux (Phase 6.1–6.4) (be9b29e)
- feat: configurable default LACP ring color, red by default (6bbdd12)
- feat: enrich templates with link speeds + LACP aggregates; flatter ring (a9a3f70)
- feat: parallel-link fan, edge marquee, center-anchor connect (task 2.36) (1dc1abb)
- feat: aggregate ring — oval, colorable, draggable, in the legend (task 2.35) (6221153)
- feat: link speed as color, with recolorable palette and legend (task 2.34) (1b8a38b)
- feat: aggregate/LACP link binding with ring notation (task 2.33) (1340e10)
- feat: subnet-aware zones and PDF export with title block (tasks 2.31, 2.32) (21af88d)
- feat: SD-WAN generator, endpoint labels, semantic link types, auto-legend (tasks 2.27-2.30) (79365e8)
- feat: notify-only update check + window title shows filename (tasks 6.7, ux) (f2bc108)
- feat: templates follow editor defaults; Direct is factory connector default (task 2.26) (08ab8b4)
- feat: real-time collaboration (Yjs + iroh) and macOS desktop app (tasks 6.1-6.5) (b5ff95d)
- feat: Visio (.vsdx) open, edit and save (task 2.25) (a33efee)
- feat: easier connectors from selected nodes + connector type defaults (f0cbb08)
- feat: fit-to-window frames objects in the VISIBLE canvas with padding (cbb06a2)
- feat: edge auto-pan while dragging (task 2.24) (e754986)
- feat: drag smart guides — magnetic alignment while moving (task 2.23) (c6ecad9)
- feat: Docker container (multi-stage, non-root, healthcheck) (6fe2c5e)
- feat: clone-and-run setup scripts + committed wasm artifacts (e77072c)
- feat: SD-WAN hub-and-spoke template family (user request) (c9de715)
- feat: align + even spacing with flash guide visualization (task 2.22) (4722ae3)
- feat: IPsec link type, cmd/ctrl multi-select, blank-template dismiss (task 2.21) (20fe28d)
- feat: local distribution bundle with auto-installers (task 5.2) (57d2d24)
- feat!: rebrand FortiKnight → Drawbridge with new shield+topology mark (task 5.1) (a330c5d)
- feat: paste images into diagrams (task 2.20) (313753e)
- feat: multi-page diagrams with tabs (task 2.17) (54c4541)
- feat: PWA offline + release pipeline (tasks 3.1-3.4, 4.1-4.4) (d185e25)
- feat: toasts, about box, label-position multi-edit, auto-save to file (tasks 2.7, 2.18, 2.19) (ad17c04)
- feat: rack units — mark U rows into aggregated devices; numeric rack height (task 2.16) (603c067)
- feat: topology templates + rack planning (tasks 2.13, 2.14) (87033bb)
- feat: anchor-point preview on new connections too; icons at 85% (a3d9647)
- feat: show candidate anchor points while re-attaching an endpoint (6321bc4)
- feat: endpoint re-attach — drag an edge end to a new anchor side or node (task 2.12) (9ae1bf2)
- feat: selection inspector, z-order layers, color overrides + drag feel (task 2.11) (dd9e5f8)
- feat: per-edge connector types — auto / direct / custom (task 2.10) (d7db324)
- feat: direction-aware connections — gesture sets exit/entry sides (9d96b37)
- feat: node/zone resize + line jumps at edge crossings (tasks 2.8, 2.9) (ab0bf61)
- feat: expand shape catalog 14 → 25 (691feb3)
- feat: save-as, unsaved-changes guard, F2/Enter rename (b2ed502)
- feat: clipboard shortcuts — copy/cut/paste/duplicate + arrow-key nudge (52ebe6b)
- feat: FortiKnight editor MVP — canvas, interactions, shapes, .drawio I/O (tasks 2.1-2.6) (6996544)
- feat!: pivot to custom simple network diagram editor (7d09f06)
- feat: libavoid wasm engine + routing playground (tasks 1.1-1.4) (3ef9cf0)
- feat: npm run dev — patched drawio webapp served locally (task 2.1) (50b39f9)
- feat: toolchain scaffold + routing contracts (task 0.3) (e8789a6)
Fixes
- fix(test): wait for the aggregate ring to paint before measuring it (929d1b5)
- fix(test): give the 1152-combo SD-WAN sweep a 120s timeout (4ebf9bd)
- fix(desktop): don't let electron-builder auto-publish in CI (b307cc8)
- fix(editor): apply connector + label-position defaults to templates/new nodes (8e213dc)
- fix: unify the aggregate ring on a span-both-lines "tie" (2 or 4+ links) (ab9d650)
- fix: aggregate ring adapts to the connectors' angle (spans both links) (d64582e)
- fix: parallel-bundle ring is a cross-section oval, not one along the links (62993e7)
- fix(collab): status pill now actually hides — the real "stuck Live" bug (8c6f110)
- fix(collab): terminating a session clears the pill immediately (e83c2d5)
- fix: slim the MC-LAG ring height (OWNER_THIN 12 → 8) (a8a004a)
- fix: MC-LAG ring is a flat wide oval at the device, not a tall one (87847c9)
- fix: speed-chip overflow, LACP discoverability, live auto-legend (2.30/2.33/2.34) (19959bf)
- fix: native file layer in the Electron shell (task 6.6) (83fb369)
- fix: duplicates inherit full presentation; selected connectors re-home on duplicate (009bd75)
- fix: stray text selections can no longer hijack canvas drags (6f865c5)
- fix: node drag wins over border handles; failed re-attach self-heals; labels default to inside (9d72948)
- fix: inside label never shrinks the icon (user report) (a59c698)
- fix: lint — dblclick re-hit-test narrowing (optional chains after non-null proof) (23ba743)
- fix: rack units — clear resize handles + proper duplication (22f62cc)
- fix: sibling edges crossing far from their shared hub bump again (65c028e)
- fix: lost-release guard uses a grace timer — mixed trackpad streams no longer kill drags (34c4bf4)
- fix: tap-drag / three-finger drag broke — lost-release guard now edge-triggered (fbb3c34)
- fix: drag no longer sticks to the mouse after a lost release (32107bd)
- fix: apply icon wrapper contract (fill:none, currentColor strokes) in canvas and palette (bd9edce)
- fix: eslint ignores for emsdk tree; node globals in dev server (05e3cc7)
Other
- ci(desktop): publish installers to a GitHub Release on version tags (3116034)
- test(collab): real n0 two-peer sync proof +
collab:verifyscript (9c5ea04) - docs: record the 2026-07-13 divergence incident + prevention rules (d817cdf)
- docs(claude): always push committed work to origin (fd08ec8)
- ci(collab): verify two-instance collaboration on macOS/Linux/Windows (f338e4d)
- test(collab): verify real WebRTC P2P sync works in the Electron stack (f136e6e)
- docs(tasks): record cross-platform desktop installers built green in CI (88ea658)
- ci(desktop): build native installers on all three OSes in the release workflow (be6a347)
- ci(desktop): build + smoke the desktop app on all three OSes (parity gate) (bf578b8)
- ui: template picker fills the height; empty state anchored to the top (e02c6cf)
- ui: larger template gallery (ee2359f)
- docs: clone-and-run install section in README (5a226d1)
- docs: re-plan phase 5 as rebrand + local distribution (90a5c7d)
- test: perf harness, routing snapshots, editor E2E + CI jobs (tasks 1.5, 1.6, 2.3) (d8ea6d4)
- chore: add vite-plugin-pwa (Phase 3 groundwork) (c1660d4)
- docs: add task 2.20 — paste images into the diagram (with investigation) (8383dea)
- docs: README consistency — jumps shipped, Apple prereqs removed (8c7b463)
- docs: re-plan delivery — browser-first PWA, Electron to backlog (b7db9ca)
- docs: add task 2.19 — auto-save to the open file (f5e1463)
- docs: add task 2.18 — multi-edit (label position et al across a selection) (f57df4a)
- test: interaction regression suite — every shipped gesture fix pinned in CI (fa2bda3)
- style: bigger node icons — tile fill 56% → 70% (9194623)
- chore: task 0.4 done — CI green on all three OS (run 28943562836) (c66ce27)
- ci: cross-OS workflow + drawio patch layer (tasks 0.4, 0.5) (7487e96)
- docs: codify offline-first requirement + per-OS verification task 4.6 (82c7354)
- chore: mark tasks 0.1-0.3 done; add build:wasm + playground scripts (0b46ae9)
- chore: pin vendor submodules (task 0.2) (6428226)
- chore: bootstrap repo — docs, licenses, layout (1c8ccce)