Beyond one image

A stack is what a night becomes

Integration collapses the time axis and hands back one image. What happens next is where most of the work is: making that image better, and reading what the frames behind it still know.

M51 · Whirlpool Galaxy · Hα

NGC 6888 · Hα · 104 subs over six nights. Rendered by the app from this session's own frames — nothing here was drawn by hand.

Session replay

Watch the night arrive

Each frame is added in the order it was shot. The image is the stack as it stood at that moment; the curve underneath is signal-to-noise measured on the same patch of sky, not predicted from an equation. Where the two diverge, something happened — cloud, a focus drift, a frame that should not have been kept.

The strip along the bottom is every sub in the session, in time order, with the rejected ones marked. Six nights, twenty months apart, read as one sequence.

It reads what integration already wrote, so producing one costs no re-stacking. It does need the registered frames to still be there: delete them to reclaim the disk and this is what you lose.

Data Library

Point it at twenty years and nothing moves

Indexing reads FITS headers and writes one database. No file is moved, renamed or modified, which is what makes it safe to aim at an archive you have been adding to since before you knew what you were doing. Then Preview works out where everything would go and writes that plan to a file — still without touching anything.

This is Preview in the app, on a real archive: 2,847 frames, 104.6 GB, of which 2,083 would move, 722 would be left where they are and 42 need you to decide. Each row is a destination folder it worked out; open one and it lists the frames that would land there, and where each of them is now.

The app's Preview: 2083 frames to move, listed by destination folder, with one folder opened to show the frames going into it
One folder of 135 darks, told apart by exposure and sensor temperature into seven — the opened row is the 29 that are 30-second darks at +5 °C. Nothing on disk has changed at this point; the plan is a file.

And one the plan shows a row at a time

  • YZbootis/YZbootis_20260328/YZBootis332
  • YZbootis/YZbootis_20250430283
  • YZbootis/YZbootis_20260326/YZ Bootis93
  • YZbootis/YZbootis_2025042981

Four folders, three spellings, one star.

One target, one night per folder, one filter each

  • targets/YZbootis/
  • YZbootis_20260328/g113
  • YZbootis_20260328/r110
  • YZbootis_20260328/i109
  • and the other three nights, the same way457
Across the whole archive, 42 source folders became 116 under targets/, nights/ and calib/.

Neither of those is a folder-name rule. The darks were separated by their exposure and sensor temperature, and the star's frames were grouped by where the telescope was actually pointing — because folder names, file names and the OBJECT header all lie, and two of the three routinely agree on the same mistake. Where they disagree, the frame goes to a review list instead of being filed on a guess.

Nothing is destructive by accident: Apply is a separate button, Copy keeps the originals, and the last run can be undone. Folders you did not tick are still indexed — they take part in calibration matching and duplicate detection — but nothing inside them is ever touched.

NGC 6888 at the nebula's edge before denoising: the sky carries visible grain The same crop after AstrylAI Denoise: the sky is clean and the filaments and stars are unchanged Before AstrylAI Denoise
NGC 6888 · Hα · the edge of the shell in the 104-sub stack — drag the handle. One stretch, measured on the input and applied to both sides; shipped model, the settings the window opens with.

AstrylAI

A trained model, running on your machine

It does not generate anything. Denoise is trained to undo one thing that happened to your photons — the noise the sensor added — and it cannot put in structure that was not in the frame, because nothing in it is built to invent.

It is an engine inside the ordinary Denoise process: you pick it per image, and the classical implementation stays where it was. It runs locally through a compatible GPU when there is one and on the CPU when there is not. No image leaves the computer.

Removing more noise is not the same as being better; a model that smooths harder wins on every noise statistic and loses the faint structure you were stacking for. So the model that ships is the one chosen by looking at real frames at the stretch you would actually view them, not the one with the lowest number. The two measurements written to decide the last release both disagreed with the eye, and the eye won.

NGC 6888 in HOO — the field used to develop and test the post-stack tools
NGC 6888 · HOO. The field these tools were tested against.

Variability and transients

Every one of these produced convincing fakes first

Registered frames share one coordinate system, so a fixed aperture at a fixed position measures the same star in all of them. That makes two more things nearly free. A light curve per star, judged as excess scatter over the session's own noise-versus-brightness trend. And a cross-check against Gaia that flags sources with no counterpart — on public frames of M101 it recovered SN 2023ixf to within 0.4 arcseconds.

Both are mostly a fight against things that look like discoveries. Noise peaks near zero flux. Saturated cores that lose light as the seeing changes. Cosmic ray tracks, which are narrower than the point spread function and so are caught by shape rather than size. And above all nebulosity in the sky annulus, which moves the measured background around with the seeing — on this field it produced eight of nine false candidates.

Each of those was found by looking, not by theory, and each is gated now, relative to the field's own stars — so a clean field excludes nothing and there is no per-target tuning to get wrong. What comes out is still a list of candidates, not calibrated photometry, and "absent from Gaia" does not mean "new".

Ask about using it
What integration records about every frame
 Kept, not discarded
Quality scoreStar count, FWHM, eccentricity and measured noise, combined into the weight that frame carried into the stack.
Alignment residualHow far the tracked stars scattered after registration, per frame — the number that tells you a sub was soft before you go looking at it.
Why it was rejectedRejected frames stay in the record with their reason. A frame you disagree about is one you can go back and look at.
Where it livesA plain CSV next to the stack, one row per frame. Nothing to export and no project file to open it with.

Where this is going

Some of it already runs as an engine with no window on it yet; some is a decided direction with the work still ahead. Each one says which. None of it is in the beta and none of it has a date.

An MCP server for your archive

For the questions that need a reader rather than a rule: a target name typed on a Korean keyboard with the input method left in English, or the one frame between two targets still carrying the previous name. The tools are the ones that answer questions — what is in here, what happened on this night, which darks match this light, what field is this — and they exist as plain Python calls already, because the engine runs without a window. The line is fixed and narrow: judgement about which file is what goes to the model, arithmetic on pixels stays in code, and nothing that writes a pixel is ever exposed to it. Anything that changes something goes through the same plan → journal → undo the file organiser uses, which moved 6,743 frames with every one reversible, and every answer carries its evidence — “NGC 6543, 0.0′ from centre, solved at 0.08″ RMS”, never just the name. Argued out against a real archive of 11,031 frames; not yet written.

Mosaics that are actually reprojected

Panels are inverse-projected through each frame's own WCS, feathered, and levelled against each other — so a tile carries its true rotation instead of being a rectangle pasted at a coordinate. The hard part is not the geometry: it is the background, where a plane fit moves things several times more than a constant does. Engine written; no window yet.

Smart telescopes, end to end

A night from a smart telescope arrives as a folder and wants no decisions taken: watch it, calibrate, register, integrate, and say plainly what the night produced. Every step of that already exists here — what is missing is enough real output from those cameras to measure against, which is the next thing being collected.

A map of what you have shot

Every finished stack under a folder, placed on the celestial sphere, so a year of work can be looked at as a map instead of a directory listing. Position comes from a solved plate first and the mount's pointing last — when two sources disagree by more than a degree the field is marked suspect rather than quietly drawn in the wrong place. Engine written; no window yet.

Dust, found in the flat

A master flat records exactly where every dust shadow was, which makes locating them a measurement rather than a guess. Nothing is removed — the point is to tell you how much a flat carries, and to catch the case where a flat reused from another session no longer matches the dust that is on the glass tonight. Engine written; no window yet.