Roadmap & goals¶
Tracked enhancements, with enough design intent that any of them can be picked up without re-deciding the shape. Shipped items are kept briefly for context, then retired.
Fibre strands (a NetBox gap)¶
Phase 1 shipped — fibre cables carry a fiber_count; strands are coloured
by TIA-598-C (black stripe past 12, ring on each further wrap) and
can be labelled / statused; a per-tenant Fibre colours settings page
(/fiber) reorders the palette. See Fibre strands.
Phase 2 shipped — strand trace: on a trunk cable, click a strand to follow it end-to-end through the panels (device → panel → trunk strand k → panel → device), drawn in the strand's colour. No schema change — strand↔rear- position is 1:1. See Fibre strands.
Phase 3A shipped — multi-fibre connectors: a front port carries a
positions (fibre count), so an LC-duplex (2) or MPO (8–24) connector
claims a range of rear positions (overlap/fit validated); a connector-type
quick-fill pre-fills it. A per-tenant Fibre modelling setting (off /
count / accurate) on /fiber keeps the fibre UI opt-in. The trace is
range-aware (strand_of). See Fibre strands.
Next (Phase 3B): the strand map at connect time — CableTermination.strand_map
+ a polarity dialog (straight / crossed) so a run follows the exact strand
through duplex/MPO. Then splice points. Design:
fibre strands — design.
Next up (from the faceplate / rack / picker round, 2026-07)¶
Ranked; each is self-contained. (The 2026-07 round — cable form, faceplates, rack overhaul, modules M1, Rack.location, ObjectPicker family, aux cabling, weight budget — is committed; see Shipped below. ⚠ Branch rewrites dropped hunks four times this round — diff carefully when squashing.)
Elevation polish— done 2026-07 (drag-to-move on the rack page, PNG export of the front/rear pair).Convert remaining hand-rolled IP dropdowns— done 2026-07 (tunnel-termination, vm-form, services-pane →IpPicker; assign-ip-dialog keeps its richer cascading site→VRF→prefix flow on purpose).
DCIM device-model parity (from the device-page audit)¶
The device page is in good shape; these are data-model gaps vs NetBox that a network engineer hits. Ranked. (Interface VRF + trunking + the layout dedup are shipped — see below.)
- Modules / bays / inventory —
Module+ModuleType+ModuleBay,DeviceBay,InventoryItem+ role. Line cards, SFPs, fans, PSUs, blade chassis; component serial tracking. Low. Interface.speedas an integer — stored as a free string ("10 Gbps"); NetBox uses kbps int for sort/filter/compare. Low.- Parametric cable profiles (OSP fiber) — a
Cable.profileslug (single-1c144p,trunk-12c12p) parsed dynamically instead of a hardcoded class per combination, so loose-tube / ribbon cables up to 6912+ fibers are modelable and splice-point traces are position-accurate. Design: Interface & cable types → plan. Med.
Next up — floor plans (netbox-map parity audit, 2026-07)¶
Ranked by operator value. Search, hover popovers, and the device/rack cross-link shipped this round (see below).
- Trace through patch panels on the map —
cable-pathsresolves raw terminations, so a run through a passive panel lands on the panel tile in two segments. Reusetopology_views._collapse(front↔rear viastrand_of) to fold panel hops into one end-to-end device→panel→device run, drawn as a single trace with the panels it crosses. This is the netbox-map "drop → structured cabling → switch" trace. Plan:trace-on-map-and-drops.md. - Auto-assign cables to trays — the trace already routes a cable through its assigned trays (Dijkstra over the tray graph, incl. T-junctions and mid-run crossings); the remaining step is to auto-pick which trays a cable belongs to from its endpoints, so users don't add it per tray.
- Dedicated drop UX — drops already work as patch-panel-role devices placed as tiles (seed shows two); the nicety is a first-class "Drop" tile linked to a specific port (a single jack), not just the device.
- PDF export + PDF blueprints — jsPDF export with title block; accept PDF backgrounds via pdf.js; auto-fill grid size from image dimensions.
- Auto-offset overlapping trays — render trays that share a segment with a small per-index perpendicular offset so stacked runs stay legible.
Shipped¶
- Floor plans — cable trays + routed A↔B traces (2026-07) — a Cables
mode that draws named tray/conduit runs (polylines on a half-cell
lattice so parallel/crossing runs read cleanly) with the physical DCIM
cables assigned to each (search-to-add, tenant-checked). Trays render above
tiles as a subtle recolorable channel and export with the PNG as a builder's
pull sheet. Routed A↔B traces:
cable-pathsendpoint resolves each cable's terminations → device → tile (or rack tile), and the canvas routes the trace through the cable's trays (Dijkstra over a tray graph built from vertices, cross-tray junctions AND mid-run segment intersections, and entry projections — handles T-junctions, crossing trays, and cables spanning several connected trays), falling back to a straight line when a cable has no trays. Trace on map: a Trace on map button on the cable page (and?trace=<id>deep-link) opens the plan with that cable highlighted + fitted, no Cables-mode clicking (/api/cables/<id>/floor-plan/resolver). View → "Cable links" draws every run; a tray inspector highlights one; toggles hide trays / show links.FloorPlanTraymodel (floor-plan-traysAPI), client router infloorplan/cable-route.ts. Plus editor finders: header search (pan/zoom to a tile), fit button, native hover tooltips, and a Show on floor plan button on the Rack/Device pages (device falls back to its rack's plan). Next: auto-route cables along the tray graph. - Floor plans round 2 (2026-07) — live tiles: rack utilization bar +
monitoring rollup (border goes red when a device in the rack drops) off a
new
/state/endpoint; rack/device deep-view sheet (real elevation, device list, per-device end-to-end trace via DeviceMiniTopology); background zones (hot/cold aisle, security areas —is_zonetile types render under tiles, exempt from stacking); camera FOV cones (has_fovon tile types and device roles; direction/angle/reach per tile); no-stacking collision rules; labels on 1×1 tiles + persisted fit-labels view pref. - Floor plans MVP (2026-07) — Maps → Floor plans: an SVG grid editor per
location (pan/zoom, paint/move/resize/rotate, explicit-Save bulk endpoint,
PNG export), tiles linkable to racks/devices/power/nested plans
(tenant-checked
link_kind+link_id), a user-defined tile palette (Customize → Floor tiles, with a searchable Lucide icon picker; device roles double as tile types), viewer mode + Location-page entry. Zero built-in tile kinds. Plan, user guide. - Interface extras (2026-07) — mgmt_only, duplex, PoE mode/type, WWN on concrete interfaces (+ PoE on templates, stamped through, imported from the devicetype-library).
- Object-reference custom fields (2026-07) — CF type "object": a dropdown of live users/groups/devices/VLANs/… via the advanced pickers; registry-backed (applies-to auto-derived from CustomFieldsMixin, reference targets plugin-registrable), values validated against rows, labels resolved through a bulk endpoint.
- Topology map v2 (2026-07) — stencil device cards with port-to-port
edges, patch-panel collapse (
viaend-to-end runs), site/role/status/tag filters, focus+depth, search-dim, edge coloring (cable/type/status), saved views with hand positions, PNG export, detail panels; device mini map and cable traces ride the same canvas. - Device bays + inventory items (2026-07) — chassis nesting (parent/ child subdevice roles, install whole devices into bays) and serial-tracked parts (templates + device Hardware tab, one-level nesting). The devicetype-library importer now maps 100% of the schema (device-bays, inventory-items, subdevice_role, exclude_from_utilization all landed).
- Rack power rollup (2026-07) — primary feeds (V×A×util%, 3-phase ×√3) vs racked power-port draws (allocated, nameplate fallback); demand/supply stat on the rack page. Completes the capacity triad: space, weight, power.
- Aux-port cabling + rack weight budget (2026-07) — aux ports are cable-terminable (9th termination kind, USB console / video runs); racks carry a max-weight budget with device-type weights summed in kg on the rack page (red when over).
- Generic
ObjectPicker(2026-07) — extracted from DevicePicker (spec-driven core: endpoints/filters/columns); DevicePicker is now a thin preset (API unchanged), plus RackPicker (device form), VlanPicker (interface form), PrefixPicker (IP-range form — replaced a page_size=1000 dropdown) and IpPicker (FHRP virtual IP — replaced page_size=500). Rack.locationFK (2026-07) — racks live in a location within their site (validated); rack form/detail +?location=filter + the Locations page's elevations button is now truly location-scoped.- Modules M1 (2026-07) — module bay templates + bays, ModuleType catalog
(own interface templates,
{module}token), install/remove on the device page (interfaces stamped/removed), library module-type YAML auto-detected by the importer. M2 notes: console/power on modules, nested bays. -
DCIM physicality round (2026-07) — console/power/panel/aux component models + templates; mm-true device faceplates with a drag-and-drop builder (front/rear, per-U lanes, full-width); NetBox devicetype-library YAML import (with elevation images +
{position}rewrite); rack elevation overhaul (Names/Images/Render modes, depth hatching, role colors, 10–23″ widths, all-elevations wall, hover Add/Assign); reusable DevicePicker with server-side advanced search (tag/manufacturer/type/role/status/site/ location/region) and VC ghosting; virtual chassis + stack views. -
MACAddressmodel — a first-class, tenant-scoped MAC object (/api/mac-addresses/) with tags + custom fields, assigned to an interface (Interface.mac_addresses); existing interface MAC strings were backfilled, and the SNMP sync now mints MACAddress objects for discovered MACs. - Interface VRF + trunking —
Interface.vrf(routing context),mode(access / tagged / tagged-all) +tagged_vlans(M2M) on top of the untagged/accessvlan. SNMP IP assignment is now VRF-scoped, so overlapping IPs across VRFs don't collide. See SNMP discovery. - Custom field groups — a first-class
CustomFieldGroupobject (Customize → Custom field groups) buckets related custom fields into collapsible sections on forms + detail pages; smarter than NetBox's free-textgroup_name. See tags & custom fields. - Custom fields in the Ansible inventory + a
cf_<name>group per boolean CF — see custom-field-driven playbooks. - Interfaces in the inventory (
danbyte.interfaces) and the fullrole_/site_/platform_/status_/tag_/cf_group set — see the config-drift guide.