Changelog
What's new on gnsscalc.com, newest first. Library-level changes to the underlying gnss-js engine have their own changelog.
Changelog
User-visible changes to gnsscalc.com, newest first. The site deploys continuously, so entries are grouped by date rather than version. Library-level changes live in gnss-js’s own CHANGELOG.
2026-07-24
- Sharper live positioning on /ntrip. The live single-point position now models the ionosphere from a global ionosphere map (GIM) and the troposphere with a Saastamoinen model, replacing the broadcast Klobuchar and fixed-zenith approximations — on a mid-latitude station the height error drops from several metres to sub-metre. File-based positioning benefits from the new troposphere model too. (gnss-js 1.25.)
- /convert inspector header fixed. The frozen column header in the message field-by-field view was transparent, so rows scrolled through it; it is now solid.
- /convert now opens any receiver file, even with no observations. A navigation- or almanac-only log (e.g. an SBF almanac dump) used to fail with “no observation epochs”; it now shows the full record census, opens the field-by-field inspector, and offers a RINEX navigation download when it carries ephemerides — so you can see what’s inside a file regardless of what it holds.
- Live RTK on /ntrip — connect a base and a rover mountpoint for a real-time carrier-phase baseline: FIX / FLOAT / DGNSS status, ratio, per-epoch ΔENU and a horizontal scatter of fixed solutions. Integer ambiguity resolution runs in the browser (gnss-js 1.24, MLAMBDA). Verified live against two TU Delft stations — fixed solutions within ~2 cm of the surveyed inter-station baseline.
- Visibility planner forecasts BeiDou (and GLONASS when available) — future-date mode already covered GPS and Galileo from public agency almanacs; it now also pulls a TU Delft reference receiver’s SBF almanac feed, adding BeiDou and — whenever the receiver has broadcast them — GLONASS. Constellations light up in forecast mode exactly when almanac data exists for them; orbits stay km-class, pass times good to seconds.
2026-07-23
-
The visibility planner now works for future dates — pick next week and plan: positions come from broadcast almanacs (GPS from the US Coast Guard’s daily YUMA file, Galileo from the European GNSS Service Centre), propagated with the new gnss-js almanac engines (validated against the ICD’s own worked example and real receiver almanacs). Km-class orbits — pass times good to seconds, exactly what planning needs. GLONASS/BeiDou show as unavailable in forecast mode (their public almanac feeds don’t exist; a receiver-file source is planned).
-
Fixed: BeiDou GEO satellites (C01-C05, C59-C63) could be positioned hundreds of km off (gnss-js 1.23) — GEO records whose broadcast inclination exceeded an internal threshold were propagated with the wrong frame convention. Affected BDS GEO orbits on /rinex, sky plots, visibility and SPP whenever such records were in use; positions now verify against an RTKLIB reference harness at the metre level. gnss-js 1.23 also ships RTK stage 1 (DGNSS + carrier float engine, validated to centimetres against RTKLIB on a public base/rover pair) — the /ntrip live-RTK feature builds on it next.
-
u-blox files are now four-constellation navigation sources (gnss-js 1.22): Galileo I/NAV, BeiDou D1/D2 and GLONASS strings decode from RXM-SFRBX raw frames alongside the existing GPS path — a single F9P drop yields the full nav picture (validated: 62/62 E, 17/17 C, 37/37 R records vs RTKLIB on a 75-min capture). gnss-js 1.20/1.21 also land the same raw-frame decoding for Septentrio logs, almanac propagation for all constellations, and Galileo HAS decoding (E6-B → Reed-Solomon → precise corrections; 49,630 fields identical to the FGI reference decoder) — app-facing HAS features to follow.
-
RINEX 4 navigation export with GPS CNAV (gnss-js 1.19): receiver drops now also assemble CNAV ephemerides from raw L2C/L5 bits (Septentrio raw blocks, u-blox SFRBX; validated 21/21 against IGS RINEX 4 files — RTKLIB cannot decode these at all). /convert shows the CNAV count, and selecting RINEX 4 writes a v4 nav file carrying the CNAV and ionosphere records alongside the classic ephemerides.
-
Fixed: exported GLONASS navigation records carried a flipped clock sign (the v3 writer double-negated τₙ). If you exported a nav file from /convert or /rinex with GLONASS records before today, re-export it — clock-dependent processing of those satellites was biased by 2·τₙ (microsecond-scale, hundreds of metres in range).
-
NovAtel logs now yield GPS ephemerides from GPSEPHEM (gnss-js 1.18) — the decoded-fields log many OEM7 captures use instead of RAWEPHEM; validated 42/42 against same-day IGS BRDC files. The public OEM719 sample now decodes a complete GPS+GAL+BDS navigation set from one file. gnss-js 1.18 also decodes GPS CNAV (L2C/L5) from Septentrio raw blocks and u-blox SFRBX (IS-GPS-200 implementation — RTKLIB has none; 21/21 records vs IGS RINEX 4 files) — RINEX 4 export lands next.
-
The inspector’s NovAtel coverage now includes GALEPHEMERIS, BDSEPHEMERIS, GPSEPHEM/QZSSEPHEMERIS and IONUTC field tables — drift-guarded like the rest.
-
Message inspector on /convert: the record census is now clickable — browse every instance of a message type (own timestamp, size, CRC verdict) and dissect it field by field with vendor-doc names, scale factors and units, next to a hex dump that highlights each field’s bytes on hover. Full layout tables for observation, ephemeris and almanac messages on all three formats — including NovAtel RANGECMP’s bit-packed records and RAWEPHEM opened down to the individual GPS LNAV subframe fields; every other known type shows its dissected frame header + hex. Layout tables are drift-guarded by tests against the oracle-validated gnss-js decoders.
-
Single-file drops are now complete navigation sources (gnss-js 1.16/1.17): u-blox ephemerides assemble from raw RXM-SFRBX subframes (22/22 vs RTKLIB on a full F9P capture), NovAtel adds Galileo/BeiDou/QZSS ephemerides (107/107 on a public OEM719 capture), and all three formats now deliver the broadcast Klobuchar coefficients and leap seconds — so SPP on a dropped receiver log applies the iono correction (historically ~2× better 3D RMS) and exported nav files carry proper GPSA/GPSB/leap-second header lines.
-
/convert: one Download RINEX button for the whole dataset (obs in the selected version + nav when present) instead of two.
-
Fixed: a truncated final frame in a receiver log (e.g. the classic RTKLIB OEMV sample, cut at exactly 256 KiB) crashed the inspector.
-
Format detection is stricter and more tolerant at once: it now requires two checksum-valid frames (text can’t misdetect) and scans the first 128 KB, so captures that open with wrapper preamble — a public OEM719 file starts 4.6 KB in — are recognized.
-
Navigation data straight from receiver logs (gnss-js 1.15): Septentrio SBF (GPSNav/GLONav/GALNav/BDSNav/QZSNav) and NovAtel (RAWEPHEM, GLOEPHEMERIS) navigation blocks are now decoded alongside the observations. A single SBF or NovAtel drop on /rinex brings its own ephemerides — satellite orbits, SPP and Doppler prediction with no separate BRDC file — and /convert gains a “Download NAV” button that writes them as RINEX 3.04 NAV. Decoding is validated field-for-field against RTKLIB conversions (83 records, zero disagreements) and cross-checked against Septentrio’s own sbf2rin. SBF almanac blocks (GPS/GAL/GLO/BDS) decode in the library too — groundwork for planning beyond ephemeris validity.
-
Receiver file converter (/convert): u-blox UBX (RXM-RAWX), Septentrio SBF (Meas3 + MeasEpoch) and NovAtel (RANGE/RANGECMP) logs → RINEX 2/3/4, entirely in the browser. Formats are detected from frame syncs, gzip accepted. The same logs can be dropped straight onto /rinex for the full QC/SPP/export pipeline — one decoder path, two doors. Decoders (gnss-js 1.14) are validated observable-for-observable against RTKLIB conversions of reference datasets.
-
Live SPP card: ΔE/ΔN/ΔU now share one timeline chart.
-
/convert now lists every record in the file with its count — message and block names resolved from the vendor documentation (111 SBF blocks, 500+ NovAtel logs, common UBX messages): see at a glance whether a log carries almanacs, ephemerides, raw nav frames or just observations.
-
Fixed: live SPP on /ntrip was kilometres off (and stream-recorded RINEX epoch tags were 18 s early) — the MSM epoch conversion returned UTC where the whole pipeline expects GPS-scale time, computing every satellite 18 s early (gnss-js 1.14.1). Validated against a public caster: 1.1/1.0/4.8 m E/N/U RMS vs the station’s surveyed position. The live-SPP BRDC warm-up also walks back days now instead of failing silently at night.
-
Live positioning on /ntrip: while streaming, the page now solves SPP from the stream’s own decoded pseudoranges in real time — current fix, horizontal scatter and Up timeline against the station’s broadcast position (RTCM 1005/1006), with today’s BRDC seeding ephemerides so the first fix lands in seconds instead of minutes, and Klobuchar applied.
-
Broadcast orbit accuracy monitor on /status: pick a day and see broadcast-minus-precise orbit errors (vs ESA rapid/final products) per satellite, decomposed radial/along/cross with per-constellation RMS and orbit-only SISRE — the CoM/APC radial bias separated out honestly — plus broadcast clock errors against the precise clocks (constellation-ensemble and per-satellite bias removed) and the full SISRE per constellation. Click a satellite for its radial/along/cross/clock time series (GLONASS’s 30-minute sawtooth is clearly visible).
-
RINEX observation writers (2.11/3.04/4.01) moved into gnss-js 1.12.0, which also gains an SP3 precise-orbit parser with Lagrange interpolation — groundwork for a broadcast-vs-precise orbit comparison view.
2026-07-22
- Doppler chart on /rinex — observed D-observables per satellite, plus an observed-minus-predicted residual view from broadcast-orbit range rates (needs a nav file; validated at ±0.07 Hz on BRUX).
- ROTI mode on the ionosphere card — 5-minute sliding std of the rate of TEC, the standard irregularity/scintillation index.
- “vs GIM” mode on the ionosphere card — measured slant TEC against the ESA rapid GIM at each pierce point; exposes DCB-calibration bias directly.
- SPP now applies the broadcast Klobuchar model (gnss-js 1.11.0) — on a 24 h single-frequency test the 3D RMS dropped from 6.1 m to 2.4 m.
- Visibility planner buildout (/visibility): map location picker with search and shareable deep links, start time with midnight-crossing BRDC merge, paintable per-azimuth horizon mask, unified satellite selector with constellation groups and health flags, per-constellation visible-count and DOP charts, pass Gantt, sky plot + world view with comet-trail animation, elevation chart with cutoff band and satellite hover/pin, ionosphere card (TEC world map, TEC at your location vs the broadcast model, NOAA Kp strip).
- SPP folded into /rinex with a ΔENU accuracy plot; the separate /spp page now redirects there.
- Animated TEC sky plot on /rinex.
- Archive browser on /rinex — browse IGS/EUREF/NOAA archives by day with a station map, one click loads obs + matching nav.
- NTRIP proxy relay: unit-tested decision logic (SSRF guard, cache TTLs, chunked-body handling).
- Archive browser: all TU Delft DPGA stations now appear on the station map (coordinates taken from their own RINEX headers).
- Every chart can now be downloaded as a PNG (hover a chart card for the button).
- Deep links for /positioning (
?x&y&z&rx&ry&rz) and /spectrum (?band&sys), with Share buttons like the planner’s. - UTC/local time toggle on the NMEA track statistics.
- The processing backdrop now also covers /nmea and /antex loading.
2026-07-21
- Ionosphere view modes: per-arc TEC variation, rate of TEC (ΔTEC/Δt), and second difference.
2026-07-20
- DCB-calibrated slant TEC on the RINEX ionosphere card (ESA bias product; receiver bias from the night floor).
- Load RINEX files directly from archive URLs (
?url=deep links). - Ionospheric slant TEC chart on the RINEX QC page.
- Satellite visibility planner (first version) and single-point positioning pages.
- Reference-frame transform tool (ITRF/ETRF, 14-parameter Helmert) on /positioning.
- NTRIP client deep links; navbar grouped into dropdowns.
Earlier
- Per-code-band multipath, cycle-slip and completeness QC; RINEX header editor, export/convert, PDF report (/rinex).
- Live broadcast ephemeris status page with all decoded fields and satellite generations (/status).
- NMEA reader with track map and GPX export; ANTEX PCV viewer; NTRIP sourcetable browser and stream monitor; GNSS signal spectrum viewer; GPS time tools.