Skip to content

v0.3.0: safer snapshots, Open WebUI header, REMOVE modal - #7

Merged
scott-tp merged 7 commits into
masterfrom
feat/remove-device-modal-open-webui-header
Oct 22, 2026
Merged

scott-tp merged 7 commits into
masterfrom
feat/remove-device-modal-open-webui-header

Conversation

@scott-tp

@scott-tp scott-tp commented Oct 8, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

  • v0.3.0 card UX: Open WebUI in the header, screenshot click launches the device URL, navy Cloud buttons, red only on the REMOVE confirm modal, dark-only tokens (no leftover light theme), no middot status punctuation.
  • Health line is Connected / Could not reach this TinyPilot with last-checked; Expanded stays hidden until the device is reachable. Overview is Device URL + Software version (Update sits on that row).
  • Update opens a confirm modal before calling the firmware update API (the device must allowlist that route for it to succeed).
  • Fail-fast snapshots: 3s connect timeout, stop remaining device API calls after the first ConnectionError/Timeout, and return customer-safe errors (no connection-pool or URL text in JSON).
  • Browser fetches use a 30s abort + try/catch, cards refresh with Promise.allSettled, and update polling uses setTimeout with an error cap.
  • CircleCI config runs pytest + ShellCheck on deploy/cloud-init.sh. Follow this GitHub repo in the TinyPilot CircleCI org so checks actually run.

Cloud re-pin / overlay is not in this PR.

Test plan

  • Add a device; header Open WebUI and screenshot click both open base_url.
  • Remove device: type REMOVE; Cancel / Esc / backdrop do not delete.
  • Live device: Connected + last checked; Expanded shows Device URL and Software version.
  • Unplug DUT: health becomes Could not reach this TinyPilot in a few seconds; Expanded stays hidden; no raw HTTPSConnectionPool text.
  • Cached screenshot still shows the last JPEG with yellow Cached preview from … copy.
  • If an Update button is visible: it opens a confirm modal; Cancel does not start an update.
  • docker run --rm -v "$PWD":/app -w /app tinypilot-dashboard-dashboard python -m pytest tests -q (52 passed locally).

…REMOVE modal.

Native confirm/prompt dialogs are unreliable in embedded browsers; the in-page
modal types REMOVE, uses a quiet danger confirm, and keeps the card Remove
button as a normal primary.
…ors.

Unreachable devices were hanging on sequential TinyPilot calls and showing
raw connection-pool text. Stop after the first dead probe, hide Expanded
until the device is reachable, and map failures to customer-safe copy.
@scott-tp scott-tp changed the title Open WebUI header + Remove device modal v0.3.0: safer snapshots, Open WebUI header, REMOVE modal Oct 22, 2026
Light-theme tokens were still the CSS default. Fold dark into :root,
ask before starting a device update, and run pytest plus ShellCheck on
CircleCI like the rest of TinyPilot.
LAN Docker still binds 0.0.0.0:8080. Cloud can set DASHBOARD_BIND=127.0.0.1
on re-pin so the sidecar stays loopback-only behind the gateway.
Whitespace, ruff, JS syntax, Semgrep, and pip-audit now run on every
push. cryptography 50.x clears the audit findings that 45.x could not.
Keep the heartbeat verb distinct from screenshot "updated", but match
the rhythm of "Live preview, updated … ago."
@scott-tp
scott-tp merged commit 2261e2d into master Oct 22, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant