A from-scratch reimplementation of the Pardo et al. 2025 unsupervised technosignature-detection pipeline (arXiv:2505.03927), evaluated honestly on the labelled Kaggle SETI Breakthrough Listen dataset — plus Cadence Console, an interactive 3D web app for exploring the results.
Author: Satyansh Tripathi · built to share with the Penn State Extraterrestrial Intelligence Center (PSETI)
📄 Full write-up:
report/writeup.pdf· 🎛️ Interactive app: Cadence Console
Each sample is a cadence — 6 spectrograms taken while the telescope alternates between pointing at a target star (ON-target, planes 0/2/4) and away (OFF-target, planes 1/3/5):
Cadence order: [ A , B , A , C , A , D ]
Plane index: 0 1 2 3 4 5
ON OFF ON OFF ON OFF
A real technosignature appears only in the ON planes; human interference (RFI) shows up in all six. The whole pipeline is unsupervised — labels are used only for the final evaluation, never for training.
| # | Filter | Idea | Code | Notebook |
|---|---|---|---|---|
| 1 | Cross-correlation + UMAP + KDE | Fingerprint how the 6 planes correlate, then score how close each cadence sits to a synthetic "real-signal" cluster | src/cc_filter.py |
03 |
| 2 | Frequency rarity | Model candidate frequencies with a GMM; a rare frequency is less RFI-like | src/freq_score.py |
04 |
| 3 | Thumbnail similarity | Do the 3 ON thumbnails clump together and away from the OFF ones? | src/similarity_score.py |
05 |
Combined score + evaluation: notebooks/06_evaluation.ipynb (src/evaluate.py).
On our 1,120-cadence local subset (the full 131 GB dataset doesn't fit locally), all three filters — and their combination — score near chance:
| Score | Filter 1 | Filter 2 | Filter 3 | Combined |
|---|---|---|---|---|
| AUC-ROC | 0.51 | 0.52 | 0.48 | 0.51 |
This is a carefully diagnosed negative result, not a tuned-to-labels number. A
synthetic sanity check confirms the method does separate signals when ground truth
is known (65% neighbour purity vs. a 1.6% chance baseline), and a supervised
classifier can't beat chance on the same features either — so it isn't a UMAP/KDE
bug. The likely cause: this Kaggle competition is genuinely hard for non-deep-learning
methods, and 1,120 files is a tiny slice of the ~60,000-cadence survey. See the
report for the full diagnosis, and kaggle_full_run.py to
re-run the whole pipeline at full scale on Kaggle's mounted copy of the data.
An interactive 3D explorer for the pipeline: fly through a point cloud of every cadence, click any one to inspect its spectrogram and real filter scores, or inject a synthetic signal and watch it run through the live pipeline. Built with FastAPI + vanilla JS / Three.js — no CDNs, no build step, runs fully offline.
Click a cadence → its 6-plane A/B/A/C/A/D waterfall + real Filter 1/2/3 scores. |
Inject a synthetic ON-target signal → scored live through the real pipeline. |
Run it (from the project root, with the venv created — see Setup):
# 1. Build the cache once (~1–2 min): fits the models + 3D embedding
python app/generate_cache.py
# 2. Start the server
uvicorn app.server:app --port 8000
# 3. Open http://127.0.0.1:8000On Windows you can skip activating the venv and call its Python directly:
D:\et_proj\venv\Scripts\python.exe app\generate_cache.py
D:\et_proj\venv\Scripts\python.exe -m uvicorn app.server:app --port 8000More detail — endpoints, architecture, how injection is scored live — in
app/README.md.
src/ reusable pipeline code (loaders, the 3 filters, evaluation)
notebooks/ 01 exploration → 06 evaluation (each walked through step by step)
app/ Cadence Console web app (FastAPI backend + Three.js frontend)
report/ writeup.pdf + all figures
assets/ screenshots used in this README
kaggle_full_run.py run the whole pipeline at full scale on Kaggle
See SETUP.md. In short: Python 3.11 venv, pip install -r requirements.txt.
The Kaggle data is not committed (see .gitignore); download a local subset with
download_subset.py, or use Kaggle Notebooks for full scale.
- Pardo et al. 2025 — arXiv:2505.03927 — the pipeline reimplemented here
- Zhang et al. 2019 — arXiv:1901.04636 — self-supervised autoencoder for SETI
- Brzycki et al. 2022 —
setigen(synthetic signal generation) - Ma et al. 2023 — arXiv:2301.12670 — deep-learning search, 820 stars
- Lebofsky et al. 2019 — Breakthrough Listen data format
Released under the MIT License — free to use, modify, and share with attribution.


