Less satellite. More sky.

About Star Trail Stacker

Star Trail Stacker turns a sequence of night photographs into one finished picture, in your browser. Choose the look, check every change and save a file your editor can open.

I’m Vitaly Bibikov, and I photograph the night sky. I built this tool because satellites and aircraft kept drawing lines across my star trails. It takes those lines out on your own device; your photographs never leave it.

Open the appExplore the features

Star trails above a field and tree line, processed from thirty Sony A7C exposures
Thirty Sony A7C frames. Photograph by Vitaly Bibikov; stacked with this tool.

Who made it

I’m Vitaly Bibikov. I photograph the night sky and build this tool in my own time. Find me on GitHub.

My own night photographs appear throughout the site, credited where they appear: the light-polluted field with the hay bales, the Tenerife sky on why the Milky Way disappears from most skies, and the 389-frame star trail on why trails come out dotted. They are photographs of real nights, not stock. The comparisons made from these nights use this tool’s output, with source and processing details credited alongside.

Choose what you want from the night

Getting in touch

Support is available by email. If a sequence will not stack, send the camera model, the file format and the exact message — not the photographs. The address is on the contact page.

Technical details

For readers who want the method: what each mode does and refuses, where the measured numbers come from and what the page is built from. The licences and the source we publish are on the credits page.

Processing details and current limits

What it is

A browser-local astrophotography workspace. It builds star trails, makes a fixed-tripod Nightscape with a separately stacked sky and frozen foreground, integrates registered Deep sky Lights, builds explicit dual-alignment Comet results, ranks and globally aligns one Planetary SER into explicit Best-X variants, and builds reusable RAW calibration masters from dark, flat, bias and dark-flat frames. The Deep sky path accepts one homogeneous rendered-raster, supported-RAW or asserted scientific-linear FITS Light family, optionally calibrates matching RAW frames before demosaic, and requires a measured star-registration warp for every included Light after the first reference.

Deep sky offers mean, exact median and sigma-clipped mean, with at least eight Lights required for clipping. Frame quality remains visible, but only the photographer's manual exclusions remove Lights. It produces both a display-stretched 16-bit PNG and the signed, unclamped integration as 32-bit Float32 FITS with R, G and B planes.

The star-trail path measures each frame, equalises its sky background, combines the night in linear light, repairs bounded gaps and hands you a 16-bit PNG or, if selected before the run, an uncompressed 16-bit TIFF.

What it deliberately is not

Deep sky accepts one homogeneous rendered-raster, supported-RAW or explicitly asserted scientific-linear FITS Light family. It refuses Master, Reference and Mask inputs; it does not yet choose a reference, cull automatically on quality, weight frames, or export rejection or weight maps. Non-overlap is filled with zero unless the optional common-overlap crop is selected, a RAW Light with no readable preview is surveyed from its own sensor data, and exact median or sigma clipping may be refused when their retained frames exceed the browser memory ceiling.

Comet mode accepts one homogeneous JPEG, PNG, WebP or TIFF sequence or one explicitly confirmed already-calibrated scientific-linear FITS Light sequence, one explicit nucleus mark per included Light, and one explicit shared reference. It exports star-aligned, comet-aligned and same-grid composite results as separate 16-bit PNG and signed Float32 FITS pairs. It does not infer a missing marker or accept RAW, calibration, master, imported Reference or Mask inputs. Planetary is limited to one uncompressed MONO/RGB/declared-BGR SER, automatic or explicit ROI, global translation and an optional measured surface-local mesh. It can apply wavelet sharpening, measured drizzle when sub-pixel landing supports it, and Richardson-Lucy deconvolution when the frame contains enough stars to measure a point-spread function. It still has no general video input, calibration roles or RGB shift fitting. There is no video export or batch output. There is no machine-learning model in the Planetary path. Nightscape remains deliberately fixed-tripod.

It reads Canon CR2 and CR3, Nikon NEF, Sony ARW, and compatible Fujifilm RAF, and a phone's DNG: three 50-frame night runs from a realme 12+ 5G stack whole in Chromium, Firefox and WebKit, while a camera body's own DNG has only bounded Node pixel proof, one file at a time. Olympus and OM System ORF, Panasonic RW2 and Pentax PEF files are read too: two camera-created pairs of each — from an E-M1 Mark II and an E-M10 Mark IV, a Lumix GH5S and a Lumix S5 IIX, and a K-3 Mark III and a K-1 Mark II — stack two frames at a time in Chromium, Firefox and WebKit. A guided Pentax 645Z night of PEF files stacks whole in the same three browsers, in Deep sky and in Star trails (data: Wei-Hao Wang, used with his permission). The current decoder refuses three classes by name: Nikon High Efficiency NEFs, already-demosaiced linear DNGs, and legacy Fujifilm SuperCCD files with rotated sensor geometry. Each refusal gives a usable next step instead of guessing at pixels the current pipeline has not validated.

One small difference in the tools compared here is this site’s per-frame background equalisation before the blend. It is perhaps thirty lines of code, not a claim that nobody else could do it. If another tool adds the same option, that will be a good outcome for everyone photographing under a city sky.

Where the numbers come from

The measurements use real camera frames and backgrounds. The primary set is 38 sixteen-second exposures from an all-sky camera in Copenhagen, published on Zenodo as record 3736793 under CC-BY-4.0; the replication is 35 frames from the same instrument on a different and much worse night, record 3754088, also CC-BY-4.0. The noise, sky gradient, stuck pixels and streetlight in those frames are real. Controlled probes — injected faint stars, known-colour stars and streak crossings — are synthetic by design and are labelled as such; their trajectories and backgrounds come from the real frames.

The historical local-background comparison spans three instruments and four nights, and its size varies sharply with sky stability. It has not yet been repeated for the current colour background method. It does not include a fixed-tripod dark-sky DSLR session of 60 or more frames with matching calibration frames, so it is not a field-quality claim for that use case. That is why the tool measures your drift and shows your files side by side instead of quoting one headline number. The full measurement.

What it is built from

Plain JavaScript with no framework or bundler runtime. The PNG and TIFF decoders, EXIF reader, background model, demosaic and PNG encoder are written for this site. The one third-party image component is the disclosed LibRaw WebAssembly bundle listed on the credits page, including its zlib and libjpeg notices. Unless you accept the optional session recording, nothing on the page is fetched from anywhere except this domain and one cookieless analytics collector.

Code-native architecture map carrying local files and EXIF through browser decoders, one worker, output encoders, and local PNG or FITS downloads
Code-native diagram of how your files travel inside one browser tab — not a recording of a run.

In short: your files are read in this browser tab, decoded, measured and combined by a worker in the same tab, and written back as a file you download. No server sees an image.