Uploads and TLE ingestion
The console ingests fleet data from files and pasted text, validates it precisely enough to tell you which record and which line failed and why, and then treats the result as a first-class scene asset: same propagation, same rendering, same analytics as the operator fleet.
Use uploads to onboard a legacy catalog before edge agents are deployed, to bring what-if assets into planning sessions, or to load training scenarios.
An import in progress: file list on the left, per-record validation results on the right, with one checksum warning and one rejected record called out by name and line.
Supported formats
| Format | Extensions | Notes |
|---|---|---|
| TLE, two-line or three-line | .tle, .3le, .txt, pasted text | The primary path for satellites; a leading non-TLE line is read as the satellite name |
| CSV | .csv | Header row required; columns are inferred |
| JSON | .json | Arrays of records, or objects wrapping a data, assets, or nodes array; nested objects are flattened |
| NDJSON / JSON Lines | .ndjson, .jsonl | One record per line |
| Parquet | .parquet | Not parsed in-browser yet. Export to CSV or JSON, or ingest via your telemetry pipeline and sync from the API |
CCSDS OMM and OEM files are recognized and previewed during fleet setup, with honest limits: OMM records import as tabular assets (propagation from mean elements is not wired yet), and OEM ephemerides are retained as raw text but not importable as assets.
TLE validation
TLE ingestion is strict where it matters and lenient where it helps. For every record the parser checks:
- Line structure: line 1 must start with
1, line 2 with2. A malformed line rejects that record with the offending text quoted. - Cross-line agreement: the NORAD id in line 1 must match line 2. A mismatch rejects the record and names both ids.
- Checksums: the standard mod-10 checksum on each line is verified. A mismatch is a warning, not a rejection, since hand-edited TLEs are common; the warning states the expected and found digits.
Errors and warnings are reported per record, with the satellite's name (or NORAD id) attached, so a 500-satellite file with three bad records imports 497 and tells you exactly which three to fix. Partial imports are always precise, never silent.
Tabular imports (CSV, JSON, NDJSON)
Column names are inferred case-insensitively. The importer looks for:
- Identity: an id or name/label column groups rows into assets; without one, each row previews as its own asset (with a warning).
- Position: latitude and longitude columns; without them, assets may not appear on the globe (warned, not rejected).
- Type: an explicit type column ("ground", "gateway", "gs", "sat", "dc"), orbital-element columns, or an altitude heuristic (below 100 km reads as a ground site) classify each asset as satellite, ground station, or data center.
- Telemetry: time-stamped rows become time-series samples on the asset (utilization, health, capacity, queue depth, and free-form metrics), sampled against the sim clock like any other telemetry.
- Orbital elements:
tle_line1/tle_line2columns promote a tabular satellite into the full propagation pipeline.
Imported ground stations receive Ka fronthaul access links against visible satellites, derived from the same geometric feasibility rules as the operator fleet.
Single-point rows (one row per asset, no time series) can be spread across the simulation window with a propagation-hours option, so a static snapshot still animates sensibly on the timeline.
The propagation pipeline
TLE-backed uploads do not get a separate, lesser motion path. Every TLE-bearing satellite, uploaded or synthetic, registers with the same propagation worker as the operator catalog:
- The worker propagates every satellite with SGP4 into sampled position windows (30-second steps, precomputed in chunks).
- Your assets' columns are appended to the same sample windows as the fleet's.
- The globe interpolates between samples every frame with cubic Hermite interpolation, so motion is smooth at any playback speed. Interpolated positions stay within roughly 2 km of direct SGP4 evaluation for LEO.
- Coarse-tick positions used by analytics come from the same registry, so what you see and what gets computed always agree.
Epoch handling, in plain language
A TLE is a snapshot of an orbit at a specific moment (its epoch). Propagating a TLE far from its epoch degrades accuracy, and your file's epochs will rarely match the console's simulation window.
The console handles this with a sticky per-record epoch bias: each satellite is propagated relative to its own TLE epoch and anchored consistently into the simulation window, and that anchoring never drifts between frames or re-imports. Propagation is gated to a 14-day validity window around each record's epoch, and the bias re-anchors only when a very large seek strands the biased instant outside that window. Catalog entries whose epoch trails the newest one by more than 90 days are treated as decayed and dropped rather than drawn in fictional positions. The practical effects:
- A fresh TLE renders where it should be at sim time.
- An older TLE still renders a physically sensible, smoothly moving orbit rather than jumping or being rejected.
- The satellite detail card shows the ephemeris epoch and its age, so you can judge staleness rather than guess.
For analysis-grade accuracy, prefer TLEs whose epochs are close to the window you are studying.
Common failure modes
| Symptom | Cause | Fix |
|---|---|---|
| "line 1 must start with ..." | Wrapped lines, BOM, or a stray header inside the TLE block | Re-export with original line breaks; the parser quotes the bad text |
| "NORAD mismatch: line 1 has X, line 2 has Y" | Interleaved records from a bad concatenation | Rebuild the file; records are independent, so the rest import |
| Checksum warnings | Hand-edited TLE lines | Safe to import; regenerate checksums if the source allows |
| Assets import but do not appear on the globe | No latitude/longitude columns and no TLE | Add position columns, or TLE lines for satellites |
| Every row became its own asset | No id or name column detected | Add an id column so rows group per asset |
| "Parquet is not parsed in-browser yet" | Parquet upload | Convert to CSV/JSON or ingest via the Telemetry API |
| File imports zero records with no errors | Empty or whitespace-only content past the header | Check the export actually contained rows |
Example scenarios
A vendor TLE drop with one bad record. A flight dynamics vendor sends a 3LE file where one satellite's line 2 was truncated. The import summary reads "63 of 64 records imported" and names the failed satellite and the reason. The operator fixes one line instead of re-requesting the file.
Static ground stations from a GIS export. A CSV with site_id, name, lat, lon, alt_m imports as ground stations. They appear on the globe with fronthaul access links immediately, and the team asks the assistant to compare contact time across them the same afternoon.