The Force
Embedded operational apps — HoloChron, COP, Probe, HoloNet, Rift Gates — surfaced as iframes inside the dashboard.
"The Force" is the collection of operational apps that run as their own services in-cluster and are surfaced inside the dashboard as iframes. The dashboard does not own them — it owns the integration: where they live, whether they're configured, whether they're reachable, and the embedded chrome around them.
Each embed has the same shape: an env-driven URL, a "configured?" check exposed via
src/lib/forceEmbeds.ts, a sidebar readiness tile in the "The Force" group, and a
full-bleed iframe page under /the-force/<name>.
The embeds
| Embed | What it is | Backing service |
|---|---|---|
| HoloChron | UXV/map widget (fleet and map settings) — pure operator HUD | a separate in-cluster web app |
| COP | Common Operating Picture — SitaWare-flavoured tactical view (Phase 1 scaffold; diagnostics live) | SitaWare integration target |
| Probe | Observability — Grafana/Prometheus-ish board | in-cluster observability stack |
| HoloNet | MQTT Explorer — browse topics live | runs against TBMQ |
| Rift Gates | Network overlay debug — NetBird/Tailscale-flavoured view | network-overlay sidecar |
| Medusa (Hydroid) | Planned. Contact-fusion engine — correlates & fuses calibrated UXV readings into the COP | Loom fusion + TBMQ (not built yet) |
Medusa (Hydroid) — planned
Medusa (full name Medusa Hydroid) is the contact-fusion engine, and the next Force
page to be built — it does not exist in the dashboard yet. Its job: ingest the UXV
measurements gathered and calibrated during TaskForce-X sessions (via the Imp Intel
plane), run correlation and fusion — weighting each reading by the variance learned
during calibration, per the fusion math in .settings/docs/4817/research/ (Korb,
2026-05-20) — and publish unified contacts to the COP over the MQTT/TBMQ backbone.
In mesh terms (see .settings/docs/4817/STANAG-4817-FEDERATED-FUSION.md) Medusa is the
per-site fusion shard: it turns many UXVs' STANAG 4817 tracks/contacts, seen under
different IDs and affiliation labels, into a single lineage-tagged track on the COP. It
fits the standard embed shape below once built, but unlike the others it is a first-party
R2-D2 service rather than an externally owned app.
Why it depends on Imp Intel. Fusion is only as good as the inputs. Each UXV carries a bias and a variance that change with range; Imp Intel's passive calibration measures those against known references so Medusa can correct bias and weight by variance. No calibration, no trustworthy fusion.
Configuration
Each embed has a URL env var read at build time:
| Embed | Env var | Notes |
|---|---|---|
| HoloChron | HOLOCHRON_URL | Settings → Holocron also persists overrides into holocron-config.yaml |
| COP | COP_URL | Settings → COP exposes latency, Track Layers, API health checks |
| Probe | PROBE_URL | Embed URL; the embed itself owns its own auth |
| HoloNet | HOLONET_URL | Points at the MQTT Explorer behind a cluster-internal proxy |
| Rift Gates | RIFT_GATES_URL | Network overlay UI |
If a URL isn't configured, the corresponding sidebar item shows a Vader icon — the page is still navigable (you'll see a configuration placeholder) but the embed itself won't render.
Why iframes (not portlets)
Two reasons:
- The apps have their own teams. They ship their own UIs on their own cadence. Trying to portlet them in would require maintaining a stable component contract across multiple repos; iframes give us a URL contract instead and stay out of their way.
- Auth scope. Each embed has its own auth path (some federate with TrailBase, some don't). An iframe keeps the auth boundary clean — the embed sees its own cookie, the dashboard sees its own.
The cost is what iframes always cost: no in-page navigation interop, no deep links into the embed's internal state without help from the embed, and a slightly weird back-button story. We accept it.
Sidebar "The Force" tile
The sidebar shows an aggregate readiness tile: "Configured: 3/5" with a green/yellow/red dot. It's a quick "did someone forget to wire HOLONET_URL" check, nothing more. The readiness is configuration-only — it does not probe the embeds themselves (reachability is the embed's problem to surface inside its iframe).
Adding a new embed
- Add the URL env var to
src/lib/forceEmbeds.tsand export a*Configuredboolean. - Create
src/app/the-force/<name>/page.tsxmirroringholonet/page.tsx— same full-bleed iframe pattern. - Add the sidebar nav entry with an appropriate icon. Hook the
downItemsset inSidebar.tsxso the Vader icon appears when the URL is missing. - Document the embed in this page.
Don't over-build the integration. If the embed needs more dashboard-side context than "here's a URL", that's a sign it belongs on its own plane, not on the Force.
Built on
| Layer | Tech | Page |
|---|---|---|
| Sense stack graph (planned) | reagraph (WebGL) | reagraph |
| Sense store (cluster snapshot) | zustand Sense store | Zustand |
| Embed surfaces | <iframe> per embed, URL contract via src/lib/forceEmbeds.ts | (no library) |
| HoloNet upstream | TBMQ MQTT broker | TBMQ |
| Probe upstream | Cluster observability stack | (external — not part of R2-D2) |
| Configuration source | env vars + holocron-config.yaml overrides | (config) |