Changelog

What's new in FITS Blaster.

Beta update channel actually works now — v1.23-beta.5
  • The "Beta updates" preference advertised on the beta page was never actually wired up — every beta build was checking the stable appcast and reporting "you're up to date" by comparing the beta build number against 1.22 (build 168). Beta builds now route Sparkle's feed at the beta channel, so Check for Updates finally tells beta users about new betas.
  • Settings → Interface → Software Updates section with a "Receive beta releases" toggle. Beta builds default the toggle on; stable builds default it off. Available in non-App-Store builds only.
Export path styles, padded text report, smarter header columns — v1.23-beta.4
  • File path style picker for exports — absolute path, relative to the longest folder shared by all exported frames, or filename only. Default is configurable in Settings → Export with a per-export override in the export sheet. Relative mode collapses a single-folder session to bare filenames automatically.
  • Plain text (.txt) export is now a space-padded human-readable report rather than a bare list of file paths. Same columns as CSV/TSV, but every cell is padded so the file lines up cleanly in any text editor — numeric columns right-aligned, text columns left-aligned. Use CSV or TSV for machine-parseable output.
  • CSV/TSV exports left FWHM, eccentricity, SNR, stars, and score blank when a metric was disabled or the user had switched out of compute-everything mode after the first batch. The exporter now falls back to the cached metric values that are preserved for the lifetime of the session.
  • Simple-mode exports (and any session where no frame has any metrics data) now omit the fwhm, eccentricity, snr, stars, and score columns entirely instead of emitting empty cells.
  • FITS header column picker (Settings → Export and the export sheet) dims keys not present in any currently loaded file, so it's clear before exporting which keys will produce data. Selected-but-absent keys are dropped from the output, and the .txt report lists them in a # Skipped columns with no data: … footer so the omission is auditable when re-reading the file later.
  • FITS header column picker is now available for plain text exports too.
FITS header export columns and CSV decimal fix — v1.23-beta.3
  • Configurable FITS header columns in CSV/TSV exports — choose which header keys appear as columns in Settings → Export, or override per-export from the redesigned export sheet.
  • Tab-separated (.tsv) export format alongside CSV.
  • Optional inclusion of rejected frames. Plain text adds # REJECTED suffix; CSV/TSV add a status column.
  • Quality score column in CSV/TSV exports.
  • CSV exports could emit integer FWHM and eccentricity on systems with comma-decimal locales (Dutch, German, French). Numbers now use a fixed POSIX locale.
  • Export sheet pre-populates from Settings → Export defaults; per-export edits show an "applies to this export only" notice.
QuickLook for all FITS, accessibility, 133 tests — v1.23-beta.2
  • QuickLook preview and thumbnail support for floating-point FITS files (BITPIX -32 and -64).
  • QuickLook preview and thumbnail support for 3-channel RGB colour FITS files (NAXIS3=3).
  • Asinh stretch for float FITS previews — compresses bright cores while revealing faint nebulosity.
  • Large-file subsampling for QuickLook previews of 1+ GB stacked integrations.
  • 133 automated tests covering quality scoring, filter grouping, frame metrics, Bayer patterns, histograms, star detection, auto-reject logic, cursor navigation, and GPU paths.
  • Undo-reject and reject now advance cursor to the next visible entry.
  • VoiceOver: inspector toggle, chart buttons, filter strip, and inspector panel are now fully accessible.
  • Settings tabs migrated from deprecated .tabItem() to the Tab API.
  • Filter group header uses cached statistics instead of recomputing on every render.
  • Menu commands extracted into dedicated file.
Sparkle auto-update — v1.22
  • Added Automatic update checking via the Sparkle framework — checks once every 24 hours in the background.
  • Added "Check for Updates..." menu item in the FITS Blaster menu for manual update checks.
  • Added Updates are downloaded, installed, and relaunched automatically — no manual DMG drag required.
  • Improved FAQ updated: internet connection answer now mentions the lightweight update check.
Image viewer controls — v1.21
  • Added Zoom slider (0.25×–4×) with live readout; trackpad pinch-to-zoom also supported.
  • Added Brightness and stretch sliders for real-time display adjustment without re-rendering.
  • Added "Defaults" button to reset all three sliders in one click.
  • Added Yellow viewport-indicator box on the sidebar thumbnail shows which part of the image is currently visible when zoomed in.
  • Improved Scrollbars appear automatically when the image overflows the viewport.
  • Improved Scroll position is preserved when navigating between frames at the same zoom level.
  • Improved Zooming via the slider keeps the viewport centre fixed rather than jumping to the top-left.
  • Improved Zoom level persists across app launches; brightness and stretch reset when opening a new folder.
QuickLook support and Bayer screen-door fix — v1.20
  • QuickLook preview: press Space on any FITS file in Finder to get a rendered preview without opening FITS Blaster. The preview uses the same percentile-clip + square-root stretch as the app.
  • QuickLook thumbnails: Finder icon view now shows rendered FITS images as file icons, in colour for Bayer (e.g. Seestar, Dwarf) files.
  • Screen-door grid pattern in colour (debayer) mode for raw Bayer FITS files. The bayerDebayerAndStretch Metal kernel now applies the same 2×2 Bayer cell alignment as the greyscale path, guaranteeing every output pixel spans at least one complete Bayer cell. Confirmed fixed with images from the Seestar S30, Seestar S30 Pro, Seestar S50, and Dwarf 3.
  • Release builds now produce a universal binary (arm64 + x86_64), so the same DMG runs natively on both Apple Silicon and Intel Macs.
Per-folder streaming colour rendering — v1.19.6
  • Colour rendering now starts per-folder as soon as all entries in a folder are sampled, both during initial load and when switching from grey to colour mode. Previously the entire set had to finish sampling before any rendering began.
  • The Colour progress bar is visible for the entire duration of rendering and no longer flickers in and out between folders.
  • All progress bars (Loaded, Metrics, Sampling, Colour) now stay on screen until the full batch completes, rather than disappearing individually as each pipeline finishes.
  • Progress bar count text no longer clips with 4-digit image counts (1000+ images).
CI updated to Xcode 26 — v1.19.5
  • Release builds now use Xcode 26.3. The @concurrent pipeline annotations introduced in v1.19.2 are now fully effective, ensuring all image loading, stretching, and metrics computation always runs on the cooperative thread pool.
Concurrency revert — v1.19.4
  • Reverted @concurrent pipeline annotations. The attribute causes a ~2× slowdown when compiled with Xcode 16 and is not yet safe to use in CI builds. Restores the throughput of v1.19.1.
Concurrency performance hotfix — v1.19.3
  • Restored full pipeline throughput in the release binary. The SE-0461 concurrency setting added in 1.19.2 was silently ignored by the Xcode 16 compiler, causing metrics computation to serialise on the main thread and producing a ~2× slowdown.
Concurrency performance fix — v1.19.2
  • Restored full parallel pipeline throughput when building with Xcode 26 (Swift 6.2). A Swift 6.2 concurrency change (SE-0461) was causing the image-loading pipeline to run serially on the main thread, producing a ~3× slowdown. All pipeline async functions are now marked @concurrent to guarantee thread-pool execution.
Progress bar and colour rendering fixes — v1.19.1
  • Progress bars are now shown below the main image again, next to the elapsed-time indicator.
  • The selected image now switches to colour immediately when colour rendering begins, rather than waiting for its turn in the batch queue.
  • Release builds are arm64-only, restoring native Apple Silicon performance.
Batch progress bars — v1.19.0
  • Batch progress bars (Loaded, Metrics, Sampling, Colour) appear in the toolbar during image loading, showing live progress for each pipeline phase. Each bar disappears automatically when complete.
  • In Simple mode with a multi-folder session, folder sections now appear in the sidebar (previously only Geek mode showed folder groupings).
Keyboard navigation follows sidebar order — v1.18.1
  • Keyboard navigation (↑/↓/Home/End/Shift+↑/Shift+↓) now steps through entries in the same order they appear in the thumbnail strip. In sessions with multiple filter types (Ha, OIII, SII), pressing ↓ advances within the current filter-group section before moving to the next.
  • In multi-folder mode, keyboard navigation skips entries inside collapsed folder sections so the cursor can no longer land on a hidden thumbnail.
Flag/deflag keys, toolbar & chart improvements — v1.18.0
  • F key — toggle flag/unflag on the current entry or orange range selection (configurable in Settings → Keyboard).
  • D key — deflag all: clears the entire flagged set in one keystroke (configurable).
  • (De)flag toolbar button — toggles the flag state of the current entry or orange range, always visible next to the Cancel button.
  • (De)flag and Deflag All added to the Select menu, separated from range-selection commands by a divider.
  • Session chart brightness sliders in Settings → Display: independently control the opacity of rejected dots and non-flagged dots when a flagged set is active.
  • Tooltips on all toolbar buttons, session chart metric buttons, and sidebar sort button; tooltip delay reduced from ~1.5 s to 0.5 s.
  • Getting Started guide page on the website — full workflow walkthrough, interface overview, key hints, and tips.
  • Keyboard Shortcuts reference page on the website — all default bindings in one place.
  • Top-level navigation bar on all website pages, replacing scattered footer links.
  • Mode toggle button now shows Simple or Geek (the current mode) instead of a blank label, matching the Colour/Grey button convention.
  • Session chart brightness contrast: rejected dots now render at 15 % opacity and non-flagged dots at 50 %, making the three-level hierarchy (rejected → non-flagged → flagged/cursor) clearly readable.
  • Key-binding conflict detection in Settings now correctly separates plain keys from ⌘-modifier keys, preventing false conflicts (e.g. plain D vs ⌘D).
  • File → Open File(s)… menu item removed due to sandbox limitations.
⌘A/⌘D/⌘I operate on range selection — v1.17.1
  • ⌘A, ⌘D, and ⌘I now operate on the orange range selection (consistent with ⇧+click and ⇧+arrow) rather than the flag set.
  • FAQ: ⌘A / ⌘D / ⌘I documented in the Flagged view entry and the keyboard shortcuts entry.
Selection redesign, SO filter group — v1.17.0
  • SO (SII+OIII) dual-narrowband filter group with emerald colour — recognises Askar C2 and similar filters.
  • Selection model fully redesigned: cursor (blue, always one frame) and range selection (orange, built with ⇧+click or ⇧+arrow) are now independent with no side effects between views.
  • ⇧+click and ⇧+arrow build an orange range in any view; ⌘+click adds/removes the range to/from the Flagged view.
  • Reject acts on the orange range if active, otherwise on the cursor. In the Flagged view, rejected frames stay orange for immediate undo.
  • Session chart cursor dot is now white for instant position recognition; rejected frames always shown at 30% opacity.
  • Sidebar thumbnails show a checkmark badge on flagged frames and an orange border on range-selected frames.
  • FAQ: updated session chart and Flagged view entries to reflect the new model; added full filter-group colour table with swatches.
Ask Support link, FAQ improvements — v1.16.3
  • Help menu: new Ask Support item opens the GitHub bug report form directly.
  • FAQ: added "What do the colours and brightness levels in the session chart mean?" explaining filter-group dot colours, dashed median lines, and the spotlight brightness hierarchy.
  • FAQ: corrected "What is the session chart?" — dot colour represents the filter group, not the quality badge.
Session chart spotlight, Auto-Flag fixes — v1.16.2
  • Session chart now dims non-selected frames when a multi-selection is active, creating a three-level brightness hierarchy: rejected (darkest) → non-selected → selected (full brightness). Works for both sidebar selections and chart drag-selections.
  • Auto-Flag sheet: SNR threshold is now enabled by default.
  • Auto-Flag sheet: all threshold labels corrected from "Reject if …" to "Select if …".
  • Cmd+Click in the Flagged view with a multi-selection active (e.g. after Cmd+A) now removes the entire selection at once.
Bug fixes — v1.16.1
  • Website feature list said "drag-to-reject" and "Auto-reject" — corrected to "drag-to-select" and "Auto-select".
  • Folder count badge in the thumbnail sidebar showed the total file count regardless of the active view; it now reflects only entries visible in the current view (All / Flagged / Rejected).
  • Metric buttons above the session chart (Score, FWHM, Ecc, SNR, Stars) did not visually indicate which metric was active; the selected button is now filled (prominent).
  • Cmd+Click in the Flagged view was toggling multi-selection instead of removing the entry from the selection; it now always unflags the clicked entry.
  • Shift-click multi-select did not work at first open until the user clicked the first thumbnail; the shift-click anchor is now seeded when the first image is auto-selected on load.
Include REJECTED, Select All Rejected & more — v1.16.0
  • Include REJECTED folder — checkbox in the Open Folder dialog loads FITS files inside any REJECTED/ subfolder and marks them as rejected automatically. A permanent toggle is in Settings → Files & Folders.
  • Cmd+R — Select All Rejected — selects all rejected frames in one keystroke. Configurable in Settings → Keyboard.
  • Sort by Rejected — new option in the thumbnail sort picker; rejected entries sort to the bottom (ascending) or top (descending).
  • Ko-fi link added to the About FITS Blaster panel.
  • "How Scores Work" page added to the website, explaining background estimation, star detection, shape measurement, the composite score formula, and badge-colour logic.
  • Reset now always switches back to "All frames" mode.
  • Cmd+click in "Flagged" mode with an active multi-selection now toggles the clicked entry instead of unflagging everything.
  • Shift+click range selection now works from the very first open.
  • Session chart now enlarges dots for all multi-selected thumbnails.
  • Undo reject correctly moves files back to their pre-rejection folder when loaded via "Include REJECTED".
  • Cmd+A (Select All) and other command-key shortcuts now work reliably across all keyboard layouts.
Bug fixes & polish — v1.15.1
  • Opening a folder no longer causes a spinning beach ball when files are stored on iCloud Drive or a slow mount. The BITPIX pre-flight check now runs on a background thread instead of the main thread.
  • Help menu "FITS Blaster Help" now opens the online FAQ directly.
  • FAQ updated: corrected references to Auto-Flag, removed outdated subscription mentions.
Switch to donationware — v1.15
  • Subscription, paywall, and 50-frame free-tier limit — FITS Blaster is now free with no restrictions. If you find it useful, buy me a coffee.
  • Sandbox permission error when rejecting files: folder access is now re-established automatically when the stored bookmark is missing or stale, with a clear error message if access cannot be recovered.
Flagged view & selection overhaul — v1.14
  • Flagged view — a sidebar filter showing only flagged frames. Add frames via ⌘+click, ⇧+click, chart drag-select, or Auto-Flag; remove them with ⌘+click inside the view.
  • Flag-then-inspect workflow — chart drag-select and Auto-Flag now add frames to the Flagged view for inspection before rejection, rather than rejecting immediately.
  • Select menu — top-level menu with Select All, Deselect All, and Invert Selection (defaults: ⌘A / ⌘D / ⌘I), all configurable in Settings.
  • Shift+↑/↓ extend selection — grows the multi-selection one step at a time.
  • Drag tooltip — while drag-selecting in the session chart, a floating label shows the metric value of the frame under the cursor.
  • Arrow-key navigation now stops at the boundary of the visible set rather than crossing into hidden frames.
  • Session chart has breathing room before the first dot, making drag-select from frame 1 easier.
Pipeline fix + toolbar buttons — v1.12.5
  • Geek-mode load time regression (100 s → 62 s on M1 Air, 592 images): GPU star-detection moved back to Phase B, keeping Phase A as I/O + GPU stretch only.
  • Phase B semaphore raised from 2 to 6 on M1 Air, restoring throughput to match v1.12.3.
  • Colour/Grey toggle button and Cancel button added to the toolbar.
Phase A/B pipeline decoupling — v1.12.4
  • Loading pipeline decouples I/O from metrics: Phase A (FITS I/O + GPU stretch) displays each image immediately; Phase B (Moffat fitting) runs concurrently in detached tasks.
  • Phase A concurrency raised to max(8, cpuCount) — keeps the SSD pipeline fuller since slots are no longer held by CPU-bound metrics work.
  • Peak memory reduced: the ~100 MB Metal buffer per image is released after crop extraction rather than being held for the full Phase A+B duration.
GPU downscale + parallel Moffat fitting — v1.12.3
  • Metal stretch kernels now downsample directly to display size in a single GPU pass using a box filter — Grey+Simple load time: 53 s → 28 s; Colour+Simple: 168 s → 82 s.
  • Moffat star fitting now uses a 4-wide inner task group, reducing Geek-mode Phase B time.
  • Cancel button in the info bar to abort an in-progress load.
Window commands, chart sorting & thumbnail metric — v1.12.2
  • File menu: Main Window (⌘N) — focuses the existing window or opens a new one.
  • Window menu: Close Window (⌘W) — explicit menu item alongside the built-in shortcut.
  • Thumbnail cells now show the active chart metric value (e.g. "FWHM 4.2") in Geek mode.
  • Session chart follows the sidebar sort order — drag-to-reject selects contiguous worst/best frames when sorted by a metric.
Rename to FITS Blaster — v1.11.6
  • App renamed from "Claude FITS Viewer" to FITS Blaster.
  • Reverted erroneous FWHM scale factor for Bayer images; values now agree with PixInsight within ±10% for both narrowband and OSC images.
Session chart layout fixes — v1.11.5
  • Folder pills now wrap instead of overflowing when many folders are loaded.
  • Empty space to the right of the chart removed — median lines no longer reserve a right-side margin.
  • X axis no longer rounds up — domain is constrained to exactly the number of loaded frames.
Fix duplicate entries and subfolder name collisions — v1.11.4
  • Opening the same folder twice no longer adds duplicate frames.
  • An alert is shown if an already-loaded folder is opened again.
  • Two root folders containing a subfolder with the same name are now tracked separately and shown as distinct sections.
Fix keyboard shortcuts after sidebar click — v1.11.3
  • Navigation and action keys now work regardless of which subview has keyboard focus. Replaced onKeyPress with an NSEvent local monitor.
Colour toggle UX improvements — v1.11.2
  • Toggling back to grey after an initial grey→colour cycle is now instant — the greyscale render is cached on first load.
  • "Rendering colour…" status now appears immediately when the toggle is pressed.
GPU Bayer debayering + resizable session chart — v1.11
  • GPU Bayer debayering — colour FITS images can now be displayed in colour using a Metal compute shader with per-channel percentile stretch. Toggle in Settings → Image Display.
  • Per-folder colour normalisation — images load as greyscale first, then re-render in colour with consistent per-subfolder stretch after the batch completes.
  • Resizable session chart — drag handle replaces the fixed split; chart height is remembered across launches.
  • Dynamic y-axis — chart y-axis starts near the data minimum rather than at zero.
Settings reorganisation + key conflict detection — v1.10
  • Key conflict detection: assigning a key already in use beeps and keeps the recorder open.
  • Settings tabs reorganised: Keys → User Interface; Images → Files & Folders.
Text size control + recursive subfolder support — v1.9
  • Text Size picker in Settings → User Interface: seven steps from xSmall to xxxLarge, matching macOS System Settings style.
  • Include files from subfolders — opening a folder can now recursively scan subdirectories for FITS files (off by default).
  • Excluded folder names — default exclusions: FLAT, DARK, BIAS, CALIB. REJECTED is always skipped.
  • Collapsible folder sections in the thumbnail sidebar.
  • Folder filter pills in the session chart to show only frames from selected folders.
Performance overhaul, multi-select & quality badges — v1.0–v1.8
  • Simple / Geek mode — Simple mode shows a stripped-down UI with no metrics; Geek mode restores cached metrics instantly without re-reading files.
  • Quality badges — colour-coded (red / amber / green / grey) with SF Symbol icon overlays indicating trailing, focus failure, or low star count.
  • Auto-Flag sheet — configurable thresholds for FWHM, eccentricity, SNR, and score; live preview count before applying.
  • Multi-select thumbnails — ⌘+click, ⇧+click, and batch reject/undo.
  • Remove from list (R) — removes frames without touching files on disk.
  • SNR threshold in Auto-Flag panel.
  • Filename shown above the main image for clarity when multiple thumbnails are selected.
  • Session chart — scrollable dot chart of any quality metric across the session, with tap-to-select.
  • Filter-group sidebar — thumbnails grouped by filter (Ha, OIII, SII, RGB, etc.).
  • Window and dock-icon drag & drop for FITS files and folders.
  • No wrap-around at list boundaries — pressing next on the last image beeps and stays.
  • Single-key reject/undo toggle option in Settings.
  • Space bar assignable as a key binding.
  • Star count accuracy: fixed inflated counts (~27×, ~3×) and undercounted results (~38%) through NMS tuning and pre-filter threshold adjustments.
  • Background task priority set to .utility for better UI responsiveness during large loads.
  • groupStatistics converted to a stored property updated only at batch boundaries, eliminating O(n²) render churn.
  • GPU path used for Simple→Geek recompute (matches initial load speed).
Initial release
  • Full FITS file viewer for macOS 15.7+, written in Swift 6.2 / SwiftUI.
  • GPU-accelerated image stretching via Metal; CPU fallback using Accelerate.
  • Star quality metrics: FWHM, eccentricity, SNR, composite score 0–100.
  • Rejection workflow: moves files to a REJECTED/ subdirectory; undo restores them.
  • Inspector with per-frame metrics, histogram, and FITS header table.
  • Configurable keyboard shortcuts, export to plain text or CSV.