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.
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.
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).
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.
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.
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).
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.
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.
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.
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).
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.
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.


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 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.
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.
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.

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.
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.
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 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.
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.](clouds_real_minus_twin.jpg)



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.
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.
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.
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.
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.
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.
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.
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.
The result of the held-out test will appear here.
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 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.
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.
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.
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.
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?
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.
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.
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).