You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A KSP plugin that exposes live telemetry data over HTTP and WebSocket, letting you build external dashboards, flight instruments, and ground control applications for your vessels.
Features
HTTP REST + WebSocket API on port 8085 — poll or stream any telemetry value in real time
Camera streaming — capture in-game camera views as JPEG snapshots over HTTP
Built-in web UI — flight controls, navigation, orbital data, map, console, SmartASS, and more, accessible from any browser on your network
Flight control — throttle, staging, SAS modes, RCS, action groups, and fly-by-wire attitude control
Delta-V readouts — per-stage and total delta-V, TWR, ISP, burn time, and mass breakdown
Maneuver node management — create, update, and delete maneuver nodes via the API
N-body orbit analysis — mean elements, flight plan burns, recurrence
In testing
All mod integrations are soft dependencies via reflection — no mod DLLs are required at build time. Query a.mods at runtime to check which mods are detected, or a.physicsMode to check if Principia's N-body integrator is active ("n_body" vs "patched_conics").
Installation
Download the latest GameData.zip from the Releases page.
Extract and merge the GameData/ folder into your KSP installation directory.
Launch KSP. The Telemachus server starts automatically when a vessel with a Telemachus antenna is active, or when running in partless mode.
Open a browser and navigate to http://localhost:8085/ to access the built-in UI.
The default port is 8085 and binds to 0.0.0.0 (all interfaces). Both can be changed in the plugin configuration file.
API overview
Endpoints
Endpoint
Protocol
Purpose
/telemachus/datalink
HTTP GET/POST
Poll telemetry values
/datalink
WebSocket
Stream telemetry in real time
/telemachus/cameras
HTTP GET
List available cameras
/telemachus/cameras/<name>
HTTP GET
Capture a camera frame (JPEG)
/telemachus/*
HTTP GET
Built-in web UI (static files)
HTTP polling
Query parameters use key=value format, where the key is an arbitrary label and the value is the API string:
GET /telemachus/datalink?alt=v.altitude&lat=v.lat&lon=v.long
{ "alt": 12345.6, "lat": -0.0974, "lon": 285.4 }
Multiple values in a single request:
GET /telemachus/datalink?alt=v.altitude&pe=o.PeA&ap=o.ApA&throttle=f.throttle
You can also POST a JSON body instead of query parameters:
The server pushes a JSON object with current values at the requested interval (milliseconds).
Command
Description
"+"
Subscribe to API keys (array)
"-"
Unsubscribe from API keys (array)
"run"
One-shot evaluation — included in the next update only (array)
"rate"
Set update interval in milliseconds (integer, default 500)
"binary"
Subscribe to binary stream — values sent as big-endian float32 (array)
Binary packet format: byte 0 is 0x01 (marker), followed by 4-byte IEEE 754 big-endian floats in subscription order. Sent alongside the JSON text frame each tick.
Error handling
Unknown API keys are returned in an "unknown" array. Exceptions are returned in an "errors" object:
Some API keys accept parameters in bracket notation:
r.resource[ElectricCharge] — resource by name
b.name[3] — celestial body by index
o.orbitalSpeedAt[1200.0] — speed at orbit time
mj.surface[90,45] — MechJeb heading + pitch
v.setPitchYawRollXYZ[0,0,0,1,0,0] — FBW attitude + translation
Scaling for embedded controllers
For integer-only boards (Raspberry Pi Pico, MicroBlocks, etc.) that can't handle floating-point JSON, both /api/ and /telemachus/datalink support scaling query parameters.
Input scaling — map an integer range to 0.0–1.0 before the API processes it:
GET /api/f.setThrottle?args=512&scale=0,1023 → throttle set to ~0.5
Output scaling — round to N decimals, optionally shift to integer:
GET /api/v.altitude?precision=2 → 18345.67
GET /api/v.altitude?precision=2&int=true → 1834567 (divide by 100 on board)
On the batch endpoint (/telemachus/datalink), use _scale, _precision, and _int as global defaults:
GET /telemachus/datalink?alt=v.altitude&pe=o.PeA&_precision=1&_int=true
→ { "alt": 183457, "pe": 750001 }
Or override per-key with pipe syntax in the value string:
GET /telemachus/datalink?alt=v.altitude|precision:2|int&t=f.setThrottle[512]|scale:0,1023
→ { "alt": 1834567, "t": 1 }
Per-key pipe modifiers take precedence over global _ parameters.
Modifier
Where
Effect
scale=min,max / `
scale:min,max`
Input
precision=N / `
precision:N`
Output
int=true / `
int`
Output
OpenAPI spec
A machine-readable OpenAPI 3.1 spec is auto-generated from the source code. It covers all endpoints below, including mod-specific ones (tagged with x-requires-mod). (The OpenAPI spec and schema generation pipeline are not yet released — in testing.)
When Principia is installed, KSP's patched-conic orbit propagator is replaced with an N-body integrator. Stock o.* values become osculating (instantaneous Keplerian) snapshots. Principia's orbit analyser computes mean elements averaged over many orbits — these are available under o.mean.*.
All data is read via reflection from Principia's runtime state. No Principia DLLs are needed at build time, and Principia's (removed) external API is not used.
Detection & status
Key
Description
principia.available
Principia is installed
principia.version
Principia assembly version
principia.active
Principia plugin is running
principia.analysisProgress
Orbit analysis progress (0–1)
principia.missionDuration
Analysis mission duration (s)
Mean orbital elements
These mirror the stock o.* keys but report mean (time-averaged) values from Principia's orbit analyser. Angles are in degrees, distances are altitudes (body radius subtracted).
Key
Description
Unit
o.mean.sma
Mean semi-major axis
m
o.mean.eccentricity
Mean eccentricity
—
o.mean.inclination
Mean inclination
deg
o.mean.lan
Mean longitude of ascending node
deg
o.mean.argumentOfPeriapsis
Mean argument of periapsis
deg
o.mean.PeA
Mean periapsis altitude
m
o.mean.ApA
Mean apoapsis altitude
m
Element ranges (min/max from N-body integration)
Each returns { "min": number, "max": number }.
Key
Description
o.mean.smaRange
SMA range
o.mean.eccentricityRange
Eccentricity range
o.mean.inclinationRange
Inclination range (deg)
o.mean.PeARange
Periapsis altitude range (m)
o.mean.ApARange
Apoapsis altitude range (m)
Periods, precession & recurrence
Key
Description
Unit
o.mean.siderealPeriod
Sidereal period
s
o.mean.nodalPeriod
Nodal period
s
o.mean.anomalisticPeriod
Anomalistic period
s
o.mean.nodalPrecession
Nodal precession rate
rad/s
o.mean.recurrence
Orbit recurrence info (object)
—
Flight plan
Key
Description
principia.plan.count
Number of planned burns
principia.plan.guidance
Navball guidance active
principia.plan.burns
All planned burns (array of objects)
principia.plan.burn[index]
Single burn by index
principia.analysis
Complete orbit analysis dump (object)
Each burn object contains { tangent, normal, binormal, initial_time, duration } in m/s and seconds.
land.* — Landing prediction (WIP — in testing)
Key
Description
Unit
land.timeToImpact
Estimated seconds to impact
s
land.speedAtImpact
Predicted speed at impact (current thrust)
m/s
land.bestSpeedAtImpact
Predicted speed at impact (max thrust)
m/s
land.suicideBurnCountdown
Seconds until suicide burn start
s
land.predictedLat
Predicted landing latitude
deg
land.predictedLon
Predicted landing longitude
deg
land.predictedAlt
Predicted landing terrain altitude
m
land.slopeAngle
Terrain slope angle under vessel
deg
therm.* — Thermal monitoring (WIP — in testing)
Key
Description
Unit
therm.hottestPartTemp
Hottest part temperature
C
therm.hottestPartTempKelvin
Hottest part temperature
K
therm.hottestPartMaxTemp
Hottest part max temperature
K
therm.hottestPartTempRatio
Hottest part temp ratio (0–1)
—
therm.hottestPartName
Hottest part name
string
therm.hottestEngineTemp
Hottest engine temperature
K
therm.hottestEngineMaxTemp
Hottest engine max temperature
K
therm.hottestEngineTempRatio
Hottest engine temp ratio (0–1)
—
therm.anyEnginesOverheating
Any engine near overheat (>90%)
bool
therm.heatShieldTemp
Heat shield temperature
K
therm.heatShieldTempCelsius
Heat shield temperature
C
therm.heatShieldFlux
Heat shield thermal flux
kW
sci.* / career.* / comm.* — Science, career & comms (WIP — in testing)
Key
Description
sci.count
Number of science experiments aboard
sci.dataAmount
Total science data aboard
sci.experiments
Experiments with data (object)
career.funds
Available funds
career.reputation
Current reputation
career.science
Available science points
career.mode
Game mode (CAREER / SCIENCE / SANDBOX)
comm.connected
CommNet is connected
comm.signalStrength
CommNet signal strength (0–1)
comm.controlState
CommNet control state (0=none, 1=partial, 2=full)
comm.controlStateName
CommNet control state name
comm.signalDelay
CommNet signal delay (s)
Building
The project targets .NET Framework 4.7.2 via an SDK-style csproj and builds with the .NET SDK. Unity and KSP reference DLLs are pre-committed to references/ — no KSP installation is required to build.
Pull requests: please follow the conventional commits format (feat:, fix:, docs:, etc.). A commit-msg hook is installed automatically when you enter the Nix dev shell.