Keep the frames that matter.
Reject the ones that don't.

PSF Guard is an image grading and quality screening tool for N.I.N.A. astrophotography with the Target Scheduler plugin. Grade subs visually in a fast web UI, screen whole nights for clouds and occlusion automatically, and write every decision back to the scheduler — so it re-captures what you rejected.

PSF Guard image grid with filtering and batch grading
The grading grid: filter, multi-select, accept/reject — written straight to the scheduler database.

Star count and HFR miss ruined frames. Measured on a real session: a tree line occluding the field left star counts within normal variation, and HFR stayed flat until the frame was more than 60% blocked. A thin cloud veil dimmed every star by 37% — and the frame was still Accepted by conventional grading. PSF Guard screens with signals that are local, photometric, and temporal — classical statistics calibrated on real sessions.

Everything between capture and stacking

🖼️

Fast visual grader

Web UI or desktop app with auto-stretched previews, zoom and pan, side-by-side comparison with synchronized zoom, batch operations, keyboard-driven workflow, and full undo/redo.

☁️

Automatic quality screening

Grid-based spatial metrics and cross-frame differential photometry catch occlusion, small clouds, thin veils, and errant light — with annotated diagnostic images explaining every verdict.

🔁

Scheduler write-back

Every grade lands in the Target Scheduler database, so acquired-image counts stay accurate and the scheduler re-shoots what you rejected.

🗂️

Safe reject archival

Move rejected frames and their sidecars out of the directory tree your stacking software scans. Idempotent, recorded, and fully reversible — restore never overwrites.

🔭

Two-machine workflows

Sync projects, captured images, and grades between the telescope's database and your grading machine — pull to refresh, grade locally, push grades back.

Star detection & PSF analysis

A port of N.I.N.A.'s detector plus the HocusFocus detector, with Gaussian/Moffat PSF fitting, annotated star maps, and residual visualizations.

Screening that sees what global metrics can't

Every flagged frame can be rendered as an annotated diagnostic: the analysis grid is overlaid on the image, colored by the signal that fired, with the verdict and metrics in the caption. You never have to trust a black box.

Annotated diagnostic showing occlusion arriving: red cells trace a tree line
Occlusion arriving — red cells trace the tree line exactly. Transparency of the surviving field: 1.01, which is why global metrics miss it.
Annotated diagnostic of a thin cloud veil detected photometrically
Thin veil — nothing is locally wrong, but matched-star photometry reads transparency 0.63 (~0.5 mag). Conventional grading accepted this frame.
Advancing occluder frontier: blue cells darker than history, yellow lit fringe
An advancing occluder: blue cells read darker than their own history (blocked skyglow), yellow marks the lit fringe.
Static corner glow detected against the frame's own gradient model
Static corner glow, present from the session's first frame — invisible to temporal baselines, caught against the frame's own gradient model.

How screening works →

A quick tour

Install it your way

Desktop app, Docker container, standalone binary, or Fedora RPM — one tool, wherever your images live.

🖥️ Desktop app

Native installers for Windows (.msi / NSIS setup with CLI on PATH), macOS (.dmg, Apple Silicon), and Linux (.deb / AppImage).

Download the latest release →

🐳 Docker

For NAS boxes and home servers. The database mount must be writable — grading writes back to it.

docker run -d -p 3000:3000 \
  -v /path/to/schedulerdb.sqlite:/data/database.sqlite \
  -v /path/to/images:/images:ro \
  ghcr.io/theatrus/psf-guard:latest

⌨️ Standalone CLI

Single binary for scripting and servers. Screen a night in one command:

psf-guard screen-fits ./LIGHT --annotate ./diag
psf-guard server schedulerdb.sqlite ./images

Downloads & platform notes →

📦 Fedora RPM

Prebuilt packages for Fedora 43/44 with a psf-guard.service systemd unit for running the grader as a daemon.

sudo dnf install ./psf-guard-*.x86_64.rpm
Back up your Target Scheduler database before first use. PSF Guard writes grades into it, and its sync commands can merge entire databases between machines. It's careful — dry-run flags everywhere — but it's also young software.