Fixed
- Full-bleed cells now honour the gap between neighbouring cells.
v0.71.1'srender.full_bleedhandling skipped padding entirely,
which made the status bar sit flush against the widgets below it
(no visible matting even at large gap settings). Full-bleed now
only drops the outer padding (edges touching the panel wall);
inner padding between the cell and its neighbours still applies,
so the gap slider stays visible around the bar. - Palette / tone editor no longer disappears from the Calibration
tab after a save (issue #52 follow-up). The section is gated on
palette_profile_slugresolving to a real profile; if the slug
got into a state where it pointed at nothing (fresh install with no
applied profile, or a stale slug from a deleted user profile), the
whole palette + tone block vanished from the DOM._palette_profile_slug_for
now self-heals: on any read where the device has a supported
gamut (Spectra 6 or Inky 7-colour) and the stored slug is empty or
unresolvable, it backfills the family's default bundled slug and
persists it. Devices whose gamut has no matching family (mono,
bwry_4, rgb24, rgb16) are still passed through untouched. - Manual re-add after device delete now wipes leftover state
(issue #48 follow-up). The discovery path already wiped orphan
state on a MAC-differs signal, but the manual "Add device" form has
no MAC to compare, so re-adding a device under the same id kept
dashboards / history / per-device settings from the previous
instance.devices_addnow looks up the delete-marker for the
target id and, when one exists, callswipe_orphan_statebefore
creating the new instance so the new device starts pristine.
Changed
- History status label renamed "delivered" → "pushed" (discussion
#62). The chip on the History timeline reflected the server-
sidesentstatus, but "delivered" implied end-to-end receipt.
The push pipeline only guarantees a successful publish (broker
publish, or a REST device with a new digest ready to poll); it
doesn't know whether the panel has applied the frame yet.
Renamed to "pushed" so the chip matches the guarantee. Separate
receipt tracking is a follow-up. - OpenAPI spec version bumped to match the release (discussion
#28).schema/openapi.yamlhadinfo.versionstuck at
0.64.16. Rolled to the current version so generated SDKs carry the
right release marker.
Added
- Per-cell padding override (feedback from r/eink launch DMs).
Each cell now has an optionalpadding_overridefield surfaced
in the page editor as a Layout tweaks disclosure (collapsed by
default so the cell edit card stays lean). Ticking "Override
page-gap padding for this cell" turns on a 0-80 px slider whose
value replaces the page-level gap-derived padding on that cell,
and also beats the widget'srender.full_bleedmanifest flag,
so users can dial in per-widget breathing room without touching
the page gap the other cells share. - Content-checksum push skip (feedback from r/eink launch DMs).
When the newly-rendered composition PNG matches a bound device's
last-served digest, the push pipeline no longer publishes to that
device. The panel isn't asked to re-paint, which is a real battery
win on the bigger e-ink panels and the primary optimisation
callers were doing externally (checksumming their own data and
suppressing the webhook). Skipped renderers surface as
unchanged=Trueon the per-renderer result and log a
no_changeevent. When every bound renderer for a push is
unchanged, the whole push logs asno_changetoo, and the
History timeline shows a distinct "no change" chip. HTTP-polled
devices' next fetch still returns 304 via the existing ETag path;
MQTT-only devices skip the retained re-publish entirely.