Aurora Chaser reads the NOAA space-weather nowcast every few minutes, works out which part of the sky is actually worth photographing from your camera's position, and turns the lens there. Then it checks the sun, the cloud and the moon — and stands down when the answer is no.
These are not mockups. Every frame below is the settings UI on a camera in northern Norway, showing 2,579 live OVATION cells valid 19:57 UTC — the same grid the aiming logic scored, not a prettier separate feed.
In the shots above the oval spills well past the outer ring, over Russia and the pole. That part is genuinely happening and genuinely unphotographable from this camera — it is below the horizon.
Every aurora map on the internet shows you the first fact. Drawing the second one next to it is the difference between a picture of space weather and a decision about where to point a lens.
A geomagnetic index is not a photograph. Between "Kp is 6" and a usable frame sit three questions no space-weather feed answers: is it dark where the camera is, is the sky clear in that direction, and is the arc high enough above the horizon to fill a frame at all. Aurora Chaser answers all four, then acts on the answer.
Not an alert — a PTZ movement. The app ranks every visible cell of the auroral oval, clusters them into arcs, and drives the camera to the brightest one via presets, CamSwitcher views, or absolute pan/tilt.
Tilt is calculated, not configured: the apparent elevation of a curtain follows from its distance.
Four conditions multiply. Any one at zero zeroes the result — a 90% aurora forecast at noon scores exactly nothing, and the app says so rather than swinging a camera at a sunlit sky.
When it stands down, it names the reason: activity, darkness, cloud or moonlight.
Most models track the green curtain at 110 km. Aurora Chaser evaluates the red 630 nm layer at 230 km too — which clears the horizon from 500 km further away.
That is the difference between detecting a mid-latitude storm and reporting an empty sky.
A storm is one condition — convection is there or it is not. An aurora you can actually photograph is a conjunction, and three parts of it have nothing to do with space weather. Multiplying is the honest model: it makes a perfect forecast under overcast worth zero, exactly as it is in reality.
The multiplicative form pays for itself twice. It cannot produce a confident-looking score from a single strong input, and because one factor is always the smallest, the app gets a free diagnostic — the limiting factor — which is what the interface shows instead of a bare "quiet".
| Gate | Source | Behaviour |
|---|---|---|
| Activity | OVATION grid, boosted by solar wind and ground magnetometers | Probability of visible aurora at each cell, weighted by how high it sits |
| Darkness | Solar elevation, computed locally | Hard gate. Zero above −6°, full below −15°, linear ramp between |
| Clear sky | Open-Meteo cloud cover | Sampled at the camera and along each candidate sightline; the worse wins |
| Moonlight | Lunar phase + altitude, computed locally | Soft penalty, up to 40% at full moon near the zenith |
Civil twilight ends at a solar elevation of −6°. Above that, no aurora is visible at any strength, so the app scores zero and — importantly — short-circuits before making a single network request. There is no reason to pull a 900 KB grid at two in the afternoon.
Below −6° the gate opens gradually rather than snapping on, because twilight genuinely fades the aurora in. Full credit arrives at −15°, close to astronomical darkness. Both thresholds are configurable; a bright display punches through earlier, which is what the −6° start allows for.
| Sun elevation | Darkness factor | |
|---|---|---|
| 0° | 0% | daylight — no fetch |
| −3° | 0% | civil twilight |
| −6° | 0% | gate opens |
| −8° | 22% | brightest arcs only |
| −10.5° | 50% | nautical twilight |
| −13° | 78% | — |
| −15° | 100% | full darkness |
Around the September equinox the gate is open for roughly 9.6 hours at Tromsø and 10.8 hours at Prague — Prague being lower latitude gets the longer true-dark window at that date.
A storm-chasing camera samples 80 km around itself, because storms sit on the surface. Aurora sits 100–400 km up, which means a curtain far beyond the visible landscape is still well above the horizon. Two emission layers matter, and they behave very differently.
The familiar structured curtain, emitting at about 110 km. Above the horizon out to 1,175 km. This is the classic high-latitude subject — rays, folds, visible motion.
The diffuse top of the curtain, emitting at 200–400 km. Above the horizon out to 1,687 km — over 500 km further. Fainter, slower, and often the only thing visible from mid latitudes.
| Ground distance | Green 110 km | Red 230 km | What you'd frame |
|---|---|---|---|
| 100 km | 47.0° | 65.7° | overhead — wide lens, look up |
| 300 km | 18.6° | 35.6° | high arc, clean foreground |
| 600 km | 7.6° | 17.9° | classic horizon arc |
| 1000 km | 1.7° | 8.2° | low glow, needs a clear horizon |
| 1200 km | below horizon | 5.2° | RED mid-latitude storm signature |
| 1600 km | below horizon | 0.8° | extreme range, red only |
Elevation angles account for Earth curvature and are computed by the app for every candidate cell; the same value drives PTZ tilt.
| Source | What it provides | Cadence | Role |
|---|---|---|---|
NOAA SWPC OVATIONservices.swpc.noaa.gov/json/ovation_aurora_latest.json |
Global 1°×1° grid of visible-aurora probability — 65,160 cells, both hemispheres | ~5 min ~30 min ahead |
The aiming source. Arrives pre-sampled, so one fetch covers the planet |
Planetary Kp.../products/noaa-planetary-k-index-forecast.json |
3-hourly geomagnetic index plus a 3-day forecast | 3 h | Planning — "is tonight worth it" — and the fallback target |
Real-time solar wind.../json/rtsw/rtsw_mag_1m.json |
Interplanetary field Bz/Bt, speed and density, measured at L1 by IMAP (ACE as backup) | 1 min | 30–60 minutes of genuine early warning |
| Open-Meteo | Cloud cover — total, low, mid, high — at the camera and along each sightline | per scan | The gate that decides whether any of the above matters |
| AuroraWatch UK Lancaster University |
Ground magnetometer status — green / yellow / amber / red | 3 min | Optional corroboration. Has no direction, so it never aims |
| Sun & Moon | Solar elevation, lunar phase and altitude | instant | Computed on the camera. No network, no dependency, no failure mode |
| Solar wind | Surge boost |
|---|---|
| Bz +2 nT, 700 km/s | 0.00 — fast but northward |
| Bz −5 nT, 450 km/s | 0.23 |
| Bz −10 nT, 550 km/s | 0.52 |
| Bz −15 nT, 650 km/s | 0.86 |
| Bz −25 nT, 800 km/s | 1.00 — severe |
| Kp | Oval reaches | Roughly |
|---|---|---|
| 3 | 60.4° | Oslo, Helsinki |
| 5 | 56.3° | Edinburgh, Moscow |
| 7 | 52.2° | Amsterdam, Warsaw |
| 8 | 50.1° | Prague, Kraków |
| 9 | 48.1° | Munich, Vienna |
Equatorward oval boundary in corrected geomagnetic latitude. Cities are indicative — geomagnetic and geographic latitude differ, and red aurora is visible from well south of the boundary.
Four live bars — activity, darkness, clear sky, moonlight — with the limiting one highlighted. It answers the question the app gets asked most: it says quiet, why?
The full auroral oval as a live heatmap, plus the ranked targets and the two horizon rings. Cells below the horizon are never chosen — they are physically invisible, however bright the oval looks on a flat map. Click a target to lock the camera to it.
Fifteen fields to CamOverlay Custom Graphics or InfoTicker: band, bearing, probability, elevation, Kp, Bz, cloud, moon, and more — live on the video.
RED 62% · NNW 348° · 8° up · 65% cloud · Bz −9.4Unattended cameras fail at 3 a.m. with nobody watching. Every failure path was chosen deliberately.
| Situation | Behaviour | Reasoning |
|---|---|---|
| OVATION unreachable, cache under 45 min | Serve the cached grid | A 20-minute-old real oval beats a synthetic guess |
| OVATION unreachable, cold cache, Kp high | Synthesise a poleward target on the modelled oval boundary | Crude, but better than parking during a G3 |
| Cloud API down | The gate opens | Refusing to chase because a weather API is down is the wrong failure |
| AuroraWatch reports green | No penalty, ever | The station may be far away — absence of evidence is not evidence of absence |
| Polar day | Reports "no darkness in 36 h" | Honest, and distinguishable from "nothing happening" |
| Daylight | Short-circuits before any network call | Costs nothing to be right early |
| Camera command fails | Logged and swallowed; scanning continues | One bad PTZ call must not stop the loop |
| Platform | |
|---|---|
| Package | Standalone ACAP .eap — no CamScripter dependency |
| AXIS OS | 12.10 – 13 (manifest schema 2.0) |
| Architecture | aarch64 (ARTPEC-8/9) · armv7hf (ARTPEC-7) |
| Runtime | Node.js 20, bundled — AXIS OS ships none |
| Dependencies | None at runtime. Pure Node standard library |
| Package size | ~30 MB, dominated by the Node binary |
| Offline capable | Leaflet vendored — the map works with no route to the internet |
| Behaviour | |
|---|---|
| Aiming modes | PTZ presets · CamSwitcher views · absolute pan/tilt/zoom |
| Search radius | 1,200 km default, clamped to the horizon |
| Scan interval | 5 min — matches OVATION regeneration |
| Anti-jitter | 15° arc clustering, 12° hysteresis, 3 min dwell |
| Coverage | 180° arc centred on north by default |
| Map | Live OVATION oval, horizon rings, sector wedges, click-to-lock targets |
| Themes | Dark (default) · Night red-light · Light |
| Overlay | CamOverlay Custom Graphics + InfoTicker, 15 fields |
| Access | Local LAN or CamStreamer Cloud (device-connect.net) |
.eap matching your chip.Settings UI at http://<camera>/local/aurora_chaser/. No account, no API key, no cloud service required.
Standalone .eap for AXIS OS 12.10+. Free, no account, no API key. Build it yourself with Docker, or grab a release.
aarch64 for ARTPEC-8/9 · armv7hf for ARTPEC-7