myspoti
Native Android client for Spotify, built with Jetpack Compose
Describe a mood, a favourite or a time limit; Mimir finds films, TV, books, games and music that fit, with the reason for every pick.
MediaPython · PHPGitHub @RedZero13OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full 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 |