Skip to content

The pre-1.0 database against post-1.0's own tables

From the aowlspt repository — docs/POST1-DATA-DELTA.md

Published from aoughwl/aowlspt with only its links repaired. It was written for someone with the checkout open, so it is terse and points at source files by path — browse the tree as you read. A few of the documents it cites were held back from publication and are not here.

The manual · The aowlspt section

mods/tarkov serves a database imported from a pre-1.0 SPT install (IMPORTDB.md) to a post-1.0 client (build 1.1.0.1.46777). That has always been the compromise, and until now nobody could say how large it was, because the only post-1.0 copy of the data was inside BSG's servers.

On 2026-08-19 the real backend's responses were decrypted. data/capture/raid1 now holds one account's full menu session — 220 exchanges — with the bodies in plaintext, and among them are the tables the emulator answers out of db.json. So the question stops being an opinion.

The headline: the SPT data is closer than expected, and nothing the emulator reads has been taken away. The gap is almost entirely additive — 1,154 item templates, 6 traders, 5 maps and 8,545 English strings that post-1.0 has and pre-1.0 does not — plus a large number of small numeric rebalances. There is no schema break in items, locations, globals, traders, the handbook, customization or settings. The one shape change that matters is in quests, and the one table that is a real hole is locations.paths, which is empty for a reason that predates all of this.

What was compared, and against what

tableroutecapture filedecodedwhat it is compared with
items/client/itemsresponses/large/045.json18.3 MBtemplates.items
locale (en)/client/locale/enlarge/043.json2.8 MBlocales.global.en
locations/client/locationslarge/134.json1.7 MBlocations.<name>.base
globals/client/globalslarge/084.json913 KBglobals
customization/client/customizationlarge/046.json587 KBtemplates.customization
quests/client/quest/listlarge/444.json526 KBtemplates.quests
handbook/client/handbook/templateslarge/082.json446 KBtemplates.handbook
settings/client/settingslarge/037.json387 KBsettings.config
traders/client/trading/api/traderSettingsresponses/071.json39.7 KBtraders.<id>.base
one map, in full/client/match/local/startresponses/158.json115 KBlocations.sandbox.base
dialogue/client/dialoguelarge/076.json13.3 MBnothing — SPT has no equivalent

The database side is build/db/db.json, 41,313,127 bytes, imported from D:\SPT on 2026-08-19 — the same file IMPORTDB.md describes. The route for each seq is data/capture/raid1/manifest.json; every number below was produced by reading those two files, not by recall.

responses/158.json is why this document does not repeat an easy mistake./client/locations is a trimmed map list — it drops 23 fields that a map's base actually has. Diffing only against it reports twenty-three fields as "removed post-1.0", including GlobalLootChanceModifier, which emu/loot reads. /client/match/local/start carries the same map's base in full, and all 23 are in it. The location comparison below is against the union of the two.

1. Items

SPT templates.items   4,673
BSG /client/items     5,827
count
ids in both4,673
in BSG, not in SPT (new post-1.0)1,154
in SPT, not in BSG (removed)0
of the 4,673 common, _props identical1
_props differ only by post-1.0 boilerplate1,718
_props differ substantively2,954

Not one pre-1.0 template was deleted. _type is unchanged on all 4,673; _parent moved on exactly one (67586b7e49c2fa592e0d8ed9, item_barter_other_saladbox, from Other to Item); _name on five.

The boilerplate

Three properties account for the 1,718, and appear in almost every other diff as well:

propertyitemsdirection
IsNotDeletableFromQuestStashAfterQuestComplete4,672new in post-1.0
RagfairLevelToTrade4,672new in post-1.0
DropSoundType4,577gone in post-1.0
CategoryAnimationModId2,044new in post-1.0

DropSoundType is the only item property post-1.0 removed — 461 distinct property names in the SPT data, 493 in BSG's, and the SPT-only set has exactly one member. Nothing in mods/tarkov reads it (§6).

The substantive changes

Ranked by how many templates each touches, excluding the four above:

propertyitems changedwhat it is
Slots1,240mounting points and their compatibility filters
Ergonomics1,052median |Δ| 3.0, max 45
Recoil628median |Δ| 2.0, max 17
DiscardLimit324median |Δ| 1, max 80,000
CanSellOnRagfair272flea eligibility
StackMaxSize247median |Δ| 20, max 50
ConflictingItems242
RepairCost230median |Δ| 190, max 859
WeaponAimSettings177new property, weapons only
AudioSettings177new property, weapons only
RicochetParams174
Velocity155median |Δ| 3.34, max 53
Chambers147
Weight144median |Δ| 0.20 kg, max 9.65 kg
ItemSound143
Name / ShortName / Description135 eachthe untranslated key strings
LoadUnloadModifier135
RarityPvE130
CheckTimeModifier129
MaskSize / FaceCoverMask124 / 120new, face covers

Slots is the largest number and the least alarming one. Of the 1,180 templates whose Slots array differs, 545 differ only by two new booleans BSG added to every slot object, _isPatronSlot and _isPlateSlot. Of the remaining 635, 628 gain filter entries and 10 lose any — that is post-1.0 declaring the 1,154 new attachments compatible with weapons that already existed. It is not a restructuring; the slot object and the filter object have identical key sets on both sides.

The one type change across 4,673 × ~460 properties is 544fb37f4bdc2dee738b4567 (painkiller): effects_health went from {"Hydration":{"value":-19}} to []. Both shapes already coexist in both datasets (SPT: 48 objects / 424 empty arrays; BSG: 52 / 460), and emu/health reads it by path, so it degrades to "no effect" rather than to a crash.

Change size, per template

properties changedtemplates
01
1–20
3–53,372
6–101,179
11–2526
26+95

The 3,372 in the 3–5 band are the boilerplate band. The 95 at the top are all _type: Node — the abstract prototypes (Weapon, Meds, AmmoBox, SpecialWeapon, Equipment) — and they are not a post-1.0 change at all: SPT's export strips a Node's inherited defaults, so SpecialWeapon has 0 properties in SPT and 169 in BSG's. The client resolves prototypes from the leaf, so this has never mattered; it is listed because it would otherwise look like the worst regression in the table.

The single template that is byte-identical is 6050cac987d3f925bf016837.

The 1,154 new templates

1,148 are Item, 6 are Node. Grouped by parent:

parentnewparentnew
RandomLootContainer319Barrel25
Notes82Vest25
Handguard74Headwear24
Stock46Keycard18
Info41Tapes18
Mount40Flyer18
Other37FlashHider15
BuiltInInserts32PistolGrip15
Jewelry28SpecItem15

Representative examples, by _name:

68a63ac58e1fe612970728f2  barrel_ar15_colt_m16_std_508mm
68c294800f5ebd68290d6c20  barrel_nl545_cgnl_292mm_545x39
6a3cea4494a96a17e00c4b69  barrel_type20_howa_330mm_556x45
6a3cf2f17047a606b90f532e  charge_type20_howa_type20_std
6a1d4dae46b486ac34084778  charge_ar15_hk_extended_latch_charging_handle_ral8k
68124640c5fd00ec0a01a237  gas_block_mcx_sig_mcx_mid_piston
6a157b9e5ef5195441036c12  handguard_416_geissele_smr_hk_105_inch
682315bdf8d8f8681e0744b5  handguard_ak12_tactical_ideas_n4_ak12_mlok
6932aed9be542622170428b0  handguard_ar10_kac_sr25_urx_31_135_inch
67c542c126265106dd0697ab  handguard_m1895_marlin_mxlr_std
6812180dc20f5c52bc04d6cc  handguard_mcx_lancer_oem_gen1_12_inch_mlok
69f9f111df2c2358a904186f  handguard_qbz191_norinco_191_polymer_std
680f55788692125dc00a3354  handguard_mdr_blk_lbl_alx_20_inch_bipod_mlok_blk
6a16f3711c209e26040a5410  foregrip_all_dd_vfg
69d42490d91a53e51e0f940e  gladiator_s_level3_soft_armor_groin_front
69cf9696b96c8e8d3e002925  item_equipment_armor_redut_m_black_custom_bp03
68f263f099d2172e150d7ff8  item_equipment_head_cap_eft_coyote
6a31807f17005505b70d5827  Item_barter_info_finance
6a3182b72fd891345e047eef  Item_barter_info_user
68f25c64b2b53abd200b954f  Item_barter_tarko_prapor
68f25ce9b2b53abd200b9551  Item_barter_tarko_therapist
664b81bfa322b5b99a037a03  Completable            (Node)
69f071ae35c3b5e6dd00df07  VolumetricThrowWeapon  (Node)

Two whole categories are post-1.0 mechanics with no pre-1.0 template at all: the Marlin lever-action, QBZ-191, Type 20 and NL-545 weapon families and their furniture; and the Notes / Tapes / Flyer / Info readables (159 templates) that feed the new collectible-document system.

None of the 1,154 has an English name in the SPT locale — 0 of 1,154 have an <id> Name key in locales.global.en. All but 6 have one in BSG's locale. That is the mechanism behind the "31 templates render as their id" row in BACKLOG.md, scaled up: importing the new items without the new locale would produce 1,154 more of them.

2. Structural schema differences

Items

distinct _props keys, SPT461
distinct _props keys, BSG493
SPT-only1 (DropSoundType)
BSG-only33
type changes across all common props1 (effects_health, one item)

Top-level item keys are identical on both sides (_id, _name, _parent, _props, _type, _proto). Nested objects — slot objects, filter objects, Grids, Cartridges, StackSlots — have identical key sets except that slot and chamber objects gained _isPatronSlot and _isPlateSlot.

Locations

Against /client/locations plus the full base in /client/match/local/start:

SPT base field union106
BSG base field union116
SPT-only (removed post-1.0)0
BSG-only (new post-1.0)10
type changes0

New in post-1.0:

FixedLocationWeatherSettings   PasscodeLocationSettings
ForceOfflineRaidInPVE          ProfileProgressOptions
HiddenWhenLockedByQuest        SavageForceOfflineRaidInPVE
HighLevelLocationId            SavageForceOnlineRaidInPVE
LockedByQuest                  access

LockedByQuest / HiddenWhenLockedByQuest / access are the quest-gated map mechanic (Labyrinth, Terminal); HighLevelLocationId is the SandboxSandbox_high pairing. The emulator serves whatever base holds, so a client that reads these gets undefined and falls back — a missing feature, not a wrong answer.

Values do move. On Woods: EscapeTimeLimit 40 → 35, BotMax 30 → 22, waves 16 → 2 entries, BossLocationSpawn 12 → 4. SpawnPointParams is 368 on both sides.

Globals

SPT config keys107
BSG config keys119
SPT-only, top level0
BSG-only, top level12
type changes0
SPT-only, at any depth1

New top-level config members: BattlePassUniversalDocument, ExtensionsSettings, FinalConsequenceSettings, FinalMissionSettings, GroupQuestSetting, KolotunSettings, MatchMakerEstimateSettings, MaxMatchingTimeInSeconds, PasscodeSettings, SteamStatusSettings, Tutorial, WishlistSettings.

Walking the whole tree to depth 4 finds 64 deltas and exactly one of them is a removal: config.RunddansSettings.initialFrozenDelaySec. Nothing in mods/tarkov reads it. The other 63 are additions — the new tear-gas health effects, 27 new scav customization entries, RagfairMinUserLevelByCategory, QuestSettings.Chapters, exp.ExpByGameEditionMultiplier, two new SkillsSettings.Throwing fields, and camera-shake parameters on artillery.

globals also gained one top-level sibling, InventoryTarcoinMigrationProdAllowedAids. ItemPresets went 399 → 460 (61 new, none removed); bot_presets 28 → 36.

Quests

/client/quest/list is not the quest database. BSG's response carries 22 quests; SPT's templates.quests carries 558. Seven ids are in both. This endpoint returns the quests this account can currently see, and the capture is one account four hours old. Every count in the table below is therefore a count about the shape, not about the corpus.

SPT quests558
BSG quests, in this capture22
in both7
quest fields SPT-only1 (QuestName)
quest fields BSG-only9

BSG-only fields: icon, inBufferZoneOnly, isStoryQuest, localization, mailSettings, notDisplayedQuest, notes, rewardsInfo, tierAccessory.

QuestNamelocalization is the one real schema change in this document. Post-1.0 quests carry every language inline:

json
"name":        "5d24b81486f77439c92d6ba8 name",
"localization": { "ch": { "5d24b81486f77439c92d6ba8 name": "熟人", ... }, ... }

where pre-1.0 carried a human-readable QuestName and left the client to look the key up in /client/locale/<lang>. The keys are the same strings, so an SPT-derived quest served with a populated locale table still resolves; what it loses is the per-quest override. emu/questcond.questName already reads QuestName with a name fallback (mods/tarkov/emu/questcond.nim:849-852), so it survives either shape — which is luck, not design, and worth keeping.

Condition and reward vocabularies diverge, but with 22 quests on one side that is a sampling artefact, not a schema finding. The one entry that is not: CompletableItem is an AvailableForFinish condition type post-1.0 uses and SPT's 558 quests never do; LocationUnlock and TraderDialogueUnlock are reward types with no pre-1.0 occurrence.

Traders, handbook, customization, settings

tableSPTBSGnewremovedschema change
traders (base)121860none — 33 fields, identical sets
handbook Items4,2885,0667791none
handbook Categories879030+RagfairLevelToTrade
customization7289692410+HiddenByDefault, +ProfileVersionsIgnoresSide, +ShopCustomizationUrl
settings.config313540none removed
locale en31,55033,3238,545n/a

New settings keys: CollectLoadTimeMetrics, KeepAliveStaticInterval, LobbyConnectionPercentage, SteamSyncCooldownSeconds.

774 of the 779 new handbook entries are the new item templates, so the two tables agree with each other.

Prices moved on 504 of the 4,287 common handbook entries (11.8%). The flea is priced off the handbook by deliberate choice (IMPORTDB.md), so this is the emulator's economy being 12% wrong on one axis.

The locale is the sharpest number in the document. 24,778 keys are in both, and 24,399 of them (98.5%) have identical text. The gap is 8,545 keys the post-1.0 client asks for that pre-1.0 has no string for, and 6,772 pre-1.0 keys post-1.0 dropped.

Six new traders:

67f7af56c117b6140af2a607  Player Trader
688246518448b05efd61d461  Mr. Kerman
688246958448b05efd61d462  Воевода
68fe15910f29ba3fdbba9d54  Таран
68fe15990f29ba3fdbba9d55  Радиостанция
69e0d6cc77b63940375b9173  Ученый

All six are loyalty-level-1, unlockedByDefault: false. The emulator's 12 are all present in BSG's 18 with the same 33-field base shape.

/client/dialogue — a table with no pre-1.0 equivalent

13.3 MB, 140 elements, each {Id, IsStart, MainVariable, Trader, SubTraders, Lines, StartPoints, localization}. This is post-1.0's branching trader dialogue. SPT has no counterpart: its traders/<id>/dialogue.json (4 traders) is the insurance-message locale ids emu/dialogue reads, and templates/dialogue.json is SPT's own chat-command machinery, which the importer does not read. emu/post1.nim:17-21 already names this as deliberately absent.

3. Locations, in detail

The client's own list is authoritative: raid/configuration (data/capture/raid1/requests/156.json, onlinePveRaidStates) names 24 maps, and /client/locations returns exactly those 24. The emulator's database has 19.

BSG Id_Idin db.jsonEnabled
bigmap56f40101d2720b2a4d8b45d6bigmaptrue
develop56db0b3bd2720bb0678b4567developfalse
factory4_day55f2d3fd4bdc2d5f408b4567factory4_daytrue
factory4_night59fc81d786f774390775787efactory4_nightfalse
hideout599319c986f7740dca3070a6hideoutfalse
Interchange5714dbc024597771384a510dinterchangetrue
Labyrinth6733700029c367a3d40b02aflabyrinthfalse
laboratory5b0fc42d86f7744a585f9105laboratorytrue
laboratory_dark6a294a5b5eb5f9a1700417b7absenttrue
Lighthouse5704e4dad2720bb55b8b4567lighthousetrue
Lighthouse26167f1b7948c017d936e882babsentfalse
Icebreaker69af492a4819ea4ba10a69c5absenttrue
Private Area5704e64ad2720bb55b8b456eprivateareafalse
RezervBase5704e5fad2720bc05b8b4567rezervbasetrue
Sandbox653e6760052c01c1c805532fsandboxtrue
Sandbox_high65b8d6f5cdde2479cb2a3125sandbox_hightrue
Sandbox_start68236e8153654e8c1200798aabsenttrue
Shoreline5704e554d2720bac5b8b456eshorelinetrue
Suburbs5714dc342459777137212e0bsuburbsfalse
TarkovStreets5714dc692459777137212e12tarkovstreetstrue
Terminal65cc8f81a9aac3e77d0cfd3eid mismatchfalse
Terminal_ui6925a2c38bdebd9e2302692eabsenttrue
Town5704e47ed2720bb35b8b4568townfalse
Woods5704e3c2d2720bac5b8b4567woodstrue

Of the five names the brief flagged, four are already in the database: Labyrinth, Suburbs, Sandbox_high and — nominally — Terminal. Only Icebreaker is missing outright.

Terminal is the interesting one. db.json has a terminal directory whose base._Id is 5704e5a4d2720bac5b8b4567; post-1.0's Terminal is 65cc8f81a9aac3e77d0cfd3e. SPT's is a pre-1.0 placeholder that post-1.0 re-issued under a new id. emu/raid.canonicalLocation resolves by name and by _Id (mods/tarkov/emu/raid.nim:206-220), so a client asking for Terminal by name still lands; a client asking by the post-1.0 _Id finds nothing and gets the empty-map fallback. Terminal is Enabled: false upstream, so this has not been reachable.

Four maps have no pre-1.0 existence at all: Icebreaker, Sandbox_start (the new tutorial — and the only map in the capture whose full base was observed), Terminal_ui and laboratory_dark. Lighthouse2 is a post-1.0 variant. All four of the new ones are Enabled: true; Lighthouse2 is not.

Every one of the 19 the emulator has is also in BSG's list, at the same _Id, except Terminal. Nothing was dropped.

paths is empty and BSG's has 18

BSG's /client/locations returns {locations, paths} with 18 transit edges{Source, Destination, Event} with _Ids at both ends, e.g. Sandbox → TarkovStreets, laboratory → TarkovStreets.

emu/raid.locationsBody reads locations.paths and falls back to [] (mods/tarkov/emu/raid.nim:188-189), and the importer does not populate it — SPT keeps the graph in database/locations/base.json, which IMPORTDB.md lists as not imported. So the emulator ships an empty transit graph today. This is the one table in the capture that fills a hole the emulator already knows it has, and it is 18 objects.

4. Every property the emulator reads that post-1.0 no longer provides

This was the part of the exercise with immediate bug value, so it was done mechanically rather than by eye. All 516 distinct string literals reached through field(...), hasField(...), sub(...) and dbRead(...) in mods/tarkov/emu/*.nim and mods/tarkov/tarkov.nim were extracted and intersected against the key universe of db.json (44,252 distinct keys) and of the entire capture (11,520 distinct keys across all 220 responses).

The answer is: none.

The removals post-1.0 actually made, in full, and what reads them:

removedtableread by mods/tarkov?
DropSoundTypeitem _props, 4,577 itemsno — appears nowhere in emu/ or tarkov.nim
config.RunddansSettings.initialFrozenDelaySecglobalsno
QuestNamequestyes, emu/questcond.nim:849 — but with a name fallback at :852, and post-1.0 supplies name

Nothing else was removed anywhere: locations 0, traders 0, handbook items 0, customization 0, settings 0, globals 0 at top level.

Two candidates were investigated and cleared, and both are worth recording because each looked like a live bug for a while:

  • emu/loot.nim:1020b.field("GlobalLootChanceModifier"), read off the location base. It is absent from /client/locations, which is what made it look removed. It is present in the full base in /client/match/local/start (responses/158.json). Not a bug. Its sibling GlobalContainerChanceModifier at :1019 is in both payloads.
  • emu/health.nim:241effects_health.<factor>.value, documented at emu/health.nim:22. Post-1.0 changed one item (painkiller) from object to empty array. Both shapes are present in both datasets; the read is by path and answers "absent" on the array form. Not a bug, but the only place in the codebase where a post-1.0 type change touches a live reader, so it is the one to re-check if more items follow.

A further 58 emulator field literals are in db.json and in no captured response. Every one of them is a table the real backend never sends a client — bot templates (inventory, mods, chances, generation, appearance, firstName in emu/bots.nim), loose-loot distributions (itemDistribution, relativeProbability, probability in emu/loot.nim), and the repeatable-quest config (resetTime, numQuests, rewardScaling, traderWhitelist, the min*/max* bands in emu/repeatable.nim). Their absence from the capture is the expected absence of server-side machinery, not a schema change, and it is the single most important constraint on §5.

5. Recommendation

Layer, do not replace. And take five tables, not eleven.

The comparison does not support a rewrite of the importer. The pre-1.0 database is not stale in the way it was feared to be: no template was deleted, no field the emulator reads was removed, the schema is additive in every table but quests, and 98.5% of the shared locale strings are byte-identical. What the capture buys is coverage of things that did not exist yet, and correction of numbers that drifted.

Against that, the capture has two limits that no amount of care removes.

It is one account's view. These responses are not all database tables:

  • /client/quest/list is profile-specific. 22 quests against SPT's 558. Taking it wholesale deletes 536 quests. It cannot be used as a quest source at all, only as evidence about quest shape.
  • /client/dialogue is trader-scoped and its 140 elements are the trees this account has reached.
  • /client/customization/storage, /client/game/profile/*, /client/mail/*, /client/hideout progress and /client/match/local/start's profile member are per-account and are not tables.
  • /client/items, /client/globals, /client/handbook/templates, /client/customization, /client/settings, /client/locale/en, /client/locations and /client/trading/api/traderSettings are general. Same bytes for every account.

It is one moment. Live-service data is re-tuned every patch. Anything taken from it is pinned to 1.1.0.1.46777 and to the day it was captured, and there is no mechanism to refresh it — the next capture is another decryption session. SPT's database, whatever its age, gets updated by other people.

And the capture is missing the half the emulator most depends on. The 58 literals in §4 are the load-bearing ones: bot generation, loose loot, static containers, static ammo, trader assorts, hideout recipes, repeatable-quest budgets. The real backend computes those server-side and never sends them. A database built from the capture would serve a client with 5,827 beautifully current items and no bots, no floor loot and nothing to buy.

What to take, and what it costs

Safe wholesale — general tables, additive schema, no reader touches them in a way post-1.0 broke:

tablechangeeffort
locations.paths18 edges, currently []one line in the importer, or a data/post1/ file. emu/raid already reads the path. Highest value per byte in this document.
locales.global.en+8,545 keys, merged under SPT'ssmall; a merge, not a replace — the 6,772 SPT-only keys stay
globals12 new config members, +61 ItemPresets, +8 bot_presetssmall; drop RunddansSettings.initialFrozenDelaySec or keep it, nothing reads it
settings.config4 new keystrivial
templates.customization+241 suitestrivial; emu/customise makes everything wearable already

Take with care — overlay, and only where it is checkable:

tablechangeeffort
templates.items+1,154 templates, ~2,954 rebalancesthis is the real work. The 1,154 new templates are safe to add only together with their locale keys, their 774 handbook rows, and the 628 slot-filter updates that make existing weapons accept them — otherwise they are unnamed items nothing can mount. The 2,954 property rebalances are safe but invisible: nobody will notice Ergonomics moving by 3, and every one is a value the emulator does not verify. Do the additions; treat the rebalances as optional.
templates.handbook+779 rows, 504 price changesthe 779 rows come with the items. The 504 prices are a live economy change and the flea reads them; take them or do not, but do not take half.
traders.<id>.base+6 tradersbase only. The capture has no assort for the six, so they would be traders with nothing to sell. Better as a known gap than as six empty shops.
locations.<map>.base+5 maps, +10 fieldsSandbox_start is the only one whose full base was captured. Icebreaker, Terminal_ui, laboratory_dark, Lighthouse2 appear only in the trimmed list — no SpawnPointParams, no exits, no waves. A map with no spawn points is not a map. Do not import these, and fix terminal's _Id from 5704e5a4d2720bac5b8b4567 to 65cc8f81a9aac3e77d0cfd3e instead, which is one value.

Must stay SPT-derived, permanently:

bots.* · locations.<map>.looseLoot / staticLoot / staticContainers / staticAmmo · traders.<id>.assort / questassort · hideout.* · templates.quests · templates.repeatableQuests · configs.quest.

The backend does not send any of them. There is nothing to import.

What the importer change would look like

tools/importdb.nim reads a directory of SPT JSON and writes db.json. The smallest change that delivers the safe set is a second, optional source:

aowl importdb --from D:\SPT --post1 mods\tarkov\data\capture\raid1

with a per-table merge policy rather than a global one — union for locales.global.en and globals.config, append-if-absent for templates.items and templates.handbook.Items, straight replace for locations.paths and settings.config. checkReadPaths (tools/importdb.nim:669) already asserts the 29 paths mods/tarkov reads against the produced database, so a merge that drops a table fails loudly.

That is a day's work for paths + locale + globals + settings + customization, and a second day for the item/handbook/slot-filter overlay, which needs its own check: every new template has a locale name, a handbook row, and appears in at least one slot filter or is a root item. Without that check the overlay is 1,154 items nobody can see or attach.

But the honest first move is smaller than either. data/post1/ already exists for exactly this — BSG's own answers, checked in per table, loaded by emu/post1.nim. locations.paths is 18 objects and roughly 2 KB. It fills a gap BACKLOG.md already names, it needs no importer change at all, and it is the one thing in 41 MB of decrypted data that the emulator is currently answering wrongly rather than answering partially.

Everything else in this document is the pre-1.0 database being more right than anyone expected, and it should be said plainly: one property removed, one field renamed with a fallback already in place, and zero live bugs.

aoughwl — self-hosted platform for things n stuff. Contact / Support on Discord for access to the private backends.