<?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: stockyard-dev</title>
    <description>The latest articles on DEV Community by stockyard-dev (@stockyarddev).</description>
    <link>https://dev.to/stockyarddev</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%2F3852782%2F7caea71f-a0cc-479e-8461-7cf9cddbf454.png</url>
      <title>DEV Community: stockyard-dev</title>
      <link>https://dev.to/stockyarddev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stockyarddev"/>
    <language>en</language>
    <item>
      <title>The LLM proxy landscape in 2026: Helicone acquired, LiteLLM compromised, and what's next</title>
      <dc:creator>stockyard-dev</dc:creator>
      <pubDate>Tue, 31 Mar 2026 05:49:04 +0000</pubDate>
      <link>https://dev.to/stockyarddev/the-llm-proxy-landscape-in-2026-helicone-acquired-litellm-compromised-and-whats-next-3oon</link>
      <guid>https://dev.to/stockyarddev/the-llm-proxy-landscape-in-2026-helicone-acquired-litellm-compromised-and-whats-next-3oon</guid>
      <description>&lt;p&gt;The LLM proxy space has changed fast in 2026. Two significant events happened in Q1 that are worth understanding if you're picking infrastructure for routing LLM traffic. Then I'll give honest takes on the main options.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happened in Q1 2026
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Helicone acquired by Mintlify (March 3)
&lt;/h3&gt;

&lt;p&gt;Helicone, one of the more established LLM observability and proxy tools, was acquired by Mintlify. The Helicone team announced the acquisition and stated the product would enter maintenance mode. No new feature development. Bug fixes only, timeline unclear.&lt;/p&gt;

&lt;p&gt;If you're running Helicone in production, this is a risk signal. Maintenance mode means the product isn't being actively developed against a fast-moving ecosystem. Provider API changes won't get fast fixes. New models won't be prioritized.&lt;/p&gt;

&lt;h3&gt;
  
  
  LiteLLM PyPI supply chain attack (March 24)
&lt;/h3&gt;

&lt;p&gt;A supply chain attack targeting LiteLLM was discovered on March 24. Malicious packages were published to PyPI that impersonated LiteLLM packages. The attack targeted developers installing or updating LiteLLM via pip.&lt;/p&gt;

&lt;p&gt;LiteLLM itself (the legitimate package) was not compromised, but the attack surface here is real: pip's ecosystem has a history of typosquatting and dependency confusion attacks. If your LLM proxy is a Python package installed via pip in production, you have supply chain exposure that a compiled binary doesn't have.&lt;/p&gt;

&lt;p&gt;This is not a knock on LiteLLM's code quality. It's a structural observation about Python package distribution.&lt;/p&gt;

&lt;h2&gt;
  
  
  The current landscape
&lt;/h2&gt;

&lt;p&gt;Here are the main alternatives and honest assessments of each:&lt;/p&gt;

&lt;h3&gt;
  
  
  Portkey
&lt;/h3&gt;

&lt;p&gt;Portkey supports 200+ providers, which is impressive. The routing and fallback features are solid. The catch: observability and the more advanced features are cloud-locked. If you need on-premise observability for compliance reasons, Portkey isn't the answer. The open-source version exists but the features that matter are in the cloud product.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langfuse
&lt;/h3&gt;

&lt;p&gt;Langfuse is good at what it does, which is observability. It's not a proxy. You can self-host it, the tracing is detailed, and it integrates with most frameworks. But if you need request routing, caching, or rate limiting at the proxy layer, Langfuse doesn't do that. It's a complementary tool, not a replacement.&lt;/p&gt;

&lt;h3&gt;
  
  
  OpenRouter
&lt;/h3&gt;

&lt;p&gt;OpenRouter gives you access to a huge model catalog through one API. It's genuinely useful for trying models without managing individual provider credentials. The tradeoffs: it's cloud-only, there's no self-hosted option, and they take a 5.5% fee on top of provider costs. For production workloads where you're sending significant volume, that fee adds up. Also, your traffic goes through their infrastructure, which is a compliance consideration for some use cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  TensorZero
&lt;/h3&gt;

&lt;p&gt;TensorZero is doing something different: it focuses on the optimization loop, using feedback signals to improve prompts and routing over time. Interesting approach. The limitation is that it doesn't do caching or rate limiting today. If those are requirements, TensorZero isn't a complete solution on its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Stockyard fits
&lt;/h2&gt;

&lt;p&gt;Stockyard is a self-hosted LLM proxy that ships as a single ~25MB Go binary with embedded SQLite. No external dependencies, no cloud component required. It handles routing, caching, rate limiting, and request logging across 40+ providers.&lt;/p&gt;

&lt;p&gt;The honest tradeoffs: the embedded SQLite means no horizontal scaling. If you need to run multiple proxy instances sharing state, that's not supported. Single-instance deployments handle most workloads fine given LLM API latency, but it's a real constraint.&lt;/p&gt;

&lt;p&gt;The supply chain story: it's a Go binary. There's no pip install, no package manager, no transitive dependency injection vector at runtime. The attack surface is different.&lt;/p&gt;

&lt;p&gt;Stockyard's proxy core is Apache 2.0. The full platform with dashboard and team features is BSL 1.1. Source is at &lt;a href="https://github.com/stockyard-dev/Stockyard" rel="noopener noreferrer"&gt;github.com/stockyard-dev/Stockyard&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Full disclosure: I built Stockyard, so I'm biased. But the comparison data is accurate.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devtools</category>
      <category>opensource</category>
      <category>security</category>
    </item>
    <item>
      <title>I built an open source LLM proxy as a single Go binary — here's why</title>
      <dc:creator>stockyard-dev</dc:creator>
      <pubDate>Tue, 31 Mar 2026 05:43:51 +0000</pubDate>
      <link>https://dev.to/stockyarddev/i-built-an-open-source-llm-proxy-as-a-single-go-binary-heres-why-4pd1</link>
      <guid>https://dev.to/stockyarddev/i-built-an-open-source-llm-proxy-as-a-single-go-binary-heres-why-4pd1</guid>
      <description>&lt;p&gt;About 18 months ago I started building Stockyard. It's an LLM proxy: you point your apps at it instead of directly at OpenAI or Anthropic or Gemini, and it handles routing, caching, rate limiting, logging, and retries. You can self-host it in under a minute.&lt;/p&gt;

&lt;p&gt;The interesting design decision: it ships as a single ~25MB Go binary with embedded SQLite and zero external dependencies.&lt;/p&gt;

&lt;p&gt;That choice drives everything else. Here's why I made it, and where it hurts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not Postgres + Redis?
&lt;/h2&gt;

&lt;p&gt;Most infrastructure projects reach for Postgres and Redis by default. It's a reasonable stack. But for an LLM proxy, it creates friction exactly where you don't want it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploying means provisioning two additional services&lt;/li&gt;
&lt;li&gt;"Try it out" becomes a multi-step process&lt;/li&gt;
&lt;li&gt;On-call incidents now include "is it the proxy or the DB?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted onboarding to be: download binary, run it, change one URL in your code. That's it. No YAML, no Compose file, no managed database tier.&lt;/p&gt;

&lt;p&gt;SQLite handles this surprisingly well for most workloads. LLM proxy traffic is write-heavy (logging requests) but not write-concurrent in ways that stress SQLite. Reads are fast. The database file lives next to the binary. Backups are a file copy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Go?
&lt;/h2&gt;

&lt;p&gt;A few reasons, in order of how much they actually mattered:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Static compilation.&lt;/strong&gt; &lt;code&gt;go build&lt;/code&gt; produces a self-contained binary. No runtime, no shared libraries, no "which Python version." The Linux binary runs on Linux. The macOS binary runs on macOS. This isn't magic, it's just how Go works, but it's genuinely useful for distribution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Goroutines.&lt;/strong&gt; An LLM proxy is fundamentally a concurrent problem: you're waiting on upstream API calls, you're handling multiple requests at once, you might be streaming. Go's goroutine model handles this without the overhead of threads-per-request. The event loop alternative (Node, Python asyncio) works too, but Go's concurrency is easier to reason about when things go wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-compilation.&lt;/strong&gt; &lt;code&gt;GOOS=linux GOARCH=arm64 go build&lt;/code&gt; just works. I release binaries for Linux amd64, Linux arm64, macOS amd64, macOS arm64, and Windows amd64 from a single CI step. That would be much harder in most other languages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boring is good.&lt;/strong&gt; Go is not exciting. It has no macros, limited generics, verbose error handling. For infrastructure code, that's a feature. The codebase is readable by anyone who knows Go, and most of it is readable by anyone who programs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "change one URL" onboarding
&lt;/h2&gt;

&lt;p&gt;Here's what using Stockyard actually looks like:&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;# Download and run&lt;/span&gt;
curl &lt;span class="nt"&gt;-L&lt;/span&gt; https://stockyard.dev/install.sh | sh
stockyard start

&lt;span class="c"&gt;# Your code, before:&lt;/span&gt;
client &lt;span class="o"&gt;=&lt;/span&gt; OpenAI&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sk-..."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Your code, after:&lt;/span&gt;
client &lt;span class="o"&gt;=&lt;/span&gt; OpenAI&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sk-..."&lt;/span&gt;, &lt;span class="nv"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:8080/openai"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the entire migration for OpenAI. Same pattern for Anthropic, Gemini, Mistral, and 37 other providers. The proxy speaks each provider's native API format, so your existing SDK code keeps working.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons from 40+ provider integrations
&lt;/h2&gt;

&lt;p&gt;Supporting 40+ LLM providers taught me things I didn't expect:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API inconsistency is the norm.&lt;/strong&gt; Every provider has slightly different authentication (Bearer token, x-api-key header, query param, custom header), different streaming formats, different error codes. There's no standard. OpenAI's format is the closest thing to one, and providers that claim "OpenAI-compatible" mean it to varying degrees.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Models come and go fast.&lt;/strong&gt; I've had to update provider configs for model deprecations more times than I can count. Building this as config-driven rather than hard-coded matters a lot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Streaming is where bugs hide.&lt;/strong&gt; Non-streaming request/response is straightforward to proxy. Streaming is not. Different providers use different SSE formats, different done signals, different error injection patterns mid-stream. Robust streaming support took probably 40% of the proxy implementation work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation is often wrong.&lt;/strong&gt; Provider API docs lag behind actual behavior. The ground truth is the HTTP traffic.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest tradeoff: embedded SQLite = no horizontal scaling
&lt;/h2&gt;

&lt;p&gt;Here's what I won't pretend isn't true: SQLite doesn't scale horizontally.&lt;/p&gt;

&lt;p&gt;If you're running a single instance, this doesn't matter at all. If you need to run two instances behind a load balancer and have them share state (for rate limiting, caching), you can't. You'd need to switch to a different persistence layer.&lt;/p&gt;

&lt;p&gt;For the majority of Stockyard's users, a single instance handles the load. LLM APIs are slow (200ms-2000ms per request), so you can handle a lot of concurrent requests before you need more than one proxy instance. But if you're at the scale where this matters, you'll need to work around it.&lt;/p&gt;

&lt;p&gt;I'm not planning to swap out SQLite for Postgres. The single-binary property is core to the project's identity. If horizontal scaling is a requirement, Stockyard might not be the right tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it is today
&lt;/h2&gt;

&lt;p&gt;Stockyard is live at &lt;a href="https://stockyard.dev" rel="noopener noreferrer"&gt;stockyard.dev&lt;/a&gt;. The proxy core is Apache 2.0. The full platform (dashboard, team features) is BSL 1.1. Source is at &lt;a href="https://github.com/stockyard-dev/Stockyard" rel="noopener noreferrer"&gt;github.com/stockyard-dev/Stockyard&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It supports 40+ providers, has a web dashboard for request logging and analytics, handles caching and rate limiting, and ships as that single ~25MB binary.&lt;/p&gt;

&lt;p&gt;If you're routing LLM traffic through multiple providers or want visibility into what your app is actually sending to APIs, it might be useful to you.&lt;/p&gt;

</description>
      <category>go</category>
      <category>opensource</category>
      <category>ai</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
