尚未偵測到更新。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 |