SkyCruncher · practical guide · October 2026

Calibration

What calibration frames are, what your Seestar already does to every frame, and whether you need to shoot any.

1 · The short version
−−÷= Lightyour target Biasno light,shortest Darkno light,same exposure Flateven light Calibratedwhat's left
calibrated=light−bias−darkflat\text{calibrated} = \dfrac{\text{light} - \text{bias} - \text{dark}}{\text{flat}}

Every raw frame holds the light you wanted plus things the camera added. The electronics add a fixed offset to every pixel (the bias). Heat knocks loose electrons nobody asked for (dark current). The optics light the sensor unevenly, dimmer toward the corners and shadowed by dust (the flat field). Calibration takes these back off: subtract a bias frame (the shortest exposure, no light), subtract a dark frame (same exposure and temperature, no light), and divide by a flat frame (an evenly lit surface). Many frames of each kind are averaged into a master, so the correction doesn't add noise of its own.

How sure each claim is, marked where it's made:

measured
a number from my own frames
stated
ZWO or a datasheet says so; I haven't tested it
inferred
my data fits it, but it isn't tested
illustrative
made-up numbers that show the idea
prototyped
works in my test bench, not in the app yet
planned
not built yet
Each line opens for the detail.
2 · One pixelEvery pixel sits on a floor of about 1,112 before any light arrives.
one pixel · one 10 s sub · S30 Pro · not to scale 0 ADU Read noise±17 ADU (0.89 e⁻) on every read Starlightonly where a star lands Sky glowdepends on your sky and filter Dark current3–6 e⁻ in 10 s at 29–33 °C≈60–120 ADU; doubles every ≈4.3 °C Bias pedestal≈1,112 ADU on every frame
Figure 1. What one pixel adds up in one 10-second sub (a single exposure), from bias and dark frames I shot over Alpaca on my S30 Pro (telephoto camera, firmware 8.46, gain 200) measured. ADU are the camera's raw counting units; e⁻ are electrons. The sky level varies from night to night, so it carries no number. One catch: the camera's black-level clamp takes the average dark current back off, so a dark frame looks just as black at 300 s as at 1 s. You see the dark current only as extra noise and warm pixels. At the other end there's no gentle roll-off: on the S30, S30 Pro and S50, every color stays within about 5 % of a straight line up to 90 % of its clip level, then clips measured.
3 · The four framesSubtract what the camera added; divide out what the optics dimmed.
bias dark current light light each pixel gets Light framewhat you shot centeredge − Bias masterthe offset − Dark masterthe heat signal ÷ Flatnormalized to 1 1.000.80 = Calibratedlight only centeredge
Figure 2. Two pixels, one at the center and one at the edge, through textbook calibration illustrative. Subtracting the bias and dark masters leaves only light, but the edge pixel got 20 % less of it. Dividing by the flat evens them out. The flat has its own bias taken off before it's normalized, or the division would scale the offset too.
4 · What the Seestar doesThe app scales the colors and swaps out hot pixels before you see a frame.

Your Seestar does a lot to each frame before you ever see it. On my S30 Pro (firmware 8.46) I compared frames the app saved with frames I pulled straight off the sensor over Alpaca, the standard network interface that desktop astronomy programs use (more in section 7). The app scales red by about 1.7 and blue by about 1.84, and it swaps out hot pixels: a 10-second dark over Alpaca has about 24,000 of them, and an app sub has almost none measured.

The app also has its own calibration settings: Flat Shoot (since app 2.5) and Dark Calibration (since app 3.3.0 on the S30 Pro) stated. What I don't know yet is whether they change the subs the app saves, or only the live stack you watch on your phone. ZWO's own notes disagree, and the files don't say. I'm testing it.

Either way, darks you shoot yourself can't help subs the app saved. Those subs have had their colors scaled and their hot pixels swapped before you ever see them, so your darks no longer match them.

Sensor (IMX585)light → electrons Analog to digital12-bit, written ×16 (16 ADU steps) Black-level clampcreeps up, steps back 8 ADU The Seestar appsaves the sub Alpaca, via NINAskips the app Red ×≈1.7, blue ×≈1.84measured Hot pixels replacedmeasured Dark Calibrationapp 3.3.0 and lateron saved subs? untested Flat Shootapp 2.5 and lateron saved subs? untested FITS subwhat you upload FITS framethe sensor's own numbers no color scaling hot pixels kept no dark taken off green on a plain 16 ADU grid measured measured on my S30 Pro stated by ZWO, not tested
Figure 3. One sensor, two routes. Everything solid was measured on one unit: my S30 Pro, firmware 8.46, app 3.3.2, one desk session plus my app subs measured. The clamp and its 8 ADU steps show up on both routes; the app only scales them by color. Why the clamp steps the way it does is my reading of the data inferred. The app route's red and blue scaling shows as uneven steps between pixel values (R/G ≈ 1.71, B/G ≈ 1.84). The dashed boxes are features ZWO's app notes announce stated: Flat Shoot arrived in app 2.5 (May 2025) and Dark Calibration for the S30 Pro in app 3.3.0 (for the S30 and S50 in 3.3.1, off by default). Nobody has tested whether either one reaches the subs the app saves, or only its own live stack. ZWO's notes conflict: one FAQ says the S30 Pro doesn't dark-calibrate its saved files at all. The subs' headers don't say either way.
5 · Should you shoot them?From the app: no bias, no darks. Flats are being tested.

If you shoot in the Seestar app, which is most of us: there's no bias or dark frame to shoot. The app doesn't offer bias frames, and darks you shoot yourself can't match subs the app has already processed. Flats are the open one. The app's Flat Shoot (Settings → Advanced Feature → Image Calibration) is the only flat that could reach your subs, and I'm testing whether it does being tested. This line changes when the result is in. Upload your subs as they are, and SkyCruncher models what's missing.

If you shoot over Alpaca, with NINA today or a SkyCruncher helper app later: a full set of bias, darks and flats tells you your own sensor's numbers. That's section 7.

Where do your frames come from? The Seestar appmost of us Over AlpacaNINA now, a helper later Biasnothing to shoot Darksyours can't reachthe app's subs FlatsFlat Shoot in the appbeing tested Bias50 at the shortestexposure Darks20 at 10 s, thena ladder to 300 s Flats30 + 30 dark flatsbeing tested Upload your subswe model what's missing A report on your sensornoise, dark current,hot pixels shoot these being tested nothing to do
Figure 5. The answer depends on how your frames are made. Counts are the S30 Pro plan at gain 200 from my capture tests. "Being tested" covers both sides: flats over Alpaca, and whether the app's Flat Shoot reaches your subs. The report on your sensor comes with the helper app planned.
6 · Synthetic calibrationBuild the masters from your lights, with no dark frames shot.
Your light frames, nothing elsemy test: 653 subs, 10 s, gain 200, 15–35 °C A fit for every pixel (the model below)what grows with temperature is dark;the rest is bias A synthetic bias + dark masterfor this sub's temperature T and exposure t Subtracted from that subno dark frames shot stars and sky move between subs;the sensor's own pattern stays put tonight's T and t
rawp=1112+bp+d20,p⋅2(T−20)/5.8⋅t10 s+fp S\begin{aligned} \text{raw}_p &= 1112 + b_p \\ &\quad + d_{20,p}\cdot 2^{(T-20)/5.8}\cdot\frac{t}{10\,\mathrm{s}} \\ &\quad + f_p\,S \end{aligned}
11121112
the bias pedestal, in ADU
bpb_p
pixel pp's own bias pattern
d20,pd_{20,p}
pixel pp's dark signal per 10 s at 20 °C
T, tT,\ t
the sub's sensor temperature (°C) and exposure
fp, Sf_p,\ S
pixel pp's flat and the sky; the prototype fixes fp=1f_p = 1
Figure 4. Building masters from the lights themselves, as my workbench prototype does it prototyped. It's not in the SkyCruncher app yet planned. The prototype sets the flat to 1, assuming the subs arrive already flattened. My measurements say that isn't safe: corners read from 0.93 to 1.05 of the center across units measured, so a flat built from the lights is part of the plan. On M 33 it halved the background unevenness (1.48 to 0.74 ADU). On M 27 at 33 °C it made star positions slightly worse, for reasons not yet known. The 5.8 °C doubling in the model and the 4.3 °C from my darks don't agree yet.
7 · Know your sensorAn hour indoors over Alpaca gives your sensor a checkup.

Your Seestar can also be run over Alpaca, the standard network interface that desktop astronomy programs use. Frames shot this way skip the app's processing, so they show what the sensor itself does: how noisy each read is, how fast heat builds up, where the hot pixels are. They don't calibrate stacks made in the app. Think of them as a checkup for your sensor.

Today it takes NINA, a free Windows program, and about an hour indoors at any time of day. A small SkyCruncher helper app that runs it all for you is in the works planned. A web page alone can't do it: the scope doesn't accept calls from websites, so it has to be a small download.

You'll need: your Seestar, charged and on your home Wi-Fi; a Windows computer with NINA 3; a tablet or phone with a plain white screen; a sheet of white paper; rubber bands or painter's tape; and your solar filter cover (or opaque card and tape) for the wide camera.

The steps in NINA (S30 Pro: tested; S30 and S50: untested)

  1. Join the scope to your home Wi-Fi (Station mode, in the app's settings). Alpaca only runs there.
  2. In NINA, open Equipment, then Camera, and press refresh: the scope's telephoto camera should show up. Check this list rather than the app's Seestar Alpaca switch. On my unit the switch wouldn't turn on while the scope was serving Alpaca anyway.
  3. Stop live view in the app; the scope runs one capture at a time.
  4. Connect the telephoto camera and the filter wheel. Gain 200 (S50: 80 and 200). There's no offset control.
  5. Bias and darks: arm closed, filter wheel on Dark (it's light-tight; no cover needed). 50 bias, 20 darks at 10 s, then 3 each at 30, 60, 120 and 300 s.
  6. Flats being tested: arm raised, IR filter, a white screen at full brightness with paper over it. A dimmed screen can flicker into bands, so dim with more paper instead. 30 flats near 35 % of full scale, 20 flat pairs over 10 levels, then 30 dark flats on the Dark filter.
  7. Wide camera: cover the lenses (the Dark filter sits only in front of the telephoto). 30 bias, 20 darks at 10 s, 3 each at 20, 40 and 60 s; it stops at 60 s and reports no temperature.
  8. Zip the folder of raw FITS, about 3 to 4 GB. Don't calibrate or stack them first.
  9. Keep your zip for now. Sending it to us comes with the helper.
8 · Still openSix questions I haven't answered yet, kept current.
  • Whether Flat Shoot and Dark Calibration reach the subs the app saves, on any model. I'm testing it now.
  • Flats over Alpaca, and whether the arm must be raised first.
  • Darks colder than 28.5 °C. My darks say dark current doubles every 4.3 °C; the noise model says 5.8 °C.
  • Any S30 or S50 over Alpaca. Everything over Alpaca so far is one S30 Pro on firmware 8.46.
  • Which header fields tell an app frame from an Alpaca frame.
  • Synthetic masters in the SkyCruncher app: designed in outline, not built.
9 · SourcesWhere every number on this page comes from.

Every number measured over Alpaca comes from one Seestar S30 Pro (firmware 8.46, app 3.3.2, Alpaca server 1.2.0-3). This page says what I measured on my unit, not what ZWO's firmware does in general.

  • Bias pedestal, read noise, dark current and its doubling, hot pixels, the light-tight Dark filter, the clamp: bias and dark frames I shot over Alpaca at my desk on September 29, 2026 (read noise 17.2 ADU, 0.89 e⁻; dark current 0.33 to 0.62 e⁻/s at 29.3 to 33.2 °C; 23,988 hot pixels in a 10 s dark at 29.7 °C) measured.
  • Red and blue scaling: the spacing of pixel values in my app subs, IRCUT and light-pollution filters pooled (R/G ≈ 1.71, B/G ≈ 1.84) measured.
  • What Alpaca frames skip: that desk session set against my app subs; one unit, one session measured.
  • Black-level creep and 8 ADU steps: my app subs and Alpaca frames measured; the mechanism inferred.
  • Hot pixels in app subs: 0 to 2 per pair of my app subs measured.
  • Clip level and no roll-off: star peaks against Gaia catalog brightnesses on an S30, an S30 Pro and an S50 measured.
  • Corners against the center (0.93 to 1.05): my unit profiles of several Seestars measured.
  • Synthetic masters: my workbench prototype on M 33 (background unevenness 1.48 to 0.74 ADU) and M 27 prototyped; SkyCruncher's engine has a place for it, not the code planned.
  • Flat Shoot and Dark Calibration versions: ZWO's Seestar app release notes on the App Store, and ZWO's tutorial Use Flat Shoot on Seestar stated.
  • Whether either reaches saved subs: unknown. ZWO's notes conflict; an undated ZWO FAQ answer says the S30 Pro doesn't dark-calibrate its FITS files stated. One S50 sub (firmware 5.97) carries no "flat applied" header measured.
  • Running a Seestar over Alpaca, the frame plan, the wide camera's 60 s limit, the app's Alpaca switch, and why a web page can't drive the scope: a live test on my S30 Pro on October 9, 2026 measured.
  • "Calibration frames are always nice to have, not need to have": a SkyCruncher engine design decision, September 11, 2026.