Polaris Astro Controller

Loading…

Set a password

Polaris is reachable from any device on this network?. Pick a password that protects this rig from unauthorized access. You will use this on every fresh browser / device.

Forgot the password later? SSH to the Pi and clear AuthPasswordHash + AuthPasswordSalt in ~/.config/NINA.Polaris/profiles/active.json, then restart the polaris service.

🔒 This rig uses its own certificate

Your browser will keep warning about it, and some browsers block the live connection entirely, until you install it as a trusted certificate on this device. Once per device.

Download certificate

Sign in

🔒 Live connection blocked by the certificate

This browser accepted the page but is refusing the live connection because it does not trust this rig's certificate. Install it on this device to fix it for good.

Download certificate

Polaris Astro Controller

Getting the rig status…

🔒 No live connection: this browser does not trust the rig's certificate. Download certificate

🔒 Install this rig's certificate

Polaris signs its own HTTPS certificate. Installing it as a trusted certificate stops the browser warnings and lets the live connection through. Only needed once per device.

Loading steps…

Download certificate
Polaris Astro Controller POLARIS
T S

Ready when you are.

Nothing connected yet. Pick a starting point below and the rest of the tabs come alive once your equipment is online.

Equipment is up. Plan the whole night, run a sequence, or jump into live stacking.

·
Equipment
RMS
Sequence
Plan
Server
Use the SSD for your captures

Get Started

Connect a camera in Settings to start imaging

x= y= ADU=
Image history () Live stack quality
SNR
Frames
ETA
Dropped
Stacking… Waiting for next frame… ⚠ Dropped:
SNR & HFR
Max
Avg
Min
Std
03276865535
Sat
?
?
HCG
Stacking resolution
Auto picked for this camera on this machine.
⚠ Greyed-out options need more memory than this machine can spare (budget ~ MB). Only the live view is reduced; saved frames stay full resolution.
stacked discarded ✓ Complete
⚠ No output folder set: frames are NOT being saved. Set an image output folder in the FILES tab.
Flip min past the meridian
Connect a mount to flip.
🎯 Refocus suggested
HFR baseline → current · fired
⚡ Auto dither / re-focus / re-center
⚙ Executing … captures paused until done.

Fires once when you click ▶ Stack ON. Skips silently if no focuser is configured.

Last refocus: at frame (HFR )

Fires once when you click ▶ Stack ON. Skips silently if no mount target is configured.

Reference solved:
Waiting for first-frame plate solve to establish reference…
Last recenter: at frame (drift ")
Needs the guider actively guiding (native or PHD2). Dithered frames wait to settle before stacking.
Dithering…
💾

⚙ Per-frame pre-processing
Calibration (dark / flat / bias)
calibrated · ⚠ fallback · ⊘ no match
Last error:
No matching masters found in your FrameLibrary yet. Build masters in STUDIO first (Stack tab → Master Dark/Flat/Bias).
Background extraction (BGE)
ⓘ BGE isn't available this session. It runs client-side in client/auto compute mode, or server-side when stacking on the host if the GraXpert CLI (or an RK3588 NPU) is installed. Install GraXpert on the host, or switch the rig's "Compute mode" to client/auto.
Smoothing
Correction
processed · ⚠ fallback
Last error:
Stars: -- HFR: -- Mean: -- SNR: -- Res: -- Frames: Stacking: -- Meridian:
Width
Height
Bit depth
Bayer
Mean
Median
Std Dev
MAD
Min
Max
Stars
Median HFR
Polar alignment
🎯 Best targets for TPPA now

No suitable targets above 30° in the high-Dec zone right now. The mount can still TPPA from wherever it's pointing, just click Start above.

Phase: Solved:
✓ Alignment measured ⏳ Capturing + solving…
Total error
Altitude
Azimuth (az inverted)

Adjust the mount's alt/az bolts to walk the dot to the centre, then hit Refresh (or enable Auto) to re-measure. If an error grows after a nudge, reverse that knob. Once the dot reads near zero, re-run the 3-point sweep to confirm: the sweep is the ground-truth measurement.

How TPPA works: point the telescope at any patch of sky with a few stars (Dec ~60°+ recommended), enable tracking, then click Start. Polaris will slew the mount in RA by two times and plate-solve at each position. The three solved points constrain the mount's mechanical polar axis, and the difference vs. the true celestial pole gives your alignment error.

After TPPA, a bullseye shows the pole at the centre and your mount's RA axis as a dot. Adjust the tripod knobs, then click Refresh to re-measure: or enable Auto for a continuous capture/solve loop.

Camera Mount Site location
Solved
Az error
Alt error
Total
Iterations
Convergence:
Sky map: target (green) vs solved (red)

How rudimentary alignment works: you align the mount roughly with a compass + tilt app, then pick a bright visible target above. Polaris slews (or you point manually), captures one frame, plate-solves, and reports the pointing error. Walk to the mount, nudge the azimuth or altitude knob a little, then click Re-capture + solve to see the new error. Repeat until you're satisfied.

Unlike TPPA, this works when the polar region is blocked (e.g. balcony with view to the south only). It also works on manual mounts when you pick Use current mount position.

Focus Control
Focus motor 0 MOVING
0
MOVING

Connect a camera in RIGS first to use the focus assist.

Click ▶ Start loop. Focuser knob = HFR drops as you find focus, rises again when you pass.

Loop · every s
HFR (px)
FWHM (px)
Stars
Laplacian
Best HFR

Install a physical Bahtinov mask over the scope aperture and point at a bright star (magnitude < 3, e.g. Vega, Sirius, Polaris).

HFR Best last 60 samples
Auto-Focus (V-Curve) Refining Moving to best focus Confirming
Advanced
Sample Last HFR: Stars:

Frames will appear here as the AF sweep runs.

pos · HFR · ★
Sample Refinement Best position:
Preview

Max
Avg
Min
Std
03276865535
Sat
?
HCG
Focus 0 MOVING
GoTo Position

                        
                    
Stars: HFR: Mean: Median: SNR: Res: -- 💾 saving 💾 saved
Video (planetary)

Click on the planet to re-center the ROI
Focus motor 0 MOVING
·
⚠ Dropped frames: (writer can't keep up with stream cadence)
Mount jog
Slew rate
Focus sharpness
Higher is sharper. The number only compares against itself, so turn the focuser and keep the direction that grows it.
Clipping
FOV

Not sure of the path? Browse to it on the Studio tab and copy the folder path here.

For older clips that open with a bright colour cast in ZWO ASIVideoStack or FireCapture. Writes a corrected full-range copy named -fixed16.ser beside the original and selects it. New recordings are already correct.

SER → MP4: frames
Phase: Analyzed: Kept: Aligned: Stacked:
Frame quality (sharpness) kept top % of
✓ Stack complete

Phase:

Phase:
( )
Guider PHD2 backend:
This rig is set to the Native guider, but the server is reporting the PHD2 backend. Re-pick Native (built-in) in RIGS → Guider (and confirm it saves), restart the Polaris server if you just rebuilt it, then hard-refresh (Ctrl+F5).
✓ Profile synced ⚠ Profile missing ⚠ Sync error ↻ Syncing…
PHD2 not detected on this machine. Download PHD2 then restart the Headless server (or set PHD2:ExecutablePath in appsettings.json to a custom location).
RA " Dec " Tot "
y ±
γ
Loop or guide to see the guide frame
⤡ Dithering: settling to < px…
Settling…
Target
Star Profile
RA Dec
(Custom)
Advanced, individual algorithm knobs
State:
Guide Camera:
Mount (PHD2):
Pixel Scale:
Peak RA:
Peak Dec:
✓ Settled
Settle failed
Dithering
Mount calibration
Aggressiveness
Minimum move
Errors smaller than this are not corrected. Raise it when the mount is chasing seeing (busy graph, no real drift); lower it for a long focal length or excellent seeing. Default 0.15 px.
Dark / bad-pixel calibration
Master dark
Bad pixels
Build
Cover the guide scope, then Build. Darks are matched to the current exposure / gain / binning.
Guiding parameters
One-direction Dec avoids backlash reversals: leave the polar alignment slightly off so the drift always pushes the same way, and correct only against it.
Predictive (PE + drift)
Learns the worm-gear periodic error + drift and corrects ahead of it. Leave the period on auto; raise the blend for stronger feed-forward. Falls back to reactive guiding until it locks on.
ZFilter
Low-pass smoothing strength: the equivalent exposure after filtering ≈ this × the guide exposure. Higher = smoother but slower to react. Default 2.0.
Meridian flip
Exposing… Selecting star…
Not supported on this OS. Embedded PHD2 GUI requires either Linux + xpra or Windows + TightVNC. On this OS, open the native PHD2 window directly.

The Control tab on the left covers all JSON-RPC operations (profile switch, exposure, dec mode, guiding, dithering, smart calibrate, algorithm tuning), that surface works on every host. Only the embedded GUI window is unavailable here.

Not supported on this CPU architecture.
xpra not installed. Run on the Polaris host: sudo apt install xpra xserver-xorg-video-dummy then restart Polaris. After that, this tab will embed PHD2's native GUI (Wizard, Brain, Guiding Assistant) so you can do everything remotely.

PHD2 GUI session not running

Starting takes ~5-10 seconds (spins up an Xorg-dummy display + launches PHD2 inside).

xpra is running but its HTML5 web client isn't installed. The session is up on port , but xpra returns 404 for its web root, so there's nothing to embed. Install xpra-html5 on the Polaris host, then click Restart:
cd ~/src && git clone --depth 1 https://github.com/Xpra-org/xpra-html5.git
cd xpra-html5 && sudo python3 ./setup.py install
✓ xpra v port · PHD2 running · PHD2 not running inside session
Starting PHD2 GUI… (xpra session + PHD2)
TightVNC not installed. Download the Windows installer from tightvnc.com, set a password during install, then click Re-detect. The TightVNC service will host the desktop so Polaris can embed it here via noVNC.

TightVNC service is stopped

The TightVNC desktop server (tvnserver) is installed but not running. Start it to enable the embedded view.

Polaris needs administrator privileges to control Windows services. If the button fails, start tvnserver manually via services.msc.

TightVNC is running but not listening on port . Open the TightVNC Service Configuration window (system tray → TightVNC icon → Configuration) and confirm "Accept incoming connections" is enabled.
✓ TightVNC v port · noVNC
Equipment
✓ INDI connected · devices

Discover Alpaca / ASCOM Remote devices on this LAN. Polaris auto-connects every discovered device, then you select them in each card below (Camera, Mount, Focuser, Filter Wheel) under the "Alpaca" driver. On Windows, install ASCOM Platform 6.6+ and the ASCOM Remote Server, pick your ASCOM drivers, click "Start Server", then hit Discover here.

Rig:
📷 Main Camera
Temp: Cooler: Bin: Depth: ISO: Resolution: Sensor: Pixel:
applied on connect (DSLR / gphoto)
Cooler
🎥 Colour / debayer quirks

Change these only if the preview / stack comes out grey, with swapped colours, or as a red/green checkerboard.

🔭 Telescope Mount
No device needed: just flip the switch to connect.
RA: Dec: Alt: Az: Tracking: Pier: SLEWING PARKED
Motion
Tracking
Sync
📍
🕐
🛑 Mount safety stop:
🛡 Security and Protection Features
Meridian safety (global)

Stops tracking + aborts the session if the mount tracks past the meridian without a flip, or the guider loses the star repeatedly. The altitude floor aborts a slew whose OTA drops below it (an anti-crash backstop for a wrong-way slew toward the tripod; 0 disables). 0 disables a guard. Global: applies to every rig.

Slew safety (this rig)

A SKY "Go To" whose swing is at least this many degrees, or whose target sits below the floor, asks you to confirm before the mount moves (a big swing can make the mount un-flip and take the long way toward the tripod). Blank ⇒ defaults (60° / 5°); 0 disables that check. The altitude floor also arms the live anti-crash abort (needs the global guard above on).

Pushes the correct clock + observatory location to the mount before it slews, so a stale mount clock/site can't send the scope the wrong way into the tripod. If the mount can't accept the push, the GoTo asks you to confirm. On by default; remote observatories rely on it to self-heal.

🔍 Main Scope Focus Motor
Position: Temp: MOVING

Use after manually moving the drawtube or when the step counter has drifted. Does not move the motor.

Enable when the focuser is mounted backwards relative to the optical train and "inward" actually moves the drawtube out.

Driver overshoots the target then returns by this many steps to take the slack out of the gear train. Typical value 20-50 for stock Crayfords.

⚙️ Filter Wheel
Current: Slot: MOVING

Names are saved on this rig and applied to every image and filter menu, whatever the driver reports. When the driver accepts names (INDI) they are written into it too.

Accessories
🔀 Rotator
Angle: REVERSED MOVING
💡 Flat Panel
Light: Brightness: Cover: MOVING
🏛️ Dome
Az: Shutter: PARKED SLAVED MOVING
☁️ Weather
Temp: Humidity: Dew: Pressure:
Clouds: Wind: Gust: RAIN SQM:
🔌 Power Box
No channels reported.
Readings
Click Start to launch indi-web
Not available on this OS.
indi-web not detected.
Install with pip on the Polaris host:
pip install indiwebmanager
Click ⟳ to re-check after install. More info: github.com/knro/indiwebmanager
Auto-Detect and Setup INDI Drivers
Let Polaris detect and setup INDI Drivers automatically. If a device driver is not detected, you can add it manually using the indi-web panel below.
Driver watchdog
Restarts a single wedged INDI driver (e.g. a camera that stopped delivering frames) without dropping the others, after repeated capture timeouts, rate-limited. To start, stop, or restart a driver by hand, use the indi-web panel below.
INDI not connected.
Connect to indiserver via the Equipment sub-tab first. Property browser shows up here as soon as devices come online.
No devices reported yet.
indiserver is connected but hasn't broadcast any device properties. Start a driver in the INDI Drivers tab, or wait a few seconds and hit ⟳ Refresh.
No native controls available.
Connect a native-SDK camera (ZWO ASI, SVBony, PlayerOne, ToupTek or Altair) to configure its gain, cooler and other SDK-exposed settings here.
📷

Build floating control panels for the active rig: group live equipment readouts, switches and inputs into cards you can move, resize and watch on any tab. Layout and widgets are saved with the rig.

Create a panel to start, then add widgets to it.

Camera Slewing, live view

Magnitude
Distance
Radius
Size
Ra/Dec
Type
Meridian
Horizon
⚙ Solve frame
HCG

Used by Slew & Center, meridian-flip recenter, and live-stack auto-recenter. Saved per-rig.

mount target Live · · UTC
Plate solver
Iteration: Error: Scale: Rotation:

                
Slew & center failed: solver output

                
🎯 Solve & Sync: capturing + solving…

                

Click any object on the map, or use Search above.

Mount
Slew rate
RA:
Dec:
Alt:
Az:
Track:
Pier:
Status:SLEWING
Status:PARKED

Export

Output:

Polaris will hand the Pi to your home WiFi and stop broadcasting the hotspot. If the connection fails (wrong password / out of range), the hotspot auto-reverts after 30 s.

Polaris will leave and join the one you pick, so the page you are reading this on will lose contact for a moment. If the new network cannot be joined, the hotspot comes back after 30 s and you can reach the rig there.

Switching… the Pi is dropping the hotspot and trying the new connection. This can take up to 30 s. If your browser is currently connected to the Pi via the hotspot you will lose the link as soon as the switch starts; reconnect to your home WiFi and reopen .

📈 Sensor analysis

Measures gain (e/ADU), read noise, full well and dynamic range across the gain range using the photon-transfer curve. Point the camera at a uniform, constant light source (flat panel or evenly lit wall) and keep it steady for the whole run.

Edit hotspot credentials

Changes apply immediately. Any device connected to the old hotspot SSID will be kicked off; reconnect with the new credentials.

Tonight's Best
No objects match the current filter.
Categories Moon Planet DSO Catalog: bundled DSO database (to mag 12) · Planets: AstronomyEngine · Images: NASA / Wikipedia

Weather forecast
Tonight's best windows
No high-quality observation windows tonight. Sky conditions look marginal, check per-day breakdown for individual slots.
Score ≥ 70 good 40-69 marginal < 40 poor 0 precipitation Forecast: 7Timer · Sun/Moon: SunCalc
Plan
No plans yet. Tap + New to create one.

The last captured frame of the running plan appears here.

Total
Autorun
Meridian in ( flipped)

⚠ Mount not connected, meridian time unavailable.

⚠ Observatory longitude is 0, set it in Settings for correct LST.

🛡 Cable-wrap + guide safety stop (global) lives on the Mount card in RIGS.

dithered · next in

⚠ PHD2 not connected, dither will be silently skipped during the run.

⚠ PHD2 connected but not guiding, start guiding before launching the sequence.

Park supersedes stop-tracking. End events always run on natural completion; tick the box above to also run them when you press Stop.
Auto-GraXpert is fire-and-forget, the next exposure does not wait for it. Output lands next to each light with the _bge suffix.

Estimate: Frames: Disk: Before meridian:
Saved sets
No saved sets yet.
Hold to start ·
ETA

No sequence loaded: click + Add in the controls panel or pick a target in Sky Explorer.

The last captured frame of the running sequence appears here.

Max
Avg
Min
Std
03276865535
Sat

Pre-flight

Camera:
Filter wheel: not connected
Flat panel: not connected (sky / T-shirt OK)

Connect camera + filter wheel in the RIGS tab first.

Filters to capture

Filters are captured in the order picked. Trained exposures (when available) seed the binary search so converging takes 1-2 frames instead of 5-8.

Settings

The binary search halves the bracket each iteration; 10 covers ~3 decades of dynamic range. Drop tolerance to ±1-2% if your pipeline is sensitive to flat-field normalization.

Trained exposures

No trained exposures yet. Run the wizard once to populate the cache.
Filter Binning Exposure

0 = don't touch the panel (sky / T-shirt flats).

Pick at least 1 filter to enable shutter.
Filter · Searching attempt : ADU Capturing at
Done:
Error:
Advanced Sequencer
Validation:
Palette
Tree
Properties
Click a tree node to edit its properties.
Studio
Plate solving…

                
Solver output

                        
Name Size Modified Type
Up one level
(empty folder)
· selected () ⭐ Studio root:

                
Settings

🔒HTTPS Certificate

Polaris uses a self-signed certificate so the connection is encrypted on your LAN. Install the root certificate on each device once and the browser stops warning about it.

Loading…
SHA-256:

Install on this client device

🌐Remote access relay

Reach Polaris from anywhere through a relay server, with no port-forwarding on your router. Paste the tunnel URL and access token issued by your relay operator, or run your own relay: the server ships in the Polaris repository.

Reachable at

📤Auto-push to network storage

Copy every saved image to a NAS, network share or SSH box as it's written, mirroring the capture folder tree. The local copy stays put.

· queued · uploaded · failed
Recording upload:

🎨Appearance

Translations are community-assisted and may be partial; untranslated text falls back to English. Changing the language reloads the page.

Drag the slider, then click Apply to scale the whole interface. Smaller values fit more onto a phone; larger values make the night-mode UI legible across the observatory. Persists per browser.

Atkinson Hyperlegible was designed by the Braille Institute for maximum legibility, letters with unique shapes so B, 8, l, 1, I, 0, O never blur together. Try it if you (or your stargazing companions) prefer a more readable typeface. Persists per browser; no restart needed.

Side menu inset

Pixels of empty space around the navigation rail, for when it lands under a notch, a rounded corner or the home indicator. The rail grows by what you set instead of squeezing its buttons. Left/right apply to the vertical rail, top/bottom to the portrait strip. Persists per browser.

Turns off panel fade-ins, modal zoom and spinners. Helps on older phones/tablets and respects motion sensitivity. Your device's system "reduce motion" setting is always honoured too.

Tightens the spacing of buttons, inputs and toolbars so more fits on screen, lower it on a phone to free room for the image / sky views. Doesn't change text size. Persists per browser.

Shows a compact numeric or full keyboard on the right edge when you tap a field, so the native tablet keyboard never covers the live view or Sky map. Dismisses on OK, on , or when you tap away. Persists per browser.

How sharp the on-screen preview can get when you zoom in. Higher uses more graphics memory on the client device showing the view (your phone / tablet / PC). For colour live-stacking it also sets the resolution the host renders the stacked preview at, so on a low-RAM host (Raspberry Pi / SBC) Standard noticeably cuts host memory use during a live stack. Your saved images are always full quality regardless.

For one-shot-colour cameras, reconstruct colour at the full sensor resolution instead of the lighter half-resolution preview. Sharper, but heavier: it only takes effect when the frame fits within the Preview quality limit above (so pair it with Native for the full effect). Mono cameras are unaffected.

🌌Sky imagery (offline DSS)

The SKY map ships with real deep-sky imagery (DSS Color) at a low resolution that works fully offline. Download a higher detail level here for ASIAIR-grade zoom, it's stored on this host and used automatically, no internet needed afterwards. Each level includes the lower ones and resumes where it left off.

Installed detail:
Downloading order :

Source: DSS Color, STScI/NASA, HEALPixed by CDS Strasbourg. Reload the SKY tab after a download to see the new detail.

🖼️DSO thumbnail pack

Object cards on the SKY map show a real photo of the target. The bundled build includes the showpieces (all Messier plus named nebulae/galaxies) so common targets work offline out of the box. Download the full set here for a photo of every catalogued object, stored on this host, used automatically, no internet needed afterwards.

Installed:

Thumbnails: DSS2 Color cutouts, STScI/NASA via CDS hips2fits.

🖥Remote terminal

SSH into the Polaris host (or any other Linux box on your LAN) from the browser. Credentials are sent per-session and never saved.

Optimize this SBC: opens the terminal to localhost and runs the config tool. Enter your SBC login; sudo will prompt for your password once (Polaris never gets passwordless root). Needs the SSH server running.

The remote terminal is currently disabled.

connected

🔐Authentication

Password gate for this Polaris server. Loopback (127.0.0.1) always bypasses, so SSH tunnels and local scripts work unchanged.

Status: 🟢 Enabled 🟡 Disabled
Session timeout: of inactivity

Change password

Disable authentication

Anyone on this network will be able to control Polaris without a password. Only do this on a closed / trusted LAN.

🔭Display name

What to call this host in the browser tab and in the phone apps. Pick something you will recognise, like Telescope on the balcony. Leave it blank to use the automatic name.

This is a label only. The address on your network stays , which is fixed per device and is what the certificate covers.

🎯Plate solving

Choose which installed solver to use and how aggressively to downsample. On slower hardware (Pi-class), a higher downsample solves a big sensor much faster (ASIAIR-style).

✓ ready ⚠ needs an API key (set below) ⚠ not detected: enable "Run via WSL" (in advanced below) or set the solve-field path, then click Save ⚠ not detected on this system ·

Free key from nova.astrometry.net (Profile → API Key). The online solver is a web service, nothing to install; it just needs this key. Without it it stays disabled. Blind solve over the internet: slower, but a solid fallback when ASTAP can't solve.

Solver paths, solve-field & WSL (advanced)

Leave blank to auto-detect. Set these only if Polaris can't find your install.


Astrometry.net (local solve-field): pick "Astrometry.net (local solve-field)" above as the primary/blind solver to use it.

Polaris invokes wsl.exe solve-field and translates Windows paths to /mnt/<drive>/… automatically. Install solve-field + index files in the distro (e.g. sudo apt install astrometry.net astrometry-data-tycho2).

Star databases

This rig images across, at arcsec per pixel.

Set the camera pixel size and the focal length on the rig to get a recommendation for your field of view.

ASTAP
astrometry.net

Every band listed can solve this field. They roughly double in size for each step finer, and the coarsest ones solve fastest, so the ticked pair is the cheapest that works. Add finer bands only if a sparse field fails.

No index bands to suggest until this rig knows its optics.

Unpacking on the host. This part cannot be cancelled: a half-written database would load and then fail to solve.

🎨Colour calibration data

What PCC and SPCC use to match your stars to a reference. It all ships with Polaris: nothing to download on the device.

APASS star catalogue
SPCC spectra ✓ Blackbody (always) · (empirical, bundled) · (planned)
SPCC curves sensor profiles · filter sets (generic, editable)

The bundled sensor/filter curves are idealised generic archetypes, not measured manufacturer data. To calibrate against your exact gear, drop your real QE / transmission curves into (each curve is { wl:[nm…], v:[0..1…] }) and re-run SPCC.

Clock

Sync the host's wall clock from this client device when the host is offline (no NTP) and has no RTC battery. Action is explicit so the wall clock never jumps during a running sequence.

Host UTC:
Difference vs this client device:
Last sync:

⚠ Clock sync is Linux-only (uses timedatectl). On Windows / macOS use the OS clock settings or NTP.

Scheduled shutdown

At the chosen time Polaris stops the capture and guiding, parks the mount, gently warms the camera and turns cooling off, and optionally powers off the host. For when you doze off and forget the rig is running.

Power

Restart the Polaris server or reboot the whole device without an SSH session. Handy on a headless SBC at the scope, or a mini-PC you reach only through the browser.

⚠ Device reboot is not available on this platform.

Software update

Check for a newer Polaris release and install it, or roll back to a previous version, all without an SSH session.

Running v. ⬆ Update available: v: view & install

()

🐍Scripts (beta)

Run Python scripts against Polaris's processing engine (polarispy). Bundled examples plus your own in ~/.config/NINA.Polaris/scripts, or from the STUDIO Files toolbar ("Ported Siril Scripts").

(numpy + astropy + scipy + Pillow + OpenCV, offline)

Only scripts that read image pixels (e.g. Statistical Stretch) need this. Downloads once (needs internet), then works offline. Requires a matching release pack for this device's architecture and Python version.

Progress and log appear in the floating panel while a script runs. You can also run these from the STUDIO Files toolbar ("Ported Siril Scripts").

📡Network (WiFi)

🌍Observatory

🌄Custom horizon

Click to add a point, drag to move it, right-click to delete. Azimuth runs left→right (0° N, 90° E, 180° S, 270° W); the red band is blocked sky.

Saved

💾Image Output

Current root:

Pick or change the capture root from the Studio tab: navigate to the folder, then click Set as Studio root. Files are organised under {rig}/{target}/lights · stacked · aux/... and {rig}/calibration/... automatically.

Tokens: {target} {filter} {exposure} {gain} {binning} {bitdepth} {date} {time} {datetime} {framenr} {seq} {camera} {temp} {imagetype}. Leave blank for the default ({target}_{filter}_{exposure}s_g{gain}_{temp}C_{datetime}_{seq}).

🗂Image cache

Polaris keeps rendered previews + thumbnails on disk so re-opening a file is instant and doesn't re-render on the Pi. Safe to clear any time: entries are regenerated on demand the next time you view a file.

Render cache:
Thumbnails:
Total on disk:

Hardware

Tries INDI at , then runs Alpaca local-network discovery, then connects every device saved on the active rig. Each result fires a toast on every connected browser. Default off so a fresh install never dials hardware that isn't powered up yet.

📝Debug logging

Default ON (ASIAIR-style). Every action is written to a per-session file logs/polaris_<date>_<time>.jsonl (one per Polaris run) so you can inspect a session later; files older than 7 days are cleaned up.

Native guiding writes a PHD2-compatible guide log (opens in PHD2 Log Viewer); external PHD2 copies its own log from ~/Documents/PHD2. Saved under logs/guide/.

No session guide logs yet.

🛠External tools

Polaris can drive Siril (preprocessing + stacking) and GraXpert (background extraction, deconvolution, denoising) as external binaries when installed on this machine.

Siril

+ scripts ·

Install Siril from siril.org and reload this page (or click Re-detect).

GraXpert

Install GraXpert v3.0+ from graxpert.com , Deconvolution + Denoising require v3.0+, BGE works on v2.x too.

Default tuning

Assistant

Choose where the Canopus AI co-pilot runs, the hosted cloud, or a local model on this Polaris host, and manage the on-host model.

Cloud runs on the hosted Canopus service (paid). On this host runs a local model on this Polaris host. On this device runs the agent in your browser against a local LLM (Ollama / LM Studio / llama.cpp) on the computer you're using, fast on a powerful PC/Mac, free and offline, no account needed.

On a phone or tablet browser, On this device has no local model to run; use On this host, or install the Polaris app to run it on this device.

🧠AI models

In-browser AI ops: star removal (nox / starrem2k13 / StarNet++) and GraXpert (BGE / Denoise / Deconvolution). Server hosts the model files, your browser fetches them once and runs inference locally, works on any device with WebGPU or WASM SIMD (laptops, phones, tablets).

⚠ You're on plain HTTP, WebGPU is disabled. Reopen Polaris via the HTTPS link above for GPU-accelerated in-browser inference, or tick "Prefer CLI subprocess" below to run on the server's GraXpert install.

Point at a directory containing the GraXpert layout {family}-ai-models/{version}/model.onnx. Models are not bundled with Polaris, clone the GraXpert repo and point at its models/ dir, or copy the .onnx files into a folder of your own.

Model Family Version Size Hash
No models detected. Set the path above to a folder containing the AI ONNX models (GraXpert or Polaris).

Download models

Pull star-removal / GraXpert models onto the host from the public Polaris Astro Controller model repository. Useful for OS images and phones/tablets that don't ship the large model files. Downloads land in your writable models directory and the registry rescans automatically, no browser cache needed.

Advanced: use a custom model bucket instead

Overrides the default repository. Base URL must serve models-index.json plus {family}-ai-models/{version}/model.onnx. Leave blank to use the bundled catalogue.

Model Version Size Action

Bucket reachable but no models listed in models-index.json.

Run AI models on the GPU (ncnn-Vulkan)

Run BGE and Denoise on a Vulkan GPU (Adreno, Mali, …) instead of the CPU. These converted models are not shipped in the package to keep it slim, download them here, once, and they're used automatically. The CPU / ONNX path works without them; this only adds GPU speed. Needs the corresponding ONNX model downloaded above.

Status:

Model licences. The first use of an AI op prompts you to acknowledge the relevant licence. Polaris itself is AGPL-3.0 and does not redistribute the model files.
  • nox & starrem2k13 (star removal): MIT, code and weights.
  • StarNet++ (star removal): CC BY-NC-SA 4.0 (non-commercial), © Nikita Misiura.
  • GraXpert (BGE / Denoise / Deconvolution): CC BY-NC-SA 4.0 (non-commercial), © GraXpert Development Team.
Advanced, use GraXpert CLI subprocess instead

When enabled, the FILES-tab GraXpert modal opens with Run in browser unchecked. Useful if your browser can't load the models (very old device, no WebGPU or WASM SIMD) and you want the host's graxpert binary to do the work instead. The in-browser toggle is still available per-run, this is just the default.

🎛️GPU acceleration (OpenCL)

Offloads classic image math (debayer, alignment warp, stretch, editor blur, live-stack integration) to the SBC GPU when the board exposes OpenCL (e.g. Mali on RK3588, Adreno on QCS6490). Falls back to the CPU automatically per operation. This is for classic math only, GraXpert AI inference uses a separate accelerator path (an NPU, or the GPU via Vulkan/ncnn), shown in the AI models section above.

No OpenCL device on this machine, running on CPU.

📊Hardware benchmark

Measures how fast this machine runs the Polaris image pipeline (stacking, capture/video encode) plus a raw CPU/memory test, so you can compare different boards (Raspberry Pi, Orange Pi, mini-PC, etc.). The synthetic test runs the same fixed workload everywhere, so the scores are directly comparable. No camera needed.

🩺Diagnostics

Checks that everything Polaris needs is present, enabled and permitted: services, star catalogues, udev and PolicyKit rules, the capture folder, whether the card was ever expanded, and whether this device has an identity of its own. Nothing is changed. The same report is written to the boot partition on every boot, so a host that comes up wrong can be diagnosed by reading a text file from the card on any computer.

💾Backup & restore

Save every setting and rig to a file you keep, then restore it any time. Use this so a rig or your network-share login is never lost for good, and to copy your setup to another Polaris.

The backup file holds your saved passwords (including the network-share credentials), so keep it somewhere safe.

⚠️Reset everything to factory defaults

This wipes all of your saved settings: every rig, equipment profile, the app password and login sessions, observer location, and UI preferences. Polaris goes back to how it was the very first time you opened it. Use this before sharing or distributing a clean SD card image so none of your own (or test) config is included.

Your captured images and FITS files are kept, only settings are cleared. This cannot be undone. After it finishes, the page reloads and the first-run setup starts fresh.

Connection to server lost. Reconnecting... The network to the host is slow right now. The host keeps running the session on its own. This is the link between this browser and the host, not your equipment.

🧩 Mosaic planner,

Grid is centred on the selected target. Per-panel FOV is auto-filled from the active rig's sensor + focal length, adjust if needed.

panels
est. session
overlap

slew + plate-solve + exposures, per-rig defaults assumed

📍 Set your observatory location

Latitude and longitude are needed for accurate Local Sidereal Time, altitude charts, meridian-flip timing, and twilight calculations. You can change this any time in Settings.

Tip: longitude is positive east of Greenwich, negative west. Most online maps show this directly.

🔒 Install Polaris certificate as trusted

One-time per device. After install, the browser shows the normal green padlock instead of "Not secure", forever (until cert expires in ~5 years).

Step 1, Download the certificate

On the device you want to add, click:

⬇ Download polaris-root.crt

Saves polaris-root.crt to your Downloads folder. Only the public certificate is exported, the private key never leaves the server.

Step 2, Install + trust it

  1. Double-click polaris-root.crt in Downloads.
  2. Install Certificate…Local MachineNext.
  3. Place all certificates in the following storeBrowse…Trusted Root Certification AuthoritiesOKNextFinish.
  4. Windows shows a security prompt with the cert fingerprint, compare to the one in Polaris Settings, click Yes.
  5. Restart Chrome / Edge. Reload Polaris, green padlock 🔒.
  1. Double-click polaris-root.crt, opens Keychain Access.
  2. The cert appears under login → Certificates. Drag it to System → Certificates, authenticate with your password.
  3. Double-click the cert in System, expand Trust, set When using this certificateAlways Trust, close the window, authenticate again.
  4. Restart Safari / Chrome. Reload, green padlock 🔒.
  1. Tap ⬇ Download above from Safari (not Chrome, iOS only shows the install prompt for Safari downloads). When iOS asks "This website is trying to download a configuration profile. Do you want to allow this?"Allow.
  2. Open the Settings app. At the very top, a new entry Profile Downloaded appears, tap it → Install (top-right) → enter passcode → Install again → Done.
  3. ⚠ CRITICAL extra step that catches everyone: Settings → General → About → Certificate Trust Settings → toggle ON the polaris-root entry. Without this iOS only trusts the cert for VPN/Mail purposes, NOT for Safari TLS.
  4. Reload Polaris in Safari, green padlock 🔒.

⚠ Limitation: Chrome on Android 7+ does not trust user-installed certificates, only system-level certs (require root) work for browser TLS. On stock Android chrome:// will keep showing "Not secure".

What works on Android:

  • Add Polaris to home screen as PWA (Chrome → ⋮ menu → Install app), opens in a chromeless window where the warning is hidden.
  • Use Firefox, it has its own CA store and respects user-installed certs.
  • Use the Polaris Relay for a real Let's Encrypt cert (see Relay docs).

To install system-wide anyway (works for some WebViews):

  1. Settings → Security → Encryption & credentials → Install a certificate → CA certificate → confirm warning → pick polaris-root.crt from Downloads.

Chrome on Linux uses an NSS database for its trust store. One command does the install:

# Install certutil if you don't have it
sudo apt install libnss3-tools   # debian/ubuntu
# (or: sudo dnf install nss-tools  on fedora)

# Import polaris-root.crt as trusted CA in Chrome's NSS DB
certutil -d sql:$HOME/.pki/nssdb -A -t "C,," -n "polaris-root" \
    -i ~/Downloads/polaris-root.crt

Restart Chrome. Reload, green padlock 🔒.

Firefox: Settings → Privacy & Security → Certificates → View Certificates → Authorities → Import → pick polaris-root.crt → tick "Trust this CA to identify websites".

Verify

After install, the cert SHA-1 fingerprint your browser shows in "Cert details" should match the one in Polaris Settings:

SHA-256 (what modern browsers show, copy this and Cmd/Ctrl+F it in your browser's cert-details dialog):

SHA-1 (legacy):

Match means you installed the right file. Mismatch means re-download from the trusted server and try again.

⚡ Stack with Siril

Lights: Darks: Flats: Biases:

Lights + any darks / flats / biases come from the STUDIO stack slots. The script above is auto-matched to what's present; drop a set with ✕ to switch variants, or override the dropdown.

Runs GraXpert background extraction on every light first (~10 s each), then feeds the cleaned _bge versions into the Siril script. Slower but cleans up gradients before they get baked into the master.

🌃 GraXpert BGE pre-pass
⚡ Siril stack (post-BGE)

🖥 Siril console

🌃 AI Background Extraction 🌌 Image Sharpen / Detail ☄ AI Denoise ✨ AI Halo Removal 📈 AI Upscale

Output:

If enabled, this client device will be used to run the processing model directly, offloading the host. Requires a compatible GPU and a supported browser.

⚠ You're on the slow address. Open instead to use your device's graphics card, much faster. (The browser will ask you to trust the certificate the first time, just click through.)

Where BGE / Denoise runs. NPU and GPU (Vulkan) are much faster than the CPU and free the cores for stacking. CPU uses the GraXpert CLI.

⚠ Denoise on the NPU runs a quantized model, so the result may be slightly lower quality than the CPU/GPU/browser path (e.g. faint star artifacts) due to NPU hardware limits. For a final master, pick the GPU (fp16) or CPU instead.

⚠ These look like single-exposure photos. Denoise and Deconvolution work much better on a stacked image (the combined result of many exposures). Running them on single shots can make the picture worse, not better.

Processing:

🖥 GraXpert output (host)

✂ Crop

Drag a rectangle on the picture below to choose the area you want to keep. Everything outside the rectangle gets trimmed off. The original file stays untouched: Polaris saves a new file named next to it.

Source preview

Selected:

Cropping... saving the new file.

🌠 Remove stars

FP32 is ~2× the size and memory of FP16, best on a desktop; on SBCs/phones the FP16 default is recommended.

Lower = stronger stretch (more aggressive star removal, risk of halos). 0.15 is the default; raise toward 0.25 if bright-star halos appear, lower toward 0.10 for faint targets.

Higher = wider coverage around each star (removes bigger halos, but can soften faint nebulosity directly under bright stars). The removed flux goes into the _stars layer.

🌠 Removing stars

Star removal runs locally in your browser, in tiles. When it finishes you'll see the original vs the starless result side by side. The originals stay untouched, Polaris writes new _starless and _stars files.

🎚️ Image Blend
Blend preview

Independently stretch the Base (starless) and Blend (stars), then recombine. Screen adds the stars back on top of the processed nebulosity. Originals stay untouched: a new _blend.fits is written.

Base · starless
Blend · stars
Blend

🏷 Batch rename

Build a new file name from each file's FITS header. Type any header keyword in braces, e.g. {OBJECT}_{FILTER}_{EXPTIME}s_{n:03}: plus {n} for a counter ({n:03} pads to 001). The original extension is kept and the originals stay in place; names that clash get a _1, _2… suffix automatically.

Current name New name Status

Renaming files…

🔬 Image analysis

Source preview

AI model licence, CC BY-NC-SA 4.0

The GraXpert AI models (Background Extraction, Denoising, Deconvolution) are © GraXpert Development Team and licensed under CC BY-NC-SA 4.0, non-commercial use only, with attribution and share-alike on derivative works.

Polaris itself is AGPL-3.0 and does not redistribute the model files; they live on your server's disk via Onnx:ModelsPath and stream to your browser under the model authors' licence. By continuing you confirm your use of the models complies with the terms above.

White Balance summary
White-balance gains   · ·  - applied to the new master. A tight scatter on the green fit line means a confident calibration.
Original
Processed
Plate solving for annotation…

            

🎯 Plate solve

Solving . If the picture has no coordinates saved, give the solver a hint below, search for the object you photographed, or type roughly where the telescope was pointing. Leave it blank to let the solver search the whole sky (slower).

Target:

🔭 Manage rigs

A rig is a saved set of equipment selections. Edit device pickers, optics, cooler target and PHD2 endpoint directly on the cards in the RIGS tab, they all save to the active rig automatically. This modal is for rig management: rename, create, duplicate, delete, switch active, and set per-rig filter offsets.

Save your rigs to a file so you never lose them:
Guiding
RA " DEC " Tot " Dithering…
Framing a target for the plan, pan/zoom, then add it.

Preview will appear here…
Rendering…
Auto-stretched preview. The saved file keeps its linear data.
Speed
🐍
Log

        

Loading…
Empty folder

Resume sequence?

This sequence has unfinished progress ( of frames done). Continue from where it stopped, or restart from the beginning?

Resume sequence?

The stopped run left unfinished progress. Continue from where it stopped (already-captured frames are kept), or restart the whole tree from the beginning?