Skip to content

Tags: DanWBR/NINA.Polaris

Tags

v0.97.26

Toggle v0.97.26's commit message
fix: the WiFi scan client gave up before the host did

- networkRescan waits 45s, above the endpoint's own 40s ceiling (25s forced
  rescan + 15s cached fallback); the default 15s aborted mid-scan
- an aborted scan and an empty result now explain themselves and point at
  typing the SSID by hand
- new strings in pt-BR, es, fr, de and _source

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

v0.97.25

Toggle v0.97.25's commit message
fix: plate-solve a full-resolution sub instead of the reduced live stack

- LiveStackingService keeps the last sensor-resolution sub while _stackBin > 1
  and exposes it as LastFullResolutionFrame; cleared on Stop and Reset
- /api/platesolve/solve-latest prefers it over the relayed stacked image and
  logs when it does

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

v0.97.24

Toggle v0.97.24's commit message
static files: stop caching the wasm bundle for 7 days without revalid…

…ating

/js/wasm/ was on the long-lived list next to the HiPS tiles and the vendored
libs, but dotnet.boot.js hashes every other file in the bundle and the runtime
rejects any file whose hash disagrees, so the bundle is only usable as a
consistent set.

- move the rule into StaticAssetCachePolicy and cover it with tests
- /js/wasm/ revalidates; a 304 carries no body
- match the long-lived paths by prefix instead of substring

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

v0.97.23

Toggle v0.97.23's commit message
settings: file the renamed card correctly, and stop tracing routine u…

…nreachables

The Display name card landed under "Other". reorderSettings keys its category
map on the card's TITLE, so renaming Host name to Display name silently
unmatched it. The entry now lists both spellings, and an unmatched card warns in
the console instead of quietly falling into "Other", which is how this went
unnoticed until it was reported.

Auto-connect logged a full socket stack trace when PHD2 was not running. It
runs on every boot and tries whether or not PHD2 is up, and most of the time it
is not: that is the operator starting it later, or never. A healthy startup
therefore read as a fault, and a log full of harmless traces is a log people
stop reading.

- "nothing is listening there" (ConnectionRefused, TimedOut, HostNotFound,
  HostUnreachable, NetworkUnreachable, TryAgain, our own 5 s cancel) gets one
  line that still names the reason, since refused and not-found are different
  problems
- anything else keeps its trace, at Warning; quietening a real surprise would
  trade noise for blindness
- the socket error is unwrapped through IOException/AggregateException, or
  every real case would fall through to the noisy branch
- the INDI path had the identical defect and gets the identical treatment

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

v0.97.22

Toggle v0.97.22's commit message
certs: put the name mDNS actually advertises into the certificate

mDNS advertises polaris-app-{shortId}.local so that cards flashed from one
image do not collide, and the certificate carried a hardcoded
polaris-app.local. The name discovery hands a client was therefore never in the
cert, so connecting the way the app tells people to connect always failed
validation. Two components deciding the same fact independently.

- DeviceIdentity is now the one place that decides the device's network names;
  MdnsService and SelfSignedCertService both call it, so the advertised name
  and the certified name cannot drift apart again
- the SAN list leads with the per-device name, the only one that stays correct
  once a second board joins the network, and keeps the shared aliases
  (polaris.local, polaris-app.local, hostname.local) because whichever board
  answers to them still has to present a cert that validates
- an Mdns:InstanceName override now reaches the cert too, so pinning a name
  cannot lock the operator out

The Settings card called itself "Host name", labelled its field "Name", and
printed a different "Network name" underneath, so an operator typed a name, saw
another one below it, and concluded the setting was ignored. It is now "Display
name" and says outright that it is a label: it never touched the host's
hostname and never enters a certificate.

- translated in pt-BR, es, fr, de; the replaced strings are retired

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

v0.97.21

Toggle v0.97.21's commit message
ui: give .input-sm the min-width its own comment has always claimed

The SSH port field showed "2" for a value of 22: with field-sizing: content and
no floor, the box shrinks to the value and a number input's spinner arrows then
sit on top of the last digit. That is the same failure the comment in this rule
describes the old fixed 80px causing, reintroduced by the fix for it, because
the min-width it promises was never written.

- .input-sm gets min-width: 72px
- input[type="number"].input-sm gets 96px, since the spinner takes ~20px the
  text never gets to use and a port is five digits

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

v0.97.20

Toggle v0.97.20's commit message
onnx: remember model hashes across restarts, and warm them off the re…

…quest path

The first GET /api/onnx/manifest after every restart read and SHA-256'd every
model on disk: on the Q6A that is 24 files and 3.86 GB off the system card,
measured at 48.07 s in the field log. The browser fetches that manifest at
startup, and while it runs the card is saturated, so serving the UI's own
JavaScript queues behind it. It read as a slow network.

- hashes persist to {DataDir}/onnx-hashes.json, keyed on path + size + mtime,
  so a model replaced by an update or a download is re-hashed and an untouched
  one is free from then on
- written via a temp file and a move, so a crash mid-write cannot leave a
  truncated cache to be read back as garbage
- WarmHashesAsync runs after the startup scan, so a fresh install pays the cost
  in the background rather than inside whichever request arrives first

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

v0.97.19

Toggle v0.97.19's commit message
storage: grant the capture-disk unit its own polkit rule, and make th…

…e card readable

Setting up a disk failed with "Interactive authentication required". The v1
claimed the self-update's PolicyKit rule already covered the new unit; it does
not. 50-polaris-update.rules scopes its grant to
action.lookup("unit") == "polaris-self-update.service", and the appliance runs
polkit 124, which reads .rules and ignores the broad manage-units grant in the
.pkla twin.

- 50-polaris-storage.rules grants the polaris user exactly one more unit,
  polaris-storage-prep.service, with the .pkla twin for polkit < 0.106
- 50-polaris-solverdb.rules: auditing every unit the app starts against the
  units named in a grant turned up the same hole in the solver-database
  install, which would have failed identically on a host that never had one
- the storage card is near-opaque instead of an 8% amber wash: HOME sits on a
  photographic sky and the description was unreadable over stars
- more padding, and the disk picker sizes to its content -- .input-sm caps small
  controls at 220px, which cut "KBG40ZNS256G NVMe KIOXIA 256GB" to "KBG40ZN"

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

v0.97.18

Toggle v0.97.18's commit message
planetary: debayer the stack, instead of writing a mosaic and labelli…

…ng it

The stacker mean-combined the CFA mosaic and stamped BAYERPAT, on the theory
that downstream tools would debayer it. They mostly do not: PixInsight needs an
explicit Debayer process, and every tool here treated the result as one grey
plane. A stack from an ASI585MC opened grey.

Sharpening it was also wrong arithmetic, which matters more than the colour: a
wavelet transform over a mosaic reads a red sample and the green beside it as
neighbouring values of one signal, so "sharpen the finest scale" sharpens the
Bayer pattern.

- the stacker debayers once, after the stack, and writes an RGB cube. That
  order is what the even-pixel alignment shift already existed to make valid:
  the CFA phase survives the whole stack, so the single debayer at the end sees
  a mosaic with its noise already averaged down
- the result declares no BAYERPAT, so nothing debayers it a second time
- WaveletService debayers a CFA input on load, so the stacks already on disk
  from before this open in colour and get correct maths; a mono frame is
  untouched

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

v0.97.17

Toggle v0.97.17's commit message
planetary: write recordings under the active rig, not a folder at the…

… capture root

SER clips went to {ImageOutputDir}/planetary/{target}, outside the per-rig tree
every other capture output uses, so two rigs piled their clips into one folder.
Stacks follow for free: the stacker writes into {folder of the SER}/stacked.

- ImageWriterService.BuildPlanetarySubDir gives {rig}/planetary/{target},
  sanitised the same way as the lights and calibration trees
- the recordings listing scans every rig's planetary folder AND the legacy root,
  so existing clips stay in the picker; nothing is moved
- each entry reports its rig, so two clips of the same target from different
  scopes are told apart; a legacy clip reports none, because its path does not
  record which rig shot it
- the benchmark write probe follows the recordings it is measuring

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>