Tags give the ability to mark specific points in history as being important
-
v0.6.0
protectedfa42b83e · ·v0.6.0: the lens from a list, a star database that fits it, and a CSI camera at its full depth The setup page and the first-boot page offer fifty real lenses instead of a text box (ADR 0042). `optical-process` hands cedar-solve a star database built for the field of view that lens gives, and a station with no lens says so. A CSI camera runs at the deepest sensor mode of its size and its noise estimate reads the frame's real ADU grid: the software half of why the HQ Camera never plate-solved. Its line time is now measured. A station no longer reverts its own configuration (ADR 0041). The live view is a stream. Alpha-5 catalogue numbers reach the correlator, and one dash in one sub-frame is one dot. A station keeps running past the bundled IERS table's expiry, past a telemetry queue over 256 rows, and past a distortion refit that runs away.
-
v0.5.0
protectedfcd76f31 · ·v0.5.0: a second camera, a site from the receiver, and a correlator that reads it The first release with two camera vendors: an SVBONY SV705C is a frame source and produces the stvid fourframe. A GNSS-sited station carries the receiver's median position through the gate, the store and the wire, and optical-process builds its correlator from that same site, so a station with no [site] table stops reporting every track as unknown. A PPS station's clock term reaches the network, the plate solver and the linker may take different detectors, and a pass is matched at the seam between two groups. __version__ and pyproject both move to 0.5.0.
-
v0.4.1
protectede56c6600 · ·v0.4.1: an owner picks the channel their station follows Two channels, beta and stable, and the first release a station can choose to stay on. Carries the updater that knows the two names and refuses any other, the channel picker on the Software card, and the resolution that makes the card and the network report the channel a station is actually on rather than the one it was flashed with. A station must be RUNNING this build before its owner can pick stable: the allow-list ships on the card, so the path is beta -> here -> choose. __version__ and pyproject both move to 0.4.1.
-
v0.4.0
protected185775d0 · ·v0.4.0: the station restarts from its own page, and stops reporting itself healthier than it is Two defects the tests agreed with -- acquire/fits.py 16-20x slower than the astropy call it replaced, hough3d.Track3D.direction wrong by ~6300 -- and, from the night of 2026-08-29 on station 4, five surfaces that reported a station healthier than it was: the crop count, solve_rate, the unit states, the station's own name, and retention deleting stacks the pipeline had not read. The video stream is now held open across stacks (issue #7), which took the measured inter-stack gap on bench1 from ~2.0 s to ~0.5 s. __version__ and pyproject both move to 0.4.0.
-
v0.2.10
protected4592d9d2 · ·v0.2.10: the run directory is writable by the units that write it `ProtectSystem=strict` remounts the filesystem read-only apart from `ReadWritePaths`, and neither `optical-acquire` nor `optical-web` listed `/run/satnogs-optical`. tmpfiles.d creates that directory 0750 satnogs-optical and the image's permissions policy states the service needs rwx there; both were true of the directory and neither of the process. Focus mode had therefore never worked on a real station: the viewer writes the marker, and every write failed with EROFS. It had only ever been exercised outside the unit's sandbox. The Live view's own state, published every cycle since v0.2.9, failed the same way. Same root cause as the claim install dying in its own sandbox. The companion test derives each marker's path from the module that writes it, so a new marker cannot be added without a unit that can write it. `publish` still cannot raise -- it runs inside the capture loop -- but it says so once. The silence is what let this hide.
-
v0.2.9
protectedee540c58 · ·v0.2.9: the station says what it is doing, from what it is doing The Live view took the station's state from the newest `acquire_holding` telemetry row. That reader can only see unsent telemetry, and `optical-agent` drains the queue within seconds, so the blocking condition was invisible whenever the uploader was keeping up. Station 4 on the morning of 2026-08-28: the sun 26 degrees up, acquisition logging *holding - darkness* every minute, 810 holding rows in the store and none of them unsent, and the page reporting `observing / capturing: true / measuring: true`. Two more faults in the same call: it took `limit=1` and filtered by kind afterwards, and it hardcoded `running=True`, which made `stopped` unreachable. Three of the four named states were decided by whether an upload had happened. Acquisition now publishes its state to the run directory once per cycle, beside the focus marker and on the same terms: tmpfs, 0644, and `running` derived from the marker's age rather than claimed by the writer. Making `stopped` reachable exposed that the focus button followed the state word, so an operator whose acquisition had died could turn focus on and lose the control that turns it off. It follows the request now. The browser flow test is what caught that.
-
v0.2.8
protectedcf4e593c · ·v0.2.8: ending focus mode actually ends it Two faults found ending the first real focus session on station 4. `stop` reported a state it had not achieved. It returned an inactive state unconditionally, so the viewer answered `{"active": false}` while the marker was still on disk, owned by another user, and the station was still focusing. The marker is written by the viewer and read by every optical-* unit as a different user, so failing to remove it is the realistic case rather than the exotic one. It now reads the state back from disk, raises `FocusNotStopped` when focus mode is still on, and the route answers 503. Removing the marker did not end the focus session. The prefix that decides whether a frame is ever measured is chosen once and nothing revisited it, so acquisition went on writing into `focus-<date>` -- which the pipeline steps over by design. Every frame captured after the operator stopped was captured, stored and never measured, while the page said the station was measuring. The same gap is worse entering focus mid-session, where frames taken with a hand on the focus ring are measured and uploaded as evidence. That has gone unnoticed only because focus mode has so far been started in daylight, where the gate had already closed the session at dawn. Both are one fix: leaving focus is a session boundary in the same way entering it is. -
v0.2.7
protected499c292d · ·v0.2.7: the night the linker stopped throwing away trails Two independent defects were making this client report single points where the sky had lines, and a third was quietly discarding the stacks that had trails in them. All three were found by measuring station 4 rather than by reading the code. A five-sigma cut on an integer frame was measuring the ADU grid. The median absolute deviation of a quantised array floors at the quantisation step, so the nominal 5 sigma cut was landing at 12.2. A pass one stack apart could not be joined: the association gate was capped at 3.0 deg, below one stack's own cadence. The linking budget skipped exactly the stacks that had trails in them. Linking cost rises with the number of detections, so the only stacks expensive enough to exceed a budget are the ones worth linking. The throughput estimate that drove it timed the whole stack rather than the linker, learned from clouds too small to measure, and ratcheted upward for ever. It read 46x too pessimistic; the 100-point trail it refused as "25.5 s" links in 32 ms. ADR 0021: stvid's detection core is vendored as GPL-3.0 source rather than reimplemented, after cgbsat challenged the clean-room approach. cedar keeps the astrometry. stvid has been the window detector on station 4 since 2026-08-27 and agrees with the clean-room detector to within one point per stack on identical input. Also here: focus mode and the four named station states, a daylight gate that stops capture and processing while the sun is up and nothing else, per-dot epochs read from the anchor a stack declares, and a TOML station that can finally change its exposure and stack depth. Verified on optical-bench1 (station 4) as devel-3a1bd09d-69193916-ab: budget skips 40 -> 0, degraded 389 -> 0, throughput 3.48e-4 -> 7.5e-7, and measurements from 3 in an evening to hundreds in an hour.
-
v0.2.0
protected80e22e78 · ·SatNOGS Optical client 0.2.0: A/B updates proven over the air both ways with autonomous confirm; the agent leaves the gate and a half-provisioned station reports the half it has; the viewer shows and triggers updates; writes open on the LAN (ADR 0012 amendment); persistent journal and the start-limit latch lint. Station 4 became visible to its network today.
-
v0.1.2
protectede5b81a58 · ·v0.1.2 — the station page an operator can actually open The first client tag, and the first release built by the two-image strategy: this tag is resolved to the commit it names and becomes the default row in Raspberry Pi Imager. What changed since b8dd12f, the client the published image had been building from: optical-web binds the LAN (#4). It defaulted to 127.0.0.1, so a station's own viewer answered only on the Pi. P1.5 recorded the local viewer as delivered and no operator could reach it. It answers on port 80, shares that port with optical-setup through the claim, and no longer waits for the readiness gate -- a station claimed at noon used to serve no page at all until sunset, because optical-setup exits on claim and the viewer would not start until dark. A station reports which build is answering. satnogs-optical-client/0.1.0 is what every build has ever called itself, so nothing the station served could answer "does this one have the fix". It now reads the provenance the image bakes onto the card and reports it on its own page, on /api/v1/health, and -- through the batch that produced the measurements -- on optical.satnogs.org. A client change now builds an image. The trigger lives here because "the client changed" is only knowable here, and the gap it closes is real: the fix above sat unbuilt while the published image kept shipping a client four commits older. NOT verified on hardware. No station has booted this stack, and P1.41 -- the first measurement from the 2.0 stack reaching the network -- is still open. The release checklist in the image repo asks for a real claim from a flashed card before a version is called stable; that has not happened for this one. It is tagged deliberately anyway, and the (beta) row carries the same code for anyone who would rather test before trusting.