API Reference
gpx-export exposes a focused, typed API for building GPX 1.1 documents.
The main export is generateGpx(...).
generateGpx(...)
Generates GPX 1.1 XML from either:
generateGpx(track: GpxTrack, metadata?: GpxMetadata) or
generateGpx(document: GpxDocument, metadata?: GpxMetadata).
import { generateGpx } from "gpx-export";
const now = new Date("2026-01-01T12:00:00.000Z");
const xml = generateGpx(
{
name: "Session",
points: [{ lat: 54.57, lon: -1.31, time: now }]
},
{
name: "Morning Ride",
time: now
}
);
Returns
- string - GPX 1.1 XML document
GpxDocument
interface GpxDocument {
metadata?: GpxMetadata;
waypoints?: GpxWaypoint[];
routes?: GpxRoute[];
tracks?: GpxTrack[];
}
GpxMetadata
interface GpxMetadata {
name?: string;
desc?: string;
author?: GpxAuthor;
link?: GpxLink;
time?: Date;
keywords?: string;
copyright?: string | GpxCopyright;
bounds?: GpxBounds;
}
interface GpxAuthor {
name: string;
link?: GpxLink;
}
interface GpxCopyright {
author: string;
year?: number;
license?: string;
}
interface GpxLink {
href: string;
text?: string;
type?: string;
}
GpxPointExtensions
interface GpxPointExtensions {
speed?: number; // gpxtpx:speed (m/s)
heartRate?: number; // gpxtpx:hr (bpm)
cadence?: number; // gpxtpx:cad (rpm)
rawXml?: string; // trusted XML in <extensions>
}
GpxPoint
interface GpxPoint {
lat: number;
lon: number;
time: Date;
speed?: number; // legacy alias for extensions.speed
elevation?: number; // metres
extensions?: GpxPointExtensions;
}
Why speed appears in both places: GpxPoint.speed is a legacy compatibility alias,
while GpxPoint.extensions.speed is the canonical field for new code.
If both are provided, extension speed takes precedence and only one GPX speed tag is emitted.
GpxTrack
interface GpxTrack {
name: string;
createdAt?: Date;
points?: GpxPoint[];
segments?: { points: GpxPoint[] }[];
cmt?: string;
desc?: string;
extensions?: GpxPointExtensions;
}
GpxRoute and GpxWaypoint
interface GpxRoute {
name?: string;
cmt?: string;
desc?: string;
points: GpxRoutePoint[];
extensions?: GpxPointExtensions;
}
interface GpxWaypoint {
lat: number;
lon: number;
name?: string;
cmt?: string;
desc?: string;
elevation?: number;
time?: Date;
extensions?: GpxPointExtensions;
}
Behavior notes
- Creator defaults to
gpx-export. generateGpx(track, metadata?)wraps track input into a one-track document.metadatashallow-merges ontodocument.metadata.- Elevation is formatted to 2 decimal places.
- Speed is formatted to 4 decimal places as
gpxtpx:speed. - Garmin
gpxtpxnamespace is emitted when Garmin metrics are present on track points. - Garmin metric tags are emitted under track-point
<extensions>only. rawXmlextension values are inserted as trusted XML and are not escaped.