{"id":50722904,"url":"https://github.com/cruxexperts/best-backup","last_synced_at":"2026-06-10T02:00:32.335Z","repository":{"id":332892980,"uuid":"1135130766","full_name":"CruxExperts/best-backup","owner":"CruxExperts","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-09T03:26:23.000Z","size":3121,"stargazers_count":3,"open_issues_count":1,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-09T05:17:22.292Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CruxExperts.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":".github/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-01-15T17:21:58.000Z","updated_at":"2026-04-06T05:39:22.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/CruxExperts/best-backup","commit_stats":null,"previous_names":["cptnfren/best-backup","cruxexperts/best-backup"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/CruxExperts/best-backup","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CruxExperts%2Fbest-backup","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CruxExperts%2Fbest-backup/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CruxExperts%2Fbest-backup/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CruxExperts%2Fbest-backup/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CruxExperts","download_url":"https://codeload.github.com/CruxExperts/best-backup/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CruxExperts%2Fbest-backup/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34133404,"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-10T02:00:07.152Z","response_time":89,"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":[],"created_at":"2026-06-10T02:00:21.042Z","updated_at":"2026-06-10T02:00:32.313Z","avatar_url":"https://github.com/CruxExperts.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# 🗄️ bbackup\n\n**Back up Docker containers and host filesystems — encrypted, incremental, and agent-ready.**\n\n[![Python 3.12+](https://img.shields.io/badge/python-3.12%2B-3776ab?style=flat-square\u0026logo=python\u0026logoColor=white)](https://www.python.org/downloads/)\n[![License: MIT](https://img.shields.io/badge/license-MIT-22c55e?style=flat-square)](LICENSE)\n[![Version](https://img.shields.io/badge/version-1.8.2-6366f1?style=flat-square)](CHANGELOG.md)\n\n[Quick start](#quick-start) · [Filesystem backup](#filesystem-backup) · [Agent integration](#agent-integration) · [CLI reference](#cli-reference) · [Docs](#documentation)\n\n\u003c/div\u003e\n\n![bbackup backup pipeline showing Docker, filesystem, database, encryption, verification, and remote storage destinations](docs/assets/bbackup-hero.png)\n\n---\n\n```bash\nuv tool install --force git+https://github.com/CruxExperts/best-backup.git\n```\n\n`uv` handles the isolated tool environment automatically. This one command works for first install and redeploy/update from GitHub. See [Installation](#installation) if you need to install `uv` first, or for advanced system-wide `/usr/local/bin` deployment.\n\n---\n\n## Why bbackup\n\nRun `bbackup backup` and you get an interactive container picker, a live BTOP-style dashboard while the backup runs, and a finished artifact that can be verified, encrypted, and shipped to Google Drive, SFTP, or a local path. Point it at `/srv/data` and it backs that up too, with gitignore-style excludes. The companion `bbman` command handles setup, health checks, dependency installs, and self-updates so day-to-day maintenance stays out of the way.\n\nEvery command speaks structured JSON, making it compatible with AI agents out of the box: set two env vars, run `bbackup skills`, and drive the entire tool with `--input-json`.\n\n\u003e [!TIP]\n\u003e Use `--dry-run --output json` before destructive restore work or scheduled backup changes. The JSON plan is designed for both humans and automation.\n\n## Backup flow\n\n```mermaid\nflowchart LR\n    docker[Docker containers\u003cbr/\u003evolumes • configs • networks]\n    fs[Host filesystems\u003cbr/\u003epaths • excludes]\n    manifest[backup_manifest.json\u003cbr/\u003esizes • SHA-256 • item results]\n    encrypt[Encryption\u003cbr/\u003eAES-256-GCM or RSA-4096]\n    upload[Remote upload\u003cbr/\u003elocal • SFTP • rclone]\n    restore[Restore preflight\u003cbr/\u003emanifest verification]\n\n    docker --\u003e manifest\n    fs --\u003e manifest\n    manifest --\u003e encrypt\n    encrypt --\u003e upload\n    manifest --\u003e restore\n```\n\n---\n\n## Features\n\n| | Feature | Description |\n|:---:|:---|:---|\n| 🖥️ | **Rich TUI** | BTOP-style live dashboard with real-time transfer metrics |\n| 🐳 | **Docker backup** | Containers, volumes, networks, and configs in one shot |\n| 📁 | **Filesystem backup** | Back up any host path recursively with gitignore-style excludes |\n| ⚡ | **Incremental backups** | rsync `--link-dest` so unchanged data is hardlinked, not copied |\n| 🔐 | **Encryption** | AES-256-GCM (symmetric) or RSA-4096 (asymmetric) at rest |\n| ☁️ | **Remote storage** | Google Drive via rclone, SFTP, or local directory |\n| ♻️ | **Rotation** | Time-based daily/weekly/monthly retention with quota enforcement |\n| 📦 | **Solid archive** | Optional single tarball (and optional whole-file encryption) for upload so remotes get one file instead of many |\n| ↩️ | **Full restore** | Containers, volumes, networks, and filesystem paths; restore from directory or solid archive file |\n| 📦 | **Backup sets** | Named groups of containers defined in config for repeatable runs |\n| 🤖 | **Agent-friendly CLI** | JSON I/O, `--input-json`, `--dry-run`, and skill discovery on every command |\n| 🛠️ | **Management CLI** | `bbman` for setup, health, updates, cleanup, and diagnostics |\n\n---\n\n## Requirements\n\n- Python 3.12+\n- Docker (with socket access for your user)\n- `rsync` (system package — used for volume and filesystem backups)\n- `rclone` (optional, for Google Drive)\n\n---\n\n## Installation\n\n`uv` handles the tool environment automatically.\n\n### Install or redeploy from GitHub\n\nRun this when `uv` is already installed:\n\n```bash\nuv tool install --force git+https://github.com/CruxExperts/best-backup.git\n```\n\nIt creates an isolated uv tool environment and links `bbackup` and `bbman` into the uv tool bin directory. The `--force` flag makes the same command safe for first install, repair, and redeploy/update.\n\nIf `uv` is not installed yet:\n\n```bash\ncurl -LsSf https://astral.sh/uv/install.sh | sh\n~/.local/bin/uv tool update-shell\n~/.local/bin/uv tool install --force git+https://github.com/CruxExperts/best-backup.git\n```\n\nOpen a new shell after `uv tool update-shell` so `bbackup` and `bbman` are on your PATH.\n\n### Advanced: system-wide links\n\nMost installs should use the uv tool command above. If `/usr/local/bin/bbackup`\nand `/usr/local/bin/bbman` must be shared by every user or a root-owned\nscheduler, see [INSTALL.md](INSTALL.md#advanced-system-wide-uv-tool-links).\n\nFor development setup, local source installs, and uninstall instructions, see [INSTALL.md](INSTALL.md).\n\n---\n\n## Quick start\n\n```bash\n# First-time setup: checks Docker, installs deps, creates config\nbbman setup\n\n# Interactive backup with live TUI\nbbackup backup\n\n# Target specific containers\nbbackup backup --containers myapp mydb\n\n# Back up a host filesystem path\nbbackup backup --paths /srv/data\n\n# Non-interactive mode (cron or agent)\nBBACKUP_OUTPUT=json BBACKUP_NO_INTERACTIVE=1 bbackup backup --backup-set production\n```\n\nSee [QUICKSTART.md](QUICKSTART.md) for a full walk-through: config, remote storage, encryption setup, and more.\n\n---\n\n## Integrity And Upload Safety\n\nEach non-cancelled backup writes `backup_manifest.json` with the requested scope, filesystem source paths, volume artifact names, item results, errors, file sizes, and SHA-256 hashes. Restore verifies the manifest when present and fails before mutation if files are missing, changed, unlisted, or outside the backup root.\n\nLocal, SFTP, and rclone uploads write to `.partial` destinations first and promote to the final backup name only after the copy succeeds. When encryption succeeds, plaintext staging is removed so local backup artifacts match the encrypted output.\n\n---\n\n## Configuration\n\nbbackup checks these locations in order:\n\n1. `~/.config/bbackup/config.yaml`\n2. `~/.bbackup/config.yaml`\n3. `/etc/bbackup/config.yaml`\n4. `./config.yaml`\n\nA fully annotated template is in [`config.yaml.example`](config.yaml.example). The minimal setup:\n\n```yaml\nbackup:\n  local_staging: /tmp/bbackup_staging\n  backup_sets:\n    production:\n      containers: [myapp, mydb, nginx]\n      scope:\n        volumes: true\n        configs: true\n\nremotes:\n  local:\n    enabled: true\n    type: local\n    path: ~/backups/docker\n```\n\nFor rclone remotes you can optionally set `rclone_options.transfers` and `rclone_options.checkers` (or top-level `rclone.default_options`) to tune upload concurrency; both accept 1–32, default 8. See [config.yaml.example](config.yaml.example) and [docs/architecture.md](docs/architecture.md#rclone-options).\n\n### Filesystem backup\n\nAdd a `filesystem:` section to back up arbitrary host paths:\n\n```yaml\nfilesystem:\n  home-data:\n    description: \"Important home directory data\"\n    targets:\n      - name: documents\n        path: /home/user/Documents\n        enabled: true\n        excludes:\n          - \"*.tmp\"\n          - \".cache/\"\n          - \"node_modules/\"\n```\n\nRun a named filesystem set:\n\n```bash\nbbackup backup --filesystem-set home-data\n```\n\nOr pass paths directly, no config needed:\n\n```bash\nbbackup backup --paths /home/user/docs /srv/data --exclude \"*.tmp\"\n```\n\n---\n\n## CLI reference\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003ebbackup commands\u003c/strong\u003e\u003c/summary\u003e\n\n```bash\n# Docker backup\nbbackup backup                                         # Interactive backup with TUI\nbbackup backup --backup-set production                 # Named backup set from config\nbbackup backup --containers app db                     # Specific containers\nbbackup backup --incremental                           # rsync --link-dest mode\nbbackup backup --config-only                           # Skip volumes\nbbackup backup --volumes-only                          # Skip configs\nbbackup backup --no-networks                           # Skip network configs\nbbackup backup --remote gdrive                         # Upload to specific remote\n\n# Filesystem backup\nbbackup backup --paths /home/user/docs /srv/data       # Back up specific paths\nbbackup backup --paths /home/user/docs --exclude \"*.tmp\"\nbbackup backup --filesystem-set home-data              # Named set from config\n\n# Restore\nbbackup restore --backup-path /path/to/backup --all\nbbackup restore --backup-path /path --containers app --rename app:app_v2\nbbackup restore --backup-path /path --filesystem documents \\\n  --filesystem-destination /home/user/docs\n\n# Inspect\nbbackup list-containers\nbbackup list-backup-sets\nbbackup list-filesystem-sets\nbbackup list-backups\nbbackup list-remote-backups --remote gdrive\n\n# Setup\nbbackup init-config\nbbackup init-encryption --method asymmetric --algorithm rsa-4096\n\n# Agent / non-interactive (available on every command)\nbbackup list-containers --output json\nbbackup backup --containers app --input-json '{\"incremental\":true}'\nbbackup backup --containers app --dry-run --output json\nbbackup skills                          # discover all capabilities\nbbackup skills docker-backup            # step-by-step guide + JSON schemas\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003ebbman commands\u003c/strong\u003e\u003c/summary\u003e\n\n```bash\nbbman setup                                          # First-time setup wizard\nbbman setup --no-interactive                         # Skip wizard (agent mode)\nbbman health                                         # Docker, tools, config health check\nbbman health --output json\nbbman check-deps                                     # Check dependencies\nbbman check-deps --install                           # Install missing packages\nbbman validate-config                                # Parse and validate config\nbbman status                                         # Backup history and totals\nbbman status --output json\nbbman cleanup                                        # Clean staging dirs and old logs\nbbman cleanup --yes                                  # Skip confirmation (agent mode)\nbbman diagnostics                                    # Generate diagnostic report\nbbman diagnostics --report-file /tmp/report.txt      # Save to file\nbbman check-updates                                  # Check for newer version\nbbman update                                         # Self-update from repo\nbbman update --yes                                   # Skip confirmation (agent mode)\nbbman repo-url --url URL                             # Set the update source URL\nbbman run backup --containers app                    # Run bbackup through the wrapper\nbbman skills                                         # Discover bbman capabilities\nbbman skills maintenance                             # Step-by-step maintenance guide\n```\n\n\u003c/details\u003e\n\n---\n\n## Agent integration\n\nbbackup and bbman are natively compatible with AI agents. Every command supports structured JSON I/O, progressive skill discovery, and non-interactive execution without extra configuration.\n\n### Environment variables\n\nSet these once and every subprocess inherits them:\n\n```bash\nexport BBACKUP_OUTPUT=json           # all commands emit a JSON envelope\nexport BBACKUP_NO_INTERACTIVE=1      # no TUI, no prompts, no pagers\n```\n\n| Variable | Effect |\n|:---|:---|\n| `BBACKUP_OUTPUT=json` | All commands emit JSON envelope without `--output json` |\n| `BBACKUP_NO_INTERACTIVE=1` | Suppresses TUI, prompts, and pagers system-wide |\n\n### Skill discovery (JSON and Markdown)\n\n```bash\nbbackup skills                           # level-0: all skill IDs + summaries (JSON)\nbbackup skills docker-backup             # level-1: steps, schemas, examples (JSON)\nbbackup skills --format markdown         # full Markdown skills catalog\nbbman skills                             # level-0 skills for bbman (JSON)\nbbman skills maintenance                 # maintenance skill (JSON)\nbbman skills --format markdown           # full Markdown skills catalog\n```\n\nLevel-0 JSON output:\n\n```json\n{\n  \"cli\": \"bbackup\",\n  \"version\": \"1.8.2\",\n  \"agent_hint\": \"Set BBACKUP_OUTPUT=json and BBACKUP_NO_INTERACTIVE=1 for fully non-interactive use.\",\n  \"skills\": [\n    {\"id\": \"docker-backup\",     \"summary\": \"Back up Docker containers, volumes, networks, and configs.\", \"common\": true},\n    {\"id\": \"filesystem-backup\", \"summary\": \"Back up arbitrary host filesystem paths with gitignore-style excludes.\", \"common\": true},\n    {\"id\": \"restore\",           \"summary\": \"Restore containers, volumes, networks, or filesystem paths from a backup.\", \"common\": true}\n  ]\n}\n```\n\n### JSON envelope\n\nEvery command in JSON mode emits exactly this to **stdout**. All progress and diagnostic text goes to **stderr**.\n\n```json\n{\n  \"schema_version\": \"1\",\n  \"command\": \"backup\",\n  \"success\": true,\n  \"data\": {},\n  \"errors\": []\n}\n```\n\n- `schema_version` bumps only on breaking changes — additive fields are always safe.\n- `errors` is always present; non-empty means `success: false`.\n- A non-zero exit code always accompanies `success: false`.\n\n### `--input-json` parameter passing\n\nPass all parameters as a single flat JSON object. Keys use underscores (hyphens converted). The object merges over any CLI flags already provided.\n\n```bash\nbbackup restore \\\n  --input-json '{\"backup_path\":\"/tmp/bbackup/backup_20260227\",\"containers\":[\"myapp\"],\"dry_run\":true}' \\\n  --output json\n```\n\nUnknown keys are silently ignored — forward-compatible by design.\n\n### Dry-run / pre-flight\n\n```bash\nbbackup backup --containers myapp --dry-run --output json\n```\n\n```json\n{\n  \"schema_version\": \"1\",\n  \"command\": \"backup\",\n  \"success\": true,\n  \"data\": {\n    \"dry_run\": true,\n    \"would_backup\": {\n      \"containers\": [\"myapp\"],\n      \"filesystem_targets\": [],\n      \"remotes\": [],\n      \"incremental\": false,\n      \"scope\": {\"volumes\": true, \"configs\": true, \"networks\": true}\n    }\n  },\n  \"errors\": []\n}\n```\n\n### Exit codes\n\n| Code | Meaning |\n|:---:|:---|\n| `0` | Fully successful |\n| `1` | Bad argument, missing param, or invalid `--input-json` |\n| `2` | Config not found or fails validation |\n| `3` | Docker unreachable, rsync/rclone missing, or key generation failed |\n| `4` | Partial: some items succeeded, some failed |\n| `5` | Operation cancelled by user or agent |\n\n\u003e [!TIP]\n\u003e For agent workflows, set `BBACKUP_OUTPUT=json` and `BBACKUP_NO_INTERACTIVE=1` globally, then use `bbackup skills` to discover what's available before issuing commands.\n\n---\n\n## Encryption\n\nTwo modes are available:\n\n**Symmetric — AES-256-GCM:** One key encrypts and decrypts. Good for single-server setups.\n\n```bash\nbbackup init-encryption --method symmetric\n```\n\n**Asymmetric — RSA-4096:** Public key encrypts, private key decrypts. Better for multi-server setups where backup and restore run on separate machines.\n\n```bash\nbbackup init-encryption --method asymmetric --algorithm rsa-4096\n```\n\nThe public key can live on GitHub:\n\n```yaml\nencryption:\n  enabled: true\n  method: asymmetric\n  asymmetric:\n    public_key: github:YOUR_USERNAME/gist:YOUR_GIST_ID\n    private_key: ~/.config/bbackup/backup_private.pem\n```\n\nFull details in [docs/encryption.md](docs/encryption.md).\n\n---\n\n## TUI keyboard controls\n\n| Key | Action |\n|:---:|:---|\n| `Q` | Quit / cancel backup |\n| `P` | Pause / resume |\n| `S` | Skip current item |\n| `H` | Help |\n\n---\n\n## Project structure\n\n```\nbest-backup/\n├── bbackup/\n│   ├── cli.py                # bbackup CLI entry point\n│   ├── cli_utils.py          # JSON envelope, exit codes, shared decorators\n│   ├── skills.py             # Skill descriptors for agent discovery\n│   ├── config.py             # Config loading and all dataclasses\n│   ├── docker_backup.py      # Docker backup via temp Alpine containers\n│   ├── filesystem_backup.py  # Host filesystem backup via rsync\n│   ├── backup_runner.py      # Backup workflow orchestration\n│   ├── restore.py            # Restore operations\n│   ├── tui.py                # Rich TUI and BackupStatus tracking\n│   ├── remote.py             # Remote storage (local / rclone / SFTP)\n│   ├── rotation.py           # Retention policies and quota cleanup\n│   ├── encryption.py         # AES-256-GCM + RSA encryption\n│   ├── logging.py            # Rotating file logger\n│   ├── bbman_entry.py        # Console script shim for bbman\n│   └── management/           # bbman subpackage (11 modules)\n├── bbackup.py                # bbackup entry point\n├── bbman.py                  # bbman entry point\n├── config.yaml.example       # Annotated config template\n├── pyproject.toml\n└── uv.lock\n```\n\n---\n\n## Documentation\n\n| Doc | Description |\n|:---|:---|\n| [QUICKSTART.md](QUICKSTART.md) | Setup to first backup in 5 minutes |\n| [INSTALL.md](INSTALL.md) | All installation methods |\n| [docs/management.md](docs/management.md) | Full `bbman` reference |\n| [docs/encryption.md](docs/encryption.md) | Encryption setup and key management |\n| [CHANGELOG.md](CHANGELOG.md) | Release history |\n| [CONTRIBUTING.md](CONTRIBUTING.md) | How to contribute |\n| [SECURITY.md](SECURITY.md) | How to report vulnerabilities |\n| [SUPPORT.md](SUPPORT.md) | Where to ask questions or get help |\n| [docs/cli-skills.md](docs/cli-skills.md) | Unified CLI skills catalog for humans and AI agents |\n| [docs/VERSIONING.md](docs/VERSIONING.md) | Version source of truth, hook setup, and release validation |\n| [docs/PUBLISHING_CHECKLIST.md](docs/PUBLISHING_CHECKLIST.md) | GitHub publishing and release readiness checklist |\n\n---\n\n## Roadmap\n\n**Shipped**\n\n- [x] Rich TUI with real-time transfer metrics\n- [x] Incremental backups with rsync `--link-dest`\n- [x] Backup rotation and retention policies\n- [x] AES-256-GCM and RSA-4096 encryption\n- [x] Full restore with optional rename\n- [x] Filesystem backup for arbitrary host paths and directory trees\n- [x] Management wrapper (`bbman`)\n- [x] GitHub key integration for public key distribution\n- [x] AI agent JSON I/O, skill discovery, `--dry-run`, and `--input-json` on all commands\n- [x] Backup manifest verification with SHA-256 hashes\n- [x] Temp-to-final upload promotion for local, SFTP, and rclone remotes\n\n**Planned**\n\n- [ ] Email and webhook notifications\n- [ ] Cron-based scheduling integration\n- [ ] Multi-server backup coordination\n- [ ] Backup diff / comparison\n- [ ] Web UI\n\n---\n\n## Credits\n\nBuilt with [Rich](https://github.com/Textualize/rich), [Click](https://github.com/pallets/click), and [docker-py](https://github.com/docker/docker-py).\n\n---\n\n## License\n\n[MIT](LICENSE)\n\n\u003c!-- project-footer:start --\u003e\n\n\u003cbr\u003e\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\nSlavic Kozyuk\u003cbr\u003e\n\u0026copy; 2026 \u003ca href=\"https://www.cruxexperts.com/\"\u003eCrux Experts LLC\u003c/a\u003e \u0026mdash; \u003ca href=\"https://github.com/CruxExperts/best-backup/blob/main/LICENSE\"\u003eMIT License\u003c/a\u003e\n\u003c/p\u003e\n\n\u003c!-- project-footer:end --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcruxexperts%2Fbest-backup","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcruxexperts%2Fbest-backup","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcruxexperts%2Fbest-backup/lists"}