Is Tonight Worth Setting Up the Telescope?
Tags:#astronomy#tanstack-startMy telescope is a DWARF 3, a smart telescope that finds a target, tracks it and stacks the exposures by itself. Taking the picture is the easy part. What I actually need answered is whether tonight is worth carrying it outside, and if it is, when to set up and what to point it at.
A weather app tells me it’ll be partly cloudy. An astronomy app tells me what’s up. Neither one puts the two together and says “set up at 9, shoot the Crescent Nebula, pack it in at 10.” Billerica Sky does that for one town and one telescope.
What it said on October 14
This is the real forecast for the night of October 14, as of that morning:

One hour, 21:00 to 22:00. The gray strip under the chart is cloud cover, and you can see the band at 22:00 (the forecast had it at 100%) that ends the window.
The more interesting part is what isn’t highlighted. The sky cleared at midnight and stayed clear until dawn, which looks like five good hours. But the forecast had gusts at 27 to 30 mph for all of them, and my limit is 20. The hour from 20:00 to 21:00 was clear too, and it also failed on gusts, for a less obvious reason.
Open-Meteo labels precipitation chance and wind gusts at the end of the hour they describe. The gust value stamped 21:00 (22 mph) is about 20:00 to 21:00, not 21:00 to 22:00. If you read the forecast the naive way, you’d get a window that starts an hour early, in wind over the limit. The planner reads the next timestamp for those two fields:
// Open-Meteo labels precipitation probability and maximum gusts at the END
// of their preceding hour. Use the next timestamp for this hour's interval.
const period = weatherAt(forecast.hours, new Date(hour.time + 3_600_000))
Every verdict comes with a ledger so I can check its work:

The rules
A window is at least 60 minutes in a row where the sun is 18° or more below the horizon (astronomical darkness), the target is at least 30° up, and a sky score that accounts for altitude, darkness and the moon is 50 or better. Positions are sampled every 15 minutes, and both ends of each interval have to pass. Separate usable stretches are never added together, because two 30-minute gaps in the clouds aren’t an hour of integration.
On top of that the forecast has to show cloud cover under 50%, precipitation chance under 30%, wind under 15 mph, gusts under 20 mph and a clear or partly cloudy weather code for the whole window. Those numbers are my preferences, not anything DWARFLAB publishes. High cloud over 30% and temperatures within 4°F of the dew point get flagged as advisories (transparency and dew on the lens) but never block a window.
For ranking, longer windows win, but only up to three hours. Billerica is at 42.5° north, so anything north of about +47.5° declination never sets. Without the cap, the Double Cluster and the Heart Nebula would win every clear night of their season just by being up all night. After three hours it falls through to sky score, then to whichever starts earlier.
Unknown is not clear
This is the rule I care about most. The weather check returns one of three states: suitable, blocked or unknown. A missing or garbage value (null, negative, a cloud cover of 140%) is unknown. So is an hour past the end of the forecast. So is a forecast that’s more than 30 minutes old, offline or failed to load.
Unknown windows still show up, labeled “weather unverified,” because the sky geometry is still true. They can never be labeled “Forecast supports a session.” Known bad values still win, so a forecast with half its fields missing and rain in the other half is blocked, not unknown.
The seven-night view is where all of this shows. That week, Thursday and Friday were out, and it said why. Saturday was the best night of the week, with six hours on the Andromeda Galaxy, but it was marked as a lower-confidence forecast because it was three days out.

Further down, that page adds up usable hours per target across the week, which is how I decide what to keep shooting over several nights.
Pointing it
Inspect opens a six-hour session view with a timeline, a target list and a chart of the sky overhead:

The star catalog is hand-entered J2000 coordinates with no correction for precession, which is off by about 22 arcminutes by 2026. It’s for holding the screen overhead and getting oriented, not for pointing. The DWARF does the pointing.
Framing is real math, though. The telephoto camera is a 150 mm lens on a Sony IMX678 recording 3840 × 2160 pixels at 2 µm, which works out to a field of about 2.93° × 1.65°. Each target’s catalog size comes from SEDS or Steinicke’s Revised NGC/IC, with sources written down in the repo. That night’s target was 18′ × 13′, about 13% of the frame. The Heart Nebula is 150′ across and gets “mosaic for full extent.”
How it’s built
It’s TanStack Start, React and TanStack Query, deployed as static files. All the astronomy runs in the browser with SunCalc and my own catalog. The only network request is the Open-Meteo forecast, which needs no API key, and there are no accounts, database or analytics. Times are America/New_York throughout, and there are tests for the nights the clocks change.
On October 14, the answer was one hour on a nebula between two bands of cloud. That Saturday looked better.