Skip to content

feat: server-side update queue (fixes Update all + lost progress), update logs, auto-revert, download sizes - #117

Merged
StrandedTurtle merged 2 commits into
mainfrom
ccr-44bed3b3-tyenjv
Oct 25, 2026
Merged

StrandedTurtle merged 2 commits into
mainfrom
ccr-44bed3b3-tyenjv

Conversation

@StrandedTurtle

Copy link
Copy Markdown
Owner

Summary

Fixes

  • "Update all" stopped part-way, and progress vanished after navigating away. Updates were driven by the dashboard page:

    • The batch was a loop in the browser, so leaving the page or locking the phone killed it.
    • Containers whose card wasn't on screen (e.g. hidden by search) were silently skipped.

    Now every update, revert and tag switch is a server-side job (server/src/jobs.js):

    • Jobs run one at a time within a stack, with at most 3 running at once.
    • "Update all" is one request (POST /api/update-all); containers it can't queue are reported as skipped, never silently dropped.
    • GET /api/jobs plus one app-wide event stream let any page or device show progress. The header shows "Updating · 2/5 done", and cards re-attach to their live log, which is kept for 15 minutes.
    • In "Updates only", a finished card stays visible with its result instead of disappearing.
  • Release build stall: tag and main builds now use separate build-cache scopes (the shared scope stalled :latest on v1.8.0), and the publish job times out at 25 minutes instead of 6 hours.

Features

  • Update logs saved in History ("Show update log" on each entry).
  • Container logs on every card (the container's own output, e.g. why it crash-loops).
  • Auto-revert if unhealthy: per-container opt-in. A broken update is reverted in the same job, with history and a notification.
  • "Update all" summary notification: one message when the batch finishes (toggle in Settings).
  • Download size next to each update: only the layers you don't already have, read from the registry. Platform selection now prefers the server's own CPU (arm64 on a Pi, previously always amd64).
  • Faster dashboard:
    • container listing runs 8 at a time with shared image lookups (was one-by-one)
    • client reloads are coalesced, so a burst of finishing updates triggers one reload, not one per container

Testing

  • 198 server tests pass, with new tests for the queue, log tail, history logs, download size, platform pick, log decoding, mapLimit and batch messages. The client builds.
  • Live on Docker 29 with a local registry:
    • "Update all" over 4 containers with no browser connected: the 2 services in one stack ran one after another, the others in parallel; a missing container was reported as skipped; the summary webhook arrived.
    • Auto-revert: a crash-looping version was automatically reverted to the previous one, with history and a notification.
    • Exact download sizes (~3.0 MB new layer, not the whole image) and the container-logs API.
  • Real browser (Playwright): tapped Update all, went straight to Settings (header showed progress), came back mid-batch (cards re-attached to their live logs), everything finished and the summary banner showed. No console errors.

Generated by Claude Code

…ert, batch summary, faster listing, download size, release cache fix

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KiL5R3bRpvGk6QP3E21eHF
…s, auto-revert, batch summary

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KiL5R3bRpvGk6QP3E21eHF
@StrandedTurtle
StrandedTurtle merged commit 89c291d into main Oct 25, 2026
2 checks passed
@StrandedTurtle
StrandedTurtle deleted the ccr-44bed3b3-tyenjv branch October 25, 2026 09:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants