Skip to content
Formation Theory

Make your own datapack

A datapack is a world for Formation Theory to be played in - its countries, leagues, clubs, players, coaches, fixtures and cups. The game lists every datapack it finds when it starts, and the one you choose is the world your career is played in.

What a datapack is

A folder with two files in it:

My World/
  datapack.json   the name, date and description the game lists
  game.db         the world itself, a SQLite database

A whole world

Clubs, squads, coaches, leagues, fixtures and cups, in the same shape as the world the game ships with.

Its own career

Every datapack keeps a career of its own. Switching worlds never touches another world's save.

Played offline

The transfer market, the club's Balance, coins and boosts are on the built-in world only.

Quick start

The easiest way to make a datapack is to start from the world the game ships with and change it.

  1. 1

    Play the built-in world once

    Start the game and pick the built-in world, so it copies its world out to your computer.

  2. 2

    Copy its world.db

    Make a folder for your datapack inside the datapacks folder, copy world.db from the game's folder into it and rename it game.db.

  3. 3

    Change what you like

    Open game.db in a SQLite editor - DB Browser for SQLite is free and is all you need - and rename clubs, edit players, move squads.

  4. 4

    Name it and play

    Write a datapack.json beside it, start the game, and pick your datapack from the list.

The game's folder is the one above datapacks - see where datapacks go. DB Browser for SQLite is at sqlitebrowser.org.

datapack.json

What the start-up list shows for your datapack:

{
  "name": "Lower Leagues 2026",
  "date": "2026-09-14",
  "description": "Every club two divisions down, with the squads of the season's first day.",
  "author": "Your name"
}
FieldWhat it is
nameWhat the list calls it. Without one, the folder's name is used.
dateWhen it was made, or the day it describes, as YYYY-MM-DD. Shown as “14 Sep 2026”.
descriptionA sentence or two, shown in full under the name.
authorOptional. Shown as “by …” beside the date.

The file is optional - a folder holding only a game.db is listed under the folder's name - but a datapack without a date or a description is hard to choose.

The start-up list

Every time the game starts it reads the datapacks folder and asks which world to play in. The built-in world is always first; the datapacks follow by name, with the ones that cannot be played after the rest.

  • The name, then the date and by the author, then the description - or No description. when there is none.
  • How big the world is, read from its own game.db: its countries, its clubs and its season.
  • The career saved on it, in green: the manager and the date the career has reached.
  • A datapack that cannot be played is dimmed, with the reason in red - see what each one means.

Beneath the list are the datapacks folder's full path, a link to this page and, on a computer, an Open folder button. The world you choose is remembered and ticked at the next start.

The game's start-up list: the built-in world with a career in progress, a datapack called Lower Leagues 2026, and a dimmed one with the reason it cannot be played

What you can change

Anything in the data, as long as the shape stays the same: the game reads the tables and columns by name.

  • Names - clubs (teams.name, short_name, city, stadium), players (first_name, last_name), coaches (staff), leagues, cups and countries. The commonest datapack, and the safest.
  • Clubs - capacity, reputation, budget_transfer, budget_wage, and the kit's primary_color and secondary_color as #rrggbb.
  • Players - every ability runs 1 to 99. overall is what lists show, so change it with the abilities; potential is a hidden talent from 1 to 100. A player plays for the club in team_id.
  • New players - give each a new id under 9,000,000 (the game numbers its academy players from 9,000,000 and the market's from 10,000,000) and a squad_number free at his club.
  • New fixtures - keep their id under 10,000,000: the game stores the cup ties it draws from there up.

Rules a world keeps

Break one of these and a club cannot field a side, or a season cannot be played.

Every club needs at least

By detail_position, so that it can line up in every formation the game has:

1 GK1 DL3 DC1 DR2 DM1 ML3 MC1 MR2 AMC1 AML1 AMR2 SC

Only a player's detail_position counts - the roles in alt_positions do not. The built-in world gives every club twenty-six players; thirty is the most a squad may hold.

  • Every league's fixtures are complete: each club plays each other club home and away, matchday runs from 1, a club plays once on a date, and every date is in the season. leagues.team_count is the number of clubs in it.
  • Results stay out of the world: leave played, home_score and away_score as they are and league_table at zeros. The game keeps results with the career.
  • The meta table carries schema_version, season (e.g. 2026/27) and season_start (2026-08-08). Leave schema_version alone: it says which version of the game the world was made for.

The tables and columns the game reads

A world without one of these tables is listed dimmed and cannot be chosen:

metacountriesleaguesteamsplayersstafffixturescupscup_roundscup_entriesleague_places
The 36 columns of players

Checked when a datapack is opened; the first one missing is named. Other tables are read the same way, so keep every column of the game's own world.db.

idteam_idfirst_namelast_namenationality_idbirth_datepositiondetail_positionalt_positionssquad_numberpreferred_footagilityspeedshootingpassingdribblingdefendingheadingphysicalstaminagoalkeepingambitionleadershippositioningcomposureaggressionmarkingexperienceoverallpotentialvaluewagecontract_untilmoraleconditionform

Moving a club to another league, adding a league or changing the cups means changing the fixtures, the cup rounds and the cup entries to match - possible, but check your work by playing a few matchdays.

Where datapacks go

Each datapack is one folder inside the datapacks folder. The game's start-up list shows the full path, and on a computer its Open folder button opens it.

Windows
%APPDATA%\Godot\app_userdata\Formation Theory\datapacks\
macOS
~/Library/Application Support/Godot/app_userdata/Formation Theory/datapacks/
Linux
~/.local/share/godot/app_userdata/Formation Theory/datapacks/
Android

The datapacks folder is in the app's private storage, which a file manager cannot reach. Datapacks on Android are not supported yet without developer tools.

Careers and datapacks

  • Each datapack keeps a career of its own. Starting the game on another world never touches the career on this one, and the list says which worlds have a career in progress, with the manager and the date.
  • The career is kept by the datapack's folder name. Rename the folder and the game sees a new datapack with no career; rename it back and the career is there.
  • Replacing a datapack's game.db updates its world under the career. Keep the ids of everything that already exists, or the career will look for players and fixtures that are no longer there.
  • The transfer market, the club's Balance, coins and boosts are played on the built-in world only. Every price and budget on the server is worked out from that world, so a career on a datapack plays offline: matches, the squad, tactics, training, the cups and the calendar all work, and the screens that need the server say why they cannot be used.

When a datapack cannot be chosen

A datapack the game cannot play is still listed, dimmed, with the reason in red beneath it. What each one means:

There is no game.db in the folder.

The world has to be called game.db, directly inside the datapack's folder - not in a folder of its own inside it.

datapack.json is not valid JSON.

A missing comma or quote. Paste the file into any JSON checker; it will point at the line.

game.db could not be opened.

The file is not a SQLite database, or another program has it open. Close your SQLite editor and start the game again.

game.db is not a Formation Theory world: it has no … table.

A table the game reads is missing. Start again from the game's own world.db rather than an empty database.

Made for world v… - this version of the game reads v…

The world was made for another version of the game. Remake it from the world.db of the version you are playing - Settings' World data row shows which version that is.

The world's meta table has no … row.

The meta table needs schema_version, season and season_start. Copy them from the game's own world.db.

The world has no clubs.

The teams table is empty.

The datapack's players have no … column.

A column of the players table was dropped or renamed. Shown when the datapack is opened; put the column back.

The datapack's game.db is gone.

The datapack was chosen, then its game.db was moved or deleted before the game opened it. Put it back, or start the game again and choose another world.