Astropornography tool - one command from raw subs to a finished astrophoto
Project description
aPornTool
One command from raw sub-exposures to a finished, share-ready astrophoto.
๐ฆ Install: pip install aporn-tool - releases ยท changelog.
aPornTool takes a folder of raw astrophotography subs and drives them through the full linear-to-nonlinear editing pipeline: stacking, photometric colour calibration, gradient and noise removal, colour-preserving stretch, and star management. Only the deliverables land in your output folder; scratch files get tucked into a hidden working directory.
It's built for the ZWO Seestar workflow (internal calibration โ no darks/flats/bias) but works
with any OSC .fit subs, and runs natively on Windows, macOS (incl. Apple Silicon), and Linux.
Design goal: processing parity. On the same data, aim to match what a skilled processor would get, so the only remaining variable is capture (aperture, integration hours, sky darkness). The tool can't invent detail that isn't in the data. The final crop, curves, and watermark are yours to do from the 16-bit TIFF (Canva/Photoshop).
Contents
- How it works
- Prerequisites
- Installation
- First-time setup
- Usage
- Command reference
- Stages & resume
- Output layout
- Configuration file
- FAQ
- Troubleshooting
- Limitations
- Development
How it works
raw .fit subs โโโบ stage โโโบ SIRIL: calibrate โโบ register โโบ stack โโบ [SPCC] โโบ golden linear stack
โ
deliverables โโโ finish โโโ [StarNet] โโโ [GraXpert BGE + denoise] โโโ [auto-crop] โโ
(.tif/.png/.jpg/.fits)
- Each stage is checkpointed. The golden linear stack (
_work/<target>/02_linear/) is the immutable re-processing anchor. Re-finishing never re-stacks. - The pipeline is parameterised per mode: registration, gradient tool, SPCC placement, and star handling all differ depending on what you're shooting (see the table below).
| Mode | Best for | Registration | Gradient | Stars |
|---|---|---|---|---|
dso-galaxy |
galaxies - M31, M33, M51, M101, M81 (mosaic auto-detected from the subs' pointing spread; override --mosaic/--single) |
WCS framing=max+feather (mosaic) or register -2pass+mirrorx (single) |
GraXpert BGE | composite dual-layer (StarNet2), blend some back |
dso-emission-nebula |
Hฮฑ HII / SNRs - M8, M20, M42, M16, Veil | star-based 2-pass | SIRIL subsky |
keep all (rich field) |
dso-reflection-nebula |
blue scattered light - VdB106, M78 | star-based 2-pass | GraXpert BGE | dual-layer screen blend |
dso-star-cluster |
globulars & open clusters - M13, M22, M45, M44 | 2-pass (+FWHM cull) | SIRIL subsky |
keep all, stars are the subject |
dso-milky-way |
wide-field Milky Way from a phone/camera (JPEG/HEIC/PNG/TIFF stills, not FITS) | single-pass global (no cull) | GraXpert BGE (high smoothing) | keep all, stars are the subject |
dso-milky-way is the odd one out: it ingests already-processed camera stills instead of raw
FITS subs, so it skips calibration, plate-solving, and SPCC. Put your phone on anything steady, take
a dozen-plus frames of the same patch of sky, and it stacks them to pull the galactic core out of the
noise. See the Milky Way section below.
Planetary (video โ AutoStakkert โ finish) is planned; it requires a manual GUI stacking step.
Prerequisites
| Tool | Role | Get it |
|---|---|---|
| Python 3.10+ | orchestrator | python.org / your package manager |
Siril 1.4+ (siril-cli) |
stack, register, plate-solve, SPCC, StarNet | https://siril.org/download/ |
| GraXpert 3.x | background extraction + AI denoise (galaxy & reflection) | https://github.com/Steffenhir/GraXpert/releases |
| StarNet2 | star removal | https://www.starnetastro.com/ |
| ffmpeg / ffprobe | planetary + final polish | ffmpeg.org / package manager |
Every DSO tool runs natively cross-platform (incl. Apple Silicon). The tool locates each one on
PATH, then in the standard install locations per OS, then from aporntool.config.json. You
never hard-code paths.
Where the tools usually live per OS
| Windows | macOS | Linux | |
|---|---|---|---|
| siril-cli | C:\Program Files\Siril\bin\siril-cli.exe |
/Applications/Siril.app/Contents/MacOS/siril-cli |
/usr/bin/siril-cli |
| GraXpert | %LOCALAPPDATA%\Programs\GraXpert\GraXpert.exe |
/Applications/GraXpert.app/Contents/MacOS/GraXpert |
package / AppImage |
| StarNet2 | (set in SIRIL) | /usr/local/bin/starnet2 |
/usr/local/bin/starnet2 |
| GraXpert AI models | %LOCALAPPDATA%\GraXpert\GraXpert\{bge,denoise}-ai-models\ |
~/Library/Application Support/GraXpert/{bge,denoise}-ai-models/ |
~/.local/share/GraXpert/โฆ |
| SIRIL config | %LOCALAPPDATA%\siril\ |
~/Library/Application Support/org.siril.Siril/siril/ |
~/.config/siril/ |
Installation
Already have Python 3.10+? Install from PyPI:
pip install aporn-tool
That gives you the aporn-tool command. python -m aporntool also works as a module fallback
(module names can't contain hyphens, so the Python package keeps the one-word aporntool name),
and an aporntool alias command is installed too. Either spelling works.
Or install from source (for development / latest main)
git clone https://github.com/christiantroyandrada/aporn-tool.git
cd aporn-tool
python3 -m venv .venv
.venv/bin/python -m pip install -e .
# Windows: .venv\Scripts\python -m pip install -e .
Installing the Python package does not install Siril/GraXpert/StarNet. Those are separate apps (see Prerequisites). Run
aporn-tool config --checkto confirm they're found.
First-time setup
Run the discovery check. It prints where each tool was found and writes a starter config:
aporn-tool config --check
Then complete the three one-time setup steps (the tool's preflight checks the ones it can):
- GraXpert AI models (mosaic & reflection) - open GraXpert once and run Background Extraction and Denoise on any image so it downloads the model files. Preflight verifies they exist before stacking, so a missing model fails in seconds, not after a 30-minute stack.
- StarNet2 (galaxy, emission, reflection) - the composite dual-layer finish calls the StarNet2
CLI directly, so it just needs to be discoverable (set
tool_paths.starnet2in the config, or have it onPATH). No SIRIL-internal StarNet configuration is required. (Star-cluster keeps all its stars and needs no StarNet.) - Local Gaia catalogs in SIRIL (SPCC colour calibration) - online VizieR is retired. Install the sky region matching your target: Milky Way for galactic nebulae/low-latitude clusters, Galaxy Season for high-latitude galaxies. Wrong region โ SPCC reports "no stars".
Validate everything without processing:
aporn-tool dso-galaxy --in "/path/to/subs" --out /path/to/out --target M31 --preflight-only
Usage โ from simplest to advanced
1. The simplest run
Point it at a folder of subs and pick the mode, that's all. The object name and coordinates are read from the subs' FITS header, and the results land in a folder named after the target, right beside your subs:
aporn-tool dso-galaxy --in "/path/to/M31 subs"
Produces M31_final.tif (16-bit, the real deliverable), .png, .jpg (quick-look), and .fits
next to the input; everything else lives under _work/.
Override either default when you want to: --target for a custom name, --out for a custom
location.
โ ๏ธ The output path must not contain spaces (a SIRIL limitation). The default output inherits the subs' parent folder; if that path has spaces, pass a space-free
--out. The--inpath and sub filenames may contain spaces.
2. Other modes
aporn-tool dso-emission-nebula --in "/data/M8"
aporn-tool dso-reflection-nebula --in "/data/M78"
aporn-tool dso-star-cluster --in "/data/M13"
2b. Wide-field Milky Way from a phone
dso-milky-way takes a folder of camera/phone stills (.jpg .jpeg .png .tif .tiff .heic) instead
of FITS subs โ no --target needed (the run is just named MilkyWay):
aporn-tool dso-milky-way --in "/path/to/phone shots"
How to shoot for it: point at the Milky Way and take a dozen or more frames of roughly the same framing (Night Mode or a long-exposure app gives the most signal). The tool aligns on the stars, so even a hand-held burst stacks fine โ star registration is invariant to the shift and rotation between frames. More frames = less noise. Needs SIRIL + GraXpert (no StarNet, no Gaia catalog).
Hand-held? Add --no-tripod. Because the tool aligns on the stars, a fixed foreground
(rooftops, trees, wires) smears into a ghost as the framing drifts between hand-held frames โ that is
the one thing star-aligned stacking can't fix. --no-tripod recovers a sharp foreground: it keeps the
deep stacked sky but paints the foreground back in from a single frame.
aporn-tool dso-milky-way --in "/path/to/phone shots" --out ~/Pictures/mw_out --no-tripod
It finds the foreground automatically from how much each pixel moves between the registered frames
(the sky is aligned = still; the foreground drifts = moving) โ no horizon line to draw, and it works
whether your foreground is along the bottom, the side, or scattered rooftops. Hand-held drift also
leaves a wider ragged, colour-fringed border around the stack. For a clean, fringe-free framing, pass
an explicit --crop "X Y W H" box that crops past that border (the default auto-crop keeps the
border as a mild sky fringe rather than risk clipping into it). On a real tripod, leave --no-tripod
off (there's no ghost to fix). Tuning knobs live under pipeline.no_tripod in the config.
Two practical notes:
- Output path with spaces: phone shots often live under a spaced path (e.g.
~/Pictures/Milky Way), and the default--outlands beside them, which SIRIL can't handle. Pass an explicit space-free--out, e.g.--out ~/Pictures/mw_out. - HEIC (iPhone default): supported only if your SIRIL was built with HEIF support (most current
builds are). The tool prints a heads-up when it sees
.heic; if registration finds no frames, export the frames to JPEG or TIFF and re-run.
2c. DSLR / mirrorless DSO (FITS-less)
The four DSO modes also take DSLR/mirrorless lights โ raw (.cr2 .cr3 .nef .arw .dng .raf โฆ),
TIFF, or JPEG โ no FITS required. Point --in at your lights and pass calibration frames as folders:
aporn-tool dso-galaxy \
--in "/data/M31/lights" \
--darks "/data/M31/darks" \
--flats "/data/M31/flats" \
--bias "/data/M31/bias" \
--target M31 --focal 530 --pixel 3.76 --out /data/M31_out
Notes:
- A folder is read as one format (priority FITS > raw > TIFF > JPEG), so raw + in-camera JPEG pairs just work โ the JPEGs are ignored.
- Master darks/flats/bias are optional and applied when given (a
mastersstage builds them). --targetis required (raw has noOBJECTheader); pass--coords RA,DECfor a target not in the built-in catalog. Raw/FITS get debayered; TIFF/JPEG are treated as already-RGB.--focal/--pixelset the plate-solve geometry for the SPCC in galaxy/reflection (SPCC runs in preprocess there). Emission/star-cluster solve blind in the finish phase, so those two don't use--focal/--pixelyet; SPCC may not calibrate DSLR emission/cluster colour without a catalog target.- Master darks/flats/bias also work for cooled astro-camera FITS lights, not just DSLR raw.
- For accurate SPCC colour, set your camera under
pipeline.spcc.sensorin the config (e.g."Canon EOS 2000D"for a T7). SPCC uses the local Gaia catalog if installed, otherwise it reverts to the online Gaia catalogue automatically. - Emission targets need the right camera. Nebulae like the Rosette or Orion are mostly hydrogen-alpha (656 nm), which a stock (unmodified) DSLR's IR-cut filter largely blocks โ you can't process in red that wasn't captured. For strong Halpha, use an astro-modified camera or a dual-band/Ha filter. Broadband targets (star clusters, reflection nebulae like the Pleiades, galaxies, the Milky Way) are unaffected.
Already stacked elsewhere? Add --stacked to feed a finished linear integration (from DSS, Siril,
etc.) straight into the finish โ no re-stacking:
aporn-tool dso-reflection-nebula --in "/data/PLEIADES_STACKED.tif" --target M45 --stacked --out /data/m45_out
--stacked works on any mode and imports the single image as the golden anchor, then runs that mode's
BGE / StarNet / stretch. (Galaxy and reflection do their SPCC in preprocess, which --stacked skips,
so they use the image's existing colour; emission and star-cluster still colour-calibrate in finish.)
3. Combine multiple nights (more integration = the #1 quality lever)
--in is repeatable; all .fit from every source are staged and stacked together:
aporn-tool dso-galaxy \
--in "/data/M31/2026-07-04" \
--in "/data/M31/2026-07-05" \
--out /data/out --target M31
4. A target not in the built-in catalog
Nothing special needed. The coordinates come from your subs' FITS header, so unlisted targets
(VdB 106, Sh2-155, โฆ) just work. Pass --target only when you want a custom output name:
aporn-tool dso-reflection-nebula --in "/data/vdb106"
aporn-tool dso-emission-nebula --in "/data/sh2-155" --target Sh2-155
5. Control the crop
Auto-crop (default) trims empty registration/mosaic borders. Override it:
# keep the full frame (no crop)
aporn-tool dso-galaxy --in "/data/M31" --out /data/out --target M31 --no-crop
# explicit SIRIL crop box: X Y W H (x from left, y from top)
aporn-tool dso-galaxy --in "/data/M31" --out /data/out --target M31 --crop "162 108 2310 4378"
6. Check status and resume
Re-running the same command auto-resumes at the first unfinished stage, nothing done is repeated. Inspect the ledger any time:
aporn-tool status --out /data/out --target M31
dso-galaxy / M31 (fingerprint 8cd20ff7d100564d)
calibrate done
register done
stack done
spcc done
bge done
denoise done
finish failed
Resume at: finish
7. Re-run specific stages (cheap, from the golden anchor)
# redo colour calibration and everything after it (e.g. once the right Gaia region is installed)
aporn-tool dso-galaxy --in "/data/M31" --out /data/out --target M31 --redo spcc
# restart at a named stage
aporn-tool dso-galaxy --in "/data/M31" --out /data/out --target M31 --from finish
# ignore all checkpoints and re-run everything
aporn-tool dso-galaxy --in "/data/M31" --out /data/out --target M31 --force
8. The advanced, fully-specified run
aporn-tool dso-galaxy \
--in "/data/M31/2026-07-04" --in "/data/M31/2026-07-05" \
--out /data/out \
--target M31 \
--crop "162 108 2310 4378" \
--star-reduce 0.35 \
--config /data/my-aporntool.config.json \
--redo spcc
--star-reduce 0.35- after StarNet removes stars (mosaic), blend 35% of them back (lower = fewer/dimmer stars; default 0.5).--config- use a specific config file (tool paths, catalogs, Seestar defaults).--redo spcc- recompute from thespccstage onward, reusing the stack.
Command reference
aporn-tool <command> [options]
| Command | Purpose |
|---|---|
dso-galaxy, dso-emission-nebula, dso-reflection-nebula, dso-star-cluster |
process a deep-sky target (FITS subs) |
dso-milky-way |
stack a wide-field Milky Way from phone/camera stills (JPEG/HEIC/PNG/TIFF) |
config --check [--config PATH] |
show tool discovery; write a starter config |
status --out PATH --target NAME |
print the resume ledger |
--version |
print the version |
Options for the processing modes:
| Option | Description |
|---|---|
--in PATH |
subs folder (required, repeatable for multi-night) |
--out PATH |
output root (optional; defaults to a <TARGET> folder beside the subs; must be space-free) |
--target NAME |
object name (optional; auto-detected from the subs' FITS OBJECT header) |
--crop "X Y W H" |
explicit SIRIL crop box (default: auto-crop) |
--no-crop |
disable auto-crop; keep the full frame |
--star-reduce F |
mosaic star blend-back fraction (default 0.5) |
--darks PATH |
folder of dark frames (DSLR calibration; DSO modes) |
--flats PATH |
folder of flat frames (DSLR calibration; DSO modes) |
--bias PATH |
folder of bias/offset frames (DSLR calibration; DSO modes) |
--focal MM |
focal length (mm) for the SPCC plate solve (DSLR; default: Seestar) |
--pixel UM |
pixel size (microns) for the SPCC plate solve (DSLR; default: Seestar) |
--no-tripod |
hand-held Milky Way: recover a sharp foreground from one frame, de-ghosting the house/trees/wires (dso-milky-way only) |
--clean |
on success, delete working files except the golden anchor (reclaims disk) |
--from STAGE |
restart at this stage |
--redo STAGE |
re-run this stage + everything downstream |
--force |
re-run all stages, ignore checkpoints |
--preflight-only |
validate the environment, then stop |
--config PATH |
config file (default aporntool.config.json) |
Catalogued targets get canonical coordinates: M3 M4 M5 M6 M7 M8 M11 M13 M15 M16 M20 M22 M31 M33 M42 M44 M45 M51 M81 M92 M101 NGC869 NGC6960 NGC7000. Anything else uses the RA/DEC from your subs'
FITS header automatically.
Stages & resume
Stage names are per-mode. Run aporn-tool status to see yours. Current orders:
| Mode | Stages (what --from / --redo accept) |
|---|---|
dso-galaxy |
calibrate โ register โ stack โ spcc โ bge โ denoise โ finish |
dso-reflection-nebula |
calibrate โ register โ stack โ spcc โ bge โ denoise โ finish |
dso-emission-nebula |
calibrate โ register โ stack โ mirrorx โ finish |
dso-star-cluster |
calibrate โ register โ stack โ mirrorx โ finish |
dso-milky-way |
register โ stack โ anchor โ bge โ denoise โ finish (convert is merged into register; no calibrate/mirrorx/SPCC); --no-tripod appends โ deghost |
A stage is only marked done after its output is verified (exists, non-empty, right type). A
crash or a raising stage is marked failed and reported with the log tail. Re-run to resume.
Changing a parameter re-runs that stage and everything downstream, nothing upstream.
Output layout
<OUT>/ โ DELIVERABLES ONLY
โโ M31_final.tif โ 16-bit, the real deliverable
โโ M31_final.png
โโ M31_final.jpg โ quick-look
โโ M31_final.fits
โโ _work/ โ everything scratch, hidden here
โโ M31/
โโ 00_lights/ hardlinked .fit subs
โโ 01_process/ SIRIL sequences + frames
โโ 02_linear/ M31_Linear.fit โ GOLDEN ANCHOR (never deleted)
โโ 03_graxpert/ BGE / denoise intermediates
โโ 05_finish/ finish scratch
โโ logs/ generated .ssf + per-stage stdout
โโ aporntool.json run manifest / resume state
Multiple targets can share one --out; each gets its own _work/<target>/ and deliverables at
the root.
Configuration file
Every tunable parameter lives in one file, aporntool.config.json โ tool paths, Seestar optics,
local Gaia catalogs, and a pipeline block with every processing knob grouped by stage/mode.
The file is optional and appears out of the box: the first run writes it (all defaults) next to
you, editing a value overrides just that knob, and deleting the file restores every default. You can
also write it on demand:
aporn-tool config --init # write the file pre-filled with ALL defaults, ready to edit
aporn-tool config --check # same, and verify Siril/GraXpert/StarNet are discoverable
{
"tool_paths": { "siril": "โฆ", "graxpert": "โฆ", "starnet2": "โฆ", "ffmpeg": "โฆ" },
"seestar_focal_mm": 150.0,
"seestar_pixel_um": 2.9,
"catalog_astro": null,
"catalog_photo": null,
"pipeline": {
"stack": { "sigma_low": 3.0, "sigma_high": 3.0, "feather_mosaic": 100, "filter_round": "2.5k", "filter_wfwhm": "2.5k" },
"graxpert": { "bge_smoothing": 0.0, "bge_correction": "Subtraction", "denoise_strength": 0.8 },
"crop": { "bg_frac": 0.25, "margin_frac": 0.02, "target_blocks": 700 },
"spcc": { "sensor": "Sony IMX662", "osc_filter": "UV/IR Block", "whiteref": "Average Spiral Galaxy", "catalog": "localgaia" },
"mosaic_finish": { "autostretch_clip": -2.8, "autostretch_bg": 0.15, "ght_d": 0.8, "ght_b": 3.0, "ght_sp": 0.15, "ght_hp": 0.85, "rmgreen": 1.0, "satu": 0.7, "star_reduce": 0.5 },
"emission_finish": { "subsky_degree": 1, "satu": 0.7, "satu_bg": 0.1 },
"cluster_finish": { "subsky_degree": 1, "denoise_mod": 0.5, "ght_d": 0.7, "ght_b": 3.0, "ght_hp": 0.9, "satu": 0.6, "satu_bg": 0.1 },
"reflection_finish": { "target_bg": 0.35, "shadows_clip": -2.8, "sat_r": 0.30, "sat_g": 1.3, "sat_b": 4.5, "midboost": 0.55, "lc": 1.3, "bgpull": 0.08, "gamma": 0.85, "bg_desat": 0.14, "bg_desat_soft": 0.14, "st_bright": 1.5, "st_sat": 1.2 },
"milkyway_finish": { "bge_smoothing": 1.0, "bge_correction": "Subtraction", "denoise_strength": 0.8, "autostretch_clip": -2.9, "autostretch_bg": 0.10, "rmgreen": 1.0, "satu": 0.85, "satu_bg": 0.1 },
"no_tripod": { "barrier_pct": 85.0, "barrier_dilate": 4, "feather": 12.0, "min_island_frac": 0.002, "fg_target_bg": 0.10, "fg_shadows_clip": -1.8, "fg_gain": 0.6 },
"jpeg_quality": 95
}
}
Guards (a hand-edited file can't break a run): no file / deleted / empty / corrupt โ all
built-in defaults (a corrupt file just warns and falls back). A partial file overrides only the keys
it sets; missing keys, unknown keys, and wrong-typed or non-finite values are ignored and keep their
default. Change a value and re-run: only the affected stage recomputes (a stretch tweak โ just
finish; a stack/crop change โ from that stage), reusing the golden linear stack.
Precedence: an explicit CLI flag beats the config โ e.g. --star-reduce 0.3 overrides
pipeline.mosaic_finish.star_reduce. Tool-path resolution: explicit config path โ PATH โ
known install locations.
Scope: pipeline holds the tunable look dials. Rig optics (seestar_focal_mm / pixel_um)
stay top-level (they describe the scope, not the processing), and a few deep reflection-algorithm
internals (white-point percentile, bloom kernels) remain structural constants โ ask if you want
any of those exposed too.
FAQ
Do I need darks/flats/bias? No. The Seestar calibrates internally. For other rigs, calibrate
your subs beforehand (the tool ingests already-calibrated .fit).
How many subs do I need? More integration is the biggest quality lever. Combine nights with
repeated --in. There's no hard minimum, but a handful of subs won't stack meaningfully.
Will it delete my raw data? No. Subs are hardlinked into _work/00_lights/; the golden linear
stack and your originals are never overwritten.
Can I re-process without re-stacking? Yes, that's the point of the golden anchor. Tweak a
finishing parameter and re-run; only finish (or the changed stage onward) recomputes.
It didn't crop the mosaic tightly. Auto-crop trims the black/near-empty borders, but it
thresholds on brightness rather than per-pixel coverage, so a noisy low-coverage band can survive
on mosaics (those edge pixels are normalized to near the sky level). Pass an explicit
--crop "X Y W H", or do the final crop by hand in Canva/Photoshop. Tighter mosaic cropping is on
the roadmap.
Which mode for the Pleiades (M45)? It's an open cluster in blue reflection nebulosity, so use
dso-reflection-nebula, not the plain cluster finish.
Does it need a GPU? No. GraXpert uses the GPU when available and falls back to CPU.
Troubleshooting
| Symptom | Fix |
|---|---|
StarNet2 not found (galaxy/emission/reflection) |
The composite finish calls the StarNet2 CLI directly - set tool_paths.starnet2 in the config or put it on PATH. |
| Preflight: GraXpert models missing (but installed) | Open GraXpert, run BGE + Denoise once so it downloads the model files. |
| SPCC "no stars" / imprecise | Install the Gaia region matching the target (Milky Way vs Galaxy Season). |
--out path must not contain spaces |
Choose a space-free output folder (SIRIL limitation). |
golden anchor not found on --from/--redo |
Run the full pipeline first (drop --from/--redo) so preprocess produces the anchor. |
| Plate-solving fails on a mosaic | Ensure SIRIL's astrometry catalog is installed; the tool verifies solves by frame count, not exit code. |
| Noisy/ragged band left after auto-crop | Known mosaic limitation (brightness-based crop misses low-coverage edges). Pass --crop "X Y W H", or crop in post. |
Every stage saves its SIRIL script and stdout under _work/<target>/logs/. Check <stage>.log
for the exact tool error.
Limitations
- Deconvolution / wavelets are skipped for undersampled Seestar data (they amplify noise without adding real detail).
- The last 5% (final crop, curves, watermark) is done by hand from the 16-bit TIFF.
- Planetary needs a manual AutoStakkert stacking step (no usable CLI) and is not yet shipped.
- Auto-crop trims black borders but can leave a noisy low-coverage band on mosaics (it crops by
brightness, not coverage). Tighten with
--cropor in post; a coverage-aware crop is planned.
Development
.venv/bin/python -m pip install -e . pytest pytest-timeout
.venv/bin/python -m pytest -q # unit suite; external tools are mocked
Tests mock Siril/GraXpert/StarNet, so they run anywhere. Integration runs need the real tools and real subs. See REQUIREMENTS.md for the full design, the per-mode pipeline contract, and the load-bearing SIRIL/GraXpert/StarNet gotchas.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file aporn_tool-0.6.1.tar.gz.
File metadata
- Download URL: aporn_tool-0.6.1.tar.gz
- Upload date:
- Size: 87.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
963f393f4b8a5ee351e7c3daeee3c961d5639662bf255cb6274078bd552cf2f2
|
|
| MD5 |
33a0d530487d4e9d4244d6755b5bfae5
|
|
| BLAKE2b-256 |
8d5d3cc6b3912b15c01dae57b4dc865505b400beea3521f5e3c5f4fd0ea22656
|
Provenance
The following attestation bundles were made for aporn_tool-0.6.1.tar.gz:
Publisher:
workflow.yml on christiantroyandrada/aporn-tool
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
aporn_tool-0.6.1.tar.gz -
Subject digest:
963f393f4b8a5ee351e7c3daeee3c961d5639662bf255cb6274078bd552cf2f2 - Sigstore transparency entry: 2210617751
- Sigstore integration time:
-
Permalink:
christiantroyandrada/aporn-tool@b807a39faadff76768c0f7dbe7718bf3c5b03e4f -
Branch / Tag:
refs/tags/v0.6.1 - Owner: https://github.com/christiantroyandrada
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
workflow.yml@b807a39faadff76768c0f7dbe7718bf3c5b03e4f -
Trigger Event:
release
-
Statement type:
File details
Details for the file aporn_tool-0.6.1-py3-none-any.whl.
File metadata
- Download URL: aporn_tool-0.6.1-py3-none-any.whl
- Upload date:
- Size: 70.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c7f49e6e07e05b7e074488e05c9499473c611e60dffa767093f6b4de8fa89704
|
|
| MD5 |
37888a8f61a590ad7189e7dbf0473175
|
|
| BLAKE2b-256 |
3a65cac6aa358bb7101453ef8e463ce360db0dc9ead57d6df09b68d9667bbbba
|
Provenance
The following attestation bundles were made for aporn_tool-0.6.1-py3-none-any.whl:
Publisher:
workflow.yml on christiantroyandrada/aporn-tool
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
aporn_tool-0.6.1-py3-none-any.whl -
Subject digest:
c7f49e6e07e05b7e074488e05c9499473c611e60dffa767093f6b4de8fa89704 - Sigstore transparency entry: 2210617774
- Sigstore integration time:
-
Permalink:
christiantroyandrada/aporn-tool@b807a39faadff76768c0f7dbe7718bf3c5b03e4f -
Branch / Tag:
refs/tags/v0.6.1 - Owner: https://github.com/christiantroyandrada
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
workflow.yml@b807a39faadff76768c0f7dbe7718bf3c5b03e4f -
Trigger Event:
release
-
Statement type: