ART/GTO
Formats & viewer

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

FormatExtensionWhere it livesWho reads it
Solution file.artWherever you save it (or your job's output folder)ARTGTO desktop app
Companion export.artgtoYour export folderThe web viewer and companion apps
JSON export (legacy)folder of .json.zst filesYour export folderThird-party tools only — not the web viewer
Range files.txtranges\ folder inside an exportThe web viewer
Job files.jsonC:\Users\<you>\AppData\Roaming\artgto\jobs\ARTGTO desktop app
Spot files.jsonC:\Users\<you>\AppData\Roaming\artgto\spots\ARTGTO desktop app
Game configs.jsonC:\Users\<you>\AppData\Roaming\artgto\gameconfigs\ARTGTO desktop app
Bet-sizing profiles.jsonC:\Users\<you>\AppData\Roaming\artgto\betsizes\ARTGTO desktop app
Tip
All the .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.

screenshot
Save Solution as .art dialog

What is inside

The file starts with a small 9-byte header:

BytesMeaning
0–3The letters ARTG (file signature)
4–7Format version (currently 3)
8Compression 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.

Note
Two things are deliberately not saved in a .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 .art files.
  • 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 .art format 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.zst holds the metadata (board, pot, stack, rake, ranges, iterations, target accuracy) plus the preflop, flop, and turn strategy nodes.
  • Each river_{turn}_{river}.json.zst file 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 ARTG signature, 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 .artgto file stays zero-filled at the start until it is complete — the ARTG signature is only written at the end. A finished JSON export is detected by the presence of manifest.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.

FieldMeaning
nameThe job's name
created_atWhen it was created (Unix time)
queue_orderPosition in the queue (new jobs go to the bottom)
Settings snapshotEvery solve setting at the moment you saved — including the engine mode, DCFR (legacy, fixed α/β/γ) or HS-DCFR (tuned — fewer iterations)
flopsThe list of boards to solve
output_folder / error_folderWhere finished and failed solutions go
naming_patternOutput file name pattern; <board> is replaced with the canonical flop
spot_statusPer-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.

Tip
Job files are pretty-printed JSON. If a batch went to the wrong folder, you can edit 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\.

FieldMeaningDefault
namePreset name
pot_typesrp, 3bp, 4bp, or 5bp
starting_pot_bbPot at the flop, in big blinds
effective_stack_bbStack behind, in big blinds
rake_rateRake percentage as a fraction0.0
rake_cap_bbRake cap in big blinds0.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:

FieldMeaningDefault
nameConfig name
pot_typeThe pot type this config targets
rake_rateRake fraction0.05
rake_cap_bbRake cap in big blinds3.0
pairsMap 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.

LevelEffect
1Fastest — about 2× faster writes, files ~30% larger
3 (default)Good balance; ~10–15% faster than higher levels
9Maximum practical compression
19+Up to 10× slower for very little extra saving — not recommended
Note
The level only affects how long writing takes and how big the files are. Reading speed is the same at every level, so a higher level never slows down the viewer or the app when loading.