尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Find what to watch, read, play or listen to next. Mimir is a free catalogue and discovery engine for films, TV series, books and manga, games, music and YouTube, built by Terratales Media Entertainment. Live at mimir.terratalesmedia.world.
Describe what you want to experience: a mood, an idea, a favourite work, a time limit. Mimir returns a few well-chosen picks, each with the reasons it fits. The catalogue holds about 11,000 works from 101 countries in 68 original languages; 681 are fully classified against 372 controlled terms (233 of them subgenres), and the rest, imported from Wikidata, are being classified in batches.
Under the hood, a request in plain language is interpreted into inspectable constraints and preferences, a classified catalogue is ranked against them, and every result is explained from recorded evidence. Facts are labelled separately from interpretations. There is no LLM and no API key.
It is also a browsable catalogue, in the spirit of IMDb, MyAnimeList and Goodreads in one place: directories per medium, 36 shelves, subgenres, tag and people pages, a parents' guide for every medium, "where to watch" links, a personal library with activity rings and badges, shareable lists, watch-alongs and a community.
Ways to tell Mimir your taste, besides rating works: swipe through a deck (right like, up love, left not for me), spin a mood when you have no time to browse, craft hybrids by combining works, moods and genres, and open Days of the year (World Laughter Day, International Music Day and about 50 more) for something new and picks from your own profile. Franchise pages gather a whole IP (James Bond, Middle-earth, the Marvel Cinematic Universe, the Wizarding World) with a row per medium, and films and series list their lead cast. One click in your profile resets your recommendations.
docs/FEATURES.mddocs/press/docs/SEO-KEYWORD-STRATEGY.md (keywords, meta map, what is built and what is not).docs/CATALOGUE-EXPANSION.md · Planned features: docs/FUTURE-FEATURES.mddocs/BETA.mddocs/COMPETITIVE.md · What comes next: docs/ROADMAP.mdapi/ Python 3.11+, FastAPI, PostgreSQL (modular monolith)
mde/migrations/ SQL migrations, applied in order, additive only
mde/taxonomy/ Controlled taxonomy (taxonomy.json) + loader/validator
mde/seed/ Editorial seed: catalogue.json (the pilot, with defaults) plus films, series, books, games,
albums, food, YouTube and more (*.json), merged by catalogue/seedfiles.py
mde/data/enrichment/ Open-data enrichment written by `python -m mde ingest` (Wikidata, Open Library, MusicBrainz)
mde/ingest/ Connectors, matching rules and the HTTP cache
mde/catalogue/ Import (load.py) and read-side queries (repository.py)
mde/discovery/ intent.py → rank.py → explain.py, orchestrated by engine.py
mde/app.py HTTP API
benchmark/ Discovery benchmark (queries.json) and runner
tests/ Unit tests + integration tests against a throwaway database
web/ Next.js 15 + TypeScript (server components; no client-side API calls)
brand/ Mimir mark, lockups, icons and social card (see docs/BRAND.md)
demo/ The public single-page site: a JavaScript port of the pure pipeline (engine.cjs),
kept identical to the Python by api/tests/test_demo_parity.py
node demo/build.cjs --site writes demo/dist/site/, the deployable static site for
mimir.terratalesmedia.world, with a full <head>, icons, social card and CNAME. .github/workflows/pages.yml
publishes it on every push to main (setup in docs/DEPLOY.md). node demo/build.cjs alone writes a single
self-contained page that runs the discovery
pipeline (intent parsing, ranking, explanations) on the pilot catalogue with no server. Differences from the
full stack: keyword search is a simple word match instead of PostgreSQL full-text search, and feedback stays in
the viewer's browser. pytest runs the JavaScript and Python engines side by side on every benchmark query plus
about 40 edge cases, and fails if their output differs in any field.
Requirements: Python 3.11+, Node 22, PostgreSQL 16.
# 1. Database
createdb mde # or any database; set DATABASE_URL accordingly
# 2. API
cd api
python -m venv .venv && . .venv/bin/activate
pip install -e ".[dev]"
export DATABASE_URL=postgresql://postgres:postgres@localhost:5432/mde
python -m mde setup # apply migrations + import the pilot catalogue (safe to re-run)
uvicorn mde.app:app --port 8000
# 3. Web (another terminal)
cd web
npm ci
API_URL=http://localhost:8000 npm run dev # http://localhost:3000
Try it from the command line too:
python -m mde discover "a book like Outer Wilds"
python -m mde benchmark
| Variable | Used by | Default | Purpose |
|---|---|---|---|
DATABASE_URL | api | postgresql://postgres:postgres@localhost:5432/mde | Catalogue database |
CORS_ORIGINS | api | http://localhost:3000 | Comma-separated browser origins (the web app calls the API server-side, so this only matters for direct browser use) |
API_URL | web | http://localhost:8000 | Where the web server reaches the API |
TEST_DATABASE_ADMIN_URL | tests | postgresql://postgres:postgres@localhost:5432/postgres | Tests create and drop their own database through this connection |
No API keys are needed. Discovery uses no external providers and no LLM.
cd api && ruff check . && pytest -q # DB tests skip without PostgreSQL, parity tests without Node
cd web && npm run typecheck && npm run build
CI (.github/workflows/ci.yml) runs the same checks against a PostgreSQL 16 service.
| Method | Path | |
|---|---|---|
| GET | /api/discover?q=…&limit=8 | Interpretation, ranked results with reasons, caveats and score breakdowns, and the exclusion counts. Logs an anonymous discovery event |
| GET | /api/works?medium=&tag=&avoid=&decade=&language=&country=&max_minutes=&q=&sort= | Browse: filtered, sorted work cards plus facet counts. tag and avoid take taxonomy keys and repeat; avoid keeps works assessed as none or mild |
| GET | /api/works/{slug} | Work page: facts, credits, tags by dimension, parents' guide (official ratings plus per-category severity and notes), connected works, provenance, sources |
| GET | /api/tags, /api/tags/{dimension}/{slug} | Tag index with counts; a tag's definition, its works (strongest first) and related tags |
| GET | /api/people, /api/people/{slug} | Everyone credited; a person's or studio's works, roles and recurring qualities |
| GET | /api/works/{slug}/where?region=IN | Where to watch, listen, read or play: a link per service for that region (search links unless the catalogue holds an exact ID) |
| GET | /api/shelves, /api/shelves/{slug} | Wordplay shelves (Laugh Riot, Drama Mamas, Nepo Babies, Desi Delights …) |
| GET | /api/groups, /api/groups/{slug} | Series and franchise families, in order, with total time |
| GET | /api/music/moods, /api/music/remixes | Mood rings and the remix rack |
| POST | /api/recommend | {ratings: {slug: loved|liked|disliked}, limit, medium} → taste profile and picks, each with the work it resembles and the qualities it shares |
| GET | /api/taxonomy | The controlled vocabulary |
| POST | /api/feedback | {event_id, work_slug, kind} where kind is one of relevant, irrelevant, too_long, wrong_mood, , , |
Accounts are an encrypted vault keyed by a recovery key, stored by the Mimir Vault WordPress plugin (wordpress/mimir-vault/, see docs/ACCOUNTS.md); the browser code is demo/vault.cjs.
Community (mde/community.py; clients send Authorization: Bearer <token>):
| Method | Path | |
|---|---|---|
| POST | /api/auth/signup, /api/auth/login, /api/auth/logout | Accounts. Passwords hashed with scrypt; only a SHA-256 of each session token is stored; sign-in is rate-limited |
| GET, PATCH | /api/me | Profile, privacy (private profile, share activity) |
| POST | /api/me/delete | Deletes the account and everything it wrote |
| GET, PUT | /api/me/state | The private library (statuses, scores, progress, lists, journal, challenges), synced as one document |
| GET | /api/users/{username} | Profile: counts, recent reviews, public lists, activity (followers only when private) |
| POST, DELETE | /api/users/{username}/follow | Follow and unfollow |
| GET, PUT, DELETE | /api/works/{slug}/reviews, /api/works/{slug}/review | Reviews with a community score; one review per person per work |
| POST, DELETE | /api/reviews/{id}/like; GET, POST /api/reviews/{id}/comments; DELETE /api/comments/{id} | Likes and comments |
| POST | /api/activity | "started" / "finished", shared with followers when the user allows |
| GET | /api/feed, /api/community | Your feed; trending works, latest reviews and activity, challenge counts |
| POST, GET, DELETE | /api/lists, /api/lists/{id} | Published lists |
| GET, POST, DELETE, PUT | /api/challenges/{slug}/{year} (/join, /progress) | Social-calendar challenges: members, leaders, your ticked days |
| POST | /api/reports | Report a review, comment, user or list |
IntentParser interface.MIMIR_API_URL for the Pages build; see docs/DEPLOY.md).Copyright © 2026 Terratales Media Entertainment Private Limited. All rights reserved; see LICENSE.
Third-party fonts and open data keep their own licences, listed in NOTICE.md.
docs/DEPLOY.mddocs/ASSESSMENT.mddocs/TAXONOMY.mddocs/SOURCES.mdalready_experiencednot_what_i_meantwill_try| GET | /api/health |