A sextant that works with no signal.
A bubble sextant, a nautical almanac, and a sight reduction table, computed from first principles on your phone. The almanac is real: truncated VSOP87D for the Sun, Meeus ELP for the Moon, Hipparcos astrometry for all 57 navigational stars plus Polaris, and WMM2025 for magnetic variation. Nothing is fetched at runtime. Every number below is reproducible, and the self test proves it against published worked examples.
Keep it in your pocket
installInstall it and it runs with the radio off, in a life raft, in a canyon, on a plane. Open it once with a connection first so the cache fills.
On iPhone: tap Share, then Add to Home Screen. Launch it once from the home screen while you still have signal, because an installed web app keeps its own cache separate from Safari's and has to fill it. iOS may show a snapshot of the page instead of the icon: the home screen glyph needs a real image file at a real URL, and this tool ships as three text files with the icon inlined, so that trade was deliberate.
Station
everything reads from here
Assumed position, height of eye, and clock. The reduction is only as good as the time: 4 seconds of clock error is 1 nautical mile of longitude, and a phone clock with no network can drift further than that in a week.
Delta T is 69.1 s across 2024 to 2028 and is not predictable, so it is a constant you can override rather than a formula. It matters almost not at all to the Sun and Moon positions and enormously to sidereal time, which is why the code keeps UT1 and TT strictly separate.
What the overlay is, and is not
the camera points, the accelerometers measure
The reticle drawn over the camera image is a pointing aid. It is placed using the
device orientation and an assumed field of view, because no browser will tell a page
what the lens actually is: MediaTrackSettings has no focal length and no
angle of view. So the marker for a body can sit a few degrees from where the body really
appears, and it gets worse toward the edges of the frame where lens distortion lives.
None of that touches the measurement. The altitude recorded when you capture is the accelerometer's angle against gravity, exactly as it is on the manual sight tab, averaged over the capture window and rejected if you were moving. The overlay's only job is to get the body into the middle of the frame, where the crosshair is, and the crosshair is real: it is the sighting axis.
The guided path also does nothing you cannot do by hand. It picks bodies with the same sky survey, logs sights the same way as sight, and solves the same least squares fix as fix. If a step here disagrees with one of those tabs, those tabs are right.
Take a sight
01 · observationTwo ways in. Point the phone and let the accelerometers measure the angle against gravity, or type a reading from a real sextant. The manual path is not a fallback, it is the accurate path: a marine sextant in a steady hand beats these sensors by a factor of ten and this tool will reduce its sights properly.
By sensor
bubble sextantAltitude is measured against the local gravity vector, not against the sea horizon, so there is no dip correction and no horizon is required. That is a real advantage: it works inland, at night, in haze. What it costs you is accuracy, and the honesty tab shows exactly how much.
By hand
real sextantSextant altitude Hs, exactly as read off the arc, before any correction. Degrees and decimal minutes, or decimal degrees.
The sight is stamped with the UTC shown in the status strip at the instant you tap. If you are working up sights from a notebook, freeze the clock in Station first and set the recorded time.
Index error
calibrationThe single most valuable thing you can do to a phone sextant. Camera and accelerometer are not perfectly aligned, and the offset is a fixed per-device constant, so measuring it once removes the largest systematic term you have. Lay the phone on something you trust to be flat, or sight a known altitude.
The flat capture assumes the top edge axis reads zero when the phone lies face up on a level surface, which is the definition of that axis. For the camera axis, lie the phone on its back and sight the zenith, or use a known altitude instead.
Nautical almanac
02 · ephemerisGreenwich hour angle, declination and, for stars, sidereal hour angle, computed rather than tabulated. This is the page of the almanac you would have opened.
The 57, and Polaris
sidereal hour angleAlmanac order, which is descending sidereal hour angle as it stood when the list was fixed. Numbers 39 and 40 have since swapped by precession and the almanac has never renumbered them; that inversion is preserved here rather than quietly corrected.
| # | Star | Mag | SHA | Dec |
|---|
What is not here
omissionsThe planets. Venus, Mars, Jupiter and Saturn are the four the almanac tabulates and they are genuinely useful, particularly Venus in daylight. They are absent because no planetary theory was verified to a defensible accuracy during the build, and a fabricated Venus that looks plausible is far more dangerous than a missing one. If you shoot planets, you need a real almanac. Everything else here is validated against published worked examples in the honesty tab.
Sight reduction
03 · Hs to interceptThe whole working, in order, because seeing the working is the point. Marcq St Hilaire: compute the altitude the body would have from the assumed position, subtract it from what you observed, and the difference in arcminutes is nautical miles toward or away along the azimuth.
Sights on the book
04 · the fixSigma is the error you believe each sight carries, in arcminutes. It is editable because you know things the tool does not. It drives the weighting and the size of the error ellipse, so guessing it low does not make you more accurate, it just makes the tool lie to you.
Running fix
advance the LOPA line of position is only true at the instant of its sight. If you moved between sights, every sight has to be referred to the position at fix time or the answer is nonsense; in the worked example, omitting the run put the fix 46 nautical miles out.
Noon sight
05 · latitude by meridian altitudeAt upper meridian passage the body bears due north or due south and the arithmetic collapses to subtraction. It needs no clock at all, only the maximum altitude, which is why it outlived the whole chronometer problem and why it is the technique to fall back on when you doubt your time.
Work the sight
observed maximumCompass check
06 · azimuthA celestial body gives you a true bearing with no instrument error in it at all. Compare that against what the compass says and the difference is total compass error. The geomagnetic model then splits it: what the Earth's field does is variation, what is left over belongs to the compass and its surroundings.
Magnetic field here
WMM2025Degree 12 spherical harmonics, coefficients as published by the model's developers, validated in the honesty tab against all 168 official test values. A global model cannot represent local anomalies: ore bodies, wrecks and ferrous structures reach several degrees and this model is silent about them. That is what the manual override is for.
Amplitude
body on the horizonThe quick check, at the instant the body's center crosses the celestial horizon. The formula is exact, not an approximation, but the moment is not when the Sun appears to touch the sea: refraction plus dip put its center about 50 arcminutes below the celestial horizon at apparent sunrise.
Twilight
07 · when to shootStar sights need stars and a sharp horizon at the same time, and that is only true while the Sun sits between 6 and 12 degrees below the horizon. At low latitudes the window is about 25 minutes. At high latitudes it can last hours, or never open.
What is up
star finderZenith at the center, horizon at the rim, north at the top. The shaded annulus is the band worth shooting: below 15 degrees refraction stops being predictable, above 70 the instrument is awkward and the straight line intercept starts to bend.
| Body | Mag | Hc | Zn |
|---|
Best three
fix geometryRanked by how evenly the azimuths are spread, not by brightness. Three bright stars in a 20 degree arc give a long thin error ellipse; three ordinary ones at 120 degrees give a round one. Geometry beats magnitude.
What this actually achieves
08 · error budgetOne arcminute of altitude error is one nautical mile of position error. That is not an approximation: a nautical mile is defined as one minute of arc, and a line of position is a circle of equal altitude whose radius is the zenith distance. So the conversion is exact, and it is unforgiving.
Where the error comes from
ranked| Source | Typical | Note |
|---|---|---|
| Magnetic interference | 2 to 20 deg | Hard and soft iron. A magnetic case or car mount alone is worth tens of degrees. Affects bearings only, not the fix. |
| Aiming, top edge | 0.5 to 2 deg | Sighting along a 7 mm edge with no rear sight. A per sight bias, so averaging does not remove it. |
| Aiming, camera | 0.02 to 0.1 deg | A 65 degree field over 1080 px is 0.06 deg per pixel. |
| MEMS tilt, static | 0.1 to 0.3 deg | Measured against reference clinometers. Static is the good case, and it is your case. |
| Browser quantization | 0.1 deg | Chromium rounds orientation angles to 0.1 deg as a fingerprinting defense. iOS does not round. |
| Linear acceleration | 5.7 deg per 0.1 g | Gravity and surge are indistinguishable to an accelerometer. This is what kills a phone sight on a moving vessel. |
| Refraction model, above 15 deg | 0.05 arcmin | Bennett, with pressure and temperature. Negligible. |
| Refraction model, below 5 deg | 1 to 5 arcmin | Anomalous refraction. Not modellable from the surface. Do not shoot here. |
| Ephemeris, Sun | 0.03 arcmin | Truncated VSOP87D. Two orders below the observation. |
| Ephemeris, Moon | 0.32 arcmin | Meeus ELP truncation, worst case. |
| Ephemeris, stars | 0.005 arcmin | Hipparcos, precessed, with aberration and nutation. |
Note what is missing from the top of that list: the arithmetic. The mathematics in this page is 20 to 200 times better than the best observation you can feed it. The instrument is the limit, always.
Honest comparison
what to expect| Instrument and method | Altitude | Position |
|---|---|---|
| Marine sextant, skilled, good horizon | 0.2 to 1.0 arcmin | 0.2 to 1 nmi |
| Aircraft bubble sextant, 2 min averaging | 2 to 6 arcmin | 2 to 10 nmi |
| This phone, camera axis, calibrated, 5 sights averaged, on land | 6 to 15 arcmin | 6 to 15 nmi |
| This phone, one top edge sight, uncalibrated | 30 to 120 arcmin | 30 to 120 nmi |
| This phone, on a moving vessel | erratic | 20 to 100+ nmi |
Self test
auditableThe published worked examples, run through the same functions the tool uses, with the numeric deltas shown. Meeus examples 12.a, 12.b, 22.a, 25.a, 47.a and 13.b; all 168 official WMM2025 test values; and closed loop checks on the correction chain, the two body fix, the running fix, the noon sight and the amplitude formula. If any of these fail, do not trust the numbers on the other tabs.
| Check | Computed | Reference | Delta |
|---|
Provenance and doubts
read thisGeomagnetic model. WMM2025, epoch 2025.0, valid to 2030.0, coefficients dated 13 November 2024. They were taken from the CIRES Geomagnetism repository, the NOAA partner institute that co-develops the model with BGS, and confirmed byte identical against five independent mirrors including the US Naval Research Laboratory and OpenCPN. NOAA's own site could not be reached directly during the build. The synthesis reproduces all 168 official test values to the rounding floor of the published table, which wrong coefficients could not do. It still deserves an independent check against ncei.noaa.gov before anyone leans on it.
Delta T and DUT1. The 69.1 s default is derived, not looked up: 32.184 s plus 37 s of TAI minus UTC, less an IERS DUT1 of about 0.07 s that could not be confirmed from a primary source here. The worst case error if DUT1 is entirely wrong is 0.23 nautical miles. It is a user editable field for a reason.
Rigil Kentaurus. Alpha Centauri is a binary whose components separate by up to 22 arcseconds and the catalogs disagree about which one they mean. The position here is component A. The magnitude given is the combined AB light, which is what the almanac tabulates and what your eye sees.
Sensor behavior on iOS. Permission persistence inside an installed home screen web app is documented inconsistently and was not verified on hardware. The enable button is therefore always present and always re-callable rather than hidden once granted.
Screen rotation. The device coordinate frame is welded to the hardware and does not rotate with the screen. Applying screen.orientation.angle to the sensor data is a common inherited bug worth up to 90 degrees; this page defines its sighting axes in device coordinates so the question never arises.
Stored state
local onlyPosition, height of eye, index error, calibration, preferences and every saved sight live in this browser's localStorage and go nowhere else. There is no server.