Vanilla JS vs React: Why Optistream Chose No Framework

Sometimes the smartest engineering decision is saying no to frameworks. Optistream proved that vanilla JavaScript can outperform bloated solutions—and stay maintainable.

Why This Streaming Analytics Site Ditched React for Vanilla JavaScript—and Won — theAIcatchup

Key Takeaways

  • Frameworks aren't always the answer—vanilla JavaScript can be faster, smaller, and easier to maintain for single-purpose tools
  • WordPress and caching plugins create real constraints that require deliberate, boring solutions (not framework magic)
  • Small details like inputmode='numeric' matter far more than architecture choices for user experience
  • Choosing the right tool for the problem gets you 98/100 PageSpeed scores—but won't impress your VC
  • Two killobytes beats 200 kilobytes, every time

No frameworks. No dependencies. No regrets.

That’s the bold claim coming out of Optistream, a French streaming analytics platform that just shipped seven interactive calculators—earnings estimators, revenue breakdowns, growth trackers—using nothing but HTML, CSS, and vanilla JavaScript. No React. No Vue. No webpack bundle watching your every move.

In an era when every junior dev’s first instinct is to scaffold a Next.js project for a simple calculator, this feels almost heretical. But after 20 years of watching Silicon Valley fetishize frameworks, I’m here to tell you: they nailed it. And more importantly, they’ve exposed the dirty secret that nobody in the startup world wants to admit.

The Heresy: Frameworks Are Overkill for Simple Tools

Optistream’s requirements were refreshingly honest:

  • Load instantly (no 200KB+ JavaScript bundle eating your bandwidth)
  • Live inside WordPress pages without breaking
  • Stay maintainable for a small team
  • Play nice with LiteSpeed Cache

They built tools for streamers—Twitch sub calculators, revenue comparators, donation trackers, growth estimators. Each one is a self-contained widget. Input some numbers. Get a result. Math happens on the client. Done.

And here’s where I’d normally expect the punchline: “So they used [insert framework],” right? Wrong.

“We made a deliberate choice: no React, no Vue, no frameworks. Just pure HTML, CSS, and vanilla JavaScript, embedded directly into WordPress pages.”

This isn’t a hot take or a blog post written by someone living in a cabin. This is production code running on a real business. And the numbers speak louder than any Hacker News comment:

  • 0 KB of framework JavaScript
  • Under 5KB per calculator (HTML + CSS + JS combined)
  • LiteSpeed PageSpeed score: 98/100
  • Time to Interactive: under 1 second on 3G

Let that sink in. A complete, functional revenue calculator that weighs less than a medium-sized JPEG. No build step. No npm install nightmare. No hours wasted debugging why your SSR isn’t hydrating correctly.

Is Pure JavaScript Actually Faster Than React?

Here’s the thing that keeps framework advocates up at night: yes. For this use case, vanilla JS is objectively faster. But that’s not the real story.

The real story is that we’ve spent the last decade optimizing for the wrong problem. React, Vue, Next.js—they’re designed for massive, stateful single-page applications where the complexity is astronomical. They’re built to prevent entire categories of bugs that don’t exist when you’re building a calculator.

Optistream’s calculators don’t need a virtual DOM. They don’t need reactive state bindings. They don’t need code-splitting, lazy loading, or any of the architectural gymnastics we’ve normalized. A button click triggers a function. The function reads inputs. The function updates the DOM. Done.

But here’s where it gets interesting—and where the real lesson lives.

WordPress Is a Minefield (And Nobody Tells You)

Embedding JavaScript directly into WordPress is like trying to assemble IKEA furniture while someone randomly rotates your screwdriver. WordPress has this feature called wpautop that automatically wraps content in paragraph tags and converts line breaks into <p> elements.

So your pristine inline JavaScript:

if (x > 0) {
  calculate();
}

Becomes this nightmare:

<p>if (x > 0) {</p>
<p>calculate();</p>
<p>}</p>

Your code is now completely broken. This is the kind of gotcha that exists in the gaps between documentation, where developers suffer alone at 2 a.m., Googling frantically.

Optistream’s solutions were pragmatic:

  • Wrap all JavaScript in <script> tags (wpautop leaves those alone)
  • Use custom shortcodes that disable wpautop for calculator blocks
  • Minify everything to reduce line break opportunities
  • use IIFEs (Immediately Invoked Function Expressions) to avoid variable collisions

These aren’t groundbreaking techniques. They’re just… careful. Deliberate. The opposite of the move-fast-break-things mentality that dominates tech discourse.

The Specificity Wars Nobody Talks About

When your CSS lives inside a WordPress page alongside theme styles, you’re fighting a specificity battle with one hand tied behind your back. Optistream’s answer: just prefix everything with a unique calculator ID.

#calc-twitch-subs .input-group { ... }
#calc-twitch-subs .result-display { ... }
#calc-twitch-subs button.calculate-btn { ... }

No BEM. No CSS modules. No CSS-in-JS library doing runtime parsing. Just ID-scoped selectors with enough specificity to win. It’s almost quaint how simple it is.

LiteSpeed Cache—the aggressive caching plugin that powers millions of WordPress sites—was another wrench in the works. Optistream handled it by making sure all calculations happen client-side, avoiding cookies, and using data-* attributes instead of server-rendered PHP values. They only added calculator pages to LiteSpeed’s “Do Not Cache” list as a last resort.

Again: pragmatism over purism.

Why Mobile UX Matters More Than Your Framework Choice

Streamers check their stats on phones. This simple fact drove design decisions that most frontend developers overlook:

<input type="number" inputmode="numeric" pattern="[0-9]*"
min="0" step="1" placeholder="Enter subscriber count">

That inputmode="numeric" attribute ensures the numeric keypad opens on mobile. It’s a tiny detail. It makes an enormous difference. And it’s the kind of thing that gets buried under framework abstractions and design system layers.

The Uncomfortable Truth About Technology Choices

Here’s what nobody wants to say out loud in a startup context: choosing vanilla JavaScript over React isn’t brave. It’s not even controversial in engineering circles. It’s just… correct for the problem.

But it’s invisible to the investment community, to the product marketing team, to anyone who doesn’t actually have to maintain the code. React looks like progress. It signals that you’re “serious” about engineering. A calculator that loads in 0.8 seconds using vanilla JS? That doesn’t fit any narrative.

This is why boring technology wins in production but never gets venture funding. Optistream didn’t invent anything revolutionary. They just built something that works, loads fast, and doesn’t require three developers to maintain a build pipeline.

The fact that this is noteworthy tells you everything you need to know about the state of web development right now.


🧬 Related Insights

Frequently Asked Questions

Can you build complex web apps with vanilla JavaScript?

Yes, but it gets harder as complexity grows. Vanilla JS is ideal for widgets, forms, and single-purpose tools. For applications with dozens of interconnected components, state management, and heavy interactivity, frameworks provide genuine value. Choose the tool based on actual requirements, not resume-building.

Will WordPress always break inline JavaScript?

No, but you need to plan around wpautop. Use <script> tags, custom shortcodes, or plugins that disable wpautop for specific content blocks. It’s a known problem with predictable solutions—just not the ones most developers expect.

How do you handle CSS naming without a framework?

ID-prefixing (like Optistream’s #calc-twitch-subs) is simple and effective for isolated widgets. For larger applications, BEM or other methodologies provide structure. The key is being intentional about scope instead of relying on CSS-in-JS or module systems to handle it for you.

James Kowalski
Written by

Investigative tech reporter focused on AI ethics, regulation, and societal impact.

Frequently asked questions

Can you build complex web apps with vanilla JavaScript?
Yes, but it gets harder as complexity grows. Vanilla JS is ideal for widgets, forms, and single-purpose tools. For applications with dozens of interconnected components, state management, and heavy interactivity, frameworks provide genuine value. Choose the tool based on actual requirements, not resume-building.
Will WordPress always break inline JavaScript?
No, but you need to plan around wpautop. Use `<script>` tags, custom shortcodes, or plugins that disable wpautop for specific content blocks. It's a known problem with predictable solutions—just not the ones most developers expect.
How do you handle CSS naming without a framework?
ID-prefixing (like Optistream's `#calc-twitch-subs`) is simple and effective for isolated widgets. For larger applications, BEM or other methodologies provide structure. The key is being intentional about scope instead of relying on CSS-in-JS or module systems to handle it for you.

Worth sharing?

Get the best AI stories of the week in your inbox — no noise, no spam.

Originally reported by Dev.to

Stay in the loop

The week's most important stories from theAIcatchup, delivered once a week.