Rack: Flex Mini on the NVR, coloured Sliger fronts, UniFi brush panel #32

Merged
jared merged 7 commits from loose-gear-on-top into main 2026-11-11 02:09:39 -05:00
Owner

What changes

Gear resting on other gear. A USW Flex Mini lies on top of the NVR. A shelf item with the Front drawing "No shelf: gear resting on what is below" draws no tray, so its contents sit directly on the item underneath.

Live desk switches on shelves. A Flex Mini or Flex on a shelf is drawn with its live faceplate. Each is scaled to its real width from Ubiquiti's tech specs (107 mm and 122.5 mm) and has working ports. faceplateSvg() returns just a faceplate's SVG, so it can sit inside another drawing.

Sliger CX4712 with its coloured front fitted. These follow the rack photo on the wiki; earlier drawings showed the case with the faceplate off. There are new Front drawings for the red, white and blue fronts:

  • a hex-perforated panel with about 20 rows of holes, the drive cages showing faintly behind it
  • black rack ears
  • the power button with Gandalf's status ring
  • the USB recess (2x USB-A, 1x USB-C)

UniFi UACC-Rack-Panel-Brush-1U. Drawn from Ubiquiti's product images:

  • silver face with ear plates and rounded slots
  • a recessed, chamfered frame around the opening
  • two rows of bristles meeting at a seam

After deploy (production data)

Positions are from the wiki overview and your answers. large1 sits on a table beside the rack, so it is not in the rack.

U Item Drawing / notes
21 UACC-Rack-Panel-Brush-1U brush panel
20 On top of UNVR-Pro resting; holds the USW Flex Mini
14-17 compute-storage-01 red front, full depth
9-12 compute-storage-gpu-01 white front, full depth
5-8 storage-01 blue front, full depth

Testing

  • 370 tests pass. flake8 and bandit are clean, ESLint reports 0 errors, and there are no em or en dashes.
  • Playwright on a local copy of the real rack layout shows no overlaps and no JS errors.
  • The Flex Mini's ports are live and clickable.
  • Screenshots in the comments compare each drawing with its reference: the brush panel against Ubiquiti's image, and the Sligers against the rack photo.

🤖 Generated with Claude Code

## What changes **Gear resting on other gear.** A USW Flex Mini lies on top of the NVR. A shelf item with the Front drawing **"No shelf: gear resting on what is below"** draws no tray, so its contents sit directly on the item underneath. **Live desk switches on shelves.** A Flex Mini or Flex on a shelf is drawn with its live faceplate. Each is scaled to its real width from Ubiquiti's tech specs (107 mm and 122.5 mm) and has working ports. `faceplateSvg()` returns just a faceplate's SVG, so it can sit inside another drawing. **Sliger CX4712 with its coloured front fitted.** These follow the rack photo on the wiki; earlier drawings showed the case with the faceplate off. There are new Front drawings for the red, white and blue fronts: - a hex-perforated panel with about 20 rows of holes, the drive cages showing faintly behind it - black rack ears - the power button with Gandalf's status ring - the USB recess (2x USB-A, 1x USB-C) **UniFi UACC-Rack-Panel-Brush-1U.** Drawn from Ubiquiti's product images: - silver face with ear plates and rounded slots - a recessed, chamfered frame around the opening - two rows of bristles meeting at a seam ## After deploy (production data) Positions are from the wiki overview and your answers. large1 sits on a table beside the rack, so it is not in the rack. | U | Item | Drawing / notes | |---|---|---| | 21 | UACC-Rack-Panel-Brush-1U | brush panel | | 20 | On top of UNVR-Pro | resting; holds the USW Flex Mini | | 14-17 | compute-storage-01 | red front, full depth | | 9-12 | compute-storage-gpu-01 | white front, full depth | | 5-8 | storage-01 | blue front, full depth | ## Testing - 370 tests pass. flake8 and bandit are clean, ESLint reports 0 errors, and there are no em or en dashes. - Playwright on a local copy of the real rack layout shows no overlaps and no JS errors. - The Flex Mini's ports are live and clickable. - Screenshots in the comments compare each drawing with its reference: the brush panel against Ubiquiti's image, and the Sligers against the rack photo. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
jared added 2 commits 2026-11-11 01:09:01 -05:00
Rack: gear resting on other gear, and live desk switches on shelves
Lint / Python (flake8) (push) Failing after 47s
Lint / JS (eslint) (push) Successful in 17s
Lint / Deploy (push) Skipped
Security / Python Security (bandit) (push) Successful in 1m26s
Lint / Notify on failure (push) Successful in 7s
Test / Python Tests (pytest) (push) Successful in 2m2s
d8e827c88b
A USW Flex Mini lies on top of the NVR. A shelf item with Front drawing
"No shelf: gear resting on what is below" draws no tray or ears, so its
contents sit directly on the item under it.

UniFi desk switches on a shelf (Flex Mini, Flex) are drawn with their live
faceplate, scaled to their real width from Ubiquiti's tech specs (107 mm and
122.5 mm), with working ports. faceplateSvg() returns a faceplate's SVG on
its own so it can be placed inside the shelf drawing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tests: wrap a long line
Lint / JS (eslint) (push) Successful in 25s
Lint / Python (flake8) (push) Successful in 1m53s
Lint / Notify on failure (push) Skipped
Lint / Deploy (push) Skipped
Security / Python Security (bandit) (push) Successful in 1m28s
Lint / Python (flake8) (pull_request) Successful in 58s
Test / Python Tests (pytest) (push) Successful in 1m9s
Lint / JS (eslint) (pull_request) Successful in 6s
Lint / Notify on failure (pull_request) Skipped
Lint / Deploy (pull_request) Skipped
Security / Python Security (bandit) (pull_request) Successful in 1m1s
Test / Python Tests (pytest) (pull_request) Successful in 1m6s
3bc8df6dc7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
jared added 2 commits 2026-11-11 01:51:31 -05:00
Rack: Sliger fronts in red, white and blue, and the UniFi brush panel
Lint / JS (eslint) (push) Successful in 7s
Lint / Python (flake8) (push) Successful in 53s
Lint / Notify on failure (push) Skipped
Lint / Deploy (push) Skipped
Security / Python Security (bandit) (push) Successful in 1m0s
Lint / Python (flake8) (pull_request) Successful in 52s
Test / Python Tests (pytest) (push) Successful in 1m7s
Lint / JS (eslint) (pull_request) Successful in 10s
Lint / Notify on failure (pull_request) Skipped
Lint / Deploy (pull_request) Skipped
Security / Python Security (bandit) (pull_request) Successful in 1m52s
Test / Python Tests (pytest) (pull_request) Successful in 1m51s
7408b1feca
From the rack photo on the wiki, the three Sligers have their coloured
perforated fronts fitted, not the faceplate-off view: Front drawings
"Sliger CX4712 4U, red/white/blue front" draw the hex-perforated panel
(about 20 rows of holes, the drive cages faint behind it), black rack ears,
the power button with Gandalf's status ring, and the USB recess.

UniFi UACC-Rack-Panel-Brush-1U is drawn from Ubiquiti's product images:
silver face, ear plates with rounded slots, a recessed chamfered frame and
two rows of bristles meeting at a seam.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
jared changed title from Rack: gear resting on other gear, and live desk switches on shelves to Rack: Flex Mini on the NVR, coloured Sliger fronts, UniFi brush panel 2026-11-11 01:51:46 -05:00
Author
Owner

Drawings compared with their references

Brush panel: the drawing (top) above Ubiquiti's product image (bottom).

Brush panel

Sligers: the drawings (left) beside the rack photo (right).

Sligers

Whole rack in a local copy of the production layout. This was taken before the last mesh and USB tweaks.

Rack

## Drawings compared with their references **Brush panel**: the drawing (top) above Ubiquiti's product image (bottom). ![Brush panel](https://code.lotusguild.org/LotusGuild/gandalf/raw/branch/pr-32-screenshots/3-brush-vs-ubiquiti.png) **Sligers**: the drawings (left) beside the rack photo (right). ![Sligers](https://code.lotusguild.org/LotusGuild/gandalf/raw/branch/pr-32-screenshots/4-sligers-vs-photo.png) **Whole rack** in a local copy of the production layout. This was taken before the last mesh and USB tweaks. ![Rack](https://code.lotusguild.org/LotusGuild/gandalf/raw/branch/pr-32-screenshots/2-whole-rack-before-tweaks.png)
jared added 1 commit 2026-11-11 01:55:15 -05:00
Rack: rack handles on the Sliger ears
Lint / JS (eslint) (push) Successful in 13s
Lint / Python (flake8) (push) Successful in 1m50s
Lint / Notify on failure (push) Skipped
Lint / Deploy (push) Skipped
Security / Python Security (bandit) (push) Successful in 1m17s
Test / Python Tests (pytest) (push) Successful in 1m39s
Lint / Python (flake8) (pull_request) Successful in 1m28s
Lint / JS (eslint) (pull_request) Successful in 17s
Lint / Notify on failure (pull_request) Skipped
Lint / Deploy (pull_request) Skipped
Security / Python Security (bandit) (pull_request) Successful in 1m26s
Test / Python Tests (pytest) (pull_request) Successful in 1m6s
6e6150f9b9
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
jared added 1 commit 2026-11-11 01:56:27 -05:00
Rack: brush panel holds up at rack size
Lint / Python (flake8) (push) Successful in 1m2s
Lint / JS (eslint) (push) Successful in 10s
Lint / Notify on failure (push) Skipped
Lint / Deploy (push) Skipped
Lint / JS (eslint) (pull_request) Successful in 7s
Lint / Python (flake8) (pull_request) Successful in 1m26s
Lint / Notify on failure (pull_request) Skipped
Lint / Deploy (pull_request) Skipped
Security / Python Security (bandit) (push) Successful in 1m55s
Test / Python Tests (pytest) (push) Successful in 1m24s
Security / Python Security (bandit) (pull_request) Successful in 49s
Test / Python Tests (pytest) (pull_request) Successful in 1m10s
36cbdd061d
The bristles were hundreds of hard strands, which aliased into flat
stripes at normal rack size. Each row is now shaded root to tip with a
faint strand texture over it, so the panel looks the same at any size.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Author
Owner

Updated: Sliger handles, and the brush panel at rack size

Sliger handles. Each Sliger now has a rack handle on each ear: a vertical bar standing off two mounts.

Sligers with handles

Brush panel. The earlier whole-rack screenshot was taken before the redraw, so it showed the first version. That screenshot is now removed. At normal rack size, the redrawn bristles also aliased into flat stripes. Each bristle row is now shaded from root to tip, with a faint strand texture on top.

The panel below appears three times: at rack size (top), at 2x (middle), and in Ubiquiti's image (bottom).

Brush panel at rack size

The whole rack as it renders now (local copy of the production layout):

Rack

## Updated: Sliger handles, and the brush panel at rack size **Sliger handles.** Each Sliger now has a rack handle on each ear: a vertical bar standing off two mounts. ![Sligers with handles](https://code.lotusguild.org/LotusGuild/gandalf/raw/branch/pr-32-screenshots/5-sligers-with-handles.png) **Brush panel.** The earlier whole-rack screenshot was taken before the redraw, so it showed the first version. That screenshot is now removed. At normal rack size, the redrawn bristles also aliased into flat stripes. Each bristle row is now shaded from root to tip, with a faint strand texture on top. The panel below appears three times: at rack size (top), at 2x (middle), and in Ubiquiti's image (bottom). ![Brush panel at rack size](https://code.lotusguild.org/LotusGuild/gandalf/raw/branch/pr-32-screenshots/7-brush-at-rack-size.png) **The whole rack as it renders now** (local copy of the production layout): ![Rack](https://code.lotusguild.org/LotusGuild/gandalf/raw/branch/pr-32-screenshots/6-whole-rack-current.png)
jared added 1 commit 2026-11-11 01:57:23 -05:00
Rack: brush panel opening runs nearly the full width between the ears
Lint / Python (flake8) (push) Successful in 58s
Lint / JS (eslint) (push) Successful in 7s
Lint / Notify on failure (push) Skipped
Lint / Deploy (push) Skipped
Security / Python Security (bandit) (push) Successful in 1m6s
Test / Python Tests (pytest) (push) Successful in 1m7s
Lint / JS (eslint) (pull_request) Successful in 9s
Lint / Python (flake8) (pull_request) Successful in 1m51s
Lint / Notify on failure (pull_request) Skipped
Lint / Deploy (pull_request) Skipped
Security / Python Security (bandit) (pull_request) Successful in 1m45s
Test / Python Tests (pytest) (pull_request) Successful in 1m1s
cbdae54d70
As in Ubiquiti's product image and the rack photo.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Author
Owner

Brush panel: wider opening

The bristles now run nearly the full width between the ear plates, as on the real panel. The image below shows, top to bottom: the drawing at rack size, the brush panel in the rack photo, and Ubiquiti's product image.

Brush panel

The whole-rack screenshot in the comment above has been updated in place (same link).

## Brush panel: wider opening The bristles now run nearly the full width between the ear plates, as on the real panel. The image below shows, top to bottom: the drawing at rack size, the brush panel in the rack photo, and Ubiquiti's product image. ![Brush panel](https://code.lotusguild.org/LotusGuild/gandalf/raw/branch/pr-32-screenshots/7-brush-at-rack-size.png) The whole-rack screenshot in the comment above has been updated in place (same link).
jared scheduled this pull request to auto merge when all checks succeed 2026-11-11 02:01:09 -05:00
jared merged commit aeb7a89e81 into main 2026-11-11 02:09:39 -05:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: LotusGuild/gandalf#32