github dmellok/tesserae v0.475.0

4 hours ago

Added

  • A widget's select option can show a picture per choice. A choice with
    an image (a path under the plugin's static/ folder, or an https
    URL) turns the option into a picture picker: a row with the chosen
    picture and name that opens a grid of every choice with a filter box.
    Each picture's corner button opens it large (image_large, else the
    picture itself), to step through with the arrows and choose from.
    The hidden native select still holds the value, so saving and
    show_if work as before; older servers ignore the field and show the
    plain dropdown.

Fixed

  • The "Restart required" prompt in the Paper sidebar is now a full-width
    notice row with a reason line ("Loads your widget changes"), its icon in
    line with the rows around it. On the folded sidebar it is a centred
    square with a dot, where before it sat against the left edge.
  • The Month and Week calendar size sliders start at 0.05, so the default
    of 1.0 sits on a step instead of snapping to 1.01 in the editor.

Security

  • The Docker image now refreshes its CA certificates on every build.
    The pinned Playwright base image is never rebuilt, so its trust store
    was frozen at that image's build date. It still trusted emSign ECC
    Root CA - G3 and Comodo AAA Services, the two roots distrusted after
    the October 2026 eMudhra intermediate key compromise
    (https://emudhra.we-have-a-problem.com/). Widgets and other outbound
    HTTPS calls now use Ubuntu's current bundle, which no longer includes
    them.

[0.474.0], 2026-10-23

Changed

  • Every bundled widget's options panel is shorter. At most five options
    show before anything is picked; the rest appear under the choice that
    makes them relevant (the GTFS feed URLs under a custom feed, a second
    stop's realtime feed once there is a second stop, the calendar week's
    start day under the calendar-week window, Home Assistant battery
    charge under a battery entity), and fine-tuning such as text sizes,
    refresh intervals, titles and title lines, number formats and request
    headers sits in the collapsed More options section. Labels are short
    and read the same across widgets (Place, Place name, Title, Title
    line, Within, How many, Window, Style, Refresh), with the detail moved
    into each option's help, and the options are listed in the order the
    panel reads. No option name, choice value or default changed, so
    saved dashboards keep working, and a test now holds every bundled
    manifest to these rules.

[0.473.0], 2026-10-23

Added

  • A widget option can carry "advanced": true to mark it as
    fine-tuning. The grid editor's cell form, the canvas editor's
    Configure drawer and a widget's settings card render those options
    last, in manifest order, inside a collapsed "More options" section.
    It remembers in the browser whether it was left open, and opens by
    itself when a field inside fails validation or a link's # names one.
    show_if still applies inside it, the section hides while none of its
    options would show, and every field is still saved. The plugin schema
    accepts the key, get_widget_options reports it to agents, and
    docs/widgets.md gains guidance on keeping the options panel short.
    Older servers ignore the key and show the option in place.

[0.470.1], 2026-10-20

Fixed

  • The Settings tab bar no longer scrolls up and down by a pixel under a
    mouse wheel or trackpad. Each tab was pulled 1px down into the bar's
    bottom border so its underline could overlap it, and because the bar
    scrolls sideways the browser also made it scroll vertically by that
    overhang. The baseline is now drawn inside the bar, so nothing hangs
    over and the bar only scrolls sideways. The active tab's underline,
    which that overhang was clipping to a thin grey line, shows in full
    again. The Paper design's Settings sidebar is unchanged.

[0.470.0], 2026-10-20

Added

  • Mono or 4-level grey on the same board. The Elecrow CrowPanel 5.79",
    XIAO ePaper 7.5" (S3), XIAO 7.5" ePaper Panel (C3), XIAO EE04 7.5",
    Waveshare ESP32 Driver Board 7.5" and the Xteink X4 on the native firmware
    can now be sent a 4-level grey frame (esp32_gray2_bin) as well as the
    mono one, on the same kind and device id. Their firmware tells the two
    apart by length and says it can paint grey by sending
    "gamuts": ["mono", "gray_4"] when it registers and on every status
    beat. The server stores that on the device and only ever renders grey for
    a device that has sent it, so a unit on older firmware gets mono even when
    grey is picked. Because capable firmware sends the key on every register
    and every status beat, a register or status body without it is read as
    mono only: a panel rolled back or reflashed to older firmware drops back
    to mono straight away instead of being sent grey frames it rejects. The
    grey pick is kept, so grey resumes once capable firmware reports it again.
    Discover, MQTT and relay paths never change the stored value. The frame is
    repainted whenever the depth in use changes. Mono stays the default. The grey path is
    unverified on hardware and needs the firmware build that sends gamuts.
  • Colour depth on the device card. These boards show a Mono / 4-level
    grey control in Rendering. It stays disabled, with a note that a firmware
    update adds grey, until the device has said it can paint grey.
  • Grey upgrade prompt. Once one of these devices says it can paint grey
    while still on mono, its card offers "Switch to grey" or "Keep mono", and
    the devices list marks it "Grey ready". Keep mono is remembered for that
    device and the prompt does not come back.

Changed

  • Catalog entries can declare colour_depths (gamut to renderer) and
    colour_depth_default (the depth a capable device starts on, mono on
    every kind for now). The compatibility table lists both depths for these
    boards.
  • A device declaring a wire format it is already on (for example bin while
    on the grey .bin renderer) is left where it is.

[0.469.0], 2026-10-20

Added

  • 4-grey PNG for TRMNL firmware. New trmnl_png_gray4 renderer writes a
    true 2-bit greyscale PNG (bit depth 2, colour type 0), which TRMNL firmware
    1.6.0 and later decodes and paints as 4 shades on the 7.5" (OG) class of
    panels. It is a device-card pick on trmnl_client. The XIAO 7.5" running
    TRMNL firmware (seeed_xiao_75) switches to it by itself: the firmware
    sends its version in the FW-Version header on every /api/display poll,
    so a unit reporting 1.6.0 or later moves onto the grey renderer and one
    reporting an older build moves back to 1-bit. Following the header was
    picked over a manual-only switch because an older build cannot decode a
    2-bit PNG at all, so an automatic downgrade path keeps a reflashed unit
    painting. A renderer chosen on the device card is never overridden, and a
    version string that does not parse leaves the device as it is. The rule
    lives in the kind's protocol_config.renderer_min_firmware.
  • gray_8 gamut. Eight evenly spaced levels (k * 255 / 7), wired through
    previews, the MCP device list, calibration ramps and test patterns. The
    esp32_gray_bin renderer dithers a gray_8 panel to those 8 levels and
    writes them as the nibbles 0, 2, 4, 6, 9, 11, 13, 15, so a firmware that
    halves each nibble paints levels 0 to 7 from the same 4-bpp frame.

Changed

  • TRMNL X paints 16 greys. The trmnl_x kind is now gray_16 and
    defaults to trmnl_png_gray16, which writes the 4-bit greyscale PNG
    (colour type 0) TRMNL documents for the X; the kind asks for it with
    png_bit_depth: 4 in its protocol_config. KOReader clients on that
    renderer keep the 8-bit PNG they are confirmed on. The 1-bit trmnl_png
    stays selectable. A new TRMNL X is provisioned on this kind from its
    Model: x header; one provisioned earlier stays on trmnl_client until
    its renderer is changed on the card or it is provisioned again.
  • Soldered Inkplate 10 is gray_8. Its firmware halves every nibble to
    the Inkplate library's 8 levels, so dithering against 16 aimed at greys the
    panel merges in pairs. The firmware still reports gray_16 at pairing; the
    server keeps the kind's gray_8 for it on register, discover and relay
    pairing, and existing Inkplate instances move to gray_8 at startup.
  • Gamut follows the renderer pick. A renderer dedicated to a gamut now
    sets the panel's effective gamut, so a TRMNL X switched to the 1-bit
    renderer previews and reports mono, and a TRMNL client on a grey renderer
    reports its greys. Going back to the kind default restores the panel's own
    gamut. The bare trmnl_client kind now reports mono for its 1-bit
    default instead of falling back to the colour preview.

Fixed

  • TRMNL catalog kinds can poll. Instances of trmnl_x and
    seeed_xiao_75 were never matched by /api/display (only the bare
    trmnl_client kind was) and were created without an access token. They
    now get a token and friendly id and authenticate by MAC or token like any
    TRMNL client.

[0.468.0], 2026-10-20

Added

  • Elecrow CrowPanel ESP32 5.79" E-Paper support for the 792 × 272
    black-and-white display, on the native Tesserae device firmware (env
    elecrow-crowpanel-579). Frames go through the esp32_bw_bin renderer as a
    26928-byte 1-bit buffer; the rotary switch moves through the rotation and
    its press re-renders.

[0.467.2], 2026-10-19

Fixed

  • Touch labels pick up a rebuilt glyph atlas. A touch panel keeps its control layout and the label atlases it loaded for as long as the layout digest stays the same, and restores both from its SD card after a reboot. The 0.448.9 polarity fix rebuilt the atlases but left the layout digest alone, so panels that already had a button kept drawing white letters in black boxes (#360). The layout digest now includes the attached atlas digests, so a changed atlas reaches the panel with its next new frame. This also lets a layout first served before its atlases were built gain its labels later.

[0.467.1], 2026-10-19

Fixed

  • Stay-awake panels keep partial refreshes during a render. A board set to stay awake could poll for its patch while the page was still rendering, time out, and then reach the frame poll before it had fetched the patch. The server read that as a sleeping board and sent the whole frame, so a clock tick became a full repaint. For a stay-awake board the server now waits three poll intervals, and at least 30 seconds, before it falls back to the full frame. Sleeping boards are unchanged.

[0.467.0], 2026-10-19

Added

  • ZecTrix NOTE4C Devkit support for the 400 × 300 four-colour display, with
    community firmware by @varanu5 for REST and Cloud relay. It is a hardware
    entry on the PicPak protocol, so it shares battery telemetry and the
    configurable sleep interval; setup is documented in docs/hardware/note4c.md.

Don't miss a new tesserae release

NewReleases is sending notifications on new releases.