· 6 min read ·

Why Game Developers Keep Building Their Own Script Editors

Source: lobsters

The spreadsheet habit in game development is older than most of the tools designed to replace it. Game designers have been managing dialogue trees, quest parameters, and encounter tables in Google Sheets and Excel for a long time, not because it is ideal but because the tooling cost is zero and the learning curve is flat. A writer can open a spreadsheet and start filling in rows without reading documentation or installing anything. That friction advantage is real, and it explains why spreadsheets persist even at studios that have the resources to build something better.

Misty’s decision to build a visual game script editor from scratch is the natural endpoint of a frustration most game developers encounter eventually. It is worth tracing how that frustration accumulates, because the problems are structural, not cosmetic.

How Spreadsheets Fail Game Data

The most immediate problem with spreadsheets as a game data format is the absence of a type system. A cell in Google Sheets can hold a number, a string, a formula, or nothing at all, and nothing prevents a writer from typing a character name that does not match any character in the game database. Relational references between sheets, the kind needed when a dialogue line has to reference a speaker, a location, and a set of prerequisite quest flags, are just string values that can go stale without warning. The only place these relationships get validated is at runtime, which means a malformed export might only surface as a crash or a missing character portrait during a playtest three weeks later.

Version control is a second structural problem. Excel files are binary; git cannot diff them meaningfully. Google Sheets has revision history but no branching, no pull request workflow, and no way to merge concurrent edits without the collaboration being synchronous. As a project accumulates multiple writers editing different parts of a large narrative graph, the workflow starts to look like shared mutable global state with no locking, which is roughly what it is.

Scale compounds both problems. A small game with fifty dialogue nodes is manageable in a spreadsheet. A game with five hundred nodes spread across characters, quests, and tutorial sequences produces a spreadsheet where finding a specific node requires knowing its row number or relying on search, and where a structural change to the data model means editing every row by hand.

What the Existing Tools Offer

The tools built specifically for game narrative mostly address these problems, each with a different set of trade-offs.

Twine solves the visual representation problem well. Its passage-based node editor maps naturally to a branching narrative, and output is a self-contained HTML file. The issue is integration: Twine was designed for standalone interactive fiction, not for feeding dialogue data into a Unity or Godot project. Getting data out of Twine and into an engine requires a pipeline whose complexity depends heavily on the story format in use, and none of the options are seamless.

Yarn Spinner was built specifically to fill that gap. It uses plain-text .yarn files with a Twine-inspired node syntax, a bytecode compiler, and runtime libraries for Unity, Godot, and other engines. The VS Code extension adds a graph view and live preview. Yarn Spinner 2.x introduced a proper compiled VM; version 3.0 has been working on a saliency system that lets the game ask which dialogue line is most contextually appropriate rather than following a deterministic branch. It solves the integration story cleanly, but it is a dialogue system at its core. If a game’s scripting layer needs to handle more than branching text, such as scripted AI sequences, cutscene choreography, or custom event graphs, Yarn Spinner’s data model is not the right fit.

Ink, from inkle Studios, takes a different approach by making the format writer-friendly plain text. Knots and stitches organize the narrative; choices, diverts, tunnels, and tags cover most narrative patterns. The companion editor Inky provides a playthrough pane alongside the source. The runtime has excellent C# and Unity bindings, plus community ports to JavaScript, Python, and Rust. Where Ink gets complicated is in large stories: the graph structure is implicit in the text rather than visually represented, and navigating a complex story with dozens of knots becomes less intuitive than a proper node editor.

Articy:draft is the most complete commercial option. It has a flowchart editor, a full object database for characters and items, scripting support with a custom expression language, and integration plugins for Unity and Unreal. Studios with dedicated narrative designers and the budget for the license often land here. The cost is real, the workflow is opinionated, and the integration layer adds meaningful complexity to the build pipeline.

The Gap That Drives Custom Tooling

Every tool in this list was built around a specific data model. Twine assumes standalone passages. Yarn Spinner assumes dialogue nodes with choices and commands. Ink assumes a narrative document with branches. Articy assumes a flowchart of dialogue and entities. When a game’s scripting requirements fit one of those models, adopting an existing tool is the right call. When they don’t, you end up either bending the tool to match your data or bending your data to match the tool, and the second option tends to be more expensive over time.

A game with scripted tutorial sequences, combat encounter triggers, and branching dialogue all in the same scripting layer needs a data model that can represent all three coherently. Off-the-shelf tools rarely cover that range without custom extension. A well-designed in-house editor that generates exactly the format the game runtime expects removes the import/export boundary entirely, which eliminates a class of bugs that only manifest at the interface between the editor’s output and the engine’s data loader.

What Building a Visual Script Editor Involves

A node-based visual editor has a small number of core concerns.

The first is the graph data model: nodes with typed ports, directed edges between ports, and a serialization format that survives iteration on the node schema. JSON with stable string IDs for nodes and edges works better than integer indices for version control purposes, since inserting a new node in the middle of a sequence does not renumber everything downstream. A schema versioning strategy is worth designing early, because the kinds of changes that seem safe, such as adding a field to a node type, can produce subtle breakage in graphs that were serialized before the change.

For the rendering layer, Dear ImGui with a node editor extension is the most common choice in the game dev tooling space. Libraries like imgui-node-editor and the simpler imnodes provide a drag-and-drop node graph surface as an immediate-mode overlay. The advantage of Dear ImGui for tooling is that it requires no UI framework, integrates naturally with a hot-reload workflow, and can render inside the game’s own window. The disadvantage is that it was not designed for polished end-user interfaces; styling options are limited and accessibility support is minimal. That trade-off is usually fine for an internal tool where the primary users are the development team.

The serialization question deserves more attention than it usually gets. Script data edited by writers needs to be diff-friendly for version control, which rules out binary formats and discourages large monolithic JSON files. A directory of small per-node JSON files, one file per node, is version-control-friendly because editing a single dialogue node only modifies a single file. The trade-off is that loading the full graph requires reading potentially hundreds of small files, which is acceptable for a development tool but worth considering if the same format is used directly at runtime.

The integration with the game runtime is the third major concern. The cleanest architecture is a one-way pipeline: the editor serializes to a data format, the runtime reads it. Bidirectional live editing, where a running game reflects changes back to the editor in real time, is powerful but significantly more complex and typically only justifies the engineering cost for games with long iteration cycles on scripted sequences.

When the Investment Pays Off

Building a custom script editor is not always the right call. For a solo developer or small team making a game with a narrative structure that maps cleanly onto an existing tool, adopting Yarn Spinner or Ink and accepting their constraints is faster and cheaper. The maintenance burden of a custom editor is real: as the game’s data model evolves, the editor must evolve alongside it, and that work does not ship gameplay features.

The calculus changes for teams with non-standard scripting requirements, or for developers who have already spent time debugging runtime crashes caused by stale spreadsheet references that nobody noticed for weeks. A type-safe editor with relational validation, one that can tell a writer at authoring time that a referenced character ID does not exist, eliminates that category of defect entirely. The spreadsheet is nearly always where the story starts; it rarely stays the final answer.

Was this interesting?