Adding a livery
This worked example builds a whole data addon. To add a special livery as an extra choice in one car's picker, you need three changes: copy the car's model into a wep archive, add a row to the special-livery table, and add an unlock row that the launcher reports as owned.
Here you'll build RM Designs' Scuderia AlphaTauri ORLEN livery for the 2026 Racing Bulls car. You can still select the stock Racing Bulls liveries.
rm-alphatauri-livery/
├── swofty.json
├── db/
│ └── se_livery.json
└── erp/
├── livery.json
└── rm_object_opaque.nefx2.sm51.erpUse RM Designs' archive from their download as erp/rm_object_opaque.nefx2.sm51.erp, without modifying it.
1. The manifest
{
"schema_version": 1,
"id": "rmdesigns.alphatauri-orlen-livery",
"name": "Scuderia AlphaTauri ORLEN livery",
"version": "1.0.0",
"author": "RM Designs",
"kind": ["database", "erp"],
"options": [
{
"id": "picker_name",
"type": "choice",
"label": "Name in the livery picker",
"binds": "db",
"default": "lng_team_tor_hashtag",
"values": [
{ "value": "lng_team_tor_hashtag", "label": "AlphaTauri" },
{ "value": "Scuderia AlphaTauri ORLEN (RM Designs)", "label": "Literal text, no lookup" }
]
}
],
"compat": { "game": "f1_25", "game_builds": [">=25251167"], "seasons": ["f1_2026"] },
"operations": {
"database": ["db/se_livery.json"],
"erp": ["erp/livery.json"]
}
}The picker_name option gives you a db choice to fill {{picker_name}} in the livery row. Using the stock text tag lng_team_tor_hashtag makes the name show in every language.
2. The livery row and the unlock row
Give your special livery a row in customisation.custom_se_liveries.se_liveries. Its wep_override tells the car which archive to load: _barcelona_26 on toro_rosso_2026 loads teams/toro_rosso/wep/toro_rosso_barcelona_26.erp. That stock archive holds no car yet. You'll also need an unlock row to point the inventory at your new livery.
{
"schema_version": 1,
"ops": [
{
"op": "add-row",
"table": "customisation.custom_se_liveries.se_liveries",
"from": "customisation.custom_se_liveries.se_liveries.se_livery[_metadata_=toro_rosso_miami_2026]",
"set": {
"_metadata_": "toro_rosso_rm_alphatauri_2026",
"id": "22",
"wep_override": "_barcelona_26",
"name_loc_tag": "{{picker_name}}",
"desc_loc_tag": "{{picker_name}}",
"ui_priority": "22"
}
},
{
"op": "add-row",
"table": "unlockable_content.unlockable_items.unlockable_item_list_2.folder_23",
"from": "unlockable_content.unlockable_items.unlockable_item_list_2.folder_23.unlockable_se_livery[_metadata_=toro_rosso_miami_26]",
"set": {
"_metadata_": "toro_rosso_rm_alphatauri_2026",
"customisation_item": "toro_rosso_rm_alphatauri_2026",
"statId": "5280"
}
}
]
}The first op copies the stock Miami 2026 livery row, giving your livery a new label, id and archive. The second copies Miami's unlock row and points it at your livery. Choose a statId that no other unlock row uses.
add-row copies every key of the source row, so the copies need no fields list. See Add a row.
3. The car
Now fill the empty toro_rosso_barcelona_26.erp wep archive. Use copy-resource to copy each of the car's resources from RM Designs' archive:
{
"schema_version": 1,
"ops": [
{
"op": "warn",
"message": "Scuderia AlphaTauri ORLEN by RM Designs: Racing Bulls 2026 special livery in toro_rosso_barcelona_26"
},
{
"op": "copy-resource",
"source": "erp/rm_object_opaque.nefx2.sm51.erp",
"erp": "2025_asset_groups/f1_2026_vehicle_package/teams/toro_rosso/wep/toro_rosso_barcelona_26.erp",
"resource": "eaid://f1_2026_vehicle_package/teams/rbswapc/idf/rbswapc.idf?lod=all&ib=0"
}
]
}You'll need one copy-resource per resource in the full file: the model's index and vertex buffers, its materials and textures, the two cf_pattern_6 textures, and RM Designs' world and layers. To find what to copy, list the archive's resources with tools/erp.py (Look inside an archive).
4. Ownership
Your livery only appears in the picker when the player's inventory marks its unlock as owned. The ownership key comes from the djb2 hash of eSELivery followed by the unlock row's _metadata_ label. For toro_rosso_rm_alphatauri_2026, that gives you 0xf01d03c7.
The launcher handles ownership when you build the profile. It compares the built database with the stock one and writes every unlockable_se_livery row an addon adds to a folder under unlockable_content.unlockable_items.unlockable_item_list_<n> to owned_items in swofty/settings.json:
"owned_items": [
{ "key": "0xf01d03c7", "addon": "rmdesigns.alphatauri-orlen-livery", "what": "se_livery 22" }
]SwoftyMod reports these keys as owned in game. If a stock row already gives the same key, it's left out and you get a warning. If two rows give the same key, it's reported once.
5. Build and check
Install your addon, enable it, then build:
swofty addons install ./rm-alphatauri-livery
swofty addons enable rmdesigns.alphatauri-orlen-livery
swofty buildCheck the build output for the warn message and one line per owned item:
items: rmdesigns.alphatauri-orlen-livery unlock row toro_rosso_rm_alphatauri_2026 (se_livery 22) is reported as owned, key 0xf01d03c7In game, you'll find the livery in the Racing Bulls car's picker. If it's missing while the stock Miami and Suzuka 2026 liveries show, the rows loaded but the ownership check hid your livery. Check owned_items in the session's swofty/settings.json.
To share your livery, package the addon as a .swoftyaddon (Package it).
Reference
- Game database and Textures and models: the two kinds of operation this addon uses.
- Database operations and ERP operations: every field of
add-rowandcopy-resource. - Addon settings: the
picker_namechoice.