<?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: Paul Piper</title>
    <description>The latest articles on DEV Community by Paul Piper (@madppiper).</description>
    <link>https://dev.to/madppiper</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%2F1747669%2Ff88ebf96-c9c6-4c52-ba88-76e3231b2af8.jpg</url>
      <title>DEV Community: Paul Piper</title>
      <link>https://dev.to/madppiper</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/madppiper"/>
    <language>en</language>
    <item>
      <title>Why our slide decks are plain text files</title>
      <dc:creator>Paul Piper</dc:creator>
      <pubDate>Mon, 03 Aug 2026 15:53:38 +0000</pubDate>
      <link>https://dev.to/madppiper/why-our-slide-decks-are-plain-text-files-219g</link>
      <guid>https://dev.to/madppiper/why-our-slide-decks-are-plain-text-files-219g</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy3ltqywhzpg92r2a27g8.jpg" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy3ltqywhzpg92r2a27g8.jpg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have ever tried to code-review a slide deck, you already know the problem this is about. Here is what we did instead, and what it cost.&lt;/p&gt;

&lt;p&gt;Slaide keeps a slide deck in one plain-text file, so it diffs in git, reviews like code, and an agent can write it without touching a GUI.&lt;/p&gt;

&lt;p&gt;I have written a lot of decks. Every one of them ended up as a binary sitting in a shared drive, and every one of them had the same three problems: I could not diff it, I could not review it, and I could not automate it. The fix turned out to be boring. Make the deck a text file.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a .slaide file?
&lt;/h2&gt;

&lt;p&gt;It is Markdown for the words plus a short YAML block for the theme. That is the whole format.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;theme:
  palette: ink
  font: IBM Plex Sans

# The problem
Decks are binaries.

- You cannot diff them
- You cannot review them
- You cannot generate them without a GUI

# The fix
Make the deck a text file.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That file renders to a web deck, to a PDF, and to a &lt;code&gt;.pptx&lt;/code&gt; that opens and edits normally in PowerPoint. Same source, three outputs, no export dance in between.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why does the source format matter so much?
&lt;/h2&gt;

&lt;p&gt;Because everything you want to do with a deck downstream depends on it.&lt;/p&gt;

&lt;p&gt;A binary deck cannot go through code review. You can attach it to a pull request, but nobody can see what changed between revision four and revision five, so nobody reviews it properly. A text deck shows up as a diff: three lines changed on the pricing slide, and the reviewer reads three lines.&lt;/p&gt;

&lt;p&gt;A binary deck also cannot be written by an agent. This is the part that pushed me over. You cannot hand a model a &lt;code&gt;.pptx&lt;/code&gt; and say "slide 12 is too wordy, fix it" - the model would have to drive a GUI or rewrite OOXML, and neither of those is a thing you want happening unattended. Hand it a text file and the job is ordinary text editing, which models are good at.&lt;/p&gt;

&lt;p&gt;Slaide comes with an MCP server and an Agent Skill for exactly this. The agent reads the file, edits the file, and the renderer does the rest.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about the PowerPoint problem?
&lt;/h2&gt;

&lt;p&gt;This is the objection I get first, and it is a fair one. Nobody in a company runs on Markdown. "Send me the slides" means "send me something I can open and change".&lt;/p&gt;

&lt;p&gt;So &lt;code&gt;.pptx&lt;/code&gt; export is not a screenshot dump. The exported file has real text boxes, real shapes and real editable content, and someone who has never heard of Slaide can open it and move a box around. Import works the other way too: give Slaide an existing &lt;code&gt;.pptx&lt;/code&gt; and you get the text form back.&lt;/p&gt;

&lt;p&gt;The round-trip was the hardest part of the project by a wide margin. OOXML is not a format that wants to be written by hand, and getting a slide to survive the trip out to PowerPoint and back without drifting took far longer than the renderer did.&lt;/p&gt;

&lt;p&gt;Here is the honest limitation: a heavily designed deck does not survive a round trip perfectly. If your slides are full of hand-placed decorative elements and bespoke animations, importing them will flatten some of that. Slaide is best when the deck is mostly content, which in practice covers most working decks and not most conference keynotes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is open source and what is not?
&lt;/h2&gt;

&lt;p&gt;Being specific about this matters more than being generous about it.&lt;/p&gt;

&lt;p&gt;The core is Apache-2.0 and lives at &lt;a href="https://github.com/aivorynet/slaide" rel="noopener noreferrer"&gt;github.com/aivorynet/slaide&lt;/a&gt;. That includes the renderer, the CLI, the &lt;code&gt;.pptx&lt;/code&gt; import and export, the MCP server and the Agent Skill. If you want to render decks in CI, or generate them from a script, or build something on top of the format, that is the licence you are working under and there is no lock-in: the file is text, and the exporter is open.&lt;/p&gt;

&lt;p&gt;The WYSIWYG editor is closed source. It is free once you sign in - that changed on 28 July 2026, and it changed because charging for the editor was getting me a number on a dashboard rather than users with a deck already in the thing.&lt;/p&gt;

&lt;p&gt;The desktop viewer is Rust with a WebView, and it spawns the renderer as a separate binary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is this actually for?
&lt;/h2&gt;

&lt;p&gt;Three groups, in the order they show up:&lt;/p&gt;

&lt;p&gt;Developers who already keep everything else in git and find it strange that the deck is the one artefact that cannot be reviewed. Teams who generate decks programmatically - weekly metrics, customer reports, anything where a human assembling slides by hand is a waste of a human. And people building with agents, who want a deck as an output format that a model can actually produce.&lt;/p&gt;

&lt;p&gt;If you make a living designing beautiful bespoke presentations, this is not aimed at you and I would not try to convince you.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you start?
&lt;/h2&gt;

&lt;p&gt;Install the core, write a file, render it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; slaide
slaide render deck.slaide &lt;span class="nt"&gt;--out&lt;/span&gt; deck.pptx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the whole loop. The web deck and the PDF come out of the same command with a different &lt;code&gt;--out&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>markdown</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How a Spreadsheet Turned Into an LLM Inference Router</title>
      <dc:creator>Paul Piper</dc:creator>
      <pubDate>Tue, 09 Jun 2026 13:29:02 +0000</pubDate>
      <link>https://dev.to/madppiper/how-a-spreadsheet-turned-into-an-llm-inference-router-1370</link>
      <guid>https://dev.to/madppiper/how-a-spreadsheet-turned-into-an-llm-inference-router-1370</guid>
      <description>&lt;p&gt;Like any founder these days, my AI computing bill was horrendous. I was running open-weight models for several of my own products, and I started looking for cheaper options. Every few weeks I'd find a provider with better rates, migrate over, and then discover the prices had shifted again.&lt;/p&gt;

&lt;p&gt;So I did what any developer would do when faced with a repetitive task: I built a spreadsheet.&lt;/p&gt;

&lt;h2&gt;
  
  
  It Started as a Database
&lt;/h2&gt;

&lt;p&gt;The spreadsheet turned into a SQLite database pretty quickly. I started polling pricing APIs from the providers I was already using (Together, DeepInfra, Fireworks, a few others) and logging the results every few minutes. Just for my own reference, so I could see trends and decide when to switch.&lt;/p&gt;

&lt;p&gt;A few weeks in, the data showed something I hadn't expected. The price for the exact same model, same weights, same architecture, varied wildly across providers. Not by 10-20%. By 2x, sometimes more. And the cheapest provider wasn't always the same one. It changed multiple times per day. Off-peak hours (US night, EU morning) were consistently cheaper. Some providers had stable pricing; others fluctuated hourly, creating windows where they'd drop well below their usual rates.&lt;/p&gt;

&lt;p&gt;I was looking at this data every morning over coffee, manually deciding which provider to point my services at. That got old fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Tracking to Routing
&lt;/h2&gt;

&lt;p&gt;If I already had a database of live prices, why not just route requests automatically?&lt;/p&gt;

&lt;p&gt;I wrote a proxy that sat between my applications and the inference providers. When a request came in, it looked up the current cheapest provider for that model and forwarded the request there. If that provider failed, it tried the next cheapest. My apps didn't need to know or care which backend was serving them.&lt;/p&gt;

&lt;p&gt;I kept it OpenAI-compatible from the start because all my code already used the OpenAI SDK. Switching meant changing one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.aivory.net/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# the only change
&lt;/span&gt;    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-aivory-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llama-3.3-70b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Streaming, function calling, JSON mode, retry logic. All of it works because the API contract is identical.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then I Started Using It for Everything
&lt;/h2&gt;

&lt;p&gt;Once the router was running, I pointed all my own services at it. I run a few products that use inference heavily, and within the first month my costs dropped by about 60% without changing any application code.&lt;/p&gt;

&lt;p&gt;That was when I thought: other people have this problem too. Most teams pick a provider, integrate their SDK, and stay there. Switching means rewriting integration code, handling different auth flows, debugging streaming behavior differences. The friction of switching is what lets providers charge different rates for what is essentially the same commodity.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Pricing Data Actually Looks Like
&lt;/h2&gt;

&lt;p&gt;Here are real numbers from our API right now. These change constantly, which is the whole point:&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2F4lqw46zoevkb89el9jim.png" class="article-body-image-wrapper"&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%2Farticles%2F4lqw46zoevkb89el9jim.png" alt="Model pricing table showing 133 models with vendor, input and output prices per million tokens" width="800" height="378"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The model pricing dashboard. 133 models across vendors like Anthropic, DeepSeek, Google, Meta, and Qwen, each with live per-token pricing.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DeepSeek V3.2&lt;/strong&gt; (13 provider endpoints tracked):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Input (per 1M tokens)&lt;/th&gt;
&lt;th&gt;Output (per 1M tokens)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cheapest&lt;/td&gt;
&lt;td&gt;$0.46&lt;/td&gt;
&lt;td&gt;$0.83&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mid-range&lt;/td&gt;
&lt;td&gt;$0.49&lt;/td&gt;
&lt;td&gt;$1.13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Most expensive&lt;/td&gt;
&lt;td&gt;$0.54&lt;/td&gt;
&lt;td&gt;$1.38&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Llama 3.3 70B&lt;/strong&gt; (4 provider endpoints):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Input (per 1M tokens)&lt;/th&gt;
&lt;th&gt;Output (per 1M tokens)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cheapest&lt;/td&gt;
&lt;td&gt;$0.38&lt;/td&gt;
&lt;td&gt;$0.51&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mid-range&lt;/td&gt;
&lt;td&gt;$0.40&lt;/td&gt;
&lt;td&gt;$0.56&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Most expensive&lt;/td&gt;
&lt;td&gt;$0.92&lt;/td&gt;
&lt;td&gt;$0.92&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Qwen 3 235B&lt;/strong&gt; (6 provider endpoints):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Input (per 1M tokens)&lt;/th&gt;
&lt;th&gt;Output (per 1M tokens)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cheapest&lt;/td&gt;
&lt;td&gt;$0.35&lt;/td&gt;
&lt;td&gt;$0.40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mid-range&lt;/td&gt;
&lt;td&gt;$0.42&lt;/td&gt;
&lt;td&gt;$1.68&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Most expensive&lt;/td&gt;
&lt;td&gt;$0.48&lt;/td&gt;
&lt;td&gt;$3.15&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That last one is wild. The output price for Qwen 3 235B varies almost &lt;strong&gt;8x&lt;/strong&gt; across providers. And these are all serving the same model weights.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Same Problem, but for GPUs
&lt;/h2&gt;

&lt;p&gt;The entire endavour got me thinking about the other costs at large. Inference points aren't that common, still, but GPUs can be booked anywhere. So I checked if I could do the same manual price comparison there and upgraded my layer for GPU spot pricing.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2F8ni0abomlzi0zmwdqqks.png" class="article-body-image-wrapper"&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%2Farticles%2F8ni0abomlzi0zmwdqqks.png" alt="GPU marketplace showing 37 GPU types across 9 providers, with Top Picks and Biggest Savings sections" width="800" height="378"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The GPU spot marketplace. 37 GPU types across 9 providers, sorted by price. Top picks: H200 at $0.60/hr, H100 at $1.30/hr. Biggest savings: V100 at $0.07/hr.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The spreads are just as big as with inference pricing - if not even larger. An A100 80GB ranges from &lt;strong&gt;$0.71/hr to $2.48/hr&lt;/strong&gt; right now, a 3.5x spread. H100s go from &lt;strong&gt;$1.30/hr to $7.38/hr&lt;/strong&gt;. V100s range from &lt;strong&gt;$0.07/hr to $0.95/hr&lt;/strong&gt;, a 13x spread.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2F2kmipbzvjirfufwxjorw.png" class="article-body-image-wrapper"&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%2Farticles%2F2kmipbzvjirfufwxjorw.png" alt="GPU listing table showing Featured GPUs, NVIDIA Latest Generation, and Data Center tiers with price ranges and availability" width="800" height="378"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Each GPU shows the price range across providers, availability status, and number of competing offers. Deploy in one click.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The marketplace tracks various gpu types across a growing list of providers right now. Per-second billing, auto-shutdown on idle, and you can set a max price so you don't get surprised.&lt;/p&gt;

&lt;h2&gt;
  
  
  So where's the downside?
&lt;/h2&gt;

&lt;p&gt;Well, I can only think of one: Routing adds latency. Not much, but perhaps not something for everybody. However, for most interactive sessions it is probably negligible.&lt;/p&gt;

&lt;p&gt;Also: We're open-weight only. No GPT, Claude, or Gemini. But probably okay - realistically, it is what you probably rely on for most of your actual applications anyway.&lt;/p&gt;

&lt;p&gt;But apart from that, there is another upside - provider outages work differently with a router. If your single provider goes down, you're down. With a router, you're only down if &lt;em&gt;all&lt;/em&gt; providers go down at the same time, which is much rarer. That turned out to be a nice side effect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Market Looks Like Early Cloud Computing
&lt;/h2&gt;

&lt;p&gt;What I find genuinely interesting about all of this is that inference pricing in 2026 looks a lot like cloud computing did in 2010. Dozens of providers, no price transparency, wildly different rates for identical hardware. The only reason providers can charge 2-8x more than their competitors is because nobody is comparing in real-time.&lt;/p&gt;

&lt;p&gt;Spot pricing for GPUs follows the same dynamics as spot instances on AWS. Providers would rather sell unused capacity at a discount than let it sit idle. But unlike AWS, where everyone knows the spot market exists, most people renting GPUs for ML workloads are still paying on-demand rates from a single provider they picked months ago.&lt;/p&gt;

&lt;p&gt;I keep expecting the spreads to compress as the market matures, but so far the opposite has happened. New providers enter, existing ones experiment with pricing, and the range just gets wider. Maybe it'll consolidate eventually. But as long as providers are competing for utilization on hardware that depreciates fast, there's going to be a gap between whoever's desperate to fill capacity right now and whoever isn't.&lt;/p&gt;

&lt;p&gt;If you want to check out what I built from all of this, give it a go at &lt;a href="https://aivory.net/smart-inference/" rel="noopener noreferrer"&gt;aivory.net/smart-inference&lt;/a&gt; and reach out to me for feedback.&lt;/p&gt;

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