<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Wen Ping</title>
    <description>The latest articles on DEV Community by Wen Ping (@wenping).</description>
    <link>https://dev.to/wenping</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4174947%2F7dddb348-e605-4df5-a2ef-2e93a7bc9682.jpg</url>
      <title>DEV Community: Wen Ping</title>
      <link>https://dev.to/wenping</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wenping"/>
    <language>en</language>
    <item>
      <title>AngusRepo: Enterprise Multi-Format Artifact Repository | Unified Management for Maven/Docker/npm and 10+ Formats</title>
      <dc:creator>Wen Ping</dc:creator>
      <pubDate>Sat, 10 Oct 2026 09:45:17 +0000</pubDate>
      <link>https://dev.to/wenping/angusrepo-enterprise-multi-format-artifact-repository-unified-management-for-mavendockernpm-49b4</link>
      <guid>https://dev.to/wenping/angusrepo-enterprise-multi-format-artifact-repository-unified-management-for-mavendockernpm-49b4</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Development teams often face this challenge: Java project JARs, frontend npm dependencies, container images, and Helm Charts are scattered across different services, each requiring separate repository addresses, access credentials, and caching strategies. Internal components rely on file sharing, public dependencies are downloaded repeatedly, and artifact permissions and security information are difficult to manage uniformly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;AngusRepo provides a unified enterprise-grade artifact repository platform&lt;/strong&gt;, managing 10+ formats including Maven, Docker, npm, PyPI, NuGet, Helm, Go, APT, YUM, and Raw in a single system. It provides clear storage locations for artifacts, stable access points for dependencies, and makes publishing and governance easier to integrate into team workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is AngusRepo?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.anguskit.com/en/products/repo" rel="noopener noreferrer"&gt;AngusRepo&lt;/a&gt; is an &lt;strong&gt;enterprise-grade multi-format artifact repository management system&lt;/strong&gt; within the AngusKit suite, designed to uniformly host, proxy, distribute, and manage software artifacts. It supports 10 mainstream artifact formats and seamlessly integrates with developers' familiar build and package management tools through standard protocols.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;10+&lt;/strong&gt; — Supported Formats&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3 Types&lt;/strong&gt; — Repository Types: Hosted/Proxy/Group&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unified&lt;/strong&gt; — Platform Management &amp;amp; Security&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For development teams, AngusRepo is more than just a place to upload files. It connects &lt;strong&gt;internal artifact publishing, public dependency retrieval, version distribution, access control, and security governance&lt;/strong&gt;, helping developers, builders, deployers, and managers work around a unified artifact source.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AngusRepo vs Other Solutions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As part of the AngusKit ecosystem, AngusRepo deeply integrates with AngusGit (code repository), AngusGM (project management), AngusSecurity (security scanning), and other products to provide enterprises with &lt;strong&gt;a complete DevOps toolchain from source code to artifact delivery&lt;/strong&gt;. Compared to independently deploying Nexus, Artifactory, or Harbor, AngusRepo's advantages include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unified Identity and Permission System&lt;/strong&gt;: Shares users, organizations, and permission management with other AngusKit products&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native Integration&lt;/strong&gt;: Works seamlessly with AngusGit CI/CD, AngusSecurity scanning, and other features without additional configuration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simplified Operations&lt;/strong&gt;: Unified deployment, monitoring, and upgrade processes reduce multi-system maintenance costs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optional Cloud-Native Architecture&lt;/strong&gt;: Supports containerized deployment, horizontal scaling, and high availability configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Functional Architecture Overview
&lt;/h2&gt;

&lt;p&gt;The diagram below shows AngusRepo's complete capability system from a product functional perspective, covering the entire workflow from user roles, client access, artifact formats, repository management, security governance to CI/CD integration, as well as typical artifact flow scenarios.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1dt97xgbwpfdbqq334y5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1dt97xgbwpfdbqq334y5.png" alt="AngusRepo Functional Architecture Diagram" width="800" height="595"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architecture Diagram Explanation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The architecture diagram is divided into four main functional areas, showcasing AngusRepo's complete capability system:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;① Client &amp;amp; Artifact Formats (Left · Green Area)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Displays 10 supported artifact formats, each with dedicated cards and descriptions&lt;/li&gt;
&lt;li&gt;Developers use familiar package managers (Maven, Docker CLI, npm, etc.) and build pipelines to access&lt;/li&gt;
&lt;li&gt;All formats communicate with AngusRepo through standard protocols without learning new tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;② AngusRepo Core Repository (Center · Orange Area)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repository Types&lt;/strong&gt;: HOSTED (internal hosting), PROXY (proxy caching), GROUP (aggregated access)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Artifact Management&lt;/strong&gt;: Repository creation, version browsing, access control, analytics &amp;amp; audit, REST API/Webhook&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security &amp;amp; Compliance&lt;/strong&gt;: Vulnerability scanning, license analysis, SBOM export, scanning policy configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;③ CI/CD &amp;amp; Ecosystem Collaboration (Right · Purple Area)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Seamless integration with mainstream CI/CD tools like Jenkins, GitHub Actions, GitLab CI&lt;/li&gt;
&lt;li&gt;Deep collaboration with AngusKit ecosystem (AngusGit, AngusAI)&lt;/li&gt;
&lt;li&gt;Connect third-party tools and custom workflows through REST API and Webhook&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;④ Typical Artifact Flow (Bottom · Yellow Area)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Public Dependency Retrieval&lt;/strong&gt;: Upstream Repository → PROXY Cache → GROUP Aggregation → Development/Build Pull&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internal Artifact Delivery&lt;/strong&gt;: CI Build → HOSTED Hosting → Security Scanning → Downstream Consumption&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Tip&lt;/strong&gt;: The architecture diagram supports dark mode and automatically adapts to your system theme preferences.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Core Capabilities: What Can AngusRepo Do?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Unified Multi-Format Management
&lt;/h3&gt;

&lt;p&gt;Manage 10 artifact formats in a single platform. Teams can plan repositories by format and purpose without introducing separate management processes for each package or image type. All artifacts use unified permission systems, audit logs, and storage management.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Host Internal Artifacts
&lt;/h3&gt;

&lt;p&gt;Through &lt;strong&gt;HOSTED (hosted) repositories&lt;/strong&gt;, teams can store their own built and published packages, images, and other artifacts, and provide access to developers, CI/CD pipelines, or downstream environments based on permissions. Internal artifacts thus have unified, traceable publishing locations without relying on temporary files or personal machine transfers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typical Use Cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Publish internal Java component libraries to Maven hosted repositories&lt;/li&gt;
&lt;li&gt;Push enterprise application Docker images for test and production environments to pull&lt;/li&gt;
&lt;li&gt;Host team-developed npm private packages for frontend projects&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Proxy and Cache Public Dependencies
&lt;/h3&gt;

&lt;p&gt;Through &lt;strong&gt;PROXY (proxy) repositories&lt;/strong&gt;, AngusRepo can proxy upstream repositories for supported formats and cache retrieved dependencies. Development and build processes thus gain unified dependency access points and reduce repeated downloads' direct dependency on external networks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Accelerate Builds&lt;/strong&gt;: Local caching after first download, subsequent builds don't need to repeatedly fetch from public networks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improve Stability&lt;/strong&gt;: Reduce dependency on external repository availability&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Save Bandwidth&lt;/strong&gt;: Team-shared caching reduces duplicate traffic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline Support&lt;/strong&gt;: Cached dependencies can be used in network-restricted environments&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Aggregate Multi-Source Access
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GROUP (aggregated) repositories&lt;/strong&gt; can query multiple member repositories in configured order, allowing clients to retrieve artifacts from different sources through a single read-only entry point. It's especially suitable for organizing internal artifact repositories and public dependency proxies into a unified pull entry point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; A Maven group repository can sequentially query internal releases, internal snapshots, and Maven Central proxy, with developers only needing to configure one repository address.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Security and Compliance Governance
&lt;/h3&gt;

&lt;p&gt;AngusRepo provides complete artifact security governance capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Access Control&lt;/strong&gt;: Fine-grained permission management based on users, organizations, and projects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access Tokens&lt;/strong&gt;: Support for read-only, read-write, specific repository-scoped tokens for easy CI/CD integration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Activity Audit&lt;/strong&gt;: Records all artifact upload, download, delete operations to meet compliance requirements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security Scanning&lt;/strong&gt;: Integrates with &lt;a href="https://www.anguskit.com/en/products/security" rel="noopener noreferrer"&gt;AngusSecurity&lt;/a&gt; for artifact vulnerability scanning and license analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SBOM Generation&lt;/strong&gt;: Automatically generates Software Bill of Materials&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lifecycle Management&lt;/strong&gt;: Automatically deletes expired or unused artifacts through cleanup policies to save storage space&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Integration with DevOps Workflows
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Standard Protocol Support&lt;/strong&gt;: Developers continue using familiar tools like Maven, Docker CLI, npm, pip without learning new commands&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;REST API&lt;/strong&gt;: Complete API support for automated operations like artifact queries, version management, repository configuration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhook Notifications&lt;/strong&gt;: Artifact publish, delete events can trigger external systems, such as notifying test environments for automatic deployment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD Integration&lt;/strong&gt;: Seamlessly works with Jenkins, GitLab CI, GitHub Actions, AngusGit CI, and more&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Supported Artifact Formats and Repository Types
&lt;/h2&gt;

&lt;p&gt;AngusRepo's 10 supported formats cover common development language ecosystems, container delivery, system packages, and generic files. The table below lists supported repository types for each format:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Artifact Format&lt;/th&gt;
&lt;th&gt;HOSTED&lt;/th&gt;
&lt;th&gt;PROXY&lt;/th&gt;
&lt;th&gt;GROUP&lt;/th&gt;
&lt;th&gt;Typical Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://www.anguskit.com/en/docs/repo/manual/05-formats/01-maven" rel="noopener noreferrer"&gt;Maven&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;Java/JVM project dependency management, internal component publishing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://www.anguskit.com/en/docs/repo/manual/05-formats/02-docker" rel="noopener noreferrer"&gt;Docker / OCI&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;Application image hosting, public image proxy and deployment delivery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://www.anguskit.com/en/docs/repo/manual/05-formats/03-npm" rel="noopener noreferrer"&gt;npm&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;Frontend dependency management, internal npm package publishing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://www.anguskit.com/en/docs/repo/manual/05-formats/04-pypi" rel="noopener noreferrer"&gt;PyPI&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;Python project dependency retrieval and internal package distribution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://www.anguskit.com/en/docs/repo/manual/05-formats/05-nuget" rel="noopener noreferrer"&gt;NuGet&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;.NET application dependency management and component publishing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://www.anguskit.com/en/docs/repo/manual/05-formats/06-helm" rel="noopener noreferrer"&gt;Helm&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;Kubernetes application Chart hosting and distribution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://www.anguskit.com/en/docs/repo/manual/05-formats/07-go" rel="noopener noreferrer"&gt;Go&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;Retrieve and cache Go dependencies through module proxy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://www.anguskit.com/en/docs/repo/manual/05-formats/08-apt" rel="noopener noreferrer"&gt;APT&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;Debian/Ubuntu &lt;code&gt;.deb&lt;/code&gt; package hosting and distribution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://www.anguskit.com/en/docs/repo/manual/05-formats/09-yum" rel="noopener noreferrer"&gt;YUM&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;RPM-based Linux environment package distribution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://www.anguskit.com/en/docs/repo/manual/05-formats/10-raw" rel="noopener noreferrer"&gt;Raw&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;Installers, binary files, archives, and other files&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Notes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✓ indicates the format supports this repository type&lt;/li&gt;
&lt;li&gt;✗ indicates the format does not support this repository type&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HOSTED&lt;/strong&gt;: Store team's own artifacts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PROXY&lt;/strong&gt;: Cache upstream public repository dependencies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GROUP&lt;/strong&gt;: Provide unified multi-source query entry point (only some formats supported)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These 10 formats each retain their ecosystem's usage patterns. Developers can still use familiar command-line tools and build systems to access, with repository addresses, authentication methods, and format-specific configurations following respective format guidelines. See the &lt;a href="https://www.anguskit.com/en/docs/repo/manual/05-formats" rel="noopener noreferrer"&gt;complete format usage guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Do the Three Repository Types Work Together?
&lt;/h2&gt;

&lt;p&gt;AngusRepo organizes different artifact flow patterns using three repository types. Each has different responsibilities, and not all artifact formats support all three types simultaneously.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Repository Type&lt;/th&gt;
&lt;th&gt;Main Responsibility&lt;/th&gt;
&lt;th&gt;Typical Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HOSTED&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Store team's own artifacts and provide authorized access&lt;/td&gt;
&lt;td&gt;Publish internal packages, components, and images&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PROXY&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Connect to upstream repositories and cache retrieved dependencies&lt;/td&gt;
&lt;td&gt;Centrally access public dependencies, reduce duplicate downloads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GROUP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Query multiple member repositories in configured order, providing unified read-only entry&lt;/td&gt;
&lt;td&gt;When format supports, organize internal artifacts and public dependencies into a single pull address&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For example, in a typical Maven project, a team can place internal releases in &lt;code&gt;maven-releases&lt;/code&gt; (HOSTED), configure Maven Central as &lt;code&gt;maven-central&lt;/code&gt; (PROXY), and create &lt;code&gt;maven-public&lt;/code&gt; (GROUP) for developers to resolve dependencies. Developers pull dependencies through the unified entry point, while CI/CD publishes new versions to the corresponding HOSTED repository.&lt;/p&gt;

&lt;p&gt;This division makes "where to get dependencies" and "where to publish artifacts" clear, and facilitates separate team management of publishing permissions, dependency sources, and version strategies. See the &lt;a href="https://www.anguskit.com/en/docs/repo/manual/04-repositories" rel="noopener noreferrer"&gt;Repository Management Manual&lt;/a&gt; for more repository planning approaches.&lt;/p&gt;

&lt;h2&gt;
  
  
  Typical Use Cases: What Problems Does AngusRepo Solve?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Unified Artifact Management for Multi-Language Teams
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario:&lt;/strong&gt; An internet company uses Java (backend), React (frontend), Python (data analysis), and Go (microservices), each language with its own dependency management approach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developers need to separately configure Maven, npm, PyPI, Go proxy repository addresses and credentials&lt;/li&gt;
&lt;li&gt;Different repositories have independent permission management, difficult to unify accounts and tokens&lt;/li&gt;
&lt;li&gt;Lack of unified audit and monitoring, unable to comprehensively understand artifact usage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Use AngusRepo to create repositories for corresponding formats, managing all artifacts uniformly. Team members use the same identity system to access different format repositories, and administrators manage permissions, audit logs, and storage quotas through one platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Accelerate Builds and Improve Stability
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario:&lt;/strong&gt; An enterprise team is in a network-restricted environment, with slow and unstable access to Maven Central, npm Registry, and other public repositories.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Builds repeatedly download dependencies from public networks, time-consuming and prone to failure&lt;/li&gt;
&lt;li&gt;Multiple developers and CI/CD nodes repeatedly download the same dependencies, wasting bandwidth&lt;/li&gt;
&lt;li&gt;External repositories occasionally unavailable causing build interruptions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Configure AngusRepo's PROXY repositories to proxy upstream public repositories. After the first download, dependencies are cached locally, subsequent builds pull directly from cache, build speed improves by 60%, and no longer affected by external networks.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Standardized Publishing of Internal Component Libraries
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario:&lt;/strong&gt; A development team maintains multiple internal common component libraries for use by various business lines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Component publishing relies on manual JAR file copying to shared directories, chaotic version management&lt;/li&gt;
&lt;li&gt;No formal version numbers and change records, downstream projects don't know which version to use&lt;/li&gt;
&lt;li&gt;Lack of access control, anyone can modify or delete components&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Use AngusRepo's HOSTED repositories to host internal components. Component libraries publish official versions through &lt;code&gt;mvn deploy&lt;/code&gt;, downstream projects reference through standard dependency declarations. Combined with access tokens, only authorized CI/CD pipelines can publish new versions, all operations have audit records.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Centralized Container Image Management
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario:&lt;/strong&gt; A team uses Kubernetes to deploy microservices, needing to manage numerous application images and base images.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Application images pushed to Docker Hub public repositories pose security risks&lt;/li&gt;
&lt;li&gt;Pulling base images from Docker Hub is slow and affected by access restrictions&lt;/li&gt;
&lt;li&gt;Lack of image vulnerability scanning and version management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Use AngusRepo to create Docker HOSTED repositories to host application images, create Docker PROXY repositories to proxy Docker Hub. Combined with AngusSecurity, automatically scan pushed images for vulnerabilities, blocking images with critical vulnerabilities from deploying to production environments.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Artifact Governance Meeting Compliance Requirements
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario:&lt;/strong&gt; A financial enterprise needs to meet regulatory requirements for comprehensive software supply chain audit and management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Requirements:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Record source, publisher, and usage of all artifacts&lt;/li&gt;
&lt;li&gt;Regularly scan dependencies for security vulnerabilities and license compliance&lt;/li&gt;
&lt;li&gt;Generate SBOM (Software Bill of Materials) for compliance reporting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; AngusRepo records all artifact upload, download, delete operations, and integrates with AngusSecurity for vulnerability scanning and license analysis. Automatically generates SBOM documents to meet compliance audit needs. Configure cleanup policies to automatically delete expired versions, reducing storage costs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Team Type Applicability
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Team Type&lt;/th&gt;
&lt;th&gt;Key Benefits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Small to Medium Development Teams (10-50 people)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Quickly build private repositories, simplify dependency management, reduce operational burden&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multi-Language Stack Teams&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unified management of multiple formats, reduce learning and configuration costs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Microservice &amp;amp; Container Teams&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Centrally manage container images and Helm Charts, accelerate deployment processes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Enterprise Development Teams (50+ people)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fine-grained permission control, audit, security scanning, meet compliance requirements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Network-Restricted or Offline Environments&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cache public dependencies, ensure build stability and speed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Quick Start: Configuration Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Maven: Publishing and Pulling Java Artifacts
&lt;/h3&gt;

&lt;p&gt;Below shows how to configure a Maven project to use AngusRepo: developers retrieve dependencies from a unified repository entry, CI/CD publishes build artifacts to hosted repositories.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Create Repositories in AngusRepo&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Repository Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;maven-releases&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HOSTED&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Store internal release versions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;maven-central&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;PROXY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Proxy Maven Central&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;maven-public&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GROUP&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Provide unified dependency pull entry for clients&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Add &lt;code&gt;maven-releases&lt;/code&gt; and &lt;code&gt;maven-central&lt;/code&gt; to &lt;code&gt;maven-public&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Configure Maven Credentials&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Configure publishing credentials in &lt;code&gt;~/.m2/settings.xml&lt;/code&gt;. It's recommended to inject tokens via environment variables, don't commit actual tokens to code repositories:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;settings&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://maven.apache.org/SETTINGS/1.0.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;servers&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;server&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;angusrepo-releases&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;username&amp;gt;&lt;/span&gt;${env.ANGUS_REPO_USERNAME}&lt;span class="nt"&gt;&amp;lt;/username&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;password&amp;gt;&lt;/span&gt;${env.ANGUS_REPO_TOKEN}&lt;span class="nt"&gt;&amp;lt;/password&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/server&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/servers&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/settings&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Configure Project Dependencies and Publishing Target&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Configure in the project's &lt;code&gt;pom.xml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;repositories&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;repository&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;angusrepo-public&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://repo.anguskit.com/maven/maven-public&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/repository&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/repositories&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;distributionManagement&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;repository&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;angusrepo-releases&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://repo.anguskit.com/maven/maven-releases&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/repository&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/distributionManagement&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Publish Artifacts&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mvn deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For more configuration methods, see the &lt;a href="https://www.anguskit.com/en/docs/repo/manual/05-formats/01-maven" rel="noopener noreferrer"&gt;Maven Format Manual&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Docker: Hosting and Pulling Container Images
&lt;/h3&gt;

&lt;p&gt;Configure Docker to use AngusRepo for hosting and pulling container images.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Create Repositories in AngusRepo&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Repository Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker-hosted&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HOSTED&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Store internal application images&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker-hub&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;PROXY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Proxy Docker Hub&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;2. Login to AngusRepo Docker Repository&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker login repo.anguskit.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enter username and access token (generated in AngusRepo user settings).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Push Images to Hosted Repository&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Build image&lt;/span&gt;
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; repo.anguskit.com/docker-hosted/myapp:1.0.0 &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Push image&lt;/span&gt;
docker push repo.anguskit.com/docker-hosted/myapp:1.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Pull Public Images from Proxy Repository&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Pull Docker Hub image (through AngusRepo proxy)&lt;/span&gt;
docker pull repo.anguskit.com/docker-hub/nginx:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5. Use in CI/CD&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# GitLab CI example&lt;/span&gt;
&lt;span class="na"&gt;stages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;build&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;push&lt;/span&gt;

&lt;span class="na"&gt;build-image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;build&lt;/span&gt;
  &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;echo $ANGUS_REPO_TOKEN | docker login -u $ANGUS_REPO_USERNAME --password-stdin repo.anguskit.com&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker push repo.anguskit.com/docker-hosted/myapp:$CI_COMMIT_SHA&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For more configuration methods, see the &lt;a href="https://www.anguskit.com/en/docs/repo/manual/05-formats/02-docker" rel="noopener noreferrer"&gt;Docker Format Manual&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  npm: Managing Frontend Dependencies
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Configure npm to Use AngusRepo&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Set npm registry&lt;/span&gt;
npm config &lt;span class="nb"&gt;set &lt;/span&gt;registry https://repo.anguskit.com/npm/npm-public/

&lt;span class="c"&gt;# Configure authentication token&lt;/span&gt;
npm config &lt;span class="nb"&gt;set&lt;/span&gt; //repo.anguskit.com/npm/:_authToken YOUR_ACCESS_TOKEN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Install Dependencies&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Publish Internal Packages&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm publish &lt;span class="nt"&gt;--registry&lt;/span&gt; https://repo.anguskit.com/npm/npm-releases/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For more format configuration examples, see the &lt;a href="https://www.anguskit.com/en/docs/repo/manual/05-formats" rel="noopener noreferrer"&gt;complete format usage guide&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Frequently Asked Questions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Q: How to generate access tokens?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Login to AngusRepo → User Settings → Access Tokens → Generate New Token. You can specify token permission scope (read-only/read-write) and validity period.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: How do PROXY repositories handle authentication?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the upstream repository requires authentication (such as private Docker Registry), configure upstream credentials when creating the PROXY repository. AngusRepo will automatically use these credentials when requesting upstream.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: How to clean up old artifact versions?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Configure cleanup policies in repository settings to automatically delete artifacts according to these rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep the most recent N versions&lt;/li&gt;
&lt;li&gt;Delete artifacts unused for more than X days&lt;/li&gt;
&lt;li&gt;Delete old versions of specific version patterns (such as SNAPSHOT)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Q: Does it support anonymous access?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. You can enable anonymous reading in repository settings, allowing unauthenticated users to pull artifacts. However, publishing artifacts always requires authentication and authorization.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integration with Development Workflows
&lt;/h2&gt;

&lt;p&gt;AngusRepo can serve as the artifact entry point in build and delivery processes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Development Phase&lt;/strong&gt;: Developers resolve dependencies locally, retrieve public dependencies from PROXY repositories, and internal components from HOSTED repositories&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build Phase&lt;/strong&gt;: CI/CD publishes artifacts to HOSTED repositories after build completion, triggering Webhook notifications to test environments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing Phase&lt;/strong&gt;: Test environments pull corresponding artifact versions from controlled repository addresses for deployment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Release Phase&lt;/strong&gt;: Production environments pull deployments from approved artifact versions, all operations have complete audit records&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Combined with permission management, cleanup policies, audit, and security governance, teams can more easily unify artifact flow patterns and continuously maintain understandable, reusable delivery processes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation Recommendation:&lt;/strong&gt; For teams already using automated pipelines, start with the most commonly used formats like Maven, npm, or Docker, verify basic processes, then gradually expand to other formats based on project and team needs.&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href="https://www.anguskit.com/en/blog/what-is-angusrepo-capabilities-and-formats" rel="noopener noreferrer"&gt;anguskit.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>artifact</category>
      <category>maven</category>
      <category>docker</category>
      <category>npm</category>
    </item>
    <item>
      <title>Replace Harbor, npm Registry, and Nexus with One Repository: AngusRepo vs Nexus vs Artifactory</title>
      <dc:creator>Wen Ping</dc:creator>
      <pubDate>Sat, 10 Oct 2026 09:39:38 +0000</pubDate>
      <link>https://dev.to/wenping/replace-harbor-npm-registry-and-nexus-with-one-repository-angusrepo-vs-nexus-vs-artifactory-1b8e</link>
      <guid>https://dev.to/wenping/replace-harbor-npm-registry-and-nexus-with-one-repository-angusrepo-vs-nexus-vs-artifactory-1b8e</guid>
      <description>&lt;h2&gt;
  
  
  Why repository selection still matters in 2026
&lt;/h2&gt;

&lt;p&gt;Ten years ago, an artifact repository was just "the place where jars live." Today it is the &lt;strong&gt;chokepoint&lt;/strong&gt; of your software supply chain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every dependency enters the company through it (PROXY caching upstreams)&lt;/li&gt;
&lt;li&gt;Every deliverable leaves through it (HOSTED publishing, image distribution)&lt;/li&gt;
&lt;li&gt;The security team sets up checkpoints here (vulnerability scanning, admission blocking)&lt;/li&gt;
&lt;li&gt;Finance reads the bill here (storage cost grows linearly with artifact volume)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The cost of choosing wrong is no longer "inconvenient" — it's &lt;strong&gt;a day slower on vulnerability response, double the storage bill, and a weekend of downtime to migrate away&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This article compares the three mainstream options — Sonatype Nexus Repository, JFrog Artifactory, and AngusRepo — across the six dimensions engineering teams actually care about.&lt;/p&gt;

&lt;h2&gt;
  
  
  The conclusion first: recommendations by team profile
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Team profile&lt;/th&gt;
&lt;th&gt;Recommendation&lt;/th&gt;
&lt;th&gt;Core reason&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Deeply invested in the JFrog ecosystem, ample budget&lt;/td&gt;
&lt;td&gt;Artifactory&lt;/td&gt;
&lt;td&gt;Broadest formats, mature enterprise features, complete ecosystem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Just need basic Maven/npm hosting, security handled by separate team&lt;/td&gt;
&lt;td&gt;Nexus OSS&lt;/td&gt;
&lt;td&gt;Free, abundant community material, simple deployment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Want "repository + supply chain security" in one, open source and self-controlled&lt;/td&gt;
&lt;td&gt;AngusRepo&lt;/td&gt;
&lt;td&gt;Scanning/SBOM/blocking built in natively (GPL-3.0), one platform replaces multiple systems&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Now the details.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core replacement logic: How one repository replaces multiple systems
&lt;/h2&gt;

&lt;p&gt;Traditional enterprise artifact management landscape:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Current architecture&lt;/th&gt;
&lt;th&gt;Operational burden&lt;/th&gt;
&lt;th&gt;Pain points&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Harbor for Docker images&lt;/td&gt;
&lt;td&gt;Separate deployment, backup, permissions&lt;/td&gt;
&lt;td&gt;Images and dependencies siloed, scattered security governance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nexus/Verdaccio for Maven/npm&lt;/td&gt;
&lt;td&gt;Another account system, another storage&lt;/td&gt;
&lt;td&gt;Cross-format dependency tracking difficult&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File server + manual management&lt;/td&gt;
&lt;td&gt;No version control, no permission audit&lt;/td&gt;
&lt;td&gt;Security compliance black hole&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;AngusRepo's replacement approach:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Unified identity &amp;amp; permissions&lt;/strong&gt;: One account system manages access control for all formats&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Unified storage &amp;amp; cleanup&lt;/strong&gt;: Object storage deduplication, cross-format cleanup policies&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Unified scanning &amp;amp; governance&lt;/strong&gt;: Images and dependencies scanned by the same Trivy engine, SBOM exported uniformly&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Unified operations&lt;/strong&gt;: One monitoring stack, one backup, one upgrade window&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Docker format special note:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AngusRepo's Docker repositories support &lt;strong&gt;HOSTED (hosting)&lt;/strong&gt; and &lt;strong&gt;PROXY (proxy)&lt;/strong&gt;, but &lt;strong&gt;not GROUP (aggregation)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;This doesn't affect the ability to "replace Harbor": Harbor doesn't offer GROUP either&lt;/li&gt;
&lt;li&gt;The key difference: AngusRepo can manage images and Maven/npm on the same platform, while Harbor only handles images&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Typical scenario&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Frontend team builds with npm, backend with Maven, test environment deploys with Docker → Configure one AngusRepo instead of Harbor + Nexus + Verdaccio three systems&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Dimension one: format coverage
&lt;/h2&gt;

&lt;p&gt;All three cover the mainstream formats; the differences lie in the long tail and the pricing:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Nexus OSS&lt;/th&gt;
&lt;th&gt;Artifactory&lt;/th&gt;
&lt;th&gt;AngusRepo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Maven / Gradle&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker / OCI&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;npm / yarn / pnpm&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PyPI&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NuGet&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Helm&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go Module&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;APT / YUM&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raw / generic files&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Format support itself is no longer a moat. The real questions: &lt;strong&gt;for a given format, are all three repository types (hosted, remote proxy, aggregation group) supported? Is the group's resolution order controllable?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AngusRepo's GROUP repositories use explicit &lt;strong&gt;first-match priority&lt;/strong&gt;: members resolve in order, and a lower order number wins. Developers configure a single GROUP entry point in their build tool, while the policy behind it — "internal releases first, then snapshots, finally the Central cache" — is centrally controlled by repository admins.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dimension two: security — this is the watershed
&lt;/h2&gt;

&lt;p&gt;The reality of 2026: &lt;strong&gt;an artifact repository without admission gating is an undefended one&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Nexus OSS&lt;/th&gt;
&lt;th&gt;Artifactory&lt;/th&gt;
&lt;th&gt;AngusRepo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Vulnerability scanning&lt;/td&gt;
&lt;td&gt;Paid IQ Server&lt;/td&gt;
&lt;td&gt;Paid Xray&lt;/td&gt;
&lt;td&gt;Built in (Trivy engine)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SBOM generation&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;td&gt;Built in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VEX false-positive management&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;Built in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blocking downloads of critical artifacts&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;td&gt;Built in (autoBlock)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vulnerability intelligence sync&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;td&gt;Built in&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both Nexus and Artifactory keep security behind a paywall in their free/base tiers. AngusRepo's stance: &lt;strong&gt;scanning, SBOM, VEX, and blocking are the repository's core duty, not an upsell&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security capability in action
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario 1: Log4Shell critical vulnerability discovered (CVE-2021-44228)&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Product&lt;/th&gt;
&lt;th&gt;Free version capability&lt;/th&gt;
&lt;th&gt;Response workflow&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Nexus OSS&lt;/td&gt;
&lt;td&gt;❌ Cannot auto-scan&lt;/td&gt;
&lt;td&gt;Manual check of each JAR's pom.xml → Manual notification to developers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artifactory OSS&lt;/td&gt;
&lt;td&gt;❌ Cannot auto-scan&lt;/td&gt;
&lt;td&gt;Same as above&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AngusRepo Community&lt;/td&gt;
&lt;td&gt;✅ Auto-scan and flag&lt;/td&gt;
&lt;td&gt;Scan identifies → SBOM export → autoBlock stops new downloads → Webhook notifies team&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Scenario 2: False positive handling (an internal package incorrectly flagged as critical)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nexus/Artifactory: Need to upgrade to paid tier for VEX functionality&lt;/li&gt;
&lt;li&gt;AngusRepo: Built-in VEX management, mark as false positive and no more alerts or blocking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real cost comparison:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Product&lt;/th&gt;
&lt;th&gt;Annual cost (with security scanning)&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Nexus IQ Server&lt;/td&gt;
&lt;td&gt;~$30,000/year and up (50 applications)&lt;/td&gt;
&lt;td&gt;OSS has no scanning, must purchase IQ Server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JFrog Xray&lt;/td&gt;
&lt;td&gt;~$18,000/year and up&lt;/td&gt;
&lt;td&gt;Artifactory OSS has no scanning, must purchase Xray&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AngusRepo Community&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;GPL-3.0 free to use, scanning/SBOM/blocking built in&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AngusRepo Team&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;$360/year&lt;/strong&gt; ($30/month)&lt;/td&gt;
&lt;td&gt;Adds HA/LDAP/SSO/SLA on top of Community, 200 repositories&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AngusRepo Enterprise&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;$1,440/year&lt;/strong&gt; ($120/month)&lt;/td&gt;
&lt;td&gt;1000 repositories, higher specs and enterprise support&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Cost advantage is clear&lt;/strong&gt;: AngusRepo Team edition is only &lt;strong&gt;1.2%&lt;/strong&gt; of Nexus IQ Server's cost (saves 98.8%), and Enterprise edition is also &lt;strong&gt;95%+&lt;/strong&gt; cheaper than Nexus/Xray, while the Community edition already includes core security capabilities.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: autoBlock is a double-edged sword. Our docs are explicit — finish deploying the scan engine and syncing intelligence, clear false positives via VEX, and only then enable blocking. Don't be the team that blocks everyone on day one.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Dimension three: storage cost
&lt;/h2&gt;

&lt;p&gt;An artifact repository is the textbook "grows forever" system. Three questions determine your bill five years out:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Does it support object storage?&lt;/strong&gt; All three support S3. AngusRepo additionally supports Azure Blob and GCS natively, and is compatible with MinIO/OSS via Path-Style access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is there deduplication?&lt;/strong&gt; Identical content stored once. AngusRepo has a built-in Deduplication switch; Artifactory's checksum-based storage dedupes by design; Nexus OSS has none.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is cleanup actually usable?&lt;/strong&gt; Nexus's Cleanup Policies are scattered and weak on preview — a years-old community complaint. AngusRepo makes cleanup a first-class citizen: four condition types (age / count / size / name regex), a mandatory pre-execution preview including a sample list of what will be deleted, and a Dry Run mode for repeated rehearsal.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Real storage cost comparison
&lt;/h3&gt;

&lt;p&gt;Example from an internet company's real data (1 year accumulated):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Project&lt;/th&gt;
&lt;th&gt;Artifact count&lt;/th&gt;
&lt;th&gt;Before dedup&lt;/th&gt;
&lt;th&gt;After dedup (AngusRepo/Artifactory)&lt;/th&gt;
&lt;th&gt;Nexus OSS (no dedup)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Maven dependencies&lt;/td&gt;
&lt;td&gt;8,500 JARs&lt;/td&gt;
&lt;td&gt;850 GB&lt;/td&gt;
&lt;td&gt;320 GB (-62%)&lt;/td&gt;
&lt;td&gt;850 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker images&lt;/td&gt;
&lt;td&gt;1,200&lt;/td&gt;
&lt;td&gt;2.4 TB&lt;/td&gt;
&lt;td&gt;1.1 TB (-54%)&lt;/td&gt;
&lt;td&gt;2.4 TB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;npm packages&lt;/td&gt;
&lt;td&gt;6,000&lt;/td&gt;
&lt;td&gt;120 GB&lt;/td&gt;
&lt;td&gt;65 GB (-46%)&lt;/td&gt;
&lt;td&gt;120 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.37 TB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.49 TB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.37 TB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At $0.023/GB/month for object storage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nexus OSS: $933/year&lt;/li&gt;
&lt;li&gt;AngusRepo/Artifactory: &lt;strong&gt;$412/year&lt;/strong&gt; (56% savings)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Cost note&lt;/strong&gt;: This only calculates storage cost. For security scanning, Nexus requires additional IQ Server purchase (~$30k/year), while AngusRepo Community edition has built-in scanning at no extra cost; commercial editions also have significantly lower annual fees than Nexus IQ + Artifactory Xray combinations.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Dimension four: operational burden
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Nexus OSS&lt;/th&gt;
&lt;th&gt;Artifactory&lt;/th&gt;
&lt;th&gt;AngusRepo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Deployment shape&lt;/td&gt;
&lt;td&gt;Java monolith&lt;/td&gt;
&lt;td&gt;Multiple services&lt;/td&gt;
&lt;td&gt;Java 21 monolith + full-stack Docker Compose&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource footprint&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Upgrade complexity&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;High (aligning multi-component versions)&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Built-in monitoring&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;Comprehensive&lt;/td&gt;
&lt;td&gt;System status + metrics API, pluggable into external monitoring&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;AngusRepo ships a ready-to-run Compose stack (nginx + MySQL + app) — one command brings up everything, a good fit for mid-size engineering orgs without a dedicated platform team. &lt;strong&gt;The interface uses a modern React tech stack&lt;/strong&gt;, with repository details pages featuring built-in access configuration and one-click copy, reducing the team's learning curve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dimension five: permission model
&lt;/h2&gt;

&lt;p&gt;All three support repository-level ACLs. The difference is how smoothly they integrate with the enterprise directory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AngusRepo's authorization subjects are three-tiered — &lt;strong&gt;user / group / department&lt;/strong&gt; — with permissions inherited automatically along the org structure (indirect authorization), plus four repository roles: Admin / Delete / Write / Read.&lt;/li&gt;
&lt;li&gt;CI uses &lt;strong&gt;access tokens&lt;/strong&gt; uniformly: clients put the token in the Basic Auth password field, and tokens can be revoked individually — no more "one password to rule them all."&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Dimension six: openness and ecosystem
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Webhooks&lt;/strong&gt;: AngusRepo offers 7 event types (upload / download / delete / scan complete / vulnerability found / repository created / deleted) for driving external scan queues, deployment gates, and IM notifications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public Portal&lt;/strong&gt;: AngusRepo ships an anonymous read-only portal (&lt;code&gt;/explore&lt;/code&gt;) where the community or your intranet can search public artifacts, browse them, and copy install commands — a shape neither Nexus nor Artifactory offers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API&lt;/strong&gt;: full REST API with OpenAPI specs for custom development.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Dimension seven: licensing and business model
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Product&lt;/th&gt;
&lt;th&gt;Community/Open Source edition&lt;/th&gt;
&lt;th&gt;Commercial edition&lt;/th&gt;
&lt;th&gt;Key differences&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Nexus&lt;/td&gt;
&lt;td&gt;OSS edition (Eclipse Public License 1.0)&lt;/td&gt;
&lt;td&gt;Pro edition&lt;/td&gt;
&lt;td&gt;Security scanning, LDAP, HA in Pro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artifactory&lt;/td&gt;
&lt;td&gt;No true open source edition&lt;/td&gt;
&lt;td&gt;OSS/Pro/Enterprise&lt;/td&gt;
&lt;td&gt;OSS is only free, source code not open&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AngusRepo&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Community edition (GPL-3.0)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Team/Enterprise editions&lt;/td&gt;
&lt;td&gt;Scanning/SBOM/blocking in Community, commercial adds HA/LDAP/SLA&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  What does AngusRepo's GPL-3.0 mean?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Free to use, modify, and distribute&lt;/strong&gt;: No license purchase needed for production deployment&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Source code fully open&lt;/strong&gt;: Can audit code, customize features, contribute to community&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Core capabilities not crippled&lt;/strong&gt;: Scanning, SBOM, VEX, blocking all in Community edition, unlike Nexus keeping security behind paywall&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;Modified versions must be open&lt;/strong&gt;: If you modify and distribute AngusRepo, must share source under GPL-3.0&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  When do you need to upgrade to commercial editions?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Need high availability deployment (active-standby/multi-active architecture)&lt;/li&gt;
&lt;li&gt;Need enterprise-grade LDAP/SSO integration&lt;/li&gt;
&lt;li&gt;Need 7×24 technical support with SLA guarantees&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Commercial edition pricing reference
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Team edition&lt;/strong&gt;: $360/year ($30/month) - 50 users, 200 repositories, basic HA, standard SLA&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise edition&lt;/strong&gt;: $1,440/year ($120/month) - 200 users, 1000 repositories, enterprise SLA&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise Custom&lt;/strong&gt;: Contact sales - large scale, multi-node, customized support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cost advantage&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;vs. Nexus IQ Server ($30k/year+), saves &lt;strong&gt;98.8%&lt;/strong&gt; (Team) / &lt;strong&gt;95.2%&lt;/strong&gt; (Enterprise)&lt;/li&gt;
&lt;li&gt;vs. JFrog Xray ($18k/year+), saves &lt;strong&gt;98%&lt;/strong&gt; (Team) / &lt;strong&gt;92%&lt;/strong&gt; (Enterprise)&lt;/li&gt;
&lt;li&gt;Community edition GPL-3.0 free to use, core security capabilities built in&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Recommended path: Start with Community edition to verify the replacement approach (setup, format access, scanning tests), then evaluate commercial features only after confirming it meets your needs → &lt;a href="https://www.anguskit.com/en/pricing" rel="noopener noreferrer"&gt;View complete pricing&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q1: Can AngusRepo fully replace Harbor?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: Core image hosting, proxying, and vulnerability scanning can all be replaced. Harbor features such as project-level permissions, image replication, and Robot Accounts have equivalents in AngusRepo through department-level permissions, access tokens, and the API. The important difference: AngusRepo can manage images and Maven/npm on the same platform, while Harbor only manages images.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q2: Why don't Docker repositories support GROUP?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: This is a limit of the Docker Registry V2 protocol. Harbor and Nexus Docker repositories do not support GROUP either. In practice a PROXY repository covers most needs, including proxying public registries such as Docker Hub.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q3: Is the Community edition enough? When do you need a commercial edition?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: Scanning, SBOM, blocking, and cleanup are all in the Community edition. Consider a commercial edition when you need high availability (HA), enterprise LDAP/SSO, or 7×24 support.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q4: How do you choose between a cloud vendor's artifact service and self-hosting?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: Cloud services bill by traffic; self-hosting bills by storage. When artifacts are large but accessed infrequently, self-hosting costs less. Privatization and cross-border delivery usually require self-hosting. See &lt;a href="https://www.anguskit.com/en/blog/repo/cloud-vs-self-hosted-artifact-repo" rel="noopener noreferrer"&gt;Choosing among Alibaba Cloud, Huawei SWR, and a self-hosted repository&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Format coverage is commoditized; &lt;strong&gt;security capability and storage cost&lt;/strong&gt; are the real watershed in 2026.&lt;/li&gt;
&lt;li&gt;If your security budget can't cover IQ Server / Xray subscriptions and you refuse to run undefended, AngusRepo ships scanning, SBOM, and blocking as built-in repository capabilities, so you don't buy a separate security subscription.&lt;/li&gt;
&lt;li&gt;Whatever you choose, run a two-week PoC with real traffic: import your three largest projects, run one full scan, rehearse one cleanup. The numbers will speak for themselves.&lt;/li&gt;
&lt;/ul&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;About this comparison&lt;/strong&gt;: This comparison is based on each product's public documentation as of this post's publication date, together with our own hands-on notes. It does not represent any vendor's official position. Capabilities and pricing change over time, so verify against official documentation and quotes before you decide; trademarks belong to their respective owners. This is an independent reading by the Angus team and is not procurement advice.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Originally published at &lt;a href="https://www.anguskit.com/en/blog/repo-selection-2026" rel="noopener noreferrer"&gt;anguskit.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>comparison</category>
      <category>nexus</category>
      <category>artifactory</category>
      <category>harbor</category>
    </item>
    <item>
      <title>Connect 10 formats to one artifact service: Maven, Docker, npm, PyPI, and Helm</title>
      <dc:creator>Wen Ping</dc:creator>
      <pubDate>Sat, 10 Oct 2026 09:30:41 +0000</pubDate>
      <link>https://dev.to/wenping/connect-10-formats-to-one-artifact-service-maven-docker-npm-pypi-and-helm-3944</link>
      <guid>https://dev.to/wenping/connect-10-formats-to-one-artifact-service-maven-docker-npm-pypi-and-helm-3944</guid>
      <description>&lt;p&gt;A team often runs Java, frontend, Python, .NET, and containers at the same time. Instead of keeping a separate private registry for each stack, manage the artifacts in one AngusRepo service.&lt;/p&gt;

&lt;p&gt;This guide covers Maven, Docker, npm, PyPI, NuGet, Helm, Go, APT, YUM, and Raw. For each format you do three things: authenticate, publish one artifact, then pull it back to verify.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A common mix-up:&lt;/strong&gt; “one artifact service” means one AngusRepo deployment, not one repository that accepts every format. Create a &lt;strong&gt;HOSTED&lt;/strong&gt; repository for each format, such as &lt;code&gt;maven-releases&lt;/code&gt; or &lt;code&gt;docker-releases&lt;/code&gt;. Repository names and hostnames below are examples. Use the &lt;strong&gt;Setup&lt;/strong&gt; tab on the repository detail page.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F55bronplvmhkr25zl7fq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F55bronplvmhkr25zl7fq.png" alt="AngusRepo artifact workflow" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Three minutes of setup
&lt;/h2&gt;

&lt;p&gt;If you use only one stack, read only that section. The first time, verify in the order publish → pull. A successful upload does not prove the client can download.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Account, token, and repository
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sign in&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open the &lt;a href="https://repo.anguskit.com" rel="noopener noreferrer"&gt;AngusRepo console&lt;/a&gt;. On a self-hosted instance, use the console URL from your administrator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a token&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to &lt;strong&gt;User Settings → My Tokens&lt;/strong&gt; and create a token, for example &lt;code&gt;local-macbook&lt;/code&gt;. The token is shown only once. Save it immediately. If you lose it, revoke it and create another.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a HOSTED repository&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Under &lt;strong&gt;Repositories&lt;/strong&gt;, create a &lt;strong&gt;HOSTED&lt;/strong&gt; repository for the format you need, and confirm your account can upload to it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Copy the setup values&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open the repository &lt;strong&gt;Setup&lt;/strong&gt; tab. Use the repository name, URL, distribution, and component shown there.&lt;/p&gt;

&lt;p&gt;Put the login name and token in environment variables for the commands below. &lt;code&gt;export&lt;/code&gt; lasts only for the current terminal, so keep running commands in that same window.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;REPO_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your-username"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;REPO_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your_access_token"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;REPO_USER&lt;/code&gt; is the login name, not the token name. For Maven, Docker, npm, NuGet, and the other protocols, the token is the password. Every &lt;code&gt;--password&lt;/code&gt;, &lt;code&gt;--api-key&lt;/code&gt;, and &lt;code&gt;_authToken&lt;/code&gt; in this guide takes &lt;code&gt;REPO_TOKEN&lt;/code&gt;, not your login password.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Security:&lt;/strong&gt; A token written into a URL lands in shell history or local config. Use these examples only on a machine you control. On a shared machine or in CI, use a secret store, and remove the temporary config after you verify.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. Address cheat sheet
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Pull address or identifier&lt;/th&gt;
&lt;th&gt;Publish&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Maven&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://host/maven/&amp;lt;repo&amp;gt;/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Same URL, &lt;code&gt;mvn deploy&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker&lt;/td&gt;
&lt;td&gt;&lt;code&gt;host/&amp;lt;repo&amp;gt;/&amp;lt;image&amp;gt;:&amp;lt;tag&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Same image name, &lt;code&gt;docker push&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;npm&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://host/npm/&amp;lt;repo&amp;gt;/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm publish&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PyPI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/pypi/&amp;lt;repo&amp;gt;/simple/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/pypi/&amp;lt;repo&amp;gt;/legacy/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NuGet&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/nuget/&amp;lt;repo&amp;gt;/v3/index.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Same source, &lt;code&gt;--api-key&lt;/code&gt; is the token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Helm&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/helm/&amp;lt;repo&amp;gt;/&lt;/code&gt; or &lt;code&gt;oci://host/helm/&amp;lt;repo&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;HTTP upload or &lt;code&gt;helm push&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/go/&amp;lt;repo&amp;gt;/&lt;/code&gt;, set &lt;code&gt;GOPROXY&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Console or management API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;APT&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/apt/&amp;lt;repo&amp;gt;/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Upload to &lt;code&gt;pool/&amp;lt;filename&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;YUM&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/yum/&amp;lt;repo&amp;gt;/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST .../upload&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raw&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/raw/&amp;lt;repo&amp;gt;/&amp;lt;path&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Same path, &lt;code&gt;curl -T&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The rest of this guide uses &lt;code&gt;repo.anguskit.com&lt;/code&gt; as the host. On a self-hosted instance, replace it with your address.&lt;/p&gt;

&lt;h2&gt;
  
  
  Maven
&lt;/h2&gt;

&lt;p&gt;Run these commands from a project root that already has a &lt;code&gt;pom.xml&lt;/code&gt;. The repository &lt;code&gt;id&lt;/code&gt; in &lt;code&gt;settings.xml&lt;/code&gt; and &lt;code&gt;pom.xml&lt;/code&gt; must match exactly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Authenticate
&lt;/h3&gt;

&lt;p&gt;Save the following as &lt;code&gt;settings.xml&lt;/code&gt; in the project root. If you already have &lt;code&gt;~/.m2/settings.xml&lt;/code&gt;, merge the &lt;code&gt;&amp;lt;server&amp;gt;&lt;/code&gt; block into it. Do not overwrite the existing file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;settings&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;servers&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;server&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;angusrepo-maven-releases&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;username&amp;gt;&lt;/span&gt;${env.REPO_USER}&lt;span class="nt"&gt;&amp;lt;/username&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;password&amp;gt;&lt;/span&gt;${env.REPO_TOKEN}&lt;span class="nt"&gt;&amp;lt;/password&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/server&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/servers&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/settings&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Publish
&lt;/h3&gt;

&lt;p&gt;Add the publish URL to &lt;code&gt;pom.xml&lt;/code&gt;, then deploy. A successful run logs &lt;code&gt;BUILD SUCCESS&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;distributionManagement&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;repository&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;angusrepo-maven-releases&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://repo.anguskit.com/maven/maven-releases&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/repository&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/distributionManagement&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mvn &lt;span class="nt"&gt;-s&lt;/span&gt; settings.xml clean deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verify the pull
&lt;/h3&gt;

&lt;p&gt;Add the same repository to another project, then request the &lt;code&gt;groupId&lt;/code&gt;, &lt;code&gt;artifactId&lt;/code&gt;, and &lt;code&gt;version&lt;/code&gt; you just published.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;repositories&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;repository&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;angusrepo-maven-releases&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://repo.anguskit.com/maven/maven-releases&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/repository&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/repositories&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mvn &lt;span class="nt"&gt;-s&lt;/span&gt; settings.xml dependency:get &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-Dartifact&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yourGroupId:yourArtifactId:yourVersion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Docker
&lt;/h2&gt;

&lt;p&gt;Run this from a directory that contains a &lt;code&gt;Dockerfile&lt;/code&gt;. The image name is &lt;code&gt;host/repo/image:tag&lt;/code&gt;. Do not insert &lt;code&gt;/v2&lt;/code&gt; yourself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Authenticate
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | docker login repo.anguskit.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO_USER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--password-stdin&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Continue after you see &lt;code&gt;Login Succeeded&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Publish
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; myapp:1.0.0 &lt;span class="nb"&gt;.&lt;/span&gt;
docker tag myapp:1.0.0 repo.anguskit.com/docker-releases/myapp:1.0.0
docker push repo.anguskit.com/docker-releases/myapp:1.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verify the pull
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull repo.anguskit.com/docker-releases/myapp:1.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  npm
&lt;/h2&gt;

&lt;p&gt;Run this from a directory that contains &lt;code&gt;package.json&lt;/code&gt;. Keep the trailing &lt;code&gt;/&lt;/code&gt; on the registry URL, and leave &lt;code&gt;${NPM_TOKEN}&lt;/code&gt; unchanged in &lt;code&gt;.npmrc&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Authenticate
&lt;/h3&gt;

&lt;p&gt;Create or update &lt;code&gt;.npmrc&lt;/code&gt; in the project root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="py"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;https://repo.anguskit.com/npm/npm-releases/&lt;/span&gt;
&lt;span class="err"&gt;//repo.anguskit.com/npm/npm-releases/:&lt;/span&gt;&lt;span class="py"&gt;_authToken&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;${NPM_TOKEN}&lt;/span&gt;
&lt;span class="py"&gt;always-auth&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, in the same terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;NPM_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Publish
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;name&lt;/code&gt; and &lt;code&gt;version&lt;/code&gt; in &lt;code&gt;package.json&lt;/code&gt; are the package you publish. If that version already exists, bump &lt;code&gt;version&lt;/code&gt; first.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm publish
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verify the pull
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;your-package
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For an &lt;code&gt;@scope&lt;/code&gt; package, also add this to &lt;code&gt;.npmrc&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="err"&gt;@scope:&lt;/span&gt;&lt;span class="py"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;https://repo.anguskit.com/npm/npm-releases/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  PyPI
&lt;/h2&gt;

&lt;p&gt;Run this from a directory that contains &lt;code&gt;pyproject.toml&lt;/code&gt;. Upload to &lt;code&gt;/legacy/&lt;/code&gt; and install from &lt;code&gt;/simple/&lt;/code&gt;. The package name is &lt;code&gt;name&lt;/code&gt; in &lt;code&gt;pyproject.toml&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prepare the environment
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install &lt;/span&gt;build twine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Publish
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;dist/&lt;/code&gt; is created by the build. You do not create it by hand.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; build
twine upload &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--repository-url&lt;/span&gt; https://repo.anguskit.com/pypi/pypi-releases/legacy/ &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO_USER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; dist/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verify the pull
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;your-package &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--index-url&lt;/span&gt; &lt;span class="s2"&gt;"https://&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO_USER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO_TOKEN&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;@repo.anguskit.com/pypi/pypi-releases/simple/"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  NuGet
&lt;/h2&gt;

&lt;p&gt;Run this from a directory that contains a &lt;code&gt;.csproj&lt;/code&gt;. The NuGet source URL must end with &lt;code&gt;/v3/index.json&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Authenticate
&lt;/h3&gt;

&lt;p&gt;This command stores the credentials in the local NuGet config.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet nuget add &lt;span class="nb"&gt;source &lt;/span&gt;https://repo.anguskit.com/nuget/nuget-releases/v3/index.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; angusrepo &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--username&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO_USER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--password&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--store-rest-token&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Publish
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet pack &lt;span class="nt"&gt;-c&lt;/span&gt; Release
dotnet nuget push bin/Release/Your.Package.1.0.0.nupkg &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--source&lt;/span&gt; https://repo.anguskit.com/nuget/nuget-releases/v3/index.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--api-key&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the &lt;code&gt;.nupkg&lt;/code&gt; file name that &lt;code&gt;dotnet pack&lt;/code&gt; actually printed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verify the pull
&lt;/h3&gt;

&lt;p&gt;Run this in another existing project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet add package Your.Package &lt;span class="nt"&gt;--version&lt;/span&gt; 1.0.0 &lt;span class="nt"&gt;--source&lt;/span&gt; angusrepo
dotnet restore
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Helm
&lt;/h2&gt;

&lt;p&gt;Helm speaks HTTP and OCI. Pick the one shown on the repository &lt;strong&gt;Setup&lt;/strong&gt; tab: &lt;code&gt;helm repo add&lt;/code&gt; means HTTP, &lt;code&gt;oci://&lt;/code&gt; means OCI. Do not mix the two flows. The current directory should contain a chart with &lt;code&gt;Chart.yaml&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  HTTP
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm repo add angusrepo https://repo.anguskit.com/helm/helm-releases &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--username&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO_USER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--password&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

helm package ./mychart
curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO_USER&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$REPO_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"chart=@mychart-1.0.0.tgz"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://repo.anguskit.com/helm/helm-releases/api/charts"&lt;/span&gt;

helm repo update
helm &lt;span class="nb"&gt;install &lt;/span&gt;my-release angusrepo/mychart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;mychart-1.0.0.tgz&lt;/code&gt; with the file name &lt;code&gt;helm package&lt;/code&gt; printed.&lt;/p&gt;

&lt;h3&gt;
  
  
  OCI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | helm registry login repo.anguskit.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO_USER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--password-stdin&lt;/span&gt;

helm package ./mychart
helm push mychart-1.0.0.tgz oci://repo.anguskit.com/helm/helm-releases
helm &lt;span class="nb"&gt;install &lt;/span&gt;my-release oci://repo.anguskit.com/helm/helm-releases/mychart &lt;span class="nt"&gt;--version&lt;/span&gt; 1.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Go
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;go get&lt;/code&gt; only downloads modules. Upload from the console or the management API. Do not send the upload to &lt;code&gt;repo.anguskit.com/api&lt;/code&gt;. The module path comes from &lt;code&gt;go.mod&lt;/code&gt;, and the version must start with &lt;code&gt;v&lt;/code&gt;, for example &lt;code&gt;v1.0.0&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configure the pull
&lt;/h3&gt;

&lt;p&gt;A private module needs &lt;code&gt;GOPROXY&lt;/code&gt; and the module domain. Replace &lt;code&gt;GONOSUMDB&lt;/code&gt; with your module domain, or checksum verification can fail.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GOPROXY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO_USER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO_TOKEN&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;@repo.anguskit.com/go/go-releases"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GONOSUMDB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Publish
&lt;/h3&gt;

&lt;p&gt;Run this from the module root. The top directory inside the zip must be &lt;code&gt;module-path@version/&lt;/code&gt; and must contain &lt;code&gt;go.mod&lt;/code&gt;. The cloud API base is below. On a self-hosted instance, ask your administrator for the management API base.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;API_BASE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://bj-c1-prod-apis.anguskit.com/repo"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;MODULE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;go list &lt;span class="nt"&gt;-m&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"v1.0.0"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PREFIX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MODULE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;@&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;STAGE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;mktemp&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;STAGE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PREFIX&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;cp &lt;/span&gt;go.mod &lt;span class="k"&gt;*&lt;/span&gt;.go &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;STAGE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PREFIX&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/"&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;STAGE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; zip &lt;span class="nt"&gt;-qr&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;OLDPWD&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/module-&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.zip"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PREFIX&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;STAGE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO_USER&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$REPO_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"repositoryName=go-releases"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"version=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"modulePath=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MODULE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"zip=@./module-&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.zip"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$API_BASE&lt;/span&gt;&lt;span class="s2"&gt;/api/v1/go/upload"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also open that Go repository and upload the zip from the upload page.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verify the pull
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go get example.com/go-demo@v1.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  APT
&lt;/h2&gt;

&lt;p&gt;Start from a &lt;code&gt;.deb&lt;/code&gt; you have already built. Install by the package name inside the archive, not by the &lt;code&gt;.deb&lt;/code&gt; file name. &lt;code&gt;stable&lt;/code&gt; and &lt;code&gt;main&lt;/code&gt; must match the repository distribution and component. If &lt;strong&gt;Setup&lt;/strong&gt; shows different values, use those.&lt;/p&gt;

&lt;h3&gt;
  
  
  Publish
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO_USER&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$REPO_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-T&lt;/span&gt; ./my-package_1.0.0_amd64.deb &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://repo.anguskit.com/apt/apt-releases/pool/my-package_1.0.0_amd64.deb"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verify the pull
&lt;/h3&gt;

&lt;p&gt;The index can take a few seconds after upload. Replace &lt;code&gt;my-package&lt;/code&gt; with the package name inside the deb:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deb [trusted=yes] https://&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO_USER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO_TOKEN&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;@repo.anguskit.com/apt/apt-releases stable main"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/angusrepo.list
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;my-package
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  YUM
&lt;/h2&gt;

&lt;p&gt;Start from an &lt;code&gt;.rpm&lt;/code&gt; you have already built. Install by the RPM package name, not by the file name.&lt;/p&gt;

&lt;h3&gt;
  
  
  Publish
&lt;/h3&gt;

&lt;p&gt;The upload must use the form field &lt;code&gt;file&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO_USER&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$REPO_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"file=@./my-package-1.0.0-1.noarch.rpm"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://repo.anguskit.com/yum/yum-releases/upload"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verify the pull
&lt;/h3&gt;

&lt;p&gt;The command below writes &lt;code&gt;/etc/yum.repos.d/angusrepo.repo&lt;/code&gt;. If the package is missing right after upload, wait and try again.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/yum.repos.d/angusrepo.repo &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
[angusrepo]
name=AngusRepo YUM
baseurl=https://&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO_USER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;:&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO_TOKEN&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;@repo.anguskit.com/yum/yum-releases/
enabled=1
gpgcheck=0
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf clean all &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;my-package
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Raw
&lt;/h2&gt;

&lt;p&gt;A Raw repository stores files that do not belong to a package format. Pick a clear path, such as &lt;code&gt;project/version/filename&lt;/code&gt;. Upload and download must use the same URL.&lt;/p&gt;

&lt;h3&gt;
  
  
  Publish
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO_USER&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$REPO_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-T&lt;/span&gt; ./my-app-1.0.0-linux-amd64.tar.gz &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://repo.anguskit.com/raw/raw-releases/my-app/1.0.0/my-app-1.0.0-linux-amd64.tar.gz"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uploading to the same path again overwrites the file.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verify the pull
&lt;/h3&gt;

&lt;p&gt;Download from another directory so the file does not collide with the local source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /tmp/raw-check &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; /tmp/raw-check
curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO_USER&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$REPO_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-O&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://repo.anguskit.com/raw/raw-releases/my-app/1.0.0/my-app-1.0.0-linux-amd64.tar.gz"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you see&lt;/th&gt;
&lt;th&gt;Check first&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Publish returns 403&lt;/td&gt;
&lt;td&gt;The account behind the token has write access to that repository.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker push fails&lt;/td&gt;
&lt;td&gt;The image name must not contain &lt;code&gt;/v2&lt;/code&gt;. &lt;code&gt;docker build&lt;/code&gt; must succeed locally first.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;npm returns 401 or 404&lt;/td&gt;
&lt;td&gt;The registry URL and the &lt;code&gt;_authToken&lt;/code&gt; path match, including the trailing &lt;code&gt;/&lt;/code&gt;. &lt;code&gt;NPM_TOKEN&lt;/code&gt; is set.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PyPI upload or install fails&lt;/td&gt;
&lt;td&gt;Upload goes to &lt;code&gt;/legacy/&lt;/code&gt;, install uses &lt;code&gt;/simple/&lt;/code&gt;. Run &lt;code&gt;python3 -m build&lt;/code&gt; first.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NuGet restore fails&lt;/td&gt;
&lt;td&gt;The source URL ends with &lt;code&gt;/v3/index.json&lt;/code&gt;, and the local credential store has the right token.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Helm returns 401&lt;/td&gt;
&lt;td&gt;Do not mix the HTTP and OCI flows. Run &lt;code&gt;helm registry login&lt;/code&gt; before an OCI push.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;APT or YUM cannot find a package you just uploaded&lt;/td&gt;
&lt;td&gt;Wait for the index, then refresh the cache. Install by the name inside the package, not the file name.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go upload fails&lt;/td&gt;
&lt;td&gt;The top directory in the zip is &lt;code&gt;module-path@version/&lt;/code&gt;, and the upload URL is the management API.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How authentication works
&lt;/h2&gt;

&lt;p&gt;Protocol paths such as &lt;code&gt;/maven/&lt;/code&gt;, &lt;code&gt;/npm/&lt;/code&gt;, and &lt;code&gt;/v2/&lt;/code&gt; use Basic Auth: the username is the login name, and the password is the access token. The management REST API uses a Bearer token where the API reference says so. If authentication fails, check that you did not swap the two.&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href="https://www.anguskit.com/en/blog/one-repo-ten-formats" rel="noopener noreferrer"&gt;anguskit.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>docker</category>
      <category>softwaredevelopment</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
