Repository navigation
Add the v0.5 release post - #39
Conversation
Covers the three headline changes: the fleet gateway becoming an Envoy AI Gateway, fleet telemetry under one metric vocabulary, and Civo as a cluster source. Each section leads with the problem rather than the feature, and the telemetry one explains why normalising at collection is the only option open to us when the engine is the user's choice. Left as a draft, so it renders on the preview deployment but stays out of production until the release ships and the telemetry docs publish. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: Dennis Ramdass <dennis@upbound.io>
It was a clause in a list of odds and ends, which undersold it: the interesting part isn't that the floor on spec.replicas went away, it's that dropping the floor alone would have left a parked deployment reporting permanently not ready. Zero takes its own path so a parked deployment reads as parked, which is what makes it safe for an autoscaler to do unattended. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: Dennis Ramdass <dennis@upbound.io>
Ran the docs' vale ai-tells rules over it, which the v0.4 post passes clean. Eight hits: a three-item title and a three-verb description, two more verb tricolons, an em-dash standing in for a comma, a run of clipped parallel sentences, 'ships' for 'comes with', and a 'given that' doing the work of 'when'. The title drops to two items like v0.4's, with Civo carried by the description and its own section. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: Dennis Ramdass <dennis@upbound.io>
The field is out of MetricMapping: nothing read it, and it asked every mapping author to declare something a dashboard query decides for itself. The post's two-field explanation becomes one, and the part worth keeping - that Modelplane leaves combining a deployment's replicas to your backend, because a scrape of one replica is one batch - stands on its own. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: Dennis Ramdass <dennis@upbound.io>
negz
left a comment
There was a problem hiding this comment.
Looks good overall. Feel free to take or leave my suggestions.
| pinned: true | ||
| --- | ||
|
|
||
| Modelplane v0.5 is out. The gateway on your control plane is now an AI |
There was a problem hiding this comment.
on your control plane
I suggest rephrasing this given it no longer runs on the Modelplane control plane. I'd say something around "the fleet gateway" like you do below.
| path prefix, nothing authenticated them, and the hop out to each cluster | ||
| crossed the public internet in plain HTTP. | ||
|
|
||
| It's now an [Envoy AI Gateway](https://aigateway.envoyproxy.io/), the same one |
There was a problem hiding this comment.
We should probably use their new branding here (or at least acknowledge it) even though we're technically running a build of AI Gateway from before it rebranded to Agent Router.
| `InferenceGateway` also stops being a singleton. It names the cluster it runs | ||
| on, so you can run one per region for residency, or two in a region for | ||
| availability: |
There was a problem hiding this comment.
What about phrasing this as a positive: "You can now run multiple IGs"
| The hop from a fleet gateway to a cluster gateway is now authenticated in both | ||
| directions by a per-cluster PKI, which cert-manager issues and trust-manager | ||
| distributes. |
There was a problem hiding this comment.
Should we say traffic is now mTLS authenticated and encrypted?
Also, mentioning cert-manager and trust-manager feels a bit in the weeds. In general I'd focus the blog post a bit more on user value and less how it works.
| Modelplane doesn't own your engine. You bring the image and the command, and | ||
| that's the point: a `ModelDeployment` runs vLLM, SGLang, or anything else that | ||
| speaks the OpenAI API, without Modelplane knowing anything about it. |
There was a problem hiding this comment.
"and that's the point" reads very LLM. 😉
|
|
||
| That same freedom is what makes a fleet hard to watch. vLLM publishes | ||
| `vllm:num_requests_waiting`. SGLang calls the same measurement | ||
| `sglang:num_queue_reqs`. DCGM reports framebuffer memory in mebibytes under a |
There was a problem hiding this comment.
Could be worth linking to DCGM or using its full name. I'd never heard of it before the metrics work.
| running both has no fleet-wide number at all. We couldn't fix that by picking | ||
| an engine, so we fixed it at collection. |
There was a problem hiding this comment.
This reads like we wanted to pick an engine but couldn't.
| `modelplane_*` leaves the cluster: a series nobody renamed is one whose meaning | ||
| Modelplane can't vouch for across engines, and it costs the same to carry as | ||
| one that was. |
There was a problem hiding this comment.
This segment reads a bit AI. I suggest dropping it entirely; I suspect most readers will infer that we only export modelplane_* metrics.
| `fromUnit` is worth explaining, because it encodes something a dashboard would | ||
| otherwise have to guess. A metric's name is no guide to its unit, so the mapping | ||
| says what the source measures in and Modelplane converts to the base unit the | ||
| target name claims, histogram buckets and all. Skipping it is the expensive | ||
| mistake: a series named `_seconds` holding milliseconds reads a thousand times | ||
| fast, and nothing downstream can tell. |
There was a problem hiding this comment.
Is this actually worth explaining in a blog post? It feels more like documentation.
| One thing Modelplane deliberately doesn't do is combine a deployment's replicas | ||
| for you. Each publishes its own series, and a scrape of one replica is one batch, | ||
| so a collector that added them up would be summing readings taken at different | ||
| moments. That isn't the traffic that happened. Your backend already has every | ||
| replica's series and can combine them at query time. |
There was a problem hiding this comment.
Is this really useful information in the context of a release blog?
Two were factual. The post opened by calling it the gateway on your control plane, which v0.5 is exactly the release that stopped being true: an InferenceGateway now names the InferenceCluster it runs on. The move is worth saying rather than hiding, so the section says it. And Envoy AI Gateway became Agent Router on 10 September when the project joined the Agentic AI Foundation, so the post uses that name and notes we run a build from before it, which is why a cluster still shows envoy-ai-gateway-system. The rest follow his note to weigh user value over mechanism. The PKI paragraph becomes what a reader gets from it, mutual authentication and encryption where plain HTTP used to cross the internet, with cert-manager and trust-manager left to the docs. Running more than one gateway is stated as a thing you can do rather than as a singleton that stopped. DCGM gets its full description and a link. The paragraph on why only modelplane_* leaves a cluster goes, and so does the one on why the collector does not combine replicas; both explain mechanism a reader will not ask about. The fromUnit paragraph keeps the part that saves somebody an afternoon and loses the rest. Two phrasings he marked: "and that's the point" has gone, and the line about normalising at collection no longer reads as though we wanted to pick an engine and failed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: Dennis Ramdass <dennis@upbound.io>
The frontmatter date orders the blog and dates the post, so it is the day the post goes up rather than the day the release was cut. The v0.4 post does the same: its folder is 2026-09-02 and its date is 2026-09-10. The folder prefix is stripped from the URL, so it stays as it is. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: Dennis Ramdass <dennis@upbound.io>
dennis.jpg was the original 2316x3088 portrait at 932K, where every other author photo is square: bassam and haarchri at 256, nic at 800. A portrait in a square avatar slot is cropped by the browser rather than by us, and 932K is a lot for a thumbnail. Cropped to the centre square and resized to 800, matching nic.jpg. The face sits centre frame in the result. 220K. This also fixes the avatar on the 2026-07-14 post, which uses the same file. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: Dennis Ramdass <dennis@upbound.io>
|
Took all ten of your suggestions — thanks. Two turned out to be factual rather than taste:
The rest follow your steer on user value over mechanism: the PKI paragraph is now mutual authentication and encryption where plain HTTP used to cross the internet, with cert-manager and trust-manager left to the docs; multiple gateways is stated as something you can do; DCGM is named and linked; and both the One thing I can't do: the cover image. Every post has one and you've made all seven, and What it needs, from the existing posts:
I'll add the frontmatter line, or you can — whichever is easier. Also still to do before this publishes, both yours: While I was checking the post against |
Description of your changes
The release post for v0.5, covering the three headline changes: the fleet gateway becoming an Envoy AI Gateway, fleet telemetry under one metric vocabulary, and Civo as a cluster source.
It follows the v0.4 post's shape — problem first in each section, prose rather than bullets, a worked YAML example where the API is the point. It's about a third shorter than v0.4 (1,065 words against 1,537).
The telemetry section carries the most rationale, because that's where the design needs explaining: Modelplane can't normalise metric names by picking an engine, since the engine is the user's choice, so it normalises at collection instead.
fromUnitandacrossReplicaseach get a short paragraph for the same reason — both encode something a dashboard would otherwise guess.Opened as a draft (
draft: true), so it renders on the Vercel preview but stays out of production, the RSS feed and the sitemap. Two things to flip before it goes live:draft: false, anddateset to the actual release date.There's no
coverimage — v0.4 and the other posts have one underpublic/blog/<slug>/cover.png, so this needs artwork before it ships.I ran
node scripts/validate-posts.mjs(8 posts, all good) and a fullnpm run buildlocally; both pass.🤖 Generated with Claude Code