89fb18e3ccc4571703808382b988fd6b6e38e312
node:sqlite built-in module requires Node >= 22.5.0; the previous node:20-alpine image threw ERR_UNKNOWN_BUILTIN_MODULE at startup. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
nyaa-crawler
A dockerized torrent crawler and downloader for Nyaa.si. Track anime shows, poll for new episodes via RSS, and automatically download .torrent files to a host-mounted directory.
Features
- Search Nyaa.si and add shows to a watch list
- Automatic polling for new episodes (configurable interval, default 15 min)
- Auto-downloads
.torrentfiles to a mapped host directory - Track episode status: pending, auto-downloaded, or manually marked
- Bulk-mark episodes as already downloaded
- Minimal dark-themed web UI
- SQLite persistence — easy to back up and migrate
- Unraid-friendly Docker container
Stack
- Backend: Node.js + TypeScript + Express
- Frontend: React + Vite
- Database: SQLite (
better-sqlite3) - Scheduler:
node-cron - Nyaa integration: RSS via
fast-xml-parser
Quick Start (Docker)
docker compose up -d
Open http://localhost:8082 in your browser.
Quick Start (Development)
npm install
npm run dev
- Client dev server:
http://localhost:5173(proxies/apito:3000) - API server:
http://localhost:3000
Environment Variables
| Variable | Default | Description |
|---|---|---|
PORT |
3000 |
HTTP port |
POLL_INTERVAL_SECONDS |
900 |
Polling frequency (min 60) |
TORRENT_OUTPUT_DIR |
./data/torrents |
Where .torrent files are saved |
DATABASE_PATH |
./data/db.sqlite |
SQLite database path |
Unraid Deployment
services:
nyaa-watcher:
image: your-registry/nyaa-watcher:latest
container_name: nyaa-watcher
restart: unless-stopped
environment:
- PORT=3000
- POLL_INTERVAL_SECONDS=900
- TORRENT_OUTPUT_DIR=/data/torrents
- DATABASE_PATH=/data/db.sqlite
volumes:
- /mnt/user/appdata/nyaa-watcher:/data
- /mnt/user/downloads/torrents/nyaa:/data/torrents
ports:
- "8082:3000"
Notes
- Only
.torrentfiles are downloaded — media is handled by your existing torrent client watching the output directory. - Batch releases (titles containing "Batch", "Complete", "Vol.", or episode ranges) are automatically skipped.
- Removing a show marks it inactive (no further polling) but preserves episode history.
Description
Languages
TypeScript
88.2%
CSS
10.4%
Dockerfile
0.9%
HTML
0.5%