<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>TinyComputers.io (Posts about infrastructure)</title><link>https://tinycomputers.io/</link><description></description><atom:link href="https://tinycomputers.io/categories/infrastructure.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2026 A.C. Jokela 
&lt;!-- div style="width: 100%" --&gt;
&lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"&gt;&lt;img alt="" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/80x15.png" /&gt; Creative Commons Attribution-ShareAlike&lt;/a&gt;&amp;nbsp;|&amp;nbsp;
&lt;!-- /div --&gt;
</copyright><lastBuildDate>Mon, 06 Apr 2026 22:12:49 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Building DirtScout: A Land Acquisition Platform with Claude Code</title><link>https://tinycomputers.io/posts/building-dirtscout-a-land-acquisition-platform-with-claude-code.html?utm_source=feed&amp;utm_medium=rss&amp;utm_campaign=rss</link><dc:creator>A.C. Jokela</dc:creator><description>&lt;div class="audio-widget"&gt;
&lt;div class="audio-widget-header"&gt;
&lt;span class="audio-widget-icon"&gt;🎧&lt;/span&gt;
&lt;span class="audio-widget-label"&gt;Listen to this article&lt;/span&gt;
&lt;/div&gt;
&lt;audio controls preload="metadata"&gt;
&lt;source src="https://tinycomputers.io/building-dirtscout-a-land-acquisition-platform-with-claude-code_tts.mp3" type="audio/mpeg"&gt;
&lt;/source&gt;&lt;/audio&gt;
&lt;div class="audio-widget-footer"&gt;24 min · AI-generated narration&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Nine years ago, I built something similar.&lt;/p&gt;
&lt;p&gt;It was 2017, St. Louis County, Minnesota. I wanted to find raw undeveloped land from the county's delinquent tax rolls. The county had an ArcGIS service, but the APIs were primitive compared to what they offer now. I stood up a PostgreSQL database with PostGIS extensions, wrote Ruby scripts to scrape parcel data from the county's map server, geocoded addresses, and built a Ruby on Rails frontend to browse the results. The whole thing lived on a single VPS. It worked for one county. The data model was rigid, the scraping was fragile, and every time St. Louis County changed their GIS service, something broke.&lt;/p&gt;
&lt;p&gt;That project died the way side projects do: I got what I needed from it and moved on.&lt;/p&gt;
&lt;p&gt;In March 2026, I came back to the idea. The landscape had changed. ArcGIS REST APIs are now standardized and reliable. Wisconsin publishes a statewide parcel dataset covering all 72 counties through a single endpoint. Minnesota counties expose delinquent tax data through queryable feature services. AWS Lambda and DynamoDB mean I don't need to manage a database server. And I had a tool that didn't exist in 2017: &lt;a href="https://claude.ai/claude-code"&gt;Claude Code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;DirtScout is the result. It's a full-stack land acquisition platform at &lt;a href="https://dirtscout.land"&gt;dirtscout.land&lt;/a&gt; that searches delinquent tax parcels across 21 Minnesota counties and browses raw land across 72 Wisconsin counties. It has AI-powered investment analysis, environmental and soil assessments, a deal pipeline with offer letter generation, tax forfeit auction tracking, and automated monitoring with email alerts. The codebase is about 29,000 lines across Python, TypeScript, and infrastructure-as-code.&lt;/p&gt;
&lt;p&gt;I built it with Claude Code. Not "Claude Code assisted me" or "Claude Code helped with the boilerplate." Claude Code wrote the code. I directed the architecture, made the decisions, and did the debugging when things broke. But the actual lines of code came from conversations, not from me typing in an editor.&lt;/p&gt;
&lt;h3&gt;The Architecture&lt;/h3&gt;
&lt;p&gt;The 2017 version was PostgreSQL + PostGIS + Ruby on Rails on a single server. The 2026 version:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Frontend:&lt;/strong&gt; Next.js 16, static export, Tailwind CSS, react-leaflet for maps. Hosted on S3 behind CloudFront. The entire frontend is pre-rendered HTML and JavaScript; there's no server-side rendering. CloudFront serves it from edge locations. A URL rewrite function handles dynamic routes for deal detail pages and shared parcel links.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Backend:&lt;/strong&gt; Python FastAPI running on a single AWS Lambda function behind API Gateway. Mangum adapts the ASGI app to Lambda's event format. Every API request hits the same Lambda, which cold-starts in about 3.5 seconds and handles subsequent requests in under a second. The function has 512MB of memory and a 5-minute timeout.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Data:&lt;/strong&gt; Two DynamoDB tables. The main table stores user data, flagged parcels, deals, preferences, notes, attachments, saved searches, tax list imports, and auction tracking. The cache table stores land cover analysis, environmental data, soil analysis, and geometry with TTLs. No PostgreSQL. No PostGIS. No database server to manage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Infrastructure:&lt;/strong&gt; AWS CDK in Python. One &lt;code&gt;cdk deploy&lt;/code&gt; command creates the Lambda, API Gateway, DynamoDB tables, S3 buckets, SQS queues, EventBridge schedules, Route 53 records, CloudFront distributions, and ACM certificates. The entire infrastructure is version-controlled and reproducible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;On-premises worker:&lt;/strong&gt; A service running on a local AMD Strix Halo machine (Ryzen AI MAX+ 395, 128GB RAM) processes delinquent tax list PDFs using pdfplumber for text extraction and a local Qwen3 32B model via Ollama for structured data extraction. It polls an SQS queue for jobs.&lt;/p&gt;
&lt;p&gt;This is a fundamentally different architecture than what I could have built in 2017. No servers to patch aside from the Strix Halo. No database to back up. No PostGIS extensions to compile. The Lambda handles the compute, DynamoDB handles the storage, and the on-prem machine handles the jobs that need a real browser or a local LLM.&lt;/p&gt;
&lt;h3&gt;What Claude Code Actually Did&lt;/h3&gt;
&lt;p&gt;I want to be specific about this because the "AI-assisted development" conversation is usually vague. People say "I used AI to help me code" and it could mean anything from autocomplete suggestions to full application generation. Here's what actually happened.&lt;/p&gt;
&lt;p&gt;I started with a Rust TUI. The original project was a terminal application that queried a handful of Minnesota county ArcGIS services and displayed delinquent parcels in a text interface. It had county configurations, a query client, land cover analysis via USGS NLCD, and a flagging system. Claude Code built this from my descriptions of what I wanted: "query this ArcGIS service for parcels where the delinquent flag is set, filter by acreage and land use, show me the results in a table with navigation."&lt;/p&gt;
&lt;p&gt;Then I decided to make it a web app. I described the architecture I wanted: FastAPI on Lambda, Next.js on S3, DynamoDB for storage. Claude Code ported the Rust query logic to Python, built the FastAPI routes, created the React components, wrote the CDK infrastructure, and handled the deployment. Each feature was a conversation: "add Google OAuth," "add a deal pipeline with stages - make it look like Kanban," "generate offer letter PDFs," "add an AI investment summary using the Claude API."&lt;/p&gt;
&lt;p&gt;The codebase grew to 29,000 lines across 113 files in the initial commit. Later sessions added another 60 files and 5,000 lines for Wisconsin support, soil analysis, tax list imports, auction tracking, spatial search, and saved searches.&lt;/p&gt;
&lt;p&gt;I didn't write these lines. I directed them. There's a difference, and it matters.&lt;/p&gt;
&lt;p&gt;When I say "directed," I mean I made every architectural decision. I chose DynamoDB over PostgreSQL because I didn't want to manage a database. I chose Lambda over ECS because I didn't want to manage containers. I chose static export over SSR because I didn't want to manage a Node.js server. I chose to use a local LLM for PDF parsing instead of Claude API because the parsing is structured data extraction that doesn't need frontier model quality.&lt;/p&gt;
&lt;p&gt;Claude Code implemented these decisions. When something broke, I described the symptom and Claude Code diagnosed the cause. When I wanted a new feature, I described the behavior and Claude Code wrote the code. The feedback loop was: describe what I want, review what I get, deploy, test, describe what's wrong, iterate.&lt;/p&gt;
&lt;p&gt;Some things broke in interesting ways. DynamoDB doesn't accept Python floats; you have to convert everything to Decimal. The county field maps are reverse-keyed from what you'd expect (ArcGIS field names are the keys, common names are the values). Google OAuth redirect URIs need a trailing slash. CloudFront caches aggressively and you have to invalidate after every deploy. The Census TIGER API for county boundaries is painfully slow, so we downloaded the GeoJSON once and serve it as a static file. Each of these was discovered in production and fixed in conversation.&lt;/p&gt;
&lt;h3&gt;The Data Sources&lt;/h3&gt;
&lt;p&gt;The interesting part of DirtScout isn't the web framework. It's the data integration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Minnesota parcel data&lt;/strong&gt; comes from 11 different county ArcGIS REST services, each with its own field names, query syntax, and data quality. St. Louis County has &lt;code&gt;DELINQUENT_TAX_FLAG&lt;/code&gt; and &lt;code&gt;BAL_DUE&lt;/code&gt;. Aitkin has &lt;code&gt;DELINQUENT_FLAG&lt;/code&gt; (text: "YES"/"NO") and &lt;code&gt;BALDUE&lt;/code&gt;. Hennepin stores acreage in square feet (divide by 43,560). Goodhue stores acreage as a string that requires CAST in the SQL WHERE clause. Each county is a separate configuration with field mappings, WHERE clause templates, and normalization logic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Minnesota tax lists&lt;/strong&gt; come from 15 county PDFs and Excel files. Itasca County publishes an Excel file updated monthly. The rest publish PDF legal notices. The PDFs are processed by either the Claude API (Haiku model, cheapest tier) or a local Qwen3 32B running on the Strix Halo machine. The AI extracts parcel IDs, owner names, delinquent amounts, and addresses from the unstructured PDF text and returns structured JSON.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wisconsin parcel data&lt;/strong&gt; comes from a single statewide ArcGIS feature service maintained by the State Cartographer's Office. One endpoint, all 72 counties, standardized fields. Owner names, mailing addresses, assessed values, acreage, property class. No delinquent tax data in the GIS, but we supplement with 9 county-level PDF lists of tax-delinquent and tax-forfeited properties.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Environmental analysis&lt;/strong&gt; layers: FEMA NFHL for flood zones, NWI for wetlands, NHD for water bodies, Minnesota DNR County Well Index for well data, MPCA for contamination sites. Each is a separate ArcGIS REST service query using the parcel's centroid.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Soil analysis&lt;/strong&gt; comes from the USDA Soil Data Access REST API (SSURGO). A SQL query with the parcel's centroid returns soil components, drainage class, hydric rating, slope, farmland classification, and capability class. We compute a "buildability" score from these factors.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Land cover&lt;/strong&gt; comes from the USGS MRLC WMS service, querying the NLCD 2021 Land Cover layer. We sample the parcel area and return a breakdown by cover type: forest, agriculture, water, wetlands, developed, barren.&lt;/p&gt;
&lt;p&gt;Each of these integrations was built in conversation with Claude Code. "Add flood zone analysis using FEMA's service." "The NWI wetlands query needs table-prefixed field names." "The SSURGO soil query needs a WKT point geometry."&lt;/p&gt;
&lt;h3&gt;What Changed Since 2017&lt;/h3&gt;
&lt;p&gt;The PostgreSQL + PostGIS + Ruby on Rails stack I used nine years ago was the right choice for 2017. PostGIS let me do spatial queries locally. I had to store the parcel data because the ArcGIS services weren't reliable enough to query in real time. Rails rendered server-side because that's what Rails did.&lt;/p&gt;
&lt;p&gt;None of that is necessary anymore. The ArcGIS services are fast and reliable enough to query live. DynamoDB handles the persistence without a schema to manage. Lambda eliminates server management. Static export means the frontend is just files on S3.&lt;/p&gt;
&lt;p&gt;There's a personal angle here too. In graduate school, I spent an entire semester manually developing land cover classifications for a final project — hand-labeling training data, running supervised classification algorithms, validating results against ground truth. It was weeks of work for one study area. For DirtScout, I told Claude Code "add a buildability score based on soil drainage, hydric percentage, slope, and capability class" and had a working assessment in minutes. The SSURGO soil data query, the scoring logic, the frontend panel with color-coded ratings — all from a single conversation. The knowledge that took a semester to develop is now a commodity you can describe and deploy.&lt;/p&gt;
&lt;p&gt;But the bigger change is the development process. In 2017, I wrote every line of Ruby and SQL by hand. I designed the PostGIS schema, wrote the scraping scripts, built the Rails views, configured the Nginx proxy, set up the SSL certificates, and wrote the systemd service files. It took months of evenings and weekends for a single-county tool.&lt;/p&gt;
&lt;p&gt;In 2026, I built a two-state, multi-service platform with AI analysis, auction tracking, deal management, and offer letter generation in a series of conversations over a few days. The code isn't hand-crafted. I'm not interested in hand-crafted code when that's not the point. The point is finding undervalued rural land from delinquent tax records and making offers to motivated sellers. The code is the means. Claude Code made the means faster.&lt;/p&gt;
&lt;h3&gt;The On-Prem Angle&lt;/h3&gt;
&lt;p&gt;A tax list import worker runs on a Bosgame M5 mini PC in my basement.&lt;/p&gt;
&lt;p&gt;The worker exists because I didn't want to pay for Claude API calls to parse 24 county PDFs every week. The AMD Strix Halo has 128GB of RAM and runs Qwen3 32B through Ollama. The worker downloads each PDF, extracts text with pdfplumber (a Python library that does the PDF-to-text conversion locally, no model needed), then sends the extracted text to the local Ollama instance for structured JSON extraction. Each 2-page chunk takes 5-7 minutes on the 32B model. It's slower than a cloud API. It's also free.&lt;/p&gt;
&lt;p&gt;The worker is a systemd service that starts on boot and polls an SQS queue continuously. A weekly systemd timer enqueues an "import all" message every Monday morning.&lt;/p&gt;
&lt;p&gt;This is the &lt;a href="https://tinycomputers.io/posts/the-economics-of-owning-your-own-inference.html"&gt;economics of owning your own inference&lt;/a&gt; in practice. The frontier model handles the quality-sensitive work (AI investment analysis, parcel chat). The local model handles the batch extraction work. The split happens naturally based on the task requirements.&lt;/p&gt;
&lt;h3&gt;What It Does Now&lt;/h3&gt;
&lt;p&gt;The production site at dirtscout.land:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Searches delinquent tax parcels across 21 Minnesota counties (8 Tier 1 with full ArcGIS data, 2 Tier 2 with partial data, 2 Tier 3 with minimal data, 9 Tier 4 with imported tax list data)&lt;/li&gt;
&lt;li&gt;Browses raw land parcels across all 72 Wisconsin counties via the statewide parcel service&lt;/li&gt;
&lt;li&gt;Scores each MN parcel on a 0-100 scale (grades A through F) based on financial opportunity, road access, environmental factors, and land character&lt;/li&gt;
&lt;li&gt;Generates AI investment summaries using Claude Sonnet with full context: parcel data, land cover, environmental analysis, soil data, owner's other properties, and attached documents&lt;/li&gt;
&lt;li&gt;Tracks deals through a pipeline (prospecting, offer sent, negotiating, under contract, closed, dead) with offer letter PDF generation using three templates&lt;/li&gt;
&lt;li&gt;Monitors for new delinquent parcels daily via EventBridge-triggered Lambda scans, with email alerts&lt;/li&gt;
&lt;li&gt;Tracks tax forfeit auction dates across 8 Minnesota counties, with a floating widget showing upcoming auctions&lt;/li&gt;
&lt;li&gt;Imports delinquent tax lists from 15 MN and 9 WI county PDFs/Excel files weekly&lt;/li&gt;
&lt;li&gt;Provides environmental analysis (flood zones, wetlands, water bodies, wells, contamination), land cover classification (NLCD 2021), and soil analysis (SSURGO) for each parcel&lt;/li&gt;
&lt;li&gt;Shows parcel boundaries on satellite imagery, with an interactive explore map that loads parcel shapes at high zoom levels&lt;/li&gt;
&lt;li&gt;Manages parcel notes, file attachments (via S3 presigned URLs), shareable parcel links, and saved searches&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;What I'd Do Differently&lt;/h3&gt;
&lt;p&gt;I'd add geometry caching earlier. Every map view that shows parcel boundaries makes a live ArcGIS query with &lt;code&gt;returnGeometry=true&lt;/code&gt;, which is slower than querying attributes only. Caching the geometry in DynamoDB with a TTL would make the explore map significantly faster.&lt;/p&gt;
&lt;p&gt;I'd standardize the county configurations into a more declarative format. Right now each county is a Python dataclass with hand-tuned field mappings. A JSON configuration file that Claude Code could modify more easily would reduce the friction of adding new counties.&lt;/p&gt;
&lt;p&gt;I'd separate the frontend into a proper monorepo with shared types between the API client and the backend models. The current setup has TypeScript interfaces in the frontend that mirror Pydantic models in the backend, and they get out of sync when fields are added.&lt;/p&gt;
&lt;p&gt;But these are optimizations, not regrets. The system works. It finds land. It makes the research process faster. And it was built in conversations, not in sprints.&lt;/p&gt;</description><category>ai</category><category>arcgis</category><category>aws</category><category>claude code</category><category>dynamodb</category><category>fastapi</category><category>gis</category><category>infrastructure</category><category>land investing</category><category>leaflet</category><category>minnesota</category><category>next.js</category><category>python</category><category>react</category><category>real estate</category><category>wisconsin</category><guid>https://tinycomputers.io/posts/building-dirtscout-a-land-acquisition-platform-with-claude-code.html</guid><pubDate>Thu, 26 Mar 2026 01:00:00 GMT</pubDate></item><item><title>Investing in the Jevons Expansion</title><link>https://tinycomputers.io/posts/investing-in-the-jevons-expansion.html?utm_source=feed&amp;utm_medium=rss&amp;utm_campaign=rss</link><dc:creator>A.C. Jokela</dc:creator><description>&lt;div class="audio-widget"&gt;
&lt;div class="audio-widget-header"&gt;
&lt;span class="audio-widget-icon"&gt;🎧&lt;/span&gt;
&lt;span class="audio-widget-label"&gt;Listen to this article&lt;/span&gt;
&lt;/div&gt;
&lt;audio controls preload="metadata"&gt;
&lt;source src="https://tinycomputers.io/investing-in-the-jevons-expansion_tts.mp3" type="audio/mpeg"&gt;
&lt;/source&gt;&lt;/audio&gt;
&lt;div class="audio-widget-footer"&gt;16 min · AI-generated narration&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;This is the sixth piece in a series applying the Jevons Paradox framework to AI economics. The prior five built the theoretical case:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tinycomputers.io/posts/the-paradox-of-cheap-compute.html"&gt;The Paradox of Cheap Compute&lt;/a&gt; established the historical pattern: every time the cost of compute fell by an order of magnitude, total consumption expanded far beyond the efficiency gain.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tinycomputers.io/posts/the-jevons-counter-thesis-why-ai-displacement-scenarios-underweight-demand-expansion.html"&gt;The Jevons Counter-Thesis&lt;/a&gt; argued that AI displacement models systematically undercount the demand expansion that follows when cognitive labor gets cheaper.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tinycomputers.io/posts/moores-law-for-intelligence-what-happens-when-thinking-gets-cheap.html"&gt;Moore's Law for Intelligence&lt;/a&gt; mapped the inference cost curve and showed it mirrors early Moore's Law.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tinycomputers.io/posts/something-big-is-happening-a-critique.html"&gt;Something Big Is Happening, And Something Big Is Missing&lt;/a&gt; applied the framework to a specific displacement scenario and showed where the analysis breaks down.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tinycomputers.io/posts/the-ai-vampire-is-jevons-paradox.html"&gt;The AI Vampire Is Jevons Paradox&lt;/a&gt; identified the binding constraint: human judgment doesn't scale the way compute does.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This piece asks the practical question: if you believe the framework, what follows?&lt;/p&gt;
&lt;p&gt;I should be clear about what this is and what it isn't. This is not financial advice. I'm not recommending specific trades, allocations, or timing. What I'm doing is mapping a structural argument (Jevons-style demand expansion in AI) onto the physical and economic layers that expansion must pass through. The goal is to identify where expansion creates bottlenecks, because bottlenecks are where pricing power concentrates.&lt;/p&gt;
&lt;p&gt;The key insight is that you don't need to pick which AI company wins. You don't need to know whether OpenAI, Anthropic, Google, or some company that doesn't exist yet captures the application layer. What you need to identify are the fixed-supply inputs that &lt;em&gt;every&lt;/em&gt; AI company needs regardless of who wins. The expansion has to flow through certain physical chokepoints, and those chokepoints are investable.&lt;/p&gt;
&lt;h3&gt;The Framework in One Paragraph&lt;/h3&gt;
&lt;p&gt;For readers coming to this series fresh: Jevons Paradox describes what happens when a critical input gets dramatically cheaper. The intuitive expectation is that total spending on that input falls. The historical reality is the opposite: demand expands beyond the efficiency gain, and total consumption increases. Coal in the 19th century (as Jevons himself documented in &lt;a href="https://baud.rs/xjxPfz"&gt;&lt;em&gt;The Coal Question&lt;/em&gt;&lt;/a&gt;), transistors in the 20th, bandwidth in the 21st. The prior pieces in this series argue that AI inference costs are following the same curve, with the same structural conditions that produced Jevons outcomes in every prior case. If that argument holds, then what matters isn't whether AI gets more efficient; it's where the resulting demand expansion hits physical constraints.&lt;/p&gt;
&lt;h3&gt;The Objection That Isn't&lt;/h3&gt;
&lt;p&gt;The most common pushback I get on this series is some version of: "GPUs are hitting diminishing returns, capex is already enormous, and there's a natural ceiling on how far the expansion can go." Variations appear in coverage from &lt;a href="https://baud.rs/B5ATWQ"&gt;Northeastern&lt;/a&gt; and &lt;a href="https://baud.rs/bcFAl5"&gt;illuminem&lt;/a&gt;, often framed as a correction to the Jevons thesis.&lt;/p&gt;
&lt;p&gt;It's a reasonable-sounding objection. It's also wrong, and understanding &lt;em&gt;why&lt;/em&gt; it's wrong actually strengthens the Jevons case.&lt;/p&gt;
&lt;p&gt;The objection treats a technology-specific constraint as an input-level constraint. GPUs hitting diminishing returns doesn't mean &lt;em&gt;inference&lt;/em&gt; is hitting diminishing returns. It means GPUs are reaching the end of their particular S-curve. But GPUs aren't the only way to run inference. Custom ASICs, TPUs, NPUs, and novel architectures are opening entirely new cost curves &lt;em&gt;below&lt;/em&gt; the GPU curve. The GPU plateau isn't a ceiling; it's a handoff.&lt;/p&gt;
&lt;p&gt;The numbers are already visible. Broadcom controls roughly 70% of the custom AI ASIC market, reporting \$5.2 billion in AI semiconductor revenue in Q3 alone, with &lt;a href="https://baud.rs/zcsDXo"&gt;five major hyperscaler customers&lt;/a&gt; driving demand. &lt;a href="https://baud.rs/znj9ak"&gt;Marvell's custom XPU pipeline&lt;/a&gt; spans AWS, Google, Meta, and Microsoft, with AI revenue reaching \$2.6 billion in FY2026. Google's TPU transition from v6 to v7 delivered a &lt;a href="https://baud.rs/4aoJ1v"&gt;roughly 70% cost-per-token reduction&lt;/a&gt;. Taalas, a startup building hardwired inference chips, &lt;a href="https://baud.rs/QxPpqN"&gt;claims 1000x performance per watt&lt;/a&gt; versus general-purpose GPUs. Custom ASICs handle an estimated 20% of inference workloads today and are &lt;a href="https://baud.rs/eIj2sQ"&gt;projected to reach 70–75% by 2028&lt;/a&gt;, with custom ASIC shipments growing at 44.6% annually versus 16.1% for GPUs.&lt;/p&gt;
&lt;p&gt;Every prior Jevons cycle worked exactly this way. Newcomen's engine didn't just get incrementally better; it was replaced by Watt's engine, then Corliss, then turbines. Each new technology started a fresh S-curve before the previous one fully flattened. Moore's Law didn't ride a single technology either. As Chris Miller chronicles in &lt;a href="https://baud.rs/8MdhcB"&gt;&lt;em&gt;Chip War&lt;/em&gt;&lt;/a&gt;, bipolar gave way to NMOS, then CMOS, then FinFET, now gate-all-around. The pattern is always multiple overlapping S-curves, each beginning before the last one peaks.&lt;/p&gt;
&lt;p&gt;The data supports the mechanism: &lt;a href="https://baud.rs/O6Q4Tc"&gt;every 50% reduction in inference cost has been associated with a 200–300% increase in deployment&lt;/a&gt;. That's textbook Jevons elasticity.&lt;/p&gt;
&lt;p&gt;"Diminishing returns on GPUs" isn't a ceiling on inference. It's the moment the next technology takes over. That's the &lt;em&gt;mechanism&lt;/em&gt; of Jevons Paradox, not a counterpoint to it.&lt;/p&gt;
&lt;h3&gt;The Investment Layers&lt;/h3&gt;
&lt;p&gt;If Jevons-style expansion is real, it has to flow through physical infrastructure. I think about this in four layers, ordered from deepest (most expansion-certain) to shallowest (most speculative).&lt;/p&gt;
&lt;h4&gt;Layer 1: Energy and Power&lt;/h4&gt;
&lt;p&gt;Energy is the binding constraint. If AI demand expands at anything close to Jevons rates, someone has to generate the electricity. Data center electricity demand is on track to double this year, with the sector's total consumption &lt;a href="https://baud.rs/8hWfJa"&gt;surpassing Canada's national usage&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The structural problem is deeper than just demand growth. As Vaclav Smil details in &lt;a href="https://baud.rs/OMSIzZ"&gt;&lt;em&gt;Energy and Civilization&lt;/em&gt;&lt;/a&gt;, energy transitions are slow precisely because the physical infrastructure is massive and long-lived. Roughly 70% of the U.S. electrical grid was built between the 1950s and 1970s. Much of it is approaching end-of-life at the exact moment AI is driving the largest incremental demand increase in decades. This isn't a problem that resolves quickly. Power plants take years to permit and build. Grid transmission upgrades take longer.&lt;/p&gt;
&lt;p&gt;Nuclear is where the smart money is moving. Constellation Energy's merger with Calpine creates a fleet of 21 nuclear reactors plus 50 natural gas plants, essentially a baseload power platform positioned for AI demand. Amazon signed a 1.92 GW power purchase agreement at Susquehanna and committed \$500 million to small modular reactor development. These aren't speculative bets on future demand; they're capacity commitments predicated on demand that's already contractually visible.&lt;/p&gt;
&lt;p&gt;Hyperscaler capital expenditure tells the same story: \$602 billion planned for 2026, roughly 75% tied to AI infrastructure. Goldman Sachs estimates cumulative AI infrastructure spending of \$1.15 trillion between 2025 and 2027. That capital has to buy electricity, and the electricity has to come from somewhere.&lt;/p&gt;
&lt;h4&gt;Layer 2: Physical Infrastructure&lt;/h4&gt;
&lt;p&gt;Between the power plant and the GPU sits an enormous amount of physical equipment: transformers, switchgear, power distribution units, cooling systems, racks, cabling. This is the picks-and-shovels layer; it benefits regardless of which AI stack wins.&lt;/p&gt;
&lt;p&gt;Eaton reported data center orders up 70% year-over-year. Transformers have become a bottleneck, with lead times stretching to 18+ months for large power transformers. Vertiv, which makes power management and thermal systems, is sitting on a \$9.5 billion backlog. Liquid cooling, once a niche technology, is becoming standard for high-density AI compute racks.&lt;/p&gt;
&lt;p&gt;Grid transmission and distribution may be the most underappreciated bottleneck. You can build a data center in 18 months. Getting grid interconnection can take three to five years. The physical infrastructure required to move power from generation to consumption is the constraint that's hardest to accelerate, and it benefits from AI expansion regardless of which models, chips, or cloud providers ultimately dominate.&lt;/p&gt;
&lt;h4&gt;Layer 3: Custom Silicon&lt;/h4&gt;
&lt;p&gt;The GPU-to-ASIC transition described above isn't just evidence that the Jevons expansion continues; it's itself a Jevons trigger. Each new silicon architecture that enters production at lower cost-per-token reopens the demand curve.&lt;/p&gt;
&lt;p&gt;Broadcom's AI semiconductor revenue is &lt;a href="https://baud.rs/9Hp791"&gt;doubling year-over-year to roughly \$8.2 billion in Q1 FY2026&lt;/a&gt;. Marvell's custom XPU pipeline is expanding across all major hyperscalers. Both companies are positioned on the ASIC side of the GPU-to-ASIC transition, the side that's growing at 44.6% versus 16.1%.&lt;/p&gt;
&lt;p&gt;Nvidia still dominates training workloads, and Blackwell delivers a &lt;a href="https://baud.rs/5ns8n0"&gt;10x cost-per-token reduction for open-source inference models&lt;/a&gt;, which is itself a massive Jevons input. But inference is bifurcating. Training demands flexibility and programmability (Nvidia's strength). Inference at scale demands efficiency and cost optimization (where ASICs excel). The market is splitting, and both sides drive expansion.&lt;/p&gt;
&lt;h4&gt;Layer 4: The Application Tier&lt;/h4&gt;
&lt;p&gt;This is where it gets speculative. Cloud providers and hyperscalers function as toll booths; they collect revenue proportional to total compute consumed, making them natural beneficiaries of demand expansion. But the application tier above them is where you're picking winners, not betting on expansion itself.&lt;/p&gt;
&lt;p&gt;AI-native companies become viable only at cheaper inference price points. The legal tech startup that can offer document review at one-tenth the cost of a junior associate doesn't exist at \$20 per million tokens. It might exist at \$2. It definitely exists at \$0.20. Each step down the cost curve unlocks a new tier of applications.&lt;/p&gt;
&lt;p&gt;The contrarian opportunity in this layer is latent demand: the markets that don't exist yet because the service was too expensive for most people. Roughly 80% of Americans who need a lawyer can't afford one. Most small businesses can't afford financial planning. Most students can't afford tutoring. If inference costs follow a Jevons trajectory, these aren't aspirational markets; they're inevitable markets. But investing in them means picking which company captures each one, which is a fundamentally different bet than investing in the infrastructure that serves all of them.&lt;/p&gt;
&lt;h3&gt;Who Else Is Making This Bet&lt;/h3&gt;
&lt;p&gt;This framework isn't contrarian anymore. &lt;a href="https://baud.rs/Wy7mZE"&gt;Satya Nadella tweeted&lt;/a&gt; "Jevons paradox strikes again!" when DeepSeek demonstrated cheaper inference without reducing demand. Microsoft's AI revenue hit \$13 billion, up 175% year-over-year. &lt;a href="https://baud.rs/xdNj4l"&gt;Fortune noted&lt;/a&gt; that Nadella's optimism was explicitly grounded in the paradox: cheaper AI means more AI, not less.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://baud.rs/aRLPY8"&gt;Andreessen Horowitz made the economic case directly&lt;/a&gt;: cheaper tokens unlock more demand than efficiency saves. Their thesis is that foundation model economics follow the same curve as prior compute economics: falling costs expand the addressable market faster than they reduce per-unit revenue.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://baud.rs/Qcm7AN"&gt;NPR's Planet Money covered the thesis&lt;/a&gt; in mainstream terms, bringing Jevons Paradox from an obscure 19th-century economic observation to a household framework for understanding AI economics. &lt;a href="https://baud.rs/V6W8hJ"&gt;Nathan Witkin's analysis&lt;/a&gt; showed that employment in software development, translation, and radiology &lt;em&gt;increased&lt;/em&gt; after GPT-3, exactly the demand expansion the model predicts. &lt;a href="https://baud.rs/KUEJyl"&gt;Markman Capital&lt;/a&gt; called the "flawed consensus" of GPU diminishing returns "one of the most dangerous misreadings of the current market."&lt;/p&gt;
&lt;p&gt;&lt;a href="https://baud.rs/rD0Spu"&gt;Deloitte&lt;/a&gt;, McKinsey, and Bain are all projecting massive infrastructure buildout. &lt;a href="https://baud.rs/8hWfJa"&gt;McKinsey's \$7 trillion estimate&lt;/a&gt; for data center scaling reflects the same underlying logic: if demand expands as costs fall, the physical infrastructure to support it is the bottleneck.&lt;/p&gt;
&lt;p&gt;Jevons went from an obscure economics reference to a mainstream investment framework in roughly twelve months. That's not because it's trendy; it's because the data keeps confirming the pattern.&lt;/p&gt;
&lt;h3&gt;Where the Thesis Could Be Wrong&lt;/h3&gt;
&lt;p&gt;Intellectual honesty requires mapping the failure modes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Demand elasticity might be lower than historical precedent.&lt;/strong&gt; Every prior Jevons cycle involved inputs with massive latent demand: coal for industrial heat, transistors for consumer electronics, bandwidth for media. AI inference might not have the same depth of latent demand. If the tasks AI performs well are narrower than the tasks coal or transistors enabled, the expansion could stall earlier than the model predicts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Regulatory intervention could cap the expansion.&lt;/strong&gt; Energy policy, AI regulation, data center permitting restrictions. Any of these could artificially constrain the physical infrastructure that the expansion requires. Jevons Paradox describes an economic dynamic, not a law of physics. It can be overridden by policy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The biological ceiling is real.&lt;/strong&gt; As I argued in &lt;a href="https://tinycomputers.io/posts/the-ai-vampire-is-jevons-paradox.html"&gt;The AI Vampire Is Jevons Paradox&lt;/a&gt;, human judgment is the input that doesn't scale. If every Jevons expansion in AI ultimately concentrates demand on human decision-making, and human decision-making has genuine cognitive limits, the expansion hits a different kind of constraint, one that can't be solved with more silicon or more power.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Timing risk is the most likely failure mode.&lt;/strong&gt; The direction of the thesis could be correct while the timeline is wrong. Infrastructure bottlenecks might resolve more slowly than demand builds, creating periods of overinvestment followed by correction. The historical base rate favors Jevons, but base rates describe probabilities, not certainties. Plenty of investors have been right about the direction and still lost money because they were wrong about the timing.&lt;/p&gt;
&lt;h3&gt;The Physical Footprint of Expansion&lt;/h3&gt;
&lt;p&gt;The deepest layers (energy and physical infrastructure) are the safest Jevons bets. They benefit from AI demand expansion regardless of which models, chips, or companies win. You don't need to know whether GPT-7 or Claude 6 is the better model to know that both of them will need electricity, transformers, cooling, and grid capacity.&lt;/p&gt;
&lt;p&gt;The further up the stack you go, the more you're picking winners rather than betting on expansion. Custom silicon is a strong middle ground: the GPU-to-ASIC transition is structural, and the companies positioned on the right side of it have visible demand. But the application tier is where the uncertainty concentrates, and that's where most retail investors focus their attention.&lt;/p&gt;
&lt;p&gt;The expansion has a physical footprint. Every token generated requires electricity. Every data center requires grid interconnection. Every custom ASIC requires a fab slot. Every cooling system requires water. The Jevons expansion, if it plays out as the framework predicts, will be visible not in stock prices or earnings calls but in the physical world: in power generation capacity, in transformer lead times, in grid interconnection queues, in cooling system orders.&lt;/p&gt;
&lt;p&gt;Jevons won't announce itself. It never does. It shows up in electricity bills, in transformer backorders, in cooling system lead times, in the quiet scramble to secure power purchase agreements years in advance. The signal isn't in what people say about AI. It's in what they're building to support it.&lt;/p&gt;</description><category>ai</category><category>asic</category><category>data centers</category><category>economics</category><category>energy</category><category>gpu</category><category>infrastructure</category><category>investing</category><category>jevons paradox</category><category>nuclear</category><category>semiconductors</category><category>utilities</category><guid>https://tinycomputers.io/posts/investing-in-the-jevons-expansion.html</guid><pubDate>Thu, 05 Mar 2026 14:00:00 GMT</pubDate></item></channel></rss>