About this tool

Star Trail Stacker is a browser-local astrophotography workspace built for star trails, registered deep-sky integration, fixed-ground nightscapes, Planetary SER lucky stacks and reusable RAW calibration masters. It was built for a photographer who wanted that work on a Mac without installing anything.

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.

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, RAW Lights need readable survey previews, 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; five governed camera-written DNG samples have passed bounded Node pixel proof, while browser evidence is limited to one-frame intake/refusal. 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. The current decoder refuses four classes by name: Nikon High Efficiency NEFs, already-demosaiced linear DNGs, Fujifilm GFX medium-format frames, 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 measured comparison now spans three instruments and four nights, and its size still varies sharply with sky stability. 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 below, including its zlib and libjpeg notices. Nothing on the page is fetched from anywhere except this domain and one cookieless analytics collector.

The RAW decoder, and the source we owe you

The third-party image component is LibRaw 0.22.2, compiled with its disclosed zlib and libjpeg components to one 804 KB WebAssembly module. It parses RAW containers and hands back the sensor’s values, and is fetched only when you drop a RAW file. The demosaic — the step that turns one colour per photosite into a colour picture — is ours; LibRaw’s own development pipeline is not called.

LibRaw is dual-licensed and we have taken it under the CDDL-1.0, which requires us to publish the exact source we compiled, the licence text, and a way for you to reach both. Not a link to somebody else’s download page — these files, the ones this build was made from:

The GPL demosaic packs are deliberately absent and the build refuses to run if they appear, because publishing GPL files inside a CDDL distribution is the mistake that exclusion exists to prevent.

Code that is ours and design that is not

Attribution is not only about copied source. The frame-registration engine — the part that measures how far one exposure moved against another, to a fraction of a pixel — is written here, in JavaScript, with no line of anyone else’s source in it. Its method is somebody else’s: the triangle-invariant asterism match, the closed-form similarity fit, the star detector. Those come from published work that carries notices, and a notice nobody can reach is not a notice, so it is published as part of this site rather than kept in a repository:

Who made it

Vitali Bibikov, who wanted this work done on a Mac without installing anything and wrote the tool rather than keep looking for one. His code is at github.com/vitalybibikov.

The night photographs on this site are his own, shown with permission and named 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 380-frame star trail on why trails come out dotted. They are photographs of real nights, not stock, and every panel built from them is this tool's own output on the raw files.

Getting in touch

Support is currently unavailable. If a sequence will not stack, record the camera, file format and exact message without sending the photographs; the contact page carries the current status.

Code-native architecture map carrying local files and EXIF through browser decoders, one worker, output encoders, and local PNG or FITS downloads
Code-native architecture diagram of the published browser-local data path. It is not runtime tracing, camera output or a performance benchmark.