Open-source media tracker — Letterboxd + Trakt + Last.fm alternative for movies, TV shows & music. Decentralized, privacy-first tracking, ratings, reviews & watchlists on Nostr + IPFS. No lock-in.
134
stars
102
commits
JavaScript
primary language
Sep 13, 2026
updated
The Open-Source Media Tracker & Decentralized Media Database.
Replacing Letterboxd, Trakt, and Last.fm for tracking — and replacing IMDb and TMDB with an open, permissionless protocol for developers.
Trackstr unites personal media tracking and an open social layer into a single decentralized stack:
| Dimension | Legacy Trackers (Letterboxd, Trakt, Last.fm) | Commercial DBs (IMDb, TMDB) | Trackstr |
|---|---|---|---|
| Scope | Siloed (separate apps for movies, TV, music) | Metadata catalogs only | All-in-one (Movies, TV series, episodes, music) |
| Data Ownership | Proprietary servers; locked-in diaries | Proprietary datasets | Self-sovereign (owned by your Nostr pubkey) |
| Developer API | Heavily restricted or non-existent | Paywalled tiers, rate limits, commercial licenses | 100% Free & Permissionless (query any Nostr relay) |
| Content ID | Proprietary internal identifiers | tt..., tmdb_id vendor lock-in | Deterministic SHA-256 (sha256(canonical_string)) |
| Media Metadata | Proprietary & locked | Proprietary image CDNs & paywalls | Open & Direct (Wikipedia, TVMaze, TMDB, MusicBrainz) |
plan-to-watch, watching, completed, on-hold, dropped, plan-to-listen, listening).nsec keys. Zero email/password dependencies.Trackstr replaces centralized REST APIs with open Nostr event kinds and deterministic content addressing. Any client can read and build on this data without authentication or API tokens.
| Kind | Type | NIP | Purpose |
|---|---|---|---|
35400 | Parameterized Replaceable | NIP-33 | Mutable user rating (1–10) & written reviews (with spoiler flags). Keyed by d tag (contentid or contentid:s{season}e{episode}). |
35401 | Parameterized Replaceable | NIP-33 | Mutable similar title suggestions (community recommendation feedback loop). Keyed by d tag (source_contentid). |
35402 | Parameterized Replaceable | NIP-33 | Mutable watch/listen status and episode progress. |
5 | Deletion | NIP-09 | Cryptographic deletion notices referencing replaceable coordinates. |
To avoid dependency on IMDb IDs (tt1234567) or TMDB IDs, Trackstr computes a deterministic SHA-256 hash from normalized metadata:
// Movies & TV Shows
canonicalString = `${norm(type)}|${norm(title)}|${norm(year)}`
// Music Releases
canonicalString = `music|${norm(artist)}|${norm(title)}|${norm(year)}`
// Deterministic 64-character hex ID:
contentId = sha256(canonicalString)
Normalization applies Unicode NFKC normalization, lowercase conversion, trimmed whitespace, and delimiter escaping (\|).
Any developer or client can query user ratings, watch status, and reviews directly from standard Nostr relays without accounts, tokens, or rate limits:
import { SimplePool } from 'nostr-tools'
const pool = new SimplePool()
const relays = ['wss://relay.damus.io', 'wss://nos.lol', 'wss://relay.primal.net']
// Query all ratings and reviews for any title by contentId
const events = await pool.querySync(relays, {
kinds: [35400],
'#d': [contentId]
})
22+ (or Podman / Docker)# Clone the repository
git clone https://github.com/besoeasy/Trackstr.git
cd Trackstr
# Install dependencies & start dev server
npm install
npm run dev
All workflows run in Node LTS containers — no host Node or npm required:
# Development server (http://localhost:5173)
npm run dev:podman
# Run test suite
npm run test:podman
# Static production build
npm run build:podman
# Preview production build (http://localhost:4173)
npm run preview:podman
The Vitest suite covers Nostr event builders, canonical content ID hashing, local key signing, and metadata parsers:
npm test
# Or containerized:
npm run test:podman
Trackstr compiles to a 100% static, client-side bundle with zero backend dependencies (your data lives on Nostr relays):
npm run build
The output in dist/ can be served by any static host (Cloudflare Pages, Vercel, GitHub Pages, Nginx). A production-ready Dockerfile and nginx.conf are provided.
Building with Cursor, Claude, ChatGPT, Copilot, or Antigravity? You're in the right place.
Trackstr is engineered to be an ideal playground for AI-assisted development:
npm run dev and your frontend connects directly to open Nostr relays.npm test or npm run test:podman), enabling fast, automated AI iteration loops.Have an idea for a custom theme, a mini player, a Raycast extension, a Discord bot, or a CLI? Fork it, prompt your favorite model, and ship it.
Contributions of all kinds are warmly welcomed! Check out our comprehensive Contributing Guide for:
git checkout -b feat/my-awesome-feature)git commit -m 'feat: add my awesome feature')git push origin feat/my-awesome-feature)Open source under the MIT License.
102 commits
JavaScript
52.7%
Vue
43.3%
CSS
3.3%
Open-source media tracker — Letterboxd + Trakt + Last.fm alternative for movies, TV shows & music. Decentralized, privacy-first tracking, ratings, reviews & watchlists on Nostr + IPFS. No lock-in.
134
stars
102
commits
JavaScript
primary language
Sep 13, 2026
updated
The Open-Source Media Tracker & Decentralized Media Database.
Replacing Letterboxd, Trakt, and Last.fm for tracking — and replacing IMDb and TMDB with an open, permissionless protocol for developers.
Trackstr unites personal media tracking and an open social layer into a single decentralized stack:
| Dimension | Legacy Trackers (Letterboxd, Trakt, Last.fm) | Commercial DBs (IMDb, TMDB) | Trackstr |
|---|---|---|---|
| Scope | Siloed (separate apps for movies, TV, music) | Metadata catalogs only | All-in-one (Movies, TV series, episodes, music) |
| Data Ownership | Proprietary servers; locked-in diaries | Proprietary datasets | Self-sovereign (owned by your Nostr pubkey) |
| Developer API | Heavily restricted or non-existent | Paywalled tiers, rate limits, commercial licenses | 100% Free & Permissionless (query any Nostr relay) |
| Content ID | Proprietary internal identifiers | tt..., tmdb_id vendor lock-in | Deterministic SHA-256 (sha256(canonical_string)) |
| Media Metadata | Proprietary & locked | Proprietary image CDNs & paywalls | Open & Direct (Wikipedia, TVMaze, TMDB, MusicBrainz) |
plan-to-watch, watching, completed, on-hold, dropped, plan-to-listen, listening).nsec keys. Zero email/password dependencies.Trackstr replaces centralized REST APIs with open Nostr event kinds and deterministic content addressing. Any client can read and build on this data without authentication or API tokens.
| Kind | Type | NIP | Purpose |
|---|---|---|---|
35400 | Parameterized Replaceable | NIP-33 | Mutable user rating (1–10) & written reviews (with spoiler flags). Keyed by d tag (contentid or contentid:s{season}e{episode}). |
35401 | Parameterized Replaceable | NIP-33 | Mutable similar title suggestions (community recommendation feedback loop). Keyed by d tag (source_contentid). |
35402 | Parameterized Replaceable | NIP-33 | Mutable watch/listen status and episode progress. |
5 | Deletion | NIP-09 | Cryptographic deletion notices referencing replaceable coordinates. |
To avoid dependency on IMDb IDs (tt1234567) or TMDB IDs, Trackstr computes a deterministic SHA-256 hash from normalized metadata:
// Movies & TV Shows
canonicalString = `${norm(type)}|${norm(title)}|${norm(year)}`
// Music Releases
canonicalString = `music|${norm(artist)}|${norm(title)}|${norm(year)}`
// Deterministic 64-character hex ID:
contentId = sha256(canonicalString)
Normalization applies Unicode NFKC normalization, lowercase conversion, trimmed whitespace, and delimiter escaping (\|).
Any developer or client can query user ratings, watch status, and reviews directly from standard Nostr relays without accounts, tokens, or rate limits:
import { SimplePool } from 'nostr-tools'
const pool = new SimplePool()
const relays = ['wss://relay.damus.io', 'wss://nos.lol', 'wss://relay.primal.net']
// Query all ratings and reviews for any title by contentId
const events = await pool.querySync(relays, {
kinds: [35400],
'#d': [contentId]
})
22+ (or Podman / Docker)# Clone the repository
git clone https://github.com/besoeasy/Trackstr.git
cd Trackstr
# Install dependencies & start dev server
npm install
npm run dev
All workflows run in Node LTS containers — no host Node or npm required:
# Development server (http://localhost:5173)
npm run dev:podman
# Run test suite
npm run test:podman
# Static production build
npm run build:podman
# Preview production build (http://localhost:4173)
npm run preview:podman
The Vitest suite covers Nostr event builders, canonical content ID hashing, local key signing, and metadata parsers:
npm test
# Or containerized:
npm run test:podman
Trackstr compiles to a 100% static, client-side bundle with zero backend dependencies (your data lives on Nostr relays):
npm run build
The output in dist/ can be served by any static host (Cloudflare Pages, Vercel, GitHub Pages, Nginx). A production-ready Dockerfile and nginx.conf are provided.
Building with Cursor, Claude, ChatGPT, Copilot, or Antigravity? You're in the right place.
Trackstr is engineered to be an ideal playground for AI-assisted development:
npm run dev and your frontend connects directly to open Nostr relays.npm test or npm run test:podman), enabling fast, automated AI iteration loops.Have an idea for a custom theme, a mini player, a Raycast extension, a Discord bot, or a CLI? Fork it, prompt your favorite model, and ship it.
Contributions of all kinds are warmly welcomed! Check out our comprehensive Contributing Guide for:
git checkout -b feat/my-awesome-feature)git commit -m 'feat: add my awesome feature')git push origin feat/my-awesome-feature)Open source under the MIT License.
102 commits
JavaScript
52.7%
Vue
43.3%
CSS
3.3%