Visual Novel Editor
Everything you create and cast
The Visual Novel Editor
The editor is where a visual novel gets built: the cast, the places, the script, the media, and the shape of the story. It is one page with a tab strip, and it saves as you work.
This page is the reference for the editor. For what a visual novel is, how the four types differ, and what a reader sees when they play one, see Visual Novel.
The editor is in Beta. It is complete enough to build and publish a story with, and parts of it are still moving.
Getting in
| From | What happens |
|---|---|
| Create Visual Novel in the Library create menu | Starts a new draft |
| Visual Novel in the Library sidebar or the dock | Starts a new draft |
| A visual novel in your Library | Opens that story |
/create/visual-novel | Starts a new draft, every time |
A visual novel is attached to a character card. That card is what carries it into Discovery and into a reader's library, and it is why the editor URL for an existing story carries a character id.
Open an existing story from your Library rather than from the address bar. The bare editor URL always starts a new untitled draft, so visiting it to look at something you already made leaves a spare draft behind.
The toolbar
| Control | What it does |
|---|---|
| Playtime badge | The estimated length of a playthrough, from the number of playable nodes |
| Import | Takes a .vnpack back in. Warns first if you have unsaved changes, because importing opens a different story |
| Export | Saves, then downloads the whole project as a .vnpack. Never blocked by readiness |
| Status | Draft, Published, Removed. Choosing Published runs the publish checks |
| Preview | Shows the side preview panel. Available on Overview, Story, Runtime, and Assets |
| Share | Saves and copies the story's public link |
| Test | Saves and plays the story from the start, inside the editor |
| Save | Saves now |
The title strip on the left carries the story's name and a save pill reading
Unsaved, Saving..., or Saved. After an import it also reports art upload
progress, because the pictures arrive after the rest of the pack.
Saving
Autosave fires about two seconds after you stop typing. Save saves immediately, and leaving the page with unsaved work warns you first.
Two buttons save before they run, because both read the saved draft rather than what is on your screen: Test, and Play from here on a card. Unsaved edits are saved first, so what you play is what you were looking at.
If the same story was saved somewhere else since your tab opened it, in another window or by Orison, your next save is refused instead of overwriting that version. A banner appears above the tabs and nothing saves from that tab again until you reload. This is deliberate: the alternative is the editor choosing which copy survives. Copy anything you still need out of the tab, then reload.
The tabs
| Tab | What you do there |
|---|---|
| Overview | Title, type, rating, description, the model's standing instructions, run defaults, genre tags, cover |
| Cast | Everyone who appears, their sprites and expressions, and their relationship meters |
| Locations | Every place, its backgrounds and audio, and where the story opens |
| Story | The script, read and edited as a document |
| Flow | The same story as a node canvas |
| State | The flags and counters the story declares |
| Runtime | Readiness, the relationship system, and the scene editor |
| Assets | Items, objectives, map, music, theme, menus, minigames |
Overview
The left rail holds the cover, uploaded or generated, and the counters:
| Counter | Reads |
|---|---|
Cast | Members |
Nodes | Nodes in the story |
Tested | Routes ticked as played, over routes the story has |
Locs | Locations |
Time | Estimated playtime |
A published story also shows Plays and Finished here.
The right column is a stack of cards:
| Card | What goes in it |
|---|---|
| Identity | The title, and the tagline a reader sees on the card. The tagline counter turns amber as you approach the limit |
| Classification | The type (Dating Sim, Visual Novel, CYOA, Kinetic Novel) and the rating (All Hours, Late Night, After Dark) |
| Description | Who the story is about, their world, the stakes |
| AI Prompt | Standing instructions for the model, for the whole story |
| Run Defaults | The preset and lorebooks a run starts with |
| Genre Tags | Genres for browsing. At least one is needed to publish |
AI Prompt goes in ahead of everything else, before the first message, and stays there every turn. Keep it short and imperative. It competes with the scene for the model's attention, and a long one crowds out the beat you are trying to play.
Run Defaults are applied when a run starts and left alone after that, so a
reader can still change them and a run in progress is never touched. The preset
field defaults to Whatever the player already uses. Naming one here is the
difference between every reader playing your story the way you tuned it and
every reader playing it on whatever they used last.
Beside the form is a Discovery Preview: the card as a reader will meet it, with the type badge, the playtime, the tagline, and the tags.
Cast
The roster strip runs along the top, every member as a thumbnail, the selected one lit. A search box and a role filter appear once the cast grows past a handful. Groups orders the roster and gathers members under headings of your own, and a group can declare the expressions everyone in it should have, with a coverage count so you can see who is missing one.
Below the strip, two panels.
The sprite panel holds the main sprite and the expression grid. You can upload, generate from a prompt seeded by the character, or strip a background with a tolerance and edge-softness control. Three bulk actions save most of the work:
| Action | What it does |
|---|---|
| Share Slots | Gives every other cast member the same expression slots |
| Upload Many | Matches a pile of files to existing slots by filename |
| Generate All | Draws the whole default expression set from the main sprite |
Files that match nothing land in Unplaced, where Suggest asks a helper model which expression each one looks like. Suggestions are named, not applied: nothing uploads until you accept it.
The detail panel holds who the character is.
| Field | Notes |
|---|---|
| Cast ID | The name the rest of the story refers to. See below |
| Display Name | What a reader sees |
| Role | Protagonist, Love Interest, NPC, or Narrator |
| Group | Which roster heading they sit under |
| Hidden Character | Keeps them out of sight until the story reveals them |
| Prose fields | Appearance, Personality, Backstory, Motivations, Speech Pattern, Quirks, Secrets. Each opens into a full-size editor |
| Relationships | Prose, for the model |
| Relationship Meters | The numbers, per character |
Renaming a Cast ID rewrites the whole story: staging, conditions, gifts, objectives, beats, and both sides of every relationship. The editor checks the new id is free before it does it. This is the only safe way to rename one.
Relationship Meters are where a character's numbers start, and what each one means: what it tops out at, the smallest and largest move it allows, its icon and colour, and what raises and lowers it. Meters another character already declares can be copied in one click. The story-wide half of the system lives under Runtime.
For what makes a cast member work, expressions especially, see Cast Members.
Locations
Starting Setup is the first scene: the opening message a reader lands on, the location, the background variant, and the opening music. If your opening staging names a character or a place that no longer exists, the panel says so and offers to move the staging onto the scene or clear it.
The location roster works like the cast roster, groups included, with an Upload many tile that sends each file to the location its filename matches and lists whatever it could not place.
For the selected location:
| Section | What is in it |
|---|---|
| Background | The default image, uploaded or generated |
| Variants | Alternate backgrounds, each with an optional Shows when condition built the same way conditions are built everywhere else |
| Identity | Name, group, and the description the model reads |
| Connected Locations | Which places are reachable from here. Connections are made both ways for you |
A variant with no condition is not orphaned: it still shows when a scene names it, or when the story sets it outright.
See Locations for what each field is for.
Story
The Story tab is your script. It reads top to bottom like a screenplay, and it is also where you edit: every card on the page is the node itself, not a preview of one.
It edits the same story the Flow tab draws. Either view writes the whole thing.
The four kinds of node
| Node | What it is |
|---|---|
| Plot Point | A moment you write, bound to a scene |
| Scenario | A stretch the model plays out until one of its ways out is met |
| Choice | A question put to the reader, with options |
| Ending | Where a route stops |
A fifth kind, the condition node, still exists in older stories and is drawn here as gated rows under the transition that leads into it. You cannot add a new one from this tab; conditions belong on the ways out of an ordinary node.
How the document is laid out
The walk starts at the beginning and follows the story depth first. Every node appears exactly once, at the first place the walk reaches it. A later reference to a node already drawn is a jump pill rather than a second card, so a loop or a converging route never duplicates a scene.
Branches are inline. Where a node has more than one way out, the first continues down the page and the others follow underneath.
A transition to the card immediately below is next. A target drawn elsewhere
is a jump. A node that leads to itself is stay. A node that ends the story is
an ending.
The Reading Path bar
The bar across the top names the route you are reading, as pills, with the transition taken between each pair. Where the earlier node had more than one way on, a chevron opens the alternatives, and picking one re-lays the document below that fork only. A long route collapses its middle; click the gap to open it.
The bar also carries:
| Control | What it does |
|---|---|
path N of M | Where this route sits among the enumerated routes. not a full route means what you are reading does not end on an ending |
tested | Whether this route carries a tested mark. Click to tick or untick it by hand |
all paths | Every route from the start to an ending |
in Flow | Lights this route on the Flow canvas |
All paths
The dropdown lists every route from the start to an ending, grouped by ending, sortable by ending or by length, and filterable by node label, choice text, or a state variable named in a condition. Each row can be ticked as tested or made the route you are reading.
Two sections at the bottom earn their keep:
- No ending. Routes that loop forever, and cycles nothing leaves, each with a jump to the node that loops back. This is usually a mistake rather than a design.
- Tested, route gone. Marks whose route the story no longer has, with a button to clear each one.
Enumeration stops at a cap and says so, and the Tested counter on Overview
counts against the same capped total.
Tested marks
A tick means someone played that route start to end. Test mode ticks routes by itself; see below.
Marks live with the story, so they travel with export and import. A mark
survives edits to the nodes on its route, because it is keyed by the route
rather than by the words on it. A structural change that removes the route
leaves the mark in the Tested, route gone list rather than deleting it.
Nothing is unticked silently.
The outline and the story map
The Outline on the left lists every node in reading order, grouped by chapter once you have chapters, with endings and loose nodes after them. Nodes the walk never reaches are the Unreachable group; drag one onto a target pill or an insert slot to wire it in, or remove it from the story.
The Story Map on the right is a minimap: one bar per card, with purple arcs for the jumps, dashed where a jump goes backwards. Hovering an arc names both ends, clicking selects the target. On narrow screens the map hides and the outline stays.
The cards
Collapsed, a card shows its type, its name, its choice options with their destinations, where it is set and who is in it, and a dot if it has problems.
Expanded, it is the whole node. The type is a select, and changing it clears
whatever the new type cannot use. The node id is editable in the header, and
renaming repoints every reference to it. The card menu offers Set as start,
Duplicate, Play from here, Show on the Flow canvas, and removal.
What the body holds depends on the type:
- A Plot Point binds a scene, says what happens in it, and stages the place and the people.
- A Scenario carries the prompt for the model and lists the ways it can end, first that fits wins. It also shows the state it may read and write.
- A Choice carries the question and its options, each with an optional gate, effects, a hidden prompt for the model, and a face to wear while the reader considers it. Options drag to reorder and there is a fallback row for when none is visible.
- An Ending carries its end card, its route grouping, and whether it is the canonical ending. It also lists how many paths reach it. To continue a story past an ending, convert it to a Plot Point from the card menu.
Every card also carries Feel (a mood), how hard the model should lean on it, and notes for the model.
Ways out
Each way out is a row: the cue that fires it, an optional gate on the state, an
optional set of effects, and where it goes. Rows drag to reorder, which is the
order they are tried in. The footer adds another way out as next, stay, a
jump to an existing node, or an ending.
Target pills say what they point at: a name for the card below, a purple pill
with a scroll arrow for a node drawn elsewhere, a green pill for an ending,
stay here for a self-loop, and an amber dashed where? for one that is not
wired yet. Clicking a pill opens a picker that can also make the node it needs.
Chapters
A chapter is editorial grouping and nothing else. The runtime never reads one
and the model is never told about them. Headings appear where the chapter
changes, marked continued when the walk returns to one it left, and each card
can be moved between chapters from its own disclosure.
Insert slots
Between cards, Insert here adds a node on that transition rather than leaving
it loose. Dragging an unreachable node onto a slot connects it there.
Show in Flow
in Flow switches to the Flow tab with the route lit and everything else
dimmed, framed on the route, with a strip naming it and a Clear button.
Flow
The Flow tab is the same story as a node canvas: a card per node, a port per way out, and edges you draw between them. It is where conditions and model-chosen branches are authored.
The rail on the left holds three things: your Scenes, which drag onto the canvas or open for editing; Problems, each row framing the node it is about; and a Legend for the edge colours.
The canvas. Drag to pan, shift-drag to rubber-band a selection, and ctrl-click or cmd-click to add to it. Selecting an edge and pressing Delete unwires that way out; it does not delete a node. With two or more nodes selected an arrange bar appears with alignment and spacing, and a delete that tells you links into those nodes will be cleared. There is no undo for the graph, so the confirmation is the safety net.
The marquee carries a health chip, Auto-arrange, Fit, and JSON export and import. Importing JSON replaces the graph, so it asks first.
The inspector on the right edits the selected node: its name, its type, its scene, its beat fields, and its ways out. It can set the node as the start, duplicate it, fold a condition node into the node before it, open the same node in the Story tab, or start a test run there.
Node cards use the same words the Story tab uses: Plot Point, Choice, Condition, Scenario, Ending. Edges are coloured by kind, and an edge that points at a node that no longer exists is red.
On a narrow screen the canvas is replaced by an outline of the same graph, one tappable row per node with its ways out listed underneath.
State
Every flag and counter the story declares, with every place each one is read or written, and the only way to remove one.
Declare a name with its kind and its starting value. A name that is used but never declared is called out in amber, because a condition on it can never be true. A name that is declared and used nowhere is called out too.
Deleting a name that is still in use asks first, and says how many references will be left pointing at a name the story no longer declares. Those conditions stop firing and nothing else reports it, which is exactly why the usage list is there.
Renaming is deliberately not offered here. Relationships have their own editor on the Cast tab.
Runtime
Readiness
A visual novel plays in one of two ways, and the panel at the top says which one yours is in.
AI-Directed needs no graph at all. The narrator invents movement and choices from your cast, places, and beats. This is the mode while scenes and graph nodes are both empty.
Authored Path is the other mode, and it has five checks:
| Check | What it wants |
|---|---|
Scene created | The path begins with a scene that exists |
Start scene connected | The first node points at that scene |
Ending node added | At least one node is an Ending |
Reachable ending | An ending can actually be reached from the start |
Connections valid | Every scene and branch target still exists |
Readiness gates publishing. It does not gate export, so a story mid-build can still be backed up.
The relationship system
The story-wide half of relationships lives here: the overall sympathy meter and what it is called, and the difficulty presets that set how large a move can be. The per-character half, where each character starts, is on the Cast tab beside the character it describes.
The scene editor
While the story is still AI-Directed, Build An Authored Path opens the scene editor. A scene holds its id and name, its location and background variant, its sprite staging, any scripted dialogue, and the AI context that says what should happen in it.
Once the story has a scene or a node, that button is no longer shown, and it is not needed: the story is authored on the Story tab and on Flow from then on, and a scene is opened from the card that binds it or from the scene list on the Flow rail.
Export and import
Export bundles the whole project, media included, as a .vnpack. It saves
first and then bundles, and a media-heavy story can take a minute. Incomplete
scenes and half-finished graph work are included exactly as they are, so an
export is a safety copy at any stage.
Import takes a .vnpack back. Art arrives after the rest, so a freshly
imported story fills in its pictures for a moment after it opens, and the title
strip reports how far along that is.
Assets
Assets holds everything the story owns that is not cast, place, or script. Sections that hold a list show their count in the strip.
| Section | What is in it |
|---|---|
| Director | Whether the story allows generated scene images, which treatments it allows, how often, which locations are safe as backgrounds, and the art direction and negative prompt they carry |
| Items | Gifts, key items and collectibles: icon, description, tags, category, rarity, per-recipient metrics, and whether an item is single use |
| Objectives | Goals and their prompts: priority, how one is completed, how it can be lost, whether it is hidden until triggered, and what completing or failing it changes |
| Map | The map image and its hotspots, or a grid fallback, and where the map can be opened from |
| Music | Tracks with their category, volume, and looping, added one at a time or as a list of URLs. Shared music can be imported, credits included |
| Theme | The look of the player interface: colours, fonts, dialogue box and choice styles, transitions, with a live preview. Emotion inference is configured here too |
| Minigames | The minigames the story can call, and their per-type settings |
Director is the story's half of the Visual Director. It sets the bounds. A reader turns it on for their own run from Scene Commands in the pause menu, where the Interpreter lives too. A story that does not allow Director visuals never generates one, however a reader has their scene set.
The theme's accent colour is mirrored onto the story's character card, so the library card and the chat chrome match the story.
With Preview on, this tab shows a real stage rather than a card, so a theme can be judged against a background, a character, and an expression of your choosing.
Testing your story
Test mode plays your story as a reader would, inside the editor, and lets you edit the beat you are standing on without leaving the run. While a session is open the editor is paused: the tabs come back when you exit.
Starting a session
| From | Starts at |
|---|---|
| Test in the toolbar | The beginning |
| Play from here on a Story card | That beat |
| Play from here in the Flow inspector | That beat |
All three save first. Sessions are numbered and recorded in the story, so a session survives a refresh.
A run that starts at a beat begins with that beat's own opening if it has one, and with nothing invented if it does not. Flags, counters, and relationships still start where the story says they start: the request is a position, not a state.
The stage
The stage is the real player page in a frame, not a copy of it. What you see is what a reader sees, rails and bars included, because it is the same page.
| Preset | Size |
|---|---|
My window | However much room the editor has |
Tablet 768 | 768 by 1024 |
Phone 390 | 390 by 844 |
A device preset turns on its side with the rotate button. The frame is scaled down to fit and never scaled up, because a phone shown larger than a phone is not a phone; the corner reports the size and the scale.
The session bar
| Control | What it does |
|---|---|
| Session and take | Which session this is, and which take if you have branched |
| Step readout | The step, the turns played, and the node the run stands on |
| Undo turn | Drops the last turn and the move it made |
| Force exit | Takes a way out by hand, whether or not its gate is open. The list marks which can fire now |
| Restart | Drops this run and opens another from the same place |
| Start from | Drops this run and opens one at any node you pick |
| Exit test | Leaves test mode. The test chats are deleted |
The trace
The left column is every landing the run has made, in order, numbered. Each
step shows the way out taken, its gate, its effects, and any condition nodes
crossed on the way. Steps are marked healed when an option pointed at a node
the story no longer has, forced when you took it by hand, and model jump
when the model named a node no way out led to.
Clicking an earlier step rewinds the run there and cuts the transcript to match. Hovering a step offers insert scene before, which puts a new Plot Point on the transition the run arrived by, and branch here, which forks the run into a new take.
When a node has been landed on several times the panel says so outright, which is how a loop announces itself.
Below the trace is the state: every flag, counter, and relationship with its current value and the step it last changed at, and the current node's automatic variables, which are its visit count, its turn count, and the way the run last left it. Any way out can be gated on those.
The node card
The right column is the node the run stands on, reduced to what matters while testing: its prompt, its notes for the model, and its ways out. Each way out is marked with whether it can fire for the state the run is in right now, which is the quickest way to find a gate that never opens.
Edits here reach the story and the running scene at once, so the next turn reads the edited node, and the words you changed are marked while the run is live.
Below the card, what the model saw this turn lists the beat as the model received it: the node, its feel, how hard to lean on it, and every way out it was offered. A run that reads badly is usually explained here.
Notes on this run is free text that saves onto this run's tested mark.
Tested paths
A session that started at the beginning and reached an ending along a listed route ticks that route by itself, and says so. A session that started at a beat never ticks one, because it did not play the beats before it. An ending reached with a Force exit on the way, or by a jump the story does not list, is reported rather than ticked, and you can tick it by hand if you meant it.
Loops are collapsed when matching, so walking a node twice does not stop a route from being recognised.
If you have the story open in another tab, that tab picks up the new mark rather than treating it as someone else's edit.
Leaving
Exit test ends the session and deletes its chats, takes included, and so do Restart, Start from, and opening a node in Story. Test chats are hidden from your library and from the scenes list, and a real play never resumes one.
Publishing
A visual novel is published as a character, through the same dialog.
Five things are checked before the dialog opens, and the editor switches to the tab that needs work:
| Blocker | Where |
|---|---|
| Add a title | Overview |
| Add at least one cast member | Cast |
| Add at least one location | Locations |
| Add a plot point or a scenario | Story |
| Finish the authored path | Runtime |
The last one is the readiness checklist above. A story in AI-Directed mode passes it by having no authored path to finish.
Two more things are checked inside the dialog:
- At least one genre tag. A story with none cannot be published.
- The safety review, the same automated review every character goes through. A rejection explains itself, and a review that fails to run offers a retry.
The dialog is also where the story is made public or kept private.
Keyboard
The editor binds no global shortcuts. There is no keyboard save, and no undo for the graph.
What is bound is local:
| Where | Key | Effect |
|---|---|---|
| Flow canvas | Delete or Backspace | Unwires the selected link |
| Flow canvas | Shift and drag | Selects a rectangle of nodes |
| Flow canvas | Ctrl or Cmd and click | Adds to the selection |
| A node id, a chapter name, an expression name | Enter | Commits |
| The same fields | Escape | Reverts |
| A collapsed card | Enter or Space | Opens it |
| Any dropdown or picker | Escape | Closes it |
Orison in the editor
Understudies.
Orison can work on the story with you from this page. It knows which tab you are on and what you have selected, and it can create a scene, stage a character in one, add a line to one, attach a scene to a node, and delete a scene nothing uses.
Its edits land in the editor the same way yours do, so they are yours to save or discard. If it changes the story on the server while you have unsaved work, the editor says so rather than quietly reloading underneath you.