Skip to content

Add the v0.5 release post - #39

Merged
negz merged 7 commits into
modelplaneai:mainfrom
dennis-upbound:dennis/blog-v0-5
Oct 12, 2026
Merged

negz merged 7 commits into
modelplaneai:mainfrom
dennis-upbound:dennis/blog-v0-5

Conversation

@dennis-upbound

Copy link
Copy Markdown
Contributor

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. fromUnit and acrossReplicas each 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:

There's no cover image — v0.4 and the other posts have one under public/blog/<slug>/cover.png, so this needs artwork before it ships.

I ran node scripts/validate-posts.mjs (8 posts, all good) and a full npm run build locally; both pass.

🤖 Generated with Claude Code

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 negz left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment on lines +43 to +45
`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:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about phrasing this as a positive: "You can now run multiple IGs"

Comment on lines +68 to +70
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.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment on lines +74 to +76
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.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could be worth linking to DCGM or using its full name. I'd never heard of it before the metrics work.

Comment on lines +83 to +84
running both has no fleet-wide number at all. We couldn't fix that by picking
an engine, so we fixed it at collection.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This reads like we wanted to pick an engine but couldn't.

Comment on lines +89 to +91
`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.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This segment reads a bit AI. I suggest dropping it entirely; I suspect most readers will infer that we only export modelplane_* metrics.

Comment on lines +127 to +132
`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.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this actually worth explaining in a blog post? It feels more like documentation.

Comment on lines +134 to +138
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.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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>
@dennis-upbound

Copy link
Copy Markdown
Contributor Author

Took all ten of your suggestions — thanks. Two turned out to be factual rather than taste:

  • The opening called it the gateway on your control plane, and v0.5 is the release that stopped being true: InferenceGateway now requires clusterName, described in the XRD as "the InferenceCluster this gateway runs on". The move is worth saying out loud, so the section says it rather than avoiding the word.
  • Envoy AI Gateway became Agent Router on 10 September when the project joined the Agentic AI Foundation. The post uses that name now and notes we run a build from before it, which is why a cluster still shows envoy-ai-gateway-system — otherwise that mismatch is confusing for anyone who goes looking.

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 modelplane_* justification and the don't-combine-replicas paragraph are gone. fromUnit keeps only the part that saves someone an afternoon. "and that's the point" has gone too 🙂

One thing I can't do: the cover image. Every post has one and you've made all seven, and modelplaneai/artwork only carries brand and logo assets, so there's nothing to reuse. Could you do a cover.png for this one?

What it needs, from the existing posts:

  • public/blog/modelplane-v0-5/cover.png, 2560 × 884 (what v0.3 and v0.4 both are)
  • then cover: "/blog/modelplane-v0-5/cover.png" in the frontmatter

I'll add the frontmatter line, or you can — whichever is easier.

Also still to do before this publishes, both yours: draft: false, and the date. It is set to today, which is right if it goes up today and wants bumping otherwise.

While I was checking the post against content/blog/README.md I found public/authors/dennis.jpg was committed as the original 2316×3088 portrait at 932K, where bassam and haarchri are 256² and yours is 800². Cropped it square to 800² at 220K, which also fixes the avatar on the July post that shares the file.

@negz
negz merged commit 464a78a into modelplaneai:main Oct 12, 2026
2 checks passed

This branch was successfully deployed

1 active deployment
Preview — 9ca8bd84 Deployed Oct 7, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants