Skip to content

Releases: giulioroggero/skyformac

v0.5.0 — Planetary Post-Processing, Edit Image, Live Capture

Choose a tag to compare

@giulioroggero giulioroggero released this 21 Aug 05:52

Highlights

  • Native Planetary/Lunar Post-Processing ("Post-Process…" on any .ser capture) — quality-scoring & registration, median/mean stacking, à trous wavelet sharpening, RGB channel alignment, and auto-stretch, all in-app, with GPU-accelerated debayering, background cancellable processing with real progress, and an optional GraXpert pass without leaving the modal.
  • Edit Image — a GPU-backed (Core Image) single-image editor on any FITS/PNG/TIFF capture: color/contrast/curves/sharpen/rotate/crop, denoise, a hot-pixel clean-up filter, three astronomy-specific tools (green-cast/SCNR removal, star-size reduction, shadow/highlight recovery), a one-tap Magic Wand auto-fix, per-parameter reset, and a zoom/pan control for checking results at real pixel scale.
  • Live Capture — an iPhone-Live-Photo-style workflow: buffer a few seconds of the live feed, scrub through every frame it captured, export whichever one actually looked sharpest.
  • Observation Timeline rework — spacing is now purely count-based rather than proportional to real elapsed time (no more dead space after a quiet week), a big date header tracks whatever's scrolled into view, thumbnails below 25pt of spacing hide on a stride to stay legible, and jump-to-most-recent/zoom no longer land in the wrong place.
  • Several real UI freezes fixed: exporting an image, capturing a dark/flat calibration frame, and rapid Capture ROI changes could each lock up or corrupt the live preview — see Fixed below.

Added

  • Native Planetary/Lunar Post-Processing pipeline for .ser captures, with optional GraXpert integration.
  • "Edit Image…" on any single FITS/PNG/TIFF capture, with per-parameter reset, denoise, hot-pixel clean-up, and three astronomy tools (green-cast removal, star-size reduction, shadow/highlight recovery), plus zoom/pan.
  • "Live Capture" burst + best-frame picker.
  • An always-visible "PNG" export button next to the RAW8/RAW16 picker.
  • A plain-English focus-quality readout ("Focus: Good/Fair/Poor") with manual-adjustment guidance.
  • A multi-select "Browse Files…" modal for files an external tool left in a session's folder, with a live preview and bulk Delete/Show in Finder.
  • A big date header on the Observation Timeline, and count-based (not time-based) spacing with a hide-below-25pt/reveal-on-zoom rule for crowded runs.
  • Optional Siril integration, GitHub community health files, capture flash/shutter feedback, per-project/session/capture disk usage, and more — see CHANGELOG.md for the complete list.

Fixed

  • Exporting an image (PNG/TIFF/FITS) froze the app and spun the pointer — the file encode now runs off the main actor.
  • Capturing a dark/flat calibration frame left the live preview frozen — it now resumes automatically.
  • Rapid Capture ROI changes could tear/flash the live preview — the controls now disable themselves while a restart is in flight.
  • The Observation Timeline's "jump to most recent" button and its zoom in/out could scroll to the wrong spot.
  • Planetary Post-Processing: no restack progress, a black preview during restack, cancel not actually stopping the CPU, unsharpened "foggy" defaults, and an unresponsive stretch slider — all fixed.

Full changelog: CHANGELOG.md#0.5.0

Installing

Download either the .dmg or .zip below, then run the bundled Fix Gatekeeper Warning.command once (moves the app to /Applications, clears the quarantine flag, resets the Camera permission) — Skyformac isn't notarized yet, so macOS Gatekeeper will otherwise warn on first launch. See docs/distribution.md.

v0.4.0

Choose a tag to compare

@giulioroggero giulioroggero released this 15 Aug 15:40

Added

  • Astronomy Knowledge (Settings) — a user-editable folder of plain .md
    reference files (Messier/bright-object seasons, planet/Moon visibility
    mechanics) folded into every AI panel request, grounding a small local
    model (qwen3:8b and similar) in real astronomy facts instead of guessed
    ones. Add/edit/delete files directly in Finder; Restore Default
    Content
    resets just the shipped defaults, leaving anything else added
    untouched.
  • The AI panel now includes the current date/time and observer location
    (session's, else project's, else the last GPS fix) in every request, and
    the Caldwell catalog (109 objects, Patrick Moore's "beyond Messier"
    complement) alongside Messier in the bundled sky catalog — used by the
    Atlas view, SkyAtlasLookup, and the Filters popover's object list.
  • A Stop button next to the AI panel's "Thinking…" indicator cancels an
    in-flight request; replies now render as Markdown instead of literal
    **asterisks**; AI planning/chat failures are logged to the Application
    Log, not just shown inline.
  • Multi-session AI chat history — create a new conversation, browse/
    rename/delete past ones, and resume exactly where one left off; each is
    persisted as its own file (same "one file per item" shape as Equipment).
  • Streaming AI responses — replies (including "Ask AI to Describe…")
    now stream in live instead of a bare "Asking Ollama…" spinner for the
    whole wait, and a configurable Max Response Length (Settings) bounds
    how long a single reply may generate.
  • Camera Settings on the Capture detail page — every field of that
    specific capture's own settings snapshot (mode, gain, exposure, ROI,
    drift reduction, Smart Live Stack, Lucky Imaging burst count, SER
    duration), previously recorded but never shown anywhere.
  • Previous/Next Capture buttons directly overlaid on the capture image
    itself, and Open Previous Session (only "Open Next Session" existed
    before) in the Project menu.
  • Open/Open in Viewer buttons on the Capture detail page for SER/
    recording/other non-image captures — FITS reuses the app's own real
    viewer, everything else opens in whatever the system already handles it
    with.
  • Zoom (like the Histogram) and manual entry on the Gain and Exposure
    sliders, for dialing in an exact value directly instead of only dragging.
  • Move a session to a different project, and Next/Previous
    navigation on the Project, Session, and Capture pages.
  • A zoomable, project-wide Activity Timeline chart, and real session
    times (not just a bare date) on session cards.
  • The camera view's toolbar now shows the running session's planned
    objects, so "what am I supposed to be pointing at" doesn't require a
    trip back to the session page.
  • Captures now auto-save directly into the active session's own folder
    — no folder-choice dialog — named <object>-<date>-<time> (e.g.
    M13-2026-08-15-213045.fits); the app already organizes captures by
    project/session, so asking again was a redundant step. Falls back to the
    old save panel only when no session is active to organize into.
  • Developer ID + notarization distribution set up (make release,
    docs/distribution.md, a Homebrew Cask template) — Skyformac ships as a
    signed .dmg via GitHub Releases, not through the Mac App Store; see
    docs/app-store-readiness.md for why that path isn't being pursued.
  • README: a development-status notice, a Screenshots gallery of the
    app itself, and links to the project's website
    and docs/distribution.md.
  • Credited Stellarium for the bundled Messier/
    Caldwell/bright-star catalog data (GPLv2) in THIRD_PARTY_NOTICES.md.

Changed

  • Removed "Ideas for Next Time" (the bare-object-name suggestion list) from
    the Dashboard and Insights pages — the AI panel chat is the intended
    place to ask what to look at next, and the Dashboard's own "Suggested
    Session" card already covers the same ground with a fuller answer.
  • Reduced the Projects browser/Dashboard's minimum width so the whole
    window (browser + AI sidebar) can no longer be forced wider than a
    1024pt-wide screen — on a smaller display this previously pushed the
    Settings toolbar button and the rightmost "Common Tasks" tile out of
    reach entirely, not just visually cramped (caught via two CI-only UI
    test failures that never reproduced locally, tracked down by downloading
    and inspecting the actual .xcresult from a failed run).
  • The AI panel's Minimize/Detach/Close/Dock header buttons are icon-only now
    (a tooltip on hover), instead of showing text labels alongside the icons.
  • Reduced Focus Assist/Planetary Tracking/Streak Detection's per-frame
    analysis cadence and the diagnostics poll interval as a modest, easily
    reverted energy tweak.
  • Internal refactoring, from a full-codebase audit for dead code,
    duplication, and performance: the Gain/Exposure zoom+manual-entry
    scaffolding collapsed into one shared generic component; a cached
    thumbnail loader replacing four separate uncached NSImage(contentsOf:)
    call sites; a shared root-directory-resolution helper across the
    Projects/Equipment/AI-Chat/Knowledge-Base file stores; several
    CameraManager helpers deduped (blocking-capture preamble, control-cap
    lookup); StatsGridView switched from a Table (whose manually-guessed
    height could clip a section with enough rows) to a self-sizing Grid.

Fixed

  • The AI panel failing to reopen as a detached window if closed while still
    in camera mode.
  • Live GPU/CPU image enhancement (denoise, wavelet sharpening, Live GPU
    Controls) applying to the next captured frame instead of the one
    currently on screen when a setting changed.
  • Live Stack's display stretch never re-adapting as the accumulated stack's
    own signal-to-noise improved, so it didn't visibly brighten.
  • AcquisitionMode mislabeling a plain single exposure (neither Live Stack
    nor a Lucky Imaging burst) as "Lucky Imaging" in history/Insights.
  • A GPU scratch-texture allocation failure could silently skip the final
    render stage, freezing the live preview with no error shown.
  • The Camera Error alert's dismiss button was a no-op — a dismissed error
    could silently reappear on the next unrelated re-render.
  • "Move to Project…" swallowing a failed move and navigating away as if it
    had succeeded; ProjectStore's delete/move helpers could otherwise leave
    a session's on-disk files orphaned or a CaptureRecord pointing at a
    file that no longer existed.
  • Unplugging a camera or losing a webcam mid-recording didn't stop/finalize
    an in-progress SER/FITS recording, risking a corrupted file on reconnect.
  • Any camera streaming error other than "removed" silently froze live view
    with no error shown and no way to resume without a full reconnect.
  • AI-created projects/sessions (and Quick Start) reported success even when
    the underlying disk write actually failed.
  • A previously-latent bug in the shared Xcode scheme (buildForArchiving
    left on for the test targets) that made every xcodebuild archive
    attempt fail outright — found while setting up the release process.

v0.3.0

Choose a tag to compare

@giulioroggero giulioroggero released this 14 Aug 17:42

Added

  • Observation Projects — a whole new feature area, built up over many steps:
    • Project/session data model with one-folder-per-project/session filesystem
      persistence (plain JSON, no database).
    • The Projects browser itself: initially a three-column iMovie-style library,
      later replaced with a full-width drill-down page stack (Home → Projects →
      Project → Session
      ), and finally topped with a proper orientation
      Dashboard as Home — resume the last session, common-task shortcuts,
      recent projects, highlighted sessions, an activity chart, and suggestions —
      with the original project grid/table moving one level down as its own
      Projects page.
    • GPS or hand-entered location on both projects and sessions.
    • Free-text + date-range search, later extended with a Filters popover
      (exact tag, observed object, equipment system, date range).
    • Ollama-backed AI session/project planning ("Ask AI to Plan…"), with a
      generous timeout and a qwen3:8b model preference (falling back to
      whatever's actually installed).
    • Quick Start — pick a common target and skip creating a project/session
      by hand; a consolidated Project menu; a project/session breadcrumb in
      the camera view.
    • Session cards, richer session history, and per-kind capture-count stats on
      both the Project and Session pages (later upgraded to a real resizable
      Table, replacing a capped-width grid).
    • Equipment management — named systems (camera/mount/optical tube plus
      optional tracking/imaging/autoguiding/power/eyepiece/smartphone-mount/other
      categories), a curated common-brand catalog, custom items, and
      project/session association with inheritance.
    • Plain-English capture notes ("Captured Saturn in Live Stack as FITS")
      generated automatically for every capture, shown on the timeline.
    • Per-capture action records — every capture now also snapshots the
      object observed, effective location, effective equipment system, and every
      acquisition parameter (gain/exposure/ROI/mode) in effect at that moment.
    • Recall Parameters — reapply a past action's exact camera settings to
      speed up setting up a similar shot again.
    • New Session Like This… — duplicate a session's goal/objects/location/
      equipment into a fresh session, without its captures.
    • Insights page — most-captured objects, most-used equipment, most
      common acquisition mode, a monthly activity chart, and "try this next"
      suggestions, aggregated across every project.
    • Archive projects/sessions, and delete with a 30-day grace period
      (Recently Deleted page, restore or purge immediately).
    • Multi-session AI project planning — "the nicest Messier objects visible
      in August" becomes one session per object in a single plan; the AI asks a
      single clarifying question first if it genuinely needs one (an unclear
      date range, an ambiguous location) instead of guessing.
    • Ask AI to Describe… — a grounded, editable plain-English description
      for a project or session, applied as either its goal (Set as Aim) or a
      dated note (Add as Note).
    • AI panel (renamed from "Assistant") — a chat panel on the right of
      every page, grounded in the current project/session, the connected
      camera, an Insights snapshot, and (new) your own ratings/favorites/top-
      rated past actions. Can propose creating a project/session or changing
      camera settings, always behind an Approve/Reject card. Resizable sidebar
      width, a multi-line compose field, a model picker (also in Settings) that
      lists whatever's actually installed on the configured Ollama server, and
      an editable server URL. Forced detached (never embedded) while a camera
      session is running, returning to the sidebar automatically once you're
      back to browsing if that's where it was before.
    • Ratings (1-5 stars) and favorites for projects, sessions, and
      individual captures — favorites sort to the top of their lists.
    • Equipment systems now persist as files (one JSON file per system,
      under a configurable Equipment folder in Settings) instead of
      UserDefaults, migrating any existing systems automatically the first
      time.
    • "Ideas for Next Time" is AI-computed when Ollama is reachable, falling
      back to the existing catalog-derived list otherwise — never an empty
      state either way.
    • A configurable AI "skill" for suggesting a full next session (name,
      goal, objects, and project — not just an object), shown as a "Suggested
      Session" card on the Dashboard; the standing instructions behind it are
      editable in Settings without touching a prompt in code.
    • Atlas view — a third Projects-page view alongside the thumbnail grid
      and table: every session across every project plotted by its target's
      real sky position (the app's own bundled Messier/bright-star catalog),
      filterable by project/object/date range, with tap-to-open navigation.
    • Save As Project…/Load Project… (File menu) — package/unpack a
      whole project folder (metadata, sessions, captures) as one .zip, for
      sharing a project across users/machines; an imported project always gets
      a fresh identity so it can never collide with one already in the library.
    • "Show All Projects" (Project menu) and a dedicated Equipment menu
      (View/Add New…) in the menu bar.
    • Bulk select on the Projects page (Archive/Delete over a whole selection).
    • Ollama connectivity diagnostics in Settings (Test Connection — checks
      both reachability and which models are actually installed, reporting
      exactly which one would be used).
  • Acquisition Wizard — pick a target (planet, Moon, or curated deep-sky
    object), get its recommended gain/exposure/mode, and save/load setups as
    reusable presets.
  • Smart Live Stack — live, self-curating deep-sky/planetary stacking that
    discards frames below a rolling sharpness threshold.
  • Mesh Drift Correction (Experimental) in the Acquisition Wizard, with a
    triangulated interpolation and a live overlay of each vertex's search window.
  • Per-channel (Red/Green/Blue) histogram and an independent Curves tab,
    in a detachable panel.
  • ZWO gain/offset presets, a live dropped-frame counter, and ST4 pulse
    guiding
    .
  • Exported-files viewer, GPU streak masking, an RGB24 processing pipeline
    (for iPhone/webcam sources), drift reduction, SER video recording, and
    planetary presets, later given telescope-specific exposure scaling.
  • A "Running" status list next to the camera view for active pipelines.
  • In-app Application Log (skyformac → Show Log…, ⌘⇧D) — every connection
    event, error, Quick Start, and Ollama failure, with copy/export.
  • Settings window (⌘,) — the Projects folder location (choose a custom
    folder, takes effect next launch) plus the renderer/Night Mode toggles.
  • README badge row (CI/platform/Swift/license/release), a centered title/link
    header, a full-width hero GIF, and a dedicated EXAMPLES.md catalog.

Changed

  • Made the Projects browser the app's actual main window — the camera view
    only shows once a session is actually running.
  • Widened/reordered the sidebar; split each right-hand tab into common
    controls plus a collapsed Advanced section; reordered the Home grid so Quick
    Start leads and New Project trails every existing project.
  • Full-width Session, Capture, and Project Detail pages (no more Form-capped
    side margins), plus a dedicated Capture detail page for timeline thumbnails.
  • Auto-open the Projects browser on a true first run.
  • The Camera and Sidebar Tab menu-bar menus now only appear while a camera
    session is actually running, instead of always showing (often nonsensical)
    items regardless of what page is open.
  • Removed the Home page's "Settings" tile from Common Tasks — Settings stays
    reachable from the toolbar button and ⌘,.
  • Home page's "Common Tasks" cards (Equipment/Insights/Settings) now share a
    uniform width with New Project/All Projects, instead of each sizing itself
    to its own title/subtitle text length.

Fixed

  • Ollama planning calls failing against a real (non-mocked) server, and
    requests timing out against a slower local reasoning model.
  • Blank frames no longer get written into .ser recordings.
  • Night Mode no longer tints the live image itself, only the surrounding UI.
  • Removed the "SDK x.x.x" connected/disconnected toolbar badge — reported as
    not useful; connection state is already shown contextually elsewhere.
  • Fixed the Insights/Dashboard activity chart showing phantom past-dated ticks
    for months with no real activity (a continuous date axis interpolating gaps
    between real data points; now a categorical month axis).
  • Fixed the Atlas view crashing the app immediately on open — an invalid
    reversed axis range (360...0) that trapped at runtime.
  • Cleared a GitHub Actions Node.js 20 deprecation warning (actions/checkout
    bumped to a Node 24 release).
  • Widened a UI test's timeout after an isolated CI scheduling flake.

v0.2.0 — Acquisition Wizard, per-channel histogram/curves, mesh drift correction

Choose a tag to compare

@giulioroggero giulioroggero released this 12 Aug 13:57

Sky for Mac (skyformac) v0.2.0

The second tagged release. Still a development build — treat it as a preview, not a finished product. This release is almost entirely new capture/imaging workflow on top of v0.1.12's foundation: an Acquisition Wizard, Smart Live Stack, a full per-channel histogram/curves grading pipeline, and an experimental mesh-based drift correction technique, plus a batch of real hang/regression fixes found and fixed along the way.

How to run this build (same as before — read before opening)

The attached .zip is ad-hoc signed, not notarized. macOS will refuse to launch it after downloading — sometimes with the familiar "cannot be opened because the developer cannot be verified" dialog, but on current macOS it can also just silently fail to launch (Console will show OS_REASON_ENDPOINTSECURITY ... denied the process from executing). This is Gatekeeper reacting to the missing Developer ID signature/notarization, not a broken build.

To run it, clear the quarantine flag the browser attaches to anything downloaded from the internet:

xattr -cr /path/to/skyformac.app

(If that alone doesn't do it: xattr -d com.apple.quarantine /path/to/skyformac.app, then try launching again.)

What's new since v0.1.12

Acquisition Wizard — pick a target (Moon, Venus, Mars, Jupiter, Saturn, or a curated deep-sky list: M13/M56/M31/M42/M45/M51/M57/M27/M81/M8) and get a recommended starting setup — mode, ROI, gain, exposure, Reduce Drift/Smart Live Stack/Mesh Drift Correction — applied in one step. Save/Load Preset round-trip a setup to its own JSON file and work standalone too, from the Camera menu or right next to the camera in the sidebar.

Smart Live Stack (Autopilot) — turns Live Stack into a self-curating stack: every incoming frame is scored for sharpness and only folded in if it clears a quality floor (or discarded if Cloud Sentinel flags a cloud interruption), with a live kept/rejected count and an estimated-SNR-gain readout.

Mesh-Based Drift Correction (Experimental) — an alternative to the existing single-star-lock drift reduction: tracks an NxN grid of points across the frame instead of one, triangulating the mesh and blending each triangle's drift with barycentric interpolation (the same primitive real-time rendering rasterizes) into a smooth, spatially-varying correction — covers field rotation and differential drift a single global shift can't. Configurable mesh size, search-window overlap, and reaction sensitivity, with a live preview overlay showing the actual tracked grid and displacement vectors. Marked Experimental deliberately — its per-point measurement is a rougher single-pass estimate than the single-star lock's, and it hasn't been validated on real hardware yet.

Histogram overhaul — a "By Channel" toggle shows separate Red/Green/Blue histograms instead of the combined one, and switches the Black/White Point stretch from one shared pair to three fully independent pairs, for correcting a color imbalance (e.g. a light-polluted sky's orange cast) directly at the stretch stage.

Curves tab — Photoshop-style tone-curve grading next to the histogram: a master RGB curve plus independent Red/Green/Blue curves layered on top of it, applied as a post-stretch pass on both render paths, off by default.

Detachable Histogram/Curves panel — pop both into a separate floating window that can overlap the main one and stay open while working elsewhere.

"Running" status list — every currently-active pipeline (Live Stack, Lucky Imaging, Recording to Disk, SER recording, Planetary Tracking, Polar Alignment, Cloud Sentinel, Focus Assist) gets its own row right next to the camera, whether or not its own tab happens to be showing — with a one-click jump to its controls and a one-click Stop.

Other new capture features: an exported-files viewer (browse/reopen any FITS/PNG/TIFF/JPEG this app has written or exported), GPU satellite/aircraft streak masking for Live Stack, a full RGB24 (webcam/iPhone) pipeline for Live Stack and Lucky Imaging, GPU drift reduction (single-star lock-on alignment) with Pause/Resume, SER video recording, planetary presets (Saturn/Jupiter/Mars/Venus/Moon), ZWO gain/offset presets, a live dropped-frame counter, and ST4 pulse-guide buttons (untested against real guiding hardware).

Real fixes worth knowing about:

  • GPUSharpnessScorer (Smart Live Stack's/Record to Disk's quality gate) had no resolution cap, unlike its CPU sibling — a full-native-resolution Laplacian pass on every incoming frame, which is what actually caused the app to hang when the Moon's Acquisition Wizard preset (full-sensor ROI + Smart Live Stack on by default) was applied and a burst started.
  • Capture ROI always landed at the sensor's top-left corner regardless of the requested center — fixed, with a read-back confirmation showing what the camera actually applied.
  • Small-ROI live view flicker/slowdown, and a live-view regression that had crept back in — both fixed.
  • Live Stack and Lucky Imaging silently did nothing for an iPhone/webcam (RGB24) source — fixed.

Known limitations (dev-mode caveats, mostly unchanged from v0.1.12)

  • Real ZWO hardware testing remains daytime-only. A full overnight/dark-sky session with a real ASI camera is still outstanding — this release's new features (Mesh Drift Correction especially) have not been run against real night-sky conditions.
  • Not notarized, ad-hoc signed only. See "How to run this build" above.
  • No geometric alignment in stacking beyond single-star/mesh drift correction — still no full multi-star registration the way a dedicated stacking tool does.
  • Not a full plate solver. Star recognition/polar alignment use a small hand-curated bright-star catalog and triangle-similarity matching, not a general blind solver — sparse star fields may not resolve.
  • Mesh-Based Drift Correction is genuinely experimental — validated with unit tests and a live preview overlay, not yet against a real tracking-error scenario on real hardware.
  • ST4 guiding is untested against real guiding hardware — no ST4-cabled mount has been available to confirm a pulse produces a real correction end to end.

Requirements

macOS 14+, Apple Silicon recommended for the GPU render path. ZWO ASI camera optional — an iPhone (Continuity Camera) or any webcam works as a capture source without one.

License

GPLv3, with an additional permission (GPLv3 §7) to link against ZWO's proprietary ASI Camera SDK. See LICENSE.md/THIRD_PARTY_NOTICES.md in the repository.

v0.1.12 — first release (dev mode)

Choose a tag to compare

@giulioroggero giulioroggero released this 10 Aug 12:10

Sky for Mac (skyformac) v0.1.12 — first release, still in active development

This is the first tagged release of Sky for Mac, a native SwiftUI/AppKit astrophotography capture app for ZWO ASI cameras, iPhone (Continuity Camera), and other USB webcams. It's still a development build — expect rough edges, and treat it as a preview rather than a finished product. Feedback and issue reports are welcome.

How to run this build (important — read before opening)

The attached .zip is ad-hoc signed, not notarized. macOS will refuse to launch it after downloading — sometimes with the familiar "cannot be opened because the developer cannot be verified" dialog, but on current macOS it can also just silently fail to launch (Console will show OS_REASON_ENDPOINTSECURITY ... denied the process from executing). Either way, this is Gatekeeper reacting to the missing Developer ID signature/notarization, not a broken build.

To run it, clear the quarantine flag the browser attaches to anything downloaded from the internet, from Terminal:

xattr -cr /path/to/skyformac.app

(If that alone doesn't do it: xattr -d com.apple.quarantine /path/to/skyformac.app, then try launching again.) A notarized build is planned but not done yet — see Known Limitations below.

What works

Capture sources

  • ZWO ASI cameras over USB (vendored SDK) — RAW8/RAW16 streaming, full dynamic control set (gain, exposure, offset, cooler, binning, flip, etc.), single long exposures.
  • iPhone via Continuity Camera, or any other USB webcam — including focus lock (fixes autofocus fighting afocal projection) and a frame-stacked "Night Mode" (10s/60s).

Rendering & performance

  • GPU render path (Metal compute shaders) for debayer, stretch, denoise, wavelet sharpening, histogram, and live-stacking, with a CPU fallback. GPU dark/flat calibration.
  • Pinch-to-zoom/pan live preview, a dedicated fullscreen mode with its own zoom slider.

Imaging workflow

  • Dark/flat calibration, live stacking, Lucky Imaging (burst capture + sharpness-ranked stacking), continuous recording with a GPU sharpness gate and disk-space guardrail.
  • Focus assist (Vision star detection + HFD focus tracking with thermal-drift alerts), planetary auto-center/crop, Smart Exposure (read-noise/sky-brightness based sub-exposure recommendation).
  • Star-field recognition against a small bundled catalog, live WCS solving, a Catalog HUD overlay, and two-frame polar alignment.
  • FITS/PNG/TIFF export.

Other

  • All-Sky/rig monitor (secondary webcam/iPhone picture-in-picture feed with cloud/motion alerts).
  • In-app Help with full-text search and a "?" shortcut next to every setting that jumps straight to its explanation.
  • Night mode (red-only UI) for dark adaptation.

Known limitations (dev-mode caveats)

  • Real ZWO hardware testing is partial. The capture pipeline has been exercised against a real ASI camera during the day; a full overnight/dark-sky session is still outstanding.
  • Not notarized, ad-hoc signed only. See "How to run this build" above — Gatekeeper will block it until you clear the quarantine attribute.
  • No geometric alignment in stacking. Live Stack and Lucky Imaging both assume a tracked, stationary mount — there's no star-alignment step, the same honest scoping SharpCap's basic live-stack mode uses.
  • Not a full plate solver. Star recognition/polar alignment use a small hand-curated bright-star catalog and triangle-similarity matching, not a general blind solver like astrometry.net — sparse star fields may not resolve.
  • Two originally-considered AI features (a trained Neural-Engine denoiser, AI super-resolution) were intentionally not built — they'd need a Core ML model this project doesn't have.

Requirements

macOS 14+, Apple Silicon recommended for the GPU render path. ZWO ASI camera optional — an iPhone (Continuity Camera) or any webcam works as a capture source without one.

License

GPLv3, with an additional permission (GPLv3 §7) to link against ZWO's proprietary ASI Camera SDK. See LICENSE.md/THIRD_PARTY_NOTICES.md in the repository.