← Projects

Night Sky Digest

New astrophysics papers every morning, summarised with citations that are checked, searchable in four languages. A retrieval system I evaluated before trusting it, and run like a production service on my own cluster.

Open the live siteRepository
abstracts indexed
51,282
nDCG@10, hybrid, 80 queries
0.72
human audit vs labels, κ
0.81
warm search, end to end
~0.65 s

How it works

Three nightly jobs and one API, all on k3s, deployed by Argo CD from a separate GitOps repository. The GPU work runs on my desktop over Tailscale.

02:00 · CronJobIngestOAI-PMH, 1 request / 3 s, resumable, idempotent upserts
02:30 · CronJobEmbedbge-m3 on my desktop's GPU, only new or changed papers
CloudNativePGPostgres + pgvectorpapers, vectors, full-text index, digests; WAL archived
06:00 · CronJobDigestlocal LLM per subfield; every cited ID checked
Cloudflare TunnelWebsite + APIhybrid search, lexical fallback if the GPU box is off

Evaluated before trusted

80 queries, 60 English and 20 German, each with an intent that defines relevance. 1,971 pooled results were graded by two local models from different families; a third broke ties. I audited a random 30: 90% exact agreement, κ 0.81. A CI gate fails any change that drops recall@10 or nDCG@10 by more than two points.

The finding I didn't expect: full-text search scores zero on German and on contrarian questions, and drags hybrid search down there. That's the first experiment for M6.

nDCG@10 by search mode
QueriesKeywordMeaningHybrid
English (60)0.450.690.74
German (20)0.000.670.67
Contrarian (8)0.020.490.47
All (80)0.340.690.72

Run like a service

Alerts fire on what a reader would notice, not on every hiccup. Multiwindow burn-rate rules page my phone through Telegram.

SLO · freshnessDigest ready by 07:00 on 99% of days

Measured from the database, so short-lived jobs need no push gateway.

SLO · search99% without errors, p95 under 800 ms

28-day windows; a minimum-traffic guard so two slow requests can't page.

backupsRestored on purpose, 51,282 rows matched

CloudNativePG base backups plus WAL, recovered into a throwaway cluster.

supply chainSigned images, SBOM, CVE gate

Digest-pinned bases, Trivy, Syft, keyless cosign, verified before deploys.

What broke, and what it taught me