FirstRig
firstrig.com

Method

Correctness is the whole proposition. A wrong backfocus figure that costs someone $200 in adapters they didn’t need is not a bug, it is the end of any reason to trust the rest of the site. So the rules below are structural, not aspirational.

The standard every number meets

  • A citation in the source. Every formula names where it comes from, in the code, next to the code.
  • A worked example as a test. Each formula ships with a unit test built from a published figure it has to reproduce. If a test and a published value disagree, the site is wrong until proven otherwise.
  • Units in every parameter name. focalLengthMm, pixelSizeUm, backfocusMm. No bare number ever crosses a function boundary.
  • Unverified values are labeled, never filled in. Where a figure cannot be confirmed against a manufacturer’s own page or drawing, it is marked unverified and surfaced as unverified in the interface.
  • Contested things are presented as contested. Where the hobby genuinely disagrees — sampling being the obvious case — you get the tradeoff and both arguments, not a green tick and a red cross.

Worked example: image scale

The simplest formula on the site, and the pattern every calculator follows: the formula, what it does and doesn’t tell you, and its output checked against published figures.

How this is computed

s ["/px] = 206.265 × pixelSize[µm] / focalLength[mm]

Image scale is how much sky one pixel covers. It depends only on the pixel pitch and the system focal length after any reducer — aperture does not enter, and neither does f-ratio.

Output of the shipped function, checked against published figures.
SystemImage scale
ASI533MC Pro (3.76 µm) on 400 mm1.94″/px
Seestar S50 (2.9 µm) on 250 mm2.39″/px
Seestar S30 (2.9 µm) on 150 mm3.99″/px
DwarfLab Dwarf 3 (2.0 µm) on 150 mm2.75″/px

What this does not do is tell you whether your sampling is correct. The 1–2″/px rule has legitimate dissent in both directions: wide-field work is deliberately undersampled and that is a valid trade, and the real cost of oversampling is per-pixel signal-to-noise and guiding tolerance, not lost signal. Aperture collects the same photons either way.

Source: 206.265 is arcseconds per radian ÷ 1000, the 1000 folding in the µm → mm conversion. Verified against published figures 6 August 2026.

The Backfocus Solver

A corrector is designed to put focus a fixed distance behind a named face. The solver’s job is to make the distance from that face to your sensor equal that number, using threaded parts you own, and to say plainly when they can’t.

How this is computed

required  = corrector backfocus + Σ glass × (n − 1) / n
fixed     = camera flange-to-sensor + Σ components
rings     = required − fixed
residual  = rings − Σ chosen ring lengths      (positive: still short)

The worked train on the home page, as the solver sees it:

required — Baader 2" MPCC Mark III coma corrector, from the T-2 (M42x0.75) thread55.00 mm
fixed — ZWO ASI2600MC Pro, flange to sensor17.50 mm
rings must add37.50 mm
ZWO M48-M42 adapter (0 mm)0.00 mm
ZWO M42-M48 16.5 mm extender16.50 mm
ZWO M42 21 mm extender21.00 mm
residual0.00 mm

Ring lengths are optical: shoulder to shoulder, because a male thread that disappears into its mating female adds nothing. A catalogue figure that doesn’t say which length it is ships unverified.

Source: docs/03-physics-reference.md § 5 and docs/M0-SPEC.md § 2; the model and the worked train below are pinned by unit tests in packages/physics and packages/data.

How this is computed

shift = t × (n − 1) / n

Filter glass in a converging beam pushes focus outward, so the train has to get longer, not shorter. The common rule of thumb is a third of the glass thickness; that is this formula at n = 1.5, and it runs about 2.5% low for typical filter glass.

Glassn = 1.52⅓ rule
1.00 mm0.342 mm0.333 mm
2.00 mm0.684 mm0.667 mm
3.00 mm1.026 mm1.000 mm

The difference is hundredths of a millimeter. It is modeled anyway, because this is the tool that exists to get the small things right.

Source: The longitudinal focus shift of a plane-parallel plate in a converging beam (paraxial). filterGlassShiftMm in packages/physics, unit-tested: 2 mm at n = 1.52 → 0.684 mm. n defaults to 1.52 when the glass is unpublished, and the solver says so.

How it chooses between stacks

  1. Inside the corrector’s published tolerance, or ±0.50 mm where none is published.
  2. Fewest rings. Every joint is a tilt risk, so an exact stack of five loses to a two-ring stack 0.2 mm out; the result says when that trade was made.
  3. Smallest residual.
  4. Then fixed tie-breaks, so a link pasted into a forum reproduces exactly for whoever opens it.

At most 6 rings, adapters included.

What it refuses to guess

  • Which configuration your camera is in, where the manufacturer publishes more than one.
  • Which rings you own. There is no default kit.
  • Which thread adapter you have. The same conversion is sold at five different lengths.
  • A result it can’t stand behind. If nothing you own joins the threads, the figures that depend on the missing part are withheld, not estimated.

Open the worked train in the solver

The Sub-Exposure & Calibration Planner

A sub is long enough when the sky’s own shot noise buries the camera’s read noise. How long that takes depends on two numbers most people never look up: read noise at the gain they use, and electrons per pixel per second from their sky.

How this is computed

e_sky = 8.79e5 · 10^(−0.4 · m) · π(D/20)² · s² · QE · T
t_min = R² / (e_sky · ((1 + p)² − 1))
T     = SNR² · (S + B + D + R²/t) / S²

The reference rig: 72 mm at 400 mm, ASI533MC (3.76 µm, QE 0.80), Bortle 6 (19.0 mag/arcsec²), R = 1.0 e⁻, p = 5%.

sky rate, no filter2.70 e⁻/px/s
t_min, no filter3.6 s
sky rate, 7 nm dual-band (T = 0.055)0.149 e⁻/px/s
t_min, 7 nm dual-band65.6 s
nebula at 21.5 mag/arcsec²0.270 e⁻/px/s
to SNR 40 in 30 s subs, no filter18.3 h
to SNR 40 in 30 s subs, dual-band4.2 h

The coefficient k in t ≈ k · R² / e_sky is 9.76 at p = 5% and 4.76 at 10%. Sub length scales with read noise squared, which is why the gain setting moves the answer more than anything else.

R = 1.0 e⁻ is the worked example’s round figure. ZWO’s own chart puts the ASI533 at about 1.5 e⁻ at gain 100 with HCG on; its headline 1.0 e⁻ is the top of the gain range. The planner uses the chart.

Source: docs/03-physics-reference.md §§ 2–3 · Dr Robin Glover, “Deep Sky Astrophotography with CMOS Cameras” · Howell, Handbook of CCD Astronomy. Every row below is the output of packages/physics/src/exposure.ts.

Where the read noise comes from

21 cameras, 30 read modes. Most makers publish a chart, not a table, so each curve says how it was taken: 8 from a printed table, 8 from numbers printed on the maker’s chart, and 14 read off a chart by eye, with the reading uncertainty carried into the result. Only published gains are offered; the planner never interpolates, because read noise drops by a factor of two or three at the conversion-gain switch.

What it refuses to guess

  • QE where the maker publishes only a relative curve, or contradicts itself. You enter it.
  • Amp glow where the maker is silent. The calibration plan says it is unknown and how to check in one frame.
  • A filter’s transmission from its bandwidth. The reference’s own figures don’t scale linearly with it.
  • One sub length as the answer. Above the floor it is a tradeoff, and the planner shows the curve.

Open the reference rig in the planner

Sky brightness from satellite data

Our own model of zenith sky brightness from VIIRS night-time radiance: the formula, the openly licensed data it is built from, its accuracy against measurements it was never fitted to, and what it cannot tell you. Read the sky brightness method