I measured where hundreds of stars sit in my Seestar S30 Pro frames of the galaxies M 33 and M 31 and checked every position against the Gaia space telescope's catalog. Averaged over a night, a moderately bright star lands within about 50 to 70 thousandths of an arcsecond (milliarcseconds, mas) of where Gaia puts it: under a fiftieth of a pixel. Then I locked the method and ran it once, unchanged, on frames from three other owners' telescopes that I had set aside unopened. It met 19 of 22 of the predictions I had written down, which confirms the method's precision on telescopes it was not tuned on. Frame by frame it did as well on all three as on my own nights; on one of them, night averages kept an error that doesn't average away.
On my M 31 night a G 11-12 star's night-average position is off from Gaia by 48 milliarcseconds (typical, 171 stars). A single 10-second frame is about 8 times worse, 0.11 pixel.
Precision by brightnessLocked before I looked at their frames, the same method gave 72 and 86 mas on two nights from another owner's S30 Pro and single-frame errors 1.1 to 1.6 times the noise limit on all three, meeting 19 of 22 written predictions.
The fresh-telescope testOn a soft-focus night with the field drifting along one axis, the best the software could do was 166 mas at the same brightness. Sharp focus and stars that move around the sensor are the cheap wins.
What conditions matterAstronomers measure positions on the sky as angles. A degree splits into 60 arcminutes, an arcminute into 60 arcseconds, and an arcsecond into 1,000 milliarcseconds (mas). The full Moon is about 1,860 arcseconds across. Each pixel of the S30 Pro's sensor covers 3.67 arcseconds, or 3,674 mas, so the star positions on this page are small fractions of a pixel.
Some comparisons. A US quarter (24 mm across) seen from 100 km away spans about 50 mas, roughly my night-average error. Seen from 12 km it spans about 400 mas, the error of one 10-second frame. One whole pixel is that quarter at about 1.4 km. A star image on this sensor is 2 to 4 pixels wide, so finding its center to a seventieth of a pixel means locating the middle of a blur several pixels across to about 1 % of its width.
Gaia's G magnitude measures how bright a star looks; each step of 1 is a factor of 2.5. The stars on this page run from G 9, roughly ten times fainter than the faintest stars the eye can see from a dark site, down to G 15.5. Brighter stars collect more light, so their centers are found more precisely, up to the point where something other than random noise takes over.
Three regimes show up. Faint stars (G 13 and fainter) sit within 1.0 to 1.6 times the photon-noise limit: their error is set by how few photons they deliver against the sky, and averaging more frames is the only cure. Around G 11 to 12 the measured scatter is 1.2 to 1.7 times the photon limit per frame; the extra is seeing and tracking jitter, which differs from frame to frame and still averages down. Brighter than G 11 nothing saturates (the brightest star reached 40,000 of the camera's 65,535 counts), but a brightness-dependent offset of 15 to 65 mas appears that the method does not remove, so G 9-10 stars end up no better than G 11-12 stars for a user.
Fixed in advance: Gaia DR3 as the truth, the pixel scale, the held-out frames and star groups, the brightness range of the reference set (G 11 to 15.5), the scoring formula and the rules for which stars count. Measured: every error on this page, the distortion maps, the color shift and the coma table. The method was then locked, with a fingerprint of its settings recorded so they couldn't quietly change, before the test on other telescopes below.
To see which steps matter, I added them one at a time and watched what is left once random noise is subtracted: the part of the error that more frames would not fix. That leftover swings with my estimate of each star's noise (a 10 % change moves the M 33 value anywhere from 6 to 34 mas), so read the bars as a ranking of the steps. The night-average errors above are the numbers a user gets.
Two steps carry most of the gain. Moving Gaia to the date of the night is worth about 60 mas on both fields; a placebo test that gave each star another star's motion made things worse, so the gain is real star-by-star information. The per-night distortion map is worth 32 to 54 mas: the lens's distortion changes slightly from night to night, so a map fitted once and reused does not hold. Things that added nothing: atmospheric color refraction, a Moffat star profile instead of the Gaussian, and simply using more frames from the same night.
Away from the middle of the field the star images are slightly lopsided, their light pulled outward like a faint comet tail. That is coma from the optics: 0.12 to 0.17 pixel per half-diagonal on my unit, plus a constant shift of about 0.1 pixel along one axis. A symmetric Gaussian fitted to a lopsided star lands slightly off its true center, and the offset depends on the star's brightness. I built a correction table across the field, the focus state and brightness, from simulated stars passed through a model of the optics, and applied it to stars of G 11 and fainter (it is clamped at G 11).
On M 31 the table halves the error of G 10-11 stars (83 to 41 mas) and removes most of their shared offset. On M 33 it helps less: at G 9-10 it overshoots in the coma axis (the offset flips from −32 to +41 mas), and it leaves an offset of 50 to 65 mas in the other axis that it was never meant to model; I traced that to one of the two green pixel planes in the first 1.5 hours of the M 33 run, not to the optics. Its benefit isn't stable either: whether it helps significantly flips between M 33 and M 31 depending on how the frames are split, and on another owner's telescope, swapping my M 33 table for my M 31 table alone made the result 4.5 mas worse. Coma differs between units (theirs was 1.5 times mine), so a coma table belongs to one telescope at one focus, not to the model. That is why the fresh-telescope test below ran without one.
Everything above was built and tuned on my own nights, and I looked at the held-out frames many times while choosing the steps, which tends to make a method look better than it is. So before looking at any of their frames, I locked the whole method, wrote down a predicted range for every number, and ran it once on frames from three S30 Pro units owned by other people (frames shared with the Seestar community), set aside unopened (“sealed”) until that run. A few of those frames had been used before; they are listed under What is confirmed. Telescope B used an IRCUT filter and 10-second frames on an equatorial mount, C a light-pollution filter with 60-second frames on an equatorial mount, D a light-pollution filter with 20-second frames on an alt-azimuth mount. The locked method has no coma table, because coma tables don't transfer between units.
The headline held. Per frame, every new telescope landed at 1.1 to 1.6 times its noise limit, the same band as mine (1.16 to 1.60). Night averages on telescope B came in at 72 and 86 mas, inside the ranges I had predicted (71-126 and 65-116 mas), on 706 and 607 stars. Across positions and brightness, 19 of 22 predictions hit. Two of the three misses were positions: telescope B's single frames on its first night were worse than predicted (0.192 pixel against at most 0.163), and telescope D's second night averaged 265 mas against at most 250.
Telescope D's night averages (146 and 265 mas, 3.7 and 4.9 times their noise limit) are where the method falls short. A follow-up look at those frames (exploratory, since I had already seen them) found what the error is, though not what sets it: a fixed position error for each star, pointing roughly outward from the sensor center and growing toward the edges. On an alt-azimuth night of a field that barely rotates, a star sits on the same spot of the sensor all night, so that error repeats in every frame and never averages away. My own soft-focus NGC 7000 night shows the same thing (3.2 times its limit). Nothing I tried in software removed it.
The fairest comparison is my own transit night of 2 October 2026, which I spent on the planet HD 189733 b. Nobody had tuned an astrometry method on it, so I ran the locked method on it once, unchanged. G 11-12 stars came out at 194 mas per night and 0.89 pixel per frame: about 4 times worse than the M 31 night per night and 8 times per frame, and worse than I had predicted, badly per frame (at most 0.25 pixel) and just per night (at most 180 mas). The method itself was not the problem; it sat at 1.7 times the noise limit per frame and 2.0 times per night, like the other light-pollution-filter nights. The conditions were:
Improving the software on that night (fitting each frame's real star shape, fitting faint neighbors, then a star shape that changes across the field) took G 11-12 stars from 194 to 166 mas and G 9-10 stars from 116 to 90 mas (exploratory, since by then I had already looked at that night). A further step to 162 mas did no better than a placebo version of itself, so I don't count it. None of it got below the 97 mas noise limit. The lessons are capture lessons: focus sharply (autofocus) for position work, dither the pointing in both directions so each star crosses many parts of the sensor, and prefer the IRCUT filter when positions are the goal, since it collects several times more light from each star. Field rotation on an alt-azimuth mount smears corner stars into short arcs (up to 46 arcseconds in a 10-second frame on my M 33 night); the method models the arc, and it costs single-frame precision there, but on my galaxy nights it was not what limited the night averages.
For a while I quoted 30 mas on M 33 and 56 mas on M 31, later 23 and 37 mas. Those were the leftover systematic part after subtracting noise, and they swing with the noise estimate (M 33 moves between 6 and 34 mas for a 10 % change). The number that needs no such guess is the plain night-average error, 48 and 66 mas, so that is the one I quote.
The weights I used to combine stars assumed every star had the noise of a faint one. For bright stars they overstated the scatter 4 to 13 times, which is why the noise-weighting step bought nothing. The photon-noise prediction from each star's own brightness is the one that works.
On M 33 four stars near the edge, seen in only 9 to 14 frames, carried most of the root-mean-square error. That is why the headline now needs 20 frames per star and uses a typical value rather than an average of squares.
In an earlier one-shot test on telescope B and a fourth unit, I computed field rotation for an alt-azimuth mount on a telescope that was in equatorial mode; it affected only the weights. Later, while rehearsing the three-telescope test on frames that were not set aside, a bug made the noise limit about 4 times too low; it was fixed before the set-aside frames were opened.
Confirmed. Locked before the test and run once, unchanged, on other owners' telescopes, the method met 19 of 22 predictions I wrote down in advance. Single-frame positions landed within 1.1 to 1.6 times the noise limit on all three units, and night averages of 72 to 86 mas on an IRCUT telescope in equatorial mode fell inside the predicted ranges. The frames were listed from file names only and sealed until that run. They were not all untouched: 108 of telescope B's 617 sealed frames had gone into an earlier one-shot test, frames from the middle of the same two nights were used to rehearse the method, and a few dozen of the other units' frames had been copied or run through other software. All of that was recorded in the seal before it was opened, and those frames stayed in.
Not confirmed: the nights it was tuned on. My own 48 and 66 mas, the value of each step and the coma table come from the nights the method was built on. The equatorial-mount telescope that confirmed the night averages differs from mine in three ways at once (unit, mount mode and sharper focus), so I can't yet say which of them matters most.
Not working yet: night averages on alt-azimuth nights where stars stay put on the sensor. The next test is a night with dithered pointing and sharp focus, with its prediction written down first.