The TRF format: inside a chess tournament report file

TRF is the FIDE tournament data exchange format, also known as the Krause format. It is how an organizer submits an event for rating, and how a pairing engine reads the history of the games. The file is text, but not the kind you are used to: the meaning of a field is set by its column number rather than by a delimiter. Here is the file line by line - useful both if you are filing a report and if you are writing software. The engine that reads it - bbpPairings.

What TRF is used for

The format exists to carry a whole tournament in one text file: the parameters of the event, every player, and every game played. It is used in two scenarios.

  • A report to the federation. The organizer exports the finished event and sends the file for rating calculation.
  • Exchange with a pairing engine.The program hands the engine the current state of the tournament as TRF and receives the next round's pairings. That is exactly how bbpPairings works.

Hence two flavours of the file. For pairing, a minimum will do - player numbers, scores and round history. For a report you need a completed header and full details of every player: without a FIDE ID, a sex and a date of birth the report will not be accepted.

The current version is TRF-2026, while compatibility with the older TRF(bx) is retained.

The header: lines 012 to 132

The file opens with lines describing the tournament. Each begins with a three-digit code followed by a value.

012 Vibe Chess Cup Perm — tournament name

022 Perm — city

032 RUS — federation

042 2026/03/14 — start date

052 2026/03/14 — end date

062 24 — number of players

072 18 — of whom rated

082 0 — number of teams

092 Individual: Swiss-System — type of event

102 Ivanov Petr — chief arbiter

122 10'+5" — time control

XXR 5 — number of rounds

XXC white1 — colour of board one in round one

The XXR and XXC lines are service lines for the pairing engine. Without XXC the engine does not know which colour player number one takes in round one, and refuses to pair.

The time control is written in the accepted form: 10'+5" means ten minutes per game with a five-second increment per move.

Line 001: the positional layout

The body of the file is one 001 line per player. The important thing to grasp: fields are defined by character positions, not by spaces. One extra space shifts a column and the file parses wrongly.

PositionsContent
1-3the line code, 001
5-8the player's starting number
10sex: m or w
11-13title (GM, IM, FM and so on)
15-47surname and first name in Latin script
49-52rating
54-56federation, three letters
58-68FIDE ID
70-79date of birth as YYYY/MM/DD
81-84points scored
86-89final placing
from 92round history, in blocks of ten characters

Names go in Latin script: the format counts characters, and non-Latin alphabets in UTF-8 take two bytes per letter, which shifts the columns for anything reading the file byte by byte. A player's identity in the report is carried by the FIDE ID and the federation code rather than by the spelling of the name, so transliteration is not a problem.

Round history and result codes

After the main fields comes the game history - one block per round, holding the opponent's number, the colour and the result.

0012 w 1 — played number 12 with White and won

0007 b = — played number 7 with Black, drawn

0003 w 0 — played number 3 with White and lost

0000 - U — a bye with a full point awarded

0000 - + — a win because the opponent did not appear

0000 - - — a loss for not appearing

The result codes:

  • 1 win, 0 loss, = draw;
  • U a pairing-allocated bye with a full point;
  • + and - wins and losses by forfeit: these count in the standings but are excluded from rating calculation.

An important detail: the result is recorded from the player's own point of view, not White's. If you are writing software this is the first place a bug appears - a game is reflected in two lines, and the codes on the two sides must mirror each other.

The second common mistake is a reference to a withdrawn player. If somebody has been removed from the event while the history still points at them, the engine trips. The correct treatment is to record that game as one played without an opponent: 0000 and a dash instead of a colour - withdrawals.

Extensions and non-standard scoring

Some events do not score classically - three points for a win and one for a draw, for instance. The format has extensions for that: codes such as BBW, BBD and BBL set your own values for a win, a draw and a loss, with further codes for byes and forfeits - three-point scoring.

An ordinary tournament does not need them, but it is worth knowing they exist: meeting such a line in somebody else's file explains why the points do not add up the way you expect.

Getting the TRF for your own event

People assemble this file by hand only in exceptional cases: one wrong column and the report falls apart. Normally a tournament program exports it.

In the Vibe Chess app a finished tournament exports to TRF in one press: the header comes from the event parameters, the player data from their profiles, the round history from the games played. For the report to be complete, players fill in the federation-standards section of their profile: FIDE ID, national ID, title, sex, date of birth and federation.

The same format is used inside the app for pairing: before each round the state of the tournament goes to the bbpPairings engine, which returns the pairs. So the report is not «assembled at the end» - it lives alongside the tournament throughout.

A checklist before submitting

  • the number of rounds in XXR matches the number actually played;
  • every player has a FIDE ID or a federation code, if the event is rated;
  • names are in Latin script and fit inside the allotted positions;
  • the score on each line agrees with the round history;
  • there are no references to players absent from the file;
  • results mirror correctly between the two opponents;
  • the time control is written in the accepted form;
  • the chief arbiter is named.

What else belongs in the paperwork - the playing conditions.

Export the report in one press

The header, the player data and the full round history assemble into a TRF file the moment the tournament finishes - the same file arbiter software and federations accept.

Frequently asked questions about TRF

What is the TRF format?

The FIDE tournament data exchange format, also called the Krause format. A text file whose header holds the tournament parameters and whose body has one line per player with their details and the history of every game. It is used both for rating reports and for exchange with pairing engines.

Why are names written in Latin script in TRF?

The format is strictly positional: a field's meaning is set by character position. Non-Latin alphabets in UTF-8 take two bytes per letter and shift the columns for programs that count bytes. A player's identity is carried by the FIDE ID and the federation code, so transliteration is acceptable.

How is a bye recorded in TRF?

As a block of 0000 with a dash instead of a colour and the code U - a pairing-allocated bye with a full point. Forfeits use + (a win because the opponent did not appear) and - (a loss for not appearing); those games are excluded from rating calculation.

How does a TRF for pairing differ from a TRF report?

For pairing the minimum suffices: player numbers, scores and round history - the engine needs nothing else. A federation report additionally requires the tournament header and full player details: sex, title, rating, federation, FIDE ID, date of birth and final placing.

Can I write a TRF by hand?

Technically yes, but in practice it is a source of errors: every field is tied to a character position and one extra space breaks the parse. The file is exported by tournament software - in the Vibe Chess app that is one press once the event is finished.

Which version of the format is current?

TRF-2026, retaining compatibility with the earlier TRF(bx). bbpPairings 6.0.0 works with both.

The tournament app

A tournament without a paper crosstable

Everything people usually keep in a spreadsheet is already in the app: pairings, points, tie-breaks, round order. Free, with no subscriptions and no cap on the number of players.

  • Swiss
    many players, one evening: four or five rounds are enough
  • Round robin
    the fairest format for six to ten players
  • Free meetup
    not a tournament, just an evening of chess - who is free and who is playing is visible in the app

More than a bot: the app, FIDE rules and a TRF report

  • The app. Besides the bot there is an app - inside Telegram and simply at vibechess.ru/app: what is on in your city, the player list, a live table, the current round, your profile and game history - everything that is awkward to read as chat messages.
  • Pairings by FIDE rules. Pairings are computed by bbpPairings, an open-source engine implementing the Dutch system: score groups, floats on an odd field, colour alternation, no rematches and no two byes in a row.
  • A TRF report. A finished tournament exports as a single file in the FIDE data exchange format - the one arbiter software and federations accept. Your profile stores the FIDE ID, national federation code, title, sex and date of birth for it.
  • Free. All of the above, with no subscriptions, paid plans or limits on the number of tournaments and players.

Full overview

Missing a feature? Message the developers

The bot is constantly improved based on real tournaments. If you need a feature that isn't there yet, message the developers right inside the bot with the /support command. Many features appeared exactly because organizers asked for them, and useful ideas get added quickly.

What to read next

The engine that reads it - bbpPairings and JaVaFo. Software - Swiss-Manager, chess-results.com. Ratings - how the Elo rating works.