Repository navigation
Built from the sources at this tag, and published only after
verify.py passed.
| File | What it is |
|---|---|
f1.db |
The SQLite database. Open it with any SQLite client. |
f1-geometry.db |
Circuit centrelines, © OpenStreetMap contributors under ODbL 1.0. A separate file so its share-alike does not reach the rest — see below. circuit_geometry in f1.db is deliberately empty. |
f1-facts.db |
The facts alone, under CC BY 4.0: f1.db less everything that stays share-alike — the rows and prose taken from share-alike sources, and this project's writing not granted CC BY 4.0 — with the race rows that cite a Wikipedia season article rebuilt from F1DB. Its meta table states its terms, and tools/facts_artefact.py names everything it leaves out and why. |
f1_database.json.gz |
Full JSON export of every table: 1.3 MB compressed, 29.3 MB unpacked. Not kept in git — it does not delta-compress, and regenerates in about a second with make export. |
f1_compat.json |
JSON in the original v1 key layout. |
f1-parquet.zip |
Every table as Parquet, one file each — including the four the JSON export omits for size: qualifying, practice, sprint_qualifying and pit_stops. Columnar and compressed: pandas, polars and DuckDB read it directly. |
schema.sql |
The schema, commented. |
SHA256SUMS |
Digests. The build is reproducible, so you can check these by rebuilding. |
Data is CC BY-SA 4.0, except the columns of this project's own
writing that LICENSE-DATA names, which are CC BY 4.0, and
f1-parquet.zip carries a README.txt stating both.
f1-facts.db is CC BY 4.0 whole: it holds nothing share-alike. Circuit
geometry is © OpenStreetMap
contributors under ODbL 1.0, and ships as its own file rather
than inside f1.db or the JSON export: two databases distributed
alongside each other are a Collective Database under ODbL, so the
share-alike follows f1-geometry.db alone. Take one, take both,
and the obligation follows the file it belongs to.
See ATTRIBUTION.md.
Nobody publishes Formula One race timing under a licence that
permits passing it on, so this database holds none: laps,
stints, race_timing and race_control_messages are empty on
purpose, and everything that is here may be passed on under the
licence shown beside it. That is about the licences on offer
rather than about what anyone may lawfully do — FOM and its
licensees redistribute timing every weekend — and about race
timing: the qualifying, sprint_qualifying and practice
tables hold lap times, each driver's best lap of a session,
which F1DB publishes under CC BY 4.0.
docs/TIMING-ARCHITECTURE.md is that decision in full.
Stable links. Every asset above is also reachable at a URL
that always points at the newest release, so a script does not
need updating each time:
https://github.com/Alex-Farley/formula-1-data/releases/latest/download/f1.db
https://github.com/Alex-Farley/formula-1-data/releases/latest/download/f1-parquet.zip
Swap latest for a tag (v2.19) to pin a version instead.
The Parquet bundle is also served from the site itself:
https://lapledger.org/f1-parquet.zip
That copy is rebuilt on every deploy from the database the site
is serving, so it is never older than the pages beside it. The
release asset above is pinned to this tag; use whichever suits —
the newest data, or a version you can cite.
What's Changed
- v2.25 follow-ups: the export's size is measured, and /changes lists v2.25 by @Alex-Farley in #718
- Add security-reviewer to the merge path (D-49) by @Alex-Farley in #722
- WK-08: records carry a family and a headline flag; /records is built from them by @Alex-Farley in #704
- LV-08: a sourced line for each Friday driver, and the reasons behind the declared SQ sheets by @Alex-Farley in #726
- VD-47: a harvested, verified circuit-to-article mapping (piece 1 of the circuit photographs) by @Alex-Farley in #730
- refresh: checked F1DB, nothing new by @lap-ledger-refresh[bot] in #734
- DA-13: aspiration, personnel.role and team_radio's channel become CHECKed vocabularies by @Alex-Farley in #732
- DA-14: v_race_classification, v_driver_season_points, and views.sql in the Parquet zip by @Alex-Farley in #735
- DA-15: races.dates becomes date_from / date_to, and the weekend is checked by @Alex-Farley in #737
- Bump react-router-dom from 7.18.3 to 7.18.4 in /web in the runtime group across 1 directory by @dependabot[bot] in #671
- DA-16: empty columns are declared, and a gap's race count is measured by @Alex-Farley in #739
- AF-79: release.yml passes the tag through env by @Alex-Farley in #745
- refresh: checked F1DB, nothing new by @lap-ledger-refresh[bot] in #748
- AF-77: the workflows run pinned actions and pinned pip packages by @Alex-Farley in #747
- AF-78: no job in refresh.yml that runs npm holds the App's token by @Alex-Farley in #750
- DA-42: stored entries, starts and points are compared with the race records by @Alex-Farley in #752
- CR-60: Baghetti was one of three debut winners, and Gurney one of three owner-winners by @Alex-Farley in #754
- PM-63: admit Long Beach as the circuit Q173889, not the city Q16739 by @Alex-Farley in #756
- refresh: checked F1DB, nothing new by @lap-ledger-refresh[bot] in #758
- CR-63: read v_standings_final once where it was read per row by @Alex-Farley in #763
- CR-62: a driver's second entry for another constructor is declared, or refused by @Alex-Farley in #764
- CR-61: a row a local loader changes cites the loader, and both exports refuse it by @Alex-Farley in #765
- VD-61: circuits carry their article, and an aerial photograph by a third route by @Alex-Farley in #769
- VD-62: the circuit photograph, beside the heading by @Alex-Farley in #771
- CR-55: LICENSE-DATA's Attribution section adopts ATTRIBUTION.md's attribution text by @Alex-Farley in #773
- PM-64: views.sql is also available under LICENSE (MIT), as schema.sql is by @Alex-Farley in #776
- AF-81: file.py rank reads the board once and places a run by @Alex-Farley in #777
- AF-84: the stall watchdog watches the model, not the tools by @Alex-Farley in #778
- CR-64+CD-34: tied standings close on the row id; constructor wins and poles give both figures by @Alex-Farley in #779
- Bump astral-sh/ruff-action from 3.6.1 to 4.1.0 in the actions group across 1 directory by @dependabot[bot] in #749
- Bump vite from 8.2.2 to 8.3.1 in /web in the build-and-test group across 1 directory by @dependabot[bot] in #670
- PD-52: record the PD-41 bare-facts ruling on the Wikipedia-cited race rows by @Alex-Farley in #781
- AF-85: hold an item on a person's decision instead of stopping the loop by @Alex-Farley in #783
- CR-69: hold a driver still racing to F1DB's published career total, not a typed one by @Alex-Farley in #789
- VD-66: what leads each page type - critique and twelve filed items by @Alex-Farley in #802
- harvest: refresh from F1DB v2026.16.0 2ba943cf by @lap-ledger-refresh[bot] in #806
- SD-35: a failing refresh and a late race each open one issue by @Alex-Farley in #805
- PD-63: print a season in a figure's table as written, not 1,950 by @Alex-Farley in #807
- PD-57: a race page leads with its result by @Alex-Farley in #808
- PD-64: a race page's photographs are of the race, and none are out of reach by @Alex-Farley in #810
- PD-58: season and constructor pages lead with their chart by @Alex-Farley in #813
- CR-70: a photograph's credit is a name, on every route by @Alex-Farley in #815
- SD-36: a refresh pull request CI refuses opens the refresh-failing issue by @Alex-Farley in #812
- AF-86: CLAUDE.md's stop bullet names the D-52 hold by @Alex-Farley in #816
- VD-67: a lead figure sets its plot before its method note by @Alex-Farley in #817
- PD-59: an active driver's career tiles lead, the season follows the career chart by @Alex-Farley in #818
- VD-49: the tile strips are data in their query modules, and both renderers draw them by @Alex-Farley in #821
- VD-53: the lead figure sits beside the heading from 1024 px by @Alex-Farley in #824
- VD-68: the headline records are cards, and the leaderboards follow them by @Alex-Farley in #825
- PD-30: the race page draws grid to flag, in both halves by @Alex-Farley in #828
- PD-60: the circuit page puts who wins here before the layout history by @Alex-Farley in #829
- PD-56: the race page's pit stops are stint windows, then who stopped first between neighbours by @Alex-Farley in #831
- VD-69: exhaustive lists open on their first ten by @Alex-Farley in #832
- VD-54: the title race and the seasons raced, as columns in the /seasons and /constructors tables by @Alex-Farley in #833
- SD-37+CR-42: say on the site when a race's result is late by @Alex-Farley in #834
- PM-49: grant ten of entry 18's authored tables CC BY 4.0, on the prose pass by @Alex-Farley in #836
- IA-29: every curated car of one chassis takes the chassis figure first in both halves, and its six disagreeing figures are on the record by @Alex-Farley in #839
- CR-43+CR-44: the merge gate names lint, and make lint reaches Ruff as a module by @Alex-Farley in #840
- #830: the F1DB fetch reads the latest published release, not the tip of the branch by @Alex-Farley in #842
- VD-75: design pass - five critiques, and the design system proposed in three versions by @Alex-Farley in #864
- refresh: checked F1DB, nothing new by @lap-ledger-refresh[bot] in #873
- CR-74+CD-51+CD-50+AX-23: championship dots that hold, the season said once, a true title-chart note by @Alex-Farley in #875
- SD-39+SD-40: a race's lede says who won before its note, and a round awaiting its stops says so by @Alex-Farley in #876
- SD-38: a circuit's race list counts the races run as its tile does by @Alex-Farley in #877
- CD-54+CD-55+CD-53: car specs, meta spans and Hamilton's lede print plain text by @Alex-Farley in #878
- IX-44+CD-52: chart hover boxes stay whole; every fold names its rows by @Alex-Farley in #882
- VD-78+VD-76+VD-77+IX-47+VD-60: design system A, step 1 - grid, measure and the design-system tests by @Alex-Farley in #883
- VD-85: adopt design system A, and give it a way to grow by @Alex-Farley in #885
- VD-79+VD-46+VD-56+VD-71: one page header and one tile strip in both renderers, and a handover that moves nothing by @Alex-Farley in #888
- VD-80: one figure grammar, and the driver chart's title ring at 2 px by @Alex-Farley in #889
- VD-81+CD-12+IA-09: one vocabulary - eyebrows, labels, provenance, steppers and disclosure names by @Alex-Farley in #892
- refresh: checked F1DB, nothing new by @lap-ledger-refresh[bot] in #896
- refresh: checked F1DB, nothing new by @lap-ledger-refresh[bot] in #897
- CR-78: an empty refresh packs as an empty list instead of failing by @Alex-Farley in #898
- CD-57: dates in words, localised to the reader in the app by @Alex-Farley in #899
- VD-82+IX-46+AX-31: one reveal control, with sort and fold in the address by @Alex-Farley in #902
- VD-83+SD-41: one section order per page type, winners first on all 80 circuits by @Alex-Farley in #905
- VD-84+VD-74: version A's opening slot, and the middle type register by @Alex-Farley in #906
- IX-45: the race classification fits its own box from 768 px by @Alex-Farley in #908
- DA-29: standings.entity is the register's name, on every row of every source by @Alex-Farley in #910
- DA-37: the thirteen unpaid finishers inside the paid places hold 0, and the note says why by @Alex-Farley in #912
- DA-35: source 7's checkability states only what the winner check does by @Alex-Farley in #915
- CR-36: hold a formula1.com season page to its own season's rows by @Alex-Farley in #916
- PM-68: the chassis spec harvest reads each end of the track and every item of a list by @Alex-Farley in #917
- PD-53: the facts artefact's table and column set, rebuilt from F1DB, held by verify.py by @Alex-Farley in #932
- LV-09: 2026's Barcelona round is the Barcelona-Catalunya Grand Prix; Madrid's is the Spanish Grand Prix by @Alex-Farley in #935
- DA-39: restore the 1952 Italian GP's shared fastest lap, and assess the 1953 French GP's by @Alex-Farley in #937
- DA-46: show race_entries.note against its row in the race classification by @Alex-Farley in #938
- CR-79: useUrlState keeps the #fragment, and composes every hook's writes on the address by @Alex-Farley in #940
- VD-90: a season being run opens its lede on who can still win by @Alex-Farley in #943
- IX-48: the qualifying sheets fit their box from 768 px by @Alex-Farley in #945
- CD-59: session times follow the Dates rule by @Alex-Farley in #946
- VD-89: a table that fits its box keeps its column heads in sight by @Alex-Farley in #948
- refresh: checked F1DB, nothing new by @lap-ledger-refresh[bot] in #949
- CR-76: a wiki link's stray bracket leaves the car pages and the credits; verify holds every column to it by @Alex-Farley in #952
- PM-71: source 8's use text names what its per-race articles are cited for by @Alex-Farley in #953
- CR-56: Frédéric Vasseur, Loïc Serra and Pierre Waché keep their diacritics by @Alex-Farley in #955
- CD-45: known_gaps prose states its figures as tokens by @Alex-Farley in #957
- PM-62: file F1DB's three race results its own session sheets contradict by @Alex-Farley in #958
- DA-44: file the two races' did-not-start readings on the races by @Alex-Farley in #960
- harvest: refresh from F1DB v2026.16.1 fcb031a0 by @lap-ledger-refresh[bot] in #961
- refresh: checked F1DB, nothing new by @lap-ledger-refresh[bot] in #962
- refresh: checked F1DB, nothing new by @lap-ledger-refresh[bot] in #964
- AF-88: declare Hadjar's no-time SQ3 at Singapore 2026 to the SQ cut check by @Alex-Farley in #967
- UR-14: name the entrants, chassis, engines and tyres on the season page by @Alex-Farley in #973
- harvest: refresh from F1DB v2026.17.0 3c980fd5 by @lap-ledger-refresh[bot] in #975
- Bump source-map-js from 1.2.1 to 1.2.2 in /web by @dependabot[bot] in #837
- AF-89+CR-75: open refresh.yml's alarm as an item of the queue by @Alex-Farley in #979
- AF-99+AF-105: gate the post-merge steps on MERGED; let a refresh merge first by @Alex-Farley in #992
- AF-107: a tidy lane for XS items beside D-20, and local web tests by page by @Alex-Farley in #994
- AF-108: read the plan's usage before each item and pace to it by @Alex-Farley in #995
- AF-104+AF-103: a self-check before review, and the precheck refuses a lowered floor without a ruling by @Alex-Farley in #996
- AF-90: a refresh with one failing race publishes the rest and holds back only that race's failing rows by @Alex-Farley in #997
- refresh: checked F1DB, nothing new by @lap-ledger-refresh[bot] in #999
- AF-100: compare the prose around the tables in both renderers by @Alex-Farley in #1001
- AF-102: check the credits' statements of source against the rows' sources by @Alex-Farley in #1002
- AF-101: sweep every smoke route for overflow at 320, 375, 768 and 1180 by @Alex-Farley in #1006
- AF-106: record every rerun of a flaky check, and fix the palette focus handover that flaked on #975 by @Alex-Farley in #1007
- IA-31: the footer is four short lines, and the account it cut stands on /data by @Alex-Farley in #1009
- CR-77: a constructor's base spells its country from the registry by @Alex-Farley in #1011
- AF-111: an open refresh alarm heads Now, not its foot by @Alex-Farley in #1016
- PD-54: build the CC BY 4.0 facts artefact and publish it beside f1.db by @Alex-Farley in #1017
- PD-55: say what the facts artefact is on /data, in LICENSE-DATA and in ATTRIBUTION.md by @Alex-Farley in #1019
- refresh: checked F1DB, nothing new by @lap-ledger-refresh[bot] in #1022
- VD-86+VD-98: the design system's unowned core rules, and no sticky heads on a wide table by @Alex-Farley in #1025
- v2.26: the CC BY 4.0 facts artefact, and results through the latest refresh by @Alex-Farley in #1026
Full Changelog: v2.25...v2.26