In 2018, I made a video game with Unreal Engine: [Starxium 2084](https://starxium.com).

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.

![Starxium 2084, made with Unreal Engine](https://luna-park.app/static/assets/starxium-DPPApAgF.webp "A Starxium 2084 car on the highway, at night.")

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.

![A Blueprint graph in Unreal Engine](https://luna-park.app/static/assets/blueprint-BX6QsYjr.webp "The construction script of a jump pad Blueprint. Source: [Epic Games, Blueprint Foundations](https://dev.epicgames.com/documentation/unreal-engine/blueprint-foundations)")

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](https://stationf.co).

![The main hall of Station F](https://luna-park.app/static/assets/stationf-Po3MCgkD.webp "Station F, in Paris, where Luna Park started.")

## 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.

![The click logic of the Sunset Park waitlist](https://luna-park.app/static/assets/logic-CDGKToD9.webp "A Luna Park graph: typed anchors, each node compiled to JavaScript.")

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.

![Sunset Park in the Luna Park editor](https://luna-park.app/static/assets/builder-CZB4Ob9z.webp "Sunset Park, a demo site built with Luna Park.")

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](/docs/logic/scripts), and write what is simpler to type than to draw as a TypeScript function.

In the [desktop app](/docs/getting-started/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](/docs/interface/builder): the page, rendered live |
| Blueprints | [Logic graphs](/docs/visual-scripting/introduction), front and back |
| C++ | [Code functions](/docs/logic/scripts#code-functions) in TypeScript, [npm packages](/docs/integrations/npm) |
| Play In Editor | [Preview](/docs/interface/preview): the app runs inside the editor |
| Blueprint debugger | [Breakpoints](/docs/visual-scripting/debugging), step by step, live values |
| Plugins and Fab | [Plugins](/docs/integrations/plugins): components, nodes, tokens, backend hooks |
| Packaging per platform | [Web, PWA, desktop, Android, iOS](/docs/deployment/compilation) |

## Then came AI

When I started Luna Park, AI could not build applications. Then it learned to, fast. So the editor got [Sidekick](/docs/workspace/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.

![Sidekick in the Luna Park editor](https://luna-park.app/static/assets/sidekick-D6NrmIwI.webp "Sidekick: Build, Plan, Review, and Guide modes, with the model of your choice.")

## Try it

Luna Park runs in the browser, and you can [try it without signing up](/editor?template=landing).

I would love to hear what you think, especially if you have used Blueprints or another visual scripting tool.
