Skip to content

Changelog

[Unreleased]

Added

  • Documentation in docs/ built with Zensical: concepts, user guide, admin guide, competition rules and developer guide, with screenshots generated by Cypress (make docs-screenshots); published to docs.staging.targetlog.ch (master) and docs.targetlog.ch (tags) (by @HB9HIL)
  • make docs-serve, make docs-test (markdown lint, strict build, link check) and CI jobs docs-lint, docs-build, docs-links, docs-image and the docs deploys (by @HB9HIL)

[0.4.0] - 2026-10-14

Added

  • Club admins can copy an event for next year from its setup page: range, organizer, language, settings and all programmes (prices, awards, combinations, special prizes, active flag) are copied, registrations, results and kiosk links are not; name and date are suggested one year later (by @HB9HIL)

Changed

  • Copying programmes from an earlier event keeps inactive programmes inactive (by @HB9HIL)

[0.3.0] - 2026-10-14

Added

  • The sidebar footer shows the server version (git describe) (by @HB9HIL)
  • Special prizes per programme: the best ranks of every age category with enough participants, skipping shooters whose club has too few participants in the programme (rules of the Appenzeller Lupi-Meisterschaft); set in the programme menu, also while shooters are registered, kept when programmes are copied, and listed in the new report "Special prizes" with the skipped shooters and their reason (by @HB9HIL)

Changed

  • Docker images built by CI carry the git describe version (e.g. v0.2.0-3-g3d22101) instead of the bare commit hash (by @HB9HIL)
  • CI deploys to production only after the staging deploy of the same tag succeeded (by @HB9HIL)
  • A failing push of the CI job po no longer marks the pipeline as failed (by @HB9HIL)
  • Programmes not shown on rankings are hidden only on kiosk displays; staff see their rankings and can print them as PDF or CSV like any other. The programme option is now called "Show on kiosk displays" (by @HB9HIL)

Fixed

  • UI texts added without running make i18n showed an internal ID instead of the English text in production builds; npm run build now extracts the catalogs before compiling (by @HB9HIL)

[0.2.0] - 2026-10-14

Added

  • Club admins can archive an event when it is over: everything stays visible (dashboard, results, rankings, reports, documents), but registrations, results, awards, programmes and event settings can no longer be changed until it is unarchived; the database refuses such changes (by @HB9HIL)

Changed

  • The registration dialog shows right away when a shooter is or was already registered at the event, links to those registrations and locks the programmes already booked (by @HB9HIL)

Fixed

  • Deleting a club in the admin panel failed once it had registrations (by @HB9HIL)
  • Deleting an event with registrations answered with a server error instead of explaining why (by @HB9HIL)
  • The theme select of the kiosk link form was squeezed next to the language select (by @HB9HIL)

[0.1.0] - 2026-10-14

Added

  • UI in English, German, French and Italian with Lingui and gettext PO catalogs (ready for Weblate); every user picks the language in the user menu, otherwise the browser language applies (by @HB9HIL)
  • Events have a language; kiosk displays, printed documents, reports and CSV exports use it, including the amount in words on wreath cards (by @HB9HIL)
  • Kiosk links carry the theme (?theme=dark|light) and optionally a language (?language=de, otherwise the event language), chosen when the link is created (by @HB9HIL)
  • CI job po on master extracts new UI and document strings and commits the updated PO catalogs (by @HB9HIL)

Changed

  • Tags deploy to staging as well as to production (by @HB9HIL)
  • The admin login rate limit counts only failed attempts (by @HB9HIL)
  • Dates and amounts are formatted for the chosen language (by @HB9HIL)
  • The admin panel follows the look of the app: navy sidebar with navigation and system actions, cards, dark mode and a confirmation dialog instead of the browser prompt (by @HB9HIL)
  • Report file names start with the report key (e.g. financial_…) instead of the English title (by @HB9HIL)
  • make i18n leaves the catalogs untouched when no strings changed and no longer creates fuzzy entries (by @HB9HIL)

[0.0.1-alpha] - 2026-10-14

Added

  • Accounts with password login, sessions in PostgreSQL and login rate limiting (by @HB9HIL)
  • Clubs as tenants with admin and staff roles; club admins manage ranges (lanes, disabled lanes), events and users (by @HB9HIL)
  • Admin panel at /admin, unlocked by TARGETLOG_ADMIN_TOKEN: clubs, users, memberships, sessions, maintenance mode (by @HB9HIL)
  • make dev seeds a local user dev / devpassword with a club, a range and an event (by @HB9HIL)
  • Shooter and club master data per club (tenant): search by license number or name, club assignments, CSV import for club admins (by @HB9HIL)
  • Events can name a club that is excluded from the club competition (by @HB9HIL)
  • Programmes per event with series, prices per age category, award tiers with limits, variants (same name) and optional combinations; editor, JSON export/import, copy from an earlier event (by @HB9HIL)
  • Global programme library, maintained in the admin panel and usable by every club (by @HB9HIL)
  • Registration of shooters for events: lane assignment, programme choice with variants and combinations, age category from the event date, finish and edit without losing entries (by @HB9HIL)
  • Event dashboard with waiting and shooting lists, lane grid and statistics; search with F4 and registration codes from scanners (by @HB9HIL)
  • Live updates over WebSocket, fanned out through PostgreSQL LISTEN/NOTIFY so they work across replicas (by @HB9HIL)
  • Programmes with registrations can no longer be changed or deleted; shooters and clubs with registrations cannot be deleted (by @HB9HIL)
  • Result entry per series with mouches, keyboard flow and server-side validation; combined programmes take the chosen series automatically; registrations complete once every programme has results (by @HB9HIL)
  • Rankings per programme with one implementation of the SSV tie-breaks (total, series from the last, mouches, age) for every view (by @HB9HIL)
  • Kiosk displays: read-only links per event (/kiosk/<token>) with live rankings and optional lane status; tokens are stored hashed, can be revoked and never create a session (by @HB9HIL)
  • PDF documents rendered in the server: lane sheet (A5) with registration QR code and programme barcodes, control strip label, result sheet (A5), wreath card (A6 overlay) and ranking lists (A4) (by @HB9HIL)
  • Print agent for the range (cmd/print-agent): reports the CUPS printers, waits for jobs and prints them with lp; printers, trays and options are chosen per document and range in the app, without printer the documents open as PDF (by @HB9HIL)
  • Event statistics: registrations, completion rate, revenue, participation per programme, age categories, awards (by @HB9HIL)
  • Club competition by the SSV rules (first two series, at least five participants, mandatory/optional results, truncated result, tie-breaks, club out of competition) (by @HB9HIL)
  • Exports as PDF and CSV (UTF-8 with BOM, semicolon): financial report, revenue by programme and age category, awards, club competition, club participants, rankings (by @HB9HIL)
  • Lane reservations per range with the "1, 5, 7-10" lane syntax, lead time and overlap check (also when only the time changes); reserved lanes show on the dashboard, in the registration form and on kiosk displays, and a server-side ticker announces when reservations begin or end (by @HB9HIL)
  • Awards: the server offers only the tiers a total reaches in the shooter's age category, most valuable first, and rejects others; saving results again clears the award (by @HB9HIL)
  • Deployment to Kubernetes: GitLab CI rolls out targetlog-app with Helm to targetlog-staging (app.staging.targetlog.ch, every commit on master) and targetlog-production (app.targetlog.ch, every tag); values in deploy/ (by @HB9HIL)

Chore

  • Renovate configuration: Go 1.27, Node 26, PostgreSQL 18 and SvelteKit 2 pinned to their lines; the Cypress image in Makefile and CI updated together (by @HB9HIL)

Changed

  • Web app as a fullscreen application built with shadcn-svelte: collapsible navy sidebar with event switcher, breadcrumbs, dialogs and side panels instead of separate pages (registration, results, shooters, programmes, clubs, ranges, users, reservations), confirmation dialogs, toasts, dark mode (follows the system, switchable), layouts for phone, tablet and kiosk screens (by @HB9HIL)
  • Rewrite: Go backend, SvelteKit SPA embedded in the binary, PostgreSQL, one Docker image for Kubernetes (by @HB9HIL)

Fixed

  • Live updates could miss a change made right after the browser connected (by @HB9HIL)

Removed

  • CodeIgniter/PHP backend, Node Socket.IO relay and the old Docker setup; the last PHP state is tagged first_version (by @HB9HIL)