• v4.0.1 71d4afa49a

    v4.0.1
    All checks were successful
    deploy / build-and-push (release) Successful in 46s
    CI / check (push) Successful in 1m45s
    Stable

    clarity released this 2026-09-09 21:17:53 +00:00 | 0 commits to main since this release

    Changed

    • /api/events no longer spends seconds of CPU expanding recurring events.
      v4.0.0 cut the CalDAV traffic to one REPORT per 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/health healthcheck pull this via podman-auto-update
    as usual. Hosts still on v3.x must first update the healthcheck line as described
    in the v4.0.0 notes.

    Downloads
  • v4.0.0 22694da6fe

    v4.0.0
    All checks were successful
    deploy / build-and-push (release) Successful in 1m9s
    CI / check (push) Successful in 1m55s
    Stable

    clarity released this 2026-09-09 20:57:59 +00:00 | 1 commits to main since this release

    Breaking

    • The web UI is gone. The info-beamer package (package-buergerschule) renders the
      schedule itself from GET /api/events, and package-display-controller, the consumer
      of /api/hours, is retired. Nothing renders the HTML pages any more, so /,
      /wochenplan, /no-zoom and /logo.png no longer exist; a kiosk browser still
      pointed at them gets a JSON 404. Next.js, React and Tailwind are removed with them.
      What remains is an API-only service on a plain node:http server: /api/events,
      /api/hours and the new /api/health.

    • The container healthcheck target changed from /logo.png to /api/health.
      The quadlet unit in deploy/podman/event-display.container carries the new
      HealthCmd. A host still probing /logo.png will mark the new image unhealthy and
      podman-auto-update will roll back to v3.2.0 in a loop — see the upgrade notes.

    • [frontend], calendar.refreshInterval and calendar.timeout have no meaning any
      more. They are still accepted and ignored, so an existing config.toml keeps
      validating unchanged.

    Changed

    • /api/events fetches each calendar once per request instead of once per day.
      A poll of the default 7-day feed used to send one CalDAV REPORT per calendar per
      day — 84 requests against Nextcloud for 12 calendars, about 2.5 s, every minute. One
      REPORT per 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 as calendar <name>: … and left out of that response;
      the other rooms are served normally with HTTP 200. Only when no calendar at all
      could be read do /api/events and /api/hours answer 502, which makes the
      info-beamer package keep its cached copy. Previously any single failure was a 502
      that did not name the calendar.

    • The image is smaller (about 182 MB instead of 211 MB) and runs node dist/server.js
      as user app; the port, CONFIG_PATH and the bind-mounted config.toml work as
      before.

    Upgrade notes

    Update the quadlet unit on the host before the new image is pulled: replace the
    HealthCmd line in ~/.config/containers/systemd/event-display.container with the one
    from deploy/podman/event-display.container (/api/health instead of /logo.png),
    then systemctl --user daemon-reload. Without that, the auto-update healthcheck fails
    and the host rolls back to v3.2.0.

    No changes to config.toml are required. The [frontend] section and the
    refreshInterval / timeout keys 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/events and /api/hours
    keep their query parameters and response shapes.

    Downloads
  • v3.2.0 ade1b0f1b4

    v3.2.0
    All checks were successful
    deploy / build-and-push (release) Successful in 1m8s
    CI / check (push) Successful in 2m24s
    Stable

    clarity released this 2026-08-25 19:54:26 +00:00 | 4 commits to main since this release

    Added

    • 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, integer 1..14,
      default 5. The response always carries 2 + days day entries — yesterday, today and
      the lookahead — with an empty events array on days without events. An invalid days
      returns HTTP 400; a calendar fetch error returns HTTP 502.

      Deliberately raw data: private events are excluded as everywhere outside
      /wochenplan, but no timeout filter 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 own id. 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), so make demo exercises
      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 existing config.toml works unchanged. /, /wochenplan, /api/hours and
    /no-zoom are unaffected.

    The feed is unauthenticated, like the rest of the app — if the instance is reachable
    beyond the kiosk network, note that /api/events exposes the same non-private events the
    display already shows.

    Downloads
  • v3.1.0 4df06ca071

    v3.1.0
    All checks were successful
    deploy / build-and-push (release) Successful in 57s
    CI / check (push) Successful in 1m48s
    Stable

    clarity released this 2026-08-18 16:02:52 +00:00 | 6 commits to main since this release

    Added

    • 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.toml is 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. /wochenplan is 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] scale keeps its current meaning for the kiosk.

    Downloads
  • v3.0.0 41f5aef409

    v3.0.0
    All checks were successful
    deploy / build-and-push (release) Successful in 1m44s
    CI / check (push) Successful in 2m31s
    Stable

    clarity released this 2026-08-18 15:07:07 +00:00 | 7 commits to main since this release

    Breaking

    • The ?scale= URL parameter is gone. It never worked as intended: it set font-size on a
      display: contents wrapper, but rem resolves against <html>, so with Tailwind's rem-based
      utilities it only ever affected text carrying no text-* class — headings, spacing and heights
      never moved. Remove it from the kiosk browser's URL; it is now inert.

    Added

    • frontend.scale in config.toml (optional, default 1, range 0.5–3): a display scale
      factor for the day view, applied as CSS zoom. Because zoom multiplies the used value of
      every length, it scales the whole UI — text, spacing, border widths and the logo alike.
      /wochenplan stays 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 near 1.25 and 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 /wochenplan when navigating across a DST change.
    • Updated dayjs, @types/node, prettier-plugin-tailwindcss and toml.
    Downloads
  • v2.0.0 9d5ae2e5a7

    v2.0.0
    All checks were successful
    deploy / build-and-push (release) Successful in 1m43s
    CI / check (push) Successful in 2m4s
    Stable

    clarity released this 2026-08-17 00:24:39 +00:00 | 15 commits to main since this release

    Downloads
  • 1.0.0 225b363b3c

    1.0.0
    All checks were successful
    deploy / build-and-push (release) Successful in 2m14s
    Stable

    clarity released this 2026-08-15 15:12:39 +00:00 | 29 commits to main since this release

    Downloads