I built an honest radio-astronomy research pipeline (and it mostly finds nothing)
Most of the analyses I've written find nothing.
I want to lead with that, because it's the whole point. Over the past few months I built a set of tools that take public radio-astronomy data — fast radio bursts, pulsars, the Sun, the planets, hydrogen across the galaxy — and ask a narrow, answerable question of each one. More often than not, the honest answer is "there's no signal here, and here's the calibrated reason why." That's not a failure mode. For careful amateur science on archival data, a well-defended null is usually the most interesting thing you can produce.
Here's how it all fits together, and why I think the discipline matters more than any single result.
Three repositories: learn, do, observe
It grew into three projects that point at each other.
jansky is the course — a hands-on radio-astronomy curriculum in Python. Thirty-six executable Jupyter notebooks, each pairing the physics with runnable code and plots, each citing the seminal papers, all built on a small tested helper package. It's named after Karl Jansky, who discovered cosmic radio waves in 1932 by chasing down a hiss in a telephone antenna. You can read it online.
jansky-research is where the course grows up and does original work. It's a toolkit of 40-plus self-contained analysis "slices," and every one is built to the same recipe (more on that below). It depends on the course as a library, and it just hit v1.0.0, archived with a DOI.
jansky-observe is the rooftop station — actual hardware I'm building to collect my own calibrated hydrogen-line spectra, with provenance, and feed them back into the research repo so self-collected data sits alongside the big public archives. Learn → do → observe, closing the loop.
The method: recover a known signal first
Every result follows one discipline, and I don't let myself skip a step:
- Write a tested tool — pure NumPy/SciPy, with a synthetic fixture so the whole thing runs offline. Before it's allowed anywhere near real data, it has to recover a signal I already know the answer to — an injected period, a published measurement. If it can't recover the known thing, it doesn't get to make claims about the unknown thing.
- Run it on real public data.
- Try to knock the result down. An adversarial review step exists specifically to attack each finding — to ask whether the "signal" is really a calibration artifact, a selection effect, or wishful thinking. It has caught real blunders every single time.
- Write it up honestly — wins and negatives, plainly. Not one headline number is typed by hand; every figure and value regenerates from the pipeline.
That "recover-a-known first" rule is the load-bearing wall. It's the difference between a tool and a random-number generator with good PR.
What that looks like in practice
Some things worked:
- The pipeline recovers FRB 20180916B's 16.35-day activity period straight out of the public CHIME catalogue — a repeating fast radio burst that pulses on a two-week clock, found by folding the data blind.
- It re-finds the Crab pulsar's dispersion measure to 0.3% from a real giant pulse, running the dedispersion transform on a GPU. (Fun benchmark that fell out of it: the smart algorithm on a CPU beats the brute-force one on a GPU by 3.6×.)
- It recovers the flat rotation curve of the inner Milky Way from 21 cm hydrogen data — the same non-Keplerian flatness that was one of the original fingerprints of dark matter.
And a lot of things, honestly, didn't — which is the fun part:
- I did a blind modern reanalysis of the Voyager 2 radio data from the Uranus and Neptune flybys, asking what the rotation periods look like with none of the 1980s magnetic-field modelling. Answer: you recover neither period. The tool recovers a clean injected rotation in testing, so it works — the real data simply isn't a clean rotational signal. The original teams' sophisticated modelling wasn't optional; it was the whole ballgame. That's the result: a controlled null that shows why the hard way was necessary.
- An early SETI "detection" turned out to be a DC-spike artifact sitting at the center of the band — an instrument feature, not ET. The tool now reports the honest non-detection, and the benchmark that caught it ships as a feature.
- A blind census of type II solar radio bursts across two years of an all-sky array came back false-positive dominated: the candidates don't correlate with the coronal mass ejections that should drive them. A clean null, and a concrete reason the existing detectors in that band are built the way they are.
None of these are dressed up. A negative that's honestly defended teaches you something an overclaimed positive never will.
Reproducibility is a feature, not a chore
The part I'm most proud of is boring on purpose: it all regenerates. There's a test suite with a coverage floor, continuous integration, and two complementary ways to rebuild everything — a lightweight file-graph runner for the static analyses, and a streaming ingest pipeline for a solar-radio archive that updates daily. One command walks the whole chain: raw public data → analyses → figures → the papers themselves. Every number in every write-up traces back to code you can run.
If you can't reproduce it, it's an anecdote, not a result.
About the AI
Full disclosure: I built a lot of this alongside an AI coding assistant. I think that's exactly why the guardrails matter. When code is cheap to generate, the discipline is the product — the recover-a-known checks, the adversarial review, the tests, the "every number regenerates" rule are precisely what keep fast-written code from becoming confident nonsense. I directed the work and verified the results, and the nulls stay nulls. If anything, this project is an argument that the answer to "AI makes it easy to produce plausible garbage" is more rigor, made routine.
Come poke at it
It's all open source — MIT for the code, CC BY 4.0 for the papers. Two of the negative results are heading out as Research Notes of the AAS, and the toolkit itself is going to the Journal of Open Source Software. But mostly I'd love for other people to use it, break it, and tell me where I'm wrong — that's what the honest framing is for.
- The course: github.com/joebarbere/jansky (read online)
- The research toolkit: github.com/joebarbere/jansky-research
- And if you've got a patch of sky and the itch to build something, the rooftop station is coming together too.
Find nothing with me. It's more fun than it sounds.
Written with AI assistance. AI icon by Flaticon.