Mod manifest ​

Every mod needs a swofty.json file at its root. It describes the mod and lists the changes to apply.

Start with the mod template.

Example ​

json
{
  "schema_version": 1,
  "id": "author.my-mod",
  "name": "My Mod",
  "version": "1.0.0",
  "author": "Your name",
  "compat": { "game": "f1_25" },
  "operations": {
    "database": ["db/example.json"]
  }
}

Main fields ​

FieldMeaning
schema_versionUse 1
idUnique ID using lowercase letters, digits, ., _ or -. The swofty. prefix is reserved
name, authorDisplay name and author
versionVersion such as 1.0.0
description, license, homepageOptional description, licence identifier and link
kindOptional categories: database, erp, ui, files, native
compatGame and version requirements
requiresRequired mods, as [{"id": "swofty.core", "version": ">=0.1.0"}]
conflictsConflicting mods, as [{"id": "author.other-mod"}]
load_afterMod IDs or patterns that should load first
optionsSettings shown in the launcher and in game

compat.game is f1_25. Optional fields are game_builds (for example [">=25251167"]), launcher (a version range) and seasons (for example ["f1_2026"]).

Options ​

options declares the mod's settings. The launcher shows them in the mod's row, and the game shows them in the mod's section of MOD SETTINGS. Values are stored per profile.

json
"options": [
  { "id": "show_panel", "type": "toggle", "label": "Show panel", "default": true, "binds": "native" },
  { "id": "ai_offset", "type": "slider", "label": "AI offset", "min": -10, "max": 10, "step": 1,
    "default": 0, "binds": "native" },
  { "id": "team_livery", "type": "choice", "label": "Team livery", "default": "titlesponsor",
    "values": ["titlesponsor", { "value": "tier01", "label": "Tier 1 sponsor" }, "replica"], "binds": "db" }
]
FieldMeaning
idLowercase letters, digits and _, starting with a letter, at most 40 characters
typetoggle, slider or choice
label, descriptionText shown to players; label defaults to the id
defaulttrue or false for a toggle, a number on the slider's steps, or one of the choice values
min, max, stepSlider range. All three are required, max - min must be a whole number of steps, and a slider has at most 100 steps. Whole-number ranges hold whole numbers
valuesChoice values, 1 to 16. Each is a string, or { "value", "label" } to show a different name
bindsnative: the plugin reads the value while the game runs. db: the value is built into the game files, so a change needs a rebuild and a restart

Database operations use db options through placeholders and when conditions.

Operations ​

FieldContents
databasePaths to database operation files
erpPaths to ERP operation files
uiPaths to UI patches
filesFile copies: [{"source": "files/example", "target": "game/path"}]
nativePlugin DLLs, with dll and capabilities

Source paths are relative to the mod folder and use /. Target paths are relative to the game folder.

The installer checks the manifest and the files it names. Some operation types are still in development; see Current status.