*Editor

Deki Editor soon

C++ scene editor built on Dear ImGui, SDL3 and OpenGL. Reflection-driven inspector, hot reload, play mode, and a build panel that flashes firmware to the board.

! NOT RELEASED YET

The editor isn't downloadable yet — everything below is built and running, it just isn't packaged for release. Leave an email and you'll hear the day it ships. That's the only thing it's used for.

The Deki editor with a demo project open

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;
};

The inspector showing the Bobber component

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:

  1. Detect modified, added or removed source files.
  2. Unload the package DLLs and the plugin DLL.
  3. Rebuild through CMake.
  4. 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:

  1. Generate the platform CMake config.
  2. Build firmware for the selected board (ESP32 via ESP-IDF, for example).
  3. Export assets to storage/ in the engine’s binary formats — .tex textures, MessagePack .scene files, the GUID table, baked fonts, and .dtilemap / .dtileset if Tiled is in use.
  4. 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.