Deki Editor

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.

The Deki editor with a demo project open

What it is

A desktop app that opens, edits, plays and ships Deki scenes. It hosts the engine in-process, so the components you write in C++ are compiled into a plugin DLL and show up in the inspector immediately. Packages load the same way.

Windows today; Linux runs with native file dialogs.

Download

The editor is free and open source (Apache 2.0). Each release has one archive per platform, with the compiler inside: unpack it anywhere and runDekiEditor. There is nothing else to install, not even a C++ toolchain.

PlatformArchive
Windows x86-64DekiEditor-<version>-windows-x86_64.zip
Linux x86-64DekiEditor-<version>-linux-x86_64.tar.gz

Get the latest release on GitHub, where each archive has its SHA-256 beside it.

The Windows build is not code-signed yet, so its first launch shows a SmartScreen “Windows protected your PC” dialog: click More info, thenRun anyway. To build it yourself instead, the source and the setup guide are at github.com/dekiengine/deki-editor.

The panels

Hierarchy panel: the demo scene’s object tree

Hierarchy is a multi-select tree. Drag to reparent or reorder, and structure edits share the undo history with value edits.

PanelWhat it does
InspectorMulti-object property editor, built from reflection. Mixed values show as ---.
Scene View2D canvas with gizmos, pan, zoom and selection.
Asset BrowserGUID-keyed assets with previews.
ConsoleFiltered log from the engine, packages and your plugin.
BuildBuild firmware, export assets, flash the device.
ProfilerHierarchy, flat and flame-graph views, plus memory.
Frame CaptureSave play-mode frames to PNG.
Font ImporterTTF / OTF import, or baked bitmap fonts.
Boards ManagerMCU, memory, display and peripherals per board.
Package ManagerInstall, remove and update packages.

The inspector writes itself

Tag a field DEKI_EXPORT. The C++26 static-reflection codegen picks it up at build time and emits the property descriptor and its serialization. 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

The descriptor picks the widget too: a slider for a ranged float, a colour picker for a colour, an asset picker for AssetRef<T>, a dropdown for an enum.

Other attributes: DEKI_TOOLTIP, DEKI_GROUP, DEKI_UNIT(px) to edit metres in pixels, DEKI_VISIBLE_WHEN to hide a field until another allows it, andDEKI_EDITOR_ONLY to keep one out of the build.

What you see is what the device draws

Scene view: the 320x240 canvas with the demo scene

Play mode runs the scene through the same RenderToBuffer() path as hardware, at the panel’s real size. Edit mode, play mode and the board agree, because it is one renderer rather than a preview of one.

Hot reload

Focus the editor after an edit and HotReloadService diffs the source tree, unloads the package and plugin DLLs, rebuilds through CMake, and re-registers the component editors, with the scene still running.

Undo that behaves

Every edit is a command, and commands merge: dragging a slider is one undo entry, not hundreds. A multi-selection edit batches into one command applied to every selected object.

Build and flash

The Build panel reads the board config and runs the toolchain end to end: generate the platform CMake, build firmware (ESP32 through ESP-IDF), export assets to storage/ as .tex, MessagePack .scene and baked fonts, then flash over USB. The same export populates an SD card for offline boot.

Scripting it

The editor ships an MCP server. Launch with --mcp and the scene, assets, package manager, builds and screenshot capture are on JSON-RPC, enough to take a project from nothing to a captured screenshot. Every editor image on this site was made that way.