Latest Results
feat!: add open circuit artwork and minimal data defaults
Generate attributed artwork for all 26 circuits from reviewed Jules Roy
and Commons outlines, with configurable styles, palettes and track APIs.
Replace withdrawn F1 assets with original branding and licensed content.
Default to minimal collection, remove legacy usage data on startup, and
block analytics, error reporting, application logs and S3 backups.
Preserve sporting data, provider quotas and image endpoint compatibility.
Harden startup, previews and SQLite cancellation, extend release asset
checks, and consolidate the resulting changes in release 1.3.0.
BREAKING CHANGE: retired static artwork and telemetry endpoints are no
longer available. The default minimal-data profile disables statistics
pages/APIs and deletes existing usage records from the active SQLite DB.
See docs/minimal-data.cs.md and docs/legal-implementation.cs.md before
public deployment; external copies and operator obligations remain open.feat/open-track-artwork-and-privacy fix: harden data sync, API limits, startup readiness, renderer, and web assets (#124)
* fix(data): keep the season sync running when the next season is unpublished
Jolpica answers with an empty race list for a season the FIA has not
published yet. The updater treated that as a hard failure, exited 1, and
the workflow skipped its pull-request step, so the 2026 calendar has not
been synced since July. Skip unpublished seasons, keep failing when a
season that already had races comes back empty, and let the workflow
open a PR for updated seasons before reporting a failed year.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* fix(api): rate-limit before auth, compare tokens as bytes, validate perf paths
Apply the per-IP quota before validating ADMIN_API_TOKEN so guessing is
bounded, and compare tokens as UTF-8 bytes because compare_digest raises
TypeError (an HTTP 500) for non-ASCII str input. Validate perf-metric
page_path as a site-relative path, collapse unknown pages into /other,
and lower the default beacon quota to one browser page view worth.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* fix(startup): publish calendars before upstream refreshes
Readiness depends only on a fresh core generation, but startup ran the
historical catch-up (up to the 90-minute budget under Jolpica rate
limits) and the all-circuit weather fetch first, leaving /health/ready
in 'starting' past the container health-check window.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* perf(upstream): cache Jolpica payloads and degraded rosters
Requests for seasons without a static file refetched Jolpica on every
call and degraded team rosters were never cached, so a burst of unique
requests queued hundreds of paced upstream calls behind the scheduler.
Cache raw season and round payloads with positive and negative TTLs and
per-key coalescing, keep degraded rosters for five minutes, parse each
static season file once per on-disk version, and stop logging every
calendar request at INFO.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* fix(changelog): remember failed GitHub version lookups briefly
With an empty cache every /changelog view performed two blocking GitHub
API calls while the API was down or rate-limited. Keep a five-minute
negative cache and skip the inline refresh inside that window.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* perf(renderer): resample 1-bit track maps in grayscale and drop per-pixel loops
Pillow silently uses NEAREST for mode '1' resizes, which broke thin
track lines on 19 of 25 preprocessed maps; resample in grayscale and
re-threshold instead. Count logo activity rows in Pillow's C loops and
pack 4-bit BMP nibbles without a Python per-pixel walk, taking startup
warmup from about nine seconds to under one and each B/W/R render down
by roughly a hundred milliseconds.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* fix(reset-db): guard running instances and fail on SQL errors
Deleting the database under a running instance left the app writing to
an unlinked inode without a schema until restart, and sqlite3 failures
still printed success. Run with strict shell mode, use the app's busy
timeout, refuse 'all' while WAL/SHM sidecars exist unless --force is
given, and document running the reset against a stopped service.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* fix(web): escape translations in configure markup, fix stylesheet loading and labels
Localized labels were concatenated into innerHTML unescaped, the primary
stylesheets were loaded through a preload swap that rendered hidden
menus in-flow before CSS arrived, static URLs had no cache-busting, the
icon-only sidebar close button had no accessible name, and the sidebar
controls were not associated with their labels. Also escape the Umami
website id inside the tracking script tag.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* chore(ci): cover composite actions, drop unused OIDC permission, harden containers
Dependabot never scanned .github/actions, leaving setup-uv pinned to an
older version than the workflows. Remove the id-token permission that no
step uses, exec uvicorn as PID 1, drop all capabilities and disallow
privilege escalation in Compose, tag Sentry events with the release, and
replace the broken pip extras install in the contributor docs with the
uv dependency group CI actually uses.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* chore(release): 1.2.40
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* fix: address review feedback on season sync, remote cache semantics, and lint
Keep merging static cancellations when the upstream calendar is empty
(only a failed fetch short-circuits), report an unreadable existing
season file instead of treating it as unpublished, locate out-of-range
BMP pixels without an unguarded next(), and drop a redundant lambda in
the API tests. Also fix the last stale locale mention in the Copilot
instructions.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* fix(cache): reject malformed Jolpica payloads before caching
* fix(startup): include fresh weather without scheduler
* fix(data): harden season updates and refresh 2026 calendar
* docs: run development commands through uv
* ci(data): report season update failures through issues
* chore(release): update 1.2.40 notes
* fix(cache): bound retries for malformed Jolpica payloads
* fix(changelog): suppress retries after refresh errors
* fix(web): localize settings sidebar close label
* refactor(changelog): encapsulate version cache state
* fix(f1): handle null race times in season payloads
* fix(calendar): render Sepang with validated track artwork
Add semantic palette variants and fit overflowing race titles.\n\nProvide a provenance-gated local importer and fail season updates when an active circuit is missing source artwork or a runtime BMP.
* style: format code with Ruff Formatter
This commit fixes the style issues introduced in 293d419 according to the output
from Ruff Formatter.
Details: https://github.com/Rhiz3K/InkyCloud-F1/pull/124
* fix(calendar): harden artwork publication and title fitting
Publish track source variants behind a final hash marker so preprocessing and CI reject interrupted or mixed bundles. Clamp subtitles that remain too wide after font fitting and remove redundant exception catches flagged by DeepSource.
* test(assets): cover bundle validation failures
Exercise every fail-closed marker branch and both PNG encoding errors so the changed-line coverage ratchet protects the complete bundle contract. Simplify the expected-path construction flagged by DeepSource.
* fix(previews): honor conditional PNG requests
Return an empty 304 for matching configure-preview ETags while preserving the FileResponse validators and cache policy. Reuse one stat snapshot so validation and delivery describe the same file revision.
---------
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: deepsource-autofix[bot] <62050782+deepsource-autofix[bot]@users.noreply.github.com> Latest Branches
0%
dependabot/uv/uv-c06bb78122 -1%
0%
dependabot/docker/python-cad9a2c © 2026 CodSpeed Technology