
What it is
A desktop app that opens, edits, plays and ships Deki scenes. It runs on Windows, and on Linux with native file dialogs still missing. It hosts the engine in-process: the components you write in C++ are compiled into a plugin DLL, loaded by the editor, and immediately available in the inspector and the scene view. Packages load the same way, as their own DLLs, and register their components and inspector overlays through the same path.
Panels
| Panel | What it does |
|---|---|
| Hierarchy | Multi-select object tree, drag to reparent and reorder. |
| Inspector | Multi-object property editor built from reflection. Mixed values across a selection show as ---. |
| Scene View | 2D canvas with gizmos, pan, zoom and selection. Pixel-exact with runtime output. |
| Asset Browser | GUID-keyed asset listing with previews. |
| Console | Filtered log from the engine, the packages and your plugin. |
| Build | Build firmware, export assets to storage/, flash the device. |
| Profiler | Hierarchy, flat and flame-graph views with memory stats, with no external dependency. |
| Frame Capture | Save a run of play-mode frames to PNG. |
| Font Importer | Import TTF / OTF, or bake grid-based bitmap fonts. |
| Boards Manager | MCU, memory, display and peripheral config per board. |
| Package Manager | Install, remove and update packages from one or more registries. |
The inspector is generated
Tag a field with DEKI_EXPORT and the C++26 static-reflection codegen picks it
up at build time, emitting property descriptors and MessagePack deserialization
for it. Nothing else to register.
DEKI_CATEGORY("Demo")
DEKI_DESCRIPTION("Bobs the object up and down on a sine wave.")
class Bobber : public Deki::Component
{
public:
DEKI_EXPORT DEKI_SLIDER(0, 64)
float amplitudePx = 12.0f;
DEKI_EXPORT DEKI_SLIDER(0, 4)
float speedHz = 0.6f;
void Awake() override;
void Update() override;
};

DEKI_SLIDER(min, max) clamps the widget to a range; DEKI_RANGE does the same
without the slider. Other attributes worth knowing:
DEKI_TOOLTIP("...")— hover text on the field.DEKI_GROUP("...")— collapse related fields under a header.DEKI_UNIT(px)— display unit, so meters can be edited in pixels.DEKI_VISIBLE_WHEN(prop, value)— hide a field until another one says so.DEKI_EDITOR_ONLY— visible in the inspector, stripped from the build.
Descriptors also decide the widget: a slider for a ranged float, a color picker
for a color, an asset picker for AssetRef<T>, an object picker for
ObjectRef<T>, a dropdown for an enum. AssetRef<T> resolves to a live pointer
during Awake; ObjectRef<T> resolves against sibling objects before Start.
Play mode
Play, Pause and Stop run the current scene inside the editor. Play mode
allocates a render buffer, walks the lifecycle (Awake → Start → Update), and
renders through the same DekiRenderSystem::RenderToBuffer() path that runs on
hardware. What the editor draws is what the device draws.
Hot reload
When the editor window regains focus, HotReloadService diffs the source tree
against the last build:
- Detect modified, added or removed source files.
- Unload the package DLLs and the plugin DLL.
- Rebuild through CMake.
- Reload and re-register component editors.
No editor restart, no scene reload. Installing or removing a package goes through
the same path via ForceNextBuild().
Undo / redo
Every edit is a command on CommandHistory. Commands merge, so dragging a
slider produces one undo entry rather than hundreds. A multi-selection edit
batches into a single ModifyMultipleComponentPropertyCommand that applies the
same change to every selected object.
ModifyFloatCommand, ModifyIntCommand, ModifyBoolCommand,
ModifyStringCommand, ModifyComponentPropertyCommand (and its multi-select
variant), CreateObjectCommand, DeleteObjectCommand, AddComponentCommand,
RemoveComponentCommand, ReparentObjectCommand, ReorderObjectCommand.
Build and flash
The Build panel reads the project’s board config and runs the toolchain end to end:
- Generate the platform CMake config.
- Build firmware for the selected board (ESP32 via ESP-IDF, for example).
- Export assets to
storage/in the engine’s binary formats —.textextures, MessagePack.scenefiles, the GUID table, baked fonts, and.dtilemap/.dtilesetif Tiled is in use. - Optionally flash over USB.
Step 3 is the same export used to populate an SD card for offline boot.
Driving it from outside
The editor ships an MCP server. Launch with --mcp (or --mcp-port N) and it
exposes the scene, the asset pipeline, the package manager, project creation,
builds, and screenshot capture over JSON-RPC — enough to script a project from
nothing to a captured screenshot. Every editor image on this site was produced
that way.