-
v4.0.1
Stablereleased this
2026-09-09 21:17:53 +00:00 | 0 commits to main since this releaseChanged
-
/api/eventsno longer spends seconds of CPU expanding recurring events.
v4.0.0 cut the CalDAV traffic to oneREPORTper calendar, but a 7-day feed still
took 4–5 s on the production host: the 12 requests finish in about half a second,
and the rest was the app's own recurrence expansion, which ran once per day per
master and leaned on dayjs timezone comparisons that are slow on the Alpine image.
Every event is now resolved once over the whole window and attributed to its days
locally, with instants compared numerically. The 7-day expansion drops from about
1.2 s to 0.2 s of CPU on a workstation; production is several times faster than
that ratio suggests, because the slow calls were disproportionately slow there. -
The response is unchanged, apart from one process-timezone-independent edge:
"all day" for an event that is exactly one day long is now a 24 h duration check
rather than a date step in the process zone.
Upgrade notes
No configuration changes and no change to the container unit. Hosts that already
run v4.0.0 with the/api/healthhealthcheck pull this viapodman-auto-update
as usual. Hosts still on v3.x must first update the healthcheck line as described
in the v4.0.0 notes.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
-
v4.0.0
Stablereleased this
2026-09-09 20:57:59 +00:00 | 1 commits to main since this releaseBreaking
-
The web UI is gone. The info-beamer package (
package-buergerschule) renders the
schedule itself fromGET /api/events, andpackage-display-controller, the consumer
of/api/hours, is retired. Nothing renders the HTML pages any more, so/,
/wochenplan,/no-zoomand/logo.pngno longer exist; a kiosk browser still
pointed at them gets a JSON404. Next.js, React and Tailwind are removed with them.
What remains is an API-only service on a plainnode:httpserver:/api/events,
/api/hoursand the new/api/health. -
The container healthcheck target changed from
/logo.pngto/api/health.
The quadlet unit indeploy/podman/event-display.containercarries the new
HealthCmd. A host still probing/logo.pngwill mark the new image unhealthy and
podman-auto-updatewill roll back to v3.2.0 in a loop — see the upgrade notes. -
[frontend],calendar.refreshIntervalandcalendar.timeouthave no meaning any
more. They are still accepted and ignored, so an existingconfig.tomlkeeps
validating unchanged.
Changed
-
/api/eventsfetches each calendar once per request instead of once per day.
A poll of the default 7-day feed used to send one CalDAVREPORTper calendar per
day — 84 requests against Nextcloud for 12 calendars, about 2.5 s, every minute. One
REPORTper calendar now spans the whole window and the days are derived locally, so
a poll costs 12 requests and well under a second. The response is unchanged. -
A single unreachable calendar no longer takes the whole feed down. A calendar
that times out (20 s), answers with an error status or returns an unparseable
response is logged on stderr ascalendar <name>: …and left out of that response;
the other rooms are served normally with HTTP200. Only when no calendar at all
could be read do/api/eventsand/api/hoursanswer502, which makes the
info-beamer package keep its cached copy. Previously any single failure was a502
that did not name the calendar. -
The image is smaller (about 182 MB instead of 211 MB) and runs
node dist/server.js
as userapp; the port,CONFIG_PATHand the bind-mountedconfig.tomlwork as
before.
Upgrade notes
Update the quadlet unit on the host before the new image is pulled: replace the
HealthCmdline in~/.config/containers/systemd/event-display.containerwith the one
fromdeploy/podman/event-display.container(/api/healthinstead of/logo.png),
thensystemctl --user daemon-reload. Without that, the auto-update healthcheck fails
and the host rolls back to v3.2.0.No changes to
config.tomlare required. The[frontend]section and the
refreshInterval/timeoutkeys can be deleted at leisure; they do nothing now.If a kiosk browser or bookmark still opens
/or/wochenplan, retire it: the
schedule is rendered by the info-beamer package now./api/eventsand/api/hours
keep their query parameters and response shapes.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
-
v3.2.0
Stablereleased this
2026-08-25 19:54:26 +00:00 | 4 commits to main since this releaseAdded
-
GET /api/events— schedule feed for the info-beamer signage package
(package-buergerschule). Returns yesterday, today and the following days as raw
JSON, so the package can keep rendering a correct schedule through days of network
outage on cached data.Query parameter
days(optional): lookahead days after today, integer1..14,
default5. The response always carries2 + daysday entries — yesterday, today and
the lookahead — with an emptyeventsarray on days without events. An invaliddays
returns HTTP400; a calendar fetch error returns HTTP502.Deliberately raw data: private events are excluded as everywhere outside
/wochenplan, but notimeoutfilter is applied — hiding events that have already
ended is the renderer's job — and no display strings for headline or date are
included, since the package renders those itself. Merged repeat bookings are expanded
to one entry per occurrence, each with its ownid. Response shape, field semantics
and the consuming sync service are documented in the package under
package-buergerschule/docs/event-display-api.md.
Changed
- Added a later entry to the demo fixtures (
demo/raum-b.ics), somake demoexercises
the lookahead days of the new feed.
Upgrade notes
No configuration changes. The new route adds no config key and touches no existing one,
so an existingconfig.tomlworks unchanged./,/wochenplan,/api/hoursand
/no-zoomare unaffected.The feed is unauthenticated, like the rest of the app — if the instance is reachable
beyond the kiosk network, note that/api/eventsexposes the same non-private events the
display already shows.Downloads
-
Source code (ZIP)
1 download
-
Source code (TAR.GZ)
1 download
-
-
v3.1.0
Stablereleased this
2026-08-18 16:02:52 +00:00 | 6 commits to main since this releaseAdded
-
GET /no-zoom— per-viewer zoom opt-out. Opening this URL disables the day-view
zoom ([frontend] scale) for that browser only and redirects to/. Useful when staff
open the display page on a laptop or phone, where the scale factor chosen for the kiosk
screen is far too large.The opt-out is a session cookie: it applies to one browser, never to the kiosk
itself, and disappears when the browser is closed.config.tomlis not touched, so no
container restart is involved.While it is active,
/shows a red bar — "Der Zoom ist für dieses Gerät deaktiviert." —
linking to/no-zoom?clear=1, which removes the cookie and restores the configured
zoom./wochenplanis unaffected either way; it is never zoomed.
Upgrade notes
No configuration changes. This release adds no config key, so an existing
config.toml
works unchanged and[frontend] scalekeeps its current meaning for the kiosk.Downloads
-
Source code (ZIP)
2 downloads
-
Source code (TAR.GZ)
2 downloads
-
-
v3.0.0
Stablereleased this
2026-08-18 15:07:07 +00:00 | 7 commits to main since this releaseBreaking
- The
?scale=URL parameter is gone. It never worked as intended: it setfont-sizeon a
display: contentswrapper, butremresolves against<html>, so with Tailwind's rem-based
utilities it only ever affected text carrying notext-*class — headings, spacing and heights
never moved. Remove it from the kiosk browser's URL; it is now inert.
Added
-
frontend.scaleinconfig.toml(optional, default1, range0.5–3): a display scale
factor for the day view, applied as CSSzoom. Becausezoommultiplies the used value of
every length, it scales the whole UI — text, spacing, border widths and the logo alike.
/wochenplanstays unscaled; it is a staff view, not a kiosk view.Do not copy an old
?scale=value across. The old parameter enlarged only a few lines of text,
so the same number renders considerably larger now. Start near1.25and tune from there. An
out-of-range value fails config validation and the page will return 500.
Changed
- node-ical updated to 0.27; the rrule "fake-UTC" conversions and the ±2h override/EXDATE
matching tolerance are gone, since occurrences now come back as real instants. - Fixed an endless render loop on
/wochenplanwhen navigating across a DST change. - Updated dayjs, @types/node, prettier-plugin-tailwindcss and toml.
Downloads
-
Source code (ZIP)
2 downloads
-
Source code (TAR.GZ)
2 downloads
- The
-
v2.0.0
Stablereleased this
2026-08-17 00:24:39 +00:00 | 15 commits to main since this releaseDownloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
1.0.0
StableAll checks were successfuldeploy / build-and-push (release) Successful in 2m14sreleased this
2026-08-15 15:12:39 +00:00 | 29 commits to main since this releaseDownloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)