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.
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.
.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.Task, Point, Waypoint, Zone
<?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.
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.The <Task> element
| Attribute | Values | Meaning |
|---|---|---|
type | see below | Which XCSoar task factory built the task. Governs which zones and edits XCSoar allows. |
task_scored | 0 / 1 | Whether the task counts for scoring. |
aat_min_time | seconds | Minimum task time for an assigned-area task. |
start_requires_arm | 0 / 1 | Pilot must arm the start manually. |
start_max_speed | m/s | Maximum ground speed at the start. 0 = no limit. |
start_max_height | metres | Maximum height at the start. 0 = no limit. |
start_max_height_ref | AGL / MSL | Datum for the start-height limit. |
finish_min_height | metres | Minimum height at the finish. |
finish_min_height_ref | AGL / MSL | Datum for the finish-height limit. |
fai_finish | 0 / 1 | FAI finish-height rule applies. |
Task types
The type value names an XCSoar task factory. The ones you meet in practice:
| Value | Task |
|---|---|
RT | Racing task — fixed turnpoints, first to goal. What almost every shared .tsk is. |
AAT | Assigned-area task — turn areas rather than points, flown against aat_min_time. |
MAT | Modified-assigned task — pilot-chosen turnpoints. |
Mixed, Touring | Free mixes of the above, and non-competitive touring tasks. |
FAI* | The FAI badge/record factories — general, triangle, out-and-return, goal. |
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.<Point> and its types
type | Role | Notes |
|---|---|---|
Start | Start of the task | Exactly one. In competition terms this is the SSS. |
Turn | Turnpoint | Zero or more, in order. |
Area | Turn area | An AAT sector — geometrically a turnpoint with a large zone. |
Finish | Finish | Exactly one, last. In competition terms this is the goal. |
OptionalStart | Alternative start | An 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 / attribute | Meaning |
|---|---|
Waypoint name | Display name. Often "CODE Name". |
Waypoint id, comment, altitude | Optional; carried from the waypoint database. altitude is metres. |
Location latitude / longitude | Signed decimal degrees, WGS84. No hemisphere letters, no minutes — the simplest coordinates of any format on this site. |
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 type | Shape | Sizing attributes |
|---|---|---|
Cylinder | Full circle | radius (m) |
Line | Straight line across the course | length (m) — the total width |
Sector | Pie slice between two radials | radius, start_radial, end_radial (°) |
FAISector | The classic 90° FAI photo sector | radius |
Keyhole | Small cylinder + wide sector beyond it | radius |
CustomKeyhole | Keyhole with adjustable dimensions | radius, inner_radius, angle |
DAeCKeyhole | The German DAeC keyhole | fixed dimensions |
BGAStartSector | BGA start sector | fixed dimensions |
BGAFixedCourse | BGA fixed-course sector | fixed dimensions |
BGAEnhancedOption | BGA enhanced-option sector | fixed dimensions |
AnnularSector | Sector with a hole in the middle | radius, inner_radius, radials |
SymmetricQuadrant | Quadrant bisected by the course line | radius, angle |
MatCylinder | MAT-task cylinder | radius |
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:
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.
Every element and attribute
Search by element, attribute or meaning, or narrow by category.
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.
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:
| Concept | In .tsk | Consequence |
|---|---|---|
| Start gates | Absent | No 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 deadline | Absent | Nothing to import. |
| Date | Absent | The flying day has to come from the filename or the user. |
| ESS | Absent | XCSoar has no end-of-speed-section concept distinct from the finish. Every imported task ends at goal. |
| Takeoff | Absent | The Start is the start of the speed section, not the launch. |
| Start direction | Absent | Enter vs exit is not recorded; enter is the safe default. |
| Non-cylinder zones | Rich | Reduced to cylinders on the way out — see §05. |
| Glider start limits | Present | start_max_speed / start_max_height have no paragliding equivalent and are dropped. |
.tsk and once from an .fsdb will not compare equal. If your system deduplicates tasks by content, expect .tsk imports to stand apart.What We-Fly reads
We-Fly imports .tsk in the competition-task library and the XC planner. The mapping:
| In the file | Becomes |
|---|---|
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 zones | Cylinder of radius |
| Line zone | Cylinder of length ÷ 2 |
| Start gates | A 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.
What this reconciles
src/Task/Serialiser.cpp and Deserialiser.cpp are the format's real definition
XCSoar — user manualxcsoar.org · task types, observation zones and start rules explained for pilots
XCTrack — Competition Interfacesxctrack.org · the cylinder-only model .tsk tasks are reduced into
We-Fly — XCTrack task formatwe-fly.cloud/specs · where an imported .tsk ends up