Roblox × Story OS
Make a Roblox story game from your story.
BunCho's Story OS exports your story as a Roblox project with NPC dialogue, quests, branches and endings. You build the world in Roblox Studio; BunCho gives you the story structure and the dialogue. We compete on long-form structure, consistent characters and branches that hold together.
From one sentence to a published game
- Type one sentence into Story OS's New series and the AI drafts the plot, characters and scenes (uses credits). Or start from a ready-made template.
- In the Game tab, add choices and flags (has the key, solved the cipher…). Dead ends, unreachable scenes and flags nobody sets are flagged as you go.
- Once Story Tests pass, Export to Roblox is enabled: a zip with a Rojo project, an .rbxmx model and a .json for the plugin.
- Import it in Roblox Studio with the BunCho plugin (or Rojo): NPCs, quests and the dialogue UI are placed for you.
- Build out the world, playtest with several players and publish on Roblox.
What you get
Below is the actual export of the template that matches this prompt, “Escape from the Old School” (unedited).
Story structure (branches and endings)
15 scenes and 5 endings. Arrows are forward choices (10 return paths, such as going back to the classroom, are not drawn).
All three together / Escaped / The truth about the prank / The back-door password / Waiting for morning
Three NPCs (personality, voice, secret, behaviour)
Haru
Class representative
- Personality
- Bossy and acts tough, but has the strongest sense of responsibility.
- Voice
- Crisp, commanding tone.
- Goal
- Bring everyone home
- Secret
- Believes a prank note he wrote is why everyone got locked in.
- Sample line
- “Stay calm. We find a way out in five minutes.”
Mio
Library committee member
- Personality
- Quiet and sharp-eyed; hates relying on others.
- Voice
- Speaks softly, briefly and precisely.
- Goal
- Crack the cipher
- Secret
- She almost got locked in here last year, and she is the one who left the cipher on the blackboard.
- Sample line
- “There's a number cipher on the blackboard.”
Sora
Track team member
- Personality
- Cheerful and chatty; scared of the dark.
- Voice
- Energetic and casual.
- Goal
- Get home before dark
- Secret
- Forgot she had the janitor's note in her pocket.
- Sample line
- “I want to get home before it gets dark…”
Behaviour: NPCs walk to the place of any scene they speak in; talked to elsewhere, they answer with their latest line. Secrets are developer notes and are never shown to players.
Quests (find the key, crack the cipher, open the door)
Flags that choices depend on become the objective list. The timer is 300 seconds; when it runs out the story jumps to the “Waiting for morning” ending.
- Check shelf 913
- Open the locker with the number from the cipher
- Take the note
- Trust Mio
- Unlock the front doors with the key
- Say the password at the back door
In-game UI
- Dialogue window: speaker name, one line at a time, Next
- Choices: with several players, a vote (majority, with a time limit)
- Objective display: a checklist and where to go next
- Timer: turns red with 30 seconds left
- Endings: how many you have found (out of 5)
I think the numbers on the board are library call numbers.
Check shelf 913Check shelf 400Go back to the classroomThe UI is built in code, so there are no image assets to manage. Change colors and fonts in the THEME table at the top of StoryClient.
Luau code
Data (Story, Strings) is separate from the moving parts (state machine, server, UI). The server checks every choice (server-authoritative).
-- src/shared/Story.luau
["n006"] = {
Title = "N.n006.title",
Place = "science",
Ending = false,
Events = { "lights_flicker" },
Lines = {
{ Key = "N.n006.1" },
{ Key = "N.n006.2", Npc = "haru" },
},
Choices = {
{ Id = "c013", Key = "C.c013", To = "n007", Requires = { "cipher" }, Sets = { "has_key" } },
{ Id = "c014", Key = "C.c014", To = "n002", Requires = {}, Sets = {} },
},
-- src/shared/StoryRuntime.luau
-- Applies a choice. Returns false (and a reason) when the choice is not open right now.
function StoryRuntime.choose(story, state, choiceId: string): (boolean, string?)
local c = StoryRuntime.findChoice(story, state, choiceId)
if c == nil then
return false, "choice_not_available"
end
for _, f in c.Sets do
local neg, name = negated(f)
state.flags[name] = if neg then nil else true
end
StoryRuntime.jump(story, state, c.To)
return true, nil
end
-- Quest objectives with their done state (flags that some choice requires)
function StoryRuntime.objectives(story, state)
-- src/server/StoryServer.server.luau
local function onChoose(player: Player, choiceId: string)
local session = sessions[sessionKey(player)]
if session == nil or not session.open or session.state.ended then
return
end
if Runtime.findChoice(Story, session.state, choiceId) == nil then
return
end
local voters = #members(session)
if Config.ChoiceMode ~= "vote" or voters <= 1 then
Saves
DataStore is optional (Config.UseDataStore). It saves endings found and solo progress. To test in Studio, enable Studio Access to API Services.
Localization table in 6 languages
Japanese, English, Spanish, Portuguese, Traditional and Simplified Chinese. Players see their Roblox language; missing ones fall back to the source language. localization/BunChoStory.csv also works with Roblox's localization tools.
What is in the zip
- BunChoStory.rbxmx
- NPCS.md
- README.md
- default.project.json
- localization/BunChoStory.csv
- src/client/StoryClient.client.luau
- src/server/StageSetup.server.luau
- src/server/StoryServer.server.luau
- src/shared/Config.luau
- src/shared/Localize.luau
- src/shared/StageBuilder.luau
- src/shared/Story.luau
- src/shared/StoryRuntime.luau
- src/shared/Strings.luau
- story-tests.json
- story.pack.json
Place everything with the Studio plugin
- Install the plugin (Creator Store listing coming; for now put the file below in Studio's Plugins folder)
- Open Plugins → BunCho → Story Pack and pick the exported .json, or paste an https URL
- Build stage now lays out rooms, glowing story points and NPCs from Parts (all editable)
- Press Play. For several players use Test → Clients and Servers
Using Rojo? Unzip, run rojo serve and connect from Studio. You can also drag in the .rbxmx (steps in the README).
Publish
Publish on Roblox and try to monetize it (any earnings depend on Roblox's terms and DevEx eligibility).
Why build it with BunCho
- Characters stay in characterPersonality, voice, first person and secrets live in the Character Bible, and Story Tests catch voice drift. NPC lines are exported from that canon.
- Foreshadowing pays offSetups are linked to the scenes that pay them off; anything left unpaid by the ending shows up in the tests.
- Choices and endings that hold togetherDead ends, unreachable scenes, flags nobody sets or choices that go nowhere block the export. Every ending is checked to be reachable before you get the files.
Designed with age ratings in mind
- No generative AI runs inside the game. Every line is fixed and checked at export time (no open-ended AI chat).
- Scares are only flicker, blackout, shadows, a whisper caption and a small camera shake. No blood, injuries or loud jump scares (Config.ScareIntensity = 0 turns them off).
- Answer Roblox's Maturity & Compliance questionnaire accurately for your own experience.
What you still do in Roblox Studio
- Build the world (the stage is plain blocks; for your own map, tag Parts BunChoStoryTrigger with a Place or Npc attribute)
- Sounds, models and animations you have the rights to use
- Multiplayer testing, thumbnails, description, questionnaire and publishing
Templates
Escape from the Old School
Three students are locked inside an abandoned school and must escape within five minutes. Find the key, crack the cipher, open the door. Five endings.
5-minute timer · 3 NPCs · key / cipher / door · 5 endings
The Mansion Without Lights
On a stormy night, a group of friends is locked inside an old mansion. Find the silver and gold keys and uncover the secret of the ghost girl who lives there. Five endings.
Co-op · silver and gold keys · spooky effects (all ages) · 5 endings
Pricing
Exporting to Roblox is included in BunCho plans. The Studio plugin and the templates are free.
FAQ
Do I need to know Roblox Studio?
Not to import and press Play. Building the world and publishing happen in Roblox Studio.
Does an AI chat with players in the game?
No. All dialogue is fixed text written at export time, which keeps the game suitable for all ages.
Can I use it to make a Roblox horror game?
Yes. The co-op horror template has key-hunting co-op, five endings and all-ages scares.
Can I use my own map?
Set Config.BuildStage = false and tag Parts BunChoStoryTrigger with a Place (place id) or Npc (character id) attribute; those become the story's entry points.
Is Rojo required?
No. You can import with the BunCho plugin or drag in the .rbxmx.
Features described are those available in BunCho today. A screen recording in Roblox Studio is in preparation. 日本語