A new Rack page, linked from the nav and from the cutsheet's rack list, draws the rack front from the rack units set on cutsheet items:
Switches and gateways with a faceplate (UDM Pro, USW Pro 24, Aggregation, PDU Pro) are drawn with their real faceplate and live port state.
Patch panels get a generic panel showing each port's label.
Everything else is a labelled plate that links to its device page or cutsheet item.
Each documented port shows its cutsheet state: green matches, red mismatch, grey unconfirmed.
Hovering a port lights up every port on the same cable run, including through patch panels, and the readout names the cables. Clicking a port opens the switch port or the cable.
Conflicts are listed, not drawn over: items that overlap another or run past the top of the rack. When two items claim the same top unit, the one recorded first wins. Items without a rack unit are listed below the drawing.
New rack.units setting (default 42).
New switch: add a cutsheet item with its rack unit and it appears straight away. It shows as a plate until its model gets a faceplate.
Backend.GET /api/rack builds on the existing cutsheet view, and the placement and per-port logic are in cutsheet.rack_layout and cutsheet.port_marks. A patch-panel port with front and rear cables that share one check states it once ("cables C01, #30: …").
Testing
347 tests pass (8 new): layout (top-first order, overlap, past the top, ties), port marks (worst-wins, merged runs, shared checks), the API shape, auth, and rack.units.
Playwright against seeded data:
Hovering PP1 port 1 lights up switch port 3.
Hovering the UDM's DAC port lights up AGG port 7.
Clicking a switch port opens /device/<switch>#port-N.
At 390 px there's no horizontal scroll, and there are no JS errors.
flake8 and bandit are clean, and ESLint reports 0 errors.
## What changes
A new **Rack** page, linked from the nav and from the cutsheet's rack list, draws the rack front from the rack units set on cutsheet items:
- **Switches and gateways** with a faceplate (UDM Pro, USW Pro 24, Aggregation, PDU Pro) are drawn with their real faceplate and live port state.
- **Patch panels** get a generic panel showing each port's label.
- **Everything else** is a labelled plate that links to its device page or cutsheet item.
- Each documented port shows its cutsheet state: green matches, red mismatch, grey unconfirmed.
- **Hovering a port** lights up every port on the same cable run, including through patch panels, and the readout names the cables. **Clicking** a port opens the switch port or the cable.
- **Conflicts are listed, not drawn over:** items that overlap another or run past the top of the rack. When two items claim the same top unit, the one recorded first wins. Items without a rack unit are listed below the drawing.
- New `rack.units` setting (default 42).
- **New switch:** add a cutsheet item with its rack unit and it appears straight away. It shows as a plate until its model gets a faceplate.
**Backend.** `GET /api/rack` builds on the existing cutsheet view, and the placement and per-port logic are in `cutsheet.rack_layout` and `cutsheet.port_marks`. A patch-panel port with front and rear cables that share one check states it once ("cables C01, #30: …").
## Testing
- 347 tests pass (8 new): layout (top-first order, overlap, past the top, ties), port marks (worst-wins, merged runs, shared checks), the API shape, auth, and `rack.units`.
- Playwright against seeded data:
- Hovering PP1 port 1 lights up switch port 3.
- Hovering the UDM's DAC port lights up AGG port 7.
- Clicking a switch port opens `/device/<switch>#port-N`.
- At 390 px there's no horizontal scroll, and there are no JS errors.
- flake8 and bandit are clean, and ESLint reports 0 errors.
Screenshots are in the comments.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
The rack front is drawn from the rack units on cutsheet items. Switches
with a faceplate use it, with live port state; patch panels get a generic
panel with port labels; everything else is a labelled plate. Each
documented port shows its cutsheet state, and hovering a port lights up
every port on the same cable run (through patch panels) and names the
cables. Clicking opens the switch port or the cable.
Overlapping items and items past the top of the rack are listed instead
of drawn over another; where two claim the same top unit, the first one
recorded wins. rack.units sets the height (default 42).
/api/rack builds on the cutsheet view; cutsheet.rack_layout and
cutsheet.port_marks hold the placement and per-port logic.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The rack, top section. Shown are a patch panel at U25 with port labels, the UDM Pro, USW Pro 24 and Aggregation with live ports and cutsheet dots, a 2U device drawn as a plate, and empty units.
Hovering patch-panel port 1. The cable run lights up at both ends: PP1 port 1 and switch port 3. The readout above the rack (not in this crop) names the cables.
Phone (390 px).
## Screenshots (local preview, sample data)
**The rack, top section.** Shown are a patch panel at U25 with port labels, the UDM Pro, USW Pro 24 and Aggregation with live ports and cutsheet dots, a 2U device drawn as a plate, and empty units.

**Hovering patch-panel port 1.** The cable run lights up at both ends: PP1 port 1 and switch port 3. The readout above the rack (not in this crop) names the cables.

**Phone (390 px).**

jared
merged commit 4f353888f8 into main2026-11-10 21:33:30 -05:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What changes
A new Rack page, linked from the nav and from the cutsheet's rack list, draws the rack front from the rack units set on cutsheet items:
rack.unitssetting (default 42).Backend.
GET /api/rackbuilds on the existing cutsheet view, and the placement and per-port logic are incutsheet.rack_layoutandcutsheet.port_marks. A patch-panel port with front and rear cables that share one check states it once ("cables C01, #30: …").Testing
rack.units./device/<switch>#port-N.Screenshots are in the comments.
🤖 Generated with Claude Code
Screenshots (local preview, sample data)
The rack, top section. Shown are a patch panel at U25 with port labels, the UDM Pro, USW Pro 24 and Aggregation with live ports and cutsheet dots, a 2U device drawn as a plate, and empty units.
Hovering patch-panel port 1. The cable run lights up at both ends: PP1 port 1 and switch port 3. The readout above the rack (not in this crop) names the cables.
Phone (390 px).