Sunday, August 9, 2026

KStars 3.8.4 Released

KStars v3.8.4 is released on 2026.08.09 for Windows, Linux, and MacOS.

For Linux users, it's highly recommended to use the official KStars Flatpak hosted at Flathub.

This release brings major improvements including the World's First AI powered Guider! Furthermore, KStars now ships with an MCP server which enables connection to any LLM for full control. In this release a limited subset of skills have been introduced, and we hope to make the MCP server feature complete by the next release. Additionally, we improved rotator calibration, guide camera streaming support, and scheduler performance with large job lists. We've also fixed dozens of stability issues and added comprehensive tilt correction for mosaic masks. Here are some highlights.

AI Guiding Assistant

Pavan Kumar is our brilliant Google Summer of Code student who spent the summer developing an AI assisted guider. He delivered the AI Guiding Assistant for Ekos, a mount specific predictive guiding architecture that trains custom models for worm gear, harmonic drive, and direct drive mounts. The wizard walks you through system identification protocols, exports training data, and loads trained models for feed forward correction.

The assistant adds a feed forward predictive layer on top of Ekos's existing proportional guiding controller. A one time characterization wizard runs a system identification pass on your mount, and the resulting data trains a small model specific to your mount class (worm gear, harmonic drive, or direct drive). During guiding, a confidence gated controller blends the AI's predicted corrections with the classic proportional fallback, so the system defers to the proven controller whenever its own confidence is low. It runs entirely on device with no cloud dependency and no GPU requirement, does not need retraining every session, and deliberately does not attempt to predict stochastic noise sources like atmospheric seeing.

  • AI Guide protocol separated from the wizard UI for better modularity
  • Fixed filter models and reworked the system identification protocol and trainer
  • Wizard navigation fixed when closing and reopening; export now only includes the latest session logs
  • Added button to read offline training instructions directly from the wizard
  • Oscillator improvements for better stability during training
  • Fixed the fingerprint builder to correctly validate model compatibility across sessions

The AI Assisted Guider is still in experimental stage. Help us by sharing your feedback and exporting logs to us to analyze.

Guide

Andreas R. landed a run of guiding fixes this release:

  • Fixed streaming guide mode calibration failures on fast and harmonic mounts. The pulse guard is no longer armed during calibration, preventing "Lost track of the guide star" aborts that starved the AI Guider's system identification run
  • Fixed dark guiding (GPG and AI feed forward) in streaming mode by distinguishing between frame prediction pulses from real correction pulses, so the measurement loop no longer starves at the 0.5 s dark interval
  • Fixed the AI feed forward block reading declination from FITS headers. OBJCTDEC is a sexagesimal string, but the code was calling toDouble(), so declination silently stayed 0.0 on every frame. Now reads altitude, declination, and pier side directly from the mount object instead of headers
  • Added per optical train persistence for Predictive Guiding (GPG) period length, so users switching between worm gear and harmonic drive mounts on the same machine no longer clobber each other's tuned period values
  • Fixed the GPG circular buffer losing insertion order after 8192 samples. The read offset (start) was never advanced when the buffer filled, corrupting the chronological sequence and breaking the Gaussian Process training after roughly 68 to 82 minutes of continuous guiding at short exposures
  • Fixed guide camera binning not restored from optical train settings on Ekos startup with real hardware. The combo box was empty when setAllSettings() ran, so the saved binning was silently dropped. Also fixed a false "not supported" detection that compared against the driver's current binning instead of its maximum
  • Added an "Assume DEC orthogonal to RA" calibration option, which bypasses independent DEC angle measurement when periodic error or backlash causes erratic DEC calibration datapoints, deriving the guide angle solely from the RA axis with DEC forced to a 90 degree offset

Rotator

  • Fixed rotator auto reverse detection and added direction parity correction. The wrong direction detector never fired because the PA error tracker was unconditionally cleared before the confirming solve could check it. Now detects reversed rotation, trials the parity flag, recalibrates the offset immediately, and persists the correction only once a retry confirms it worked
  • Renamed internal flag to m_RotatorParityRetried to avoid confusion with the rotator's own driver level reverse functionality
  • Exposed the learned parity as a "Rotator direction reversed" checkbox in Align settings (below Flip Policy), so it can also be set manually without touching the driver's ROTATOR_REVERSE switch
  • Clear previousPAError when rotator times out or fails, preventing false positive auto reverse triggers
  • Fixed false positive rotator wrong direction detection by resetting m_PreviousPAError at key state transitions (successful rotation, mount slew, PA error decrease)
  • Rotator motion commands are now only sent when necessary, reducing unnecessary chatter

Camera & Capture

  • Added simple option for camera warmup instead of requiring users to create a task action for it, so camera sensors can now pre warm before a session starts
  • Andreas R. fixed the filter combo not reflecting the selected job in the Sequence Editor. In standalone mode, filter name lookup always returned -1 because filterLabels() returned an empty list without an INDI connection. Now resolves by name against the combo box contents
  • Auto default remote directory based on frame type in the capture module: %h/Videos for Video frame type, %h/Pictures otherwise, whenever the field is empty or still holds a previously auto generated %h path
  • Fixed an issue where video frame type selections didn't properly disable preview and loop, and set remote directory to a sane value so INDI can successfully write the video file

Scheduler & Observatory Automation

Andreas R. contributed two fixes here:

  • Added a wall clock timeout to the guiding stage (reusing the existing CaptureOperationsTimeout setting, default 300s) to prevent infinite retry loops when PHD2 fails to find a guide star, preventing wasted nights on a single target
  • Cached .esq file content to eliminate O(N) disk I/O per evaluation cycle. With 80 jobs on a Raspberry Pi, the greedy scheduler was spending 9 to 10 minutes of pure overhead re reading and parsing XML files from the SD card per cycle. The cache is keyed by file path and modification time; XML is still re parsed per call but disk I/O is eliminated

Hy Murveit sped up loading large .esl files by not repeatedly calling currentPositionChanged. A 100 job file now loads in a second or two instead of 40 seconds.

Wolfgang Reissenberger made two scheduler improvements:

  • Replaced stderr output with debug log output in the scheduler for cleaner diagnostics
  • Changed doubled sequence validation to only emit a warning instead of blocking, allowing setups with multiple cameras to use the same sequence on different targets

Alignment & Mount Modeler

Christian Kemper fixed two solver related issues:

  • Fixed solver algorithm selection based on available hints, so constrained plate solves now run faster than blind solves on multi core machines. The patchMultiAlgorithm() logic now selects MULTI_DEPTHS when a position hint is present and the scale window is narrow enough, MULTI_SCALES otherwise. The 1 Default align profile is now created with sensible bounds so fresh installs benefit immediately
  • Fixed scale bounds being double widened. Align::startSolving() and PolarAlignmentAssistant::startSolver() were applying their own 0.8x/1.2x margin on top of the same widening in SolverUtils::prepareSolver(), producing a net [low × 0.64, high × 1.44] window instead of the intended [low × 0.8, high × 1.2]
  • Fixed several Sentry and user reported crashes on camera timeout and restart drivers; Focus, Align, and Capture now have consistent timeout behavior
  • Salman Naheed added mount model commands for programmatic access
  • Andreas R. fixed filter not being reset to Sequence Job filter post meridian flip if the filter was different in Align
  • Process JSON alignment data from INDI mounts for improved integration
  • When running plate solving manually, reset target position angle and previous PA error, since otherwise they remain forever until successful or another load and slew is called

FITS Viewer & File Handling

  • Fixed unwarranted 180 degree rotation when pier side differs from the FITS file used for Load and Slew
  • Andreas R. fixed the Statistics panel showing full image stats when ROI is active. When a new image loaded while the selection rectangle was active, the panel reverted to full image statistics and users had to "jiggle" the box to refresh. Now checks whether the selection rect is shown and recalculates the ROI buffer from the new image data automatically
  • Christian Kemper fixed a CFITSIO_LIBRARIES typo that was dropping cfitsio from the link line. The variable name was missing the trailing S, silently overwriting the library and causing undefined references at link time for targets that depend only on Qt::Core and cfitsio

Focus

  • Added Tilt Correction Advisory to the Aberration Inspector, which computes and displays suggested tilt plate adjustments after autofocus with a mosaic mask. Supports 3 point plates (ETA, Octopi, manual 3 screw) and 4 point plates (TouTek style corner screws). Includes a rear view diagram with color coded points, mode toggle (Relative or Push only), thread presets (M2.5 to M6, Wanderer ETA, Custom), camera rotation dial, and an "Apply to ETA" button that sends corrections directly to Wanderer ETA M54 via INDI

Thomas Nemer fixed two focus related bugs:

  • Fixed Focus::autoFocusLinear and scanStartPos passing measure as weight. Two callsites passed getLastMeasure() into a weight slot instead of getLastWeight(), corrupting the V curve fit and the weights exposed via Focus Advisor
  • Fixed Focus::focusOut ignoring caller supplied step count. A duplicate assignment was unconditionally overwriting any explicit value, so focusOut(100) always moved by the UI default

MCP Server (Remote Control)

Thomas Nemer established the MCP server foundation, an in process MCP server inside Ekos that lets external clients drive KStars over JSON RPC 2.0 over HTTP, with bearer token auth and an optional read only token. It includes transport, tool registry, server orchestrator, settings UI, and comprehensive unit tests. His additional work this release includes:

  • MCP mount control tool family (12 tools: coords, goto, goto_target, sync, park/unpark, abort, set_tracking, set_track_mode, set_slew_rate, get_slew_rates, set_meridian_flip)
  • MCP catalog search tool, which resolves fuzzy or user supplied names ("M42", "andromeda", "polaris") into canonical KStars names for use with mount_goto_target
  • Focuser tool family (status, move_absolute, move_relative, abort_move) with a shared device lookup helper
  • Image access tool family (image_last_info, image_last_thumbnail) with per camera frame cache
  • "Available tools" panel in MCP settings, so operators can see which tools are exposed, what each does, and enable or disable individual tools or entire families via checkboxes
  • Unit tests isolated from the real token keychain, so the test suite no longer clobbers the developer's stored MCP credentials
  • Silenced Wmissing field initializers warnings in tool registrations

Stability & Bug Fixes

  • Ilia Belov fixed a crash when a stale EkosLive dialog response arrives after the dialog was dismissed. KSMessageBox is a reused singleton, and buttons of a dismissed dialog stayed as its children; a remote response sent after dismissal clicked a stale button and crashed KStars with SIGSEGV
  • Andreas R. fixed missing i18n and null check crashes in BuildFilterOffsets: button labels, tooltips, and status text were untranslatable, and several methods accessed m_BFOModel.item() without null checks
  • Fixed a crash when building offsets by using showDialog properly
  • Made Build Filter Offsets accessible programmatically and via EkosLive
  • Set proper unique object names for both Filter Manager and Build Filter Offsets
  • Fixed an issue where combo boxes in global config were not getting saved; only write the combo's index when it is populated and has a valid selection
  • Fixed -1 corrupting persisted combo settings before device connects. Several combos (guide/CCD binning) are only populated once a device connects, so currentIndex() returned -1 and overwrote the saved option
  • Suppress pulses from reaching the mount when disabled
  • Mark state as aborted if user explicitly cancels the dialog
  • Shut the profile down instead of indefinitely waiting when checkINDITimeout fires
  • Correctly wait for remote drivers and add contribution of all sequence files

Build & Infrastructure

  • Attempt to make Flatpak arm64 builds use only 4 cores to work around OOM errors
  • Limit Eigen to 4 CPU cores so it can build on the arm64 Flatpak CI runner
  • Do not build testing, demos, docs, or Fortran in Eigen
  • KStars now compiles with OpenCV 5
  • Scarlett Moore added cmake root path env for Snapcraft

Other Improvements

  • Extended filter offsets maximum range to 1 million per user request
  • Added a script to generate indidrivers.xml
  • Fixed wizard state transition when stopped
  • Offset is now updated after each solve, with more logging to diagnose future issues
  • Guilherme Marçal Silva updated the kstars.notifyrc file

Christian Kemper made three additional fixes:

  • Added KSPaths bundle Resources/kstars/ search on macOS, so data files are now found directly in the app bundle
  • Corrected DST rule for countries that abolished daylight saving in citydb
  • Normalized the country column in citydb to ISO 3166 1 alpha 2 codes
  • Replaced the binary citydb.sqlite with a source built TSV format; the database is now generated at build time

No comments: