skotiq.
Download ↓
← All releases

2026-09-19 · HISTORICAL RELEASE

Skotiq 7.1.0

Earlier imaging, plate-solving, polar-alignment and guiding work.

This release rewrites most of the user interface, adds three new features, and fixes a batch of problems that turned up while using the app on a telescope in September.

The interface

Every screen has been rebuilt on the same set of components. Screens had been written at different times in different ways, so buttons, form fields, tabs and panels looked and behaved differently depending on where you were. They now all come from one shared library, so a dropdown in Settings works like a dropdown in the flat wizard.

Rebuilt: Tonight (the dashboard), Plan, Analytics, Weather, Equipment, Guiding, Settings, Onboarding, Imaging, the Sequencer, the Darkroom, the polar alignment and flat wizards, and the pairing screen.

Specific things that changed along the way:

  • Every screen has a proper page header. On a phone the title shrinks to make room for the buttons rather than pushing them off.
  • There is a new navigation rail. On windows narrower than 768 px the bottom navigation bar stays visible instead of sliding off the edge.
  • Dropdown menus open attached to the button you clicked. They used to sometimes appear in the middle of the screen.
  • Text is in sentence case rather than Title Case.
  • Red night mode now covers the imaging canvas and the weather map, which were both still drawing in normal colours.
  • Weather is now a full-screen radar map with the readings over the top.

Sequencer

Long sequences were hard to read — a twelve hour run was a tree you scrolled through. There are now three display densities, switched from the toolbar, and the choice is remembered. At the tightest setting the sequence is a table with aligned columns.

Repeated steps collapse into one row, so forty identical exposures show as one line with a count instead of forty lines.

While a run is going, the branch currently executing stays pinned at the top of the screen as you scroll, and a marker in the left gutter shows where you are in the sequence as a whole.

The panel showing a step's details has Settings, Activity and Notes tabs, and switching between them no longer scrolls the page behind it.

The Queue tab in the toolbox is now called Targets. It lists the targets in the current sequence alongside ones you have saved for later.

Pre-flight now stops you starting a sequence that needs centring when no plate solver is configured, instead of failing partway through the run.

DepthLock

This is new. You draw a box around the part of your target you care about and a second box over nearby empty sky, say how deep you want to go, and Skotiq measures that region on every matching exposure from then on, including across different nights.

The idea is that "six hours on Ha" is not really an answer. Six hours under a full moon and six hours on a clear night are not the same data. DepthLock tells you when the thing you actually care about has reached the depth you asked for.

Because each filter's goal can report how much it still needs, you can see which filter is behind and spend the night on that one instead of rotating out of habit. A Smart Exposure plan can read those numbers directly.

It will also tell you when more time will not help. If your calibration error is what is limiting the region, extra integration will not get you deeper, so it says so and suggests what would help instead.

There is fuller documentation in docs/depthlock.md.

Focuser backlash

7.0 asked you to type in a backlash figure. Most people do not know theirs.

There is now a routine that measures it. It runs two focus sweeps, one approaching from below and one from above, fits both and takes the difference. The result is saved per focuser. Before it starts, the wizard tells you how long the run will take and how many focuser moves it needs.

The value shipped by default is now 0 rather than 350. The 350 was invented, and it was being applied both in Settings and by the autofocus API.

The backlash model itself was wrong, which showed up when simulating a gear train. That is fixed. A cancelled calibration now reports as cancelled rather than as a failure.

Related autofocus changes: focus now always lands on its final position from below, and takes a real frame to confirm it got there. The outlier filter was discarding the points nearest focus on perfectly good sweeps. The star count reports how many stars were detected rather than the limit on how many were used.

Problems found on the telescope

Four of these cost whole nights, and none of them could happen in the simulator.

Sequences died about a second and a half after starting. After a slew, the check confirming the mount had arrived compared J2000 target coordinates against the mount's current-epoch position. Those never match, so every sequence aborted. The check now compares like with like.

Polar alignment never worked running towards the west. The code fitting the mount's rotation axis picked the opposite point on the sky, so the correction it gave you pointed the wrong way. It also now re-reads declination at each step, and solves the alignment frames using a position hint from the mount, which is much quicker than the blind solve it was doing. A 30 degree step and 2x2 binning work well.

The app froze completely the first time a plate solve succeeded. The annotation code was reading an 896 MB galaxy catalogue line by line on the UI thread. It now reads it off the UI thread. While in there: matching detected stars against the catalogue was quadratic and is now bucketed, and an image texture leak was fixed.

When the guider failed, exposures carried on, and then the app parked the mount — with someone standing next to it. Exposures now stop when the guider is not working, and parking at the end of a failed recovery is something you opt into rather than something the app decides.

Also fixed:

  • INDI: when a reconnection attempt failed, the client was left marked as restarting, and the code deciding whether to try again refuses to act on a client in that state. One failed reconnect meant the app never tried again, so a server that came back a minute later stayed unreachable.
  • Thumbnails were decoding full-resolution FITS files on the UI thread. They now read the small preview files that already exist, and size the decode to the thumbnail.
  • ASCOM: mount site and time go through the COM worker thread rather than a lock. When the mount's site and time disagree with the computer's, the app asks which to use instead of choosing for you.
  • The NYX mount answers the timezone query with +05:00 rather than +05, which the LX200 code did not handle.

Other changes

  • Camera sensor specifications now come from one place. Framing tells you where its numbers came from, an override only claims the values you actually changed, and the planner mentions a missing specification once rather than three times. The fuzzy name matching used to identify your camera was picking the wrong sensor.
  • Location: you can use Wi-Fi positioning, with separate permission per accuracy level and the accuracy radius shown. "Detect location" falls back to an internet lookup in one click.
  • The Profiles tab in Equipment now has a detail pane. It had none at all, so clicking a profile did nothing visible.
  • Session reports lead with what actually went wrong rather than whatever failed last while the run was shutting down.
  • Performance: the mount position poll was repainting the whole window. The status bar's selection and the dashboard now have repaint boundaries.
  • The catalogue prompt at startup is gone; the Tonight checklist handles it.

Upgrading

Versions are 7.1.0 build 28 across the desktop app, the mobile app and the update manifest.

Check your focuser backlash setting. The default changed from 350 to 0. If you were relying on the old default, run the calibration rather than typing 350 back in.

Master frames made with 6.2.0 are still unusable. That version had a normalisation bug that erased stars, and the files are rejected when loaded. Re-stack them from your subframes; your captured frames are fine.

There is no database migration in this release.

What has actually been tested

These fixes were made on the rig, not at a desk. The imaging chain in this release was worked out live on real hardware — a Pegasus NYX-101 mount, a ZWO camera, a ZWO EAF focuser and guiding, on Windows — with new builds going onto the machine while it was imaging and the code iterated until the behaviour was right under the sky. The slew-frame check, the polar-alignment fit, the freeze on the first plate solve and the guider arbitration were all settled that way.

Also measured on those nights: plate solving is accurate to 0.17 arcseconds, checked independently, and that EAF has about 105 steps of backlash. One thing is still unexplained — the mount moved 12.1 degrees when it was told to move 10.

Not covered: a full unattended night from dusk to dawn. The Windows and Android downloads are built by CI and were not separately installed and exercised for this release, macOS and iOS are not built at all, and switches, domes, covers and the remaining camera SDKs are in the app but have not been checked against hardware.

The same paragraph is in docs/known-limitations.md.

Other limitations

  • SFTP still has no password authentication, pending a decision about a dependency. Key authentication works.
  • The curves operation in the Darkroom renders but cannot be edited yet.
  • Denoise on very large colour masters uses a lot of memory at its peak.
  • With no observing site set, the default altitude trigger skips targets. The run outcome says so.
  • Weather safety fails closed by default: with no weather device and an API that has never been reached, an unattended rig will park. Set fail_open if that is not what you want.

Test results

  • 6,732 Dart tests and 3,039 Rust tests, no failures
  • Static analysis clean; dart format and cargo fmt clean; clippy clean with the same settings CI uses
  • The project's own checks pass: placeholder detection, fail-closed policy, behavioural audit, API contract, platform capability, version consistency and the bridge boundary audit
  • Licence audit and the dependency duplication check pass
  • The constellation hub's own analysis and tests pass
  • The Linux release bundle builds from this tree and contains its native library

418 commits since 7.0.0. The full list is in docs/CHANGELOG.md.

Search guides, downloads and release notes.