| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| rackula-lxc-v26.6.4.tar.gz | 2026-06-28 | 15.1 MB | |
| rackula-lxc-v26.6.4.tar.gz.sha256 | 2026-06-28 | 93 Bytes | |
| README.md | 2026-06-28 | 8.9 kB | |
| v26.6.4 source code.tar.gz | 2026-06-28 | 330.3 MB | |
| v26.6.4 source code.zip | 2026-06-28 | 332.7 MB | |
| Totals: 5 Items | 678.1 MB | 0 | |
A large usability release. The workspace is rebuilt around the canvas, and the storage layer is rebuilt to stop silently losing work. The rest is targeted fixes and technical-debt paydown that make the app faster to work in and more reliable. You can trust it with your data now. Please. It would mean a lot.
I'm looking forward to what's next. @ggfevans
Added
- Command palette is the search input for commands: one box runs any action or finds any device, opened from the toolbar search pill or with Ctrl+K, with recents, a selection-aware empty state, device search, and click-to-place on desktop (#2212, [#2213], [#2214], [#2341], [#2352])
- Tabbed side panel replaces the single edit panel: Layouts, Racks, and Devices tabs, contextual properties on the Edit tab, display toggles on the View tab, collapsible (#2076, [#2077], [#2078], [#2082])
- Floating verb bars put context actions next to the selected device or rack, including a slot control for half-width devices (#2075, [#2322], [#2334], [#2344])
- Layouts library lists every saved layout with cached previews, opened and managed from the sidebar (#2082, [#2083], [#2325])
- Open layouts persist as toolbar tabs and restore lazily on launch (#2079, [#2080], [#2324])
- Top bar reduced to workspace chrome (logo, app menu, layout name, storage status, settings); view and history controls relocated to a floating cluster at the canvas bottom-left, where the cursor already is (#2072, [#2073], [#2074], [#2187])
- App menu behind the Rackula mark is now the main menu: reorganized by intent, with the menu-item registry contract completed, group headings renamed for clarity, dividers between groups, and a mobile sheet that renders the same projection (#2596, [#2597], [#2602], [#2611])
- Settings dialog consolidates Appearance, Behaviour, and Data options (#2093)
- Device palette gains favourites, list virtualization for large libraries, and an image on/off toggle (#2094)
- New layouts open to a template picker instead of a blank canvas; the standalone StartScreen is gone, with entry routed through the sidebar and app menu (#2081, [#2095])
- Export-all renders every layout with per-mode framing in one pass (#2045)
- Carrier device types host half-width and sub-U gear directly, replacing the fractional-rail model so sub-U placement is predictable (#2158, [#2289], [#2291], [#2159])
- Storage status chip in the toolbar shows save state at a glance, with the storage location inline and a last-save details popover on hover or tap (#2035, [#2446], [#2640])
- Moving browser-stored layouts to server storage prompts before overwriting an existing server copy (#2608)
- Pre-overwrite snapshots are taken server-side with conflict detection; the Load dialog lists and restores them (#2040, [#2041], [#2042])
- Backup nudge tracks changes since the last export and warns before they are discarded, with a restore-from-file confirm step (#2034, [#2038], [#2039])
- Custom device images embed as base64 in the YAML save, so one file round-trips with its images (#617)
- Layout JSON Schema generated from the Zod schema for editor validation, under a documented versioning and compatibility policy (#1113, [#2226])
- Full-depth devices render and collide on both rack faces, so a device stored facing front also occupies and shows on the rear (#2337)
- Keyboard alternative for placing devices, so a device can be added without a pointer (#106)
- Device images show a load placeholder, fade in when ready, and raise a toast on failure, with accessible alt text
- Create-custom-device promoted to a labelled button at the foot of the device palette (#2556)
- Hover-revealed edge grip on the panel seam as a second way to collapse a side panel
- Verb-bar and canvas-control tooltips are sourced from the command registry, so labels and shortcuts stay in step
- MikroTik CSS326-24G-2S+RM and CSS610-8G-2S+IN switches added to the device library (#1581)
Changed
- Persistence runs through one storage interface with an explicit, injected mode, replacing runtime probe-and-guess (#2027, [#2036], [#2037])
- A twin-tab guard stops two open tabs from overwriting the same working copy, with placement images namespaced per layout (#2044, [#2270])
- Unknown top-level sections in a layout file survive a save instead of being dropped (#2208)
- Sidebar tabs ordered Layouts, Racks, Devices (#2326)
- Zoom snaps to round ladder rungs (#2336)
- Edit panel resolves device brand from the authoritative library; category names shown in singular (#2217, [#2218], [#2219])
- Display-mode toggle icon redesigned for clarity (#2335)
- Coffin-tapered mark adopted as the canonical logo (#2048)
- Rack PDUs modelled as shallow power bars that render in rear view (#2337)
- App light theme (Alucard) removed; Rackula is dark-only (#2468)
- Edit and View tab strip unified with the sidebar's segmented-control style (#2600)
- flip-device-face verb uses a transition-right glyph for clarity (#2400)
- The API validates a layout against the JSON Schema before persisting it (#2449)
Fixed
- Devices keep their container across same-rack and cross-rack moves, nudges, and YAML export; stale links are cleared on move (#2127, [#2128], [#2129], [#2131], [#2135], [#2224])
- Keyboard nudge no longer ejects a contained device from its container (#2146)
- Undo and redo bind to the correct rack and no longer throw on deleted racks (#2126)
- In-progress device name edits stay attached to their device (#2223)
- Rack height input reverts when a bayed rack rejects the resize (#2222)
- Half-U stacking works again for 0.5U devices (#2152)
- NetBox import validates enum and interface fields instead of casting blindly (#2119, [#2122])
- Export download no longer races object-URL revocation (#2201)
- Layout loads remap rack groups and container IDs in a two-pass load (#2155)
- Placement images survive server reconciliation and YAML round-trips (#2220, [#2225])
- Layouts mark clean after a debounced auto-save (#2057, [#2058], [#2061], [#2084])
- Snapshot data loss closed with strictly monotonic updatedAt and a per-layout write lock (#2067, [#2233])
- Muted-text and QR-brand contrast raised to WCAG AA, nested-interactive controls flattened, and canvas racks given a listbox parent so axe WCAG AA passes (#2255, [#2256])
Security
- CSV export escapes spreadsheet formula injection (#2200)
- Patched libssl3 and libcrypto3 for CVE-2026-45447 (alerts [#80]-83)
- Automated security-alert triage via Claude Code (#2357)
- Pinned libexpat to >=2.8.1-r0 in the deploy image for CVE-2026-45186 (#2562)
Technical
- Type checking restored across the utils, storage, and component layers; the last @ts-nocheck surfaces are gone (#1705, [#2104], [#2105])
- Layout store decomposed into per-layout instances behind a facade, with rack and device logic split into domain action modules; Canvas coordinate math and markup extracted; export.ts and EditPanel.svelte split into focused modules (#1077, [#1080], [#1396], [#1398], [#1610], [#2024], [#2025])
- E2E suite reworked: two-tier model with an environment approval gate, 4-way sharding, assertion-based waits, and role/label selectors, plus new undo/redo and accessibility coverage (#1227, [#1231], [#1420], [#2002], [#2003])
- Regression gates added: visual-diff tripwire, axe-core accessibility checks, a bundle-size budget, and a ban on CSS-class selectors in tests (#1423, [#2098], [#2099], [#2185])
- Upgrade-safety net so a self-hosted deployment can take new images without losing saved data: prior-release layouts load through the real parse path in a self-discovering fixture corpus with silent-loss detection, plus a fail-closed release guard; the Docker upgrade smoke drives the compose stack from the previous released image to the new build against the same volume and confirms the saved layout survives byte-for-byte (#2448, [#2515])
- i18n deferred to M011; the orphaned Paraglide runtime removed (#2184)
- Dev tooling hardened: cloud-safe superpowers bootstrap, worktree-aware main-edit guard, POSIX husky hooks, the /orchestrate-issues command, and pre-push gate fixes (#2102, [#2288])
- Upgrade corpus exercises the loadLayout path with v0.6 single-rack YAML fixtures (#2450, [#2451])
- Vendor asset directories normalized and the generic device library split from brand packs (#2552)
- @testing-library/svelte pinned to 5.3.1 to restore runes compatibility in the unit suite (#2587)
- SPA entry document revalidated on deploy so a stale cache stops serving the old build (#2599)
- DCO sign-off section added to CONTRIBUTING (#2559)
- Research spikes: accurate depth model for M021 (#2622) and Cloudflare Workers Static Assets for [#2029] prep (#2620)
- Dependency updates across the production, development, vitest, eslint, and api groups