Vai al contenuto

Changelog

[Unreleased]

[0.9.4] - 2026-10-15

Changed

  • Unknown files and non-GET requests get a 404 instead of the app shell; X-Frame-Options and Cross-Origin-Opener/Resource-Policy headers (by @HB9HIL)

[0.9.3] - 2026-10-15

Added

  • Security headers (CSP with hashed inline scripts, HSTS, nosniff, Referrer-Policy, Permissions-Policy) on every response (by @HB9HIL)

Fixed

  • The image of a commit is built once, whichever pipeline comes first (by @HB9HIL)

[0.9.2] - 2026-10-15

Chore

  • Dependency updates (by @renovate-bot)

[0.9.1] - 2026-10-15

Chore

  • Translation catalogs updated by CI; the tag v0.9.0 pointed to a commit without them (by @HB9HIL)

[0.9.0] - 2026-10-15

Added

  • Events can take place on several ranges and several days, including pre-shooting days: ranges and days in the event settings, lanes chosen per range, programmes optionally tied to a range, rankings and lane status grouped by range on kiosk displays, registrations per day in the statistics; a kiosk link can show one range only (by @HB9HIL)

Changed

  • Docker builds exclude tmp/ (by @HB9HIL)

Changed

  • Programmes with registered shooters stay editable except for their series; age categories and awards can be added (by @HB9HIL)

[0.8.2] - 2026-10-15

Fixed

  • The image jobs of master and tag pipelines run one after the other, so a tag always finds the image of its commit (by @HB9HIL)

[0.8.1] - 2026-10-15

Fixed

  • Tag pipelines reuse the image built for the commit, pods always pull it, and a missing _app/ asset answers 404 instead of the app page (by @HB9HIL)

Changed

  • Error and validation messages of the API follow the language of the app; scripts without a language keep English (by @HB9HIL)
  • Bigger text and tables on laptops and desktops; phones keep their sizes (by @HB9HIL)
  • The login page introduces both products instead of only the training log (by @HB9HIL)

[0.8.0] - 2026-10-15

Added

  • The documentation is available in German, French and Italian (docs.targetlog.ch/de/, /fr/, /it/, language switcher in the header): the user-facing pages are translated with po4a into gettext PO files in docs/locales/; admin and developer pages stay English (by @HB9HIL)

Fixed

  • Documentation: the result rules, login, users and kiosk pages describe the award given on save, the password reset by email and the reload on a new version (by @HB9HIL)

Chore

  • Dependency updates (by @renovate-bot)

[0.7.1] - 2026-10-15

Fixed

  • Deleting a session or an event no longer takes several seconds: the app stopped reloading the deleted item, and requests that fail with a client error (like 404) are no longer retried (by @HB9HIL)
  • My training shows the version too: at the bottom of the sidebar and, on phones, under Settings → App (by @HB9HIL)

[0.7.0] - 2026-10-15

Added

  • Personal API tokens for the training log, like the API v2 tokens of Wavelog: a name, the permissions read and/or log and change sessions and an expiry, shown once, revocable, with the time of last use; scripts send them as Authorization: Bearer (by @HB9HIL)

[0.6.0] - 2026-10-15

Added

  • A new club sees a getting-started checklist (range, event, programmes, shooters) instead of an empty events list, and an event without active programmes shows the missing steps instead of an empty dashboard (by @HB9HIL)

Changed

  • Dashboard: the edit and finish buttons of running shooters carry a label, Assign lane is the highlighted action for waiting shooters, the search field says what it accepts, and the connection dot in the sidebar only shows on event pages (by @HB9HIL)
  • The event setup is split into the tabs Programmes, Event, Kiosk displays and Copy & archive instead of one long page (by @HB9HIL)
  • The programme editor suggests the names of existing programmes and says when a programme becomes a variant of another, with a warning when the variant name is missing or taken (by @HB9HIL)
  • Saving results gives the most valuable award reached right away, and picking another award saves it at once; a correction keeps the chosen award as long as the total still reaches it (by @HB9HIL)
  • My training: a new session takes the place of the last training (by @HB9HIL)
  • Open tabs notice a new release within a minute: they offer a reload and load the new version on the next page change at the latest; kiosk displays reload by themselves (by @HB9HIL)

[0.5.2] - 2026-10-15

Added

  • Tag pipelines create a GitLab release with the changelog section of the version and the print agent binaries (by @HB9HIL)

Changed

  • The mail server is configured with TARGETLOG_SMTP_HOST, TARGETLOG_SMTP_PORT, TARGETLOG_SMTP_USER, TARGETLOG_SMTP_PASSWORD and TARGETLOG_SMTP_FROM instead of TARGETLOG_SMTP_URL and TARGETLOG_MAIL_FROM, so passwords need no encoding and never end up in a log (by @HB9HIL)
  • The start page after login shows the personal log and the clubs as tiles instead of a list (by @HB9HIL)
  • Brighter text in the sidebar for better contrast (by @HB9HIL)
  • Faster pipelines: the image packs the binary that the end-to-end tests ran against instead of building everything again, documentation and app no longer wait for each other, downloads are cached, and a newer push cancels the running pipeline (by @HB9HIL)
  • End-to-end tests and documentation screenshots run with Playwright instead of Cypress: spec files run in parallel in headless Chromium and the suite takes about 20 seconds locally; failures leave a screenshot and a trace, and CI reports the results as JUnit (by @HB9HIL)

[0.5.1] - 2026-10-15

Changed

  • Staging and production send mails (password reset, email confirmation) through mail.targetlog.ch; links in mails point to the public URL of each environment (by @HB9HIL)

[0.5.0] - 2026-10-15

Changed

  • The start page leads to the personal log, and the club user menu has a link to it; the login page accepts an email address (by @HB9HIL)

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)
  • My training: a personal training log for every shooter at /my, mobile first and installable as a PWA. Sessions are logged as series totals, shot values or hits tapped on the target face (with decimal scoring), mixed per series, kept on the device while typing and uploaded later when offline (by @HB9HIL)
  • Instant feedback after saving a session (personal best, place among comparable sessions, points per shot against the last 30 days) and a progress page per discipline: trend with moving average, personal best, goal, competition vs. training, series curve, shot values, group size and centre with a sight hint, and tag insights (by @HB9HIL)
  • Built-in disciplines (air pistol/rifle 10 m, pistol 25/50 m, rifle 50/300 m) and own disciplines; goals; CSV export and account deletion (by @HB9HIL)
  • Competition results of Targetlog events are found by license number and birthday and added to the personal log with one tap (by @HB9HIL)
  • Self sign-up with email confirmation and password reset by mail (TARGETLOG_SIGNUP, TARGETLOG_SMTP_URL, TARGETLOG_MAIL_FROM, TARGETLOG_PUBLIC_URL); login by user name or email (by @HB9HIL)
  • Optional billing for the personal log (TARGETLOG_BILLING): free trial (TARGETLOG_TRIAL_DAYS), monthly subscription through Stripe Checkout and customer portal (TARGETLOG_STRIPE_*), manual subscriptions and club member plans in the admin panel, and a member plan page where club admins give seats to their members by email (by @HB9HIL)
  • Own weapons in the personal log: choose one when saving a session, compare their points per shot, last 30 days and best total on the progress page and filter all figures by weapon; CSV export has a weapon column (by @HB9HIL)
  • Mailpit for make dev and the e2e tests (by @HB9HIL)

Fixed

  • CI image builds no longer fail with "denied: access forbidden" when docker-image and docs-image run at the same time on the shell runner: each job keeps its registry login in its own DOCKER_CONFIG (by @HB9HIL)
  • Live updates no longer get lost when they arrive while a page is still loading its data: the dashboard, the other event pages and kiosk displays could keep showing the state from before a change until the next one (by @HB9HIL)
  • The admin panel shows last logins and subscription dates in Swiss time instead of the server's time zone, so a paid-until date no longer shows one day early on servers running in UTC (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)