Files
Catubba 6478adc845 docs: correct what a pre-release audit found across the shipped markdown
Checked every tracked .md against the code rather than for plausibility. The
API table, the metric names, the dashboard payload, the permissions
cheat-sheet, every config field and SECURITY's numbers all already matched.
Four things did not.

ARCHITECTURE contradicted itself on the power lease: keying it on the host
updated the description a few lines up but left a later paragraph still saying
the lease is per device, complete with the extra sleep/wake cycle that no
longer happens. Replaced with the consequence that is now true -- every device
on a held machine reads busy, which is what disables the power button on its
siblings.

The startup catch-up was documented nowhere despite sending notifications.
ARCHITECTURE's scheduler section now covers it and the heartbeat that decides
what counts as downtime.

frontend/README pointed at design/joulenap-remix/, which .gitignore excludes --
a path no clone has. It also filed the setup wizard under the settings panels,
where it has not lived since it moved to src/wizard/, and said npm install
where the lockfile wants npm ci.

Two wordings tightened: the WoL interface is a dropdown now, not free text with
an override; and "stores a copy needed to verify requests" read as though the
API key were hashed, when it sits in config.yaml like every other secret.
2026-08-07 15:35:28 +02:00

1.4 KiB

Joulenap frontend

React + TypeScript + Vite SPA for Joulenap, wired to the backend REST API.

Develop

cd frontend
npm ci
npm run dev        # Vite dev server on :5173, proxies /api -> http://localhost:8080

Run the backend (cd backend && joulenap or uvicorn app.main:create_app --factory) alongside it so the proxied API is available.

Build

npm run build      # type-checks (tsc --noEmit) then emits frontend/dist

The FastAPI backend serves frontend/dist as static files, so a production image just needs the built output present. dist/ is git-ignored.

Layout

  • src/api/ — typed client + response types for /api/*
  • src/auth/, src/config/ — auth + config React contexts
  • src/pages/Login, Dashboard (+ dashboard/ panels), Settings (+ settings/ panels, incl. the device editor)
  • src/wizard/ — the two device wizards (add a PVE, add a PBS) and the PBS steps they share
  • src/shell/ — header + authenticated app shell
  • src/components/, src/hooks/, src/utils/ — shared widgets/helpers
  • src/i18n/react-i18next setup; en.json is the base language, it.json the translation

i18n

English is the source language. The active language follows app.language from the backend config (the Localization settings panel changes it). Add a key to en.json first, then mirror it in it.json.