You might remember Moltbook. It was the biggest thing in the world for about three days back in January. It does still exist, but with a lot less fanfare.

The idea was completely novel: a social network for AI agents. Humans could read the site, but only AI agents could interact with it. It was also built entirely by AI, with creator Matt Schlicht saying he didn't write a single line of code. It was vibe-coded.

Moltbook was a great idea, but the vibe-coding led to terrible execution, at least for the main component that matters in a social network: messaging. Within a week, security researchers found that the messages weren't private and identities weren't real. Anyone could read the direct messages between agents, and anyone could post as any agent.

There was also no moderation. Crypto scammers moved in almost immediately, running pump-and-dump schemes through agent accounts, and there was nothing to scan for them or take them down.

AI-assisted development is a huge boon to the software world. But expecting "Make me a chat app. Make no mistakes." to produce production-quality output is a misunderstanding of what these tools are good at.

I'm the Director of Engineering at Stream, and this is the gap I watch teams hit over and over. The first 80% of a real-time feature has never been easier to build. This piece is about the last 20%, the part Moltbook never got to, and why AI tools can't build it for you.

Where Vibe-Coding Works, and Where It Hits Its Limits

The term "vibe-coding" has a very specific meaning:

"There's a new kind of coding I call "vibe coding", where you fully give in to the vibes, embrace exponentials, and forget that the code even exists. It's possible because the LLMs (e.g. Cursor Composer w Sonnet) are getting too good...I'm building a project or webapp, but it's not really coding - I just see stuff, say stuff, run stuff, and copy paste stuff, and it mostly works."

Vibe coding is exactly that. Describing what you want and judging the output not by the code, but by the behavior. The code is there, but the whole point is that you don't have to look at it. It took off as developers began to realize AI's sheer capabilities when it came to code. AI could do all of the writing from a simple prompt. "Make me a chat app. Make no mistakes." is a meme, but AI is fully capable of doing the first part.

That is because most apps are fundamentally the same under the hood, and LLMs have been trained in billions of lines of code that look identical, so you'll get a "chat app" with:

But what you'll have is a demo, and your "make no mistakes" command might not have been fully applied.

Chat has a well-documented happy path. A model can follow that and create something that works for two people, over a local connection, with a few cute extras. But what about a user whose connection drops every time their train goes through a tunnel? Or two thousand people posting in the same channel at once? Or a message that has to reach a phone that's been offline all day?

What about when you want to add audio or video? Or like Moltbook, need moderation or feeds? Then, you're off the happy path and into the long 20% of the app vibe-coding can't deal with.

Video & Audio: Where They Hit Limits

Ask a model for video calling, and you'll get a working call between two laptops on the same wifi. But having helped build Stream, I can tell you there is a whole stack of machinery that underpins large-scale AV.

A real video feature needs:

Most of that list is not code in your app, so it's completely invisible to AI coding agents. Signaling, STUN, TURN, and the SFU are all services you have to deploy, scale, and monitor. They also have to run close to your users, because routing media through the wrong continent adds latency you can hear. And they're stateful, so a call pinned to one SFU node has to survive that node's deploys and failures.

With TURN and the SFU, you also have to think bandwidth. Every relayed or routed call pushes its media through your servers, and the SFU forwards a copy of each stream to every other participant, so egress grows with every person who joins. That stops being an infrastructure question and becomes a cost one. You have to think about per-minute serving costs, cloud egress pricing, and how your peak concurrency affects the bill.

Two laptops on the same wifi, connected without TURN, without an SFU, and without simulcast, work great. But it isn't real-time video that your user can actually join, from behind an office firewall or on a phone that jumps from wifi to LTE mid-call.

Ready to integrate? Our team is standing by to help you. Contact us today and launch tomorrow!

Chat: Where It Runs Into Trouble

Chat looks like the easier half, but chat is full of little hiccups that AI will struggle to build.

Read receipts are a good example because every user expects them, and nothing about them seems hard. When a user opens a channel, the client sends a read event, the server flips a flag on the message, and the sender sees the checkmark. Between two tabs, it works on the first try.

The first complication is that read state belongs to a person, not a device. If you read a message on your phone, the badge has to clear on your laptop, and on the tablet that comes back online next week. That makes it server-side state every device converges on, not a flag in the UI.

It also isn't one state. "Delivered to a device" and "read by the person" are separate events. Oh, and a push notification arriving on a locked phone counts as neither.

Then there's the write volume. Storing a receipt row per user per message means a 500-person channel writes 500 rows for every message sent, before a single "seen by" list updates. The production design is a per-user, per-channel pointer to the last message read. One small record per person, cheap to update, cheap to count against.

That single pointer is going to be a huge implementation:

Can AI build all of this? Now, yes. But suddenly you have a huge extra feature set to implement for something as trivial as a read receipt. And with dozens of small sad paths to account for, you are either spending your time now testing vibe-coded receipts, or shipping faulty product.

Feeds: Where It Gets Hard

Ask a model to build a feed, and you'll get a query that pulls recent posts and renders them in order. That might work for a demo with ten posts and three users... but it's not what runs a social network with any real activity.

A real feed needs:

None of this is visible in a local demo, because a demo has one account posting into its own feed. You'll see it when a platform has real accounts following real accounts at real volume, which is exactly the moment Moltbook had.

Moderation: Where It Cracks

Moderation is the part Moltbook skipped.

Video and chat break down due to network and scale constraints. Moderation breaks down because of people, and people adapt.

A model can easily ship a bad-words.txt, but within days it's being dodged with swapped characters, spaced-out letters, and images. The crypto spam that filled Moltbook wouldn't trip a profanity filter at all. Whatever you deploy, users probe it and route around it. Static rules immediately decay.

A full production moderation system needs:

The failure mode here can also be illegal. The EU's Digital Services Act requires a statement of reasons for every removal and an internal appeals process, with fines of up to 6% of global turnover. The UK's Online Safety Act applies a £18 million or 10% of worldwide revenue cap, whichever is greater. In the US, a provider that becomes aware of CSAM is required by federal law to report it to NCMEC. And you'll meet Apple before you meet any regulator, since App Review requires user-generated-content apps to ship with reporting and blocking.

AI definitely has a place in this system. Stream's AI moderation runs on classifiers and LLMs, because at any real message volume, automated scanning is the only thing that scales. But that's purpose-built AI sitting inside a system with policy and people around it. Someone still writes the rules on what your platform tolerates, someone reviews the flags, someone answers the appeals.

A coding agent can scaffold the tooling in an afternoon. It can't decide policy, and it can't take responsibility when a call is wrong.

Take the 80%, Plan for the 20%

None of this is an argument against AI-assisted development. The 80% is real, and you should take it all. Let the models build your UI, your application logic, your prototypes, and every feature where the behavior you can watch in development is the whole story.

The last 20% is where that test fails. Connection infrastructure, delivery guarantees, and moderation all behave differently on your laptop and in production.

You also shouldn't build them. TURN servers, SFUs, message ordering, read state, and scanning pipelines are the same problems for every app that has them, which is why they exist as infrastructure you can buy.

Stream builds exactly that, so I'm not a neutral party here. We've also built Agent Skills, so Claude Code, Cursor, or whatever you're using can wire up our APIs directly instead of guessing.

The point: Put the layer that breaks under real-world conditions behind an API that has already survived them, and point your AI tools at everything above it.

"Make me a chat app" turned out to be the easy instruction. "Make no mistakes" is the one that covers your users' messages, calls, and safety, and it's still engineering work, whether your team does it or you put proven infrastructure in place.