Overview
Users can currently sync their Discogs collection via OAuth, but they receive no feedback when the monthly data import brings in new releases, new information about watched artists, or changes to their areas of interest. A Notifier Service adds watchlists and push/webhook notifications to close this loop.
Motivation
The monthly Discogs data dump cycle is the heartbeat of the platform. Graphinator and Tableinator process 15M+ releases each cycle, but this work is invisible to end users. A notification layer transforms the platform from a passive query tool into one that actively surfaces new information relevant to each user.
Proposed Features
Watchlists
Users can watch any entity in the graph:
- Artist — notify when new releases appear, or when the artist gains new aliases/members
- Label — notify when new releases are published on the label
- Genre/Style — notify when release count crosses a threshold or notable new releases appear
- Search query — notify when new entities match a saved search
Watchlists are stored in PostgreSQL per user and managed via the API.
Notification Channels
- In-app feed:
GET /api/notifications returns paginated notification history; POST /api/notifications/{id}/read marks as read
- Webhook: user configures a URL; Notifier POSTs a JSON payload on each event
- Email (optional / future): pluggable delivery backend, initially disabled
Notification Triggers
After each import cycle completes (Graphinator + Tableinator both signal done via a RabbitMQ completion message):
- Notifier queries watched entities for each user
- Compares current graph state against the last-seen snapshot (stored in PostgreSQL)
- Generates notification records for any differences
- Dispatches via configured channels
Architecture
- New service:
notifier/ — FastAPI app with a background task listener
- Trigger: subscribes to a RabbitMQ
import.completed exchange (new exchange, published by Graphinator/Tableinator when a full cycle finishes)
- Storage:
notifier.watchlists — user_id, entity_type, entity_id, created_at
notifier.notification_events — user_id, entity_type, entity_id, event_type, payload JSONB, sent_at, read_at
notifier.webhook_configs — user_id, url, secret (for HMAC signing), active
- Health: standard health endpoint at port 8010
- API endpoints (authenticated):
GET /api/watchlist — list watched entities
POST /api/watchlist — add entity to watchlist
DELETE /api/watchlist/{id} — remove from watchlist
GET /api/notifications — paginated notification feed
POST /api/notifications/read-all — mark all read
POST /api/webhook — configure webhook URL
DELETE /api/webhook — remove webhook
Webhook Payload Example
{
"event": "new_releases",
"entity_type": "artist",
"entity_id": "artist-123",
"entity_name": "John Coltrane",
"detail": {
"new_release_count": 3,
"release_ids": ["r-456", "r-789", "r-1011"]
},
"timestamp": "2026-02-01T00:00:00Z"
}
HMAC-SHA256 signature sent in X-Discogsography-Signature header for webhook verification.
Import Completion Signal
Graphinator and Tableinator each publish a message to import.completed exchange when they finish processing a data dump. Notifier only fires after both signal completion (tracked with a simple counter in Redis).
Acceptance Criteria
Overview
Users can currently sync their Discogs collection via OAuth, but they receive no feedback when the monthly data import brings in new releases, new information about watched artists, or changes to their areas of interest. A Notifier Service adds watchlists and push/webhook notifications to close this loop.
Motivation
The monthly Discogs data dump cycle is the heartbeat of the platform. Graphinator and Tableinator process 15M+ releases each cycle, but this work is invisible to end users. A notification layer transforms the platform from a passive query tool into one that actively surfaces new information relevant to each user.
Proposed Features
Watchlists
Users can watch any entity in the graph:
Watchlists are stored in PostgreSQL per user and managed via the API.
Notification Channels
GET /api/notificationsreturns paginated notification history;POST /api/notifications/{id}/readmarks as readNotification Triggers
After each import cycle completes (Graphinator + Tableinator both signal done via a RabbitMQ completion message):
Architecture
notifier/— FastAPI app with a background task listenerimport.completedexchange (new exchange, published by Graphinator/Tableinator when a full cycle finishes)notifier.watchlists— user_id, entity_type, entity_id, created_atnotifier.notification_events— user_id, entity_type, entity_id, event_type, payload JSONB, sent_at, read_atnotifier.webhook_configs— user_id, url, secret (for HMAC signing), activeGET /api/watchlist— list watched entitiesPOST /api/watchlist— add entity to watchlistDELETE /api/watchlist/{id}— remove from watchlistGET /api/notifications— paginated notification feedPOST /api/notifications/read-all— mark all readPOST /api/webhook— configure webhook URLDELETE /api/webhook— remove webhookWebhook Payload Example
{ "event": "new_releases", "entity_type": "artist", "entity_id": "artist-123", "entity_name": "John Coltrane", "detail": { "new_release_count": 3, "release_ids": ["r-456", "r-789", "r-1011"] }, "timestamp": "2026-02-01T00:00:00Z" }HMAC-SHA256 signature sent in
X-Discogsography-Signatureheader for webhook verification.Import Completion Signal
Graphinator and Tableinator each publish a message to
import.completedexchange when they finish processing a data dump. Notifier only fires after both signal completion (tracked with a simple counter in Redis).Acceptance Criteria