When I introduced seiza last week it was at version 0.2.2. It’s now 0.8.1 — six releases in six days, and almost every one of them opened a new door into the solver. Here’s the tour.

Seiza as Siril’s plate solver

The ASTAP-compatible mode let N.I.N.A. drive seiza with zero configuration. Siril now gets the same treatment from the other direction: a solve-field compatible mode. A copy of the binary named solve-field behaves like a local astrometry.net — it answers the version handshake, reads Siril’s .xyls star tables, honors the stop file, and writes the .wcs FITS header that Siril parses, SIP terms included. Point Siril’s astrometry.net directory preference at it and solve as usual. The end-to-end rehearsal ran Siril’s literal argument vector against a real 6165×4026 M31 frame — blind in position, SIP order 3, 1.45″ RMS.

That rehearsal surfaced a genuinely fun problem. Seiza’s speed comes from trusting brightness ranking: form patterns from the brightest image stars, match against the brightest catalog stars. But Siril’s star lists rank by fitted PSF amplitude, and on a stretched image only 2 of the top 24 amplitude-ranked stars were among the 100 photometrically brightest — the ranking the matcher depends on simply wasn’t there. The fix is rank-robust matching: when the star list’s ranking can’t be trusted, seiza seeds quads from the catalog side instead, where the ranking is always clean. External star lists from any tool now solve reliably, not just seiza’s own detections.

pip install seiza

Seiza is now a Python package — real bindings, not a subprocess wrapper. Detection, hinted and blind solving, WCS transforms in both directions, and FITS WCS keyword output, with binary wheels for Linux (x86_64 and aarch64), macOS, and Windows covering every CPython from 3.9 up. Solving releases the GIL, type stubs are included, and the solver accepts plain (x, y, flux) tuples — bring positions from any detector you like. Catalog downloads are one call: seiza.fetch_catalogs().

Both the CLI and Python solvers also learned SIP distortion polynomials (orders 2–5): fit on the accepted solution, checked against the linear fit over the same matched stars, with guards against warped fits — and a re-match loop that recovers stars whose distortion pushed them outside the linear tolerance.

Easier to install everywhere

  • Windows got a guided MSI installer: seiza lands on PATH, and the installer offers to download the catalogs when it finishes. The binary statically links the CRT, so it runs anywhere.
  • --data now accepts a directory — the right catalog inside is picked automatically — and falls back to standard locations, so most commands no longer need the flag at all.
  • Catalog downloads moved to compressed transports, and the object catalog jumped to an extensible mmap v4 format, picking up LBN and Cederblad along the way.
  • Minor bodies now report their apparent motion, and annotation arrows scale with it — a fast-moving asteroid gets a long arrow, a distant comet a short one.

One overlay to rule them all

The interactive object overlay — the ellipses, labels, transient markers, and RA/Dec grid you’ve seen in tenrankai and on seiza.fyi — is now a standalone npm package: @seiza/astro-overlay. It’s deliberately chrome-free: a pure SVG React component plus WCS and grid geometry, layer classification, a restrained per-catalog color palette, and a PNG compositor for exports. Each application keeps its own controls and branding; the rendering — and the geometry contract — is shared and versioned once.

seiza-server already runs it. Its 0.2 release also brought resumable chunked uploads, FITS header hints, per-catalog layer controls with catalog-colored markers, named-star identifier labels with lookup, solve timing telemetry, and a validation-image donation flow that grows the real-camera integration suite every release is now tested against.

Next: PSF Guard

This is where it’s all been heading. PSF Guard already adopted seiza-fits for all of its FITS reading, headers, and statistics as of 0.4.2. The next phase is in flight: plate solving inside PSF Guard itself, with a solution format designed as a superset of the overlay package’s contract — stable object IDs, aliases, hierarchy, and provenance — so graded frames get the same interactive object overlay, straight in the grading UI. Grade a night’s subs, and know not just which frames are sharp, but exactly what’s in them.

Everything is on GitHub, crates.io, PyPI, and npm.