Skip to content
ULAP ONE
Research preview
Reference · what this is

One GPU. A whole network.

AI-RAN WG3 · WI#6

A rack is the wrong answer at the edge. ULAP ONE puts a private 5G core, a radio access network, a spectrum sensor and edge-AI video on one accelerated node, so connectivity and compute arrive together instead of as two procurements.

Hand-written reference Not live Register · reading Network calls 1 · /api/control/capabilities
Scope the claim exactly
The co-tenancy result is LDPC decode only, on a cleared GPU, measured by a bench harness rather than by this compose stack's data plane. The node is a dev-class ARM edge box and is not an NVIDIA-qualified RAN platform. Anywhere this console shows a byte-rate over a sim or loopback fabric, it is a user-plane byte-rate and not a radio number, and it is labelled as such.

01 · 5G core + RAN

Open5GS core and an srsRAN Project gNB on one node. ZMQ virtual RF by default; conducted SDR and O-RU 7.2x fronthaul are the other two fabrics. UERANSIM supplies bulk L3 UEs.

02 · GPU co-tenancy

The AI tenant and the radio share one accelerator. The mode controller is the gate: below the degrade threshold the AI workloads yield bandwidth and GPU back to the RAN, with dwell timers so the decision cannot flap.

03 · TVWS spectrum sensing

A ResNet18 classifier over I/Q, six signal classes, advisory only. PAWS grant state is the authority for transmit, not the model.

04 · Super-resolution video

SPAN on the display path, RealESRGAN targeted at archive recordings. The uplink degrades, the picture does not have to.

Capability register

narrative copy — may lag not read from the register
Narrative copy — may lag the register Not read yet.
NOW 5G core + RAN, one command declared make up-all probes the hardware and picks the fabric
NOW Pluggable RAN backends declared RAN_BACKEND x RAN_FABRIC, compose overlays per pair
NOW GPU co-tenancy with a compliance gate declared hysteresis, dwell timers, audit log
NOW TVWS sensing declared real CNN, advisory only, over-the-air result published
NOW Super-resolution video declared SPAN display path measured on GB10 CUDA
NOW Observability and bench declared Prometheus, Grafana at the /grafana/ route, paper-keyed bench suite
PHASE-1 Sionna RT digital twin declared ray-traced coverage planning against the same scene
PHASE-1 GPU-native radio PHY declared Aerial; the co-tenancy claim is scoped to LDPC decode today
PHASE-1 SMO / rApp and A1 policy declared unified SMO surface
PHASE-1 SIM provisioning declared sim-prog; Ki and OPc never leave the host
EXTENSION Pluggable dUPF breakout declared observer mode only: it does not inject rules into the PFCP path
EXTENSION Multi-site fleet control declared not built

One register, not two. The list above is read from /api/control/capabilities, which parses docs/CAPABILITIES.md. Until 2026-08-04 this page kept its own hand-maintained copy of the same twelve rows, so one of the two could drift and nothing would catch it. The hand-written list survives only as a fallback and says so whenever it is on screen.

NOW means the register cites evidence for a capability, not that this console measured it today.

Every evidence string above is stamped DECLARED, including the ones that carry a number. Until 2026-08-04 the SR row read 30+ fps live, printed bare in the same grey this console uses for a measured sub-label; the measured GB10 figure is 4.6 fps, about 6.5x lower, and the "30+" figure was SPAN inference throughput rather than the delivered stream. A design target and a measurement are now two separate clauses in the register, and neither can borrow this page's authority: nothing here is a reading. The delivered rate is measured on Video.

One command stands the network up

zero-touch
make up-all      # probes hardware, picks sim or conducted SDR, handles the RF gate
make status      # is the whole network up
make health      # per-service health
make doctor      # host tools, GPU, RF licence

Reach for these first. Hand-picking a RAN mode walks straight into the RF affirmation gate, which the guided command handles for you. rf_licence.yaml is the sole radiation authority and no document overrides it.

Why the live console is operator-only

The control plane changes state: it provisions subscribers, issues eSIM profiles, starts and stops the stack, and can put a shell on the host. That surface is reachable on the tailnet and is view-only on a public domain. It is deliberately not the front door, which is why the landing page is a status board and not a set of buttons.

How to read a state anywhere on this console

never colour alone

Every state on this console is drawn as three things at once: a glyph, a word and a colour. The glyph survives greyscale, colour-blindness and print; the word survives a screen reader; the colour is the fastest of the three and the least reliable. No state anywhere is carried by colour on its own.

The five tones
Pass

A contract-backed pass. Something answered and the answer was what the contract requires.

Fail

A failed gate, or a deployed component that is not answering. A real red.

Warning

Attention. Real but old, a limit on a claim, or a boundary you must not read past. This is the only job the accent colour does.

Information

Neutral scope or provenance. Never a verdict in either direction.

Missing

Absent. Not measured, or not deployed. Neither a pass nor a failure, and never counted as either.

The five words a live route uses for a data source
Live

Every number on this page was read by your browser inside its own poll window.

Stale

At least one source has not answered inside its poll window. Numbers fed by it are real but old, and the age is stated per source.

Not answering

At least one source that IS deployed stopped answering. Anything it feeds is last-known, not current.

Not deployed

Every source here is opt-in and was never brought up. That is absence, not failure.

Waiting

No source has answered yet. Nothing on this page is asserted either way.

The last one is the one that matters. Absence of a measurement reads as absence everywhere on this console, never as a pass and never as a failure. A component nobody deployed is not broken, and a number nobody measured is not zero. These two rows are not typed out here twice: the second is generated from the same table liveness.svelte.ts gives every live route, so this legend cannot describe a vocabulary the console has stopped using.

Reference boundary

What this page is, and what it can and cannot tell you

Hand-written reference Not live Register · reading

Identity

Page kind
Reference. Hand-written prose, not a reading and not a snapshot of a run.
Network calls
Exactly one: GET /api/control/capabilities
Read
not read
Register source
not reported
Capability rows on screen
12 (narrative copy)

Measurements

Capability register
Narrative copy — may lag
Not read yet.
Everything else on this page
Hand-written
It cannot go stale the way a live page goes stale, because nothing refreshes it. It can also never be fresh, because nothing refreshes it. Its age is the age of the commit that wrote it.

Thresholds, and where they come from

The register has one source docs/CAPABILITIES.md
Source: Parsed by /api/control/capabilities. The list on this page is a fallback, never a second source, and it is labelled whenever it is on screen.

What this proves

  • The four planes, the bring-up commands and the claim scoping below are what this project asserts about itself, in writing.
  • Nothing here was read from the running system. Every row on screen is the narrative copy.

What this does NOT prove

  • Nothing on this page is a measurement. It is a description of a system, not a reading from one.
  • It does NOT tell you whether anything is running right now. Home probes the surfaces and Explorer probes every gateway route; this page probes nothing except the register.
  • A capability tagged NOW means the register cites evidence for it, not that this console verified it today.
  • Because this page is hand-written, it cannot go stale in the way a live page goes stale — and it can never be fresh either. Treat its age as the age of the commit that wrote it.

Environment

Where the live surface health is
The landing page — a live probe of every surface, split into this console and the stack.
Where the live register is
Explorer — the same register, plus the running services it maps to.
Where the sensing result is
Sensing — the over-the-air result, stated before any confident-looking tile.
Where the measurements are
Evidence — 45 benchmark artefacts behind a persistent snapshot boundary.

Provenance

Capability register
GET /api/control/capabilities — read once on page load, not polled
Fallback list
ui/src/routes/ulap-overview/+page.svelte — the narrative copy
Claim scoping
docs/THESIS.md §2b
Caveat, verbatim

The co-tenancy result is LDPC decode only, on a cleared GPU, measured by a bench harness rather than by this compose stack's data plane. The node is a dev-class ARM edge box and is not an NVIDIA-qualified RAN platform. Anywhere this console shows a byte-rate over a sim or loopback fabric, it is a user-plane byte-rate and not a radio number, and it is labelled as such.

Raw source

  • docs/CAPABILITIES.md the one register; the control-api parses it
  • docs/THESIS.md the claim scoping, §2b
Amini Amini Infratech for the Global South

Every link and every data fetch on this console is origin-relative. One origin fans out by path: / gateway, /video/, /grafana/, /prom/, /api/. An absolute http://localhost:NNNN URL works on exactly one machine, the one it was written on, and is blocked as mixed content the moment the page is served over https, which is how every operator actually reaches this stack.