<?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: Jessé Cruz</title>
    <description>The latest articles on DEV Community by Jessé Cruz (@ojessecruz).</description>
    <link>https://dev.to/ojessecruz</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%2F1184435%2F77219525-3b60-46b0-90f3-3274a892df6d.jpg</url>
      <title>DEV Community: Jessé Cruz</title>
      <link>https://dev.to/ojessecruz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ojessecruz"/>
    <language>en</language>
    <item>
      <title>how i run a private package registry on infrastructure i control</title>
      <dc:creator>Jessé Cruz</dc:creator>
      <pubDate>Sun, 20 Sep 2026 18:12:08 +0000</pubDate>
      <link>https://dev.to/ojessecruz/how-i-run-a-private-package-registry-on-infrastructure-i-control-43ab</link>
      <guid>https://dev.to/ojessecruz/how-i-run-a-private-package-registry-on-infrastructure-i-control-43ab</guid>
      <description>&lt;p&gt;i want private packages to live on infrastructure i can operate.&lt;/p&gt;

&lt;p&gt;i want to know where the service runs, where the artifacts are stored, and how it is backed up.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://omniline.app" rel="noopener noreferrer"&gt;omni line&lt;/a&gt; is self-hosted, so i can run it with docker compose, ansible, or helm.&lt;/p&gt;

&lt;p&gt;for a first deployment, i use docker compose.&lt;/p&gt;

&lt;p&gt;the installer sets up the compose assets, writes the environment configuration, and starts postgres, the server, and the client.&lt;/p&gt;

&lt;p&gt;for a remote host, i set the public URL during installation.&lt;/p&gt;

&lt;p&gt;for production, i put tls at the edge and set the public server and frontend URLs to the HTTPS origin.&lt;/p&gt;

&lt;p&gt;i start with the default local storage when i am evaluating the service.&lt;/p&gt;

&lt;p&gt;when i need object storage, omni line supports an s3 compatible storage configuration.&lt;/p&gt;

&lt;p&gt;when i need a separate database service, the compose deployment can use an external postgres instance.&lt;/p&gt;

&lt;p&gt;those choices do not change the package manager workflow.&lt;/p&gt;

&lt;p&gt;they change how i operate the registry.&lt;/p&gt;

&lt;p&gt;i also plan backups as part of the deployment.&lt;/p&gt;

&lt;p&gt;that means backing up postgres and the artifact storage.&lt;/p&gt;

&lt;p&gt;if artifacts are stored in an s3 compatible bucket, i back up the bucket.&lt;/p&gt;

&lt;p&gt;if they are stored on a local volume, i include that volume in the recovery plan.&lt;/p&gt;

&lt;p&gt;i do not expose postgres on the host just because it is part of the stack.&lt;/p&gt;

&lt;p&gt;i keep the registry behind TLS.&lt;/p&gt;

&lt;p&gt;i keep the installation URL consistent with the URL developers use.&lt;/p&gt;

&lt;p&gt;this matters because the browser, management API, and package clients all depend on the same public origin.&lt;/p&gt;

&lt;p&gt;self-hosting does not remove operational work.&lt;/p&gt;

&lt;p&gt;it gives me a clear place to do it.&lt;/p&gt;

&lt;p&gt;i operate one package service instead of a different product for every ecosystem.&lt;/p&gt;

&lt;p&gt;then developers, ci, and agents keep using the package tools they already know.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>docker</category>
      <category>infrastructure</category>
    </item>
    <item>
      <title>how i give agents a safe path to publish internal packages</title>
      <dc:creator>Jessé Cruz</dc:creator>
      <pubDate>Sun, 20 Sep 2026 18:10:32 +0000</pubDate>
      <link>https://dev.to/ojessecruz/how-i-give-agents-a-safe-path-to-publish-internal-packages-4bo4</link>
      <guid>https://dev.to/ojessecruz/how-i-give-agents-a-safe-path-to-publish-internal-packages-4bo4</guid>
      <description>&lt;p&gt;i do not think an agent should receive broad publishing access by default.&lt;/p&gt;

&lt;p&gt;publishing changes the package supply chain.&lt;/p&gt;

&lt;p&gt;it deserves an explicit path.&lt;/p&gt;

&lt;p&gt;that does not mean agents cannot help with releases.&lt;/p&gt;

&lt;p&gt;it means the permissions should match the work.&lt;/p&gt;

&lt;p&gt;with &lt;a href="https://omniline.app" rel="noopener noreferrer"&gt;omni line&lt;/a&gt;, i use personal access tokens for package manager traffic.&lt;/p&gt;

&lt;p&gt;i can give an agent registry:read when it needs to install internal dependencies, inspect a package, or prepare a change.&lt;/p&gt;

&lt;p&gt;i only use registry:write for a workflow that is intended to publish.&lt;/p&gt;

&lt;p&gt;i keep that publishing token separate from ordinary read access.&lt;/p&gt;

&lt;p&gt;the token itself is not the only safeguard.&lt;/p&gt;

&lt;p&gt;omni line intersects its scopes with the user’s role in the organization.&lt;/p&gt;

&lt;p&gt;that keeps an agent from gaining more registry permission than the underlying role permits.&lt;/p&gt;

&lt;p&gt;i also make the task explicit.&lt;/p&gt;

&lt;p&gt;i can ask an agent to update a version, run tests, build the package, and prepare a release.&lt;/p&gt;

&lt;p&gt;i can ask it to publish only when publishing is the requested action.&lt;/p&gt;

&lt;p&gt;i do not make publish an implied final step.&lt;/p&gt;

&lt;p&gt;this matters when the project has automation across developer machines, ci runners, and agents.&lt;/p&gt;

&lt;p&gt;they can all use the same npm registry URL.&lt;/p&gt;

&lt;p&gt;they can all use familiar npm commands.&lt;/p&gt;

&lt;p&gt;their tokens can still represent different responsibilities.&lt;/p&gt;

&lt;p&gt;i can revoke a dedicated workflow token when the automation changes.&lt;/p&gt;

&lt;p&gt;i can create a new one with a narrower scope when the task changes.&lt;/p&gt;

&lt;p&gt;i can keep the complete token out of the repository because it is only shown once at creation.&lt;/p&gt;

&lt;p&gt;that is the publishing model i want for agents.&lt;/p&gt;

&lt;p&gt;the agent can do real release work.&lt;/p&gt;

&lt;p&gt;the team can still decide what it is allowed to publish and when.&lt;/p&gt;

&lt;p&gt;automation gets a path forward.&lt;/p&gt;

&lt;p&gt;human ownership of package access remains clear.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>automation</category>
      <category>devops</category>
      <category>security</category>
    </item>
    <item>
      <title>how i give coding agents access to private packages without sharing credentials everywhere</title>
      <dc:creator>Jessé Cruz</dc:creator>
      <pubDate>Mon, 07 Sep 2026 12:06:29 +0000</pubDate>
      <link>https://dev.to/ojessecruz/how-i-give-coding-agents-access-to-private-packages-without-sharing-credentials-everywhere-11kf</link>
      <guid>https://dev.to/ojessecruz/how-i-give-coding-agents-access-to-private-packages-without-sharing-credentials-everywhere-11kf</guid>
      <description>&lt;p&gt;i want agents to use the same private packages as the rest of the team.&lt;/p&gt;

&lt;p&gt;i do not want to share my personal token with them.&lt;/p&gt;

&lt;p&gt;i also do not want to keep npm tokens inside every repository.&lt;/p&gt;

&lt;p&gt;with &lt;a href="https://omniline.app" rel="noopener noreferrer"&gt;omni line&lt;/a&gt;, i create a separate personal access token for each workflow.&lt;/p&gt;

&lt;p&gt;an agent that only installs packages gets &lt;code&gt;registry:read&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;a release workflow that publishes packages gets &lt;code&gt;registry:read&lt;/code&gt; and &lt;code&gt;registry:write&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;the token does not bypass the user’s role.&lt;/p&gt;

&lt;p&gt;a reader cannot publish just because the token includes &lt;code&gt;registry:write&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;this keeps access simple.&lt;/p&gt;

&lt;p&gt;developers, ci, and agents use the same npm registry URL.&lt;/p&gt;

&lt;p&gt;they use the same npm commands.&lt;/p&gt;

&lt;p&gt;what changes is the token and the permission behind it.&lt;/p&gt;

&lt;p&gt;i store each token in the project or deployment secret manager.&lt;/p&gt;

&lt;p&gt;i do not commit it to the repository.&lt;/p&gt;

&lt;p&gt;when a workflow no longer needs access, i revoke its token.&lt;/p&gt;

&lt;p&gt;the agent gets access to the packages it needs.&lt;/p&gt;

&lt;p&gt;the team keeps control over who can install, publish, and manage the registry.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to set up a private npm registry. The easiest way.</title>
      <dc:creator>Jessé Cruz</dc:creator>
      <pubDate>Mon, 07 Sep 2026 12:02:05 +0000</pubDate>
      <link>https://dev.to/ojessecruz/how-to-set-up-a-private-npm-registry-the-easiest-way-2opb</link>
      <guid>https://dev.to/ojessecruz/how-to-set-up-a-private-npm-registry-the-easiest-way-2opb</guid>
      <description>&lt;p&gt;Need a private npm registry without changing the way your team already works?&lt;/p&gt;

&lt;p&gt;In this guide, I walk through setting up Omni Line as a self-hosted npm registry — from installation to publishing and installing private packages.&lt;/p&gt;

&lt;p&gt;The workflow is intentionally simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://omniline.app/docs/quickstart" rel="noopener noreferrer"&gt;Install Omni Line&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Create a hosted npm registry&lt;/li&gt;
&lt;li&gt;Generate a personal access token&lt;/li&gt;
&lt;li&gt;Configure .npmrc&lt;/li&gt;
&lt;li&gt;Keep using npm publish and npm install as usual&lt;/li&gt;
&lt;li&gt;You can run it on your own infrastructure and use the same registry workflow for developers, CI, and even AI coding agents.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I also cover how to let an agent handle most of the setup while keeping package publishing explicit and controlled.&lt;/p&gt;

&lt;p&gt;Read the full &lt;a href="https://medium.com/@ojessecruz/how-to-set-up-a-private-npm-registry-the-easiest-way-f98c4090173e" rel="noopener noreferrer"&gt;guide&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
