Changelog
All notable changes to Splice CAD desktop releases.
Format: Keep a Changelog. Version numbers track the desktop build (kept in sync). Web/staging-only changes that haven’t shipped to a desktop build live under Unreleased.
Section conventions:
- Added — new features
- Changed — behavior changes to existing features
- Fixed — bug fixes
- Removed — features taken out
- Performance — speed/memory improvements without behavior change
- Internal — refactors, build, dev-only changes (omit if user-invisible)
[Unreleased]
[0.1.0-beta.9]
Fixed
- Plan: trying to generate an assembly from an unsaved or example-preview project now shows a clear “save to your account first” message with the menu path, instead of a generic “Failed to generate assembly” toast (or, worse, a raw “UUID parsing failed” debug-grade error from the backend’s path parser). The same dialog also surfaces the actual server message for permission, subscription-tier, and validation failures so the user can act on them — these were previously hidden behind the catch-all toast.
[0.1.0-beta.8]
Fixed
- Desktop: user settings now reliably persist across app launches on macOS, Windows, and Linux. Previously, several preferences — most visibly the plan-builder scroll mode (Auto / Scroll / Pan) and the zoom-sensitivity slider — could revert to defaults after Cmd+Q on macOS, because WKWebView’s localStorage flushes asynchronously and did not always land on disk before the host process exited. The harness, creator, and user-prefs stores now mirror every persisted setting through a Rust-side JSON file that fsyncs synchronously (durable before the JS-side write returns), and on launch each store loads that file directly via IPC before reading localStorage — so a stale WKWebView cache can never override the saved values. The 500 ms persist debounce that could previously swallow a one-and-done setting change is also gone; writes now happen synchronously on every mutation.
[0.1.0-beta.7]
Fixed
- Plan: device groups no longer become “phantom” entries that can’t be deleted from the canvas, and stop multiplying across copy/paste. Previously, a single empty group would clone itself into the destination on every paste (a vacuously-true filter included groups with zero members in the clipboard payload), producing a growing list of empty groups with the same name in the right-click submenu. Removing the last member of a group — either by unassigning the node or by deleting the node itself — now deletes the group along with it, in a single undo step. Existing plans with leftover empty groups have their orphans cleaned up on the next load. Pastes drop any device group that would land empty after ID remapping. The Device Groups list in the parts panel now uses the standard delete path, so its X button is undoable and consistent with the canvas right-click menu.
- Windows: cold-launch flash eliminated. The OS window now stays hidden
until the splash screen has painted its first frame, so the
Chromium-default white WebView2 surface can never leak through. A 4 s
safety force-show covers the case where the JS-side ready signal never
fires. macOS and Linux are unaffected — their webviews already paint
the dark
background_colorcorrectly and don’t need the hide-then-show roundtrip. - Windows: the cold-boot splash and the route-transition mask are now one continuous cover. The splash holds until the FIRST route’s settle pipeline (Vue mount + RAF + ResizeObserver cascade + TanStack Query data arrival) is fully done, instead of dropping on a 1.2 s timer that could expose the page mid-mount. There is no longer a window where raw paint is visible between splash and route.
- Windows: route navigation no longer flashes content into place after the mask drops. The settle pipeline now waits for in-flight TanStack Query fetches (capped at 1.5–2 s) before lifting, so async data arrival happens under the cover instead of after it.
- Light-route mask hold on Windows is moderate (~900 ms typical) rather than the originally-shipped overly-aggressive 350 ms — long enough for query data to land, fast enough to not feel sluggish on table pages.
- Canvas resize jitter on Windows is reduced. The seven ResizeObservers driving SVG/canvas layout (Plan canvas, Assembly canvas, Harness Builder, Component editor, Preview dialog) now coalesce bursts of resize events to one callback per animation frame, eliminating cascade redraws when panels are dragged or sidebars toggle.
- My Designs table no longer shifts the surrounding chrome up/down when projects load — the container reserves vertical space.
[0.1.0-beta.6]
Fixed
- Sign-in and other backend-dependent actions no longer hang indefinitely when our service is degraded or unreachable. Every API request is now bounded — saves get 30 s, sign-in and most reads get 15 s, background refreshes (menu population, telemetry) get 5 s — so a stalled backend surfaces as a clean error instead of an infinite spinner.
- App launch and route navigation no longer pause on a slow backend. Auth state fills in reactively in the background; pages that show cloud-backed data render their signed-out / empty UI immediately and upgrade once the probe lands.
- Saves that take longer than 3 s now show a “Still saving — slow connection?” hint so the toolbar spinner isn’t mysterious. If a save times out, the desktop retries once silently before surfacing an error that points to File → Save to File As… as a local-disk fallback.
- Network errors on Parts, My Designs, and Account no longer take over the page with a red banner pinned above the table. Each page now shows a centered Can’t reach Splice CAD message inside the empty area with a Retry button — the page chrome stays put and you don’t lose your search or filter state. Auth-required and offline states are now visually distinct so you can tell “sign in” apart from “we can’t reach the server.”
- Tables show a centered loading spinner while fetching, instead of going blank.
Changed
- The Edit menu in the menu bar is now a focused Cut / Copy / Paste rather than the previous Undo/Redo/Cut/Copy/Paste/Select All. The app’s own undo system was getting double-bound through the menu, and select-all works natively in WKWebView text fields without a menu binding.
- Windows: route transitions now show a small three-dot loading indicator inside the dark transition mask if the new page takes longer than 200 ms to mount. Fast navigations are unchanged — the indicator never flashes for short transitions.
[0.1.0-beta.5]
Fixed
- Email/password sign-in dialog now accepts paste. Previously Cmd+V (and the right-click Paste menu) did nothing in the Email and Password fields because the desktop menu had no Edit submenu — without it, macOS doesn’t route the standard editing shortcuts to the focused webview input. The app now ships a full Edit menu (Undo / Redo / Cut / Copy / Paste / Select All) so the system shortcuts work everywhere a text field is focused.
Added
- Show / hide toggle on the Password field in the email sign-in dialog so you can verify what you typed before submitting.
[0.1.0-beta.4]
Changed
- Signed-out experience on the My Designs page no longer surfaces a raw “Request failed with status code 401” banner. You now get an empty-state prompt with Continue with Google and Sign in with email buttons, and the Projects table is hidden until you’re signed in.
- Status bar person icon is always present, tinted amber with a “Not signed in” label when no user is active. Clicking it opens a menu with the same Google and email sign-in actions instead of doing nothing.
[0.1.0-beta.3]
Fixed
- macOS sign-in now actually persists across launches. The keychain write
was silently no-op’ing on ad-hoc-signed builds (Apple Security framework
reports success, but the entry never lands in any keychain you can read
on next launch). Token storage now verifies the keychain readback and
falls back to a 0600 file in
~/Library/Application Support/com.splice.desktop/when the keychain isn’t usable, so you stay signed in until you sign out.
[0.1.0-beta.2]
Added
- Merge into selected path (Topology op). Select a trunk bundle + its two terminal branch points, right-click a stray bundle, choose Merge into selected path. Stub bundles are auto-created from each stray endpoint to its geometry-paired terminal, conductors are rerouted through the trunk, the stray bundle is removed. Empty stray bundles still get the topology change. One undo entry restores everything. See Bundle Operations / docs.
Fixed
- File → Open’s component and cable lists no longer fail to populate. The native
menu’s
set_open_menucommand was rejecting payloads because connector and cable rows have nonamefield server-side; the menu now falls back tomanufacturer + mpnfor the visible label. - Stay-signed-in across launches on installed builds. The boot probe now only clears the keychain when the backend explicitly returns 401 — transient network errors and 5xx responses no longer force a re-sign-in.
[0.1.0-beta.1] — initial desktop beta
Baseline. Subsequent entries record changes against this build.