windowsill lab · the kit

Find your own planet

You saw the posts. The data is public, the tools are free, and an AI agent can write the search for you in an afternoon. This is the kit the windowsill lab uses on itself: the same pipeline and the same rules, cut down to one person and one star.

Where do I start? ↓ Open in Colab ↗ See the lab’s own open lead →

Start here

Where are you starting?

Pick the one that sounds like you. Every door ends up in the same place, and none of them skips a rule.

  1. 1Learn the impostors
  2. 2Re-find a known planet
  3. 3Write your question down
  4. 4Let the kit try to kill your dip
  5. 5Say only what it lets you say

Rather read first? Start from zero is just below, and START-HERE.md has all three doors in more detail. Your first real result will almost certainly be already-known or nothing-above-threshold. That isn’t a letdown. It means the search works and you can trust the next one.

Depth 0 · no science needed

Start from zero

This page climbs from plain words to commands you can run. Already know the field? Skip to the quickstart or what the kit doesn’t do.

  1. Stars get a little darker, on schedule

    When something circles a star and crosses our line of sight, it blocks a little of the star’s light once per lap. NASA’s TESS satellite has been measuring the brightness of most of the sky since 2018 and gives every measurement away for free. Look for a dip that repeats, and you are doing what planet hunters do.

    Try it now, no install: fold a known planet’s dips into one shape.

  2. Most dips are not planets

    The windowsill lab’s own search flagged 116 signals. 66 of them turned out to be one of three impostors: two stars eclipsing each other, an echo of some other rhythm in the data, or the star itself pulsing. A search that skips those checks hands you the impostors, labelled “candidate”.

  3. So the kit tries to kill your dip

    It searches your star blind, measures how big a dip it could have missed, checks whether chance alone explains what it found, and then walks every signal past a fixed set of tests built to break it. It also runs a placebo: a scrambled copy of your data that should find nothing. If the placebo finds something, the whole run says nothing.

  4. You write the question down first

    Before you open any data, you fill in a short form (which star, which months of data, what you’re asking) and commit it with a date. The kit won’t run without it. That one step is what turns “I found something” into “here is exactly what I looked for, before I looked”.

  5. And it will never say “planet”

    Nothing automated can tell you a planet is real. That takes astronomers, telescopes and months. So every star ends in one of six words, and the strongest of them means “a person should look at this”. Most honest runs end in the first three, and that is the search working.

    • nothing-above-threshold
    • refuted
    • already-known
    • lead-awaiting-human-review
    • incomplete
    • control-failed

Depth 1 · what the lab learned doing this

Where the kit came from

The windowsill lab is two home computers that have searched TESS around the clock, in public, since August 2026. The kit is what that taught us.

Searches
12,898one star, one month of data, searched blind
Signals
116dips strong enough to look at twice
Known planets re-found
9found without being told where to look; proof the search works
Leads
7signals the automatic tests couldn’t explain
Killed by our own tests
5later, deeper checks by the lab itself
Planets claimed
0and the kit is built so you won’t claim one either

Why bother with the rules? Since 2026-08-19, ExoFOP, where community planet candidates get filed, asks for a peer-reviewed paper before an upload. A viral post doesn’t get a signal onto that list. A dated, public record that anyone can re-run is the thing you actually need, and that is what the kit produces.

Want to see one all the way through? The lab’s own open lead, TIC 374861595, is this method run on a real star, from plain words down to the working file, including what we got wrong.

The journey, step by step

Each step names what to do, the file in the kit that covers it, and how you know you’re done. Go in order. Step 0 is the one people skip, and step 10 is the one that turns a run into a survey.

  1. Learn what a transit is

    You don’t need a physics degree. You do need to know the three things that most often look like a planet and aren’t.

    Done when you can explain why a dip that repeats isn’t automatically a planet. · LEARN.md

  2. Set up

    Clone the lab, install numpy, and run doctor. It checks your Python, the lab code, and whether NASA’s archives answer from your machine.

    Done when doctor is all green, or you know which line isn’t and why. · README.md

  3. Calibrate on a star whose answer you know

    Run WASP-18 (TIC 100100827), a confirmed hot Jupiter, first. If your setup can’t re-find a known planet, nothing it finds anywhere else means anything yet.

    Done when WASP-18, sector 2, ends already-known.

  4. Pick your star

    Good first picks are bright, not crowded, and observed in two or more months, so a lead can be checked in a second month. “It’s the one from the viral post” is a fine reason, as long as you say so.

    Done when you have a TIC number, its sectors, and a reason. · DATA.md

  5. Write the question down, and commit it

    The kit writes the form for you. You fill in the question and why this star, and commit it before you open the light curve.

    Done when the form is committed and you haven’t looked yet. · PREREGISTRATION.md

  6. Run the ladder

    About three minutes per month of data on one core. The blind search, the chance check, the missed-dip floor, the tests, the catalog check and the placebo all run. You don’t pick which.

    Done when you have a receipt that passes the kit’s own check. · PROTOCOL.md

  7. Read the verdict

    explain turns the receipt into one word and one sentence you are allowed to say.

    Done when you can say the word and its sentence out loud.

  8. Decide what’s next

    A lead in one month is provisional: the next step is the same search, written down again, on another month. Everything else gets written down as it is.

    Done when a lead has a second search planned, or the result is recorded. · PROCEDURES.md

  9. Share

    A refuted star shared with its receipt helps the field more than a “candidate” with none. Put the no-token line first.

    Done when your post uses only words from the table below and links the receipt and the commit. · BEFORE-YOU-POST.md

  10. Find your people

    ExoFOP, the TESS follow-up program, Planet Hunters TESS, AAVSO and NASA’s Exoplanet Watch each want different things from you.

    Done when you know which venue fits your result and what it asks. · COMMUNITIES.md

  11. Come back

    Every receipt you keep joins your own survey. ledger regrades each star across all your receipts, so a one-month lead turns persistent, or doesn’t, when you search another month. TESS returns to most of the sky every couple of years.

    Done when your ledger lists every star you’ve searched and what each one needs next. · JOURNEY.md

Not ready to run code? NASA’s Exoplanet Watch and Planet Hunters TESS let you help with a browser, and the kit’s learning ladder goes from never having seen a light curve to knowing where results go.

What each word lets you say

This is the table to keep open when you write the post. It comes straight from the kit.

The kit saysYou can sayYou can’t say
nothing-above-threshold“I searched TIC X in sectors Y and found no repeating dip. On this star the search could have seen transits down to Z %.”“There are no planets here” (shallower ones would be missed)
refuted“My search found a signal and explained it: it’s [the plain reason from the receipt].”anything about a planet
already-known“My search independently re-found [the catalogued signal].” A real result: it shows your pipeline works.“I found it” (somebody else did, first)
lead-awaiting-human-review“I found a repeating dip that my tests couldn’t explain. It is a lead, not a planet.”“I found a planet”, “a new world”, “NASA confirmed it”
incomplete / control-failed“The run didn’t finish / my own controls failed, so it says nothing.”anything else

From a dip to a confirmed planet is eight steps, and only the first five involve you: a signal, a lead, the same lead in a second month, a published paper, and filing it as a community candidate. After that come the TESS team’s own list, statistical validation and a measured mass, and those belong to astronomers. Getting telescope time to look again is a step toward those. It isn’t any of them. The full ladder is in the kit.

Try it

Start with the star whose answer you already know. The kit should end already-known. If it doesn’t, fix your setup before you go looking for anything new.

git clone https://github.com/benskamps/windowsill-lab && cd windowsill-lab
pip install numpy                      # the kit needs nothing else
export PYTHONPATH=src

# 1. Write the question down first, then commit it.
python -m lab.planetkit prereg 100100827 --sectors 2 --out my-prereg.md
git add my-prereg.md && git commit -m "prereg: TIC 100100827 s2"

# 2. Run the ladder. --download fetches the declared sectors from MAST.
python -m lab.planetkit run --prereg my-prereg.md --download

# 3. Read what you're allowed to say.
python -m lab.planetkit explain receipt-TIC100100827-*.json

# 4. Later: every star you've searched, and what each one needs next.
python -m lab.planetkit ledger

Have NASA’s light-curve files already? Use --fits. Only a time,flux table? Use --csv, and the receipt will say which tests couldn’t run without the extra columns. --quick checks the plumbing in seconds, and its receipts are marked so you won’t post one by accident.

What a result looks like

TIC 100000001: lead-awaiting-human-review

My search found a repeating dip that every automatic test failed to explain.
It is a lead for a human to review, not a planet. It is in one sector only,
so it is provisional: the next step is the same search on another sector.

  sector 20: SDE 9.5, P = 3.1791 d, word = lead-awaiting-human-review, placebo passed
  ! The preregistration was never committed, so nobody can tell it was
    written before the data were seen.

Do not say: I found a planet; I discovered a planet; NASA confirmed it; a new world

That is a real full-size run of the kit on a synthetic star: a 0.4 % dip every 3.18 days planted in one simulated month of data. The star is fake. The output is not.

Every run also draws a folded light curve for each month it searched: every dip lined up on top of each other, captioned “A picture, not a verdict.” python -m lab.planetkit_dashboard turns a receipt into one offline page with the system, the star and the candidate side by side. It draws nothing the verdict doesn’t: a refuted star shows why it was refuted, and nothing gets an orbit it hasn’t earned. DASHBOARD.md has the details.

With Claude Code, or any agent

The kit is a Claude Code plugin. Add the lab as a plugin marketplace, install it, and ask Claude to “find a planet the windowsill way”:

/plugin marketplace add benskamps/windowsill-lab
/plugin install find-your-own-planet@windowsill-lab

The plugin installs the rules, not the code: if your folder isn’t a clone of the lab, it tells Claude to clone it first. Not on Claude Code? The skill folder is plain markdown any agent can read. It holds the agent to the same rules as hard lines: write the question first, use the kit’s runner instead of a hand-rolled search, report the verdict word for word, never fix a failed control, and never write that anyone found a planet. Ask it to draft a “we found a planet” post and it will draft the honest one instead.

The ten rules underneath

The kit is these rules, enforced in code. PROTOCOL.md gives each one its reason and where it came from.

Does the kit follow them? CONFORMANCE.md checks the runner against all ten, row by row, naming the line of code that enforces each one. Nine are enforced. The tenth is only partly: the kit prints nothing but receipt values, but it can’t check a post you write yourself. Where the kit bends a rule on purpose, it says so there: an uncommitted question is allowed for a calibration run, and every receipt from that run says so.

  1. Write the question down first, and date it publicly.
  2. One threshold for every star.
  3. Give every signal its own null, in two schemes, and take the worse one.
  4. Measure what this star could have shown you.
  5. Run a placebo through the whole ladder.
  6. Walk a fixed ladder of refutations, and record every rung.
  7. Speak only in a closed vocabulary, with no word for “planet”.
  8. Refuse, don’t repair.
  9. A lead is a property of a star, not of one sector.
  10. Every number in the write-up comes from the receipts.

Is any of this new? The individual tests aren’t. Shuffled-data nulls, planted-dip recovery and automated vetting are how NASA’s Kepler mission vetted its catalogue. What is unusual is putting them in one package for one person with an AI agent, and governing the words: the machine is only allowed to refute, and only a human can move a lead forward.

What the kit doesn’t do (yet)

The runner is the lab’s survey pipeline, and that pipeline stops short of the professional field in a few places. They are listed so you don’t mistake a gap for a pass.

GapWhat it means for your result
No statistical validation (TRICERATOPS)Nothing here can move a small-planet lead past “candidate”, even in principle
No difference imaging of its ownThe on-target check uses NASA’s centroids, which crowding can bias. CSV input has no on-target check at all
Fixed 0.5-day detrendTransits longer than about 5.5 hours lose depth
BLS only, no TLSTLS recovers more Earth-size signals at the same false-alarm rate
One sector searched at a timePeriods beyond about 9 days, and signals too shallow for one month, are missed
2-minute targets onlyMost of the sky’s faint stars are out of reach

These are known, written down, and not quietly patched: changing the pipeline changes every receipt the lab has already published. PROCEDURES.md has the full comparison with sources.

Keep going