{"id":44150397,"url":"https://github.com/artifact-keeper/artifact-keeper","last_synced_at":"2026-04-06T00:01:44.669Z","repository":{"id":332841584,"uuid":"1135139824","full_name":"artifact-keeper/artifact-keeper","owner":"artifact-keeper","description":"Open-source universal artifact registry. Drop-in Artifactory/Nexus alternative with 40+ package formats, security scanning, WASM plugins, and edge replication.","archived":false,"fork":false,"pushed_at":"2026-04-02T01:24:35.000Z","size":14876,"stargazers_count":490,"open_issues_count":11,"forks_count":24,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-04-02T06:28:39.351Z","etag":null,"topics":["artifact-registry","artifactory-alternative","cargo-registry","container-registry","devops","docker-registry","helm-registry","maven-repository","nexus-alternative","npm-registry","nuget-server","open-source","package-manager","pypi-server","rust","security-scanning","self-hosted","typescript","vulnerability-scanner","wasm-plugins"],"latest_commit_sha":null,"homepage":"https://artifactkeeper.com","language":"Rust","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/artifact-keeper.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","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},"funding":{"github":"artifact-keeper"}},"created_at":"2026-01-15T17:36:42.000Z","updated_at":"2026-04-02T03:21:39.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/artifact-keeper/artifact-keeper","commit_stats":null,"previous_names":["brandonrc/artifact-keeper","artifact-keeper/artifact-keeper"],"tags_count":21,"template":false,"template_full_name":null,"purl":"pkg:github/artifact-keeper/artifact-keeper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artifact-keeper%2Fartifact-keeper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artifact-keeper%2Fartifact-keeper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artifact-keeper%2Fartifact-keeper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artifact-keeper%2Fartifact-keeper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/artifact-keeper","download_url":"https://codeload.github.com/artifact-keeper/artifact-keeper/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artifact-keeper%2Fartifact-keeper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31454200,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T21:22:52.476Z","status":"ssl_error","status_checked_at":"2026-04-05T21:22:51.943Z","response_time":75,"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":["artifact-registry","artifactory-alternative","cargo-registry","container-registry","devops","docker-registry","helm-registry","maven-repository","nexus-alternative","npm-registry","nuget-server","open-source","package-manager","pypi-server","rust","security-scanning","self-hosted","typescript","vulnerability-scanner","wasm-plugins"],"created_at":"2026-02-09T03:15:25.889Z","updated_at":"2026-04-06T00:01:44.608Z","avatar_url":"https://github.com/artifact-keeper.png","language":"Rust","readme":"# Artifact Keeper\n\n[![CI](https://github.com/artifact-keeper/artifact-keeper/actions/workflows/ci.yml/badge.svg)](https://github.com/artifact-keeper/artifact-keeper/actions/workflows/ci.yml)\n[![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=artifact-keeper_artifact-keeper\u0026metric=alert_status)](https://sonarcloud.io/dashboard?id=artifact-keeper_artifact-keeper)\n[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=artifact-keeper_artifact-keeper\u0026metric=security_rating)](https://sonarcloud.io/dashboard?id=artifact-keeper_artifact-keeper)\n[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=artifact-keeper_artifact-keeper\u0026metric=vulnerabilities)](https://sonarcloud.io/dashboard?id=artifact-keeper_artifact-keeper)\n[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=artifact-keeper_artifact-keeper\u0026metric=ncloc)](https://sonarcloud.io/dashboard?id=artifact-keeper_artifact-keeper)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![Rust](https://img.shields.io/badge/rust-1.75%2B-orange.svg)](https://www.rust-lang.org/)\n[![Docker](https://img.shields.io/badge/docker-ghcr.io%20%7C%20Docker%20Hub-blue.svg)](https://hub.docker.com/u/artifactkeeper)\n[![Sponsor](https://img.shields.io/badge/Sponsor-GitHub%20Sponsors-EA4AAA?logo=githubsponsors\u0026logoColor=white)](https://github.com/sponsors/artifact-keeper)\n\nAn enterprise-grade, open-source artifact registry supporting **45+ package formats**. Built with Rust.\n\n[Documentation](https://artifactkeeper.com/docs/) | [Demo](https://demo.artifactkeeper.com) | [Website](https://artifactkeeper.com)\n\n## Highlights\n\n- **45+ Package Formats** - Native protocol support for Maven, PyPI, NPM, Docker/OCI, Cargo, Go, Helm, and 38 more\n- **WASM Plugin System** - Extend with custom format handlers via WebAssembly (WIT-based, Wasmtime runtime)\n- **Security Scanning** - Automated vulnerability detection with Trivy and Grype, policy engine, quarantine workflow\n- **Hardened Containers** - All images built on [DISA STIG](https://www.cyber.mil/stigs/)-approved Red Hat UBI 9 base images, non-root execution, no shell or package manager in runtime\n- **Borg Replication** - Recursive peer mesh with swarm-based artifact distribution and P2P transfers\n- **Full-Text Search** - Meilisearch-powered search across all repositories and artifacts\n- **Multi-Auth** - JWT, OpenID Connect, LDAP, SAML 2.0, and API token support\n- **Artifactory Migration** - Built-in tooling to migrate repositories, artifacts, and permissions from JFrog Artifactory\n- **Artifact Signing** - GPG and RSA signing integrated into Debian, RPM, Alpine, and Conda handlers\n\n## System Architecture\n\n```mermaid\ngraph LR\n    Client[\"CLI / Package Manager / Frontend\"]\n    Backend[\"Backend\u003cbr/\u003eRust · Axum\u003cbr/\u003e45+ format handlers\"]\n    DB[(PostgreSQL 16)]\n    Storage[\"Storage\u003cbr/\u003eFilesystem / S3\"]\n    Meili[\"Meilisearch\u003cbr/\u003eFull-text search\"]\n    Trivy[\"Trivy\u003cbr/\u003eContainer \u0026 FS scanning\"]\n    Grype[\"Grype\u003cbr/\u003eDependency scanning\"]\n    OpenSCAP[\"OpenSCAP\u003cbr/\u003eCompliance scanning\"]\n    Peer1[\"Peer Instance\"]\n    Peer2[\"Peer Instance\"]\n\n    Client --\u003e Backend\n    Backend --\u003e DB\n    Backend --\u003e Storage\n    Backend --\u003e Meili\n    Backend --\u003e Trivy\n    Backend --\u003e Grype\n    Backend --\u003e OpenSCAP\n    Backend \u003c--\u003e|Borg Replication| Peer1\n    Backend \u003c--\u003e|Borg Replication| Peer2\n    Peer1 \u003c--\u003e|P2P Mesh| Peer2\n```\n\n## Backend Architecture\n\nThe backend follows a layered architecture with a middleware pipeline processing every request.\n\n```mermaid\nflowchart TD\n    REQ[\"HTTP Request\"] --\u003e MW[\"Middleware Pipeline\"]\n\n    subgraph MW[\"Middleware\"]\n        direction LR\n        CORS[\"CORS\"] --\u003e AUTH[\"Auth\u003cbr/\u003eJWT · OIDC · LDAP\u003cbr/\u003eSAML · API Key\"]\n        AUTH --\u003e RL[\"Rate Limiter\"]\n        RL --\u003e TRACE[\"Tracing\u003cbr/\u003e+ Metrics\"]\n        TRACE --\u003e DEMO[\"Demo Mode\u003cbr/\u003eGuard\"]\n    end\n\n    MW --\u003e ROUTER[\"Router\u003cbr/\u003e50+ route groups\"]\n\n    subgraph HANDLERS[\"Handler Layer\"]\n        FMT[\"Format Handlers\u003cbr/\u003eMaven · PyPI · NPM\u003cbr/\u003eDocker · 41 more\"]\n        CORE[\"Core Handlers\u003cbr/\u003eRepos · Artifacts\u003cbr/\u003eUsers · Auth\"]\n        ADV[\"Advanced Handlers\u003cbr/\u003eSecurity · Plugins\u003cbr/\u003ePeers · Migration\"]\n    end\n\n    ROUTER --\u003e HANDLERS\n\n    subgraph SERVICES[\"Service Layer\"]\n        direction LR\n        ART[\"Artifact\u003cbr/\u003eService\"]\n        REPO[\"Repository\u003cbr/\u003eService\"]\n        SCAN[\"Scanner\u003cbr/\u003eService\"]\n        PLUG[\"Plugin\u003cbr/\u003eService\"]\n        SEARCH[\"Search\u003cbr/\u003eService\"]\n    end\n\n    HANDLERS --\u003e SERVICES\n\n    subgraph DATA[\"Data Layer\"]\n        direction LR\n        PG[(PostgreSQL)]\n        FS[\"Storage\u003cbr/\u003eFS / S3\"]\n        MS[\"Meilisearch\"]\n        SC[\"Trivy / Grype / OpenSCAP\"]\n    end\n\n    SERVICES --\u003e DATA\n```\n\n## Supported Package Formats\n\n45+ formats organized by ecosystem. Each has a native protocol handler that speaks the package manager's wire protocol.\n\n### Languages \u0026 Runtimes\n\n| Format | Aliases | Ecosystem |\n|--------|---------|-----------|\n| **Maven** | Gradle | Java, Kotlin, Scala |\n| **NPM** | Yarn, Bower, pnpm | JavaScript, TypeScript |\n| **PyPI** | Poetry, Conda | Python |\n| **NuGet** | Chocolatey, PowerShell | .NET, C# |\n| **Cargo** | | Rust |\n| **Go** | | Go modules |\n| **RubyGems** | | Ruby |\n| **Hex** | | Elixir, Erlang |\n| **Composer** | | PHP |\n| **Pub** | | Dart, Flutter |\n| **CocoaPods** | | iOS, macOS |\n| **Swift** | | Swift Package Manager |\n| **CRAN** | | R |\n| **SBT** | Ivy | Scala, Java |\n\n### Containers \u0026 Infrastructure\n\n| Format | Aliases | Ecosystem |\n|--------|---------|-----------|\n| **Docker / OCI** | Podman, Buildx, ORAS, WASM OCI, Helm OCI | Container images |\n| **Helm** | | Kubernetes charts |\n| **Terraform** | OpenTofu | Infrastructure modules |\n| **Vagrant** | | VM boxes |\n\n### System Packages\n\n| Format | Ecosystem |\n|--------|-----------|\n| **RPM** | RHEL, Fedora, CentOS |\n| **Debian** | Ubuntu, Debian |\n| **Alpine** | Alpine Linux (APK) |\n| **Conda** | Conda channels |\n| **OPKG** | OpenWrt, embedded Linux |\n\n### Configuration Management\n\n| Format | Ecosystem |\n|--------|-----------|\n| **Chef** | Chef Supermarket |\n| **Puppet** | Puppet Forge |\n| **Ansible** | Ansible Galaxy |\n\n### ML / AI\n\n| Format | Ecosystem |\n|--------|-----------|\n| **HuggingFace** | Models, datasets |\n| **ML Model** | Generic ML artifacts |\n\n### Editor Extensions\n\n| Format | Aliases | Ecosystem |\n|--------|---------|-----------|\n| **VS Code** | | Extension marketplace (VS Code, Cursor, Windsurf, Kiro) |\n| **JetBrains** | | Plugin repository |\n\n### Schemas\n\n| Format | Ecosystem |\n|--------|-----------|\n| **Protobuf / BSR** | Buf Schema Registry, Connect RPC |\n\n### Other\n\n| Format | Ecosystem |\n|--------|-----------|\n| **Conan** | C, C++ |\n| **Git LFS** | Large file storage |\n| **Bazel** | Bazel modules |\n| **P2** | Eclipse plugins |\n| **Generic** | Any file type |\n\n\u003e Custom formats can be added via the [WASM plugin system](#wasm-plugin-system).\n\n## Security Scanning Pipeline\n\nEvery artifact upload is automatically scanned for known vulnerabilities.\n\n```mermaid\nflowchart LR\n    UP[\"Artifact\u003cbr/\u003eUpload\"] --\u003e HASH{\"SHA-256\u003cbr/\u003eDedup\"}\n    HASH --\u003e|New artifact| T[\"Trivy\u003cbr/\u003eFS Scanner\"]\n    HASH --\u003e|New artifact| G[\"Grype\u003cbr/\u003eDependency Scanner\"]\n    HASH --\u003e|Already scanned| CACHE[\"Cached\u003cbr/\u003eResults\"]\n    T --\u003e SCORE[\"Vulnerability\u003cbr/\u003eScore A-F\"]\n    G --\u003e SCORE\n    CACHE --\u003e SCORE\n    SCORE --\u003e POL{\"Policy\u003cbr/\u003eEngine\"}\n    POL --\u003e|Pass| OK[\"Stored\"]\n    POL --\u003e|Fail| Q[\"Quarantined\"]\n```\n\n- **Dual scanner** - Trivy for filesystem/container analysis, Grype for dependency trees\n- **Scoring** - A through F grades based on finding severity and count\n- **Policies** - Configurable rules that block or quarantine artifacts\n- **Signing** - GPG/RSA signing for Debian, RPM, Alpine, and Conda packages\n\n## Borg Replication\n\nRecursive peer-to-peer replication where every node is a full Artifact Keeper instance. No thin caches — each peer runs the same stack and can serve as an origin for other peers.\n\n```mermaid\ngraph TD\n    P1[\"Peer\u003cbr/\u003eUS-West\"]\n    P2[\"Peer\u003cbr/\u003eEU-Central\"]\n    P3[\"Peer\u003cbr/\u003eAP-Southeast\"]\n    P4[\"Peer\u003cbr/\u003eUS-East\"]\n\n    P1 \u003c--\u003e|\"Chunked Transfer\"| P2\n    P1 \u003c--\u003e|\"Chunked Transfer\"| P4\n    P2 \u003c--\u003e|\"Chunked Transfer\"| P3\n    P3 \u003c--\u003e|\"Chunked Transfer\"| P4\n    P1 \u003c--\u003e|\"P2P Mesh\"| P3\n    P2 \u003c--\u003e|\"P2P Mesh\"| P4\n```\n\n- **Recursive peers** - Every peer is a full instance (backend, DB, storage) that can originate replication to other peers\n- **Swarm-based distribution** - Artifacts replicate across the mesh based on demand\n- **Chunked transfers** - Large artifacts split for reliable delivery over unstable links\n- **Network-aware scheduling** - Bandwidth and latency profiling for optimal routing\n\n## WASM Plugin System\n\nExtend Artifact Keeper with custom format handlers compiled to WebAssembly.\n\n- **WIT-based interface** - Plugins implement a well-defined `FormatHandler` contract\n- **Wasmtime runtime** - Sandboxed execution with fuel-based CPU limits and memory caps\n- **Hot reload** - Install, enable, disable, and reload plugins without restart\n- **Sources** - Load from Git repositories or ZIP uploads\n\n## Quick Start\n\nGet running in 5 minutes with Docker Compose: **[Quickstart Guide](https://artifactkeeper.com/docs/getting-started/quickstart/)**\n\n## Documentation\n\n- **[Quickstart](https://artifactkeeper.com/docs/getting-started/quickstart/)** — Get running in 5 minutes\n- **[Installation](https://artifactkeeper.com/docs/getting-started/installation/)** — Docker Compose, Windows Service (beta), or build from source\n- **[Configuration](https://artifactkeeper.com/docs/getting-started/configuration/)** — Environment variables reference\n- **[Package Formats](https://artifactkeeper.com/docs/package-formats/)** — All 45+ supported formats\n- **[Docker Deployment](https://artifactkeeper.com/docs/deployment/docker/)** — Production setup guide\n\n## Project Structure\n\n```\nartifact-keeper/\n├── backend/          # Rust backend (Axum, SQLx, 6,400+ unit tests)\n│   ├── src/\n│   │   ├── api/      # Handlers, middleware, routes\n│   │   ├── formats/  # 45+ format handler implementations\n│   │   ├── services/ # Business logic (68 services)\n│   │   ├── models/   # Data models (21 types)\n│   │   └── storage/  # FS and S3 backends\n│   └── migrations/   # 69 PostgreSQL migrations\n├── edge/             # Peer replication service (Rust)\n├── scripts/          # Test runners, native client tests, stress tests\n└── .github/          # CI/CD workflows\n```\n\n## Technology Choices\n\n| Layer | Choice | Why |\n|-------|--------|-----|\n| Backend language | **Rust** | Memory safety, performance, strong type system |\n| Web framework | **Axum** | Tower middleware ecosystem, async-first |\n| Database | **PostgreSQL 16** | JSONB for metadata, mature ecosystem |\n| Search | **Meilisearch** | Fast full-text search, easy to operate |\n| Security scanning | **Trivy + Grype + OpenSCAP** | Complementary coverage, industry standard |\n| Plugin runtime | **Wasmtime** | Sandboxed, portable, WIT contract system |\n| Storage | **Filesystem / S3** | Simple default, cloud-ready upgrade path |\n\n## CI/CD Pipeline\n\nSeven GitHub Actions workflows handle testing, publishing, and deployment.\n\n```mermaid\nflowchart TD\n    subgraph TRIGGER[\"Triggers\"]\n        PUSH[\"Push / PR\u003cbr/\u003eto main\"]\n        TAG[\"Tag v*\"]\n        CRON[\"Daily 2 AM UTC\"]\n        SITE_PUSH[\"Push to site/**\"]\n    end\n\n    subgraph CI[\"ci.yml — Every Push/PR\"]\n        direction TB\n        LINT[\"🦀 Lint Rust\u003cbr/\u003efmt + clippy\"]\n        UNIT[\"🧪 Unit Tests\u003cbr/\u003ecargo test --lib\"]\n        INTEG[\"🔗 Integration Tests\u003cbr/\u003e+ PostgreSQL\u003cbr/\u003e(main push only)\"]\n        SMOKE[\"🔥 Smoke E2E\u003cbr/\u003ePyPI · npm · Cargo\u003cbr/\u003edocker-compose.test.yml\"]\n        AUDIT[\"🔒 Security Audit\u003cbr/\u003ecargo audit\"]\n        CI_OK[\"✅ CI Complete\"]\n\n        LINT --\u003e UNIT\n        LINT --\u003e INTEG\n        UNIT --\u003e SMOKE\n        SMOKE --\u003e CI_OK\n        AUDIT --\u003e CI_OK\n    end\n\n    subgraph DOCKER[\"docker-publish.yml — Push to main / tags\"]\n        direction TB\n        BE_BUILD[\"Backend\u003cbr/\u003eamd64 + arm64\"]\n        OS_BUILD[\"OpenSCAP\u003cbr/\u003eamd64 + arm64\"]\n        BE_MERGE[\"Multi-Arch\u003cbr/\u003eManifest\"]\n        OS_MERGE[\"Multi-Arch\u003cbr/\u003eManifest\"]\n\n        BE_BUILD --\u003e BE_MERGE\n        OS_BUILD --\u003e OS_MERGE\n    end\n\n    subgraph E2E[\"e2e.yml — Manual / called by release\"]\n        direction TB\n        PKI[\"🔐 Setup PKI\u003cbr/\u003eTLS + GPG\"]\n        NATIVE[\"📦 Native Client Tests\u003cbr/\u003e10 formats\"]\n        STRESS[\"🔥 Stress Tests\u003cbr/\u003e100 concurrent uploads\"]\n        FAILURE[\"💥 Failure Tests\u003cbr/\u003ecrash · db · storage\"]\n\n        PKI --\u003e NATIVE\n        NATIVE --\u003e STRESS\n        NATIVE --\u003e FAILURE\n    end\n\n    subgraph RELEASE[\"release.yml — Tags v*\"]\n        direction TB\n        E2E_GATE[\"🚦 E2E Gate\u003cbr/\u003eall formats + stress + failure\"]\n        BINARIES[\"📦 Build Binaries\u003cbr/\u003elinux + macOS\u003cbr/\u003eamd64 + arm64\"]\n        GH_RELEASE[\"🚀 GitHub Release\u003cbr/\u003ebinaries + checksums\"]\n\n        E2E_GATE --\u003e BINARIES\n        BINARIES --\u003e GH_RELEASE\n    end\n\n    subgraph NIGHTLY[\"scheduled-tests.yml — Daily\"]\n        direction TB\n        NIGHTLY_E2E[\"🌙 Nightly Smoke E2E\"]\n        DEP_CHECK[\"🔍 Dependency Check\"]\n        SEC_SCAN[\"🔒 Security Scan\"]\n    end\n\n    subgraph SITE[\"site.yml\"]\n        PAGES[\"📄 Build + Deploy\u003cbr/\u003eGitHub Pages\"]\n    end\n\n    subgraph AMI[\"ami-build.yml\"]\n        PACKER[\"🖥️ Packer Build AMI\"]\n    end\n\n    PUSH --\u003e CI\n    PUSH --\u003e DOCKER\n    TAG --\u003e RELEASE\n    TAG --\u003e DOCKER\n    CRON --\u003e NIGHTLY\n    SITE_PUSH --\u003e SITE\n    GH_RELEASE -.-\u003e|\"on release published\"| AMI\n\n    classDef trigger fill:#6f42c1,color:#fff,stroke:#6f42c1\n    classDef ci fill:#2ea44f,color:#fff,stroke:#2ea44f\n    classDef docker fill:#0969da,color:#fff,stroke:#0969da\n    classDef release fill:#d97706,color:#fff,stroke:#d97706\n\n    class PUSH,TAG,CRON,SITE_PUSH trigger\n    class LINT,UNIT,INTEG,SMOKE,AUDIT,CI_OK ci\n    class BE_BUILD,OS_BUILD,BE_MERGE,OS_MERGE docker\n    class E2E_GATE,BINARIES,GH_RELEASE release\n```\n\n| Workflow | Trigger | What It Does |\n|----------|---------|--------------|\n| **ci.yml** | Every push/PR | Lint, unit tests, integration tests, smoke E2E (PyPI, npm, Cargo) |\n| **docker-publish.yml** | Push to main, tags | Multi-arch Docker images (backend + OpenSCAP) to ghcr.io |\n| **e2e.yml** | Manual or called by release | Full E2E: 10 native client formats, stress, failure injection |\n| **release.yml** | Tags `v*` | E2E gate, cross-platform binaries, GitHub Release |\n| **scheduled-tests.yml** | Daily 2 AM UTC | Nightly smoke E2E, dependency check, security scan |\n| **site.yml** | Push to `site/**` | Build and deploy docs to GitHub Pages |\n| **ami-build.yml** | On release published | Bake AWS AMI with Packer |\n\n## Sponsors\n\nThank you to our sponsors for supporting ongoing development of Artifact Keeper.\n\n### Backers\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/dragonpaw\"\u003e\u003cimg src=\"https://github.com/dragonpaw.png\" width=\"60\" /\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAsh A.\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/injectedfusion\"\u003e\u003cimg src=\"https://github.com/injectedfusion.png\" width=\"60\" /\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eGabriel Rodriguez\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n[Become a sponsor](https://github.com/sponsors/artifact-keeper) to support the project and get your name listed here.\n\n## Contributing\n\nWe welcome contributions! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\nHave questions or ideas? Join the conversation in [GitHub Discussions](https://github.com/artifact-keeper/artifact-keeper/discussions).\n\n## License\n\nMIT License - see [LICENSE](LICENSE) for details.\n\n---\n\nBuilt with Rust. \"JFrog\" and \"Artifactory\" are trademarks of JFrog Ltd. Artifact Keeper is not affiliated with or endorsed by JFrog.\n","funding_links":["https://github.com/sponsors/artifact-keeper"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fartifact-keeper%2Fartifact-keeper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fartifact-keeper%2Fartifact-keeper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fartifact-keeper%2Fartifact-keeper/lists"}