Dialogue flows that know your game
A node-graph editor wired to your actual data model. Smart triggers, priorities, and lookup groups pick the right line for the right NPC — choices persist straight into the save file.
Fornarrative gameswherechoices matter
Neo Compose turns your game's data — schemas, branching dialogue, saves, levels, and translations — into one living project that ships straight into Unity as typed C#. Author it on the web, sync it in realtime, version it like code.
$ npx @neocompose/cli init
⚡ Trigger
save.Gold >= 50
💬 Choice — cursed sword
“Only 10% cursed. Barely haunted.”
🪙 Buy it
save.Gold -= 50
🐀 Pet the shop rat
save.RatFriendship += 1
🗡 Action
save.Items.Add(CursedSword)
Everything your narrative, design, and engineering teams touch — in a single versioned source of truth.
A node-graph editor wired to your actual data model. Smart triggers, priorities, and lookup groups pick the right line for the right NPC — choices persist straight into the save file.
Design assets, saves, and session data with custom types, enums, lists, and computed getters — no spreadsheets, no hand-rolled JSON.
One click exports project.json plus generated C#. neo.Save.World, Dialogues.NPC.Talk.TryTrigger(npc, out var line) — autocomplete all the way down.
Per-project OAuth, cross-platform save sync, and realtime live sessions: edit a value on the web and watch it change in-game while you playtest.
ICU strings, locale source chains, translation statuses, and import/export pipelines — every player-facing string versioned per locale.
Semver releases, branches, channels, migrations, and full changelogs. Patch drafts can't break your runtime contract — the tool enforces it.
Notion-style pages with live database blocks. Document a quest next to the actual quest data — it's never out of date.
The neo CLI mirrors your project as compilable C#: pull, push, diff, branch, merge. Perfect for code review — and for your coding agents.
Coming soon: pages, layers, smart tiles, and object palettes — where any tile can be static art or live save data, all wired to NeoScript and your dialogue flows.
This dialogue was authored as a flow. Pick an option and watch it write into the save file — exactly what your game gets at runtime.
Grubbins
The Rusty Gobl-Inn · Discount Curses & Sundries
▌
● wandering-otter-619.save
LIVE{
"values": {
"Gold": 80,
"RatFriendship": 0,
"Items": []
}
}Authoring your schema in a web app costs you nothing in code quality. The output is native Unity C# — inheritance, bindings, and all — kept byte-for-byte in sync with what you see in the UI.
// Generated from your project — reads like hand-written Unity codepublic sealed class CursedSword : Weapon // your abstract types, real inheritance{public float CurseLevel => value.CurseLevel; // 0.1f, tops}var neo = RustyGoblInnNeo.Instance;if (neo.Dialogues.Shop.Grubbins.TryTrigger(npc, out var line))DialogueUI.Show(line);neo.Save.OnChanged(Save.Fields.RatFriendship,rat => bartholomew.Squeak()); // typed, no string keys
Built for humans and agents
Every project is also a C# working copy. Edit the schema below and watch the code follow — the same files your team reviews in PRs and your coding agents read, edit, and neo push right back.
Schema editor · web UI
neo/Schema/Save.csIN SYNC
namespace RustyGoblInn.Schema;[NeoCustomType]public partial class Save{public int Gold = 80;public int RatFriendship = 0;public List<Item> Items = [];}
Same source of truth as the visual editor — pull it, grep it, review it, let an agent refactor it. Nothing drifts.
Live save sessions stream patches both ways over a realtime socket. Drag a slider in the web editor — or play from the game side — and watch the other end follow.
Neo Compose · web editor
gameSaves.patchLiveSnapshot · per-key merge · offline queue
Unity · play modeLIVE
Tavern
wandering-otter-619 · The Rusty Gobl-Inn
HP72/100
⟲ patch applied in-game
Coming soon
A collaborative level editor with pages, layers, smart tiles, and object palettes. Chop three oaks for Grubbins' hearth — the rubble in the corner is quest-locked.
🌒 Gobl-Inn back garden · Background
🕐 06:00 · Grubbins: tend the soil
Quest · Firewood for the hearth
chop oaks with the axe · Wood 0/3
Tiles can be static art or live save data — and it's all NeoScript-aware. Chopping writes Wood to the save; turning in the quest clears the map.
Layers
Routine · Grubbinsstall CLOSED
Routines run on the clock and gate content through NeoScript — try buying the cursed sword at 20:00 and the trigger fails.
● wandering-otter-619.saveLIVE
{
"values": {
"Wood": 0,
"OakTrees": 3,
"ShopOpen": false,
"Quests": {
"Firewood": "Active"
}
}
}The wiki embeds the same database your game code reads. Pick an NPC — the values, changelog, and linked dialogues are live, not copy-pasted screenshots.
📖 Wiki · Cast of The Rusty Gobl-Inn
Embedded database block — Assets.NPCs
Wiki editor & moderator roles control who writes — built for community-facing docs and mod teams.
Assets.NPCs.Grubbins · Shopkeeper
Changelog — auto-linked to values
Linked dialogues
Enterprise-grade, indie-friendly
Policy-based roles, per-channel access, and per-project OAuth with narrow scopes. Pick a role — from org owner to anonymous player — and see what it can touch.
Developers edit schema, values, and dialogues, and ship to internal channels — production stays out of reach unless granted.
Development
open to the team
Staging / Beta
invited playtesters
Production
the public, once you ship
Player saves, debugged in place
Opens a beta tester's shared save in the web editor, fixes the corrupt value, ships the patch.
wandering-otter-619.save · shared by 🎮 ottilie → 🛠 team · snapshot restored ✓
Tokens that can't overreach