Added
- A widget's select option can show a picture per choice. A choice with
animage(a path under the plugin'sstatic/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_ifwork 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": trueto 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_ifstill 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_optionsreports 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 sendsgamuts. - 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,monoon
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
binwhile
on the grey.binrenderer) is left where it is.
[0.469.0], 2026-10-20
Added
- 4-grey PNG for TRMNL firmware. New
trmnl_png_gray4renderer 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 ontrmnl_client. The XIAO 7.5" running
TRMNL firmware (seeed_xiao_75) switches to it by itself: the firmware
sends its version in theFW-Versionheader on every/api/displaypoll,
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'sprotocol_config.renderer_min_firmware. gray_8gamut. Eight evenly spaced levels (k * 255 / 7), wired through
previews, the MCP device list, calibration ramps and test patterns. The
esp32_gray_binrenderer dithers agray_8panel 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_xkind is nowgray_16and
defaults totrmnl_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: 4in itsprotocol_config. KOReader clients on that
renderer keep the 8-bit PNG they are confirmed on. The 1-bittrmnl_png
stays selectable. A new TRMNL X is provisioned on this kind from its
Model: xheader; one provisioned earlier stays ontrmnl_clientuntil
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 reportsgray_16at pairing; the
server keeps the kind'sgray_8for it on register, discover and relay
pairing, and existing Inkplate instances move togray_8at 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 baretrmnl_clientkind now reportsmonofor its 1-bit
default instead of falling back to the colour preview.
Fixed
- TRMNL catalog kinds can poll. Instances of
trmnl_xand
seeed_xiao_75were never matched by/api/display(only the bare
trmnl_clientkind 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 theesp32_bw_binrenderer 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 indocs/hardware/note4c.md.