Homelab / Technical documentation
Tools built around the lab.
Source-backed responsibilities, persistence and checks, with the old Command Center failure separated from the newer implementation.
Jump to a section
Command Center: React to Express to JSON
- React / TypeScriptCatalog, status, infrastructure and explicit discovery UI
- Express / TypeScriptAuthentication, catalog API, HTTP probes, discovery
- JSON storeRevision-checked catalog.json and rotating backups
The newer implementation starts with an empty catalog. Discovery requires an explicit scope and a review/import step; it is not a background LAN scan. Service checks run on the application server, not in the browser. HTTP 401/403 indicate a reachable endpoint requiring authentication; a 5xx response is an HTTP error from a reachable endpoint, not healthy application behavior.
Proxmox support exists in source and reads a bounded resource projection over HTTPS. The deployment record says that integration was unconfigured. Dashboard-runtime OS/process metrics are not Proxmox guest metrics.
Catalog writes and process boundaries
JsonStore.init creates the data directory and a missing first-run catalog, rejects corrupt or ambiguously missing recoverable state, and takes an exclusive writer lock. Writes are serialized, checked against a revision, flushed and atomically renamed. Two rotating recovery generations are maintained.
This is one process/writer per data directory. Those local catalog generations are recovery aids, not an offline backup. Sessions and discovery jobs are in memory and do not survive restart; imported catalog entries do.
await fs.mkdir(this.dir, { recursive: true, mode: 0o700 });
this.lock = await fs.open(
path.join(this.dir, "catalog.lock"), "wx", 0o600
);Evidence: L02.
October failure, November deployment
The old Dockerfile copied /app/data from the build stage. The October build completed frontend compilation and then failed at that packaging step because the directory was missing. The older local source still contains that copy instruction.
COPY --from=build /app/data ./dataThe newer Dockerfile creates a writable runtime data directory instead, and the store initializes an empty catalog. A separate 7 November deployment record reports a healthy container, authentication/CRUD tests and persistence across a restart of that application. It also records preservation of existing containers and an empty final catalog.
This resolves the older handoff’s deployment gap through a Recovered deployment record, not a fresh server test in this review. It does not prove the October image was repaired in place.
Grade watcher: inspect the architecture, exclude the records
Local source implements a Flask dashboard, a separate Python scheduler, SQLite user storage and a browser-based retrieval/PDF comparison worker. User-specific state and downloads are separated. The scheduler chooses a delay between 300 and 600 seconds for configured users; notification code uses ntfy when configured.
The inspected code includes hashed dashboard passwords, encrypted stored credentials and access checks. These are implementation facts, not proof of the currently deployed configuration or successful notification delivery. The historical container inventory supports a dashboard/scheduler deployment, without exposing any account or result.
No credentials, academic values, personal PDFs, student identity, notification topics or account screenshots are published. This project is not evidence of my own university enrollment.