Host-level /etc/hosts must be set on alu directly.
Docker copies host's /etc/hosts to spawned containers,
so buildx will use the internal route automatically.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
act_runner and Gitea run on the same host (alu/192.168.86.31),
so we override DNS in the runner to push directly over LAN.
This avoids Cloudflare's upload size limit (413 on 7.79GB image).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- passage_images table stores every image in a burst sequence
- Passage timestamp = last image (chronologically) in the burst
- Review UI: image slider to browse all burst images, slider ends
at the official passage time (rightmost = last image)
- API: GET /api/passages/{id}/images
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Within a burst sequence from the same station, the image where the athlete
is physically closest to the camera gives the most accurate passage timestamp.
Proximity is measured by bib bounding box area (larger = closer).
When a duplicate is detected:
- New image closer: update timestamp + image path, delete old image
- Existing image closer: discard new image
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>