Fornarrative gameswherechoices matter

Build worlds,
not spreadsheets.

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)

🧬 Visual schemas💬 Branching dialogue🛠 Typed C# codegen☁️ Cloud saves⚡ Realtime live sync🌍 ICU localization🏷 Semver releases📖 Game wiki🤖 Agent-friendly CLI🛡 Role-based policies🚀 Release channels🧩 Built for modding🧬 Visual schemas💬 Branching dialogue🛠 Typed C# codegen☁️ Cloud saves⚡ Realtime live sync🌍 ICU localization🏷 Semver releases📖 Game wiki🤖 Agent-friendly CLI🛡 Role-based policies🚀 Release channels🧩 Built for modding

One project. Every system.

Everything your narrative, design, and engineering teams touch — in a single versioned source of truth.

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.

Visual schema builder

Design assets, saves, and session data with custom types, enums, lists, and computed getters — no spreadsheets, no hand-rolled JSON.

Typed C# for Unity

One click exports project.json plus generated C#. neo.Save.World, Dialogues.NPC.Talk.TryTrigger(npc, out var line) — autocomplete all the way down.

Cloud saves & live sessions

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.

Localization built in

ICU strings, locale source chains, translation statuses, and import/export pipelines — every player-facing string versioned per locale.

Version everything

Semver releases, branches, channels, migrations, and full changelogs. Patch drafts can't break your runtime contract — the tool enforces it.

A wiki that's part of the game

Notion-style pages with live database blocks. Document a quest next to the actual quest data — it's never out of date.

Schema as code

The neo CLI mirrors your project as compilable C#: pull, push, diff, branch, merge. Perfect for code review — and for your coding agents.

A level editor, Figma-style

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.

Choices that stick.

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": []
  }
}

Generated C# that feels hand-written.

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.

  • Inheritance and abstract custom types generate real C# class hierarchies
  • Bind NeoScript functions to your own native C# methods
  • Typed change subscriptions — no string keys, no reflection in your hot path
  • Autocomplete across your entire data model; if it compiles, it matches the project
// Generated from your project — reads like hand-written Unity code
public 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

The UI is the code.

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.

Tune values while you playtest.

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

Design levels like it's Figma.

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

  • ▾ Foreground · OakTree ×3 / MarketStall
  • ▾ Background · Grass / Soil / Pond / StonePath / Rubble 🔒

Routine · Grubbinsstall CLOSED

  • 06:00 🌱 tend the soil
  • 09:00 🪧 open the stall
  • 17:00 🪣 fetch pond water
  • 20:00 🏠 head home

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

Docs that can't go stale.

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

NameRole❤️

Wiki editor & moderator roles control who writes — built for community-facing docs and mod teams.

👺 Grubbins

Assets.NPCs.Grubbins · Shopkeeper

Changelog — auto-linked to values

  • 1.2.0Friendship default 0 → 12 (returning players)
  • 1.1.0Added CursedSword to shop inventory
  • 1.0.0Created with role Shopkeeper

Linked dialogues

💬 Sword sales pitch💬 Curse disclosure💬 Haggling 101

Enterprise-grade, indie-friendly

Ship to the right players.

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.

edits schema & dialoguesreads the team wiki

Development

open to the team

readpublish

Staging / Beta

invited playtesters

readpublish

Production

the public, once you ship

readpublish

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

  • · Per-project OAuth clients with player-consented scopes
  • · Device-code sign-in from Unity and shipped games
  • · Secure channels can require OAuth on top of API keys
  • · Every policy editable — from invited-email betas to fully public production