_ _ _____
___(_)_ __ ___ ___/ |___ |
/ __| | '_ \ / __/ _ \ | / /
\__ \ | | | | (_| __/ | / /
|___/_|_| |_|\___\___|_|/_/ v0.3.1
Your F1 Time Machine. Relive every Formula 1 season from 2017 onward, race by race, completely spoiler-free.
Came late to F1? Watching your first season years later? since17 walks you through every round in calendar order using the official race highlight videos (the ~5-minute recaps on YouTube). For each round you get the standings and paddock context first, then the highlight link — and results only after you've confirmed you watched. No accidental spoilers. No discipline required.
| Spoiler-Safe | Results and standings locked behind your current round — future data is never fetched |
| Expert Mode | Toggle off spoiler protection for races you already know — unlocks standings, results, and AI post-race analysis |
| Bubble Tea TUI | Full interactive race flow with keyboard navigation, spinner, and alt-screen |
| AI Historian | Pre-race briefings or post-race expert analysis from any OpenAI-compatible LLM |
| Ergast + Cache | Live data from the Ergast F1 API with file-based SHA-256 caching (permanent for past seasons) |
| Undo | Single-level rewind with since17 undo if you advance by mistake |
| Track Database | Pre-seeded pre-race context for every race 2017–2025 (no API key needed) |
| Colors | Championship position deltas highlighted in green/red via Lip Gloss |
| Doctor | Built-in diagnostics for state file and data integrity |
brew install eftekin/since17/since17go install github.com/eftekin/since17/cmd/since17@latestgit clone https://github.com/eftekin/since17.git
cd since17
make install# Start tracking the 2021 season
since17 init 2021
# Check where you are + pre-race context
since17 status
# Watch flow: briefing → open highlights → reveal results → advance
since17 race
# Rewind if you advanced by mistake
since17 undo| Command | Description |
|---|---|
since17 init <year> |
Start or reset at round 1 of a season (2017–2025) |
since17 status |
Current race, standings snapshot, and pre-race context |
since17 race |
Full interactive watch flow (TUI) |
since17 complete |
Mark current race highlights as watched and advance |
since17 undo |
Rewind one race |
since17 config |
View current settings |
since17 config spoiler-safe <on|off> |
Toggle spoiler-safe / Expert Mode |
since17 doctor |
Diagnostics for state file and data integrity |
Already know how the 2021 season ends? Toggle off spoiler protection and replay it with full context:
since17 config spoiler-safe off # activate Expert Mode
since17 status # shows post-race standings + results + AI analysis
since17 config spoiler-safe on # restore protection any timeIn Expert Mode:
since17 statusshows standings after the current round and the full race results table- The AI Historian delivers a post-race expert analysis instead of a pre-race briefing
- The banner and dashboard indicate "Expert Mode · Spoilers Enabled"
since17 racefetches post-race standings in the TUI briefing view
Spoiler-safe mode is the default — new users are always protected.
since17 can generate race briefings using any OpenAI-compatible LLM. The behavior adapts to your mode.
Spoiler-safe mode: The system prompt locks the model's knowledge horizon to the race date. It cannot know the result, qualifying times, or any post-race event. Fires only when no local TSV context exists for the round.
Expert Mode: The temporal lock is removed. The AI delivers a post-race expert analysis: race winner, key incidents, championship standings impact, and historical significance. Runs on every status call, overriding the TSV blurb.
Setup:
export SINCE17_AI_KEY=sk-...
since17 statusConfiguration:
| Variable | Default | Description |
|---|---|---|
SINCE17_AI_KEY |
(unset) | API key — feature is disabled when absent |
SINCE17_AI_BASE_URL |
https://api.openai.com/v1 |
Any OpenAI-compatible endpoint |
Use a local model (e.g. Ollama):
export SINCE17_AI_KEY=ollama
export SINCE17_AI_BASE_URL=http://localhost:11434/v1
since17 statusDisable AI for a single run:
since17 status --no-ai- All watch progress is stored locally in
~/.since17/state.json - Pre-race context is compiled into the binary via
go:embed(no external data files needed) - Race data is fetched from Ergast (with
api.jolpi.caas fallback) and cached in~/.since17/cache/ - No telemetry. No accounts. Nothing phoned home unless you set
SINCE17_AI_KEY.
cmd/since17/ # Binary entrypoint — version injected via ldflags
cmd/ # Cobra commands: status, race, complete, undo, init, config, doctor
internal/
api/ # ErgastClient — REST client + SHA-256 file cache
data/ # go:embed assets (highlights TSV, track database)
historian/ # AI Historian — OpenAI-compatible HTTP client
paths/ # App directory and state file paths (~/.since17/)
state/ # StateManager — atomic JSON state, TrackerState model
ui/ # Lip Gloss renderers + Bubble Tea race TUI
Formula/ # Homebrew tap formula
# Build
make build
# Run tests
make test
# Vet
make vet
# Local GoReleaser snapshot (no publish)
make snapshotSingle test:
go test -run TestExtractStandings ./internal/api/MIT — see LICENSE.