← Back to Blog

JSON Feels Friendly, ArrayBuffer Feels Fast

JSON Feels Friendly, ArrayBuffer Feels Fast
December 18, 2025NotesQR Team

JSON feels friendly. It reads like something written for humans. You can log it, inspect it, tweak a value, ship a feature, feel productive. When we started working with WebRTC, JSON was the obvious choice. Messages were clear, debugging was easy, everything felt under control.

ArrayBuffer felt like the opposite. Cold. Opaque. Bytes instead of meaning. Something you reach for only when things go really wrong.

And then things went wrong.

Not in a dramatic way. No crashes. No errors. Just small delays. Slight hiccups. Transfers that felt a bit heavier than they should. The kind of issues you ignore at first, until you cannot.

When JSON feels right but behaves wrong

JSON works incredibly well on the web because most of the web is not real time. A few extra milliseconds parsing, serializing, allocating memory, nobody notices. In WebRTC, you notice everything. Latency stacks. Garbage collection shows up as jitter. A few unnecessary bytes get multiplied hundreds of times per second.

At first, JSON still feels right. You are sending messages, metadata, small commands. It reads well. Your logs make sense. You feel in control of the system.

But WebRTC data channels are not chatty APIs. They are streams. They reward predictability and punish waste. Every time you stringify an object and parse it on the other side, you are paying a tax you do not see immediately. CPU cycles, memory churn, timing variability. All small, all constant, all cumulative.

The strange part is that nothing looks broken. It just feels slightly off.

When ArrayBuffer stops feeling scary

The switch to ArrayBuffer usually does not start with excitement. It starts with suspicion. You replace something readable with something abstract and hope you are not making things worse.

Then something unexpected happens. The system feels calmer.

Not faster in a benchmark sense, faster in a human sense. Fewer spikes. Fewer weird pauses. Transfers feel smoother. Timing feels consistent. You stop chasing ghosts in logs because there are fewer ghosts.

ArrayBuffer does not care about being friendly. It cares about being precise. Fixed sizes. Known offsets. No parsing step that can suddenly take longer because the object shape changed. Machines love that.

And once you accept that this layer is for machines, not for you, the mental model clicks. You stop trying to read everything mid flight. You define structure once and trust it. Debugging moves up a level, away from individual messages and toward system behavior.

The mental shift WebRTC forces on you

This is the real difference, not JSON versus ArrayBuffer, but human first versus machine first thinking.

JSON is a conversation. ArrayBuffer is a signal.

In WebRTC, especially for things like file transfer or continuous data streams, signals win. You can still use JSON where it makes sense, for control messages, negotiation, small bits of metadata. But the heavy lifting wants something quieter, something boring, something fast.

Once you split those responsibilities, the system becomes easier to reason about, even if individual messages become harder to read. You gain reliability by giving up a bit of comfort.

That tradeoff feels very WebRTC. Less magic. More intent.

Why this matters more than it sounds

Most performance problems in real time apps are not dramatic. They are subtle. They live in the space between fine and great. JSON usually keeps you at fine. ArrayBuffer gives you a chance at great.

It is not about being clever or low level for the sake of it. It is about respecting what real time communication actually is. A stream of bytes moving under constraints you do not control.

JSON feels friendly. ArrayBuffer feels fast. In WebRTC, fast eventually feels friendly too.


Want to see how we use WebRTC? Check out NotesQR for file transfers.

Building a WebRTC business? Let’s talk: LinkedIn | X.com

JSON Feels Friendly, ArrayBuffer Feels Fast - NotesQR Blog