H2O Wave: realtime Python and R dashboards without HTML, JavaScript or CSS
Realtime Web Apps and Dashboards for Python and R
At a glance
- What is it?
- H2O Wave is an Apache-2.0 stack from H2O.ai for building low-latency browser dashboards in Python or R. The Python package is the practical entry point; the server is a Go binary you download or build.
- Who is it for?
- Adopt H2O Wave if your team already writes Python or R and needs a live-updating browser dashboard without hiring front-end work; skip it if you need a static report, a public marketing site, or a component library you can fork and restyle at the source level.
- Can I use it commercially?
- Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 15 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 25, 2026, and from our analysis. They are not legal advice.
Editorial analysis
The problem H2O Wave solves is the front-end handoff
Most Python data work stops at a notebook or a static image. The moment a result needs to update while someone watches it, the usual answer is to hand the work to a front-end developer who rebuilds the same logic in JavaScript, wires a WebSocket, and maintains a second codebase. H2O Wave removes that handoff. The README describes it as a stack for building browser-based applications and dashboards "entirely in Python/R without using HTML, Javascript, or CSS", and the repository layout backs that up: there is a py/ directory and an r/ directory, and no requirement that you touch the ui/ sources. The people this fits are analysts, data scientists and backend engineers who own the data and the logic but not the browser. It fits less well if your organisation already has a front-end team with opinions about component libraries, because Wave's components come from its own server and are not something you patch in a stylesheet.
A Go server, a Python or R client, and messages over a socket
The architecture is visible in the top-level files. The server is written in Go: server.go, socket.go, broker.go, cache.go, client.go and protocol.go sit at the repository root, and go.mod declares module github.com/h2oai/wave with gorilla/websocket for the transport. The Python and R packages are clients that talk to that server. protocol.md and protocol.go define the wire format, so the browser is not rendering your Python objects directly; it is rendering pages the server sends it.
The data flow is one-directional by design. Your app builds a page out of cards, the server pushes it to the connected browser, and events from the browser come back as messages your handler processes. The server keeps per-client state in cache.go and routes messages through broker.go, which is why the same app can serve many viewers at once. The repository also carries auth.go and a dependency on github.com/coreos/go-oidc/v3, so authentication is a server concern rather than something each app implements. The practical consequence: your Python process does not have to hold an HTTP connection open per user, and a slow client does not block your data loop.
Installing h2o-wave and running your first app
The README points at the download page and the installation guide rather than listing commands inline. The Python package is published on PyPI as h2o-wave, and the server binary is distributed as a release artifact. The README's own installation pointer is the How to install link, so that page is the place to get the client and the server for your platform. The repository ships working examples under py/demo and py/examples, and the README links a Getting Started guide for the full walkthrough.
The build path is documented in the repository's Makefile. Its `all` target is defined as `clean setup build`, and `build` in turn depends on `build-ui build-server`. Running the build produces the server binary named waved in the repository root, and the release archives are named wave-<version>-<os>-<arch>, with VERSION read from the VERSION file.
all: clean setup build ## Setup and build everythingOnce you have a server binary and the Python client installed, you point the server at a Python module that declares a page and a handler. What you should see is a browser tab showing the page your handler returned. If the page is blank, the usual cause is a client package and server binary from different releases, since the protocol is versioned alongside both.
Where H2O Wave is the wrong choice
Wave is a server-driven UI framework, and that shapes what it cannot do well. If you need a static site, a report that gets emailed, or a page that must work with JavaScript disabled, this is the wrong tool: the browser is a thin client for content the server generates, and there is no static export path documented in the README.
The second limitation is styling. The README advertises themes and links a Theme Generator, and the assets folder shows light, neon and dark variants, but the component set is fixed. If your design system requires a component that Wave does not ship, you are either composing it from what exists or changing the server. That is a real constraint for teams with a mandated UI kit.
The third is operational. A dashboard whose value depends on continuous live updates inherits the uptime of the server process and the socket between it and the browser. The README does not document rollback, offline behaviour, or a fallback path when the socket drops, so a team that needs a guaranteed static snapshot alongside the live view has to build that separately. Finally, the Python and R clients are versioned with the server, and the release list shows patch releases arriving weeks apart, so an upgrade means moving both halves together rather than bumping one dependency.
How H2O Wave differs from Streamlit and Dash
Streamlit and Dash are the obvious comparison points, and the difference is in where the UI lives. Streamlit reruns your script top to bottom on each interaction and rebuilds the page from that rerun; the mental model is a script that happens to render. Dash composes a layout as a tree of components and wires callbacks to individual pieces of it, which means you describe the page structure explicitly. H2O Wave sits closer to Dash in that you construct a page from components, but the transport is a persistent socket rather than request and response, which is what the README means by "broadcasting them live over the web".
That distinction matters for the workload. If your app is a form that recomputes a chart when a dropdown changes, all three work and the choice is mostly taste. If your app is a monitor that pushes new values to many viewers as they arrive, the socket model is a better fit than a rerun-per-interaction model, because there is no interaction to trigger the update. The cost is that you are running a separate Go server process rather than a single Python process, and you take on the version pairing between the two.
Maintenance, licensing and the cost of staying current
The repository is not archived, and the last push was on 2026-09-15, the same day as the v1.8.14 release. The release cadence shows v1.8.12 on 2026-08-14, v1.8.13 on 2026-09-01 and v1.8.14 on 2026-09-15, so the project is being released on roughly a two-week cycle. That is the practical upgrade cost: if you track releases, you are re-pinning a Python package and a server binary every few weeks, and the protocol between them is defined in protocol.md, so a mismatch is a real failure mode rather than a theoretical one.
The licence is Apache-2.0, stated in the README and shipped as a LICENSE file at the repository root. Apache-2.0 permits commercial use and modification and includes an express patent grant, which is why it is common in enterprise tooling. It also requires that you preserve the licence and NOTICE files when redistributing. None of this is legal advice; if you are embedding Wave in a product you ship, have your own counsel read the LICENSE and NOTICE files rather than a summary in an article.
Editorial conclusion
Adopt H2O Wave if your team already writes Python or R and needs a live-updating browser dashboard without hiring front-end work; skip it if you need a static report, a public marketing site, or a component library you can fork and restyle at the source level. Before committing, install the h2o-wave package, run the demo app from py/demo, and confirm that the Go server binary you download matches the Python client version you installed, because the two are versioned and released together.
Frequently asked questions
Is H2O Wave free?
The repository states that H2O Wave is licensed under the Apache License 2.0, which permits commercial use and modification. That covers the software itself; any paid support or hosting arrangement is a separate question the README does not address.
Which language do I write H2O Wave apps in?
The README describes building applications entirely in Python or R, and the repository has both a py/ and an r/ directory. The R Language API was announced as a preview in a linked blog post.
Do I need to know HTML, JavaScript or CSS to use H2O Wave?
The README states that you build apps and dashboards without using HTML, Javascript, or CSS. The browser renders pages the server sends, so the front-end work is handled by the framework rather than by you.
Where can I find H2O Wave examples?
The README links a Gallery and Examples page on wave.h2o.ai and lists live demos including Wave Tour with 200+ interactive examples and Wave University. The repository also carries examples under py/examples and py/demo.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/h2oai-wave)