{"id":51405213,"url":"https://github.com/nuxencs/moviepickarr","last_synced_at":"2026-07-04T10:30:57.122Z","repository":{"id":366852361,"uuid":"919593941","full_name":"nuxencs/moviepickarr","owner":"nuxencs","description":"A private, self-hosted app that picks your friend group's next movie night — shared pool, random draw, TMDB metadata \u0026 stats.","archived":false,"fork":false,"pushed_at":"2026-06-23T14:32:43.000Z","size":793,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"develop","last_synced_at":"2026-06-23T16:22:54.394Z","etag":null,"topics":["go","movie-night","movies","react","self-hosted","sqlite","tailwindcss","tmdb","vite"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nuxencs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-01-20T17:17:23.000Z","updated_at":"2026-06-23T14:32:46.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/nuxencs/moviepickarr","commit_stats":null,"previous_names":["nuxencs/moviepickarr"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/nuxencs/moviepickarr","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nuxencs%2Fmoviepickarr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nuxencs%2Fmoviepickarr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nuxencs%2Fmoviepickarr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nuxencs%2Fmoviepickarr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nuxencs","download_url":"https://codeload.github.com/nuxencs/moviepickarr/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nuxencs%2Fmoviepickarr/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35118970,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-04T02:00:05.987Z","response_time":113,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["go","movie-night","movies","react","self-hosted","sqlite","tailwindcss","tmdb","vite"],"created_at":"2026-07-04T10:30:56.484Z","updated_at":"2026-07-04T10:30:57.117Z","avatar_url":"https://github.com/nuxencs.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🎬 moviepickarr\n\n**Whose turn is it to pick the movie?** Never argue about it again.\n\nmoviepickarr is a small, private web app for a group of friends — \"the gang\" — to\nrun a shared movie-night rotation. Everyone keeps their own list of films they\nwant to watch, promotes their top picks into a shared pool, and the app draws\nthe next movie at random. It then remembers what you watched and turns it into\nfun stats.\n\nIt's self-hosted and made for a handful of people who know each other — not a\npublic site. You run it once, share the link with your friends, and that's it.\n\n---\n\n## How it works\n\nThe whole app is built around one simple loop:\n\n1. **Stash** — every member keeps a personal list of movies they'd like to see.\n   Add them by searching (titles, posters and details come from\n   [TMDB](https://www.themoviedb.org/) automatically).\n2. **Pool** — each member promotes up to **3** movies from their stash into the\n   shared pool. This is everyone's \"I'm in the mood for these\" shortlist.\n3. **Pick** — when it's movie night, the app draws one movie from the pool at\n   random. No more endless scrolling or debating.\n4. **Watch \u0026 track** — mark it watched, and it moves into the gang's watched\n   library along with who picked it and when.\n5. **Stats** — see who's watched the most, your busiest movie nights, favourite\n   genres, most-watched directors and actors, and more.\n\n## The three tabs\n\n- **🍿 Movies** — the heart of the app. A big cinematic banner shows the current\n  pick with its poster, runtime, rating and a one-tap \"pick next\" button. Below\n  it sits the shared pool and the full watched library (searchable by title or by\n  who picked it). Tap any movie for a detail view with its overview, \"Directed\n  by / Written by\" credits and a scrollable cast strip.\n- **👥 Users** — the members of the gang. Each person has their pool slots (max 3)\n  and their own searchable stash. Add new movies here.\n- **📊 Stats** — a deep dive into the gang's watch history over any time window.\n  A member leaderboard, weekday/hourly activity, hours watched, average rating,\n  top genres, most-watched directors and actors, and a release-decades timeline.\n  Filter the whole page by genre, year, who picked it, or specific actors and\n  crew — click any face to drill in.\n\nMovies are automatically enriched with rich metadata from TMDB: posters,\nbackdrops, runtimes, ratings, genres, taglines, overviews and full cast \u0026 crew.\nAnything not yet fetched falls back to a clean placeholder, so the app always\nlooks complete.\n\n---\n\n## Run it yourself\n\nmoviepickarr ships as a single program with everything bundled in — the website,\nthe server and the database all live in one place. Pick whichever setup you like.\n\n### What you'll need\n\n- A **TMDB API key** (free) so movies get posters, cast and stats. Grab one at\n  [themoviedb.org → Settings → API](https://www.themoviedb.org/settings/api).\n  *It's optional* — the app runs without it, but you'll miss the artwork and the\n  metadata-powered stats.\n- Either **Docker** (easiest), or **Go 1.26+** and **[Bun](https://bun.sh)** to\n  build from source.\n\n### Option A — Docker (recommended)\n\nThe repo includes a ready-to-go `docker-compose.yml`. Open it, drop in your TMDB\nkey, then:\n\n```bash\ndocker compose up -d\n```\n\nYour data lives in `~/.config/moviepickarr` on your machine, so it survives\nrestarts and updates.\n\n### Option B — Build from source\n\n```bash\n# 1. Build the web UI and the server into a single binary\nmake build\n\n# 2. Add your TMDB key (optional but recommended)\necho \"TMDB_API_KEY=your_key_here\" \u003e .env\n\n# 3. Run it\n./bin/moviepickarr\n```\n\n### Then open it\n\nVisit **http://localhost:3030** and you're in. Add a couple of members on the\n**Users** tab, stash some movies, promote your picks — and let the app choose\nmovie night for you. 🎉\n\n---\n\n## For developers\n\nWant to hack on it? `make dev` runs the frontend (with hot reload) and the\nbackend side-by-side in a tmux session:\n\n```bash\nmake dev          # live dev: Vite + Go, split-screen\nmake test         # run the Go test suite\nmake lint         # lint Go + frontend\nmake precommit    # format + fix + lint before committing\n```\n\n**Under the hood:**\n\n- **Backend** — [Go](https://go.dev) with the\n  [Fiber](https://gofiber.io) web framework and an embedded\n  [SQLite](https://sqlite.org) database (no external DB to set up). Movie\n  enrichment runs in a background worker and live updates are pushed to the\n  browser over Server-Sent Events.\n- **Frontend** — [React 19](https://react.dev) +\n  [TypeScript](https://www.typescriptlang.org), with\n  [TanStack Router](https://tanstack.com/router) \u0026\n  [Query](https://tanstack.com/query), [Tailwind CSS](https://tailwindcss.com)\n  and a bespoke, cinematic design system (see\n  [`docs/DESIGN.md`](docs/DESIGN.md)).\n\nThe design and product decisions live in [`docs/`](docs/) —\n[`PRODUCT.md`](docs/PRODUCT.md) for what it is and\n[`DESIGN.md`](docs/DESIGN.md) for how it looks and why.\n\n---\n\n## Configuration\n\nEverything is optional except the TMDB key. Set these as environment variables\n(or in a `.env` file next to the binary):\n\n| Variable | What it does | Default |\n| --- | --- | --- |\n| `TMDB_API_KEY` | Enables posters, cast \u0026 metadata-powered stats | *(unset — enrichment off)* |\n| `LOG_LEVEL` | Minimum log level (`trace`…`fatal`) | `info` |\n| `LOG_FORMAT` | `json` (production) or `console` (colourised dev) | `json` |\n| `TMDB_ENRICH_CAST_LIMIT` | How many cast members to store per movie (`0` = all) | `15` |\n| `TMDB_ENRICH_REFRESH_INTERVAL` | How often to refresh metadata (`0` disables) | `1h` |\n| `TMDB_ENRICH_TTL` | How stale metadata can get before a refresh | `720h` |\n\nSee [`.env.example`](.env.example) for the full list. Logging is documented in\n[`docs/LOGGING.md`](docs/LOGGING.md), and there are a few more enrichment-worker\nknobs in [`docs/backend-layout.md`](docs/backend-layout.md).\n\n---\n\n\u003csub\u003eThis product uses the TMDB API but is not endorsed or certified by TMDB.\u003c/sub\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnuxencs%2Fmoviepickarr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnuxencs%2Fmoviepickarr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnuxencs%2Fmoviepickarr/lists"}