Libre Aquatics Wiki

Lenex

From Libre Aquatics Wiki, the free aquatics reference

Lenex is an XML-based format for exchanging swimming data between programs: meet invitations, entries, start lists, results, record lists and time standards. It was created by Christian Kaufmann of Switzerland, who still maintains it, and it has been in use since 1999.12 The current version is 3.0, introduced in November 2008. The Swimrankings wiki, which Kaufmann runs, describes it as the recommended format for European Aquatics rankings and lists more than twenty national federations that use it as their main exchange format.2 It does in Europe the job SDIF does in the United States, but the two formats are built very differently.

History

This section covers the three version numbers and the revisions made under the last of them.

Version 1.0 dates from September 1999. Version 2.0 followed in February 2004, the year European rankings were introduced. It kept 1.0’s basic structure for events, entries and results, but files in the two versions cannot be read interchangeably. Version 2.0 added new branches to hold record lists and time standards, renamed keywords that had been short or ambiguous, took country-specific separators out of the data types, and moved every basic value into an XML attribute.12

Version 3.0 was introduced on 25 November 2008. The documentation says compatibility with 2.0 is more or less preserved, so a program written for 2.0 can read a 3.0 file with some minor exceptions. Among the additions, heats became elements of their own, places moved out of the result into separate ranking lists, and names could carry an English-language variant. It also added worldwide identifiers for meets, clubs and athletes, and made UTF-8 the preferred text encoding.1

The version number has not changed since then, but the specification has. Its technical documentation carries a dated change log that starts with the 3.0 release and continues through 2025. The copies examined for this article are dated 31 January 2015, 27 October 2021 and 4 March 2025, and all three are labelled version 3.0.134 According to the documentation, nearly every change since 2008 has been an extension and only a few minor ones break existing files. The log does record some removals, though: middle names were dropped from every element in 2012, the pool’s name attribute was removed in 2016 in favor of a new facility element, and a single meet-wide entry limit was split into separate limits for athletes and relays in the same year. Later additions include relays in which every swimmer swims all four strokes (2021), time-trial rounds (2023), fin-swimming events and bank payment details (2024), and a non-binary gender value (2025).1 Some outdated names are kept deliberately. The documentation calls the governing bodies World Aquatics and European Aquatics, but a conversion method is still called FINA_POINTS, because renaming it would break existing files.1

A file can state which revision it follows. Since December 2024 the root element has had an optional revisiondate attribute, and if it is missing the file is taken to follow the latest revision.1

Form

A Lenex file is an XML document with the extension .lef. Files are normally compressed into a ZIP archive and given the extension .lxf. The documentation says some of the format’s rules cannot be expressed in an XSD schema, and that this is why it is published as a set of tables rather than as a schema.1 No official schema was found.

Six kinds of file are conventional, although any file may combine them: an invitation, which carries the meet’s schedule and event structure; entries, from one club or from all of them; a start list, which is an entry file in which each entry has a heat and lane; results; records; and time standards. Time standards that belong to a particular meet go in that meet’s invitation.1

Element names are upper case and attribute names lower case. The documentation sorts everything in a file into elements, collections and attributes. Collections are elements holding children of one kind only, and each takes the plural of its child’s name, so SESSIONS holds SESSION elements. Every basic value is an attribute.1 Since 3.0 the preferred encoding has been UTF-8. An ANSI code page is still allowed, as long as the XML prolog declares it.1

Structure

This section describes the tree and the references that connect its branches.

Every file has a LENEX root element carrying the format version, currently 3.0. Under it, a CONSTRUCTOR element names the program that wrote the file, its version and a contact email. Three optional branches follow:1

  • MEETS, which holds one or more MEET elements. The documentation advises one meet per file.
  • RECORDLISTS, where each list covers one record type, gender, course and, optionally, age group.
  • TIMESTANDARDLISTS, qualifying and cut times organized the same way.

Inside a meet, the SESSIONS branch describes the program. It contains sessions, each session contains events, and each event holds a SWIMSTYLE element (distance, stroke and number of swimmers), its heats and its age groups. The CLUBS branch holds the people. Each club lists its athletes, relays, coaches and officials, and each athlete holds that athlete’s own entries and results, with split times nested inside each result.1

The two branches are joined by numeric identifiers rather than by nesting. An entry or a result names its event with eventid and its heat with heatid. A ranking names the result it places with resultid. A relay swimmer is not stored inside the relay: the relay position carries an athleteid that points to the athlete elsewhere in the same club. A final round points back to its preliminary round with preveventid. The identifiers that are targets of these references are mandatory and must be unique across the whole meet.1

Places are not stored on results. Since 3.0, each age group within an event holds a RANKINGS collection, and each ranking gives a place and the resultid of the swim it refers to. As a result, one swim can appear in more than one ranking, for example an open list and an age-group list, and an exhibition swim is a result that no ranking refers to. An event without age groups still needs one placeholder age group to hold its rankings.1

The format sets a few conventions for values:1

TypeFormExample
Swim timeFixed-length HH:MM:SS.ss, or NT for no time00:14:45.86
Reaction timeSigned hundredths of a second, 0 for zero+68
DateYYYY-MM-DD2026-03-14
Time of dayHH:MM09:30
MoneyInteger count of cents17500
Unique idA letter followed by a number, issued by swimrankings.net

Split times are cumulative, measured from the start. Relay distances are given per swimmer, and an event with relaycount="1" is an individual event. Pool length is one of LCM, SCM, SCY, a set of non-standard lengths such as SCM20 and SCY27, or OPEN for open water.1 The strokes are FREE, BACK, BREAST, FLY and MEDLEY. There are also IMRELAY, UNKNOWN for events that fit no stroke (these must carry a descriptive name), and a set of fin-swimming values.1

National variations are written into the same file rather than into a separate format. A federation adds a value by prefixing it with its IOC nation code and a dot. The documentation lists German and Swiss additions, among them GER.RES for a re-swim round at the German team championships.1

A file read

The file below is invented but valid under the documentation. The meet, club and swimmer do not exist, and the swimmer is the one used in the examples on the SDIF and HY3 pages, so all three can be compared.

<?xml version="1.0" encoding="UTF-8"?>
<LENEX version="3.0" created="2026-03-14T18:42:05">
  <CONSTRUCTOR name="Riverside Timing" version="2.1">
    <CONTACT email="results@example.org" />
  </CONSTRUCTOR>
  <MEETS>
    <MEET name="Spring Open" city="Riverside" nation="USA" course="SCY">
      <SESSIONS>
        <SESSION number="1" date="2026-03-14" daytime="09:00">
          <EVENTS>
            <EVENT eventid="7" number="7" gender="F" round="TIM">
              <SWIMSTYLE distance="200" relaycount="1" stroke="FREE" />
              <AGEGROUPS>
                <AGEGROUP agegroupid="1" agemin="-1" agemax="-1" name="Open">
                  <RANKINGS>
                    <RANKING place="1" resultid="301" />
                  </RANKINGS>
                </AGEGROUP>
              </AGEGROUPS>
              <HEATS>
                <HEAT heatid="703" number="3" />
              </HEATS>
            </EVENT>
          </EVENTS>
        </SESSION>
      </SESSIONS>
      <CLUBS>
        <CLUB name="Riverside Aquatic Club" code="RAC" nation="USA">
          <ATHLETES>
            <ATHLETE athleteid="55" firstname="Marguerite" lastname="Wren"
                     gender="F" birthdate="1992-08-26">
              <RESULTS>
                <RESULT resultid="301" eventid="7" heatid="703" lane="5"
                        swimtime="00:01:49.37" reactiontime="+68">
                  <SPLITS>
                    <SPLIT distance="50" swimtime="00:00:25.81" />
                    <SPLIT distance="100" swimtime="00:00:53.60" />
                    <SPLIT distance="150" swimtime="00:01:21.72" />
                  </SPLITS>
                </RESULT>
              </RESULTS>
            </ATHLETE>
          </ATHLETES>
        </CLUB>
      </CLUBS>
    </MEET>
  </MEETS>
</LENEX>

The event is defined once, in the session. It is event 7, a women’s 200 yard freestyle swum as a timed final (round="TIM") in a short-course-yards pool, which is set by course on the meet. The swim is recorded on the athlete. Result 301 points to event 7 and heat 703 and gives the lane, the finishing time and a reaction time of 0.68 seconds. The place is in neither of those locations: it is in the event’s open age group, where a ranking gives place 1 to result 301. The splits stop at 150 yards because the time at 200 yards is the result itself.

The same swim in SDIF is a single fixed-width D0 record, with the place, heat and lane in numbered columns of that line and the splits in separate G0 records that follow it. In Lenex it is spread across the tree and connected by the numbers 7, 703 and 301.

What the sample files show

The Swimrankings wiki links four sample files, for entries, a start list, results and records.2 Each is a ZIP archive containing a single .lef file dated 1 December 2024. The first three describe the 2024 Canadian Olympic and Paralympic swimming trials in Toronto. The fourth holds world, Canadian and Ontario record lists, including para-swimming lists.5 All four were written by a debug build of SPLASH Meet Manager, whose author is also the maintainer of the format.52

The files use features that the current documentation does not include:51

  • The meet’s touchpad installation is written as touchpad, but the documentation names the attribute touchpadmode.
  • The pool has a name attribute, which the change log records as removed in 2016.
  • Some attributes are not in the documentation at all: masters on the meet, late on entries, clubid on clubs, and a code on time-standard lists. The World Para Swimming licence number is written as sdmsid, while the documentation names it license_ipc.
  • Rounds marked EXTRAHEATS appear, although that value is not in the documented list. Some results carry the status RJC, which the documentation allows only on entries.
  • Several hundred results have a time of 00:00:00.00 and no status, where the documentation provides NT for a missing time.

In every other respect checked, the files match the documentation. Splits are cumulative and stop before the finish, the relationships between elements are all expressed through identifiers, and Canadian additions use the nation-code prefix, such as CAN.TRIALS for the meet type and CAN.IPC and CAN.JR for record lists.5 The differences above show that in practice the format is defined partly by what the maintainer’s own program writes, and that a reader written strictly from the documentation will find attributes it does not recognize.

Adoption

The Swimrankings wiki names European Aquatics and 22 national bodies that use Lenex as their main format for results, records, rankings and entries. They include the federations of Austria, Belgium, Denmark, Finland, Iceland, the Netherlands, Poland, Portugal, Spain, Sweden, Switzerland and Turkey.2 The one Canadian entry is the Quebec federation, not Swimming Canada. Germany does not appear, although the documentation defines German extensions. The German federation has its own text-based DSV-Standard for entries and results.16 European Aquatics formed a data-hub task force in 2025 to run its records and rankings pages, and Kaufmann is a member.7 Its announcement does not mention Lenex, so the description of Lenex as the recommended format for European Aquatics rankings comes from the Swimrankings wiki.27

The wiki names four programs that read and write the format:2

ProgramAuthor named by the wikiNotes
Splash Meet ManagerChristian KaufmannThe maintainer’s own meet and team software, from Splash Software
SwimifyErik BerglundWrites Lenex 3.0 result files from August 2020; its event files moved to Lenex 3 only in January 20258
EasyWkBjörn StickanGerman meet software
CPS-SchwimmHermann Josef AretzGerman meet software

The format is open to any developer without charge, and anyone can upload a file to the Swimrankings site for a basic validation.2 Independent libraries that read it exist in PHP, Java, TypeScript and other languages. The ones examined read both the plain .lef and zipped .lxf forms, and none of them refers to an official schema.910

The American program Hy-Tek Meet Manager does not import it. The Meet Manager 8 user guide lists Hy-Tek’s own HY3 files and SDIF .sd3 files as the only kinds of entry file it accepts.11 Swimify, which reads and writes both Lenex and Hy-Tek files, lists Canada among the federations it is approved for.8

The earliest dated print reference to Lenex found for this article is an advertisement for Splash Meet & Team Manager that ran in the Canadian magazine SwimNews in 2002. The advertisements in the January–February and March–April issues say results can be saved in Splash’s own format and in SDIF, which they present as the American format. From the May–June issue on, the list is longer. Entries could then be read as Commlink, SDIF, WSV, Lenex or Aquabec, and results could be saved as SDIF, Splash, WSV, Lenex or Aquabec.1213 The advertisements speak for one European program only. They do place Lenex in commercial use by 2002, beside the national formats of the United States, Germany and Quebec.

Compared with SDIF

This section compares Lenex with SDIF, the American format that does the same job.

SDIF is a sequence of 162-byte fixed-width lines, each identified by a two-character code. Its relationships are implied by the order of the lines, so a swimmer’s records follow the record for that swimmer’s club.14 Lenex is a tree. It groups data by nesting and links the program side of a meet to the people side with numeric identifiers. A single swim takes one SDIF line but touches three separate places in a Lenex file, as the example above shows.

Values are written differently too. SDIF times take the form mm:ss.ss and dates the form MMDDYYYY, and every field has a fixed column width. In Lenex, times always take the fixed-length form HH:MM:SS.ss and dates take ISO order. A missing Lenex value is omitted from the file, not left as a blank column.141 Where SDIF has to add a record type to hold a longer identifier, Lenex adds an attribute. A federation can also add its own values under its nation-code prefix without breaking any other reader.

The two are governed differently. United States Swimming publishes SDIF and last revised it in 1998.14 Lenex is maintained by one person, who also sells a program that reads and writes it. Its version number has not changed since 2008, but its documentation has been revised many times since then.12 One consequence for anyone writing a reader is that a Lenex file from a current program may include attributes an older reader does not know, and the reference files themselves go beyond the current documentation.

See also

  • SDIF: the American fixed-width counterpart
  • XSDIF: the XML form of United States Swimming’s format
  • DSV-Standard: the German federation’s text format, advertised beside Lenex in 2002 as WSV
  • Aquabec: the Quebec competition software named in the same advertisement
  • Splash Meet Manager: the maintainer’s program, which wrote the sample files
  • Swimify, EasyWk and CPS-Schwimm: other programs that read and write the format
  • Swimrankings: the site that hosts the specification
  • Software: the software reference

References

Footnotes

  1. Christian Kaufmann, Lenex 3.0 Technical Documentation (revision of 4 March 2025). ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17 ↩18 ↩19 ↩20 ↩21 ↩22 ↩23

  2. Swimrankings, Lenex (history, federations, software, trust authority). ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10

  3. Christian Kaufmann, Lenex 3.0 Technical Documentation (revision of 31 January 2015). ↩

  4. Christian Kaufmann, Lenex 3.0 Technical Documentation (revision of 27 October 2021). ↩

  5. Swimrankings, example results file, with the entries, start list and records files beside it. ↩ ↩2 ↩3 ↩4

  6. Wikipedia (German), DSV-Standard. ↩

  7. European Aquatics, Dynamic Swimming Records and Rankings pages now available (2 July 2025). ↩ ↩2

  8. Swimify, Swimify Meet Manager changelog. ↩ ↩2

  9. leonverschuren, lenex-php (PHP; reads .lef and .lxf). ↩

  10. Tiim, lenex-java (Java; reads .lef and .lxf). ↩

  11. HY-TEK, Import Meet Entries (Meet Manager 8 user guide). ↩

  12. SwimNews, January–February 2002 (Splash Meet & Team Manager advertisement; Splash format and SDIF). ↩

  13. SwimNews, May–June 2002 (Splash advertisement listing Commlink, SDIF, WSV, Lenex and Aquabec). ↩

  14. USA Swimming, Standard Data Interchange Format version 3 (28 April 1998). ↩ ↩2 ↩3

Last updated September 25, 2026.