This is the same checklist as SECURITY_CHECKLIST.md, but revised with the actual deployment context in mind: a single Surface Pro running as an always‑on, local‑only household display on a stable home Wi‑Fi network. None of these are “panic” issues; the notes below help decide what is worth fixing.
-
Bind servers to localhost only
Why it matters: If the dev/prod server listens on all interfaces, anyone on the same Wi‑Fi/LAN can load the app and hit/api/events.
Impact: Low‑medium given a stable, private home network, but higher if the device ever moves or guests are added to Wi‑Fi.
Fix: Bind to127.0.0.1or rely on a firewall rule. -
Protect
/api/eventsif network-exposed
Why it matters: The endpoint returns calendar data without authentication. On a shared network, others could read it.
Impact: Low if bound to localhost; medium if the server is reachable on the LAN.
Fix: Bind to localhost, or add a simple token header check.
-
External Google Fonts request
Why it matters: Loading fonts from Google sends an outbound request (IP + timing).
Impact: Low in this household‑display context; mostly a privacy preference.
Fix: Self‑host the font or remove the import. -
Weather API disclosure
Why it matters: Open‑Meteo sees the device’s IP and the Rochester coordinates.
Impact: Low; the location is already fixed and non‑sensitive for this setup.
Fix: Proxy through the local server or accept as‑is.
-
LocalStorage contains event dataUser note: It is situationally extremely unlikely to happen and the data they would get would be worthless anyway. This can be ignored.
Why it matters: Calendar entries are stored on disk and persist across sessions. If anyone else uses the machine, they can see it.
Impact: Low‑medium since the device is meant to be single‑purpose and rarely touched.
Fix: Use memory‑only cache, shorten TTL, or encrypt at rest. -
LocalStorage contains weather dataDoesn't matter, weather data is worthless after the fact. This can be ignored.
Why it matters: Weather info is stored on disk, but it’s not sensitive.
Impact: Very low.
Fix: Optional; can switch to in‑memory if desired.
-
dangerouslySetInnerHTMLin chart component
Why it matters: If any chart config becomes user‑controlled, HTML/CSS injection is possible. Right now it’s internal.
Impact: Low today; only matters if future features allow external data to drive chart config.
Fix: Keep config internal or sanitize/validate values. -
ICS feed content is trusted
Why it matters: Titles/locations/descriptions come from the ICS feed. React escapes HTML, but long or strange content could clutter the UI.
Impact: Low‑medium; mainly a display/clarity issue, not code execution.
Fix: Add length limits and strip control characters.
-
No timeouts/size limits on ICS fetch
Why it matters: A slow/huge feed can hang the server or delay updates.
Impact: Medium if the feed is unreliable; low if stable.
Fix: Add timeout, size cap, and retry/backoff. -
No timeouts on weather fetch
Why it matters: A hung request can stall weather refresh.
Impact: Low; mostly a reliability issue.
Fix: UseAbortControllerwith a timeout.
- Dev server exposed on LAN
Why it matters: In development, Vite listens on all interfaces (host: "::"), which exposes the app on the LAN.
Impact: Low‑medium and only while developing on the Gateway machine.
Fix: Usehost: "127.0.0.1"or firewall.
Tell me which items you want fixed and I’ll implement them.