File formats
ARTGTO reads and writes a small set of file types. This page explains each one: what is inside, where it lives on your disk, and which program reads it. You do not need to know any of this to use the solver — but it helps when you organize a solution library, share files, or move ARTGTO to a new computer.
Unlike most poker solvers, which lock solved trees inside a closed proprietary binary, ARTGTO uses an open, self-contained export format: your solutions are files you own and can read for as long as you keep them — no subscription, no server, no vendor lock-in. See Build your own GTO solutions for why that matters.
Quick reference
| Format | Extension | Where it lives | Who reads it |
|---|---|---|---|
| Solution file | .art | Wherever you save it (or your job's output folder) | ARTGTO desktop app |
| Companion export | .artgto | Your export folder | The web viewer and companion apps |
| JSON export (legacy) | folder of .json.zst files | Your export folder | Third-party tools only — not the web viewer |
| Range files | .txt | ranges\ folder inside an export | The web viewer |
| Job files | .json | C:\Users\<you>\AppData\Roaming\artgto\jobs\ | ARTGTO desktop app |
| Spot files | .json | C:\Users\<you>\AppData\Roaming\artgto\spots\ | ARTGTO desktop app |
| Game configs | .json | C:\Users\<you>\AppData\Roaming\artgto\gameconfigs\ | ARTGTO desktop app |
| Bet-sizing profiles | .json | C:\Users\<you>\AppData\Roaming\artgto\betsizes\ | ARTGTO desktop app |
.json files under AppData\Roaming\artgto\ are plain, human-readable text. You can back them up, copy them to another computer, or keep them in version control.Solution files (.art)
A .art file is one solved spot. You create it with Save Solution as .art and load it again with Open Solution — see Saving and opening solutions for the workflow. In the file dialog the type is listed as ARTGTO Solution.
What is inside
The file starts with a small 9-byte header:
| Bytes | Meaning |
|---|---|
| 0–3 | The letters ARTG (file signature) |
| 4–7 | Format version (currently 3) |
| 8 | Compression flag: 0 = none, 1 = zstd |
After the header comes the compressed solution data: the game tree, the flop (3 board cards), both players' ranges, the final strategy, the iteration count, and the solution metadata (pot, stack, rake, and similar settings).
Why version 3 files are small
Older version 2 files stored the full-precision strategy plus all of the solver's internal working data. They were often 100–200 MB or more. Version 3 files store the strategy in a compact 8-bit form and drop the internal data, which makes them 90%+ smaller — typically 10–30 MB.
The 8-bit storage works like this: each action frequency is rounded to a 0–255 scale, and the values for each combo always sum to exactly 255. The smallest step is 1/255, about 0.39%. In practice this is far below the noise level of any solve, so the strategy you load back is the strategy you solved.
.art file: the solver's internal regret data and the EV caches. This is why a loaded solution is for viewing and exporting — you cannot continue (resume) the solve from where it stopped. The EV numbers you see after loading are rebuilt by the app. If you think you may want a more accurate version of a spot later, solve it again from the saved settings instead of expecting to resume.Compatibility guarantees
- The version number in the header is checked on load. Newer versions of ARTGTO keep reading older
.artfiles. - Versions 0.9.9 and 0.9.10 wrote a slightly different internal layout by accident. Current versions detect this automatically and retry with a compatibility reader — those files still open normally.
- The
.artformat is frozen. Performance updates to the solver do not change the file layout, so files you save today will keep loading in future versions.
Export formats for the viewer
Exporting converts a solved spot into a format the web viewer can browse. There are two choices in the export format setting:
| Option (verbatim) | What it is |
|---|---|
.artgto (CBOR — companion-app format, single file) | Default. One file per spot, 30–35% smaller |
JSON folder (legacy — not read by the viewer) | A folder of ~2,350 files per spot, for third-party tooling |
Use .artgto unless you have a specific tool that needs the JSON layout. The web viewer only reads .artgto.
.json.zst layout (legacy JSON export)
A JSON export is a directory per spot:
my_spot\
manifest.json.zst (about 5 MB)
river_AsKd.json.zst
river_AsKh.json.zst
... (about 2,350 river files)manifest.json.zstholds the metadata (board, pot, stack, rake, ranges, iterations, target accuracy) plus the preflop, flop, and turn strategy nodes.- Each
river_{turn}_{river}.json.zstfile holds the river strategy for one turn card + river card pair. Inside, the data is stored as concatenated compressed frames, one per turn-action history. - All numbers are written with 4 decimal places for maximum compatibility with other tools.
Card names in file names are canonical: ranks ascending, suits ordered s, h, d, c. For example the board AhKhQh is written QhKhAh, and 5d5h4h is written 4h5h5d. This is why a river file may not have the card order you expect — the data is the same.
.artgto layout (default single-file export)
A .artgto file packs the whole spot into one file:
- A small header with the
ARTGsignature, a format version (currently 1), and a pointer to an index at the end of the file. - Compressed sections: one manifest (preflop, flop, and turn strategies), one section per turn card, and one section per turn + river pair.
- The index at the end lists where every section sits, plus preview metadata (board, ranges, pot) and a precision string (currently
"u8").
Because of the index, the web viewer can open a .artgto file without downloading or reading the whole file — it fetches the header, then the index, then only the sections you actually navigate to. This is what makes browsing large exports feel instant.
Like .art files, .artgto exports store frequencies in 8-bit form. The typical rounding effect is about 0.39% (1/255) — viewers read the precision flag and scale the values back automatically. The trade-off is honest but tiny: you give up fractions of a percent of display precision for files that are 30–35% smaller and much faster to browse.
Interrupted exports and resuming
Exports are designed to survive crashes and power loss:
- If an export is interrupted mid-file, the partial file is truncated (cut back) so it cannot be mistaken for a finished one.
- A
.artgtofile stays zero-filled at the start until it is complete — theARTGsignature is only written at the end. A finished JSON export is detected by the presence ofmanifest.json.zst. - When you resume a paused or interrupted batch with the skip-existing option, finished spots are detected by these markers and skipped; unfinished ones are redone.
- Every file is flushed to disk as it is written, so large batch exports do not balloon Windows' write cache and eat your RAM.
Range files (.txt)
Exports include a ranges\ folder with one subfolder per position (UTG, MP, CO, BU, SB, BB). Each subfolder contains plain text files describing a preflop range — for example BB_3bet_vs_BU_RFI.txt. They are comma-separated lists of hand combos that the web viewer loads on demand to show preflop ranges.
Job files (.json)
A job is a saved batch: a list of flops plus a full snapshot of your solve settings. Jobs live in C:\Users\<you>\AppData\Roaming\artgto\jobs\, one file per job, named after the job.
| Field | Meaning |
|---|---|
name | The job's name |
created_at | When it was created (Unix time) |
queue_order | Position in the queue (new jobs go to the bottom) |
| Settings snapshot | Every solve setting at the moment you saved — including the engine mode, DCFR (legacy, fixed α/β/γ) or HS-DCFR (tuned — fewer iterations) |
flops | The list of boards to solve |
output_folder / error_folder | Where finished and failed solutions go |
naming_pattern | Output file name pattern; <board> is replaced with the canonical flop |
spot_status | Per-flop progress: Pending, Done, or Failed |
The output file name is the pattern plus .art. Because the settings are snapshotted inside the job, changing your current settings later does not change what a queued job will solve — this is intentional, so a queue you set up overnight runs exactly as planned.
output_folder in the file with any text editor while the app is closed.Spot files (.json)
Saved spot presets live in C:\Users\<you>\AppData\Roaming\artgto\spots\.
| Field | Meaning | Default |
|---|---|---|
name | Preset name | — |
pot_type | srp, 3bp, 4bp, or 5bp | — |
starting_pot_bb | Pot at the flop, in big blinds | — |
effective_stack_bb | Stack behind, in big blinds | — |
rake_rate | Rake percentage as a fraction | 0.0 |
rake_cap_bb | Rake cap in big blinds | 0.0 |
Internally the solver works in chips at 1 BB = 100 chips; the conversion is automatic.
Game config files (.json)
Game configs live in C:\Users\<you>\AppData\Roaming\artgto\gameconfigs\. A game config bundles rake settings with a table of pot/stack pairs per pot type:
| Field | Meaning | Default |
|---|---|---|
name | Config name | — |
pot_type | The pot type this config targets | — |
rake_rate | Rake fraction | 0.05 |
rake_cap_bb | Rake cap in big blinds | 3.0 |
pairs | Map of named pot/stack pairs (pot_bb, stack_bb) | — |
If a pair is missing from the map, the app falls back to the preflop sizing values, so an incomplete config still works.
Bet-sizing profiles (.json)
Your saved bet-sizing setups live in C:\Users\<you>\AppData\Roaming\artgto\betsizes\, one JSON file per profile. The folder on disk is named betsizes, but the app calls them profiles in the UI — they are the same thing.
Compression settings
All compressed formats use zstd. The compression level is configurable from 1 to 22; the default is 3.
| Level | Effect |
|---|---|
| 1 | Fastest — about 2× faster writes, files ~30% larger |
| 3 (default) | Good balance; ~10–15% faster than higher levels |
| 9 | Maximum practical compression |
| 19+ | Up to 10× slower for very little extra saving — not recommended |