An open anime identity and metadata database for offline lookup.
AnimeAtlas resolves an anime title, alias, or external provider ID (Bangumi / TMDB / AniDB) to a stable media-* identity and normalized metadata. It is built for scrapers, media managers, and library tools that need a local snapshot instead of repeated provider API calls.
A single-file SQLite snapshot is published under a fixed download link that always points at the latest build — the URL never changes between releases:
https://github.com/ModerRAS/AnimeAtlas/releases/download/download/animeatlas.sqlite
curl -L -o animeatlas.sqlite \
https://github.com/ModerRAS/AnimeAtlas/releases/download/download/animeatlas.sqliteThe release itself is a single rolling release tagged download, overwritten on every publish. Because the URL is stable, you can pin it in scripts, docs, and package managers. The exact build is recorded inside the file in the release_info table, so you can always tell which snapshot you have even though the link never changes:
SELECT value FROM release_info WHERE key = 'version';media (id, kind, title, summary, metadata_json, provenance_json)
aliases (media_id, value, normalized, language, type, source, confidence)
provider_refs (media_id, provider, entity, provider_id, provider_key)
search_tokens (token, media_id)
release_info (key, value)
Indexes: aliases(normalized), provider_refs(provider, entity, provider_id), search_tokens(token).
media— one row per anime identity.metadata_jsonholds the normalized fields (title, summary, genres, studios, season, episode count, runtime, air dates, …);provenance_jsonrecords which provider, source field, and rule produced each value.aliases— every alias for a media identity.normalizedis the NFKC + trimmed + lowercased form used for exact matching.provider_refs— the mapping between internalmedia-*IDs and external provider IDs (e.g.bangumi:subject:443666).provider_keyis unique.search_tokens— token index for fuzzy / token-based title search.
-- Resolve an alias. `normalized` stores NFKC + trimmed + lowercased text.
SELECT m.id, m.title
FROM aliases a JOIN media m ON m.id = a.media_id
WHERE a.normalized = 'sousou no frieren';
-- Look up a media identity by a Bangumi subject ID.
SELECT m.id, m.title, m.summary
FROM provider_refs p JOIN media m ON m.id = p.media_id
WHERE p.provider = 'bangumi' AND p.entity = 'subject' AND p.provider_id = '443666';
-- Pull normalized metadata and its provenance for one media identity.
SELECT metadata_json, provenance_json FROM media WHERE id = 'media-000001';The repository also ships a CLI for offline resolution against the committed JSON indexes (no network needed).
Requirements: Node.js 22+, pnpm 10+.
corepack enable
pnpm install --frozen-lockfile
pnpm checkResolve a title/alias or an external provider ID from the local indexes:
pnpm cli -- resolve alias "Sousou no Frieren"
pnpm cli -- resolve provider bangumi subject 443666Both return the matching media-* ID plus normalized metadata and provenance when a record is found. Add --compact for single-line JSON output.
| Command | Purpose |
|---|---|
resolve alias <title> |
Normalize an alias and look up its media identity |
resolve provider <provider> <entity> <id> |
Map an external provider ID to a media identity |
bangumi plan-archive <file> |
Plan a bulk import from a Bangumi archive dump |
contributions plan-approved |
Preview mutations from approved contribution Issues |
contributions apply-approved --write |
Apply approved contributions to db/ |
The committed snapshot is a seed dataset that consolidates IDs across providers and carries normalized metadata with field-level provenance (which provider, which source field, and which rule produced each value). It grows through reviewed community contributions. See generated/stats/summary.json for current record counts (media, aliases, provider refs, search tokens).
reviewed source inputs
|
v
source/ -> db/ -> generated/ -> SQLite release
^
normalized records
| Directory | Purpose | Edit policy |
|---|---|---|
source/ |
Approved community contributions, import manifests, and durable editorial decisions | Created through reviewed workflows |
raw/ |
Optional captured provider evidence | Machine-written only |
db/ |
Normalized media, alias, metadata, relation, and provenance records | Generated by the import pipeline |
generated/ |
Deterministic lookup indexes, manifests, and statistics | Run pnpm generate; never edit manually |
apps/ |
CLI, GitHub Action helper, and static viewer | Application entry points |
packages/ |
Schemas, provider contracts, importer, validator, and generator | Reusable domain logic |
generated/ is disposable output. source/ and provider evidence explain how the published snapshot was produced; db/ is the stable JSON consumption layer.
Do not edit database JSON directly. Submit an identity, alias, provider reference, or metadata correction through the data contribution Issue form.
- A maintainer reviews the structured Issue and applies the
approvedlabel. - GitHub Actions parses the contribution, applies it through the importer, regenerates indexes, and runs
pnpm check. - On success, automation commits the updated
source/,db/, andgenerated/records tomaster, closes the Issue, and refreshes thedownloadSQLite release.
The approval label is the write gate. Community input is stored as an auditable contribution record before it affects normalized data.
| Command | Purpose |
|---|---|
pnpm check |
Build, typecheck, validate data, verify generated artifacts, and run smoke checks |
pnpm validate |
Validate source and normalized records |
pnpm generate |
Rebuild deterministic indexes and manifests from db/ |
pnpm check:generated |
Fail when committed generated artifacts are stale |
pnpm cli -- contributions plan-approved |
Preview approved contribution mutations without writing files |
pnpm cli -- contributions apply-approved --write |
Apply approved contributions locally |
pnpm release:sqlite |
Build release/animeatlas.sqlite |
Run pnpm check before committing a data or schema change. It is the same validation gate used by repository automation.