In 2018, I made a video game with Unreal Engine: Starxium 2084.
A 4 versus 4 multiplayer game with an 80s retro-futuristic look: neon lights, night highways, and synthwave. Two teams of cars fight over a convoy speeding down the highway, and each player tunes their car part by part.

I had a blast learning how to make all of it. I modeled the cars and the 3D objects in Blender, composed the music in FL Studio, and put everything together in Unreal Engine.
Discovering Blueprints
I learned the engine along the way, and that is how I discovered Blueprints: Unreal's visual scripting. Instead of writing code, you connect nodes. Execution wires set the order, data wires carry the values.

What struck me was how much it removes: no syntax errors, no mismatched types, no hidden control flow, no blank page.
Visual scripting is not unique to Unreal: Unity has it too. I found it to be an exceptional tool, and I kept it in the back of my mind.
A crazy idea
I never managed to finance the game. In 2022, I had a crazy idea: build the Unreal Engine, but for the web.
I had seen what hobbyists with no software engineering background managed to build with Blueprints. They shipped games: real-time physics, 3D rendering, 60 frames per second.
A web app has none of that: it is pages, forms, lists, a backend, and a database. If people could ship games with visual scripting, a web app had to be within reach.
That is how Luna Park was created, at Station F.

From graphs to full-stack apps
At the very beginning, Luna Park was only visual scripting. Unlike Blueprints, which run on a virtual machine, every node compiled to JavaScript from day one: it was always meant for the web.

A graph alone does not make an app, so the editor grew around it. First a layout builder, where each page compiles to a Vue component. Then a backend, with routes written in the same graphs as the interface. Then PostgreSQL, queried directly from those routes. Then a debugger, plugins, npm packages, desktop and mobile builds, and code export.

Visual scripting has a famous failure mode: "Blueprints from hell", graphs so large that nobody can read them. The answer is the same as in code: select a group of nodes and collapse it into a function, and write what is simpler to type than to draw as a TypeScript function.
In the desktop app, a project is a plain folder on disk, so it goes into Git like any other codebase.
The goal is that any web app can be built with it. When something cannot be built yet, we update the editor. Until then, a TypeScript function or a plugin covers the gap.
What it kept from Unreal
| Unreal Engine | Luna Park |
|---|---|
| Level editor and viewport | Builder: the page, rendered live |
| Blueprints | Logic graphs, front and back |
| C++ | Code functions in TypeScript, npm packages |
| Play In Editor | Preview: the app runs inside the editor |
| Blueprint debugger | Breakpoints, step by step, live values |
| Plugins and Fab | Plugins: components, nodes, tokens, backend hooks |
| Packaging per platform | Web, PWA, desktop, Android, iOS |
Then came AI
When I started Luna Park, AI could not build applications. Then it learned to, fast. So the editor got Sidekick, an assistant that runs on the AI you choose. It builds and tests pages, routes, and tables, and the result is the same graphs you would make by hand. That is the point: you can understand every change the AI makes, and edit it yourself.

Try it
Luna Park runs in the browser, and you can try it without signing up.
I would love to hear what you think, especially if you have used Blueprints or another visual scripting tool.
