TSK XCSoar task file
one task per file We-Fly

Interactive specification

The XCSoar task file, point by point.

.tsk is XCSoar's own task format — one task per file, plain XML, and by far the richest observation-zone vocabulary of any format in free flight. It comes from gliding, which shows: it can describe keyholes and annular sectors it has no way to describe start gates for.

XML, UTF-8 One task per file Decimal degrees 13 observation-zone types
01 Overview

What a .tsk describes

XCSoar is the open-source soaring computer that runs on Android and Linux, and .tsk is the file it saves a task to. It is small, plain XML, and holds exactly one task — no competition wrapper, no pilot list, no dates.

Its heritage is gliding rather than free flight, and the format's shape follows from that. It is unusually precise about the geometry of each turnpoint — the observation zone can be a line, a cylinder, a sector, a keyhole, an annulus — and about glider start constraints like a maximum start height or start speed. It is completely silent about the things a paragliding competition cares about most: no start gates, no task deadline, no dates.

Read that asymmetry as the format's design. A .tsk tells you exactly where to fly and almost nothing about when. Any importer that turns one into a timed competition task is inventing the timing — see §08.
02 Document structure

Task, Point, Waypoint, Zone

chabre.tsk — a four-point racing task
<?xml version="1.0" encoding="UTF-8"?>
<Task type="RT">
  <Point type="Start">
    <Waypoint name="B02 Aujour">
      <Location latitude="44.28500" longitude="5.74000"/>
    </Waypoint>
    <ObservationZone type="Cylinder" radius="2000"/>
  </Point>
  <Point type="Turn">
    <Waypoint name="B15 Hongrie">
      <Location latitude="44.36200" longitude="5.71500"/>
    </Waypoint>
    <ObservationZone type="Cylinder" radius="1000"/>
  </Point>
  <Point type="Turn">
    <Waypoint name="B22 StGenis">
      <Location latitude="44.24000" longitude="5.84000"/>
    </Waypoint>
    <ObservationZone type="Sector" radius="800" start_radial="0" end_radial="180"/>
  </Point>
  <Point type="Finish">
    <Waypoint name="A02 Landing">
      <Location latitude="44.31900" longitude="5.82600"/>
    </Waypoint>
    <ObservationZone type="Line" length="2000"/>
  </Point>
</Task>

The nesting is strict and shallow: a Task holds Points in flying order; each Point holds exactly one Waypoint (which holds one Location) and exactly one ObservationZone. Everything is attributes.

Force-array Point. Same trap as every XML format: a single-point document collapses to an object in most XML-to-object libraries. Declare Point as always-array.
03 Task attributes

The <Task> element

AttributeValuesMeaning
typesee belowWhich XCSoar task factory built the task. Governs which zones and edits XCSoar allows.
task_scored0 / 1Whether the task counts for scoring.
aat_min_timesecondsMinimum task time for an assigned-area task.
start_requires_arm0 / 1Pilot must arm the start manually.
start_max_speedm/sMaximum ground speed at the start. 0 = no limit.
start_max_heightmetresMaximum height at the start. 0 = no limit.
start_max_height_refAGL / MSLDatum for the start-height limit.
finish_min_heightmetresMinimum height at the finish.
finish_min_height_refAGL / MSLDatum for the finish-height limit.
fai_finish0 / 1FAI finish-height rule applies.

Task types

The type value names an XCSoar task factory. The ones you meet in practice:

ValueTask
RTRacing task — fixed turnpoints, first to goal. What almost every shared .tsk is.
AATAssigned-area task — turn areas rather than points, flown against aat_min_time.
MATModified-assigned task — pilot-chosen turnpoints.
Mixed, TouringFree mixes of the above, and non-competitive touring tasks.
FAI*The FAI badge/record factories — general, triangle, out-and-return, goal.
Be permissive about type. The value set is XCSoar's internal factory enum and has grown over the years. Treat an unrecognised type as a racing task rather than rejecting the file — the geometry is in the points either way.
04 Points

<Point> and its types

typeRoleNotes
StartStart of the taskExactly one. In competition terms this is the SSS.
TurnTurnpointZero or more, in order.
AreaTurn areaAn AAT sector — geometrically a turnpoint with a large zone.
FinishFinishExactly one, last. In competition terms this is the goal.
OptionalStartAlternative startAn extra start the pilot may choose instead of Start. Not part of the flown sequence.
OptionalStart points are not turnpoints. They are alternatives to the real start, and they can appear anywhere in the document order. Filter them out before you number anything — leave them in and a four-point task silently becomes a five-point one with a turnpoint at the wrong end.

<Waypoint> and <Location>

Element / attributeMeaning
Waypoint nameDisplay name. Often "CODE Name".
Waypoint id, comment, altitudeOptional; carried from the waypoint database. altitude is metres.
Location latitude / longitudeSigned decimal degrees, WGS84. No hemisphere letters, no minutes — the simplest coordinates of any format on this site.
05 Observation zones

The zone vocabulary

This is where .tsk is richer than every other task format. The type attribute selects the shape; the other attributes size it.

Zone typeShapeSizing attributes
CylinderFull circleradius (m)
LineStraight line across the courselength (m) — the total width
SectorPie slice between two radialsradius, start_radial, end_radial (°)
FAISectorThe classic 90° FAI photo sectorradius
KeyholeSmall cylinder + wide sector beyond itradius
CustomKeyholeKeyhole with adjustable dimensionsradius, inner_radius, angle
DAeCKeyholeThe German DAeC keyholefixed dimensions
BGAStartSectorBGA start sectorfixed dimensions
BGAFixedCourseBGA fixed-course sectorfixed dimensions
BGAEnhancedOptionBGA enhanced-option sectorfixed dimensions
AnnularSectorSector with a hole in the middleradius, inner_radius, radials
SymmetricQuadrantQuadrant bisected by the course lineradius, angle
MatCylinderMAT-task cylinderradius
length is the whole line, radius is a half-width. A Line of length="2000" extends 1000 m each side of the waypoint. Treating length as a radius doubles every goal line you import.

Collapsing a zone to a cylinder

Formats that only model cylinders — XCTrack, and therefore most paragliding tools — need one number. The mapping that preserves the pilot's actual task:

Try it · zone → effective radius

Every non-cylinder zone that survives this is an approximation. A sector becomes the full circle it is a slice of, which makes the turnpoint easier than the file says; a keyhole loses its stem. That is acceptable for display and route length, and it is not acceptable for scoring — never re-score a flight against a task that has been through this reduction.

06 Element explorer

Every element and attribute

Search by element, attribute or meaning, or narrow by category.

07 File inspector

Paste a task, read it back

Points are listed in flying order with their zone decoded and reduced to an effective radius. OptionalStart points are shown and marked as excluded. Parsed with the browser's XML parser — nothing is uploaded.

.tsk source · editable
Parsed live
08 What is lost

Translating to a paragliding task

A .tsk carries geometry beautifully and timing not at all. Importing one into a competition-task model therefore loses information in both directions — some of it silently. The honest list:

ConceptIn .tskConsequence
Start gatesAbsentNo gate time exists to import. An importer must either leave the task gateless or write a placeholder — and a placeholder gate means the task will not match the same task carrying real gates from XCTrack or FSDB.
Task deadlineAbsentNothing to import.
DateAbsentThe flying day has to come from the filename or the user.
ESSAbsentXCSoar has no end-of-speed-section concept distinct from the finish. Every imported task ends at goal.
TakeoffAbsentThe Start is the start of the speed section, not the launch.
Start directionAbsentEnter vs exit is not recorded; enter is the safe default.
Non-cylinder zonesRichReduced to cylinders on the way out — see §05.
Glider start limitsPresentstart_max_speed / start_max_height have no paragliding equivalent and are dropped.
The deduplication consequence is the one to remember. Because the gates are invented, the same task imported once from a .tsk and once from an .fsdb will not compare equal. If your system deduplicates tasks by content, expect .tsk imports to stand apart.
09 In We-Fly

What We-Fly reads

We-Fly imports .tsk in the competition-task library and the XC planner. The mapping:

In the fileBecomes
Point type="Start"SSS
Point type="Turn" / "Area"Turnpoint
Point type="Finish"Goal — LINE when its zone is a Line, else CYLINDER
Point type="OptionalStart"Dropped
Cylinder / Sector / Keyhole zonesCylinder of radius
Line zoneCylinder of length ÷ 2
Start gatesA placeholder gate — the task will not dedup against one with real gates

Files are capped at 64 KB, and a task needs at least two readable points. Exports are always .xctsk; We-Fly never writes .tsk.

10 Sources

What this reconciles