#4069: How AI Is Rewriting Your Tech Stack Choices

What happens when AI agents change how we pick frameworks, ORMs, and databases?

Featuring
Listen
0:00
0:00
Episode Details
Episode ID
MWP-4248
Published
Duration
36:21
Audio
Direct link
Pipeline
V5
TTS Engine
chatterbox-regular
Script Writing Agent
deepseek-v4-pro

AI-Generated Content: This podcast is created using AI personas. Please verify any important information independently.

A developer running a custom fork of the open-source inventory system Homebox noticed that his stack — Go backend, Vue frontend with Nuxt and TypeScript, Postgres database, and Drizzle ORM — quietly eliminated two tools he used to need: a dedicated migration manager and a separate type-checking tool. Drizzle generates TypeScript types directly from the schema at build time and handles migrations declaratively in one pass. This observation sparked a deeper question about how we make stack decisions in an era where AI agents are writing more production code.

The old logic was straightforward: pick what your team knows. If the team speaks Python, reach for Django or FastAPI. But AI code generation tools like Claude and Copilot don't have team fluency — they have training data fluency. That changes the calculus entirely. JavaScript remains the most-used language at 62.3% of Stack Overflow respondents, while Go sits at 14.5% but commands the highest median salary correlation. Go developers are rarer, but the projects using Go tend to be more architecturally deliberate. The tradeoff: fewer libraries and framework options, but a standard library that covers net/http, database/sql, and encoding/json — enough to build a production API with zero external frameworks.

The real insight comes from mapping out every component, visible and invisible. On the surface, Daniel's stack looks like five things: Go, Vue, Nuxt, Postgres, Drizzle. But production reality adds a reverse proxy, process manager, CI/CD pipelines, monitoring, logging, auth middleware, API documentation, environment configuration, and database connection pooling — easily twelve to thirteen components. Each is a decision point that either adds or removes something from the maintenance checklist. The AI angle introduces a completely new criterion: how well does the AI tooling know this stack? If Claude and Copilot can generate reliable code for your framework choices, velocity goes up. If they can't, you're fighting the tools. Daniel's bet — that architectural fit outweighs ecosystem popularity — might be getting smarter as AI agents improve their coverage of less common stacks.

Downloads

Episode Audio

Download the full episode as an MP3 file

Download MP3
Transcript (TXT)

Plain text transcript file

Transcript (PDF)

Formatted PDF with styling

#4069: How AI Is Rewriting Your Tech Stack Choices

Corn
Daniel sent us this one — he's been running a fork of an open-source inventory management system called Homebox, customized for his own needs. The backend is Go, the frontend is Vue with Nuxt and TypeScript, the database is Postgres, the ORM is Drizzle. And here's what he noticed: this stack eliminated two things he used to need. No dedicated migration manager, no separate type-checking tool. vanished from the requirements list. And that got him thinking — if a few smart component choices can quietly delete whole categories of tooling, what does that say about how we're making stack decisions now, versus how we'll make them when AI agents are writing more of the code?
Herman
The timing on this is perfect, because I've been watching something shift in how developers talk about their stacks. It used to be, what does the team already know? End of conversation. But with AI code generation — Claude, Copilot, GPT-4o — generating more production code every month, that question is flipping. Now it's, what makes architectural sense? What components actually fit together without creating downstream maintenance nightmares? And that changes everything about how you compose a backend.
Corn
Right, because the old logic was straightforward. If your team knows Python, you reach for Django or FastAPI. If they know JavaScript, Express or Next. The fluency argument was the trump card in every stack debate. But when an AI agent is scaffolding your API endpoints, it doesn't have team fluency. It has training data fluency. And that's a very different thing.
Herman
And what Daniel's stack demonstrates — Go, Vue, Nuxt, Postgres, Drizzle — is that you can make architectural choices that actually reduce the total number of components you have to manage. His ORM handles migrations and type generation in one pass. His frontend framework bakes in server-side rendering and routing. His backend language compiles to a single binary. Each choice removes something from the maintenance checklist. But here's the thing — even this supposedly lean stack, when you actually map out every piece, balloons to ten or more components.
Corn
That's what I want to sit with for a second. Because Daniel's question isn't just, what's in my stack? It's, why do certain stacks dominate, and is the pick-and-mix approach — grab the best tool for each layer — actually viable, or are you better off leaning into a pattern that someone else already debugged?
Herman
He wants us to walk through every component. The obvious ones and the invisible ones. The stuff that's in the repo and the stuff that's in the deploy script and the stuff that only exists because it broke once and someone added a health check.
Corn
Which, by the way, is exactly the kind of question you'd expect from someone who's been maintaining a real system. You don't ask about the hidden components until you've been burned by one.
Herman
No, you definitely don't. So let's start by laying out exactly what we mean when we say a modern data-driven app stack — because it's a lot more than just the code you write. Daniel's system is an inventory manager. It tracks items, locations, labels, quantities. It has a REST API, a web frontend, authentication, database migrations. On the surface, you look at it and think, okay, Go backend, Vue frontend, Postgres database, Drizzle ORM — four things. Maybe five if you count Nuxt separately. But that's like saying a car is an engine, four wheels, and a steering wheel.
Corn
The moment you need it to actually run in production, the component count explodes. You need a reverse proxy. You need a process manager or a container runtime. You need CI/CD. You need monitoring, logging, backups. You need some kind of auth token management. You need API documentation if anyone else is going to use it. You need environment configuration. You need database connection pooling. And every single one of those is a decision point where you could pick something different — or pick something that fights with everything else you've chosen.
Herman
This is where the Stack Overflow survey data from last year is instructive. JavaScript remains the most commonly used language — sixty-two point three percent of respondents, twelfth year running. TypeScript has climbed to thirty-eight point nine percent. Go sits at fourteen point five percent, but here's the interesting part — Go has the highest median salary correlation. Which tells you something about supply and demand. Go developers are rarer, but the projects that use Go tend to be higher-stakes, higher-budget, and often more architecturally deliberate.
Corn
The Go choice in Daniel's stack isn't random. It's a bet on simplicity and performance at the cost of ecosystem size. Fewer libraries, fewer framework options, but what's there is solid and the standard library covers an unusual amount of ground. net/http, database/sql, encoding/json — you can build a production API with zero external frameworks. That's not true in Node or Python, where you're almost certainly reaching for Express or FastAPI before you write your first endpoint.
Herman
That's one of those architectural decisions that cascades. If your backend language gives you a production-grade HTTP server in the standard library, you've eliminated a framework dependency. One less thing to audit, update, and worry about breaking changes on. But the tradeoff is, you're writing more boilerplate. You don't get the convenience methods and middleware ecosystems that come with Express or FastAPI. So the question becomes — is eliminating a dependency worth writing more code? And the answer changes depending on whether you're a solo developer, a small team, or a large organization.
Corn
Which is exactly the kind of tension Daniel's question is getting at. The pick-and-mix approach — Go here, Vue there, Drizzle for the ORM, Postgres for the database — gives you the best tool for each layer. But it also means you're the one responsible for making them work together. There's no opinionated framework that's already decided how auth talks to the database or how migrations run in CI. You're the architect for all of that glue.
Herman
That's where the AI angle gets really interesting. Because historically, the argument against pick-and-mix was coordination cost. If you have a twenty-person team and everyone needs to understand Go for the backend, TypeScript for the frontend, Drizzle for the ORM, Postgres for the database, and the idiosyncratic ways they interact, your onboarding time is long and your bus factor is low. But if AI agents can generate the glue code — the middleware, the configuration, the deployment scripts — suddenly that coordination cost drops. The AI doesn't care that it's stitching together five different ecosystems. It just generates what's statistically likely to work based on its training data.
Corn
Which brings us right back to the training data problem. Because if the AI's training data is dominated by JavaScript, TypeScript, and Python, then the glue code it generates for a Go backend might be spottier. It might hallucinate libraries that don't exist or write patterns that are idiomatic in Node but weird in Go. So the pick-and-mix approach becomes more viable with AI, but only if your particular mix has good training data coverage.
Herman
That's a completely new criterion for stack selection that didn't exist three years ago. You used to evaluate a stack on technical merit, ecosystem maturity, hiring availability, and maybe vendor risk. Now you also have to ask: how well does the AI tooling know this stack? Because if Claude and Copilot can generate reliable code for your framework, your velocity goes up. If they can't, you're fighting the tools.
Corn
Daniel's stack — Go, Vue, Nuxt, Postgres, Drizzle — is actually a fascinating test case. Go has decent AI training data coverage, but it's not JavaScript. Vue and Nuxt have good coverage because they're in the JavaScript ecosystem. Drizzle is newer, so its training data footprint is smaller than Prisma's. Postgres is universal. The stack as a whole is a bet that architectural fit — the right tool for each job — outweighs ecosystem popularity. And with AI agents getting better at Go every month, that bet might be getting smarter over time.
Herman
Let's actually walk through every layer of this stack. Because Daniel asked us to iterate through all the major and minor pieces, and along the way explain where the architectural decisions were made. I think the best way to do that is to start at the bottom — the database — and work our way up through the ORM, the backend language, the API layer, auth, the frontend, and then all the invisible infrastructure that makes the whole thing actually run.
Corn
Before you dive into Postgres specifics, I want to flag something Daniel mentioned that a lot of people miss. His stack eliminated two tools — a dedicated migration manager and a type-checking tool. That didn't happen by accident. Drizzle generates TypeScript types directly from the schema at build time, and its kit handles migrations declaratively. So two components just... And that's the kind of thing you only notice when you actually map out everything your app depends on.
Herman
Right, and that's the thesis of this whole walkthrough. We're not just cataloguing components — we're looking at where architectural decisions cascade. Why did Daniel choose Drizzle over Prisma? Why Go over Node? Why Postgres over SQLite? Each choice either adds or removes something from the maintenance checklist. And those decisions are increasingly being made in a world where AI agents are writing more of the code, which means the old rule — pick what the team knows — is losing ground to, pick what makes architectural sense.
Corn
The Stack Overflow numbers from last year tell an interesting story here. JavaScript at sixty-two point three percent, twelfth year as the most-used language. TypeScript climbing to thirty-eight point nine. Go at fourteen point five — but with the highest median salary correlation of any language in the survey. That gap between usage share and salary tells you something about where Go gets deployed. It's not the default choice. It's the deliberate choice. People reach for Go when they've thought hard about concurrency, deployment footprint, and long-term maintenance.
Herman
Postgres tells a similar story on the database side. It's not the only relational database, but it's become the default serious choice. ACID compliance, extensions like PostGIS and pgvector, rock-solid JSON support — it can be a relational database and a document store and a vector database all at once. Which means you're not bolting on MongoDB for one feature and Pinecone for another. One database, fewer moving parts.
Corn
Here's the thing — even with those deliberate choices, Daniel's stack still mushrooms. Go, Vue, Nuxt, Postgres, Drizzle — that's five names. But the moment you need this thing to actually serve traffic, you've got a reverse proxy, a process manager, CI/CD pipelines, monitoring, logging, auth middleware, API documentation, environment config, database connection pooling. You're at twelve, thirteen components easy. And every single one is a decision point.
Herman
Which is exactly why we're going to walk through every layer. The obvious ones and the invisible ones. And at each layer, we'll ask: what problem does this solve, what alternatives were available, and what does this choice imply for everything above and below it?
Herman
It's the foundation. Everything else sits on top of it, and the database choice constrains more downstream decisions than anything else in the stack. In Daniel's case, the database layer actually makes an architectural decision that's easy to overlook. Homebox supports two database backends — SQLite for single-user mode, Postgres for multi-user. That's not just a feature checkbox. That's a deliberate tradeoff in deployment complexity.
Corn
Because SQLite is zero-configuration. No separate server process, no connection management, no authentication. The database is a file. For a single user running this on a home server or a Raspberry Pi, that's perfect. You eliminate the entire database server component from your stack. But the moment you have multiple users hitting the API concurrently, SQLite's single-writer limitation becomes a bottleneck, and suddenly you need Postgres.
Herman
That's the first place where Daniel's stack makes a real architectural choice rather than just following a pattern. Postgres as the single source of truth. Not Postgres plus Redis for caching, not Postgres plus MongoDB for document storage, not Postgres plus Elasticsearch for full-text search. And that works because Postgres has absorbed so many capabilities that used to require separate databases. Need JSON columns? Need full-text search? Built-in tsvector. Need geospatial queries? Need vector search for AI embeddings?
Corn
The polyglot persistence argument — use the right database for each data shape — made a lot of sense in twenty twelve. But in practice, every additional database is another thing to back up, another thing to monitor, another thing that can fail in a way that's subtly different from everything else. Postgres as the single source of truth means you have one operational surface to manage. One set of replication semantics. One backup strategy.
Herman
For an inventory management system, the data model is fundamentally relational. You've got items, locations, labels, categories, quantities — these are tables with foreign keys. Trying to model that in a document store would be a nightmare of denormalization and eventual consistency bugs. So Postgres isn't just the pragmatic choice here — it's the correct one. The architectural decision was really about whether to also bolt on anything else, and the answer was no.
Corn
Which brings us up a layer to the ORM. And this is where things get interesting, because Daniel chose Drizzle, and that choice is doing a surprising amount of work in his stack.
Herman
Drizzle's core architectural bet is that an ORM should be thin. It doesn't have a runtime engine. When you write a query in Drizzle, it generates the SQL at build time — not at runtime. That means the query that runs against Postgres is exactly the SQL you'd write by hand, just type-checked and composable. Prisma, by contrast, has a Rust-based query engine that runs as a separate process. It introspects your database, builds a query plan, and executes it. More abstraction, more moving parts, more things that can go wrong in production.
Corn
The cascading effect is what Daniel noticed. Because Drizzle generates TypeScript types directly from your schema definitions at build time, you don't need a separate type-checking tool. The types are inferred. You change the schema, you regenerate, and TypeScript tells you everywhere in your codebase that's now broken. That's two tools — migration manager and type checker — collapsed into one library.
Herman
Drizzle Kit handles migrations declaratively. You define your schema in TypeScript, run drizzle-kit generate, and it produces SQL migration files. Apply them with drizzle-kit migrate. There's no separate migration framework to configure, no bespoke migration DSL to learn. And because the migrations are just SQL files, you can read them, audit them, and if necessary hand-edit them. Prisma's migration system is more opinionated — it generates its own migration format and applies them through its own engine.
Corn
The tradeoff is ecosystem maturity. Prisma has been around longer, has more documentation, more community examples, and better AI training data coverage. If you ask Claude to write a database query with Prisma, it'll probably get it right. Drizzle is newer, so the training data is thinner. You might get a hallucinated method name or a pattern that's from an older version. So Daniel's choice of Drizzle is a bet on architectural simplicity over ecosystem familiarity. And that bet only works if you're comfortable reading Drizzle's documentation directly rather than relying on AI to get it right every time.
Herman
Which loops back to something we touched on earlier — the pick-and-mix approach means you're the one responsible for understanding how each piece works. There's no framework that's already decided Drizzle is the ORM. You chose it, so you own the integration. But what you get in return is a dramatically smaller deployment footprint. No Prisma engine binary to ship, no separate schema file in a custom format, no runtime query planning overhead. Just typed functions that produce SQL strings.
Corn
Next layer up — the backend language itself. And this is probably the most consequential architectural decision in the whole stack, because it shapes how everything above and below it gets wired together.
Herman
Go's standard library is unusually complete for a modern language. net/http gives you a production-grade HTTP server with connection multiplexing, timeouts, and TLS support. database/sql gives you a connection pool with prepared statement caching. encoding/json handles serialization. You can build a fully functional REST API without importing a single third-party package. That's not a party trick — it's an architectural property. Every dependency you don't add is a dependency you never have to audit, update, or troubleshoot.
Corn
Compare that to Node, where the standard library's HTTP server is deliberately low-level and almost everyone reaches for Express or Fastify before writing their first route. Or Python, where you're probably pulling in FastAPI or Flask. Those frameworks aren't bad — they're excellent — but they're additional components. They have their own release cycles, their own breaking changes, their own security advisories. Go lets you defer the framework decision indefinitely, or avoid it entirely.
Herman
The goroutine model is the other piece. Go's concurrency isn't bolted on with async/await syntax or a third-party event loop — it's built into the runtime. You spawn a goroutine with the go keyword, and the scheduler handles the rest. For an API server handling concurrent requests, that means each request is naturally isolated, stack management is efficient, and you're not accidentally blocking the event loop because someone wrote a synchronous file read.
Corn
Then there's the deployment artifact. Go compiles to a single static binary. No runtime to install, no virtual environment to activate, no node modules directory with eighteen thousand files. You copy one binary to a server and run it. For a self-hosted inventory system that someone might be running on a NAS or an old laptop in a closet, that's a genuine operational advantage.
Herman
The tradeoff, as we mentioned earlier, is boilerplate. Go's error handling is explicit — if err!= nil after every function call. There's no decorator syntax for route definitions. Middleware chaining is more manual than Express's app.You write more lines of code to accomplish the same thing. But for a system like Daniel's, where the API surface is well-defined and unlikely to change radically, that boilerplate is a one-time cost. You pay it once, and then you have a codebase with zero magic.
Corn
Which brings us to the API layer itself. Daniel's system uses REST — that's the Homebox default. And for an inventory system with well-defined CRUD operations, REST is the pragmatic choice. You've got items, locations, labels — each is a resource with standard create, read, update, delete semantics. REST maps cleanly onto that.
Herman
The decision cascades. REST means you probably want OpenAPI or Swagger documentation so other people — or your future self — can understand the endpoints. That's another component. If Daniel had chosen GraphQL, he'd need Apollo Server or Relay on the backend, and a whole different approach to caching and error handling. gRPC would mean protocol buffers, a separate compilation step, and a different debugging workflow. Each API paradigm brings its own toolchain, and the toolchain is part of the stack whether you list it or not.
Corn
Where does authentication live in this stack? Homebox uses JWT tokens — stateless auth. The token gets validated in Go middleware, probably using something like chi's middleware package or a hand-rolled check. No Redis session store required. No external auth service. That's a deliberate simplification.
Herman
Which is the right call for a self-hosted inventory system. You're not running a multi-region deployment with millions of users. You don't need distributed session state. JWT with a reasonable expiry — say, twenty-four hours — and maybe a token blacklist for revocation if you're feeling thorough. The architectural win here is that auth doesn't add a new component to the stack. It's just Go code.
Corn
If Daniel had chosen stateful sessions, suddenly there's a Redis dependency. Redis needs to be configured, monitored, backed up, secured. One architectural decision — stateless versus stateful auth — is the difference between five components and seven. And these are the kinds of things you don't see in a README.
Herman
Which is the perfect segue into the frontend. Because Daniel's frontend choices are doing the same kind of quiet component elimination that Drizzle did on the backend. Vue plus Nuxt plus TypeScript. That combination is worth unpacking, because the alternatives would have added different things to the maintenance checklist.
Corn
We've covered the obvious components — database, ORM, backend language, API layer, auth. But there's a whole second tier of components that are invisible until they break. And the frontend is where that second tier starts to surface, because the framework choice determines how much of the deployment and build infrastructure you're managing yourself versus getting for free.
Herman
Let's start with why Vue plus Nuxt rather than React plus Next, or SvelteKit. Nuxt's architectural bet is that a frontend framework should give you server-side rendering, file-based routing, and auto-imports out of the box. You create a file in the pages directory, and it's a route. You put a component in the components directory, and it's available everywhere without an import statement. That's two categories of boilerplate — route definitions and import management — that simply don't exist in a Nuxt project.
Corn
TypeScript on top of Vue adds a compilation step, which sounds like it's adding complexity, but it's actually removing a whole category of runtime errors. A mistyped prop name, a wrong function signature, a null value where you expected an object — TypeScript catches those at build time. In plain JavaScript, you'd need either Flow, which is effectively dead, or JSDoc annotations, which are opt-in and easy to neglect. So TypeScript isn't an extra tool in this stack — it's the tool that eliminates the need for a separate type-checking workflow.
Herman
Contrast with React plus Next.Next is excellent — it's probably the most polished React metaframework — but the React ecosystem tends to pull in more dependencies. State management libraries, routing libraries, form handling libraries. React itself is more of a library than a framework, so you're making more decisions about how to structure things. Vue with Nuxt is more opinionated, which means fewer decisions to make and fewer packages to audit.
Corn
SvelteKit is the other interesting comparison. It's architecturally similar to Nuxt in a lot of ways — file-based routing, SSR by default, compiled output. But Svelte's ecosystem is smaller, its AI training data coverage is thinner, and hiring Svelte developers is harder. For a solo developer maintaining a fork, that might not matter. For a team that might grow, it does.
Herman
This is where the hidden components start to pile up. Because once you've chosen your frontend framework, you now need a build pipeline. Nuxt handles that with its own CLI, but you still need Node installed, dependencies managed, and a CI step that runs the build. You need a reverse proxy — Caddy or Nginx — to serve the built frontend and route API requests to the Go backend. That's two more components that aren't in the codebase but are absolutely essential to the running system.
Corn
Caddy versus Nginx is itself an architectural decision. Caddy handles HTTPS automatically via Let's Encrypt — zero configuration. Nginx gives you more fine-grained control but requires you to manage certificates yourself, probably with certbot. For a self-hosted system, Caddy's automatic TLS is a genuine reduction in operational complexity. One less cron job to monitor, one less renewal failure to debug at two in the morning.
Herman
Then there's the process manager. If you're running on bare metal, you need systemd unit files to keep the Go binary running and restart it if it crashes. If you're using Docker, you need a Dockerfile and a compose file or a Kubernetes manifest. Either way, you've added a component that defines how your application stays alive. And Docker itself is a component — the daemon, the image registry, the networking layer. Every abstraction you add to simplify deployment also adds something you have to understand when it breaks.
Corn
CI/CD is the next invisible layer. Daniel's stack probably uses GitHub Actions — a YAML file in the repo that runs tests, builds the frontend, compiles the Go binary, and maybe pushes a Docker image. That YAML file is a component. It has dependencies on specific action versions, it can break when GitHub changes its runner images, and it needs to be maintained alongside the application code. If you're not using GitHub Actions, you're using something else — GitLab CI, CircleCI, a hand-rolled deploy script — but you're using something.
Herman
Monitoring and logging are the ones that people forget until the first production incident. At minimum, you need structured logging — the Go backend writing JSON logs to stdout, collected by systemd-journald or Docker's log driver. You probably want a health-check endpoint that your reverse proxy or process manager can ping. If you're more sophisticated, you add Prometheus for metrics and Grafana for dashboards. That's two more components — or four, if you count the exporters and the dashboard configuration as separate concerns.
Corn
Postgres needs a backup strategy — pg_dump at minimum, maybe WAL archiving for point-in-time recovery. That's a cron job or a scheduled container. It's not in the repo, but if you don't have it, you don't have a production system. You have a ticking time bomb.
Herman
If we tally this up — reverse proxy, process manager, CI/CD pipeline, monitoring, logging, health checks, backups — we're at seven invisible components. Add those to the five visible ones, and Daniel's lean stack is actually a twelve-component system. And that's before you count things like the operating system, the network configuration, or the DNS records.
Herman
Where does this leave us? Let me give you three concrete takeaways you can use the next time you're choosing a stack.
Corn
First one's almost deceptively simple. Map out every component. Not just the language, the framework, the database — all of it. The reverse proxy, the CI pipeline, the monitoring, the logging, the auth mechanism, the migration strategy, the type checking. Write them down. Because you can't eliminate what you don't know you have.
Herman
Daniel's stack is a perfect case study in how this pays off. He didn't set out to eliminate tools. He chose Drizzle because it was a thin ORM that generated typed SQL, and TypeScript because it caught errors at build time. The fact that those two choices made a dedicated migration manager and a separate type-checking tool unnecessary — that was the downstream effect, not the initial goal. But once you see it, you can't unsee it. Every component you eliminate is a component you never have to update, never have to troubleshoot at two in the morning, never have to explain to a new team member.
Corn
The corollary is, when you're comparing two stacks, don't just compare the obvious pieces. Compare the total component count. A stack that looks simpler on the surface — say, Node plus Express plus Prisma plus React plus Next — might actually have more moving parts than Go plus Vue plus Nuxt plus Drizzle, once you factor in the Prisma query engine binary, the Node module tree, the Next build pipeline idiosyncrasies, and the middleware packages Express pulls in. The visible simplicity of a familiar ecosystem can hide real operational complexity.
Herman
Second takeaway — and this one's going to be controversial in some circles — for solo developers and small teams, pick-and-mix is not just viable. It's optimal. The argument against heterogeneous stacks has always been coordination cost. If you've got twenty developers and everyone needs to be productive across Go, TypeScript, Drizzle, Postgres, and the glue between them, your onboarding is slow and your bus factor is high. But if you're a team of one, or three, or five — you already know your stack. The coordination cost is near zero. What you gain by choosing the best tool for each layer is real, and what you lose — ecosystem uniformity, hiring pool breadth — matters less at that scale.
Corn
AI agents change the calculus here. Historically, the hardest part of pick-and-mix was the glue code. Making Go talk to Postgres through Drizzle, making the Vue frontend consume the REST API, wiring up auth tokens across the boundary — that's all custom integration work. But AI code generation is getting good enough at scaffolding exactly that kind of glue. It doesn't eliminate the need to understand what's happening, but it dramatically reduces the time spent writing boilerplate configuration and middleware.
Herman
Third takeaway — and this is the one I think will matter most five years from now — pay attention to what AI agents default to. When you ask Claude or Copilot or GPT-4o to scaffold a CRUD API, it reaches for Express or FastAPI almost every time. Not because those are architecturally superior to Go, but because the training data is dominated by JavaScript and Python examples. If you're building a long-lived project, the AI training data coverage of your stack is now a legitimate selection criterion. Better tooling, more generated code, more community examples, faster debugging when the AI gets confused — these compound over time.
Corn
This is genuinely new. Three years ago, you evaluated a stack on technical merit, ecosystem maturity, hiring availability, and maybe vendor risk. Now there's a fifth criterion: how well does the AI tooling know this stack? And it's not just about code generation. It's about whether the AI can help you debug a weird Postgres query plan, or explain why your Nuxt middleware isn't firing in the order you expect, or suggest the right Caddyfile directive for your reverse proxy setup.
Herman
Here's the uncomfortable implication. If AI training data coverage becomes a dominant factor in stack selection, we might see consolidation around a small number of stacks — not because they're technically superior, but because they're what the AI knows best. js plus Prisma plus TypeScript plus Postgres. Python plus FastAPI plus SQLAlchemy. These combinations have enormous training data footprints. They're safe bets for AI-assisted development. But they might not be the best architectural fit for your specific problem.
Corn
Which means the counter-bet — Daniel's bet — is to choose what makes architectural sense and accept that the AI tooling might be slightly behind. Go's training data coverage is improving fast. Drizzle is gaining traction. Vue and Nuxt are well-represented. This stack might not be what Claude reaches for by default, but it's not obscure either. It sits in a sweet spot where the architectural benefits are real and the AI gap is shrinking.
Herman
That's the balancing act now. You're weighing architectural fit against AI fluency, component count against ecosystem familiarity, long-term maintainability against short-term velocity. There's no universal right answer. But there is a universal right process — map the components, count the tradeoffs, and be honest about which problems you're optimizing for.
Herman
Here's the question I keep coming back to, and I don't have a clean answer yet. As AI agents become the primary code generators — and we're heading there faster than I think most people realize — do we consolidate around a handful of AI-native stacks? js plus Prisma plus Vercel, or Python plus FastAPI plus SQLAlchemy — the combinations with the deepest training data footprints. Or does AI actually enable more fragmentation, because it gets cheap enough to generate the glue code between any set of components you want to string together?
Corn
I think the honest answer is, we don't know yet. But I suspect it won't be one or the other — it'll be both. The center of gravity will consolidate. Most projects will converge on the stacks the AI knows best, because most projects don't need architectural distinctiveness. They need to ship. But for the projects where the stack actually matters — where performance, deployment footprint, or operational simplicity are real constraints — AI will make pick-and-mix more viable than it's ever been.
Herman
Daniel's stack — Go, Vue, Nuxt, Postgres, Drizzle — is a bet on that second category. It's not the default. It's not what the AI reaches for first. But it's a deliberately simple architecture where every component earns its place, and the AI gap is closing month by month. I'd love to revisit this in a year and see whether that bet paid off, or whether the gravitational pull of the dominant stacks proved too strong.
Corn
Which is exactly the kind of question this show exists for. If you're wrestling with a stack decision — or if you've got a weird prompt about anything else — send it in. We love hearing about real architectural choices, especially the ones where the right answer isn't obvious.
Herman
This has been My Weird Prompts. Thanks to our producer Hilbert Flumingtop for making this whole thing work.
Corn
If you enjoyed this, leave us a review wherever you listen — it helps. And now: Hilbert's daily fun fact.

Hilbert: The world's largest known deposit of diatomaceous earth — fossilized remains of microscopic algae called diatoms — sits beneath the Gobi Desert, formed from an ancient freshwater lake that covered the region roughly forty million years ago. The deposit is estimated to contain over twenty billion metric tons.
Corn
...right. Thanks, Hilbert.
Corn
This has been My Weird Prompts. We're back next week.

This episode was generated with AI assistance. Hosts Herman and Corn are AI personalities.