{"id":49220223,"url":"https://github.com/thejuran/seedsyncarr","last_synced_at":"2026-06-16T00:01:22.607Z","repository":{"id":350108554,"uuid":"1205182195","full_name":"thejuran/seedsyncarr","owner":"thejuran","description":"Sonarr-driven seedbox sync: LFTP transfers from your seedbox to local, then an HMAC-verified import webhook drives safe auto-delete — so you never delete a file that didn't make it into your library. Sonarr/Radarr integration, web UI, Docker, security by default.","archived":false,"fork":false,"pushed_at":"2026-06-08T21:41:00.000Z","size":41433,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-10T13:03:56.917Z","etag":null,"topics":["angular","automation","docker","file-sync","homelab","lftp","media-server","python","radarr","seedbox","self-hosted","sonarr","webhook"],"latest_commit_sha":null,"homepage":"https://thejuran.github.io/seedsyncarr","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thejuran.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","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-04-08T18:03:15.000Z","updated_at":"2026-06-08T21:41:04.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/thejuran/seedsyncarr","commit_stats":null,"previous_names":["thejuran/seedsyncarr"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/thejuran/seedsyncarr","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thejuran%2Fseedsyncarr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thejuran%2Fseedsyncarr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thejuran%2Fseedsyncarr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thejuran%2Fseedsyncarr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thejuran","download_url":"https://codeload.github.com/thejuran/seedsyncarr/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thejuran%2Fseedsyncarr/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34385031,"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-06-15T02:00:07.085Z","response_time":63,"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":["angular","automation","docker","file-sync","homelab","lftp","media-server","python","radarr","seedbox","self-hosted","sonarr","webhook"],"created_at":"2026-04-24T02:10:21.753Z","updated_at":"2026-06-16T00:01:22.577Z","avatar_url":"https://github.com/thejuran.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"doc/brand/wordmark-dark.png\"\u003e\n    \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"doc/brand/wordmark-light.png\"\u003e\n    \u003cimg alt=\"SeedSyncarr\" src=\"doc/brand/wordmark-dark.png\" width=\"480\"\u003e\n  \u003c/picture\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"doc/images/screenshot-dashboard.png\" alt=\"SeedSyncarr Dashboard\" width=\"800\" /\u003e\n\u003c/p\u003e\n\n\u003e A Sonarr-driven seedbox sync tool where an HMAC-verified import webhook drives safe auto-delete — so you never delete a file that didn't make it into your library.\n\n[![CI](https://github.com/thejuran/seedsyncarr/actions/workflows/ci.yml/badge.svg)](https://github.com/thejuran/seedsyncarr/actions/workflows/ci.yml)\n[![Release](https://img.shields.io/github/v/release/thejuran/seedsyncarr)](https://github.com/thejuran/seedsyncarr/releases)\n[![Docker](https://img.shields.io/badge/docker-ghcr.io-blue)](https://github.com/thejuran/seedsyncarr/pkgs/container/seedsyncarr)\n[![License](https://img.shields.io/github/license/thejuran/seedsyncarr)](LICENSE)\n\n## About This Fork\n\nSeedSyncarr is a fork of [SeedSync](https://github.com/ipsingh06/seedsync) (ipsingh06). Like other active forks, it modernizes the original; SeedSyncarr's focus is a Sonarr-driven workflow where an HMAC-verified import webhook drives safe auto-delete — so you never delete a file that didn't reach your library. SeedSyncarr is Sonarr/Radarr-driven, so it receives import webhooks from those services rather than pushing notifications outbound.\n\n## Quick Start\n\n```yaml\nservices:\n  seedsyncarr:\n    image: ghcr.io/thejuran/seedsyncarr:latest\n    container_name: seedsyncarr\n    restart: unless-stopped\n    environment:\n      - PUID=1000   # uid that owns your /config and /downloads host paths\n      - PGID=1000   # gid that owns your /config and /downloads host paths\n    ports:\n      - \"8800:8800\"\n    volumes:\n      - ~/.seedsyncarr:/config\n      - /path/to/downloads:/downloads\n```\n\n\u003e **Set `PUID`/`PGID` to the owner of your mounted paths.** SeedSyncarr writes\n\u003e downloads to `/downloads`, so the container user must own (or be able to write)\n\u003e the host directory behind it. Find the right values on the host with `id`\n\u003e (e.g. `id $USER`). If `PUID`/`PGID` are omitted, the container defaults to\n\u003e `1000:1000`. A mismatch here is the most common cause of \"files show as active\n\u003e but never download\" — the container can't write the destination.\n\n## Features\n\n- **LFTP-based transfers** — built on [LFTP](http://lftp.tech/) for maximum transfer speed with parallel connections and segmented downloads\n- **Web UI** — monitor and control all transfers from a clean, responsive dashboard\n- **Auto-extraction** — automatically extract archives after sync completes\n- **AutoQueue** — pattern-based file selection syncs only the files you want\n- **Sonarr and Radarr integration** — HMAC-verified import webhooks drive safe auto-delete; once your media library confirms the import, SeedSyncarr removes the local copy\n- **Local and remote file management** — browse, delete, and manage files on both ends from the UI\n- **Docker packaging** — available as Docker images for amd64 and arm64\n- **Dark mode** — full dark theme with earthy palette designed for always-on displays\n- **Security by default** — Fernet-encrypted secrets at rest, HMAC-verified import webhooks, opt-in Bearer auth, an IP-resolution guard on Sonarr/Radarr connection URLs, CSP headers, and rate-limited webhook/config/test-connection/bulk/status endpoints. See [SECURITY.md](SECURITY.md) for the full posture.\n\n## How It Works\n\nSeedSyncarr runs on your local server and connects to your remote seedbox over SSH. The LFTP sync engine continuously transfers new files to your local machine, and can automatically extract archives once a transfer completes. Sonarr and Radarr then import the synced files and call SeedSyncarr's inbound webhook endpoint on import — SeedSyncarr uses that confirmation to safely reclaim the local copy, so it never deletes a file that didn't make it into your library.\n\nYou don't need to install anything on the remote server — just SSH credentials.\n\n## Installation\n\n### Docker (recommended)\n\nPull and run with Docker Compose (see Quick Start above), or run directly:\n\n```bash\ndocker run -d \\\n  --name seedsyncarr \\\n  --restart unless-stopped \\\n  -p 8800:8800 \\\n  -e PUID=1000 \\\n  -e PGID=1000 \\\n  -v ~/.seedsyncarr:/config \\\n  -v /path/to/downloads:/downloads \\\n  ghcr.io/thejuran/seedsyncarr:latest\n```\n\nSet `PUID`/`PGID` to the uid/gid that owns the host paths mounted at `/config`\nand `/downloads` (run `id` on the host to find them; defaults to `1000:1000`).\nThe container remaps its user to these at start and fixes ownership of the\nmount roots, so it can write your downloads.\n\n### pip\n\nInstall system dependencies first, then install via pip:\n\n```bash\n# Runtime tools (Debian/Ubuntu)\nsudo apt install lftp openssh-client p7zip-full unrar bzip2\n\n# Build dependencies for the cryptography wheel (needed on systems\n# without a prebuilt wheel for your Python version)\nsudo apt install build-essential libssl-dev libffi-dev\n\n# Install SeedSyncarr\npip install seedsyncarr\n\n# Run\nseedsyncarr\n```\n\nRequires Python 3.11 or 3.12.\n\nFor detailed setup instructions, see the [documentation](https://thejuran.github.io/seedsyncarr).\n\n## Configuration\n\nAfter starting SeedSyncarr, open `http://localhost:8800` in your browser.\n\nKey configuration areas in **Settings**:\n\n- **Remote Server** — SSH host, port, username, and path to sync from\n- **Local Path** — where files are downloaded to on your local machine\n- **Sonarr / Radarr** — webhook URLs and API keys for automated media imports\n- **AutoQueue** — define patterns to automatically queue matching files for sync\n\n## Screenshots\n\nThe dashboard — live transfers, sync progress, storage stats, and controls:\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"doc/images/screenshot-dashboard.png\" alt=\"SeedSyncarr Dashboard\" width=\"800\" /\u003e\n\u003c/p\u003e\n\n## Related Projects\n\n- [**Triggarr**](https://github.com/thejuran/triggarr) — lightweight search automation daemon for Radarr, Sonarr, and Lidarr. SeedSyncarr handles the download-to-sync side; Triggarr handles the search-to-trigger side.\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n## Security\n\nSee [SECURITY.md](SECURITY.md) for reporting vulnerabilities and the full security posture.\n\n## License\n\nApache License 2.0 — see [LICENSE](LICENSE).\n\n## Usage Examples\n\n**Sync only TV shows and movies using AutoQueue patterns**\n\nIn Settings, enable AutoQueue and turn on \"Restrict to patterns\". Add glob patterns to match\nonly the directories you want synced automatically:\n\n```\nTV Shows/*\nMovies/*\n```\n\nAny new file on the remote server whose path matches a pattern is queued for sync without\nmanual intervention. Files that do not match are left on the remote server untouched.\n\n**Confirm a Sonarr import before cleaning up**\n\nIn Settings, enable Sonarr and enter your Sonarr URL and API key. SeedSyncarr exposes an\ninbound webhook endpoint at:\n\n```\nhttp://\u003cseedsyncarr-address\u003e:8800/server/webhook/sonarr\n```\n\nAdd this URL as a webhook in Sonarr (Settings \u003e Connect \u003e Webhook) with the \"On Import\"\nevent selected. Sonarr then calls this endpoint after it imports an episode into your\nlibrary, and SeedSyncarr treats that incoming call as confirmation the file made it in —\nthe signal it uses to safely reclaim the local copy. The webhook is HMAC-verified when a\nsecret is configured. The same pattern applies to Radarr using the\n`/server/webhook/radarr` endpoint.\n\n**Automatically clean up after import**\n\nEnable Post-Import Pruning in Settings. Once Sonarr or Radarr confirms an import, SeedSyncarr\nwaits for the configured safety delay (default: 60 seconds) and then deletes the local copy\nfrom the downloads directory. Enable dry-run mode first to verify which files would be removed\nbefore committing to automatic deletion.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthejuran%2Fseedsyncarr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthejuran%2Fseedsyncarr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthejuran%2Fseedsyncarr/lists"}