• v2.3.4 f16766dd56

    Ghost released this 2026-07-28 15:20:29 +03:00 | 13 commits to main since this release

    The app manages a service whose only control was the app itself. The
    tile starts and stops it from the shade, shows which state is current,
    and refuses the tap while a lifecycle transition, module update or
    full rollback owns the module — those serialize against the same lock,
    so accepting the tap would queue work the shade cannot show.

    Two things the tile cannot borrow. It has no lifecycle owner: the
    platform destroys the service when the shade closes, while the
    transition it started holds a root shell for as long as the module
    needs, so the work is scoped to the process instead and the tile is
    redrawn from whatever binding is listening when it ends. And a
    long-press has nowhere to go unless the app declares the tile's
    settings, which is why one landed on the system App info page instead
    of the app.

    Deciding what a tap does needed care the first version did not have:
    the tap marks itself in flight before it can read the status it acts
    on, so asking the ordinary projection at that point answered BUSY
    because of that very tap and the tile did nothing at all.

    Separately, the boot stage no longer looks for a pre-2.3.0 in-tree
    hosts overlay. customize.sh carries that content over while the old
    tree still exists, which is the only moment it does — every supported
    root manager replaces the tree wholesale on the activating boot. The
    search was a branch that never ran in the field, and its absence is
    now an invariant the test enforces: boot does not touch the module
    tree at all.

    Co-Authored-By: Claude Opus 5 noreply@anthropic.com

    Downloads