Goodwave

A-players since 1982.

No, we haven't been writing code for that long ;)

1982 is the birth year of our oldest founder. But we have been building apps for over twenty years — web, mobile, backend, data pipelines, whatever the problem demands. From the first lines of jQuery to native iOS and Android apps to Python microservices, we didn't just watch the evolution — we shipped through every wave of modern software.

Why JavaScript won

There's a beautiful accident at the heart of modern software. JavaScript was never meant to be a serious language. It was written in ten days to add a bit of life to static web pages. But that's precisely why JavaScript won.

Humans want things to move, to respond, to feel alive. JavaScript was the only language that lived in the browser — the only place where software touches people directly. So demand for JavaScript exploded. And when demand explodes, engineers compete to make the engine faster.

Google's V8 engine became so performant that one day someone thought: what if we ran this outside the browser? That question gave us Node.js, and suddenly JavaScript was everywhere — front-end, back-end, mobile, desktop. The ecosystem grew at an extraordinary pace. Structure followed: frameworks, build tools, type systems.

A scripting toy became the backbone of the internet.

It's a reflection of how things work in life. The tools that win aren't always the most elegant or the most powerful on day one — they're the ones that meet people where they are, and then grow with them. That lesson applies far beyond JavaScript. It's why we work across languages and platforms — Python, Swift, Kotlin, Go, Rust — choosing the right tool for the job, not the one we're most comfortable with.

19972010

The early web — a glorious mess

1997 is when JavaScript got its first standard — ECMAScript 1.0. That's our starting line. We grew up with the web from there: table layouts, inline styles, PHP spaghetti, "works in IE but not in Netscape." It was a glorious mess. And when jQuery arrived, it felt like someone had handed us a power tool in the middle of a construction site.

JavaScript wasn't taken seriously. It was "just a scripting language," a glue for form validation and dropdown menus. But humans want things to feel alive. They want interfaces that respond, that move, that delight. And JavaScript was the only tool that could make that happen in the browser.

So the race began — not to replace JavaScript, but to make JavaScript faster.

20102014

Structure emerges — Backbone, Angular, and the MVC era

As applications grew more ambitious, the spaghetti became unbearable. Backbone.js arrived and gave us structure — models, views, routers. It was minimal and opinionated in the right places. Angular followed with a more radical vision — two-way data binding, dependency injection, a framework that tried to handle everything.

We built dozens of applications in this era. Single-page apps that replaced entire desktop tools. We learned what worked (component thinking, separation of concerns) and what didn't (digest cycles, implicit magic, frameworks that fought the browser instead of working with it).

20142018

React changes everything

We were early contributors to the React ecosystem when it was still in alpha — before JSX was accepted, before the virtual DOM was understood, before "thinking in React" was a phrase anyone used. What drew us in was the core insight: UI is a function of state.

This was functional programming arriving in the mainstream. No more imperative DOM manipulation. No more tracking which event handler mutated which piece of the page. You describe what the interface should look like for a given state, and the framework figures out the minimal changes to make it so.

That shift — from telling the computer what to do, to describing what you want — changed how we think about building software at every level.

20182023

TypeScript, scale, and the pursuit of correctness

JavaScript became serious. The V8 engine made it fast enough to run servers. Node.js proved it could handle billions of requests. But with scale came a need for discipline. TypeScript gave JavaScript the type system it never had — and suddenly, entire categories of bugs vanished before code even ran.

This was also the era where we expanded far beyond the browser. Native mobile apps in Swift and Kotlin. Python services for data processing and machine learning pipelines. Go for performance-critical backends. The language was never the point — the architecture was. We picked the right tool for each job and made them all work together.

We scaled systems to handle billions of page views. Small projects, enormous projects — the principles stayed the same. Clean architecture. Relentless testing. Code that the next engineer can read and trust.

2023now

The age of AI — and the craft matters more than ever

AI can write code now. That makes the human engineer more important, not less. Anyone can generate code — the difference is knowing whether the code is right. Understanding the architecture. Seeing the edge cases. Knowing what to build and, just as critically, what not to build.

We embrace AI as a force multiplier. We use it daily — and we build with it, too. Python for ML pipelines, TypeScript for applications, whatever the stack demands. But we bring twenty years of context to every decision: the instinct for when a shortcut will cost you later, the pattern recognition that comes from shipping dozens of products across every platform, the hard-won judgment that no model can replicate.

We're still learning. We always will be. That's the whole point.

20+ years of context, ready when you are.

Whether it's a prototype or a platform serving millions, we bring the wisdom that only comes from experience.

Start a conversation