Infrastructure
The Infrastructure Aether models your physical estate — from geography down to the cables and power feeds inside a rack. It’s the most complete Aether and the best place to start.

How it fits together
Section titled “How it fits together”Two chains meet at the device:
- Geography (top-down): Region → Site → Location → Rack. Build this first so there’s somewhere to place hardware.
- Catalogue (build-up): Manufacturer → Platform / Device Role → Device Type. This describes what a device is, independently of where it sits.
A Device then references a place (site, location, rack, position) and a catalogue entry (type, role, platform, manufacturer).

Geography
Section titled “Geography”The physical hierarchy. Build it top-down so there’s somewhere to place hardware.
Regions
Section titled “Regions”Geographic groupings for sites — countries, metros, or whatever rollup suits your estate. A site belongs to at most one region; regions carry no parent of their own.
Fields
| Field | Type | Notes |
|---|---|---|
name | string · required | Display name. |
slug | string · unique | URL-safe identifier; auto-derived from name when omitted. |
description | string | Free-form notes. |
API — GET/POST /api/regions, GET/PATCH/DELETE /api/regions/{id}. Search spans name, slug, and description.
Buildings or facilities — the level addresses and coordinates live at. A site optionally rolls up to a region and is the anchor most other records ultimately trace back to.
Fields
| Field | Type | Notes |
|---|---|---|
name | string · required | Display name. |
slug | string · unique | URL-safe identifier; auto-derived when omitted. |
status | enum | active · planned · retired (default active). |
regionId | uuid → Region | Optional parent region. |
facility | string | Operator / facility name. |
address | string | Postal address. |
latitude / longitude | decimal | Plots the site on the map view; bounds enforced (±90 / ±180). |
description | string | Free-form notes. |
API — GET/POST /api/sites, GET/PATCH/DELETE /api/sites/{id}.
Locations
Section titled “Locations”Rooms, halls, floors, or areas within a site — the level racks actually live in. A location optionally references a site and can carry its own address and coordinates so it can be placed as a finer drill-down on the map.
Fields
| Field | Type | Notes |
|---|---|---|
name | string · required | Display name. |
slug | string | URL-safe identifier; auto-derived when omitted (not unique). |
siteId | uuid → Site | Optional parent site. |
status | string | Lifecycle status (default active). |
address | string | Postal address. |
latitude / longitude | decimal | Optional coordinates; bounds enforced (±90 / ±180). |
description | string | Free-form notes. |
API — GET/POST /api/locations, GET/PATCH/DELETE /api/locations/{id}.
Cabinets within a site / location, each with a unit-addressed elevation (a height in U that devices are positioned against). The rack detail view renders a front/rear elevation showing which units are occupied.
The Racks page navigates hall by hall — pick a hall (or all of them) and use the toolbar’s “Find rack…” search to filter the elevations and floor grid, jumping straight to a unique match. Power figures auto-scale with the estate (kW below a megawatt, then MW, then GW; CSV exports stay in raw kW). Give a hall real width × length dimensions and it unlocks a to-scale 3D view and designer: the auto-layout places only what the floor can hold — overflow racks wait in an Unplaced tray until you place them — and the designer supports multi-select (shift+click, shift+drag marquee), group move and rotate with collision checking, arrow-key nudge, and undo.
Fields
| Field | Type | Notes |
|---|---|---|
name | string · required | Display name. |
siteId | uuid → Site | Optional site. |
locationId | uuid → Location | Optional location. |
units | integer | Height in rack units (default 42). |
status | string | Free-form lifecycle string (default active). |
API — GET/POST /api/racks, GET/PATCH/DELETE /api/racks/{id}, plus POST /api/racks/bulk ({ items[] }, max 5000) for large-estate imports. List accepts ?siteId= and ?locationId= (UUID or none).
Catalogue
Section titled “Catalogue”What a device is, described once and reused across every unit you place.
The catalogue is a two-tier model. Rows with source: 'vendor' ship with
Aethers and are maintained by the catalog importer — they’re read-only. Rows
with source: 'customer' are yours, created via UI/API and never touched by the
importer. To edit a vendor row, clone it (POST .../{id}/clone) to get an
editable customer-owned copy.
Manufacturers
Section titled “Manufacturers”Hardware vendors — Cisco, Juniper, Dell, and the rest. Referenced by platforms, device types, and devices.
Fields
| Field | Type | Notes |
|---|---|---|
name | string · required | Display name. |
slug | string · unique | URL-safe identifier; auto-derived when omitted. |
description | string | Free-form notes. |
productFocus | string | What the vendor primarily builds. |
website | string | Vendor URL. |
notes | string | Free-form notes. |
popular | boolean | Pins the row in pickers (default false). |
source | enum | vendor (read-only) · customer (default customer). |
API — GET/POST /api/manufacturers, GET/PATCH/DELETE /api/manufacturers/{id}, plus POST /api/manufacturers/{id}/clone.
Platforms
Section titled “Platforms”The network OS a device runs (IOS-XE, NX-OS, Junos, …) — used to group devices
by software and to drive port-naming when interfaces are materialised. The
nosFamily value feeds the per-vendor port-naming convention.
Fields
| Field | Type | Notes |
|---|---|---|
name | string · required | Display name. |
slug | string · unique | URL-safe identifier; auto-derived when omitted. |
manufacturerId | uuid → Manufacturer | Optional vendor. |
description | string | Free-form notes. |
nosFamily | string | NOS family; drives port-name conventions on devices. |
typicalDevices | string | Hardware this NOS typically runs on. |
keyFeatures | string | Notable capabilities. |
commonUseCases | string | Where it fits. |
commercialStatus | enum | active · eos · eol · limited · open-source. |
automationApis | string[] | From NETCONF · RESTCONF · gNMI · gRPC · eAPI · NX-API · JSON-RPC · REST · YANG · NDK · SNMP · Cloud-only. |
popular | boolean | Pins the row in pickers (default false). |
source | enum | vendor (read-only) · customer (default customer). |
API — GET/POST /api/platforms, GET/PATCH/DELETE /api/platforms/{id}, plus POST /api/platforms/{id}/clone. List accepts ?manufacturerId= (UUID or none) for the manufacturer → platforms rollup.
Device Roles
Section titled “Device Roles”The function a device serves in the topology — leaf, spine, firewall, console server. Roles carry a colour so they read at a glance in lists and elevations.
Fields
| Field | Type | Notes |
|---|---|---|
name | string · required | Display name. |
slug | string · unique | URL-safe identifier; auto-derived when omitted. |
color | string | Hex swatch (default #4F6EF7). |
description | string | Free-form notes. |
tier | enum | One of access · distribution · core · spine · leaf · border-leaf · ai-fabric · edge · sp-edge · sp-core · customer-edge · branch · security · wireless · storage · compute · mgmt · optical · dci · passive · monitoring. |
redundancy | enum | optional · recommended · required. |
complianceBaselines | string[] | Baselines the role must meet (default []). |
vmRole | boolean | Marks a virtual-machine role (default false). |
typicalLocation | string | Where it usually sits. |
responsibilities | string | What it does. |
popular | boolean | Pins the row in pickers (default false). |
source | enum | vendor (read-only) · customer (default customer). |
API — GET/POST /api/device-roles, GET/PATCH/DELETE /api/device-roles/{id}, plus POST /api/device-roles/{id}/clone.
Device Types
Section titled “Device Types”The model in the catalogue — form factor, height in rack units, power draw, and the module definitions that ports are materialised from. Define the type once; every device of that model inherits it.
Fields
| Field | Type | Notes |
|---|---|---|
name | string · required | Model name (also keys the built-in port templates). |
slug | string · unique | URL-safe identifier; auto-derived when omitted. |
manufacturerId | uuid → Manufacturer | Optional vendor. |
description | string | Free-form notes. |
modelFamily | string | Product line. |
formFactor | enum | fixed · stackable · modular-chassis · half-rack · compact, or a U size (0.5U–21U). |
rackUnits | decimal | Height consumed in U. |
airflow | enum | front-to-back · back-to-front · reversible · side-to-side · passive. |
weightKg | decimal | Weight in kg. |
powerIdleW / powerMaxW | integer | Idle / max draw in watts. |
poeBudgetW | integer | PoE budget in watts. |
keyFeatures | string | Notable capabilities. |
typicalDeployment | string | Where it fits. |
asicChipset | string | Switching ASIC. |
defaultPlatformId | uuid → Platform | Default NOS for devices of this type. |
defaultRoleId | uuid → Device Role | Default role for devices of this type. |
popular | boolean | Pins the row in pickers (default false). |
source | enum | vendor (read-only) · customer (default customer). |
status | enum | active · announced · eos · eol (default active). |
Modules (device_type_modules) are the swappable uplink / line-card SKUs that
extend a chassis (e.g. C9300-NM-4G). Each carries a sku, name, slotLabel,
connectorType, speeds[], portCount, poeStandard/poeWatts, and a
sortOrder. They’re nested under their device type and managed at
GET/POST /api/device-types/{id}/modules and
PATCH/DELETE /api/device-types/{id}/modules/{moduleId}.
API — GET/POST /api/device-types, GET/PATCH/DELETE /api/device-types/{id}, plus POST /api/device-types/{id}/clone and the nested module routes above. List accepts ?manufacturerId=, ?defaultPlatformId=, and ?defaultRoleId= (UUID or none).

Devices & connectivity
Section titled “Devices & connectivity”The records that reference everything above, plus the cabling and power that tie them together.
Devices
Section titled “Devices”Physical units placed in racks. A device references a place (site, location,
rack, position) and a catalogue entry (type, role, platform, manufacturer).
platform (free-text, inline-editable) coexists with the canonical platformId
FK; model mirrors the linked device type’s name.
Fields
| Field | Type | Notes |
|---|---|---|
name | string · required | Display name. |
status | enum | active · planned · staged · offline · decommissioned (default active). |
siteId | uuid → Site | Optional placement. |
locationId | uuid → Location | Optional placement. |
rackId | uuid → Rack | Optional placement; required when position is set. |
manufacturerId | uuid → Manufacturer | Optional. |
deviceRoleId | uuid → Device Role | Optional. |
deviceTypeId | uuid → Device Type | Optional; drives port auto-materialisation on create. |
position | integer | Lowest rack unit occupied (≥ 1); needs a rackId. |
uHeight | integer | Units consumed (default 1). |
platform | string | Free-text NOS label (inline-editable). |
platformId | uuid → Platform | Canonical NOS link. |
model | string | Mirrors the linked device type’s name. |
primaryIp | string | Management IP. |
tags | string[] | Chip strip (default []). |
serialNumber / assetTag | string | Identifiers. |
description / notes | string | Free-form. |
API — GET/POST /api/devices, GET/PATCH/DELETE /api/devices/{id}. Extra routes: POST /api/devices/bulk ({ items[] }, max 2000; materialisePorts defaults true), aggregates GET /api/devices/stats, /api/devices/by-site, /api/devices/by-manufacturer, the nested ports routes (GET/POST /api/devices/{id}/ports, PATCH/DELETE /api/devices/{id}/ports/{portId}, POST /api/devices/ports/bulk), and read-only GET /api/devices/{id}/ips. List filters: ?status=, ?siteId=, ?locationId=, ?manufacturerId=, ?deviceTypeId=, ?deviceRoleId=, ?platformId=, ?rackId= (each a UUID or none).
Interfaces
Section titled “Interfaces”Device ports — Ethernet, console, management, and power inlets. Backed by the
device_ports table (there’s no separate “interfaces” table); the page is CRUD
over ports, addressable per device or across the whole estate.
Fields
| Field | Type | Notes |
|---|---|---|
deviceId | uuid → Device · required | Owning device (cascade-deletes). |
name | string · required | Interface name. |
portType | string | IEEE-ish media string (default 1000base-t). |
status | enum | enabled · disabled · planned (default enabled). |
linkStatus | enum | up · down · unknown (default up). |
peer | string | Free-text far end (cable peers override in the UI). |
vlan | string | VLAN assignment. |
lldp | string | LLDP neighbour. |
errs | integer | Error counter (default 0). |
portGroupLabel | string | Sectional heading on the Interfaces tab. |
portIndex | integer | Ordinal; default list sort. |
connectorType | string | e.g. RJ45, SFP28, QSFP28. |
speeds | string[] | Negotiable speeds (default []). |
poeStandard / poeWatts | string / integer | PoE class + budget. |
transceiver | string | Installed optic. |
mgig | boolean | Multi-gig capable (default false). |
breakoutCapable | boolean | Supports breakout (default false). |
moduleSlot | string | Owning module slot. |
macAddress | string | Burnt-in address. |
description | string | Free-form notes. |
API — GET/POST /api/interfaces, GET/PATCH/DELETE /api/interfaces/{id}. List accepts ?deviceId= to scope to one device. The same rows are also reachable via the device-nested ports routes under /api/devices/{id}/ports.

Cables
Section titled “Cables”Physical interconnect between two device ports, recording both endpoints so you can trace a path end to end. The list/detail responses are enriched server-side with each end’s device and port name.
Fields
| Field | Type | Notes |
|---|---|---|
label | string | Optional label. |
type | enum · required | cat5e · cat6 · cat6a · cat7 · cat8 · fiber-mm · fiber-sm · sfp · qsfp · dac · aoc · power · usb · serial · other. |
status | enum | connected · planned · decommissioning (default connected). |
color | string | Jacket colour. |
length | decimal | Numeric length. |
lengthUnit | enum | m · cm · ft · in. |
aPortId | uuid → Interface · required | A-end port (cascade-deletes). |
bPortId | uuid → Interface · required | B-end port (cascade-deletes). |
description | string | Free-form notes. |
API — GET/POST /api/cables, GET/PATCH/DELETE /api/cables/{id}, plus POST /api/cables/bulk ({ items[] }, max 5000).

Power Panels
Section titled “Power Panels”The physical distribution point that delivers power to downstream feeds (and through them, to racks and devices) — the upstream side of the power chain. A panel is always attached to a site, and optionally a location and rack.
Fields
| Field | Type | Notes |
|---|---|---|
name | string · required | Display name. |
siteId | uuid → Site · required | Owning site (delete-restricted). |
locationId | uuid → Location | Optional location. |
rackId | uuid → Rack | Optional rack. |
voltage | integer · required | Volts (1–10000). |
phase | enum | single · three (default single). |
amperage | integer · required | Amps (1–10000). |
status | enum | active · planned · offline (default active). |
description | string | Free-form notes. |
API — GET/POST /api/power-panels, GET/PATCH/DELETE /api/power-panels/{id}. List accepts ?siteId= and ?rackId= (UUID or none).
Power Feeds
Section titled “Power Feeds”One circuit running off a panel — typically to a rack, so the devices in that
rack draw power from a known feed. type captures primary-vs-redundant for A/B
feed pairs. A device’s Power tab surfaces the feeds available to its rack.
Fields
| Field | Type | Notes |
|---|---|---|
name | string · required | Display name. |
powerPanelId | uuid → Power Panel · required | Upstream panel (cascade-deletes). |
rackId | uuid → Rack | Optional rack served. |
type | enum | primary · redundant (default primary). |
supply | enum | AC · DC (default AC). |
phase | enum | single · three (default single). |
voltage | integer · required | Volts (1–10000). |
amperage | integer · required | Amps (1–10000). |
maxUtilization | integer | Target ceiling in % (1–100, default 80). |
status | enum | active · planned · offline (default active). |
comments | string | Free-form notes. |
API — GET/POST /api/power-feeds, GET/PATCH/DELETE /api/power-feeds/{id}, plus POST /api/power-feeds/bulk ({ items[] }, max 5000). List accepts ?powerPanelId= and ?rackId= (UUID or none).
public/screenshots/infrastructure-power-feeds.pngGood to know
Section titled “Good to know”- Rack positioning is overlap-checked. A device’s unit range can’t collide
with another device in the same rack; a
positionmust be paired with arackId. - Ports auto-materialise on create. A new device generates its ports from the device type’s fixed modules, the built-in template map, or name inference — whichever resolves first — so a new switch arrives with its interfaces populated.
- Catalogue rows are two-tier.
source: 'vendor'rows are read-only; clone one to get an editable customer-owned copy. - Bulk endpoints exist for racks, devices, ports, cables, and power feeds when importing at scale — they trade per-row validation for throughput.
Every module above is exposed under the matching path in the
API reference. List endpoints are paginated and accept page,
pageSize, search, sort, and order, returning
{ data, total, page, pageSize, hasMore }.