◆ Standalone ACAP for AXIS OS 12

An Axis camera that knows where to look — and when not to bother.

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.

65,160
grid cells / scan
~30 min
forecast lead
1,687 km
detection reach
4
gates, multiplied
0
API keys required

Running on a camera

live data

The auroral oval, drawn from the grid the app aims by

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.

Theme

What you are looking at

The oval — OVATION probability from 5% to 90%+, one 1°×1° cell each, softened so it reads as emission rather than a lattice. You can watch it expand equatorward during a storm.
Two dashed rings — the horizon limits at 1,175 km and 1,687 km. Inside the inner one the green curtain clears your horizon; between them only the red top does; outside the outer one the aurora is real and invisible from here.
Coloured wedges — each PTZ preset or CamSwitcher view, with the compass sector it covers. The numbered badge is the preset the app will call.
Target dots — the ranked candidates. Filled = 557.7 nm curtain, hollow = 630 nm top only. Click one to lock the camera to that bearing.

Why the rings matter more than they look

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.

Turning the radar on overlays precipitation as a rough proxy for thick cloud. The app's own cloud gate uses Open-Meteo forecasts sampled along each sightline rather than radar, so the two will not always agree — radar shows precipitation, not the thin overcast that also ruins a shot.

The problem

Aurora apps tell you something is happening. They don't point a camera at it.

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.

🎯

It aims

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.

🌗

It knows when not to

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.

🔴

It sees red aurora

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.

How it decides

core model

Four gates, multiplied — not a checklist

activity× darkness× clear sky× moonlight =score

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".

GateSourceBehaviour
ActivityOVATION grid, boosted by solar wind and ground magnetometersProbability of visible aurora at each cell, weighted by how high it sits
DarknessSolar elevation, computed locallyHard gate. Zero above −6°, full below −15°, linear ramp between
Clear skyOpen-Meteo cloud coverSampled at the camera and along each candidate sightline; the worse wins
MoonlightLunar phase + altitude, computed locallySoft penalty, up to 40% at full moon near the zenith

The darkness gate

no network required

The camera waits for the sun to drop below −6°

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 elevationDarkness factor
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
Polar day is handled properly. Above the Arctic Circle in summer the sun never sets. Rather than reporting a permanent "quiet", the app searches forward 36 hours, finds no crossing, and states plainly: no darkness in the next 36 h. A camera in Tromsø simply reports the midnight sun instead of pretending.
Moonlight, for context. A full moon 60° up keeps 60% of the score; the same moon below the horizon costs nothing; a new moon overhead costs nothing. Phase and altitude are both accounted for.

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.

Why the search radius is 1,200 km

the differentiator

Aurora is not on the ground — so Earth's curvature sets the reach

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.

GREEN  557.7 nm oxygen

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.

RED  630 nm oxygen

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.

Green 557.7 nm @ 110 km Red 630 nm @ 230 km Apparent elevation above the observer's horizon
10°20° 30°40°50°+ 0 500 1000 1500 ground distance from camera (km) 1175 km green horizon 1687 km red horizon
This is why mid-latitude cameras work at all. During the May 2024 G5 storm, observers in Bohemia at 50°N photographed red aurora whose base sat over the Baltic — they were seeing the top of a curtain hundreds of kilometres away. A model evaluating only the 110 km layer discards those cells as "below horizon" and reports nothing, on precisely the nights that matter most south of 60°N. Aurora Chaser evaluates both layers, keeps whichever clears the horizon, and labels which one you are looking at.
Ground distanceGreen 110 kmRed 230 kmWhat you'd frame
100 km47.0°65.7°overhead — wide lens, look up
300 km18.6°35.6°high arc, clean foreground
600 km7.6°17.9°classic horizon arc
1000 km1.7°8.2°low glow, needs a clear horizon
1200 kmbelow horizon5.2°RED mid-latitude storm signature
1600 kmbelow horizon0.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.

Data sources

all free · no API key

Public feeds, read directly from the camera

SourceWhat it providesCadenceRole
NOAA SWPC OVATION
services.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
Why Bz matters more than Kp. Kp is a three-hour average, published after the fact — an app watching only Kp is always reporting the past. Bz is measured 1.5 million km upstream at the L1 point, which is roughly how long the plasma takes to reach us. A strongly southward Bz couples the solar wind to Earth's field and the oval expands within the hour; a northward Bz can sit on a 700 km/s stream and produce nothing at all. Aurora Chaser uses Bz as a surge multiplier on top of the grid, precisely because the grid is already 30 minutes old when you read it.
Solar windSurge boost
Bz +2 nT, 700 km/s0.00 — fast but northward
Bz −5 nT, 450 km/s0.23
Bz −10 nT, 550 km/s0.52
Bz −15 nT, 650 km/s0.86
Bz −25 nT, 800 km/s1.00 — severe
KpOval reachesRoughly
360.4°Oslo, Helsinki
556.3°Edinburgh, Moscow
752.2°Amsterdam, Warsaw
850.1°Prague, Kraków
948.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.

On the camera

What the operator actually sees

📊

The gate panel

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 map

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.

📺

Burned-in overlay

Fifteen fields to CamOverlay Custom Graphics or InfoTicker: band, bearing, probability, elevation, Kp, Bz, cloud, moon, and more — live on the video.

A real status line: RED 62% · NNW 348° · 8° up · 65% cloud · Bz −9.4
Red band means the 630 nm top only — a low northern glow, not a structured curtain. Eight degrees up means a clear horizon matters. That one line tells a photographer what lens and what exposure before they leave the building.

Reliability

technical

Degrades toward still-useful, never toward silently wrong

Unattended cameras fail at 3 a.m. with nobody watching. Every failure path was chosen deliberately.

SituationBehaviourReasoning
OVATION unreachable, cache under 45 minServe the cached gridA 20-minute-old real oval beats a synthetic guess
OVATION unreachable, cold cache, Kp highSynthesise a poleward target on the modelled oval boundaryCrude, but better than parking during a G3
Cloud API downThe gate opensRefusing to chase because a weather API is down is the wrong failure
AuroraWatch reports greenNo penalty, everThe station may be far away — absence of evidence is not evidence of absence
Polar dayReports "no darkness in 36 h"Honest, and distinguishable from "nothing happening"
DaylightShort-circuits before any network callCosts nothing to be right early
Camera command failsLogged and swallowed; scanning continuesOne bad PTZ call must not stop the loop

Specifications

v1.1.0
Platform
PackageStandalone ACAP .eap — no CamScripter dependency
AXIS OS12.10 – 13 (manifest schema 2.0)
Architectureaarch64 (ARTPEC-8/9) · armv7hf (ARTPEC-7)
RuntimeNode.js 20, bundled — AXIS OS ships none
DependenciesNone at runtime. Pure Node standard library
Package size~30 MB, dominated by the Node binary
Offline capableLeaflet vendored — the map works with no route to the internet
Behaviour
Aiming modesPTZ presets · CamSwitcher views · absolute pan/tilt/zoom
Search radius1,200 km default, clamped to the horizon
Scan interval5 min — matches OVATION regeneration
Anti-jitter15° arc clustering, 12° hysteresis, 3 min dwell
Coverage180° arc centred on north by default
MapLive OVATION oval, horizon rings, sector wedges, click-to-lock targets
ThemesDark (default) · Night red-light · Light
OverlayCamOverlay Custom Graphics + InfoTicker, 15 fields
AccessLocal LAN or CamStreamer Cloud (device-connect.net)
Why clustering matters. The OVATION grid is noisy at single-cell level. Without merging cells into arcs, the chosen bearing jitters 10–20° between scans and the camera spends the night chasing statistical noise. Aurora Chaser merges by circular mean within 15° buckets before ranking — averaging 355° and 5° naively gives 180°, which points the camera at the ground.

Getting started

Three steps

  1. Install — camera UI → System → Apps → Add app → upload the .eap matching your chip.
  2. Set the location — latitude and longitude of the camera. This is the origin for every bearing, distance and elevation, so precision here matters more than in any storm app: latitude decides whether the oval is overhead, on the horizon, or out of reach.
  3. Assign presets or views — give each the compass bearing it faces. The app does the rest.

Settings UI at http://<camera>/local/aurora_chaser/. No account, no API key, no cloud service required.

Get Aurora Chaser

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