Custom databases

A database is the whole world the game races in: the grid, the circuits, the calendar, the economy and the balance. You can build one of your own — a different grid, another series, a rebalance — and the game will start a career from it.

For game version 1.0.3 · database format 7 · this page is in English only

Download the starter file

Start from this file, not from an empty one. Nobody builds sixteen teams and twenty-four circuits from a bare schema — take ours and change it. It is the database the game ships with, carrying a name of its own so the game will accept it beside the built-in one, and it imports cleanly before you have edited a single row.

Starter database

SQLite 3 · about 11 MB · database format 7

Download
What is in it
Teams on the grid11
Drivers racing them22
Drivers in the file, with the reserves and the retired140
Circuits24
Calendar rounds24
Written decisions, with 1,384 answers586
Sponsors250
Balance settings you can tune444

How it works

One fact explains everything else on this page: a database is the whole world, and a career is a copy of it.

When a career starts, the game copies the database you chose, byte for byte, and that copy becomes the career. It is brought forward if it was made for an older version of the game, and after that it is never reconciled with anything again. So a database is not a patch applied over the game — it is the game's content, complete, and a career built from one keeps it for good.

Three things follow, and they are the ones people are surprised by:

  • Editing or removing a database never changes a career already in progress. The career has its own copy.
  • A database has to be complete on its own. There is no falling back to the built-in one for the parts you left out.
  • Your edits reach a career only when a new career is started from the file.

Quick start

  1. Download the starter file above.
  2. Open it in any SQLite tool — DB Browser for SQLite, the sqlite3 command line, a Python script, whatever you already use.
  3. Change what you want, keeping to the rules below. Give it a new db_name and db_version in the settings table.
  4. Put the file on your phone: a cable, a cloud drive, an email to yourself.
  5. In the game: main menu → Databases → Import Database, pick the file, and confirm what it shows you.

The game checks the file when you import it and, if it refuses, tells you exactly which rule the file broke. Nothing is destroyed by a bad import: the file is simply not added.

Name and version

Three rows in the settings table describe the file. Two are yours; one belongs to the app.

RowWho sets itWhat it is for
db_nameYouThe name the player sees, in the menu and on the Databases screen.
db_versionYouThe version the player sees. A label — never compared, never gates anything.
schema_versionThe appWhich database format the file is in. Leave it as the starter has it.

Together, the name and the version are the file's identity, and the game refuses to install two databases with the same pair. It already holds the built-in one, so a byte copy of it is refused as a duplicate — which is exactly why the starter file arrives with a name of its own. When you publish a new cut of your database, change the version, or players who already have the old one cannot install it.

schema_version is different in kind. A file made for an older game is brought forward automatically and needs nothing from you. A file from a newer game cannot be made to fit and is refused — migrations only run forwards. This page documents format 7.

World and career

Every table ships in the starter file. Some hold the world; some hold the career that will be played in it, and those have to go out the way the starter file has them — empty, or at their starting values.

The world — edit freely

The grid, the circuits, the calendar, the economy, the written decisions and the balance. A career is written into category 1, so that is the series every rule below is about. The second category in the starter file is cosmetic: its teams have no cars and nothing about it is checked.

The career — leave alone

Results, memories, messages, signed sponsors, family and season records are written as a career is played, and a database you hand to someone else should ship them empty. player_settings keeps its rows, with the starting values the starter file has; the game writes the real ones when the career is created. In settings, the rows without a comment are identity and per-save flags rather than balance — leave those alone too, and keep debug at 0.

The tables

What each table is, how many rows the starter file has, and whether it holds the world or the career. Open one to see its columns; the ones marked required are the columns the game reads, and a file missing one of them is refused.

TableHoldsRowsWhat it is
businessesWorld1What a driver can invest in, and what it returns.
carsWorld26Two per team — power, aerodynamics, chassis, reliability.
categoriesWorld2The series. A career is always written into category 1.
driver_assignmentsWorld9Which seat each driver is assigned to.
driver_seasonsAdded on open0Season-by-season record per driver. Added by a migration; ship empty.
driver_skillsWorld116The twelve skills that decide how a driver races.
driver_statsWorld140Career totals: starts, wins, poles, titles.
driversWorld140Everyone on the grid, their contract and their standing.
familiesCareer0The driver's family. Ship empty.
interaction_answersWorld1,384The answers to those decisions, and their effects.
interactionsWorld586The written decisions, one text column per language.
lifestylesWorld44What a driver can own, and what it costs to keep.
memoriesCareer0What a career remembers. Ship empty.
messagesCareer0The inbox. Ship empty.
player_settingsCareer15The player's week, year, money and energy. Keep the rows; leave the starting values.
player_sponsorsCareer0Sponsors actually signed. Ship empty.
race_resultsCareer0Written as races are run. Ship empty.
race_seasonsWorld24The calendar: a race, in a season, for a category.
race_weekend_settingsCareer8The current weekend's state. Leave at defaults.
racesWorld24A race at a place, on a track, with its own weather odds.
settingsWorld452Rows with a comment are the balance. Rows without are identity and per-save flags.
sponsorsWorld250The sponsor market and the deals it offers.
teamsWorld16The constructors: prestige, money, colours and logos.
track_decorationsAdded on open649Scenery. Added by a migration; only backfilled from our artwork for careers descended from the bundled file.
track_knotsWorld981The racing line, as a curve of positioned knots.
track_pit_knotsWorld192The pit lane, as a curve of its own.
track_sectorsWorld72Where each sector ends, as an index into the knots.
tracksWorld24The circuit: grip, wear, scale, and the four pit markers.

Columns

businessesWorld · 1 rows

What a driver can invest in, and what it returns.

ColumnType
idinteger required
namevarchar required
imagetext required
levelinteger required
incomeinteger required
baseinteger required
is_ownertinyint(1) required
carsWorld · 26 rows

Two per team — power, aerodynamics, chassis, reliability.

ColumnType
idinteger required
team_idinteger required
driver_idinteger required
powerinteger required
aerodynamicsinteger required
chassisinteger required
reliabilityinteger required
categoriesWorld · 2 rows

The series. A career is always written into category 1.

ColumnType
idinteger required
namevarchar required
prestigeinteger required
logotext required
driver_assignmentsWorld · 9 rows

Which seat each driver is assigned to.

ColumnType
idinteger required
driver_idinteger required
assignmentvarchar required
driver_seasonsAdded on open · 0 rows

Season-by-season record per driver. Added by a migration; ship empty.

A migration creates this table on the phone, so a file without it still imports.

ColumnType
idinteger
driver_idinteger
seasoninteger
team_idinteger
wdc_positioninteger
wcc_positioninteger
pointsinteger
winsinteger
podiumsinteger
driver_skillsWorld · 116 rows

The twelve skills that decide how a driver races.

ColumnType
idinteger required
driver_idinteger required
defendinginteger required
accuracyinteger required
focusinteger required
corneringinteger required
overtakinginteger required
qualifyinginteger required
speedinteger required
tire_managementinteger required
staminainteger required
awarenessinteger required
intelligenceinteger required
driver_statsWorld · 140 rows

Career totals: starts, wins, poles, titles.

ColumnType
idinteger required
driver_idinteger required
seasonsinteger required
racesinteger required
winsinteger required
polesinteger required
podiumsinteger required
titlesinteger required
dnfinteger required
pointsinteger required
driversWorld · 140 rows

Everyone on the grid, their contract and their standing.

ColumnType
idinteger required
team_idinteger required
countryvarchar required
numberinteger required
birth_yearinteger required
reputationinteger required
learninginteger required
confidenceinteger required
experienceinteger required
prestigeinteger required
relationshipinteger required
contract_untilinteger required
statusvarchar required
namevarchar required
pointsinteger required
wdcinteger required
wccinteger required
expected_numberinteger required
familiesCareer · 0 rows

The driver's family. Ship empty.

ColumnType
idinteger required
is_eternaltinyint(1) required
is_deadtinyint(1) required
importanceinteger required
relationshipinteger required
kindvarchar required
namevarchar required
interaction_answersWorld · 1,384 rows

The answers to those decisions, and their effects.

Only the English text is required. The other languages are used when present and fall back to English.

ColumnType
idinteger required
interaction_idinteger required
text_envarchar required
text_ptvarchar
text_esvarchar
text_devarchar
text_itvarchar
text_frvarchar
text_zhvarchar
text_trvarchar
text_ruvarchar
text_javarchar
text_nlvarchar
effectsvarchar required
interactionsWorld · 586 rows

The written decisions, one text column per language.

Only the English text is required. The other languages are used when present and fall back to English.

ColumnType
idinteger required
whovarchar required
windowvarchar required
question_envarchar required
question_ptvarchar
question_esvarchar
question_devarchar
question_itvarchar
question_frvarchar
question_zhvarchar
question_trvarchar
question_ruvarchar
question_javarchar
question_nlvarchar
conditionsvarchar required
writes_memoryvarchar required
cooldown_weeksinteger required
weightinteger required
lifestylesWorld · 44 rows

What a driver can own, and what it costs to keep.

ColumnType
idinteger required
categoryvarchar required
namevarchar required
is_ownertinyint(1) required
imagetext required
maintenanceinteger required
priceinteger required
memoriesCareer · 0 rows

What a career remembers. Ship empty.

ColumnType
idinteger required
typevarchar required
valuevarchar required
timesinteger required
last_timeinteger required
messagesCareer · 0 rows

The inbox. Ship empty.

ColumnType
idinteger required
typevarchar required
item1varchar required
item2varchar required
item3varchar required
is_readint required
variationint required
player_settingsCareer · 15 rows

The player's week, year, money and energy. Keep the rows; leave the starting values.

ColumnType
idinteger required
itemvarchar required
valuevarchar required
player_sponsorsCareer · 0 rows

Sponsors actually signed. Ship empty.

ColumnType
idinteger required
sponsor_idinteger required
racesinteger required
rewardinteger required
objectivevarchar required
targetinteger required
bonusinteger required
race_resultsCareer · 0 rows

Written as races are run. Ship empty.

ColumnType
idinteger required
race_season_idinteger required
driver_idinteger required
positioninteger required
pointsinteger required
has_fastest_laptinyint(1) required
has_finishedtinyint(1) required
qualifying_positioninteger required
team_idinteger required
race_seasonsWorld · 24 rows

The calendar: a race, in a season, for a category.

ColumnType
idinteger required
race_idinteger required
seasoninteger required
weekinteger required
lapsinteger required
weathertext required
category_idinteger required
race_weekend_settingsCareer · 8 rows

The current weekend's state. Leave at defaults.

ColumnType
idinteger required
itemvarchar required
valuevarchar required
racesWorld · 24 rows

A race at a place, on a track, with its own weather odds.

ColumnType
idinteger required
nametext required
countrytext required
rain_chanceinteger required
weather_stabilityinteger required
track_idinteger required
settingsWorld · 452 rows

Rows with a comment are the balance. Rows without are identity and per-save flags.

ColumnType
idinteger required
itemvarchar required
valuevarchar required
commenttext required
sponsorsWorld · 250 rows

The sponsor market and the deals it offers.

ColumnType
idinteger required
namevarchar required
reputationinteger required
logotext required
offerinteger required
racesinteger required
offer_objectivevarchar required
offer_targetinteger required
offer_bonusinteger required
logo_darktext added on open
teamsWorld · 16 rows

The constructors: prestige, money, colours and logos.

ColumnType
idinteger required
category_idinteger required
namevarchar required
cartext required
logotext required
icontext required
prestigeinteger required
wealthinessinteger required
planninginteger required
primary_colorvarchar required
secondary_colorvarchar required
pointsinteger required
wdcinteger required
on_primary_colorvarchar required
wccinteger required
relationshipinteger required
on_secondary_colorvarchar added on open
logo_darktext added on open
icon_darktext added on open
track_decorationsAdded on open · 649 rows

Scenery. Added by a migration; only backfilled from our artwork for careers descended from the bundled file.

A migration creates this table on the phone, so a file without it still imports.

ColumnType
idinteger
track_idinteger
typevarchar
xreal
yreal
rotationreal
zinteger
infotext
track_knotsWorld · 981 rows

The racing line, as a curve of positioned knots.

ColumnType
idinteger required
track_idinteger required
position_xreal required
position_yreal required
position_zreal required
tangent_in_xreal required
tangent_in_yreal required
tangent_in_zreal required
tangent_out_xreal required
tangent_out_yreal required
tangent_out_zreal required
rotation_xreal required
rotation_yreal required
rotation_zreal required
rotation_wreal required
track_pit_knotsWorld · 192 rows

The pit lane, as a curve of its own.

ColumnType
idinteger required
track_idinteger required
position_xreal required
position_yreal required
position_zreal required
tangent_in_xreal required
tangent_in_yreal required
tangent_in_zreal required
tangent_out_xreal required
tangent_out_yreal required
tangent_out_zreal required
rotation_xreal required
rotation_yreal required
rotation_zreal required
rotation_wreal required
track_sectorsWorld · 72 rows

Where each sector ends, as an index into the knots.

ColumnType
idinteger required
track_idinteger required
knot_endinteger required
tracksWorld · 24 rows

The circuit: grip, wear, scale, and the four pit markers.

ColumnType
idinteger required
imagevarchar required
grid_spacingreal required
tire_degradationint required
fuel_consumptionint required
pit_knot_startint required
pit_knot_endint required
pit_knot_stopint required
pixel_per_meterreal required
pit_knot_lapint required
left_sidetinyint required
bottom_sidetinyint required
track_typevarchar added on open

A few columns and two tables are added by a migration when the file is opened on the phone, so a database authored against an older game need not have them. Everything else on this list has to be there.

What the game refuses

The file is checked on import. The game stops at the first problem and shows its message, so fix them one at a time — or read the whole list first and save yourself the round trips. Every rule about the world is about category 1.

CodeThe ruleWhat the player sees
missing_tableEvery table below exists.This file has no 'T' table, so it is not a game database.
missing_columnEvery required column exists.The 'T' table has no 'C' column, which the game reads.
schema_too_newschema_version is at most 7.This database was made for a newer version of the game (its format is N, this version reads up to M). Update the game to use it.
no_categoryA row in categories with id 1.There is no category with id 1, which is where a career starts.
too_few_teamsAt least 2 teams in category 1.Category 1 has N team(s); a grid needs at least 2.
driver_without_teamEvery driver with a team sits on a team that exists.Driver 'D' is on team N, which does not exist.
team_short_of_driversEvery category 1 team has 2 drivers with status active.Team 'T' has N active driver(s); every team needs 2 to fill its cars.
team_short_of_carsEvery category 1 team has 2 cars.Team 'T' has N car(s); every team needs 2.
car_without_driverEach car's driver is an active driver on that team.Car N on team 'T' belongs to driver M, who is not an active driver on that team.
driver_without_skillsEvery active driver has a driver_skills row.Driver 'D' has no row in driver_skills, so the game cannot race them.
no_tracksAt least one track.There are no tracks to race on.
track_short_of_knotsEvery track has at least 3 knots.Track N has K knot(s); a track needs at least 3 to draw.
track_without_sectorsEvery track has at least one sector.Track N has no sectors.
sector_off_trackEvery sector's knot_end is a real knot index.Track N: sector S ends at knot E, but the track has K knots (numbered 0 to K-1).
track_short_of_pit_knotsEvery track has at least 2 pit lane knots.Track N has K pit lane knot(s); it needs at least 2.
pit_marker_off_trackThe four pit markers index knots that exist.Track N: pit_knot_X is V, but the track has K knots (numbered 0 to K-1).
no_racesAt least one race.There are no races.
race_without_trackEvery race's track exists.Race 'R' is on track N, which does not exist.
no_calendarAt least one calendar round for category 1.There is no race calendar for category 1: race_seasons has no rows for it.
round_without_raceEvery round's race exists.A round in the calendar points at race N, which does not exist.
not_sqliteThe file opens as SQLite.This file is not a database the game can read.
already_installedNo installed database shares its name and version.'N' version V is already installed. Change the version in the file if this one is different.

What is not checked is worth knowing too. Nothing looks at values that are merely strange: a driver with every skill at 100, two knots on top of each other, a sponsor that pays nothing. The game will run all of it. These rules are the floor under a career that can be created and raced at all — the starter file is the reference for what sensible looks like.

Importing it

Main menu → Databases → Import Database. The system file picker opens — the Files app on iOS, the document picker on Android — and both reach your downloads, your storage and any cloud drive you have installed. Every kind of file is offered, because .sqlite is not a file type either platform recognises; the check that matters is the one above.

Once you pick a file the game reads it and shows what it found: the name, the version, and how many teams, drivers and circuits are in it. Adding it is a separate confirmation.

Adding is not choosing. A database you add appears in the list, and you tap it to make it the one new careers start from; with more than one installed, the game asks which to use when a career begins. Removing a database leaves every career built from it untouched — again, the career has its own copy.

The game only ever reads a file from your own device. It cannot download a database and it cannot share one, so a database travels the way any other file does.

Notes and limits

  • Circuit geometry is fiddly. Knots are the curve of the track, sectors end on a knot index, and the pit lane is a curve of its own. The four pit_knot_* columns on a track are indices into those curves, not row ids — two of them index the track, two the pit lane.
  • Scenery is ours. track_decorations is only filled in from the game's own artwork for careers descended from the built-in database, so circuits in a database of your own have exactly the scenery you give them.
  • Text is per language. The decision tables carry a column per language. Only English is required; the rest are used when present and fall back to English.
  • Balance lives in settings. Every tunable the simulation reads is a row there, marked by having a comment. A rebalance with nothing else changed is a perfectly good database.
  • Keep the format row. Leave schema_version as the starter file has it. It is the app's, not yours.

Something not working?

If the game refuses a file and the message does not explain why, or a database behaves in a way this page does not describe, write to us from the support page — include the refusal message and what you changed, and we will work it out.

Back to the site · Support · Privacy Policy · EULA