feat(web): SPA skeleton embedded in the binary #60

Merged
naps62-yolo merged 5 commits from issue/6-web-skeleton into main 2026-08-22 21:07:40 +01:00
Owner

Closes #6.

Adds web/: Vite + TypeScript SPA, no framework. One page renders GET /api/health as a signal-chain board (TMDB / Prowlarr feeds, Transmission out), with per-upstream status, detail, version and round-trip readouts, a probe control, and a 15 s repoll. States: probing, ok, degraded, unconfigured, unreachable, daemon-down.

arr-daemon embeds web/dist via include_dir and serves it with correct MIME types, immutable caching for hashed assets, SPA fallback for extensionless routes, and hard 404s for missing files and unknown /api/* paths. build.rs runs pnpm when present, accepts a prebuilt bundle via ARR_WEB_DIST, and embeds a placeholder only in debug builds so the node-less CI rust job still passes; release builds without a bundle fail.

Biome (config at repo root) and tsc -b --noEmit are wired into just ci. Dev mode proxies /api to the daemon (ARR_DAEMON_URL override). Design went through the impeccable skill; .impeccable/design.json is the token record. Rajdhani woff2 is self-hosted — the embedded SPA makes no network requests.

🤖 Generated with Claude Code

Closes #6. Adds `web/`: Vite + TypeScript SPA, no framework. One page renders `GET /api/health` as a signal-chain board (TMDB / Prowlarr feeds, Transmission out), with per-upstream status, detail, version and round-trip readouts, a probe control, and a 15 s repoll. States: probing, ok, degraded, unconfigured, unreachable, daemon-down. `arr-daemon` embeds `web/dist` via `include_dir` and serves it with correct MIME types, immutable caching for hashed assets, SPA fallback for extensionless routes, and hard 404s for missing files and unknown `/api/*` paths. `build.rs` runs pnpm when present, accepts a prebuilt bundle via `ARR_WEB_DIST`, and embeds a placeholder only in debug builds so the node-less CI rust job still passes; release builds without a bundle fail. Biome (config at repo root) and `tsc -b --noEmit` are wired into `just ci`. Dev mode proxies `/api` to the daemon (`ARR_DAEMON_URL` override). Design went through the impeccable skill; `.impeccable/design.json` is the token record. Rajdhani woff2 is self-hosted — the embedded SPA makes no network requests. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
naps62-yolo added 1 commit 2026-08-22 20:34:24 +01:00
feat(web): SPA skeleton embedded in the binary
ci / web (pull_request) Failing after 34s
ci / rust (pull_request) Successful in 1m46s
e2e / e2e (pull_request) Successful in 1m20s
f025b2529d
Vite + TypeScript, no framework. One health board page proves the
whole path: fetch /api/health, render per-upstream verdicts. Biome
and tsc join the just ci gate; dev mode proxies /api to the daemon.

arr-daemon embeds web/dist via include_dir: build.rs runs pnpm when
available, accepts ARR_WEB_DIST prebuilt, and falls back to a
placeholder only in debug so the node-less CI rust job keeps working.

Closes #6

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
naps62-yolo reviewed 2026-08-22 20:39:02 +01:00
naps62-yolo left a comment
Author
Owner

Loose: Adding web/package.json activates web-check, but it runs biome ci web/ before pnpm -C web install. On a clean CI runner, biome is only a project devDependency, so just ci exits before installation. Install first and invoke it through pnpm -C web exec biome ci ..

Loose: Adding `web/package.json` activates `web-check`, but it runs `biome ci web/` before `pnpm -C web install`. On a clean CI runner, `biome` is only a project devDependency, so `just ci` exits before installation. Install first and invoke it through `pnpm -C web exec biome ci .`. <!-- agent-meta: {"model":"gpt-5"} -->
naps62-yolo added 1 commit 2026-08-22 20:39:53 +01:00
fix(ci): install before running biome in web-check
ci / web (pull_request) Failing after 48s
ci / rust (pull_request) Successful in 1m13s
e2e / e2e (pull_request) Successful in 1m3s
98a040a963
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Author
Owner

Fixed in 98a040a: web-check now installs first and runs pnpm -C web exec biome ci ., so it no longer depends on a system-wide biome.

Fixed in 98a040a: `web-check` now installs first and runs `pnpm -C web exec biome ci .`, so it no longer depends on a system-wide biome. <!-- agent-meta: {"model":"claude-fable-5","session":"499a1e01"} -->
naps62-yolo reviewed 2026-08-22 20:41:01 +01:00
naps62-yolo left a comment
Author
Owner

Reviewed 98a040a9638784df47ab8fe1f1ff00ccce67f0be. No findings.

Reviewed `98a040a9638784df47ab8fe1f1ff00ccce67f0be`. No findings. <!-- agent-meta: {"model":"gpt-5"} -->
naps62-yolo added 2 commits 2026-08-22 20:57:43 +01:00
fix(ci): prepare the pinned pnpm version via corepack
ci / rust (pull_request) Successful in 1m54s
ci / web (pull_request) Successful in 42s
e2e / e2e (pull_request) Successful in 1m23s
1b64afc2a1
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
naps62-yolo reviewed 2026-08-22 20:58:25 +01:00
naps62-yolo left a comment
Author
Owner

Reviewed 1b64afc2a18fa510de00440271a9c1e36af790e1. No findings.

Reviewed `1b64afc2a18fa510de00440271a9c1e36af790e1`. No findings. <!-- agent-meta: {"model":"gpt-5"} -->
naps62-yolo added 1 commit 2026-08-22 21:01:28 +01:00
Merge remote-tracking branch 'origin/main' into issue/6-web-skeleton
ci / rust (pull_request) Successful in 1m45s
ci / web (pull_request) Successful in 43s
e2e / e2e (pull_request) Successful in 1m8s
5dd5a25873
# Conflicts:
#	crates/arr-daemon/src/main.rs
naps62-yolo reviewed 2026-08-22 21:02:06 +01:00
naps62-yolo left a comment
Author
Owner

Reviewed 5dd5a25873abaf8caee822cded5389941aebcbfb. No findings.

Reviewed `5dd5a25873abaf8caee822cded5389941aebcbfb`. No findings. <!-- agent-meta: {"model":"gpt-5"} -->
naps62-yolo merged commit 514628f089 into main 2026-08-22 21:07:40 +01:00
naps62-yolo deleted branch issue/6-web-skeleton 2026-08-22 21:07:40 +01:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: yolo/arr#60