Skycruncher logo Skycruncher experiment, Oct 2026

Can we recreate the night sky? Close enough to fool our engine, mostly.

We built a program that renders a Seestar S30 Pro smart telescope's raw frames out of catalogs and sky surveys: the stars from Gaia, the galaxies from galaxy catalogs, the nebula from survey maps, all passed through a measured model of the telescope, its sensor and its mount. None of our own pictures go in. Then we handed those frames to our own processing engine to see whether it treats them the way it treats the real thing, and rendered whole synthetic stacks to set beside our real ones.

Exploratory Most of this was measured on nights the generator was built and tuned on. On a night it had never seen, it partly held up: stars, positions and sizes yes, star color and sensor noise not yet.

18 of 18synthetic frames our engine solved, in two filters
1,079–3,106stars confirmed per frame, every one a star we drew
0.95–1.03brightness of the same 1,617 stars, synthetic over real, in all three colors
1.06 · 1.12the nebula's green and blue against its red, synthetic over real, with [O III] added (0.53 and 0.68 before), on a frame used in the fit
Real and rendered

Drag the divider

A synthetic stack of NGC 7000, rendered from catalogs and survey maps Our real stack of NGC 7000, 752 subs of 10 seconds
NGC 7000, the North America Nebula, through the LP filter. Left: our own stack of the night of 19 September 2026, 752 subs of 10 seconds with the cloudy ones left out. Right: a synthetic stack, the same sky rendered at the stack's total exposure (about 1.9 hours) and geometry, with the noise that 752 subs leave. One white balance, measured on the real stack's own stars, and one stretch for both. The real stack's cyan reflection around the bright star at lower right is something the synthetic has no term for.

A stack is many short exposures (subs) lined up and averaged, which beats the noise down. The synthetic stack is not hundreds of synthetic subs averaged: the generator draws the sky once without noise, at the real stack's own geometry, then adds the noise a stack of that many subs has. We checked that shortcut: 32 noisy synthetic subs averaged land on the expected noise within 1 %. In the emptiest patches, the synthetic stack's noise is 0.81, 0.96 and 0.92 of the real one's in red, green and blue.

Quiz: which one is real?

Five rounds. Each shows two pictures of the same target, one real and one fake. Pick the one you think is real. Every real side is a stack from one of our own telescopes, a Seestar S30 Pro or our Outpost Seestar S50.

The fakes in this quiz are forward models: survey images of the galaxy or nebula (Legacy Surveys, Sloan, Pan-STARRS, IPHAS), or for the plain star field none at all, projected onto our own stack's pixels through our measured star shape and colors, with Gaia stars drawn in and our stack's measured noise added. That is a different thing from the synthetic frames in the rest of this page, which draw every star from the Gaia catalog through a full model of the camera, and which test whether our engine is fooled, not whether you are.

The quiz needs JavaScript.

Picture credits: Legacy Surveys DR10 (DESI Legacy Imaging Surveys), Gaia DR3 (ESA/Gaia/DPAC), IPHAS DR2 / IGAPS (INT Photometric H-alpha Survey of the Northern Galactic Plane), Sloan Digital Sky Survey DR9 (via CDS hips2fits), Pan-STARRS1 DR2 (PS1 image cutouts, STScI MAST).

Why fake a sky?

Every check we run on our engine leans on real photos, and real photos have a problem: nobody knows the right answer. Nobody knows exactly where every star in a real frame sits or how bright it truly is, so a real photo can tell us whether the engine is consistent, not whether it is right. A synthetic frame comes with its answer key. We know every star's true position and brightness, the true pointing, the true lens distortion and the exact noise draw, because we put them there.

I want two things out of it. First, synthetic frames our engine handles the same way it handles the real ones, so a twin can stand in for a real test frame and the real ones can retire. Second, a way to push past anything a real night gives us and see how the engine breaks (more at the end).

“The same way” needs a definition, because a synthetic frame has its own random noise and will never match a real one pixel for pixel. My bar: same decisions, numbers within stated errors. The engine should make the same calls on the synthetic frame as on the real one (solve it, accept the same kinds of stars), and every number it reports should land within its own stated error of the truth.

A few words used below. A sub is one single exposure, here 10 seconds. A plate solve works out exactly where the telescope was pointing by matching the stars in a frame to a catalog. A twin is a synthetic frame rendered for the same time, place, pointing and camera settings as one real sub. Gaia is the European Space Agency's star-mapping mission; its catalog gives each star's position, motion and brightness.

How you build a sky

The generator builds one sub a layer at a time, then passes it through the camera. Each layer is a model with measured numbers in it. Step through them on part of an NGC 7000 sub; each step adds to the one before. One frame takes about 15 seconds on one graphics card, about a minute with the nebula and every faint star.

Gaia stars as round catalog dots Stars drawn with the measured optics The nebula added Sky glow added The finished synthetic sub with sensor noise The real sub from the same moment
Every Gaia star in this patch to magnitude 19, each a round dot at its catalog position: a star-chart symbol, bigger for brighter stars, before any optics. One white balance and stretch throughout.

Underneath it all is the mount: the generator turns the field exactly as an alt-azimuth mount does, or holds it still as an equatorial one does, with whatever is wrong with the mount on that night (a tilted tripod, a polar axis off the pole, gear error, shake; more below). It renders both of the Seestar's filters: the dual-band light-pollution filter (LP) and the plain IRCUT filter.

The same seed always gives the same file, byte for byte. And the parts we wrote were checked against code we didn't write: 300 stars drawn by our renderer and by the astropy and photutils libraries agree in total light to 0.01 % (0.9999).

The test

Does our engine fall for it?

Stacks are what people look at, but our engine works on subs, one 10-second exposure at a time. So the test is at the sub level.

The real stack of 752 subs, the same crop One real 10-second sub of the Cygnus Wall
What one sub looks like. Both sides are real: a single 10-second sub of the Cygnus Wall beside the stack of 752 such subs, the same crop, white balance and stretch. The sub carries about 27 times the stack's noise. The engine works on subs like the one on the left.

We rendered 18 synthetic subs with every setting at its measured, typical value: eight through the LP filter (six of NGC 7000, two of M 31) and ten through IRCUT (four of M 31, six of M 33). Each borrows its time, pointing and conditions from a real sub, and none of the 18 was used while building the generator. Then the engine ran on each one exactly as it runs on a real sub. The pass marks below were written down before the first frame existed.

A synthetic NGC 7000 sub A real 10-second NGC 7000 sub
One real 10-second NGC 7000 sub beside its synthetic twin, cropped to where the Hα survey covers, one white balance and stretch for both.

It solves every frame, and confirms only stars we drew

The engine solved all 18, at the right pixel scale (within 0.06 to 0.08 %; the bar was 0.5 %) and with a match score of 1,530 to 4,141 against its acceptance bar of 20.7. Then it confirms stars one by one: 1,079 to 2,296 on each LP frame, 1,433 to 3,106 on each IRCUT frame. Not one confirmed star was a star the frame didn't contain.

LP frameIRCUT frameone real NGC 7000 sub, same night: 2,152pass mark: 500
Stars confirmed per frame. For scale, the same engine confirmed 2,152 stars on one real sub from the NGC 7000 night; the real subs behind the other frames were not run. The IRCUT frames confirm more faint stars because that filter lets through more starlight.

Same stars, same brightness

The engine measured the same 1,617 stars on a synthetic frame and on its real sub. Synthetic over real: 1.00 in green, 1.03 in red, 0.95 in blue. Six NGC 7000 twins, each rendered through its real sub's own sky clarity, give the same picture with plain aperture sums. We expected 0.90 to 1.05; four of the 18 values came in over, up to 1.09 (green on twin 5).

engine, same 1,617 starssix twins, aperture sumsrange expected before the twins ran
The star-to-star scatter is 0.28 to 0.40 magnitudes. That holds the real frame's own noise and nebula and the catalog color model's 0.15 to 0.25 magnitudes; the ratios shown are medians.

Geometry, graded against the answer key

Because we know where every star truly is, we can grade the engine's geometry against truth rather than against itself. Its pointing model sits 0.14 to 0.18 pixels from truth in the middle of the frame and 0.51 to 0.60 in the corners (pass marks 0.3 and 2.5). The fit error it states for itself is two to four times its true error: it overstates, the safe direction. The positions of bright confirmed stars are off by a median of 0.27 to 0.43 pixels, worse than our guess of under 0.1 (that guess was wrong), but on every frame within the factor of two of the engine's own stated position error that we set as the bar.

true error, against the answer keythe error the engine states
Pointing model: the root-mean-square distance between where the engine's plate solution puts the confirmed stars and where they truly are, beside the fit error the engine reports. Above the blue dot is honest; below it would be overconfident.

The background noise

The empty sky between stars has a texture: noise from the light itself and from the sensor. On an IRCUT M 31 twin it matches the real sub within about 3 % in every color. On LP the first version, which drew no nebula, matched green within about 5 % but came out quieter in red and blue, because the real frame's nebula adds its own texture there. With the Hα nebula on, red and blue were still quieter (31.7 against 37.1, 37.4 against 41.3); that was measured before the [O III] term was added, and has not been measured again since.

48.9 / 47.4IRCUT green, synthetic / real (counts)
72.6 / 74.1IRCUT red
74.1 / 75.6IRCUT blue
26.7 / 28.2LP green, no nebula drawn
31.1 / 40.0LP red
38.5 / 46.0LP blue
The same stars cut from a real sub and its synthetic twin, side by side
The same stars, magnitude 6.4 to 12, cut from the real NGC 7000 sub (top) and its twin (bottom) at the sensor's own pixels. Each column has its own stretch, the same for both. Below about magnitude 12 both sink into a 10-second sub's noise.
Stars of magnitude 9.5 to 11.5 at the four corners and the center of the sub, real above and synthetic below
Stars of magnitude 9.5 to 11.5 at the sub's four corners and its center, real (top) and synthetic (bottom).

Up close: nebula and galaxies

Stars are the easy part. The nebula is drawn from two survey maps.

Its red light comes from the IPHAS survey's Hα map (Hα is the deep-red light of glowing hydrogen), turned into this camera's units. The conversion agrees with an earlier, independent fit of our own stack to 0.2 % (0.0522 against 0.0523 counts per survey unit). The red brightness was then pinned with six twins: three to fit the scale (2.1) and three held back to check it, which came in at 0.94, 0.97 and 0.89 of the real nebula against a pass mark of within 10 % (one missed, by 1 %).

Its green and blue light was the hard part. The Seestar's LP filter has a second window that passes [O III], green-blue light from oxygen (77 to 80 % of it), and Hβ, blue light from hydrogen (62 %). Hβ follows from the Hα by physics, and at the published amount of dust in front of the nebula it is already in the model: it moves green and blue by only −8 to +3 %. The rest comes from the blue plate of the second Palomar Sky Survey (DSS2), a photographic plate that recorded [O III], Hβ and starlight scattered off dust, with the stars removed and its photographic response straightened out. Six twins set its weight in green and blue. The fitted blue-to-green ratio, 0.75, is closer to [O III]'s 0.84 than to scattered starlight's 1.0 or Hβ's 2.0. With it, the nebula's green and blue against its red come within 6 % and 12 % of the real sub's (they were 0.53 and 0.68 of it). That color check was made on a frame used in the fit. On the held-back twins the brightness check narrowly missed: 6 of 9 within 15 %, where 7 were needed, and every miss follows how cloudy the frame was.

I've turned it on for this page anyway, and I'll come back to tuning it once haze and thin cloud are in the model (the misses track the clouds; see below). So the NGC 7000 stack pictures and the layer strip here have the [O III] term on.

The Cygnus Wall, synthetic stack The Cygnus Wall, real stack
The Cygnus Wall, real stack beside synthetic stack, one picture pixel per 2 × 2 block of sensor pixels. The wall's shape and the dark lanes come through from the survey maps.
An animation flipping between part of the real NGC 7000 stack and the same part of the synthetic stack
Flipping between the real stack and the synthetic stack, 0.9 seconds each. The stars hold still; watch the nebula's color and texture.

Galaxies, where we have a good model

The generator's galaxies come from catalog profiles: a smooth bulge and disk at a measured color, right in total light and wrong in detail (see below). Where we have fitted our own models of a galaxy, the synthetic stack can do better. The Leo Triplet's synthetic stack uses our own fitted models of the three galaxies, M 66's spiral arms included.

The Leo Triplet, synthetic stack The Leo Triplet, our real stack
The Leo Triplet (M 65, M 66, NGC 3628), IRCUT filter. Left: a deep Seestar S30 Pro stack, 738 subs of 60 s (12.3 h, 2026-05-16). Right: a synthetic stack at the same geometry and depth, with a stack's noise; its stars come from Gaia and its galaxies are our own GALFIT models fitted to this stack (so the galaxies are a description of these pixels, not a prediction): M 66 with its bar and two-armed spiral, M 65 with bulge, disk and a weak spiral, NGC 3628 with its thick disk bent by Fourier modes into the shape of its dust lane and warp (smooth light only, no dust absorption). Per-plane brightness of each galaxy calibrated on this stack; the twin's star light is scaled by 0.743 to match this stack's star photometry (its stars ran 1.35x bright, the same in every color: a zero-point difference of that unit and its 60 s subs, not a change of sky). The same mild gradient removal is applied to both sides; the real stack had a strong sky glow toward one corner.

Andromeda is harder. Its disk is laced with dust lanes no smooth model holds, so for M 31 the synthetic stack borrows them from a survey: the scanned red and blue plates of the second Palomar Sky Survey, divided by our smooth model to give a map that is darker in each lane and brighter on each arm. The plates saturate in the bright center, so inside about 11 arcminutes the core is our own model (with the fine detail from Pan-STARRS, which is not saturated there), blended in so no ring shows. The lanes land where the real ones are (smoothed to 15 arcseconds, real and synthetic dust maps correlate at 0.73, against 0.06 for the smooth model), about 8 % softer than real. The large-scale light is still our smooth model, and inside 20 arcminutes along the disk the real galaxy is 10 to 35 % brighter than it.

M 31, synthetic stack with dust lanes from survey plates M 31, the real stack
M 31 with survey dust, IRCUT filter. Left: the Seestar app's own stack of our 352 subs from 18 September 2026. Right: a synthetic stack at the same total exposure: stars from Gaia, the galaxy's large-scale light from our smooth model, its dust lanes and local color from the Palomar red and blue plates, and its core from our model. Compare the smooth version below.

The mount, too

A Seestar can track two ways. On an alt-azimuth mount (up-down and left-right) the field slowly turns on the sensor through the night. On an equatorial mount, one axis is aimed at the celestial pole and the field should hold still, unless that axis is off, the tripod is tilted, or the gears wobble. The generator models the mount as hardware with an axis that can be anywhere, driven by a controller that believes its own picture of where the axis is. Get the picture wrong and the stars drift and the field turns, by geometry rather than by a fudge factor.

Left: the camera frame on the sky once an hour, turning. Right: field rotation through the night, 134 degrees, measured on 906 subs and matched by the mount model
My NGC 7000 night on the alt-azimuth mount: the sky turned 134° in the frame over about four and a half hours. Dots: every sub's plate solve; line: the generator's tilted mount model, 0.07° rms.

The mount checks above test the model forward, on the same session it was sized on (with the twins' own block of subs left out). They are not a held-out confirmation.

What it gets wrong

The honest list. Each of these was measured, and each one is something a careful look at a real frame shows that our synthetic frame doesn't, or didn't until recently.

The nebula's green and blue: mostly fixed

Before the [O III] term, our nebula carried only about half the real nebula's green (0.43 to 0.57) and blue (0.48 to 0.68) light, because our only map was hydrogen-red. The blue Palomar plate now supplies the [O III] glow, and the color comes within 6 and 12 %. What is still open: the brightness check on held-back twins passed 6 of 9 (7 were needed); the plate places green light 1 to 4.5 % better than a plain tint of the Hα map but blue light no better; and one photographic plate cannot tell [O III] from starlight scattered by dust. A narrowband [O III] map would.

The red nebula stops at the survey's edge

The Hα map we hold covers only part of the field the camera swings through, 61 to 91 % of a sub. Past its edge the synthetic nebula's red light fades out while the real one carries on; only the faint pale light from the Palomar plate, which covers the whole frame, continues.

Thin cloud makes the nebula brighter against its stars

On the cloudier twins the real nebula reads brighter against its own stars than on the clear ones, in every color: about 12 % in red, and the [O III] fit wanted 1.2 to 1.6 times its clear-frame weight on cloudy frames. We measured why, on 732 subs of that night. It was thin cirrus: ice crystals that scatter light a few arcminutes forward (the large-particle form of Mie scattering, which looks like diffraction). Every star got a glow about 10 arcminutes across, flat to 2 arcminutes and down to a tenth by 9; its shape fits diffraction by crystals about 45 microns across, and the same glow, spread over the clear sky, predicts where the extra light lands across the nebula (correlation 0.82 to 0.89 in red and green). Starlight scattered out of each star's own core makes the star read fainter, while a big nebula gets light scattered in from its neighbors, so against its stars it reads brighter, and by exactly the amount the theory says: the excess grows as the inverse of the star dimming, the same in every color within 15 %, with the slope we predicted before measuring (0.17). Two things don't fit pure diffraction: the glow holds about 0.3 of the lost starlight where diffraction gives 0.5, and red isn't narrower than green as it should be. Clouds aren't in the generator yet; the design for adding them is written.

Real minus synthetic, the same sky twice. Each panel is a real sub minus its synthetic twin (stars, the H-alpha and [O III] nebula, the sky, all dimmed by the sub's own star transparency, with no cloud in the model), stars masked, smoothed over 2'. Left, 06:03 UTC, stars at 94 % of clear: nearly flat, within about 2 ADU (what is left near xi Cyg is mostly the telescope's own halo, which the model draws only in part). Right, 07:15 UTC, stars at 53 % of clear: the cirrus shows itself as extra light. A round glow about 10' across sits on every bright star (xi Cyg, 57 Cyg and the fifth-magnitude stars), and a broad glow lies over the body of the North America nebula. That is starlight and nebula light the cloud scattered a few arcminutes sideways: the stars lose it from their cores, but a nebula much larger than the glow gets it back from its neighbors, so under cirrus a nebula reads brighter against its stars than the stars' dimming says.
Real minus synthetic, the same sky twice. Each panel is a real sub minus its synthetic twin (stars, the H-alpha and [O III] nebula, the sky, all dimmed by the sub's own star transparency, with no cloud in the model), stars masked, smoothed over 2'. Left, 06:03 UTC, stars at 94 % of clear: nearly flat, within about 2 ADU (what is left near xi Cyg is mostly the telescope's own halo, which the model draws only in part). Right, 07:15 UTC, stars at 53 % of clear: the cirrus shows itself as extra light. A round glow about 10' across sits on every bright star (xi Cyg, 57 Cyg and the fifth-magnitude stars), and a broad glow lies over the body of the North America nebula. That is starlight and nebula light the cloud scattered a few arcminutes sideways: the stars lose it from their cores, but a nebula much larger than the glow gets it back from its neighbors, so under cirrus a nebula reads brighter against its stars than the stars' dimming says.
What the cloud adds, measured from the whole night. Every 1' patch of sky was fitted over 732 subs as two parts: light that dims exactly as the stars dim, and light that does not. Left: the sky a clear sub sees (star cores masked): the North America nebula, the Cygnus Wall in red, the dark Gulf. Right: the light that stays when the stars fade, which is what thin cirrus scatters (shown 1.8x brighter than the left). It is a glow around every bright star plus a soft copy of the nebula with almost none of its fine detail: the cloud blurs light over about 10'.
What the cloud adds, measured from the whole night. Every 1' patch of sky was fitted over 732 subs as two parts: light that dims exactly as the stars dim, and light that does not. Left: the sky a clear sub sees (star cores masked): the North America nebula, the Cygnus Wall in red, the dark Gulf. Right: the light that stays when the stars fade, which is what thin cirrus scatters (shown 1.8x brighter than the left). It is a glow around every bright star plus a soft copy of the nebula with almost none of its fine detail: the cloud blurs light over about 10'.
Patchy, not uniform. Each panel is the whole sensor (the raw frame's own orientation) on one sub: about 550 to 980 stars, each compared with its own clear-sky brightness, averaged over 12' and divided by the frame's median. The first panel is a clear sub (05:09 UTC), so its spread, 0.85 to 1.09, is the measurement's noise. Under the cirrus the spread is two to four times larger, 0.57 to 1.45 at 08:10 UTC, in bands and edges half a degree to a degree across, different in every panel (they are 25 to 75 minutes apart). A cloud term in the synthetic sky therefore needs a patchy transmission map, not one number per sub.
Patchy, not uniform. Each panel is the whole sensor (the raw frame's own orientation) on one sub: about 550 to 980 stars, each compared with its own clear-sky brightness, averaged over 12' and divided by the frame's median. The first panel is a clear sub (05:09 UTC), so its spread, 0.85 to 1.09, is the measurement's noise. Under the cirrus the spread is two to four times larger, 0.57 to 1.45 at 08:10 UTC, in bands and edges half a degree to a degree across, different in every panel (they are 25 to 75 minutes apart). A cloud term in the synthetic sky therefore needs a patchy transmission map, not one number per sub.
The shape of the glow. Points: the light cirrus scattered around xi Cyg (green and blue planes), per unit of starlight it removed from the star, against the angle from the star. It is flat out to about 2' and falls steeply beyond 5', far wider than the telescope's own halo (purple). The orange curve is light diffracted by ice crystals of about 40 to 45 microns median radius, the forward peak of Mie scattering for particles much larger than the wavelength (Fraunhofer diffraction); a Henyey-Greenstein curve with g = 0.999 (dashed) fits about as well, and a single power law (dotted) does not. The peak holds about 30 % of the light the star lost (about 20 % inside 15'); the rest is scattered too widely to measure in one frame.
The shape of the glow. Points: the light cirrus scattered around xi Cyg (green and blue planes), per unit of starlight it removed from the star, against the angle from the star. It is flat out to about 2' and falls steeply beyond 5', far wider than the telescope's own halo (purple). The orange curve is light diffracted by ice crystals of about 40 to 45 microns median radius, the forward peak of Mie scattering for particles much larger than the wavelength (Fraunhofer diffraction); a Henyey-Greenstein curve with g = 0.999 (dashed) fits about as well, and a single power law (dotted) does not. The peak holds about 30 % of the light the star lost (about 20 % inside 15'); the rest is scattered too widely to measure in one frame.

Galaxies are smooth

Without a fitted model, a galaxy is a catalog profile: a bulge and a smooth disk. The total light can be right (M 31 within 3 % in every color after we measured it on two twins), but there are no dust lanes, spiral arms or star-forming knots, which is most of what the eye reads as a galaxy. M 33's catalog profile first rendered it about 20 % too bright; after measuring, green and blue are within 7 % and red within 13 %. Our real stacks show what is missing.

M 31, synthetic stack from a catalog profile M 31, the real stack
M 31, IRCUT filter. Left: the Seestar app's own stack of our 352 subs from 18 September 2026. Right: a synthetic stack at the same total exposure from the catalog profile alone, before the survey dust above. M 32 and M 110 are where they should be; only the real disk has dust lanes.
M 33, synthetic stack from a catalog profile M 33, the real stack
M 33, IRCUT filter. Left: the Seestar app's own stack of our 1,301 subs (about 3.6 hours). Right: a synthetic stack at the same total exposure. The real galaxy shows its arms and blue star-forming knots; the synthetic is a smooth ellipse.

The camera's fingerprint near black: worked out, not yet exact

In a real file, the brightness codes just above the sensor's black level are unevenly used, with fine regular dips. The sensor doesn't make that pattern: its raw dark frames are clean 12-bit readings. The Seestar app does, when it subtracts its own rounded master dark and then scales by the white balance times its own flat field, which brightens 7 to 8 % toward the corners. It also patches about 0.15 % of pixels from a fixed bad-pixel map. Drawn that way, the synthetic codes match the real dip spacing within 2 % and the slower repeat within 3 % on frames held back from the fit, but the code-by-code histogram still misses within about 25 codes of black, where the zero level drifts by about one count between nights. So it stays an option for now, off in the pictures here.

Star halos: fixed twice today

At stack depth, where the noise is low enough to see a star's faint outer glow, earlier versions of these pictures showed two faults around bright stars. First, square glows: every star was drawn out to a fixed size set by its magnitude, and the edge showed. Now each star is drawn out to where its own light falls below the noise, so halos are round. Second, purple disks with a rim: the star-glow tables had been measured on stars inside the North America Nebula, whose light crept into their red and blue. Measured again on nebula-free stars in six stacks from two telescopes, a real star's glow is slightly warm, never purple (red 1.33 and blue 0.91 of green through IRCUT; 1.10 and 1.24 through LP), and the pictures now use that. What is left: on the deepest stack the synthetic halos are a little more compact than the real ones, and blue's share shifts with focus from night to night.

The IRCUT red plane wanders

Through IRCUT, the red channel's star brightness drifts from sub to sub by up to 0.3 magnitudes, about half of it following the camera's temperature on one stretch of the night and none of it on another. We render one fixed value, good to about 0.1 magnitudes. Telling focus from throughput needs a second IRCUT night.

The payoff

What the fake sky taught us about the real engine

This is the part we didn't expect to be the best part. On a real frame nobody knows the true brightness of every star, so nobody can check the error bars the engine puts on them. On a synthetic frame we can. The synthetic truth exposed two things about our engine's star brightness, and both turned out to be how it reads real frames too.

1. Its error bars leave out the star's own noise

A measurement's pull is its miss divided by its stated error. Honest error bars give pulls that spread by about 1. The engine's spread by about 2.7 for faint stars and by 48 (red) and 55 (blue) for the brightest, because its stated error counts the sky's noise but not the star's own photon noise: the camera's file reports a gain setting, not the number of electrons per count, so the engine runs as if only the background mattered. Its stated error is 0.62 of the star's own noise for faint stars and 0.07 for the brightest. Add the star's own noise back and the spread falls to 1.4 to 3.1. We predicted this one before the first run; the synthetic truth measured it.

with the engine's stated errorswith the star's own noise addedhonest: 1
Pooled over the eight LP frames: 15,261 red and 15,267 blue measurements. Signal-to-noise is how far a star stands above its noise; the right-hand stars are the brightest.

2. Bright stars read 4 to 7 % faint

Above a signal-to-noise of 30 the engine's brightness comes in at 0.93 to 0.96 of the star's whole light. Its star model has no room for the faint halo past about 5 pixels, which holds 4 to 5 % of a star's light. The engine reads the same brightness off the real frame (synthetic over real 1.00, 1.03, 0.95), so real Seestar frames are read 4 to 7 % faint on bright stars too.

red planeblue planetruth: 1
Median engine brightness over true brightness, the same eight frames. The faintest stars read slightly bright, as faint-star measurements usually do.

A third, smaller finding is the friendly kind: the engine's stated pointing error is two to four times bigger than its true error (above). It errs on the side of caution there. Neither brightness finding changed a decision the engine made in these tests: one is about how sure it says it is, the other about how bright it reads bright stars.

Did it hold up on a night it had never seen?

The result of the held-out test will appear here.

What's next: breaking it on purpose

The other half of the plan is mutation testing: plant a known fault in a frame, or push one setting past what a real night gives, and check that the engine notices. A real frame can't do this, because only in a synthetic one do we know exactly what was changed. Each run lands in a class: the engine holds (right answer, honest errors), refuses honestly (says no, with a reason), degrades honestly (worse, and says so), refuses too early, or is confident and wrong, the dangerous one. Every confident-and-wrong case becomes an engine bug with its answer key attached.

Each sweep starts from where our real nights actually sit, measured, and walks out from there. What we can run, roughly in order of how ready it is:

Sky and weather

ready

Sky glow and its gradient, seeing, and thin cloud's dimming, starting from the spread across our own nights (on the cirrus night, stars dropped to about a third of clear). Once the cloud term is in, patchy cirrus with its glow around every star, as measured above.

The mount

ready

Polar error, tripod tilt, gear error and shake, starting from what we measured on real alt-azimuth and equatorial sessions and scaling up until stars smear or the field turns out from under the solver.

The camera

ready

Focus, sensor temperature inside the range we have dark frames for, and the Seestar app's own processing: its dark subtraction, flat field and bad-pixel patching, each switchable, so we can see which of them the engine leans on.

Lies in the file

easy

The generator writes the file's header, so it can lie on purpose: the wrong time, the wrong pixel scale, a flipped image, the wrong filter name, a pointing a degree off. The engine should catch each one or say it can't trust the frame.

A wrong but plausible sky

easy

Move one star, delete a few, add one that isn't in the catalog, change a galaxy's brightness, borrow another night's sky. Does the engine flag the odd one out, or quietly fit around it?

Things a real night throws in

new terms

Satellite and plane trails, a moving asteroid or comet, cosmic-ray hits, a hot-pixel cluster, dew creeping in from an edge. The generator doesn't draw these yet; each is a small term to add.

These are plans, not results. Nothing in this section has been run yet.

Fixed in advance, and measured

Fixed in advance

  • The definition of a pass: “same decisions, numbers within stated errors.”
  • Every pass mark in the engine test (solve, at least 500 confirmed and none we didn't draw, the pointing within 0.3 and 2.5 pixels, star positions within a factor of two of the stated error, brightness within 5 % with honest pulls), written before the generator's first frame.
  • The 18 test frames: which real subs lend their times, named before any was rendered; none used in building the generator.
  • The predictions, also written first: that the engine's error bars would leave out the star's own noise (right), that bright confirmed star positions would land within 0.1 pixels (wrong), that twin star brightness would land in 0.90 to 1.05 (four of 18 values over, up to 1.09).
  • The [O III] term's pass marks, written before the fit: brightness within 15 % on 7 of 9 held-back checks (6 met), color within 15 % (met), and the expected blue-to-green ratio, 0.6 to 0.9 (0.75).
  • Inputs taken as published: Gaia DR3 positions, motions and brightnesses; the IPHAS Hα map and its published calibration; the DSS2 blue plate; published dust reddening for Hβ; the SGA-2020 and OpenNGC galaxy profiles.

Measured

  • The camera model: its star shape, noise, dark pattern and zero points, from our own frames on earlier nights.
  • On the 18 frames: all solved; 1,079 to 3,106 confirmed; pointing 0.14 to 0.18 px from truth in the middle and 0.51 to 0.60 at the corners; bright-star positions off by a median 0.27 to 0.43 px.
  • Same stars, synthetic over real: 1.00, 1.03, 0.95 (green, red, blue); background noise within about 3 % on IRCUT.
  • Fitted on some twins and checked on others from the same nights: the nebula's red scale (2.1; checks 0.94, 0.97, 0.89), its [O III] weights (green 7.47, blue 5.58; color within 6 and 12 % on a fit frame), M 31's color and brightness (checks within 3 %), M 33's (green and blue within 7 %, red off by 13 %).
  • Synthetic stacks: noise 0.81 to 1.12 of the real stacks' in the emptiest patches.
  • The engine findings: pulls spreading 2.6 to 55, back to 1.4 to 3.1 with the star's own noise; bright stars 4 to 7 % faint.
  • The mount: tilt 2.03°; the equatorial session's polar axis, gear error (26.8 min, about 11″) and shake (about 2.5″).

Everything in these two lists comes from the nights the generator was built on: twins were fitted and checked on the same nights, so those checks test steadiness, not a new sky. The one test on a new sky is the held-out night, and it held up only in part, so the page stays exploratory.

Data and credits

Our data: a Seestar S30 Pro on its alt-azimuth mount. NGC 7000 on the night of 19 September 2026 (LP filter), M 31 and M 33 on 18 September 2026 (IRCUT); every synthetic sub borrows its time, pointing, sensor temperature and sky level from one of those real subs. The stacks: NGC 7000 is our own stack of 752 subs; M 31 (352 subs) and M 33 (1,301 subs) are the Seestar app's own stacks; the Leo Triplet pair uses a deep stack of 738 one-minute subs from another Seestar S30 Pro (16 May 2026), used with permission, and the quiz's Leo round uses our own onboard stack of 490 subs from 17 April 2026. The quiz also uses a second telescope of ours, the Outpost Seestar S50, for its M 31 and plain-field rounds, stacked by our own stacker. The equatorial-mount measurements come from a community member's Seestar S30 Pro session of Sh2-129 (22 to 24 September 2026), used as numbers only. The engine is Skycruncher's own processing engine, run unchanged.

Stars: ESA Gaia DR3, read from our own copy of the release to about magnitude 22. Nebula: IPHAS, the INT Photometric Hα Survey of the Northern Galactic Plane, taken with the 2.5 m Isaac Newton Telescope on La Palma; and the Digitized Sky Survey (STScI/NASA), from the second Palomar Sky Survey plates (POSS-II, Palomar Observatory and Caltech), through the CDS HiPS service in Strasbourg. Galaxies: the Siena Galaxy Atlas 2020 (SGA-2020) and OpenNGC. Independent checks: astropy and photutils. Quiz pictures: Legacy Surveys DR10 (DESI Legacy Imaging Surveys), Gaia DR3 (ESA/Gaia/DPAC), IPHAS DR2 / IGAPS (INT Photometric H-alpha Survey of the Northern Galactic Plane), Sloan Digital Sky Survey DR9 (via CDS hips2fits), Pan-STARRS1 DR2 (PS1 image cutouts, STScI MAST).