{"id":48905973,"url":"https://github.com/jessielw/Reclaimerr","last_synced_at":"2026-05-02T22:00:53.789Z","repository":{"id":351342861,"uuid":"1127038104","full_name":"jessielw/Reclaimerr","owner":"jessielw","description":"Automatically reclaim space in your media library using customizable rules. Integrates with Jellyfin, Plex, and Emby (any or all of them) to analyze and manage your content. Functions similarly to Seerr (in reverse), providing efficient media cleanup and organization","archived":false,"fork":false,"pushed_at":"2026-04-30T18:59:41.000Z","size":7663,"stargazers_count":439,"open_issues_count":42,"forks_count":7,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-04-30T19:17:16.093Z","etag":null,"topics":["clean","cleanse","delete","docker","emby","emby-server","jellyfin","maintance","movies","plex","radarr","reclaim","reclaimerr","restore","series","sonarr","sweep","tv"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jessielw.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"docs/CONTRIBUTING.md","funding":null,"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}},"created_at":"2026-01-03T03:43:43.000Z","updated_at":"2026-04-30T10:22:40.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jessielw/Reclaimerr","commit_stats":null,"previous_names":["jessielw/reclaimerr"],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/jessielw/Reclaimerr","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jessielw%2FReclaimerr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jessielw%2FReclaimerr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jessielw%2FReclaimerr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jessielw%2FReclaimerr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jessielw","download_url":"https://codeload.github.com/jessielw/Reclaimerr/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jessielw%2FReclaimerr/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32550914,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-02T21:31:48.061Z","status":"ssl_error","status_checked_at":"2026-05-02T21:31:46.574Z","response_time":132,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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":["clean","cleanse","delete","docker","emby","emby-server","jellyfin","maintance","movies","plex","radarr","reclaim","reclaimerr","restore","series","sonarr","sweep","tv"],"created_at":"2026-04-16T20:00:37.511Z","updated_at":"2026-05-02T22:00:53.779Z","avatar_url":"https://github.com/jessielw.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n    \u003cimg height=\"100px\" alt=\"Reclaimerr's logo with name\" src=\"public/logo_name.svg\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\u003c!-- desktop build --\u003e  \u003cpicture\u003e\u003cimg alt=\"Desktop Build\" src=\"https://img.shields.io/github/actions/workflow/status/jessielw/reclaimerr/.github%2Fworkflows%2Fdesktop.yml?style=flat\u0026logo=github\u0026logoColor=white\u0026label=Desktop%20Build\"\u003e\u003c/picture\u003e\n\u003c!-- docker build --\u003e  \u003cpicture\u003e\u003cimg alt=\"Docker Build\" src=\"https://img.shields.io/github/actions/workflow/status/jessielw/reclaimerr/.github%2Fworkflows%2Fdocker.yml?style=flat\u0026logo=docker\u0026logoColor=white\u0026label=Docker%20Build\"\u003e\u003c/picture\u003e\n\u003c!-- frontend --\u003e  \u003cpicture\u003e\u003cimg alt=\"Frontend Check\" src=\"https://img.shields.io/github/actions/workflow/status/jessielw/reclaimerr/.github%2Fworkflows%2Ffrontend.yml?style=flat\u0026logo=svelte\u0026logoColor=white\u0026label=Frontend\"\u003e\u003c/picture\u003e\n\u003c!-- backend --\u003e  \u003cpicture\u003e\u003cimg alt=\"Backend Check\" src=\"https://img.shields.io/github/actions/workflow/status/jessielw/reclaimerr/.github%2Fworkflows%2Fruff.yml?style=flat\u0026logo=python\u0026logoColor=white\u0026label=Backend\"\u003e\u003c/picture\u003e\n\u003c!-- latest release --\u003e  \u003cpicture\u003e\u003cimg alt=\"GitHub Release\" src=\"https://img.shields.io/github/v/release/jessielw/reclaimerr?style=flat\u0026logo=github\u0026logoColor=white\u0026label=Latest%20Release\"\u003e\u003c/picture\u003e\n\u003c!-- commits since release --\u003e  \u003cpicture\u003e\u003cimg alt=\"GitHub commits since latest release\" src=\"https://img.shields.io/github/commits-since/jessielw/reclaimerr/latest?style=flat\u0026logo=github\u0026logoColor=white\"\u003e\u003c/picture\u003e\n\u003c!-- stars --\u003e  \u003cpicture\u003e\u003cimg alt=\"GitHub Repo stars\" src=\"https://img.shields.io/github/stars/jessielw/reclaimerr?style=flat\u0026logo=github\u0026logoColor=white\u0026label=Stars\"\u003e\u003c/picture\u003e\n\u003c!-- commit activity --\u003e  \u003cpicture\u003e\u003cimg alt=\"GitHub commit activity\" src=\"https://img.shields.io/github/commit-activity/m/jessielw/reclaimerr?style=flat\u0026logo=github\u0026logoColor=white\u0026label=Commits\"\u003e\u003c/picture\u003e\n\u003c!-- issues Open --\u003e  \u003cpicture\u003e\u003cimg alt=\"GitHub Issues\" src=\"https://img.shields.io/github/issues/jessielw/reclaimerr?style=flat\u0026logo=github\u0026logoColor=white\"\u003e\u003c/picture\u003e\n\u003c!-- issues Closed --\u003e  \u003cpicture\u003e\u003cimg alt=\"GitHub Issues or Pull Requests\" src=\"https://img.shields.io/github/issues-closed/jessielw/reclaimerr?style=flat\u0026logo=github\u0026logoColor=white\"\u003e\u003c/picture\u003e\n\u003c!-- license --\u003e  \u003cpicture\u003e\u003cimg alt=\"GitHub License\" src=\"https://img.shields.io/github/license/jessielw/reclaimerr?style=flat\"\u003e\u003c/picture\u003e\n\u003c/p\u003e\n\n**Reclaimerr** is designed to help you reclaim disk space from your media library. I was inspired to create Reclaimerr when the 100TB of storage on my home server was nearly full and I saw the rising cost of new drives. I realized it was time to start cleaning up all the unwatched and low-rated media on my server.\n\nI explored numerous open source applications for server cleanup, and [Maintainerr](https://github.com/Maintainerr/Maintainerr) stood out as a major inspiration for Reclaimerr's design. When I began development, Maintainerr didn't support Jellyfin or Emby, though support was added to Jellyfin in [v3.0.0](https://github.com/Maintainerr/Maintainerr/releases/tag/v3.0.0), it still didn't fully meet my needs.\n\nI needed a solution to manage a single physical media library while utilizing both Jellyfin and Plex to run filters and rules. I considered contributing to Maintainerr, but its codebase was undergoing a major refactor to add Jellyfin support. Same as with Maintainerr - Reclaimerr can also be run without Sonarr/Radarr, directly integrated with Jellyfin/Plex.\n\nDriven by the increasing cost of storage and the need to reclaim used disk space, inspired by Maintainerr, **Reclaimerr** was born.\n\n## Star History\n\n\u003ca href=\"https://www.star-history.com/?repos=jessielw%2FReclaimerr\u0026type=date\u0026legend=top-left\"\u003e\n \u003cpicture\u003e\n   \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/chart?repos=jessielw/Reclaimerr\u0026type=date\u0026theme=dark\u0026legend=top-left\" /\u003e\n   \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/chart?repos=jessielw/Reclaimerr\u0026type=date\u0026legend=top-left\" /\u003e\n   \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/chart?repos=jessielw/Reclaimerr\u0026type=date\u0026legend=top-left\" /\u003e\n \u003c/picture\u003e\n\u003c/a\u003e\n\n# Discussions\n\nWhile I prefer we utilize github's [discussions](https://github.com/jessielw/Reclaimerr/discussions) for historical purposes, I've had quite a few users ask for _Discord_. I personally am getting away from Discord ASAP, but I did create a public matrix server for discussions and some _support_. Feel free to join https://matrix.to/#/#reclaimerr:matrix.org!\n\n# AI Disclosures\n\nAI (LLMs) are _everywhere_ and _everyone_ is using them. I understand that many users are concerned about projects heavily generated by AI or lacking a personal touch. Reclaimerr was built from the ground up and was **not** generated using LLMs or a fork of any other project.\n\nLLMs have only been used as a tool for tasks such as searching for information, automating repetitive work, debugging, occasional CSS/UI assistance, and minor grammar suggestions/fixes. All design and code have been written by hand, ensuring I have a deep understanding on how all the gears turn. Even this readme here is hand written and then I utilized an LLM to correct grammar and clarity 😆.\n\nAs a result, this project will close pull requests that appear to be mostly or wholly AI generated.\n\n# Features\n\n- Configure rules to automatically reclaim disk space\n- Supports **Jellyfin**, **Plex**, and **Emby** _(all at once if needed)_\n  - Designate **one** server as the **main** server; supplemental data (such as watch history) is gathered from the others if using more than one media server. **Note: All servers must manage the same physical media library**\n- Configurable task scheduling (cron/time based)\n- Automatically scans media eligible for reclamation\n- Media library items **protection** system\n  - This system adds \"protection\" that will prevent them from being considered for deletion\n  - Users can request protection (to be approved or denied by users with appropriate permissions)\n  - Time based control for protection duration\n- Multi-user support with a permission system\n- Notifications via [Apprise](https://appriseit.com/services/), supporting over **133** services at the time of writing\n- Remove or unmonitor media from Radarr and Sonarr (if configured)\n- Remove requests from Seerr\n- Delete files from disk\n  - If Radarr or Sonarr are configured, Reclaimerr processes deletion through them, only falling back to the main server if needed\n- Very lightweight and efficient; avoids spinning up disks outside of deletions (all data is sourced directly from your media servers)\n- Light and dark mode\n- Responsive UI (works great on mobile)\n\n# Additional Info\n\n- While Reclaimerr is in early beta, the task to **automatically delete** media will **not** be enabled or visible in the UI. I do not want to risk permanent deletion of anyone's media due to a bug with full automation until the things have been **thoroughly tested**.\n  - For now, only admins or users with appropriate permissions can manage deletions through the UI or API\n  - Once automatic deletions are added it will be **opt in**\n- While Reclaimerr is in **beta**, things are subject to change in response to user feedback and testing\n- Proper documentation will be made as the app matures a bit more\n\n# Install\n\n## Desktop\n\nYou can use the latest [release](https://github.com/jessielw/Reclaimerr/releases) for your platform if there is a build available.\n\n\u003e Note: Desktop builds for Windows must be ran from **Windows 8** or greater\n\n### How to use\n\nYou can simply execute the prebuilt binary and it'll create a **tray** icon.\n\n- Double click (or right click the tray icon and choose \"Open\") to automatically open a window in your browser.\n  - The server defaults to port **8000** _(as of **v0.1.0-beta8**)_. If the default port (or your chosen port) is taken, the server will attempt to find an open port within the next 10 ports.\n- Right click and choose \"Close\" to cleanly stop the application.\n\n### Configuration\n\nAs of **v0.1.0-beta8**, you can control a _few_ customizable options via a **.env** file. Simply place this file **beside** your **executable** before launching the server, and it will prioritize these settings.\n\n**Example Desktop .env**\n\n```yaml\n# All of these are optional. For example, to change the port to 8049:\nAPI_PORT=8049\n# API_HOST=127.0.0.1\n# CORS_ORIGINS=http://localhost:3000\n# optional (only use if you want to reset or set the admin password on first launch, min 3 / max 64)\n# ADMIN_PASSWORD=\n```\n\n## Docker\n\n**Example .env**\n\n```yaml\n# directory to store application data (database, logs, static files, etc.)\nDATA_DIR=./data\n\n# API configuration\nAPI_HOST=0.0.0.0\nAPI_PORT=8000\nCORS_ORIGINS=http://localhost:3000\n\n# secrets — leave blank to auto-generate stable values on first launch (recommended),\n# or set your own (min 32 characters, e.g. `openssl rand -hex 32`)\n# JWT_SECRET=\n# ENCRYPTION_KEY=\n\n# logging (options: DEBUG, INFO, WARNING, ERROR, CRITICAL)\n# LOG_LEVEL=INFO\n\n# optional (only use if you want to reset or set the admin password on first launch, min 3 / max 64)\n# ADMIN_PASSWORD=\n\n# set to true when serving over HTTPS\n# COOKIE_SECURE=false\n```\n\n**Example compose**\n\n```yaml\nservices:\n  reclaimerr:\n    image: ghcr.io/jessielw/reclaimerr:latest\n    container_name: reclaimerr\n    restart: unless-stopped\n    env_file: \".env\"\n    volumes:\n      - ./data:/app/data\n    ports:\n      - \"8000:8000\"\n```\n\n## Reset Admin Password\n\nTo reset the admin password, set the `ADMIN_PASSWORD` environment variable and restart the application. The new password will be applied to the admin account on startup.\n\n\u003e **Note:** For security, it is recommended to remove or unset this variable after the application has started and the password has been updated.\n\n## Run from Source\n\n**Requirements:** Python 3.11+, Node.js 20+, [uv](https://docs.astral.sh/uv/)\n\n1. Clone the repository\n\n```bash\ngit clone https://github.com/jessielw/Reclaimerr.git\ncd Reclaimerr\n```\n\n2. Install Python dependencies\n\n```bash\nuv sync\n```\n\n3. Create your environment file and fill in the required values (see the Docker `.env` example above)\n\n```bash\ncp .env.example .env\n```\n\n4. Start the backend\n\n```bash\nuv run uvicorn backend.api.main:app\n```\n\n5. Start the frontend\n\n```bash\ncd frontend\nnpm install\nnpm run dev\n```\n\nThe backend is available at [http://localhost:8000](http://localhost:8000) and the frontend at [http://localhost:3000](http://localhost:3000).\n\n## Preview\n\n![image](public/dashboard.png)\n![image](public/movies.png)\n![image](public/series.png)\n![image](public/reclaim-candidates.png)\n![image](public/settings-notifications.png)\n![image](public/settings-servers.png)\n![image](public/settings-tasks.png)\n![image](public/settings-users.png)\n\n## Contributing\n\n[Contribution guide](docs/CONTRIBUTING.md)\n\n## Credits\n\n- [Maintainerr](https://github.com/Maintainerr/Maintainerr) and [Seerr](https://github.com/seerr-team/seerr) for inspiration\n- [TheMovieDB](https://www.themoviedb.org/)\n- Numerous community dependencies (see [pyproject](pyproject.toml) and [package](frontend/package.json))\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjessielw%2FReclaimerr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjessielw%2FReclaimerr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjessielw%2FReclaimerr/lists"}