<?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: Arvin Gopi</title>
    <description>The latest articles on DEV Community by Arvin Gopi (@arvin_gopi).</description>
    <link>https://dev.to/arvin_gopi</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3909848%2Fac6b8661-b739-42a0-96c6-4f34f8fc2542.png</url>
      <title>DEV Community: Arvin Gopi</title>
      <link>https://dev.to/arvin_gopi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arvin_gopi"/>
    <language>en</language>
    <item>
      <title>AI makes building internal tools easy. Leash gives everything your team builds a home: hosted, authenticated, discoverable, and governed. That's why we built https://leash.build</title>
      <dc:creator>Arvin Gopi</dc:creator>
      <pubDate>Mon, 18 May 2026 20:07:55 +0000</pubDate>
      <link>https://dev.to/arvin_gopi/ai-makes-building-internal-tools-easy-leash-gives-everything-your-team-builds-a-home-hosted-3fo4</link>
      <guid>https://dev.to/arvin_gopi/ai-makes-building-internal-tools-easy-leash-gives-everything-your-team-builds-a-home-hosted-3fo4</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/arvin_gopi/your-company-is-about-to-build-10x-more-internal-tools-where-will-they-live-a26" class="crayons-story__hidden-navigation-link"&gt;Your Company Is About to Build 10x More Internal Tools. Where Will They Live?&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/arvin_gopi" class="crayons-avatar  crayons-avatar--l  "&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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3909848%2Fac6b8661-b739-42a0-96c6-4f34f8fc2542.png" alt="arvin_gopi profile" class="crayons-avatar__image" width="96" height="96"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/arvin_gopi" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Arvin Gopi
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Arvin Gopi
                
              
              &lt;div id="story-author-preview-content-3695577" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/arvin_gopi" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3909848%2Fac6b8661-b739-42a0-96c6-4f34f8fc2542.png" class="crayons-avatar__image" alt="" width="96" height="96"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Arvin Gopi&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/arvin_gopi/your-company-is-about-to-build-10x-more-internal-tools-where-will-they-live-a26" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 18&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/arvin_gopi/your-company-is-about-to-build-10x-more-internal-tools-where-will-they-live-a26" id="article-link-3695577"&gt;
          Your Company Is About to Build 10x More Internal Tools. Where Will They Live?
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/claudecode"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;claudecode&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/cursor"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;cursor&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/chatgpt"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;chatgpt&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/arvin_gopi/your-company-is-about-to-build-10x-more-internal-tools-where-will-they-live-a26#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;



&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://leash.build/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstartupfa.me%2Fbadges%2Ffeatured-badge-small.webp" height="105" class="m-0" width="655"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://leash.build/" rel="noopener noreferrer" class="c-link"&gt;
            Leash - Deploy any app with built-in auth. One command. | Leash
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Deploy apps in seconds with authentication, environment variables, and team sharing built in. Supports Next.js, Flask, Express, Go, Rails, Rust, Java. One command. Instant URL.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fleash.build%2Ficon.svg" width="100" height="100"&gt;
          leash.build
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Your Company Is About to Build 10x More Internal Tools. Where Will They Live?</title>
      <dc:creator>Arvin Gopi</dc:creator>
      <pubDate>Mon, 18 May 2026 19:58:08 +0000</pubDate>
      <link>https://dev.to/arvin_gopi/your-company-is-about-to-build-10x-more-internal-tools-where-will-they-live-a26</link>
      <guid>https://dev.to/arvin_gopi/your-company-is-about-to-build-10x-more-internal-tools-where-will-they-live-a26</guid>
      <description>&lt;p&gt;&lt;em&gt;AI changed who can build software. Leash makes what they build usable by the company.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The internal tools backlog used to be a queue. A sales team needed a pipeline cleanup dashboard. Finance wanted a variance report. Support needed a triage view. Product wanted a customer research tracker. Everyone waited for engineering time.&lt;/p&gt;

&lt;p&gt;AI coding tools changed that. Engineers are moving faster, but they are not the only builders anymore. PMs, designers, ops teams, analysts, and automation owners can now turn a workflow problem into working software in an afternoon.&lt;/p&gt;

&lt;p&gt;That is a good thing. It also creates a new problem. The bottleneck is no longer only "can we build it?" The bottleneck is "can the company safely use it?"&lt;/p&gt;

&lt;h2&gt;
  
  
  The New Internal Tool Sprawl
&lt;/h2&gt;

&lt;p&gt;The dashboard someone built is on a personal Vercel account. The renewal-risk tool is running from a laptop. The onboarding app lives on a free hosting tier. The AI workflow that summarizes customer calls is a notebook only one person knows how to run.&lt;/p&gt;

&lt;p&gt;Links are scattered through Slack. Credentials are copied into DMs. Nobody knows which tools exist, who owns them, who can access them, or whether the thing the team started using last week is still running.&lt;/p&gt;

&lt;p&gt;AI increases the amount of internal software your company can create. Without a delivery layer, it also increases the amount of internal software your company cannot see.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Company Needs a Home for What Gets Built
&lt;/h2&gt;

&lt;p&gt;Leash is the internal tool delivery layer for the AI era. It gives every app, workflow, and prototype a standard path from "works on my machine" to "the organization can use this."&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploy from the CLI or an agent workflow&lt;/li&gt;
&lt;li&gt;Get a real HTTPS URL for the tool&lt;/li&gt;
&lt;li&gt;Use built-in organization auth and access controls&lt;/li&gt;
&lt;li&gt;Show up in a shared catalog where teammates can find it&lt;/li&gt;
&lt;li&gt;Resolve secrets, environment variables, identity, and integrations through the platform&lt;/li&gt;
&lt;li&gt;Collect feedback where the app actually lives&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Builders keep moving quickly. Leaders, platform teams, and IT get a governed surface area instead of a mess of personal accounts and mystery apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  For Engineers
&lt;/h2&gt;

&lt;p&gt;You built something useful. Leash removes the shipping tax. You do not need to stand up a hosting account, wire auth, ask for a subdomain, copy secrets into a new place, or explain to everyone how to run it locally.&lt;/p&gt;

&lt;p&gt;Run &lt;code&gt;leash deploy&lt;/code&gt;. The tool gets a URL, auth, access controls, env vars, and a place in the team dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  For Heads of Engineering
&lt;/h2&gt;

&lt;p&gt;Your company is going to create more software than your platform team can manually host, review, and support. The answer is not to block builders. The answer is to give them a paved road.&lt;/p&gt;

&lt;p&gt;Leash turns internal-tool delivery into a standard workflow. Builders get autonomy. The organization gets consistency.&lt;/p&gt;

&lt;h2&gt;
  
  
  For PMs and Designers
&lt;/h2&gt;

&lt;p&gt;You do not have to stop at a spec, a mockup, or a localhost demo. If you understand the workflow pain, you can help turn it into a real tool and put it in front of the people who need it.&lt;/p&gt;

&lt;p&gt;Leash makes that tool shareable, authenticated, and easy to find, so the feedback loop happens around something the team can actually use.&lt;/p&gt;

&lt;h2&gt;
  
  
  For AI Ops and Automation Teams
&lt;/h2&gt;

&lt;p&gt;Agents, scripts, and notebooks become much more valuable when they have a stable place to run and a clear surface for users. Leash turns internal AI workflows into deployed tools with identity, integrations, secrets, and access control handled by the platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  For Internal Tools and IT Teams
&lt;/h2&gt;

&lt;p&gt;AI-built apps are coming either way. Leash gives them a governed home. You can see what exists, keep access tied to the organization, standardize deployment, and reduce the number of unofficial apps living on personal infrastructure.&lt;/p&gt;

&lt;p&gt;Internal tools teams become the platform for builders instead of the bottleneck every team has to wait on.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Companies That Win Will Not Just Build More
&lt;/h2&gt;

&lt;p&gt;AI makes internal software abundant. The winners will be the companies that make that software usable: easy to deploy, easy to discover, connected to the right systems, and governed by the organization.&lt;/p&gt;

&lt;p&gt;That is what Leash is for. Everything your team builds gets a home.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Give every internal tool a home&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;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://leash.build/install.sh | sh
leash login
leash deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://leash.build/docs/quickstart" rel="noopener noreferrer"&gt;Read the quickstart&lt;/a&gt; or explore the &lt;a href="https://leash.build/docs/plugins/claude-code" rel="noopener noreferrer"&gt;Claude Code plugin&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claudecode</category>
      <category>cursor</category>
      <category>chatgpt</category>
    </item>
    <item>
      <title>Your .env file should have one line</title>
      <dc:creator>Arvin Gopi</dc:creator>
      <pubDate>Sun, 03 May 2026 05:05:18 +0000</pubDate>
      <link>https://dev.to/arvin_gopi/your-env-file-should-have-one-line-598</link>
      <guid>https://dev.to/arvin_gopi/your-env-file-should-have-one-line-598</guid>
      <description>&lt;p&gt;Every AI app I've shipped recently rewrote the same plumbing. The OAuth dance for Slack. Encrypted storage for an API key. Refresh-token logic that finally fails on the 3rd call after an hour. Wiring up an MCP client to a server behind a bearer token someone pasted into a Notion page.                                                                                                                                                                                                              &lt;/p&gt;

&lt;p&gt;I'd write it, copy-paste it into the next app, watch it rot. Each new agent built by a different teammate, slightly differently, with slightly different bugs. We were a small team and the integration code became most of the code.                   &lt;/p&gt;

&lt;p&gt;## The pattern under all of it                                                                                                                                                                                                                          &lt;/p&gt;

&lt;p&gt;Strip away the providers and the AI-specific bits, and every app needed the same four things from the platform:                                                                                                                                         &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Env vars&lt;/strong&gt; — a database URL, a Stripe key, the boring stuff. Not in a &lt;code&gt;.env&lt;/code&gt; file in a Docker image. Not in a CI secret. Somewhere the app can ask for at runtime.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pre-built integrations&lt;/strong&gt; — Gmail, Calendar, Drive. The user logs in once on the platform; every app gets typed access on their behalf.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom OAuth&lt;/strong&gt; — the providers no platform pre-builds. Slack, Notion, the company's SSO. The customer holds the &lt;code&gt;client_id&lt;/code&gt;/&lt;code&gt;secret&lt;/code&gt;; their app shouldn't.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom MCP&lt;/strong&gt; — internal MCP servers, third-party MCPs. The customer holds the URL and the bearer token; their app shouldn't.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's the spine of &lt;a href="https://leash.build/docs/sdk/overview" rel="noopener noreferrer"&gt;the SDK we ended up shipping&lt;/a&gt;. Four primitives, every app uses some of them, none of them require integration code in the app.                                                              &lt;/p&gt;

&lt;p&gt;## Register once at the org level                                                                                                                                                                                                                       &lt;/p&gt;

&lt;p&gt;The flip is registration. The org owner registers their things one time on the dashboard:                                                                                                                                                               &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drop a Slack &lt;code&gt;client_id&lt;/code&gt; + &lt;code&gt;client_secret&lt;/code&gt; into the "Custom OAuth providers" card. Encrypted with the org's KMS key. The app never sees it.
&lt;/li&gt;
&lt;li&gt;Drop the URL of an internal MCP server + a bearer token into the "Custom MCP servers" card. Same treatment.
&lt;/li&gt;
&lt;li&gt;Connect Doppler / 1Password / GCP Secret Manager as a secret source — or just type secrets into the dashboard.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now every app you deploy in that org gets typed access through four SDK calls.                                                                                                                                                                          &lt;/p&gt;

&lt;p&gt;## The four calls&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;LeashIntegrations&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@leash/sdk/integrations&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;                                                                                                                                                                                             

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;LeashIntegrations&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;LEASH_API_KEY&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;                                                                                                                                                                             

  &lt;span class="c1"&gt;// 1. Env var (resolves through your configured secret source)                                                                                                                                                                                          &lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dbUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getEnv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                                                                                                                                                                                                       

  &lt;span class="c1"&gt;// 2. Pre-built integration                                                                                                                                                                                                                             &lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gmail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listMessages&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;maxResults&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;                                                                                                                                                                                     

  &lt;span class="c1"&gt;// 3. Custom OAuth — fresh access token for any provider you've registered                                                                                                                                                                              &lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;slackToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAccessToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;slack&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="c1"&gt;// 4. Custom MCP — { url, headers } including bearer Authorization                                                                                                                                                                                    &lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mcp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getCustomMcpConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;acme-tools&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                                                                                                                                                                                               
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same shape across TypeScript, Python, Go, Ruby, Rust, and Java. No &lt;code&gt;client_secret&lt;/code&gt; in the app code. No refresh-token handler. No MCP boilerplate.&lt;/p&gt;

&lt;p&gt;## Your &lt;code&gt;.env&lt;/code&gt; collapses to one line                                                                                                                                                                                                                  &lt;/p&gt;

&lt;p&gt;The thing we noticed only after living with it: once you're using this, the only secret your app's &lt;code&gt;.env&lt;/code&gt; actually needs is the platform API key.&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;# .env  (yes, this is the whole thing)                                                                                                                                                                                                                  &lt;/span&gt;
  &lt;span class="nv"&gt;LEASH_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;lsk_live_...                                                                                                                                                                                                                              
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. No more &lt;code&gt;.env.example&lt;/code&gt; drift. No more "did we set &lt;code&gt;DATABASE_URL&lt;/code&gt; in staging?" debugging at 11pm. Rotation happens at the source — no rebuild, no redeploy.                                                                                   &lt;/p&gt;

&lt;p&gt;## What it deliberately doesn't do                                                                                                                                                                                                                      &lt;/p&gt;

&lt;p&gt;A few decisions that came up that I'll defend:                                                                                                                                                                                                          &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Doesn't proxy MCP traffic.&lt;/strong&gt; We hand the app &lt;code&gt;{url, headers}&lt;/code&gt; (with bearer Authorization already attached) and the app calls the MCP directly. Leash isn't in the request path. Tool calls are on the LLM's critical path; an extra hop hurts. We also&lt;br&gt;
   didn't want to reimplement every MCP transport (streamable HTTP, SSE, stdio) with our own bugs.                                                                                                                                                      &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Doesn't force you to use the platform for secrets.&lt;/strong&gt; If you'd rather hold them in Doppler or 1Password, point the platform at your existing source. &lt;code&gt;getEnv&lt;/code&gt; resolves through whichever the org configured.                                           &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Doesn't pretend to be multi-cloud.&lt;/strong&gt; Single-region GCP today. If you're betting on us, you're betting on a small surface area — not a multi-cloud promise.                                                                                            &lt;/p&gt;

&lt;p&gt;## The why behind the shape                                                                                                                                                                                                                             &lt;/p&gt;

&lt;p&gt;Customer apps can't hold credentials safely. Their AI agent runs on someone's laptop, in CI, on a Cloud Run revision someone's about to redeploy. Putting &lt;code&gt;client_secret&lt;/code&gt; in the app means rotating it everywhere whenever it leaks. So we put the&lt;br&gt;&lt;br&gt;
  credential in one place and gave the app a thin retrieval call instead.                                                                                                                                                                               &lt;/p&gt;

&lt;p&gt;Same logic for MCP. The bearer token for a customer's internal tool server isn't something we want their AI app to know. The app gets a config dictionary right before it calls the MCP. That's as long as the credential lives anywhere near user code.&lt;/p&gt;

&lt;p&gt;The four-primitive surface area is small on purpose. Anything else (token caching, retries, pagination on Gmail, etc.) lives in the SDK or in the customer's code, not in the platform contract. We'd rather grow the SDK than the API.                 &lt;/p&gt;

&lt;p&gt;## Try it&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;-fsSL&lt;/span&gt; https://leash.build/install.sh | sh                                                                                                                                                                                                        
  leash login                                                                                                                                                                                                                                             
  leash deploy                            
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or just sign up at &lt;a href="https://leash.build" rel="noopener noreferrer"&gt;leash.build&lt;/a&gt;, register a Slack app or an internal MCP, and call the SDK from any project. Custom OAuth + custom MCP are gated to the Growth plan; built-in integrations work on every plan including free.&lt;/p&gt;

&lt;p&gt;Curious what others have done for this. Especially the proxy-vs-config-handoff call for MCP — I made the bet, but it's the architecture choice I'd most welcome a counterargument on.                                                                 &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>localhost</category>
    </item>
  </channel>
</rss>
