{"id":13578061,"url":"https://github.com/thcolin/sensorr","last_synced_at":"2026-01-23T13:59:36.662Z","repository":{"id":48271332,"uuid":"155242193","full_name":"thcolin/sensorr","owner":"thcolin","description":"🍿📼 Sensorr - Your Friendly Digital Video Recorder","archived":false,"fork":false,"pushed_at":"2025-10-08T13:57:32.000Z","size":56556,"stargazers_count":100,"open_issues_count":36,"forks_count":7,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-10-08T15:35:27.636Z","etag":null,"topics":["couchpotato","dvr","movie-release-radar","newsgroup","newznab","pvr","radarr","react","release","scene","torrent","torznab","warez","watcher3"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thcolin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.md","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},"funding":{"github":["thcolin"]}},"created_at":"2018-10-29T16:11:31.000Z","updated_at":"2025-10-04T13:57:07.000Z","dependencies_parsed_at":"2025-09-20T18:06:28.355Z","dependency_job_id":"537aa1db-3076-424e-b99d-9976f1f2a73b","html_url":"https://github.com/thcolin/sensorr","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/thcolin/sensorr","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thcolin%2Fsensorr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thcolin%2Fsensorr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thcolin%2Fsensorr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thcolin%2Fsensorr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thcolin","download_url":"https://codeload.github.com/thcolin/sensorr/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thcolin%2Fsensorr/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28693428,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-23T11:01:27.039Z","status":"ssl_error","status_checked_at":"2026-01-23T11:00:26.909Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["couchpotato","dvr","movie-release-radar","newsgroup","newznab","pvr","radarr","react","release","scene","torrent","torznab","warez","watcher3"],"created_at":"2024-08-01T15:01:26.839Z","updated_at":"2026-01-23T13:59:36.640Z","avatar_url":"https://github.com/thcolin.png","language":"JavaScript","readme":"\u003cimg src=\"https://raw.githubusercontent.com/thcolin/sensorr/master/doc/banner.png?raw=true\" width=\"100%\" /\u003e\n\n\u003c!-- # Warning\n🚨 This is early experimental, currently will only support [`Cardigann`](https://github.com/cardigann/cardigann) and [`Jackett`](https://github.com/Jackett/Jackett). --\u003e\n\n# ✨ Features\n\u003ctable className=\"markdown-table\"\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003eScreenshot\u003c/th\u003e\n      \u003cth\u003eDescription\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\n      \u003cimg src=\"https://raw.githubusercontent.com/thcolin/sensorr/master/doc/screenshots/home.png?raw=true\" width=\"100\" /\u003e\n      \u003c/td\u003e\n      \u003ctd\u003e\n        \u003cb\u003eHome\u003c/b\u003e\n        \u003cul\u003e\n          \u003cli\u003eTrending\u003c/li\u003e\n          \u003cli\u003eDiscover (Popular)\u003c/li\u003e\n          \u003cli\u003eDiscover (By year)\u003c/li\u003e\n          \u003cli\u003eDiscover (By genre)\u003c/li\u003e\n          \u003cli\u003eDiscover (By studio)\u003c/li\u003e\n          \u003cli\u003eTrending (stars)\u003c/li\u003e\n        \u003c/ul\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\n      \u003cimg src=\"https://raw.githubusercontent.com/thcolin/sensorr/master/doc/screenshots/library.png?raw=true\" width=\"100\" /\u003e\n      \u003c/td\u003e\n      \u003ctd\u003e\n        \u003cb\u003eLibrary\u003c/b\u003e\n        \u003cul\u003e\n          \u003cli\u003eManage your movies \u003ccode\u003elibrary\u003c/code\u003e (\u003ccode\u003ewished\u003c/code\u003e, \u003ccode\u003epinned\u003c/code\u003e and \u003ccode\u003earchived\u003c/code\u003e)\u003c/li\u003e\n        \u003c/ul\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\n      \u003cimg src=\"https://raw.githubusercontent.com/thcolin/sensorr/master/doc/screenshots/discover.png?raw=true\" width=\"100\" /\u003e\n      \u003c/td\u003e\n      \u003ctd\u003e\n        \u003cb\u003eDiscover\u003c/b\u003e\n        \u003cul\u003e\n          \u003cli\u003e\u003ccode\u003eDiscover\u003c/code\u003e movies with many options\u003c/li\u003e\n        \u003c/ul\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\n      \u003cimg src=\"https://raw.githubusercontent.com/thcolin/sensorr/master/doc/screenshots/movie.png?raw=true\" width=\"100\" /\u003e\n      \u003c/td\u003e\n      \u003ctd\u003e\n        \u003cb\u003eMovie\u003c/b\u003e\n        \u003cul\u003e\n          \u003cli\u003eDisplay \u003ccode\u003emovie\u003c/code\u003e details\u003c/li\u003e\n          \u003cli\u003eConsider movie as, \u003ccode\u003e🔕\u003c/code\u003e \u003ccode\u003eignored\u003c/code\u003e, \u003ccode\u003e🍿\u003c/code\u003e \u003ccode\u003ewished\u003c/code\u003e, \u003ccode\u003e📍\u003c/code\u003e \u003ccode\u003epinned\u003c/code\u003e or \u003ccode\u003e📼\u003c/code\u003e \u003ccode\u003earchived\u003c/code\u003e\u003c/li\u003e\n          \u003cli\u003eFind \u003ccode\u003ereleases\u003c/code\u003e on \u003ccode\u003esources\u003c/code\u003e (\u003ccode\u003etorznab\u003c/code\u003e / \u003ccode\u003enewznab\u003c/code\u003e) - requested with \u003ccode\u003etitle\u003c/code\u003e (localized) and \u003ccode\u003eoriginal_title\u003c/code\u003e\u003c/li\u003e\n          \u003cli\u003eGrab a \u003ccode\u003erelease\u003c/code\u003e (\u003ccode\u003emanual\u003c/code\u003e or \u003ccode\u003eauto\u003c/code\u003e)\u003c/li\u003e\n        \u003c/ul\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\n      \u003cimg src=\"https://raw.githubusercontent.com/thcolin/sensorr/master/doc/screenshots/collection.png?raw=true\" width=\"100\" /\u003e\n      \u003c/td\u003e\n      \u003ctd\u003e\n        \u003cb\u003eCollection\u003c/b\u003e\n        \u003cul\u003e\n          \u003cli\u003eDisplay \u003ccode\u003ecollection\u003c/code\u003e details\u003c/li\u003e\n        \u003c/ul\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\n      \u003cimg src=\"https://raw.githubusercontent.com/thcolin/sensorr/master/doc/screenshots/calendar.png?raw=true\" width=\"100\" /\u003e\n      \u003c/td\u003e\n      \u003ctd\u003e\n        \u003cb\u003eCalendar\u003c/b\u003e\n        \u003cul\u003e\n          \u003cli\u003eTrack upcoming movies from \u003ccode\u003efollowed\u003c/code\u003e stars !\u003c/li\u003e\n        \u003c/ul\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\n      \u003cimg src=\"https://raw.githubusercontent.com/thcolin/sensorr/master/doc/screenshots/following.png?raw=true\" width=\"100\" /\u003e\n      \u003c/td\u003e\n      \u003ctd\u003e\n        \u003cb\u003eFollowing\u003c/b\u003e\n        \u003cul\u003e\n          \u003cli\u003eManage stars you're \u003ccode\u003efollowing\u003c/code\u003e\u003c/li\u003e\n        \u003c/ul\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\n      \u003cimg src=\"https://raw.githubusercontent.com/thcolin/sensorr/master/doc/screenshots/person.png?raw=true\" width=\"100\" /\u003e\n      \u003c/td\u003e\n      \u003ctd\u003e\n        \u003cb\u003eStar\u003c/b\u003e\n        \u003cul\u003e\n          \u003cli\u003eDisplay \u003ccode\u003estar\u003c/code\u003e details\u003c/li\u003e\n          \u003cli\u003eFollow star \u003ccode\u003e🔕\u003c/code\u003e \u003ccode\u003eignored\u003c/code\u003e, \u003ccode\u003e🔔\u003c/code\u003e \u003ccode\u003efollowed\u003c/code\u003e\u003c/li\u003e\n        \u003c/ul\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003c!-- \u003ctr\u003e\n      \u003ctd\u003e\n      \u003cimg src=\"https://raw.githubusercontent.com/thcolin/sensorr/master/doc/screenshots/configure.png?raw=true\" width=\"100\" /\u003e\n      \u003c/td\u003e\n      \u003ctd\u003e\n        \u003cb\u003eConfigure\u003c/b\u003e\n        \u003cul\u003e\n          \u003cli\u003eSimple configuration\u003c/li\u003e\n          \u003cli\u003eSecured WebUI (with \u003ccode\u003ebasic-auth\u003c/code\u003e)\u003c/li\u003e\n          \u003cli\u003eLanguage aware, by default search on \u003ca href=\"https://www.themoviedb.org/\"\u003eTMDB\u003c/a\u003e with first \u003ccode\u003ewindow.navigator.languages\u003c/code\u003e\u003c/li\u003e\n          \u003cli\u003ePlex synchronization, never inadvertently download a movie you already own !\u003c/li\u003e\n        \u003c/ul\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e --\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\n      \u003cimg src=\"https://raw.githubusercontent.com/thcolin/sensorr/master/doc/screenshots/records.png?raw=true\" width=\"100\" /\u003e\n      \u003c/td\u003e\n      \u003ctd\u003e\n        \u003cb\u003eLogs\u003c/b\u003e\n        \u003cul\u003e\n          \u003cli\u003eSee \u003ccode\u003elogs\u003c/code\u003e details\u003c/li\u003e\n          \u003cli\u003eEvery wished \u003ccode\u003emovie\u003c/code\u003e processed\u003c/li\u003e\n        \u003c/ul\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n# 🏎️ Quick Start\nBest way to get a **Sensorr** fresh install is with the Docker image, you just need a terminal with [`docker`](https://www.docker.com/get-starteds) installed !\n\n## 🐳 Docker\nCheckout Sensorr Docker image at [thcolin/sensorr/](https://hub.docker.com/r/thcolin/sensorr/)\n\n```\n# `/home/user/.sensorr` will be your config path\n# `/home/user/downloads` will be your blackhole path\ndocker run -p 5070:5070 -v /home/user/.sensorr:/app/sensorr/config -v /home/user/downloads:/app/sensorr/blackhole --name=\"sensorr\" thcolin/sensorr\n```\n\n_Tips_: Docker image is based on `alpine`, so you can add `TZ` env variable with `-e TZ=Europe/Paris`\n\n## 🎚 Configure\n* Edit default configuration at `http://localhost:5070/settings` (or `config/config.json`)\n\n## ⏰ Jobs\nSome necessary cron jobs will be launched in background every day:\n* _16:03_ `sensorr:purge`: Clean oldest log sessions (if directory space exceeds configured value)\n* _17:00_ `sensorr:record`: Record wished movies from collection with best release\n* _01:03_ `sensorr:schedule`: Schedule calendar with recents movies from stalked stars (+/- 2 years from today)\n* _03:03_ `sensorr:pairwise`: Pairwise Plex instance with Sensorr instance (if configured)\n* _05:03_ `sensorr:hydrate`: Hydrate -or refresh- collected movies and stalked stars data\n\n# 🗺️ Roadmap\n* Fix `Home` rows issues\n  * `Upcoming` / `Records` empty\n* Display other `Person` behind each `Movie` on `Details` page (`:hover` only)\n  * Load every followed stars from database on component mount\n* Feature `Policies`\n  * Add \"groups\" `Policy` with \"default\" === current (groups like `default` or `blockbuster` for example)\n    * Add configurable `avoid` terms on `Movie` (like `/movie/515195` which got a `0.73` similarity score with `/movie/582607`)\n    * Add configurable `prefer` terms on `Movie` (like `/movie/447404` I want in `FRENCH` and not `VOSTFR`)\n  * Add `size` property on `Settings/blocks/Policy` (how to handle it ? `min/max` ?)\n  * Improve `Documents.*.Filters`\n    * `policies` - `multiple`\n  * `Movie`\n    * Add `policies`\n      * `Checkbox` displayed as grid or column\n        * After `Row` ? - Bad UX, far away from `state`\n      * Create `policy` option (will copy/paste `default`)\n      * Edit `policy` link\n  * Add `List` page\n    * Grouped movies by \"policy\"\n    * Same layout as `Home` page\n* Feature `Review` (fix manual)\n  * Summary command result\n    * `record`:\n      ```\n        From ${wished} wished 🍿 movies, ${found} where recorded 📼 to ${sensorr.config.blackhole} !\n          * ${movie.title} (${movie.year}) with release ${release.generated}\n        ${filtered} were filtered 🚫 according to your policies\n          * ${movie.title} (${movie.year})\n            * ${release} (${reason})\n        But ${missing} still missing 📭 (with no releases found)\n          * ${movie.title} (${movie.year}) \n        You should look at these ${error} errors 🚨\n          * ${movie.title} (${movie.year}) : ${err}\n      ```\n  * Refactor `Logs`\n    * Left panel with `session` list with summary\n    * `Records`\n      * Summary\n        * 🍿 Wished\n        * 📼 Recorded\n        * 🚫 Filtered (reviewable)\n        * 📭 Missing (reviewable)\n        * 🚨 Error (reviewable)\n      * Review\n        * Review each `record`, one by one, autoscroll on validation\n      * Record\n        * Allow to post an `issue` on `thcolin/oleoo`\n          * With data : { movie, records: records.map(record =\u003e record.meta ) }\n        * Allow to search for `releases` manualy\n          * Allow to search custom titles - like `The.92nd.Annual.Academy.Awards.2020.FRENCH.1080p.HDTV.H264-SH0W` - out of `releases` scope\n        * Allow to **ban** `releases` (like a `release` with hardcoded `subtitles` downloaded that i don't want)\n    * `Purge`\n    * `Pairwise`\n    * `Hydrate`\n* Feature `performance`\n  * Rename `XZNAB` to `XYZNAB`\n  * On `Person.State` `unfollow`, delete `calendar` entities with only `this` as followed credits\n  * Look at [`shipjs`](https://github.com/algolia/shipjs)\n  * `oleoo`\n    * Refactor algorithm, split `title` and `metadata` with `year|language|resolution|source` (`[0]`/`[1]`)\n  * `Server`\n    * Look at [`WatermelonDB`](https://github.com/Nozbe/WatermelonDB)\n      * Or only use **remote** `PouchDB` server with `rxdb`\n    * Fix RAM usage with `sessions` in `io`\n  * `CLI`\n    * Use [`cli-step`](https://github.com/poppinss/cli-step)\n    * When `stalk` star, `atomicUpsert` it\n    * Fix `record` command, filter movies with release date \u003c +3 months (useless to search for movies still in production - make configurable)\n    * Compile binary (reduce Docker image size by removing useless dependecies)\n  * Responsive design / mobile UI-UX\n    * Take `screenshots` in `small`, `medium` and `large` breakpoints\n* Feature `Config`\n  * Refactor `config` to `settings` using [mozilla/node-convict](https://github.com/mozilla/node-convict)\n  * Refactor with [nrwl/nx](https://github.com/nrwl/nx)\n  * Look at `Prisma` for database\n* Feature `1.0.0`\n  * 🎉\n  * Fix `docz`\n  * Improve `README`\n* Feature `Notifications`\n  * Notify `records` summary (email, sms, etc...)\n* Feature `UI/UX sugar`\n  * Translate (`fr`, `en`)\n  * `Discover`\n    * Add `status` in `controls` - how ?\n    * Add `Random` button\n  * `Home`\n    * Add `Head` `Movie` ? (see [inspiration](https://dribbble.com/shots/2813716-BookMyShow-Movies-Concept))\n      * Add \"pre-configured\" `List` like `Oscars` ?\n      * Weekly movies selection (?)\n        * Allow user to send PR with own movies selection\n      * Make sensorr a social network (?)\n        * Look at `Mastodon` example and `ActivityPub` spec\n        * Make it private by default, if public will only show non-user related informations (home, discover, calendar (?), following (?))\n        * Multi user (?)\n  * `Settings`\n    * `Database`\n      * Allow to `clean` browser `sensorr-*` databases (`doctor`)\n  * `Grid`\n    * Select/Deselect all\n    * Actions on selection\n  * `Loading` page waiting sync of `db` with progress ?\n    * Allow to `clean` database if waiting too much\n  * Dark mode (`theme-ui`)\n* Feature `Custom Home`\n  * `Home`\n    * Customize\n      * Pinned sortable `Trending|Discover` `Rows`\n        * `type=[Popular|Top|Calendar|Trending|Discover]`\n        * `uri={...}`\n        * `params={...}`\n      * Save from `Discover` \"current\" params\n* Feature `Doctor`\n  * Replace `Plex` releases by better if available, like `CouchPotato`\n    * `Plex` manage all `medias`, so we can get `release` (`source`, `language`, `resolution`, ...) and compute score\n* Feature `Onboarding`\n  * Add `Onboarding` page\n* Add demo on a server\n* Feature `Browser Plugin`\n  * `IMDB`, `TMDB`, `SensCritique` or `AlloCiné` browser plugin \"bookmark\" (update state of current movie website tab on `Sensorr` instance)\n* Feature `import/export`\n  * Synchronize with `trakt.tv`\n* Feature `Mobile` app\n  * Connect to server with QR code\n  * Streaming from `Releases` (how to know which file read ? - ask user)\n\n# 🎨 Inspiration\n* CLI\n  * [minimist](https://github.com/substack/minimist)\n  * [Inquirer.js](https://github.com/SBoudrias/Inquirer.js)\n  * [commander.js](https://github.com/tj/commander.js)\n  * [oclif](https://github.com/oclif/oclif)\n  * [ink](https://github.com/vadimdemedes/ink)\n\n# 👋 Alternatives\n* [CouchPotato](https://github.com/CouchPotato/CouchPotatoServer)\n* [Radarr](https://github.com/Radarr/Radarr)\n* [Watcher3](https://github.com/nosmokingbandit/Watcher3)\n","funding_links":["https://github.com/sponsors/thcolin"],"categories":["JavaScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthcolin%2Fsensorr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthcolin%2Fsensorr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthcolin%2Fsensorr/lists"}