Skip to content

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 shippedstrand 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 shippedmulti-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.)

  1. Elevation polish — done 2026-07 (drag-to-move on the rack page, PNG export of the front/rear pair).
  2. 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 / inventoryModule + ModuleType + ModuleBay, DeviceBay, InventoryItem + role. Line cards, SFPs, fans, PSUs, blade chassis; component serial tracking. Low.
  • Interface.speed as 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.profile slug (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).

  1. Trace through patch panels on the mapcable-paths resolves raw terminations, so a run through a passive panel lands on the panel tile in two segments. Reuse topology_views._collapse (front↔rear via strand_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.
  2. 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.
  3. 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.
  4. PDF export + PDF blueprints — jsPDF export with title block; accept PDF backgrounds via pdf.js; auto-fill grid size from image dimensions.
  5. 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-paths endpoint 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. FloorPlanTray model (floor-plan-trays API), client router in floorplan/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_zone tile types render under tiles, exempt from stacking); camera FOV cones (has_fov on 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 (via end-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.location FK (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.

  • MACAddress model — 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 + trunkingInterface.vrf (routing context), mode (access / tagged / tagged-all) + tagged_vlans (M2M) on top of the untagged/access vlan. SNMP IP assignment is now VRF-scoped, so overlapping IPs across VRFs don't collide. See SNMP discovery.
  • Custom field groups — a first-class CustomFieldGroup object (Customize → Custom field groups) buckets related custom fields into collapsible sections on forms + detail pages; smarter than NetBox's free-text group_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 full role_/site_/platform_/status_/tag_/cf_ group set — see the config-drift guide.