Popcorn and the arrival of a BEAM in the browser tab
Running Elixir in the browser
At a glance
- What is it?
- Popcorn runs Elixir and Erlang applications in the browser on a BEAM virtual machine compiled to WebAssembly, with OTP processes, message passing and supervision on the user's device. The interesting wrinkle is that the stable package and the prerelease package do not run the same virtual machine.
- Who is it for?
- Popcorn is worth a look if you want Phoenix style concurrency in a browser tab, if you already ship an Elixir backend whose logic you would rather not rewrite, or if you want to see what a full BEAM in WebAssembly feels like. It is the wrong choice for production delivery today, because the npm channel still carries Popcorn 0.3 on AtomVM while the Erlang/OTP based Popcorn 1.0 is still a prerelease.
- 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 3 days ago.
- What is it written in?
- Mainly Elixir, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 20, 2026, and from our analysis. They are not legal advice.
Editorial analysis
Popcorn puts OTP processes inside a browser tab
Popcorn runs Elixir and Erlang applications in the browser on a BEAM virtual machine compiled to WebAssembly. The application runs on the user's device, and the README is specific about what comes with it: OTP processes, message passing, and supervision.
That list is the whole argument for the project. Browsers give you JavaScript's event loop and WebAssembly's sandboxed instruction set, but not Erlang's concurrency model. Popcorn's proposition is that you can have it: processes that spawn and die independently, messages passed between them, and supervision trees that restart what fails, all running client side in a page.
The intended audience is Elixir developers who think in those terms, and specifically people who want Phoenix LiveView behaviour without a server behind it. The repository ships a `local-live-view/` directory for exactly that, and the README describes it as Phoenix LiveView running in the browser. The rest of the ecosystem follows from that goal, including JavaScript interop, which the README describes as JavaScript and Elixir communicating through Popcorn's APIs.
The stable package and the prerelease package use different runtimes
The README carries a paragraph that any adopter needs to read carefully. Popcorn 1.0 is a prerelease based on Erlang/OTP. The stable npm channel still uses Popcorn 0.3 and AtomVM. The documentation is split accordingly, with Popcorn 1.0 documentation at hexdocs.pm/popcorn and the older 0.3 documentation at the same domain.
So there are two Popcorns in circulation and they are not interchangeable. One runs the real BEAM compiled to WebAssembly. The other runs AtomVM, which is a smaller Erlang-like runtime that also targets WebAssembly. Features, size characteristics and supported functionality will differ between them, and the README does not spell out the differences.
This is the single largest source of confusion for newcomers, and it is easy to miss because the project name is the same in both cases. If you are evaluating Popcorn, the first question is which runtime the artefact you have in front of you uses.
Three packages, three different jobs
The documentation is split by audience rather than by version alone. The JavaScript package lives at `popcorn/js/README.md` and covers bundler setup and JavaScript usage. The Elixir package lives at `popcorn/elixir/README.md` and covers application setup and packaging. LocalLiveView has its own README at `local-live-view/README.md`.
That separation is a fair signal about how the thing is used. An application built on Popcorn needs both halves: the Elixir side describes and packages the BEAM application, the JavaScript side wires it into a page and provides the interop surface. You are not dropping in a single script tag.
The top-level repository makes the same point structurally. Alongside `popcorn/` and `local-live-view/` there is a `popcorn-2/` directory, a `popdoc/` directory that presumably holds the documentation site, a `language-tour/`, a `landing-page/`, `examples/`, `docker/` and `scripts/`. The presence of both `popcorn/` and `popcorn-2/` matches the README's warning that two runtime lines coexist.
The repository is a pnpm monorepo, not a single npm package
The root `package.json` describes the repository rather than a published library. It is named `popcorn-mono`, marked private, versioned 0.1.0, described as the monorepo root, and it declares pnpm as its package manager:
{
"name": "popcorn-mono",
"private": true,
"version": "0.1.0",
"description": "Monorepo root",
"scripts": {},
"packageManager": "[email protected]"
}There is a `pnpm-workspace.yaml` and a `pnpm-lock.yaml` alongside it. So if you are reading the repository to understand the structure, the published artefacts live in the workspace packages rather than at the root, and the root manifest is not something you would install.
The `.npmrc` file and the `.env.example` file add the other half of the picture. The environment file is small and tells you what a local build expects:
# Path to AtomVM/FissionVM source directory
# For local development, point to your local clone:
ATOMVM_SOURCE=../AtomVMFor release builds this is overridden to use the remote repository, according to the comment. The presence of a `FissionVM` mention in that comment alongside AtomVM suggests the runtime story is still moving.
mise holds the tool versions, and the examples are the documentation
Development is driven by mise, with `mise.toml` holding the tool versions and the available tasks, and `scripts/` holding the development, testing and build scripts. The README points at the Hello Popcorn example, `examples/hello-popcorn/README.md`, for local build and run instructions.
The examples directory is unusually large and tells you what the project can do. It includes `eval-in-wasm/`, `iex-wasm/`, `game-of-life/`, `hello-popcorn/` and `hello-react/`, and then a run of LocalLiveView applications: `local-lv-burrito/`, `local-lv-checkout/`, `local-lv-compare/`, `local-lv-forms/`, `local-lv-kanban/`, `local-lv-pong/` and `local-lv-thermostat/`.
The `iex-wasm` example is worth a note, since an interactive shell compiled to WebAssembly is an unusual thing to attempt. The Elixir language tour is also hosted, at elixir-language-tour.swmansion.com, and runs on Popcorn, which is a good indication of how much of the language is expected to work in the browser. The demo site at popcorn.swmansion.com hosts the examples, with their source code in the repository.
LocalLiveView is the part that looks like a product
The `local-live-view/` directory holds the Phoenix LiveView implementation, and it is where the project gets closest to something an application team would ship. A Phoenix LiveView application normally keeps the server as the source of truth and the browser as a thin display layer, with events round tripping to the server.
Running that model locally changes the shape of the system. The README frames Popcorn as running your application on the user's device, with JavaScript and Elixir communicating through Popcorn's APIs, so the LiveView boundary becomes a local boundary. The community projects listed in the README include Popcorn on iOS and LocalLiveView demos hosted by another developer.
The risk here is the same one that applies to any project moving a server-side runtime into a client: the work you move to the browser moves to a machine you do not control. The README does not discuss what happens to sensitive state, to database access, or to any assumption about a trusted backend, so those questions are open rather than answered.
Apache 2.0, a 2025 copyright line, and three releases in 2026
Popcorn is licensed under the Apache License, Version 2.0, with the text in the LICENSE file. Copyright is stated as 2025, Software Mansion. The project is created by Software Mansion, and the README notes that the company has built web and mobile applications since 2012.
On maintenance, the repository is not archived and the last push was on 2026-10-20. The tagged releases tell a clearer story of the current line: v0.3.3 on 2026-08-13, v0.3.2 on 2026-07-17 and v0.3.1 on 2026-07-08. All three sit on the 0.3 series, which matches the stable npm channel described in the README, while the 1.0 prerelease line is published to Hex rather than to that channel.
So the project is moving, and the moving is happening on two tracks at once. The version number in `popcorn/` and the version in `popcorn-2/` will not agree, and a dependency lock that pins one of them will need attention when the 1.0 line stabilises. The README also asks that large contributions be discussed before work starts, which is a hint about the review capacity a small team expects to handle.
Editorial conclusion
Popcorn is worth a look if you want Phoenix style concurrency in a browser tab, if you already ship an Elixir backend whose logic you would rather not rewrite, or if you want to see what a full BEAM in WebAssembly feels like. It is the wrong choice for production delivery today, because the npm channel still carries Popcorn 0.3 on AtomVM while the Erlang/OTP based Popcorn 1.0 is still a prerelease. Verify first which runtime the version you are installing actually uses, then check the `popcorn/js/README.md` bundler setup for your build tool, since the JavaScript side is a separate package from the Elixir side.
Frequently asked questions
What is Popcorn and what runtime does it use?
Popcorn runs Elixir and Erlang applications in the browser on a BEAM virtual machine compiled to WebAssembly, with OTP processes, message passing and supervision running on the user's device. The stable npm channel uses Popcorn 0.3 with AtomVM, while Popcorn 1.0 is a prerelease based on Erlang/OTP.
How do I set up Popcorn in a JavaScript project?
The README points to a separate JavaScript package, documented at `popcorn/js/README.md`, which covers bundler setup and JavaScript usage. The Elixir side has its own documentation at `popcorn/elixir/README.md` for application setup and packaging, and the repository is a pnpm workspace with the root manifest named `popcorn-mono`.
Can Phoenix LiveView run entirely in the browser with Popcorn?
The repository includes a `local-live-view/` directory with its own README, described as Phoenix LiveView running in the browser, and the examples directory contains several LocalLiveView applications such as `local-lv-kanban/` and `local-lv-forms/`.
How do I build Popcorn locally?
Development uses mise for tool versions and tasks, with `mise.toml` holding the available tasks and `scripts/` holding the build scripts. The README points at the Hello Popcorn example, `examples/hello-popcorn/README.md`, for local build and run instructions, and the `.env.example` file expects an `ATOMVM_SOURCE` path for local development.
What licence applies to Popcorn?
Popcorn is licensed under the Apache License, Version 2.0, with the text in the LICENSE file at the repository root. Copyright is stated as 2025, Software Mansion.
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/software-mansion-popcorn)