Skip to content

Spottr — a Spotnet indexer

A self-hosted indexer for Spotnet, the Dutch-language catalogue that lives in a Usenet newsgroup: it reads the group, verifies what it reads, and turns it into a searchable list of films, series, books, comics, music, games and software, with a one-click send to SABnzbd and a Newznab API for Prowlarr, Sonarr and Radarr. One container, one SQLite file.

The list on the Comics filter: each spot with its poster, format, source and language, size and age

Status 2026-10-19: in use, in production. Release 0.7.2, MIT licence.

Source: github.com/rousseauxy/spottr. Image: ghcr.io/rousseauxy/spottr:0.7.2 (also :latest), for linux/amd64.

New since 0.3: filters by kind (movies, series, books, comics); the send to SABnzbd with a category and the archive password; withdrawals honoured, by the poster and by the network's moderators, also for the past; 18+ spots only on a tab of their own; links from a spot's poster, tag and every badge to the list filtered by it; Newznab categories by kind, for Prowlarr, Sonarr and Radarr.

Why we built it

Spotweb, the PHP indexer most Spotnet users run, did the job for years, and it shows them. A web server, PHP and a MySQL database to keep alive; an upgrade script to run by hand after every update; a first sync that reaches back only so far, after which the older history stays out of reach; and a security model from another era.

What we wanted instead:

  • One container with an embedded database, nothing to run beside it.
  • The whole history, retrieved in the background and resumed across restarts, not just the last few months.
  • Spotnet's signatures checked, so a spotter's identity and a withdrawal mean what they say.
  • A list that reads well on a phone, and filters that match how people look: films, series, books, comics.
  • SABnzbd and the Arr applications as first-class clients.
  • Safe by default on a network other people share: no open admin port, no anonymous downloads.

What sets it apart

The whole group, verified

Spottr reads the newsgroup's overview, parses each spot's header and checks its RSA signature: Spotnet's master keys for the classic spots, the poster's own key for self-signed ones. A first sync reaches back SYNC_LOOKBACK articles (500,000 by default); with BACKFILL=true a background worker walks the rest of the group back to its first article, checkpointed, at a pace that leaves the news server's connections for everything else. On our instance that is about 2.5 million spots, back to 2009.

Text is stored as UTF-8 whatever the poster's software sent: encoded subject lines are decoded, and the 8-bit titles of older Windows posting tools are read as Windows-1252.

Filters that match what people look for

Spotnet sorts everything into four main categories, and the first of them, "Beeld", mixes films, series, books, magazines and comics. Spottr splits it by each spot's type code, and for older spots that have none it derives the type from their other codes, as Spotweb does. The filters are All, Movies, Series, Books, Comics, Audio, Games, Apps; a search works within any of them.

A spot: its cover, size and date, and every format, source, language and genre as a link to more of the same

Everything on a spot is a link: its kind, its poster, its tag and each badge (ePub, Scan, NL subs, a genre) open the list filtered by it, with a chip to take the filter off again.

Withdrawals honoured, past and present

A poster can withdraw a spot: a typo in the title, a duplicate, a broken upload. About one article in fifteen in the group is such a withdrawal. Spottr applies the two kinds Spotweb applies:

  • A poster's own withdrawal, signed with their key, within five days, for a spot that key posted. The owner of a spot is only in its full headers, so Spottr reads them once when a withdrawal arrives.
  • A moderator's withdrawal, signed with the network's moderator key, for any spot.

A withdrawal whose signature does not check out is never applied. (Spotweb applies a personal withdrawal whose signature fails as if a moderator had sent it; Spottr does not.) The first start of a release that honours withdrawals also walks the history once and applies everything that was withdrawn before. With MODERATION_MODE=mark a withdrawn spot is hidden and kept, so the choice can be undone.

Send to SABnzbd, with the password

Send to SABnzbd: a name, one of SABnzbd's own categories, and the archive password found in the description

Spottr fetches the NZB itself and uploads it to SABnzbd, so SABnzbd never has to reach back into Spottr. The dialog offers SABnzbd's own categories (the last one used is remembered) and the archive password for an encrypted upload. When the poster wrote the password in the description, it is filled in and marked as such; phrases that say there is no password ("Geen wachtwoord nodig") are recognised and leave the field empty.

18+ only where asked for

18+ spots are off unless the server allows them (ALLOW_ADULT). Allowed, they appear on an 18+ tab of their own and nowhere else: not in All, not in another filter, not in a search outside that tab. Their covers show a generic 18+ mark until you choose to see them. The Newznab API follows the same rule: category 6000 on its own.

Hardened by default

Non-root, a read-only root filesystem, a content security policy, rate limits, and size limits on what is read from Usenet: an NZB's decompressed size, a cover's articles. A forwarded client address or sign-in header is believed only from the proxies you list. Downloading an NZB needs the API key or a signed-in user; reaching the port is not enough.

Where to go next