Tile-Compile is a toolkit for tile-based quality reconstruction of astronomical image stacks (methodology v3.3).
We present a novel methodology for the reconstruction of high-quality astronomical images from short-exposure deep-sky datasets. Conventional stacking methods often rely on binary frame selection ("lucky imaging"), which discards significant portions of collected frames. Our approach, Tile-Based Quality Reconstruction (TBQR), replaces rigid frame selection with a robust spatio-temporal quality model. By decomposing frames into local tiles and modeling quality along two orthogonal axes—global atmospheric transparency/noise and local structural sharpness—we reconstruct a signal that is physically and statistically optimal at every pixel. We demonstrate that this method preserves the full photometric depth of the dataset while achieving superior resolution improvement compared to traditional reference stacks.
While the methodology was originally conceived to address the specific challenges of short-exposure data from modern smart telescopes (e.g., Dwarf, Seestar), its architectural flexibility makes it equally potent for conventional astronomical setups. The extensive set of tunable parameters—ranging from adaptive tile sizing and cross-correlation thresholds to sophisticated clustering logic—allows the pipeline to be meticulously optimized for a wide array of optical systems and atmospheric conditions.
Practical note: The pipeline is primarily optimized for datasets with many usable frames. With very small frame counts, or with strongly mixed frame quality in one stack, visible tile patterns can occur in difficult cases. This can often be mitigated by testing different configuration settings (especially registration, tile, and reconstruction-related parameters). See the example profiles in
tile_compile_cpp/examples/andtile_compile_cpp/examples/README.md.
Note: This is experimental software primarily developed for processing images from smart telescopes (e.g., DWARF, Seestar, ZWO SeeStar, etc.). While designed for general astronomical image processing, it has been optimized for the specific characteristics and challenges of smart telescope data.
- Normative methodology: Tile-Based Quality Reconstruction Methodology v3.3.9
- Methodology paper PDF v3.3.6: paper-tile_based_quality_reconstruction_methodology_v_3.3.6_en.pdf
- Implementation process flow: Process flow (English)
- English step-by-step guide: Step-by-Step Guide
- GUI2 packaging and launch notes: GUI2 README
- German README snapshot: German README
- Data flow (user-friendly): Process Flow - How the System Works
- Full documentation site: https://jeamy.github.io/tile_compile/
- Raw Stack GUI guide (English): docs/raw_stack_gui_en.md
- M31 lights source for the paper example run (10 GB): M31 lights
- M31 run source for the paper example run (20 GB): M31 run
Given a directory of FITS lights, the pipeline can:
- optionally calibrate lights (bias/dark/flat)
- register frames using a robust fallback cascade
- compute global and local (tile) quality metrics
- reconstruct the image via tile-weighted overlap-add
- optionally cluster frame states and build synthetic frames
- stack using sigma-clip or weighted averaging
- debayer OSC/CFA data
- run astrometry (WCS)
- run optional background gradient extraction (BGE, pre-PCC)
- run photometric color calibration (PCC)
- write final outputs and detailed diagnostic artifacts
| Component | Directory | Status | Stack |
|---|---|---|---|
| Core pipeline | tile_compile_cpp/ |
Active | C++17 + Eigen + OpenCV + cfitsio + yaml-cpp |
| GUI2 backend | web_backend_cpp/ |
Active | Crow + C++17 |
| GUI2 frontend | web_frontend/ |
Active | HTML + CSS + JavaScript |
In practical use, the overall workflow is intentionally simple: after you provide the input data and a manageable set of configuration parameters, the pipeline processes the dataset automatically from stacking through astrometry, optional background handling, and PCC to the final result. No complicated manual intermediate steps are required for a normal run. At the same time, the system remains fully configurable in depth, so every stage can still be tuned in fine detail whenever you need tighter control over registration, tiling, reconstruction, stacking, or post-processing behavior.
| ID | Phase | Description |
|---|---|---|
| 0 | SCAN_INPUT | Input discovery, mode detection, linearity check, disk-space precheck |
| 1 | REGISTRATION | Cascaded global registration |
| 2 | PREWARP | Full-frame canvas prewarp (CFA-safe for OSC) |
| 3 | CHANNEL_SPLIT | Metadata phase (channel model) |
| 4 | NORMALIZATION | Linear background-based normalization |
| 5 | GLOBAL_METRICS | Global frame metrics and weights |
| 6 | TILE_GRID | Adaptive tile geometry |
| 7 | COMMON_OVERLAP | Common valid-data overlap (global/tile-local masks) |
| 8 | LOCAL_METRICS | Local tile metrics and local weights |
| 9 | TILE_RECONSTRUCTION | Weighted overlap-add reconstruction |
| 10 | STATE_CLUSTERING | Optional state clustering |
| 11 | SYNTHETIC_FRAMES | Optional synthetic frame generation |
| 12 | STACKING | Final linear stacking |
| 13 | DEBAYER | OSC demosaic to RGB (MONO pass-through) |
| 14 | ASTROMETRY | Plate solving / WCS |
| 15 | BGE | Optional RGB background gradient extraction before PCC |
| 16 | PCC | Photometric color calibration |
| 17 | HYPERMETRIC_STRETCH | Optional VeraLux HyperMetric Stretch after PCC |
| 18 | DONE | Final status (ok or validation_failed) |
Detailed phase docs: docs/process_flow/
| Stage | Method | Typical use case |
|---|---|---|
| 1 | Primary engine (triangle_star_matching) |
Normal star-rich frames |
| 2 | Trail endpoint registration | Star trails / rotation-heavy data |
| 3 | AKAZE feature matching | General feature fallback |
| 4 | Robust phase+ECC | Clouds/nebulosity with larger transforms |
| 5 | Hybrid phase+ECC | Weak star matching cases |
| 6 | Identity fallback | Last resort (CC=0, frame retained) |
- Main config file:
tile_compile.yaml - Schemas:
tile_compile.schema.json,tile_compile.schema.yaml - Reference document: Configuration Reference
- Practical examples: Configuration Examples & Best Practices
Complete standalone example configs are available under tile_compile_cpp/examples/.
The filenames no longer use the old tile_compile. prefix.
full_mode.example.yamlreduced_mode.example.yamlemergency_mode.example.yamlsmart_telescope_dwarf_seestar.example.yamlsmart_telescope_very_bright_star.example.yamlcanon_low_n_high_quality.example.yamlvery_bright_star_anti_seam.example.yamlcanon_equatorial_balanced.example.yamlmono_full_mode.example.yamlmono_small_n_anti_grid.example.yaml(recommended for MONO low-frame datasets, e.g. ~10..40, to reduce tile-pattern risk)mono_small_n_ultra_conservative.example.yaml(recommended for very small MONO datasets, e.g. ~8..25, when seam stability matters more than aggressive enhancement)
See also: Examples README for the intended use case and tuning focus of each profile.
Pre-built GUI2 release bundles are published via GitHub Releases.
Each bundle contains:
- GUI2 frontend (
web_frontend/) - Crow backend (
web_backend_cpp/) - native C++ tools (
tile_compile_runner,tile_compile_cli,tile_compile_web_backend) - launchers for Linux, macOS, and Windows
At runtime, GUI2 uses the local Crow/C++ backend as the process adapter for the C++ runner/CLI.
Development start from repository root:
./start_backend.shThen open:
http://127.0.0.1:8080/ui/
Release bundle start:
- Linux:
start_gui2.sh - macOS:
start_gui2.command - Windows:
start_gui2.bat
The launcher copies the bundled payload into a per-user install directory, starts the Crow backend in the foreground, and opens the browser to the local GUI2 URL.
Installation and update behavior:
- On first start, the launcher copies all application files to
~/tilecompile/(Linux/macOS) or%USERPROFILE%\tilecompile\(Windows). - After the first successful start, you can safely delete the downloaded package archive and extracted folder—all data has been copied to your user directory.
- On updates, only the application files (
web_frontend/,web_backend_cpp/,tile_compile_cpp/) are replaced. Your user data (configurations, runs, ASTAP catalog, PCC database) remains untouched.
macOS install note:
- On macOS 15.x (including Sequoia 15.1), Gatekeeper may no longer offer the older right-click override path for unknown developers. If
start_gui2.commandor other scripts are blocked, openSystem Settings -> Privacy & Security, scroll to the bottom, and explicitly allow the blockedstart_gui2.commandthere before starting it again.
Minimum OS versions for the current GUI2 release bundles:
- Linux: x86_64 Linux with
glibc >= 2.35(Ubuntu 22.04 or equivalent is the safe baseline for the current CI-built ZIPs) - macOS: macOS 15
- Windows: Windows 10 x64 or newer
Notes:
- macOS support is currently intended from version 13 upward. It is not restricted to macOS 15+, but macOS 12 and older are not the documented release baseline.
- Linux bundles do not bundle
glibc, so older distributions than the current build baseline are not guaranteed to work.
For a full beginner-friendly walkthrough, see: Step-by-Step Guide
- CMake >= 3.21
- C++17 compiler (GCC 11+ or Clang 14+)
- OpenCV >= 4.5
- Eigen3
- cfitsio
- yaml-cpp
- nlohmann-json
The pipeline supports two GPU backends:
NVIDIA CUDA (opencv_cuda):
- Requires OpenCV CUDA modules:
opencv2/core/cuda.hppopencv2/cudawarping.hppopencv2/cudaarithm.hpp
- At runtime, a CUDA-capable NVIDIA GPU and working CUDA/OpenCV runtime are required.
TILE_COMPILE_ENABLE_CUDAonly enables the CUDA hook/build gate.
AMD/Intel/NVIDIA OpenCL (opencv_opencl):
- Requires OpenCV OpenCL module:
opencv2/core/ocl.hpp
- At runtime, an OpenCL-capable GPU (AMD, Intel, NVIDIA) and working OpenCL runtime are required.
- Works with AMD Radeon (Polaris/Vega/RDNA), Intel integrated GPUs, and NVIDIA GPUs.
- Generally easier to set up than CUDA on non-NVIDIA hardware.
Auto-selection:
acceleration_backend: auto(default) automatically detects available GPU backends at runtime.- Priority order: CUDA → OpenCL → CPU
- Falls back gracefully to CPU if no GPU backend is available.
Notes:
- Many default distro/Homebrew/OpenCV packages provide CPU-only builds. GPU acceleration requires OpenCV built with CUDA or OpenCL support.
- For NVIDIA GPUs: CUDA backend typically provides better performance than OpenCL.
- For AMD/Intel GPUs: OpenCL is the only supported GPU backend.
- On macOS: OpenCL support depends on OpenCV build; CUDA is not practical.
Linux (Ubuntu/Debian):
sudo apt-get update
sudo apt-get install -y \
build-essential cmake pkg-config \
libeigen3-dev libopencv-dev libcfitsio-dev libyaml-cpp-dev nlohmann-json3-dev libssl-dev \
libcurl4-openssl-devLinux (Fedora):
sudo dnf install -y \
gcc-c++ cmake pkgconf-pkg-config ninja-build \
eigen3-devel opencv-devel cfitsio-devel yaml-cpp-devel nlohmann-json-devel openssl-devel \
libcurl-develmacOS (Homebrew, core libs):
xcode-select --install
brew install cmake ninja pkg-config eigen cfitsio yaml-cpp nlohmann-json openssl curl
brew install opencvNotes:
ninjais required for the local GUI2 packaging scripts.- On macOS 12, the default Homebrew
opencvformula is currently not supported. The Homebrew-based path therefore effectively requires macOS 15 for OpenCV, unless you provide a separate working OpenCV installation yourself. - The package examples above are sufficient for CPU builds. They do not guarantee GPU acceleration, because the OpenCV package on the host may not include CUDA modules.
- If a downloaded GUI2/release bundle is blocked by Gatekeeper with messages such as “developer cannot be identified” or a bundled
.dylibcannot be opened, remove the quarantine flag from the extracted release folder withxattr -dr com.apple.quarantine /path/to/extracted_releaseand then start the bundle again.
Windows:
- MinGW/MSYS2:
mingw-w64-x86_64-eigen3,mingw-w64-x86_64-opencv,mingw-w64-x86_64-cfitsio,mingw-w64-x86_64-yaml-cpp,mingw-w64-x86_64-nlohmann-json,mingw-w64-x86_64-openssl,mingw-w64-x86_64-curl,mingw-w64-x86_64-pkgconf - MSVC/vcpkg:
eigen3,opencv,cfitsio,yaml-cpp,nlohmann-json,openssl,curl,pkgconf
cd tile_compile_cpp
mkdir -p build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build . -j$(nproc)GUI2 release bundles are built by:
.github/workflows/release-tile-compile-gui2.yml
The workflow builds the Qt-free C++ binaries, bundles web_backend_cpp/ and web_frontend/, adds the GUI2 launchers, and creates ZIP artifacts for Linux, Windows, macOS Apple Silicon, and macOS Intel.
Not included by design:
- external Siril catalog data
- external ASTAP binary/data
A helper script is available at:
tile_compile_cpp/scripts/docker_compile_and_run.sh
What it does:
build-image: builds a Docker image and compilestile_compile_cppinside the containerrun-shell: starts an interactive shell in the compiled containerrun-app: runstile_compile_runnerdirectly in the container
Default runs volume mapping:
- Host:
tile_compile_cpp/runs - Container:
/workspace/tile_compile_cpp/runs
Examples:
# build Docker image and compile inside container
./tile_compile_cpp/scripts/docker_compile_and_run.sh build-image
# open interactive shell inside container
./tile_compile_cpp/scripts/docker_compile_and_run.sh run-shell
# run pipeline in container
./tile_compile_cpp/scripts/docker_compile_and_run.sh run-app -- run \
--config /mnt/config/tile_compile.yaml \
--input-dir /mnt/input \
--runs-dir /workspace/tile_compile_cpp/runsUse run-shell if you need additional mounts (e.g., config/input directories) and then start the runner manually.
Use a Linux shell (WSL2 Ubuntu) to run the helper script:
bash scripts/docker_compile_and_run.sh build-image
bash scripts/docker_compile_and_run.sh run-app -- run --config /mnt/config/tile_compile.yaml --input-dir /mnt/input --runs-dir /workspace/tile_compile_cpp/runs./tile_compile_runner \
run \
--config ../tile_compile.yaml \
--input-dir /path/to/lights \
--runs-dir /path/to/runsCommon options:
--max-frames <n>limit frames (0= no limit)--max-tiles <n>limit tile count for Phase 5/6 (0= no limit)--dry-runexecute validation flow without full processing--run-id <id>custom run id for grouping--stdinwith--config -to read YAML from stdin
Resume mode:
./tile_compile_runner resume \
--run-dir /path/to/runs/<run_id> \
--from-phase BGESupported resume phases (any phase from 0..17):
- Early:
SCAN_INPUT,CHANNEL_SPLIT,NORMALIZATION,GLOBAL_METRICS,TILE_GRID - Mid:
REGISTRATION,PREWARP,COMMON_OVERLAP,LOCAL_METRICS,TILE_RECONSTRUCTION - Late:
STATE_CLUSTERING,SYNTHETIC_FRAMES,STACKING,DEBAYER,ASTROMETRY,BGE,PCC,HYPERMETRIC_STRETCH
Common resume points: ASTROMETRY (re-solve), BGE (re-extract background), PCC (re-calibrate color), HYPERMETRIC_STRETCH (rerun final VeraLux stretch), STACKING (re-stack from synthetic frames).
./tile_compile_cli scan /path/to/lights --frames-min 30# Config handling
./tile_compile_cli get-schema # Print JSON schema
./tile_compile_cli dump-default-config # Print default config as JSON
./tile_compile_cli load-config <path> # Load and display config YAML
./tile_compile_cli save-config <path> [--stdin] # Save config YAML
./tile_compile_cli validate-config (--path P | --yaml Y | --stdin)
# Run inspection
./tile_compile_cli list-runs /path/to/runs
./tile_compile_cli get-run-status /path/to/runs/<run_id>
./tile_compile_cli get-run-logs /path/to/runs/<run_id> [--tail N]
./tile_compile_cli list-artifacts /path/to/runs/<run_id>
# Input scanning
./tile_compile_cli scan /path/to/lights [--frames-min N]
# FITS analysis
./tile_compile_cli fits-stats /path/to/image.fits
# Photometric color calibration (PCC)
./tile_compile_cli pcc-run <in.fits> <out.fits> --wcs <wcs.fits> [--source vizier|siril]
./tile_compile_cli pcc-apply <in.fits> <out.fits> [--r X] [--g Y] [--b Z]
# GUI state (for external tool integration)
./tile_compile_cli load-gui-state [--path <file>]
./tile_compile_cli save-gui-state [--path <file>] [--stdin | <JSON>]The recommended UI path is the web-based GUI2:
- backend:
web_backend_cpp/ - frontend:
web_frontend/ - orchestration: Crow backend ->
tile_compile_cli/tile_compile_runner
Development start:
./start_backend.shOpen http://127.0.0.1:8080/ui/.
After a successful run (runs/<run_id>/):
outputs/stacked.fitsreconstructed_L.fitstacked_rgb.fits(OSC)stacked_rgb_solve.fits/ WCS artifactsstacked_rgb_bge.fits(BGE-only snapshot before PCC)stacked_rgb_pcc.fitsstacked_rgb_hms.fits(optional VeraLux HyperMetric Stretch output)synthetic_*.fit(mode-dependent)
artifacts/normalization.jsonglobal_metrics.jsontile_grid.jsonglobal_registration.jsonlocal_metrics.jsontile_reconstruction.jsonstate_clustering.jsonsynthetic_frames.jsonbge.jsonvalidation.jsonreport.html,report.css,*.png
logs/run_events.jsonlconfig.yaml(run snapshot)
For optional color calibration and astrometric solving, the pipeline can use external data/tools:
- Siril Gaia DR3 XP sampled catalog (for PCC)
- Can be reused if already downloaded by Siril.
- Typical local path:
~/.local/share/siril/siril_cat1_healpix8_xpsamp/ - Upstream source (catalog release):
https://zenodo.org/records/14738271
- ASTAP (for astrometry / WCS plate solving)
- Requires ASTAP plus a star database (e.g., D50 for deep-sky use).
- Official site/downloads:
https://www.hnsky.org/astap.htm
If these resources are not installed, core reconstruction still works, but ASTROMETRY/PCC phases may be skipped or fail depending on configuration.
Generate an HTML quality report from a finished run either via GUI2 or directly through the CLI:
./tile_compile_cli generate-report runs/<run_id>Output:
runs/<run_id>/artifacts/report.htmlruns/<run_id>/artifacts/report.cssruns/<run_id>/artifacts/*.png
The report aggregates data from artifact JSON files, logs/run_events.jsonl, and config.yaml, including:
- normalization/background trends
- global quality distributions and weights
- registration drift/CC/rotation diagnostics
- tile and reconstruction heatmaps
- clustering/synthetic frame summaries
- BGE diagnostics (grid cells, residuals, channel shifts)
- validation metrics (including tile-pattern indicators)
- pipeline timeline and frame-usage funnel
- Master frames (
bias_master,dark_master,flat_master) can be used directly - Directory-based masters (
bias_dir,darks_dir,flats_dir) can be built automatically - When
use_bias: trueanduse_dark: true, raw darks are bias-corrected internally unlessdark_already_bias_corrected: trueis set dark_auto_select: truematches darks by exposure time (±5%)
tile_compile/
├── web_frontend/ # GUI2 HTML/CSS/JS frontend
├── web_backend_cpp/ # GUI2 Crow/C++ backend
├── tile_compile_cpp/
│ ├── apps/ # runner/cli entry points
│ ├── include/tile_compile/
│ ├── src/
│ ├── examples/ # example configs
│ ├── scripts/ # helper scripts
│ ├── tests/
│ ├── tile_compile.yaml
│ ├── tile_compile.schema.json
│ └── tile_compile.schema.yaml
├── packaging/gui2/ # GUI2 release launchers/bundle helpers
├── docker/ # Docker build/runtime images
├── docs/
│ ├── v3/ # methodology docs
│ └── process_flow/ # implementation process-flow docs
├── start_backend.sh # dev start for Crow backend + GUI2
├── start_gui2_docker.sh # run GUI2 in Docker
├── README.md
└── README_de.md
cd tile_compile_cpp/build
ctest --output-on-failureThis project was built with assistance from Windsurf, Kiro, Antigravity, GPT 5.,Claude 4. Sonnet, Codex, ***. Babysitting by a human in a virtual environment.
The HyperMetric Stretch (HMS) phase is derived from the VeraLux HyperMetric Stretch Siril script:
- (c) 2025 Riccardo Paterniti
- VeraLux - HyperMetric Stretch
- SPDX-License-Identifier: GPL-3.0-or-later
- Version 1.5.2
- Inspired by the "True Color" methodology of Dr. Roger N. Clark
- Math basis: Inverse Hyperbolic Stretch (IHS) and Vector Color Preservation
- Sensor science: hardware-specific Quantum Efficiency weighting
- Calibration Bug fixes
Raw Stack preprocessing pipeline:
- New standalone Raw Stack UI: preprocessing from FITS light frames to final stacked image, separate from the Tile-Compile run studio.
- Pipeline covers: Calibration, CFA/Mono Prep, Registration, Quality Filtering, Stacking, Astrometry, BGE, PCC, HyperMetric Stretch.
- All parameters (sigma-clip, rejection, weighting, BGE, PCC, Astrometry, HMS) are taken from the Parameter Studio config — nothing is hardcoded.
- See docs/raw_stack_gui_en.md for GUI documentation.
-- HMS Bug fixes
implementationHMS:
- Added VeraLux HyperMetric Stretch (HMS) as a post-PCC pipeline phase.
Build hardening & Frontend cleanup:
- Hardened web_backend_cpp build with CUDA 13 + OpenCV 4.11 CUDA 13 configuration
- Frontend refactoring: centralized utilities in
src/utils.js(escapeHtml, getMessage, getStorageJson, humanizeControlId, etc.) - Migrated shell.js, parameter-studio-page.js, and tooltips.js to ES6 modules with shared utils.js imports
- Removed dead code
- v0.2.5 combines the documentation-system refresh with a BGE robustness update for difficult chromatic gradients such as IC434. BGE sample-estimator selection is now exposed in YAML, schema validation, and Parameter Studio, while autotune can compare robust estimators and reject degenerate flat background models when significant background or chroma spread remains.
- Professional documentation system with MkDocs Material + Doxygen
- Installation instructions for pre-built binaries (Ubuntu, Fedora, Arch)
- Configurable BGE sample estimators:
quantile,sigma_clipped_median,sextractor_mode, andbiweight - BGE autotune now sweeps sample estimators and applies chroma/background-spread guards for flat or imbalanced correction surfaces
- Reconstruction fallback path hardened: safer shape/weight validation, corrected OLA memory budgeting, tile-local temporary buffers, and removal of ineffective scheduler/config dead code
- Registration performance: anchor-promotion rounds now reuse the parallel worker pool and only retry unresolved frames whose nearest anchor changed after promotion, instead of running repeated full-frame single-threaded passes. Added
reg_promotion_retry_framesdiagnostics.
- More robust registration: deep-chain outlier rejection (reject long chains with low CC), doubled anchor density for large-N sessions, "hopping" sequential rescue that searches past weak neighbors for better anchors, and ASTAP plate-solving as fallback even for model-interpolated frames.
- Hot/dead-pixel correction fixed (
cosmetic_correction_cfa): defective pixels inside star regions were not corrected becauseneighbor_thresholdwas set too low — star-halo pixels were incorrectly counted as "hot neighbours" and suppressed the correction. The threshold is now aligned with the full global hot-pixel threshold. Additionally: pixels exceeding 5× the local floor are now replaced unconditionally (extreme_outlierbypass). Dead/cold-pixel detection added. Works without dark frames.
- Registration phase: NCC computation made more robust against background subtraction and hot pixels (clamp + Gaussian blur before NCC); the near-identity bypass condition strengthened with an
ncc_identity > 0.7guard to prevent false acceptance for frames far from the reference.
- Registration for long Alt/Az sessions was expanded substantially: N-scaled multi-anchor reference selection, N-scaled anchor promotion, astrometric registration/rescue for weak or unresolved frames, plus new practical example configs and refreshed process documentation for difficult rotation/seeing cases.
- TILE_RECONSTRUCTION performance: replaced the memory-driven worker reduction (3 workers instead of 8) with frame sub-batching. Workers now always run at the configured
parallel_workerscount; the memory budget controls how many frames are processed per batch instead of how many threads are active. Expected speedup: ~2.7× for OSC runs with 600+ frames on a 2 GB memory budget.
- Calibration/UI follow-up: dark+bias calibration now handles raw darks without double bias subtraction,
dark_already_bias_correctedwas propagated through backend, schema, example YAMLs, and Parameter Studio, and the Parameter Studio now shows one consolidated section per selected category instead of a split double view.
- Added
registration.auto_engine(default:true): automatically detects strong field rotation from a small frame probe before registration and overrides the engine totriangle_star_matching+transform_model: affinewhen a rotation-blind engine (robust_phase_ecc,hybrid_phase_ecc) is configured for an Alt/Az dataset. The override threshold is controlled byauto_engine_rotation_threshold_deg(default:0.05°/frame).
- Stabilized tile reconstruction after the recent performance optimization rollout, with follow-up fixes and analysis focused on visible tile-seam artifacts in the final reconstruction output.
- Fixed the late PCC/output path semantics:
stacked_rgb.fitsremains the stacking output, successfulBGE/PCCsnapshots stay separated asstacked_rgb_bge.fits/stacked_rgb_pcc.fits, andoutput_stretchnow uses only a pure linear0..max -> 0..65535scaling with obsolete nonlinear/quantile stretch code removed.
- Stabilized the late RGB/PCC output path after the
v3.3.9rollout: visible RGB stretching now preserves chroma instead of amplifying weak background channel offsets, PCC background neutralization gained the newalways|auto|offcontrol with a nebulosity-aware auto guard, and the new parameter was propagated through schema, docs, and all example configs.
- Promoted the
v3.3.9methodology into the active reference state across code, frontend, and documentation: the linear reconstruction core, BGE/PCC semantics, Parameter Studio visibility, and process-flow docs now align to the same runtime baseline; backend startup handling was hardened as well.
- Improved Linux packaging scripts to bundle all required shared libraries (OpenCV, CFITSIO, yaml-cpp, etc.) for better cross-distribution compatibility and reduced dependency issues.
- Fixed Linux AppImage packaging to export
TILE_COMPILE_INPUT_SEARCH_ROOTSso directory scanning works correctly in packaged releases. - Enhanced GUI2 file browser to always show parent directory (..) even when not yet granted, triggering permission dialog on click for seamless navigation.
- Reworked GUI2 queue/batch handling and run monitoring: batch tabs in Run Monitor, batch-targeted stats/report actions, timestamped queue-root naming with hours/minutes, and updated EN/DE documentation.
- Stabilized
PREWARPfor OpenCL and extended GPU acceleration with OpenCL equivalents for the previously CUDA-onlyTILE_RECONSTRUCTIONandSTACKINGpaths, including sigma-clipping and overlap-add accumulation.
- Added a real artifact-based
STACKINGresume path in the C++ runner soresume --from-phase STACKINGrebuilds fromsynthetic_*.fit/canvas_mask.fitsinstead of replaying the entire pipeline. - Fixed one synthetic/tile overlap-add weighting failure mode so zero/invalid pixels no longer contribute Hann weights. This removes that specific darkening mechanism, but residual internal line artifacts may still have other causes.
- Added per-frame registration provenance and chain-depth tracking in the C++ registration artifacts, including stricter blind-chain anchor rules to limit drift through weak sequential rescue chains.
- Fixed GUI2 resume/run-monitor status updates so the active phase/status becomes visible immediately without requiring a manual page refresh.
- Fixed Alt/Az registration validation to score warps on the actual common overlap instead of the cropped full-frame canvas.
- Relaxed over-aggressive CC outlier rejection for long rotating sessions by keeping the CC threshold absolute instead of run-global MAD-relative.
- Fixed field-rotation model extrapolation outside the span of valid registrations so edge/tail frames use bounded bridge prediction instead of unstable local polynomial blow-up.
- Improved GUI2 tool persistence and PCC save handling, including temporary-output based saving and cross-platform temp-path behavior.
- Hardened backend memory usage and significantly reduced BGE autotune runtime on the IC434 reference run while preserving the selected solution behavior.
- Fixed Astrometry/PCC tool path inputs being overwritten by backend defaults.
- Promoted the DSO tile-reconstruction methodology to
v3.3.8in EN/DE and aligned it with the active runtime semantics. - Corrected the normative method text for runtime-configured mode thresholds, neighborhood-aware local metric normalization, sigma-clipped tile reconstruction, and affine post-OLA photometric restoration.
- Fixed GUI2 run-name reset so changing the input directory clears the shared
run_nameacross dashboard, wizard, and input-scan. - Added a macOS 15 / Sequoia Gatekeeper note for
start_gui2.commandand blocked package approval viaSystem Settings -> Privacy & Security. - Switched ASTAP
d80catalog downloads to platform-specific upstream packages: Linux.deb, macOS.pkg, Windows.exe.
- Wired
assumptions.frames_mininto the active runner mode-gate andassumptions.reduced_mode_cluster_rangeinto reduced-mode clustering.engine - Removed stale
assumptions.pipeline_profile,assumptions.frames_optimal, andassumptions.exposure_time_tolerance_percentfrom the active config/schema/frontend/docs/examples surface. - Regenerated the C++ schema and synchronized Parameter Studio, Assumptions UI, and methodology/reference docs with the active runtime semantics.
- Expanded
TILE_RECONSTRUCTIONboundary diagnostics to separate raw vs. normalized tile mismatches and exclude masked canvas zones from the metric. - Added artifact visibility for
tile_norm_bg_*andtile_norm_scaleto diagnose whether per-tile normalization itself amplifies visible seams. - Synchronized GUI2
run_nameandruns_diracross dashboard, wizard, and input-scan, including direct editing on the input-scan page.
- GUI2 parameter/config handling synchronized with the current C++ config schema, defaults, and reference docs.
- Added boundary diagnostics for visible tile mismatches in
TILE_RECONSTRUCTIONand removed the ineffective dedicated seam-correction config block. - Expanded run-monitor resume handling, live-log detail visibility, and config revision/template flows.
- Added server-side persistence for the GUI2 UI draft state via backend API/state storage.
- Migrated UX-relevant frontend parameters away from local browser storage to a central server-backed UI state.
- Synchronized run names, preset selections, config drafts, validation state, and tool inputs/results more consistently across dashboard, parameter studio, wizard, and tools.
- Bugfixes
- Added Linux AppImage generation to the GitHub Actions release workflow.
- Reworked PCC background-noise handling and connected UI/report updates so current PCC diagnostics are exposed more consistently in the GUI.
- zero-copy COMMON_OVERLAP
- Scratch reuse in LOCAL_METRICS
- reduced lock contention in tile_weighted-OLA
- faster sigma-clip kernel
- fewer tile copies in tile_weighted path
- parallel BGE autotune candidate evaluation
- Supports now:
- Linux: x86_64 Linux with
glibc >= 2.39(Ubuntu 24.04 or equivalent is the safe baseline for the current CI-built ZIPs) - macOS: macOS 15
- Windows: Windows 10 x64 or newer
- Linux: x86_64 Linux with
- Completed the productive migration to the Crow/C++ backend.
- Integrated C++ report generation.
- Updated launcher scripts, Docker packaging, and GitHub workflows to build and run the C++ backend directly.
- Promoted GUI2 as the recommended interface with a web frontend, FastAPI backend, and cross-platform release bundles.
- Expanded DE/EN i18n coverage in the GUI2 frontend and parameter studio, with aligned docs and backend config handling.
- Moved the previous Qt6 GUI path into
legacy/and clarified the actively maintained GUI2 packaging/start workflow.
- Fixed Alt/Az registration for datasets with large field rotation.
- Improved BGE/PCC pipeline with clearer phase visibility, stronger guardrails, and a more consistent config surface.
- Expanded parallel execution in compute-heavy stages.
- Multiple phase optimizations for more stable behavior and lower runtime overhead.
- First release with pre-built packages for Windows, Linux, and macOS
- Includes GUI, CLI, and runner executables
- Experimental release for testing purposes
- First public release
Raw Stack preprocessing pipeline (v0.2.8):
- Added a new standalone Raw Stack page in GUI2 for end-to-end preprocessing of FITS light frames through to a stacked and post-processed image, running fully separately from the normal Tile-Compile run studio.
- The pipeline covers all phases: Calibration (Bias/Dark/Flat), CFA/Mono Prep, Registration, Quality Analysis, Frame Filtering, Stacking (Sigma/Median/Winsor), Astrometry (ASTAP), Background Gradient Extraction (BGE), Photometric Color Calibration (PCC), and HyperMetric Stretch.
- All configurable parameters (sigma-clip, rejection method, stacking weighting, BGE, PCC, Astrometry, and HyperMetric Stretch) are taken directly from the Parameter Studio configuration — no hardcoded values.
- Output scaling correctly restores background and scale after stacking to produce accurate pixel values.
- Raw Stack UI cleanup: removed Run Monitor button, added full i18n coverage for all labels and buttons.
- See docs/raw_stack_gui_en.md for the full GUI reference.
implementationHMS:
- Added VeraLux HyperMetric Stretch (HMS) as a post-PCC pipeline phase.
- HMS now defaults to enabled in the C++ config defaults,
tile_compile.yaml, and all example YAML profiles. - The default mode is
ready_to_use, using adaptive anchor, Auto LogD, target background0.2, and outputoutputs/stacked_rgb_hms.fits. mode: scientificis implemented for controlled stretch output without ready-to-use final scaling/soft clip and with optionallinear_expansion.- Resume supports rerunning HMS directly via
--from-phase HYPERMETRIC_STRETCHfor historical runs with existing PCC artifacts.
Build hardening & Frontend cleanup:
- Fixed RunnerFrameCache build errors: implemented missing
try_load_normalizedandstore_normalizedmethods - Migrated both C++ projects to C++20 (GCC 13+, Clang 16+)
- Hardened web_backend_cpp build with CUDA 13 + OpenCV 4.11 CUDA 13 configuration
- Backend route_utils: fixed incomplete AppState type errors, hardened path validation
- Frontend refactoring: centralized utilities in
src/utils.js(escapeHtml, getMessage, getStorageJson, humanizeControlId, etc.) - Migrated shell.js, parameter-studio-page.js, and tooltips.js to ES6 modules with shared utils.js imports
- Eliminated duplicate I18N functions across frontend scripts (message(), textFor(), activeLocale(), getLocale())
- Removed dead code:
param_editor_index.json(36KB unused duplicate) - Updated documentation: unified C++20 requirements, release URLs updated to v0.2.5
Documentation system and BGE robustness (v0.2.5, 2026-04-26):
- Added professional documentation system using MkDocs Material with Doxygen integration for C++ API reference
- Updated all GitHub Releases documentation with correct binary filenames (tile_compile_gui2-linux-v0.2.4.zip, etc.)
- Added comprehensive installation instructions for pre-built binaries on Ubuntu/Debian, Fedora/RHEL, and Arch/Manjaro
- Restructured navigation with separate User Guide, Configuration, Methodology, and API Reference sections
- Added configurable
bge.sample_estimatorsupport in YAML configs, schema files, and Parameter Studio (quantile,sigma_clipped_median,sextractor_mode,biweight) - Extended BGE autotune so it can compare sample estimators and penalize or reject flat models when background/chroma spread indicates a real gradient
- Extended RGB chroma guards across BGE methods, including conservative fallbacks for imbalanced per-channel correction surfaces
- Updated
ic434_background_gradient.example.yamlwith robust RBF/sextractor_modesettings for IC434-like red/green background gradients - Added
docs/reconstruction_audit_2026-04-26.mdwith the reconstruction audit checklist and implementation notes - Hardened reconstruction fallback helpers against mismatched frame/tile shapes and missing or invalid tile weights
- Reworked
reconstruct_tiles_parallel()to use tile-sized temporary OLA buffers instead of full-frame scratch matrices per tile/sub-batch - Updated reconstruction memory budgeting so it accounts for global overlap-add accumulators plus per-worker tile scratch
- Removed ineffective reconstruction scheduler/config dead code, including the unused GPU batch field, unused
make_hann_1d()API, and non-functional underutilization detector
Registration performance: parallel anchor-promotion retries (v0.2.4):
- Fixed the direct-registration anchor-promotion loop so promoted-anchor retry passes use the configured parallel registration worker pool instead of falling back to a single-threaded
reg_worker()call. - Promotion rounds now build a targeted retry list and only revisit unresolved frames whose nearest active anchor is one of the newly promoted anchors, avoiding repeated full 325-frame passes when the anchor set changes.
- Registration progress now reports the actual job count and worker count for each pass, and
global_registration.jsondiagnostics includereg_promotion_retry_framesfor future runtime analysis.
Registration robustness: deep-chain rejection + adaptive anchors + hopping rescue + astrometric fallback (v0.2.3):
- Reject chain-validated frames with
chain_depth > max_blind_chain_depthandcc < reject_cc_min_absasdeep_chain_low_ccoutliers instead of accepting them; this prevents drift from long sequential chains through cloudy blocks. - Increased adaptive active-anchor target from
min(21, max(3, (N+59)/60))tomin(32, max(4, (N+29)/30)), doubling anchor density for large-N sessions (e.g., 325 frames now use ~12 anchors instead of ~6). - "Hopping" sequential rescue: when the direct neighbor has low CC or cannot anchor a blind chain, search up to 5 frames (for refine) or 8 frames (for rescue) in each direction for a better anchor with CC > 0.3–0.4, dramatically reducing chain depth in scattered-cloud conditions.
- Astrometric rescue moved to run after model-based warp prediction (Section 4b), so ASTAP can now also rescue frames that only have interpolated
model_*provenances; addedweak_modelcondition toshould_try_astrometryso low-CC model frames are eligible for plate-solving.
Hot/dead-pixel correction fix + registration code quality (v0.2.2):
- Fixed
cosmetic_correction_cfasilently skipping defective pixels inside star regions:neighbor_thresholdwas set to0.5 × global_threshold, so star-halo pixels (which sit well above that low bar) were counted as "hot neighbours" and blocked correction of genuine hot pixels nearby. The threshold is now raised to the full global hot-pixel threshold, so only pixels that are themselves hot-pixel candidates count as hot neighbours. - Added
extreme_outlierbypass: pixels exceedinglocal_median + 5 × local_floorare replaced unconditionally regardless of neighbourhood support. No real star-PSF pixel reaches that level relative to its same-colour neighbours. - Added dead/cold-pixel correction:
global_candidate_cold(< median − σ_threshold × σ) andcold_outlier(< local_median − local_floor) are now also replaced with the local same-colour median. - All three fixes operate on the raw CFA mosaic before warping and require no dark frames.
- Diagnostic keys in
global_reg_extramoved into adiagsub-object (4.2); downstream-facing keys remain at top level. - Section headers added to
run_phase_registration_prewarpto mark the seven major processing phases (4.1).
Registration NCC robustness + near-identity guard (v0.2.1):
- NCC computation in
try_methodnow clamps negative values and applies a Gaussian blur (σ=1.5) before computingncc_identity_overlapandncc_warped. Raw normalized proxy images carry negative background values and hot pixels that caused NCC to collapse from ~0.88 to ~0.05 for sub-pixel shifts, triggering false near-identity rejections. - Near-identity bypass condition strengthened with an
ncc_identity > 0.7guard: a near-zero warp is only accepted as a valid near-identity result when the frame is already close to the reference, preventing false bypasses for frames that simply failed to find a shift.
Registration v0.2.0: multi-anchor scaling + astrometric registration/rescue:
- Global registration no longer relies on rigid
1/3/5reference buckets. It now uses an N-scaled anchor selection with roughly one requested anchor per 80 frames, forced to odd anchor counts and currently capped at 15. - Anchor promotion after strong direct matches now scales with
Nas well: the active-anchor target is roughly one anchor per 60 frames, while per-round promotions and the number of extra direct passes grow in a controlled way for long sessions. - This reduces the classic late-reference failure mode on long Alt/Az datasets, because early and late parts of the sequence can attach directly to nearer temporal anchors instead of being forced through one distant master frame.
- Astrometric registration/rescue in the runner was upgraded in practice: ASTAP-based solves are no longer limited to
cc <= 0, but can also replace weak or deeply chained results, using the nearest active anchor as the astrometric reference basis. - New registration telemetry was added to
global_registration.json, includingrequested_ref_frames,active_ref_frames,reg_target_active_anchor_count,reg_promote_limit_per_round,reg_max_direct_anchor_rounds,reg_direct_anchor_rounds, andreg_source_counts. - Added the new example profile tile_compile_cpp/examples/m104.example.yaml for the concrete problem class "Alt/Az, somewhat stronger rotation, poor seeing, weight better frames more strongly"; the DE/EN practical examples and docs/process_flow/phase_1_registration.md were updated to match the current registration flow.
TILE_RECONSTRUCTION performance: sub-batch stacking replaces worker reduction (v0.1.F):
- Replaced the memory-budget-driven worker reduction in TILE_RECONSTRUCTION with frame sub-batching. Previously, a 2 GB memory budget capped OSC runs at 3 parallel workers (instead of the configured 8) because the peak RAM estimate assumed all frames loaded simultaneously per worker. Workers now always run at the configured
parallel_workerscount; the budget controls the sub-batch size (frames per batch) instead. For the reference run (610 frames, 475 tiles, 8 workers, 2 GB budget) this yields ~3 batches of ~205 frames each — same quality, ~2.7× faster TILE_RECONSTRUCTION. tile_boundary_diagnostics_enabledadded toruntime_limits(default:false). Boundary diagnostics are now opt-in; the previous default of always running them added ~5–10 % overhead per production run.tile_grid.jsonnow includesestimated_reconstruction_time_s(calibrated estimate based on tile count, frame count, and worker count) andcoverage_filtered_tiles.runtime_limits.jsonnow includestile_analysis_to_stack_ratio; a warning is logged when the ratio exceeds 10.phase_endevent for TILE_RECONSTRUCTION now includesduration_s.- web_backend_cpp code-quality fixes: consolidated three duplicate
utc_now_iso()implementations into a shared header, fixed SIGKILL being sent on every polling cycle after SIGTERM (now waits ~3 s), fixed FD leak onfork()failure, fixed sequential stdout/stderr read deadlock inrun_subprocess(), and reducedprune_locked()call frequency from every mutation to terminal-state transitions only.
Calibration fix + Parameter Studio reorganization (v0.1.E):
- Fixed the bias/dark calibration path: when bias and dark are both enabled, a raw dark is now bias-corrected internally before being applied to lights, preventing double subtraction of the bias pedestal.
- Added the new config field
calibration.dark_already_bias_correctedacross runner, schema, docs, defaults, example configs, and GUI2 so pre-bias-corrected master darks can be marked explicitly. - Reorganized Parameter Studio: selecting a category such as
registrationorcalibrationnow shows exactly one consolidated section; missing schema parameters are injected into that same block instead of being rendered in a separate section editor above it.
Calibration guardrails and backend persistence for calibration paths:
- Updated GUI2 calibration-path handling so disabling a calibration stage removes its paths from the active config immediately and re-enabling restores the previously used paths from backend UI state, without using browser storage.
- Added extra calibration guardrails, including warnings for obvious gain mismatches between light frames and calibration files.
Auto-engine for Alt/Az field rotation + registration failure fix (v0.1.D):
- Added
registration.auto_engine(default:true): probes a small set of frames before registration starts and automatically overrides the engine totriangle_star_matching+transform_model: affinewhen a rotation-blind engine (robust_phase_ecc,hybrid_phase_ecc) is configured but strong field rotation is detected. Threshold:auto_engine_rotation_threshold_deg(default:0.05°/frame, covers Alt/Az at any exposure time while staying well below EQ residual rotation). - Fixed a complete registration failure mode:
engine: robust_phase_eccwithallow_rotation: trueon Alt/Az datasets produced NCC ≈ 0 for all frames, causing 469/470 frames to fall back to identity transform (model_nearest_copy) with no actual alignment. - Updated
tile_compile.yamldefault engine totriangle_star_matchingandreject_cc_min_absto0.05. - Propagated new config fields to all schemas, example configs, and documentation.
Tile-reconstruction stabilization after recent optimization rollout (v0.1.C):
- Stabilized tile reconstruction after the recent performance optimization rollout, with follow-up fixes and analysis focused on visible tile-seam artifacts in the final reconstruction output.
RGB/PCC output-path stabilization after the v3.3.9 rollout (v0.1.A):
- Reworked the visible RGB output stretch so it operates luminance-aware and keeps chroma stable instead of exaggerating small background channel offsets into large blue/gray edge bands.
- Added
pcc.background_neutralization_mode = always|auto|offwith a new auto guard that attenuates or suppresses background neutralization when the measured "background" behaves like diffuse field signal rather than neutral sky. - Synchronized the new PCC control through schema, defaults, reference docs, and all example configurations so the runtime, documentation, and example surface now expose the same behavior.
Implementation and rollout of the v3.3.9 methodology (v0.1.9):
- Moved the key
v3.3.9methodology changes into the active runtime path: linear reconstruction core without the old pre-OLA tile normalization, cleaner BGE/PCC semantics, more robust support/seam handling, and updated guards/diagnostics. - Updated the frontend and configuration surface to the current schema/methodology baseline so new
v3.3.9parameters are exposed more consistently in Parameter Studio and related documentation. - Refreshed the process-flow, reference, and comparison documents for
v3.3.9, and additionally hardened Crow/C++ web-backend startup so failures now report a clear fatal error instead of producing a core dump.
AppImage packaging fix + file browser navigation enhancement (v0.1.7):
- Fixed Linux AppImage packaging in
packaging/gui2/start_gui2.shto exportTILE_COMPILE_INPUT_SEARCH_ROOTSenvironment variable, resolving directory scanning failures in packaged releases where relative paths could not be resolved. - Enhanced GUI2 file browser (
web_frontend/tooltips.js) to always display parent directory (..) navigation even when the parent path is not yet granted, showing a lock icon (🔒) for restricted paths and triggering the permission grant dialog on click for seamless upward navigation. - Updated backend file listing route (
web_backend_cpp/src/routes/system_routes.cpp) to returnparent_allowedflag alongsideparentpath, enabling frontend to distinguish between accessible and restricted parent directories.
GUI2 batch/queue run-monitor refresh + docs update (v0.1.6):
- Reworked the GUI2 Run Monitor for queue/batch runs: queue entries now appear as tabs, redundant duplicate batch/filter rows were removed, and top-level batch/structure summary visibility was corrected again for queued runs.
- Enabled batch-targeted post-run actions in the Run Monitor so
Generate Stats, stats-folder opening, and report opening can operate on the currently selected finished batch tab instead of only the active root/current run. - Changed unnamed queue-root naming from date-only to
YYYYMMDD_HHMM, making batch-root directories less collision-prone and aligning the dashboard/wizard path hints with the actual behavior. - Expanded the EN/DE step-by-step guides with explicit batch/queue usage notes, including the primary MONO multi-filter use case and Run Monitor tab behavior.
OpenCL expansion for PREWARP, TILE_RECONSTRUCTION, and STACKING (v0.1.5):
- Stabilized the OpenCL
PREWARPpath for multi-threaded execution by guarding OpenCV OpenCL/T-API access and forcing explicit host copies where needed. - Extended
tile_compile_cpp/src/core/acceleration.cppwith OpenCL equivalents for the previously CUDA-onlyTILE_RECONSTRUCTIONandSTACKINGpaths, including sigma-clipping and overlap-add accumulation/normalization.
Real STACKING resume + synthetic OLA seam fix (v0.1.4):
- Implemented a true artifact-based
STACKINGresume path intile_compile_cpp/apps/runner_resume.cpp, soresume --from-phase STACKINGnow rebuilds the stacked outputs directly from existingsynthetic_*.fitpluscanvas_mask.fitsand continues with later phases instead of triggering an in-place full rerun. - Fixed one overlap-add accumulation failure mode in
tile_compile_cpp/src/core/acceleration.cpp: zero/invalid tile pixels no longer add Hann weights toweight_sum. This removes that specific darkening path, but residual internal seams/lines may still have other causes.
Registration provenance/depth diagnostics + resume status visibility (v0.1.3):
- Extended
tile_compile_cpp/apps/runner_phase_registration.cppso each frame now carries explicit registration provenance (direct_global,sequential_rescue,temporal_rescue, modeled variants, etc.) pluschain_depth, and writes that information intoglobal_registration.json. - Tightened blind sequential chaining: weak
sequential_rescueframes no longer act as effectively unlimited anchors; anchor reuse is now capped by chain depth unless correlation is strong enough. - Added aggregate registration diagnostics such as source counts, maximum observed chain depth, and blocked blind-chain-anchor attempts to the registration artifact metadata.
- Fixed GUI2/backend resume status handling so the monitor subtitle and phase state update immediately after
resume, including the case where the runner has started but the nextresume_startevent has not yet been written to the run log.
Registration/field-rotation stabilization for long Alt/Az sessions (v0.1.2):
- Fixed global registration validation in
tile_compile_cpp/so NCC comparisons are computed only on the actual valid overlap mask of the warped frame instead of on the cropped full-frame canvas. This prevents correct larger-rotation warps from being rejected just because rotated corners fall outside the fixed proxy image. - Applied the same overlap-masked NCC validation to temporal rescue chaining, so neighbor-to-reference rescue no longer fails for the same cropped-canvas reason.
- Reworked global registration outlier CC filtering for long rotating runs: the
low_ccreject gate now uses the configured absolute minimum directly instead of a run-global median/MAD threshold that incorrectly rejected many geometrically plausible edge frames. - Fixed field-rotation model prediction outside the span of real registrations: tail/head frames no longer use unstable local polynomial extrapolation and instead fall back to bounded bridge-style edge prediction, preventing the severe fan-out / wedge artifacts seen on the M66 Alt/Az regression run.
GUI2 tool persistence/PCC UX, backend memory guards, and BGE autotune speed-up:
- Hardened
web_backend_cpp/against OOM-prone API/tool paths with capped subprocess/stdout capture, bounded scan/report payload retention, streamed event-file inspection, and retained-job limits plus environment-configurable defaults documented for GUI2. - Added
packaging/gui2/.env.exampleand documented the new backend runtime limit environment variables used by GUI2 launchers. - Fixed GUI2 frontend/backend asset serving and route behavior so
/uiand direct asset paths resolve reliably instead of producing 404s. - Improved Astrometry/PCC tool UX: persistent in-progress download state across page switches, corrected download progress calculation, automatic PCC WCS prefill from matching files, and automatic PCC parameter import from a run
config.yamlwith visible traceability in the UI/log. - Reworked PCC output handling in GUI2 so
Run PCCwrites to a temporary result,Save Correcteduses a styled in-app save dialog, copies the RGB result plus_R/_G/_Bsidecar files from the temp output, and works consistently across Linux/macOS/Windows temp directories. - Fixed standalone PCC fallback behavior when
canvas_maskis missing by using a safe full-image fallback instead of aborting the tool run. - Added BGE phase timing diagnostics to
bge.jsonand optimized the real hotspot intile_compile_cpp/: autotune prep now reuses prepared tile analysis across quantile candidates, reducing measured BGE wall time on the IC434 reference run from about472sto about181swithout adding new full-frame memory pressure.
- Fixed Astrometry data directory input not being respected when user manually changes the path - now uses
shouldKeepAstapSelectionlogic to preserve user input. - Added server-side persistence for Astrometry and PCC tool parameters via UI state API - settings survive server restarts.
- Improved catalog download intelligence: Astrometry catalogs skip download if already installed, PCC Siril only downloads missing chunks.
- Enhanced archive extraction robustness for macOS
.pkg, Linux.deb, and Windows.exeformats with better error messages and validation. - Fixed macOS release bundle library issues by explicitly bundling GCC runtime libraries (
libgcc_s,libgfortran,libquadmath,libgomp) and preservinglibstdc++for Homebrew-compiled dependencies.
Methodology v3.3.8 + GUI2 run-name reset (v0.0.F):
- Added new normative methodology documents
docs/v3/tile_basierte_qualitatsrekonstruktion_methodik_v_3.3.8_en.mdanddocs/v3/tile_basierte_qualitatsrekonstruktion_methodik_v_3.3.8_de.md. - Corrected the method specification so it matches the active runtime for operating-mode thresholds, shared-core channel semantics, neighborhood-aware local metric normalization, sigma-clipped tile reconstruction, and affine post-OLA photometric restoration.
- Fixed GUI2 so a changed input directory clears the shared
run_nameacross dashboard, wizard, and input-scan. - Added a short macOS 15 / Sequoia install note for Gatekeeper-blocked
start_gui2.commandlaunch. - Changed ASTAP
d80downloads from the invalid shared ZIP assumption to the real upstream platform packages: Linux.deb, macOS.pkg, Windows.exe.
Assumptions runtime/config synchronization (v0.0.E):
assumptions.frames_minis now used by the active C++ runner mode gate instead of the old hardcoded minimum-frame threshold.assumptions.reduced_mode_cluster_rangenow affects reduced-mode clustering directly, so the exposed config field is no longer parser-only drift.- Removed dead assumptions fields from the active config surface:
pipeline_profile,frames_optimal, andexposure_time_tolerance_percent. - Synchronized active C++ config code, generated schemas, example YAMLs, GUI2 Assumptions/Parameter Studio, and DE/EN docs to the remaining runtime-relevant assumptions fields.
Boundary diagnostics deepening + GUI2 run-field synchronization:
- Extended
TILE_RECONSTRUCTIONdiagnostics sotile_reconstruction.jsonnow exposes raw and normalized tile-boundary metrics separately, plustile_norm_bg_r/g/bandtile_norm_scalefor direct normalization analysis. - Corrected tile-boundary analysis to exclude masked
COMMON_OVERLAP/ canvas-invalid zones instead of counting them as valid zero-valued samples. - Updated the methodology/process/reference/practical docs to reflect the read-only raw/normalized boundary diagnostics and the common-canvas-mask requirement.
- Added
run_nameandruns_direditing to Input&Scan and unified both fields across dashboard, wizard, and input-scan via the shared GUI2 stored state.
GUI2 config/studio sync + tile-boundary diagnostics update:
- Removed the ineffective
stacking.tile_seam_harmonization.*experiment from the active C++ config surface and replaced it with read-only tile-boundary diagnostics inTILE_RECONSTRUCTION. - Synchronized config code, generated schemas, example configs, and DE/EN reference docs with the active C++ config surface.
- Reworked Parameter Studio so parameter inventory, defaults, ranges, tooltips, and filtering are driven from the current schema/default config instead of stale manual lists.
- Extended GUI2 live-log and run-monitor behavior, including richer phase details, resume config editing/template flows, stored config revisions, and corrected phase status after successful resume.
Server-side GUI2 UI-state persistence:
- Added persistent backend storage plus API access for the GUI2 UI draft state so frontend UX state no longer depends primarily on local browser storage.
- Migrated the major UX-relevant frontend parameters to the shared server-backed UI state, including run naming, preset synchronization, config drafts, validation state, dirty state, queues, and tool path/input settings.
- Restored and synchronized additional tool result state across reloads where useful, while keeping purely ephemeral runtime display state non-persistent.
Crow/C++ runtime, release packaging, and PCC update:
- Finalized the productive GUI2 path around the Crow/C++ backend, including integrated C++ report generation and aligned frontend/backend report handling.
- Updated release packaging, local build/start scripts, and GitHub workflows for Linux, macOS, and Windows, including the documented GUI2 bundle OS baselines.
- Added Linux AppImage creation to the GitHub Actions release workflow so releases now include a portable Linux artifact alongside the ZIP bundle.
- Added date-aware run-directory naming and aligned route/websocket handling plus backend tests for the new naming behavior.
- Reworked PCC background-noise handling and connected UI/report updates so current PCC diagnostics are exposed more consistently in the GUI.
GUI2 release + i18n refresh:
- Promoted the web-based GUI2 stack (
web_frontend/+web_backend_cpp/) to the recommended UI path and updated the top-level docs accordingly. - Added the dedicated GUI2 release workflow and launcher packaging for Linux, macOS, and Windows under
.github/workflows/release-tile-compile-gui2.ymlandpackaging/gui2/. - Expanded frontend localization coverage and parameter-studio translations, with matching backend config contract updates and tests.
- Moved the earlier Qt6 GUI/build-script path into
legacy/to separate the maintained GUI2 route from the legacy desktop implementation.
Python elimination in the productive GUI2 path:
- Switched GUI2 runtime, packaging, Docker, and CI to the Crow/C++ backend.
- Removed the productive Python dependency for stats/report generation; this now runs via the integrated C++ backend path and CLI support.
- Updated the repository structure and GUI2 documentation to reflect
web_backend_cpp/as the maintained backend implementation.
Strict/Practical runtime unification + verification:
- Unified the image-processing runtime core path for
assumptions.pipeline_profile: strict|practical. - Removed strict-only execution branches in the hot path:
- no strict-only pre-registration order path,
- no strict-only reduced/full gate override (
max(200, threshold)), - no strict-only tile re-normalization branch,
- no strict-only channel re-weighting branch in OSC tile stacking.
- Registration no longer force-overrides
registration.enable_star_pair_fallback=falsein strict mode. - Updated config reference docs (EN/DE) so profile text matches current runtime behavior.
- Added A/B evidence run pair (
max_frames=80) confirming same core flow with only minor numeric fit variance.
Performance and throughput optimization (large datasets, 1000+ frames):
- Added adaptive worker selection per phase with I/O-aware caps based on sampled frame size and task count.
DiskCacheFrameStorenow uses persistent memory-mapped frame views with rewrite invalidation, reducing repeated open/mmap/unmap overhead for tile access.- Removed the global PREWARP store mutex so frame-cache writes can proceed concurrently.
GLOBAL_METRICSnow runs in a parallel worker pool with thread-safe progress and error aggregation.TILE_RECONSTRUCTIONoverlap-add switched from a single global lock to row-stripe locking to reduce contention.- In OSC tile reconstruction, each valid frame tile is debayered once and cached as R/G/B planes for reuse across channel stacks.
LOCAL_METRICSnow skips globally invalid tiles before extraction and limits heavy full-matrix artifact writes for large production runs.
Methodology alignment (v3.3.6 strict profile):
- Added
assumptions.pipeline_profile: practical|strictto switch between compatibility mode and strict normative behavior. - In
strictprofile, REGISTRATION/PREWARP is executed before CHANNEL_SPLIT/NORMALIZATION/GLOBAL_METRICS. - In
strictprofile, reduced/full gating enforces full mode only fromN >= 200. - In
strictprofile, phase-7 tile normalization before OLA is always enabled. - PCC
auto_fwhmnow falls back deterministically toFWHM=0when seeing is unavailable. - Added
registration.enable_star_pair_fallback(defaulttrue); strict profile disables it to match the normative cascade order. - Updated config schema/sample config and v3 reference docs (DE/EN) for these settings.
BGE/PCC configuration and docs alignment:
- Restored user-facing BGE fit parameters
bge.fit.robust_lossandbge.fit.huber_delta. - Added user-facing BGE apply guards
bge.min_valid_sample_fraction_for_applyandbge.min_valid_samples_for_apply. - Re-enabled parse/serialize/schema support for these keys in the runtime config surface.
- Runner mapping now forwards the configured values (no internal forced override).
- BGE config artifacts in both pipeline and resume paths include
robust_lossandhuber_deltaagain. - Updated BGE/PCC docs and practical examples (DE/EN) to match current behavior and active parameter set.
BGE Phase Visibility / Comparison Outputs:
- BGE is now emitted as a dedicated pipeline enum phase (
BGE=15) betweenASTROMETRYandPCC. - GUI phase progress now shows BGE explicitly, including BGE substep progress updates.
- Added explicit pre-PCC output
outputs/stacked_rgb_bge.fitsfor direct BGE-only vs BGE+PCC comparison. - Configuration docs/examples updated for v3.3.6 option set:
bge.autotune.*(enabled,strategy,max_evals,holdout_fraction,alpha_flatness,beta_roughness)pcc.background_modelpcc.max_condition_number,pcc.max_residual_rmspcc.radii_modepcc.aperture_fwhm_mult,pcc.annulus_inner_fwhm_mult,pcc.annulus_outer_fwhm_mult,pcc.min_aperture_px
Registration / Canvas / Color-Correctness Fixes:
- Bayer parity-safe offsets in registration/prewarp path: Canvas offsets are now handled consistently to preserve CFA parity across expanded/cropped canvases.
- Output scaling origin fixes: Scaling calls now use the correct tile/debayer offsets where required, preventing R/G parity mismatches after crop/canvas transforms.
- Common-overlap and canvas handling clarified in process-flow docs and aligned with the current phase model.
PCC (Photometric Color Calibration) Improvements:
- Robust log-chromaticity fit implemented for PCC matrix estimation (instead of the older proportion-only approach).
- Guardrails on channel scales added to avoid extreme global color casts.
- Aperture annulus contamination filter (IQR gate) added to reject unstable star measurements in nebulous/gradient-heavy fields.
Documentation Refresh:
docs/process_flow/*updated to the current production pipeline state, includingPREWARP,COMMON_OVERLAP, canvas/offset propagation, and current enum phase ordering.
BGE (Background Gradient Extraction):
- Added optional pre-PCC BGE stage that directly subtracts modeled background from RGB channels.
- Added foreground-aware BGE fit method
modeled_mask_meshfor difficult fields with large diffuse objects (e.g. M31/M42) to reduce color-cloud artifacts before PCC. - Added
artifacts/bge.jsonwith per-channel diagnostics (tile samples, grid cells, residual statistics). - Extended report generation to include a dedicated BGE section with summary plots and residual analysis.
Calibration Fixes:
- GUI dark calibration propagation fixed: If
use darkis enabled and either Darks dir or Dark master is set, these values are now merged into the effective runtime config and applied by the runner. This fixes cases where dark calibration appeared enabled in the GUI but was not present in the run config (use_dark: false, empty dark paths).
New Registration Features for Alt/Az Mounts Near Pole:
-
Temporal-Smoothing Registration: For field rotation, automatically uses neighbor frames (i-1, i+1) for registration when direct registration to reference fails. Chained warps:
i→(i-1)→refori→(i+1)→ref. Useful for continuous field rotation (Alt/Az near pole) and clouds/nebula. -
Adaptive Star Detection: When too few stars are detected (< topk/2), automatically performs a second pass with lower threshold (2.5σ instead of 3.5σ). This improves star detection in clouds, nebula, or weak frames.
-
New Registration Engine:
robust_phase_eccwith LoG gradient preprocessing, optimized for frames with strong nebulae/clouds.
Field Rotation Support:
- Canvas Expansion for Alt/Az Mounts: Output canvas is now automatically expanded to contain all rotated frames. Previously, stars at the edges were cropped when using Alt/Az mounts near the pole. The bounding box of all warped frames is computed and the canvas is resized accordingly. Log output shows expansion:
"Field rotation detected: expanding canvas from WxH to W'xH'".
Documentation:
- New: Practical Configuration Examples & Best Practices - Comprehensive guide with use cases for different focal lengths, seeing conditions, mount types, and camera setups (DWARF, Seestar, DSLR, Mono CCD). Includes parameter recommendations based on methodology v3.3.4.