Files
harmony/fleet/harmony-fleet-operator/README.md
Jean-Gabriel Gill-Couture 5c769437dc feat(fleet-operator): server-side Leptos dashboard behind web-frontend feature
Adds a minimal SSR-only Leptos dashboard to the operator, gated by a new
`web-frontend` cargo feature. The whole frontend (HTML + Tailwind CSS) is
bundled into the binary via `include_str!`, no cargo-leptos / WASM / hydration
involved — air-gap clean, single container.

build.rs invokes the standalone tailwindcss v4 CLI when the feature is on.
Default builds are untouched.

Static skeleton only — no interactivity yet. Kept as a comparison baseline
for the Maud + HTMX variant on the next branch.
2026-05-11 22:26:43 -04:00

2.3 KiB

harmony-fleet-operator

IoT operator — reconciles Deployment CRDs into NATS KV desired-state and aggregates device/deployment state back into CR status.

Web frontend (optional)

A small server-side Leptos dashboard is built into the operator behind the web-frontend cargo feature. When the feature is enabled the operator's run loop also serves an HTML dashboard on 0.0.0.0:18080.

Why it's bundled

The operator already ships as a single container. Splitting the dashboard into a separate crate, container, and deployment would buy nothing and cost an extra moving part to operate. Keeping it in-process means:

  • One binary, one container. The compiled Tailwind CSS is embedded via include_str!; there is no pkg/ dir, no static-asset volume, no CDN. Air-gapped clusters get the dashboard for free.
  • No JavaScript build toolchain. Pure SSR via view! { … }.to_html() — no cargo-leptos, no wasm-bindgen, no hydration scripts. cargo build is the whole build.
  • Direct access to operator state. The dashboard is in the same process as the reconcilers; it can read fleet aggregator state without a network hop or an extra API surface.

The trade-off: no client-side reactivity yet. Good enough for a dashboard of aggregated numbers; we'll revisit if/when we need interactive views.

Running it locally

The standalone Tailwind v4 CLI must be on PATH at build time (the build.rs invokes it to produce the CSS that's bundled into the binary). Single static binary, no Node required:

# Linux x86_64 — pick the matching asset for other platforms from
# https://github.com/tailwindlabs/tailwindcss/releases
curl -L -o ~/.local/bin/tailwindcss \
  https://github.com/tailwindlabs/tailwindcss/releases/latest/download/tailwindcss-linux-x64
chmod +x ~/.local/bin/tailwindcss

Then run the operator with the feature on. The operator also needs a reachable NATS — the e2e demo brings one up; nats-server -js works for a quick poke too:

cargo run -p harmony-fleet-operator --features web-frontend

Open http://localhost:18080.

The frontend lives in src/frontend/ (app.rs for the Leptos components, server.rs for the axum wiring). Everything in that directory is #[cfg(feature = "web-frontend")]-gated; default builds are unaffected.