<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Choice Story Studio</title>
    <description>The latest articles on DEV Community by Choice Story Studio (@choicestorystudio).</description>
    <link>https://dev.to/choicestorystudio</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3942134%2F471aba8f-933c-4a42-a380-59b92a67efc4.jpg</url>
      <title>DEV Community: Choice Story Studio</title>
      <link>https://dev.to/choicestorystudio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/choicestorystudio"/>
    <language>en</language>
    <item>
      <title>Building a visual novel's menu in layers, and placing every choice by hand - Devlog #5</title>
      <dc:creator>Choice Story Studio</dc:creator>
      <pubDate>Sun, 07 Jun 2026 01:00:53 +0000</pubDate>
      <link>https://dev.to/choicestorystudio/building-a-visual-novels-menu-in-layers-and-placing-every-choice-by-hand-devlog-5-2ici</link>
      <guid>https://dev.to/choicestorystudio/building-a-visual-novels-menu-in-layers-and-placing-every-choice-by-hand-devlog-5-2ici</guid>
      <description>&lt;p&gt;Hey again. Before a player makes a choice, watches a scene, or even starts a story, they see the menu. That's what this devlog's about.&lt;/p&gt;

&lt;p&gt;For a long time the menus in ChoiceStory were something you filled in. There was a main menu, you set a title, picked a background, dropped in a few buttons, and that was about it. The work since then went into turning all of that into something you design instead. You grab a button and drag it where you want. You stack backgrounds. You put the choice buttons that show up over a video exactly where they should sit. What you see in the editor is what the player gets.&lt;/p&gt;

&lt;p&gt;Three pieces came out of it.&lt;/p&gt;

&lt;p&gt;The first is &lt;strong&gt;layered backgrounds for the main menu&lt;/strong&gt;. Instead of one image or one colour behind your menu, you can stack up to five layers, images or a video, and move each one on its own. Think of it like layers in Photoshop: a still backdrop at the bottom, a slow video over it, a logo or a bit of foreground art on top, each one dragged and sized on its own. The bottom layer also sets the letterbox colour, the band that frames the menu, and that band is the contrast that keeps your title and buttons readable no matter how busy the art behind them gets.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://i.imgur.com/LwRTNo0.gif" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;i.imgur.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
 

&lt;p&gt;&lt;em&gt;Watch how the layers stack, and how each one drags and resizes on its own without dragging the others with it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;While we were in there we rebuilt the menu property panel into collapsible sections, because once you can do this much to a menu, a flat wall of controls stops being usable. We also pinned the editor to a fixed 16:9 stage. Sounds small, but it fixed a real problem: the surface used to stretch to fill whatever space it had, so resizing the window made your carefully placed elements drift. Now the stage holds its shape and what you place stays put.&lt;/p&gt;

&lt;p&gt;The second piece is the pause menu, which now runs on the same system as the main menu. Layered backgrounds, drag-and-drop, the same panel, all of it. Both menus sit on one shared engine underneath, so a change to one shows up in the other instead of us building it twice. That shared base is also why the third piece almost came along for free.&lt;/p&gt;

&lt;p&gt;The third piece is the &lt;strong&gt;choice screen editor&lt;/strong&gt;, the buttons that come up over a video when the player has to decide something, &lt;strong&gt;Late Shift&lt;/strong&gt; style. These used to be stuck to a layout we'd hardcoded. Now you design them by hand, and you can lay out each case on its own, whether a choice has two options or five. Drag the buttons where you want them, save, and every choice of that shape in your story follows the layout you set. The text scales to fit, so the same design holds up on a small laptop and a big monitor without you touching it.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://i.imgur.com/nU2S1Pn.gif" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;i.imgur.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;em&gt;Pick how many options the choice has, drag each button into place, then hit play to see it land over the live scene.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now the honest part.&lt;/p&gt;

&lt;p&gt;The layered background didn't go in cleanly. The first build of it shipped a crash. Drag the background colour control and the whole menu would flash white and freeze, with the app throwing a "maximum update depth exceeded." Turned out it was a single colour input box talking to itself: every value we wrote back into it kicked off another change, which wrote another value, in a loop that never settled. We reset back to the last solid version, kept the broken attempt on a side branch so we could pick it apart, and rebuilt the feature in small slices instead of one big drop, with the colour input rewritten so it can't re-enter itself like that.&lt;/p&gt;

&lt;p&gt;That mess also pushed us into a call we'd been circling for a while. We dropped solid-colour menu backgrounds for good. They were behind half the trouble. A white background quietly turned the white menu text invisible, and the hidden "colour mode" was the thing stopping people from just uploading an image. Backgrounds are images and video now, with the letterbox doing the job the flat colour used to. Less to set up, and a lot harder to end up with a menu you can't read.&lt;/p&gt;

&lt;p&gt;None of this is the flashy half of the tool. But the menu is the first thing anyone sees when they open a story, and the choice screen is the moment the whole "you decide" idea either lands or it doesn't, so it was worth getting the authoring right instead of leaving it baked in.&lt;/p&gt;

&lt;p&gt;Same ask as always. We're building this in the open and heading into alpha because we want the people who'll actually make stories with it to tell us what's wrong with it. If a menu workflow feels backwards, or there's something you'd need that isn't here, come say so. On &lt;a href="https://x.com/ChoiceStoryDev" rel="noopener noreferrer"&gt;X&lt;/a&gt;, in the &lt;a href="https://discord.gg/t3WFw9jGpE" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;, or by &lt;a href="mailto:contact@choicestorystudio.com"&gt;email&lt;/a&gt;. The harsh stuff especially.&lt;/p&gt;

&lt;p&gt;More soon...&lt;/p&gt;

</description>
      <category>visualnovel</category>
      <category>gamedev</category>
      <category>indiedev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>A real bug you can't see - and one that fixed itself (Devlog #4)</title>
      <dc:creator>Choice Story Studio</dc:creator>
      <pubDate>Mon, 01 Jun 2026 21:40:45 +0000</pubDate>
      <link>https://dev.to/choicestorystudio/a-real-bug-you-cant-see-and-one-that-fixed-itself-devlog-4-5g69</link>
      <guid>https://dev.to/choicestorystudio/a-real-bug-you-cant-see-and-one-that-fixed-itself-devlog-4-5g69</guid>
      <description>&lt;p&gt;Hey. No new feature this time - just a pass through the corners before the next one.&lt;/p&gt;

&lt;p&gt;We had a list of nine bugs we'd written down and kept walking past. Most were small. One wasn't, and it was hiding behind a button.&lt;/p&gt;

&lt;p&gt;When you import a file the studio already has - same bytes - we ask whether to &lt;strong&gt;share&lt;/strong&gt; the existing file or make an &lt;strong&gt;independent copy&lt;/strong&gt; you can edit on its own. Pick "independent copy" and you expect exactly that: your own file, safe to change or delete without touching anything else.&lt;/p&gt;

&lt;p&gt;It mostly worked. But the new copy's internal name was built from &lt;em&gt;how many copies already existed&lt;/em&gt; - copy 2, copy 3, and so on. The problem shows up after a delete. Say you had three, removed the middle one, then made another. The new one counted "two exist, so I'm number three" - but number three was already taken. The studio saw the clash, quietly kept the old file, and pointed your new scene at it. You thought you'd made a clean copy; you were sharing the original, and the real copy you just made was orphaned on disk with nothing&lt;br&gt;
  pointing at it. Edit "your" copy later and you'd be editing the original too.&lt;/p&gt;

&lt;p&gt;Nothing crashed. Nothing warned you. That's the worst kind.&lt;/p&gt;

&lt;p&gt;The fix: stop counting, and instead look at which names are actually taken and pick the first free one - so a copy made after a delete always gets its own identity. We also made the studio shout in the logs if two files ever collide again, instead of silently dropping one. Better a loud bug than a quiet one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7fskro9djcun5pusih1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7fskro9djcun5pusih1.png" alt=" " width="800" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The rest were smaller. A menu element could jump for a single frame when you grabbed it (the drag started from where the element was &lt;em&gt;saved&lt;/em&gt;, not where it was &lt;em&gt;shown&lt;/em&gt;). A countdown number sat blank for one frame before popping in. And the end screen had a leftover timing delay we fixed - which you'll never see, because that screen is solid black either way. Real bug, just invisible.&lt;/p&gt;

&lt;p&gt;The one we'd marked most important? We went to fix it and found a rebuild from two weeks ago had already solved it. We checked three ways before believing it. Crossing something off because it's genuinely gone feels almost as good as fixing it.&lt;/p&gt;

&lt;p&gt;None of this is the glamorous part of building a tool. But it's most of what "does this actually work" comes down to, and we'd rather spend a week on the foundation than stack features on a floor with holes in it.&lt;/p&gt;

&lt;p&gt;Next: back to the part that makes the stories. If you hit something that feels wrong - especially the quiet, hard-to-pin kind - tell us on &lt;a href="https://x.com/ChoiceStoryDev" rel="noopener noreferrer"&gt;X&lt;/a&gt;, in the &lt;a href="https://discord.gg/t3WFw9jGpE" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;, or by &amp;lt;!--email_off--&amp;gt;&lt;a href="mailto:contact@choicestorystudio.com"&gt;email&lt;/a&gt;&amp;lt;!--/email_off--&amp;gt;. More soon.&lt;/p&gt;

</description>
      <category>indiedev</category>
      <category>gamedev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Comparison pages that say where the competition wins Devlog #3</title>
      <dc:creator>Choice Story Studio</dc:creator>
      <pubDate>Sun, 31 May 2026 14:24:50 +0000</pubDate>
      <link>https://dev.to/choicestorystudio/comparison-pages-that-say-where-the-competition-wins-devlog-3-a2f</link>
      <guid>https://dev.to/choicestorystudio/comparison-pages-that-say-where-the-competition-wins-devlog-3-a2f</guid>
      <description>&lt;p&gt;Hey. Different kind of update this time.&lt;/p&gt;

&lt;p&gt;The last stretch of work wasn't on the editor, it was on the website, and I went back and forth on whether that belongs in a devlog at all. I decided it does, because the choices we made writing it say more about how we want to do this than another feature would.&lt;/p&gt;

&lt;p&gt;We filled in the parts of the site that were still empty: a roadmap, a pricing page, an about page, and a set of pages comparing us to the tools people already use. The comparison pages are the ones worth talking about, because they were the most uncomfortable to write.&lt;/p&gt;

&lt;p&gt;The Comparison Pages&lt;br&gt;
The easy version of an "alternative to X" page is the dishonest one. You list your strengths, hide the other tool's, and quietly crown yourself. We did not want to do that, partly because it is gross and partly because the people we are building for can smell it from a mile off. So we wrote them the other way. We praise the tools we are measured against, quote their own words, and say plainly where they beat us.&lt;/p&gt;

&lt;p&gt;On the Ren'Py page we say Ren'Py is free, open source, and runs on more platforms than we do, because it is and it does. On the Twine page we did not claim "no code" as our advantage, because Twine is no-code too for a simple story, by its own description. On the articy:draft page we point out that it has a free tier and that it is the deeper tool if you are a studio with a real engine behind you. Every comparison table on those pages has rows where the other tool wins, and we left every one of them in.&lt;/p&gt;

&lt;p&gt;Best Narrative Design Tools Guide&lt;br&gt;
The tempting move there is to put yourself at number one. We are pre-alpha. We have not earned the top of anyone's list. So the guide groups tools by what you are actually making, opens by telling you that we publish it and one of the tools is ours, and says outright that if you are writing a text adventure or shipping with a studio team, something else on the list will serve you better.&lt;/p&gt;

&lt;p&gt;The Pricing Page&lt;br&gt;
The pricing page was the other one that mattered, because we put the promise in writing. Free use is free forever, and you can share what you make anywhere at no cost. We will never charge hobbyists, people who are learning, or educational work made outside a company. If you sell your story one day, we ask for a small one-time Pro, never a subscription.&lt;/p&gt;

&lt;p&gt;That is not a launch tactic. It is most of the reason this thing exists. A lot of us could never really justify the tools, and drowned in the technical side of them even when we could, so we would rather hand the free tier to everyone and only ask the people making money to chip in.&lt;/p&gt;

&lt;p&gt;One thing I will own. While writing the pricing into those pages, we put an actual number on Pro, then pulled it back out the same day. The figure is not final, and putting a price we might change in front of you is exactly the kind of move we are trying not to make. So there are no numbers on the site yet, only what each tier is for.&lt;/p&gt;

&lt;p&gt;Looking for Feedback&lt;br&gt;
None of this is settled, the tool included. We ship early and write in the open because we want the people who actually use this to tell us what it should be, and that goes for the words on the site as much as the buttons in the editor. If something on there reads wrong to you, say so. The harsh stuff especially.&lt;/p&gt;

&lt;p&gt;If you want to see the pages I'm talking about, they're all on the site: the &lt;a href="https://choicestorystudio.com/compare/renpy-alternative/" rel="noopener noreferrer"&gt;comparison pages&lt;/a&gt;, the &lt;a href="https://choicestorystudio.com/compare/best-narrative-design-tools/" rel="noopener noreferrer"&gt;best-tools guide&lt;/a&gt;, and the &lt;a href="https://choicestorystudio.com/pricing/" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt;. Find us on X as &lt;a href="https://x.com/ChoiceStoryDev" rel="noopener noreferrer"&gt;@ChoiceStoryDev&lt;/a&gt;, in our &lt;a href="https://discord.gg/t3WFw9jGpE" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;, or by &lt;a href="mailto:contact@choicestorystudio.com"&gt;email&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Next we are back in the editor, on the part that actually makes the stories. More soon.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkcslxnrc74dqx53tnvq4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkcslxnrc74dqx53tnvq4.png" alt=" " width="800" height="949"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>indiedev</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Pause menus, asset deduplication, end-screen nodes (Devlog #2)</title>
      <dc:creator>Choice Story Studio</dc:creator>
      <pubDate>Sat, 23 May 2026 20:32:59 +0000</pubDate>
      <link>https://dev.to/choicestorystudio/pause-menus-asset-deduplication-end-screen-nodes-devlog-2-3k5m</link>
      <guid>https://dev.to/choicestorystudio/pause-menus-asset-deduplication-end-screen-nodes-devlog-2-3k5m</guid>
      <description>&lt;p&gt;Hey again. I want to walk through where the canvas has gotten since then, because a lot of the work has been the unglamorous middle of a tool: the parts that don't really sell anything but that you discover you can't ship without. Pause menus. Asset cleanup. Editor performance. We added one big new node type in the last few days too, but most of the actual hours went into the boring half.&lt;/p&gt;

&lt;p&gt;Here's roughly where things landed.&lt;/p&gt;

&lt;p&gt;The first thing we built was a &lt;strong&gt;pause menu&lt;/strong&gt;. Until now ChoiceStory Studio had one editable surface: the &lt;strong&gt;main menu&lt;/strong&gt; (the launcher surface we walked through in &lt;a href="https://dev.to/choice_storystudio_00132/building-a-desktop-studio-for-interactive-video-stories-like-late-shift-devlog-1-4h6d"&gt;Devlog #1&lt;/a&gt;, where the player sees Start / Load / Options / Quit over a configurable background). Adding pause was the first time we had to decide what a sub-surface actually is. We landed on this: the pause menu is not its own node, it's a second authoring face of the main menu, reached through a tab in the editor. Same right panel, same canvas tile, but at runtime it mounts as an overlay over the live scene when the player hits Escape. The design surface borrows the same drag and resize handles the main menu has, so the muscle memory carries over.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbzn1xfkqcj24eiqhxy9l.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbzn1xfkqcj24eiqhxy9l.gif" alt=" " width="600" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then a feature we didn't plan but turned out to be necessary: &lt;strong&gt;asset deduplication&lt;/strong&gt;. When you import the same video twice, ChoiceStory now fingerprints both files and offers to share the existing entry instead of writing a duplicate.A test project we'd been kicking around had 106 files on disk; after dedup and orphan cleanup it sat at 4 referenced files. The fix had to go deeper than the dedup dialog. Every reference in a project (backgrounds, button images,fonts, the lot) now resolves through a registry that is the single source of truth, so "delete unused files" actually knows what's used and what isn't.&lt;/p&gt;

&lt;p&gt;Around the same time we added a &lt;strong&gt;performance settings modal&lt;/strong&gt; in the File menu. Three toggles: follow active node on selection, recompute canvas viewport on resize, node glow animations. Two presets: high-spec PC and low-spec PC. The reason is that our target audience is creators on consumer-grade machines, not workstations, and some of the canvas animations were burning more cycles than the canvas itself. The toggle group is a stopgap; before the alpha we want a real Performance tab. The internal rule that came out of this work: any new feature that adds visible CPU or GPU load gets a toggle on the way in, never as a retrofit.&lt;/p&gt;

&lt;p&gt;Next came a side-quest we called the &lt;strong&gt;parity pass&lt;/strong&gt;. The main menu had affordances the pause menu didn't: per-element drag, per-element resize, draggable backgrounds with aspect-locked corner handles. So we pulled the drag and resize pipeline up out of &lt;code&gt;main-menu/&lt;/code&gt; (it never actually held any main-menu-specific knowledge in it) and pointed both surfaces at the same module. Future surfaces (choice overlays, options) inherit those affordances by reusing the same code, which was the whole point of the lift. We also closed a long-standing schema bug while we were in there. If you flipped a background between colour, image, and video schema keeps separate slots per variant and only the active one paints.&lt;/p&gt;

&lt;p&gt;The newest addition is the &lt;strong&gt;end-screen node&lt;/strong&gt;. It started life as another sub-surface (same shape as pause) and stayed that way for about ten minutes of planning before we changed our mind. End screens are different. A story can have several of them (good ending, bad ending, secret ending, joke ending) and each one needs its own configuration,so they had to be canvas-creatable nodes you can drop, configure, and connect to. Right-click on the canvas adds one.Right-click on the node copies it; right-click on empty canvas pastes a deep clone at the cursor. The config block for each instance is full: background, title, multi-line outro, music, font, a list of one to five buttons (per-button text, optional image, an appearance delay in milliseconds, and an action: return to main menu, restart, or quit). Optional auto-advance after a configurable delay. The buttons fade in one by one on a timeline the author writes. The runtime swap was the last piece. When a player choice routes to an end-screen node, the playback layer mounts the configured surface instead of trying to play it as a video.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7l056a8tfajpegw3znj3.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7l056a8tfajpegw3znj3.gif" alt=" " width="760" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now the honest part :&lt;/p&gt;

&lt;p&gt;A lot of the work above is what made it through. Plenty of stuff didn't. The pause-menu post-closure pass shipped eleven follow-up commits across a single session, and three of them got reverted by commit ten, because every fix had downstream consequences we hadn't mapped. Sub-state in React is the easy half; the hard half is the graph of "if I change this, what else re-renders, in what order, with which stale value." That session ended with a rule we have actually been following since: for every bug fix, write down the side-effect surface before writing the patch, and a list of files you deliberately did not touch. The follow-up count has dropped sharply since.&lt;/p&gt;

&lt;p&gt;The CSS side gave us a similar lesson. We spent a first iteration on container queries to scale the pause menu inside variable Player-slot sizes. They worked, mostly, until they didn't on a small slot. We threw it out and used the recipe the main menu already used (viewport-relative clamps + flex with &lt;code&gt;min-height: 0&lt;/code&gt; + &lt;code&gt;overflow: hidden&lt;/code&gt;) and it just behaved. The takeaway: if the older pattern already passes every test, the newer pattern needs a reason that survives ten minutes of "but does the existing one already do this?"&lt;/p&gt;

&lt;p&gt;What's next is the choice overlay editor, the panel where the buttons that appear over a video (or an image) get designed. Same surface contract, same shared drag and resize infrastructure. We expect it to come together faster than end-screen because most of the substrate is in place now.&lt;/p&gt;

&lt;p&gt;If you've read this far, thanks. If you've built something with branching video, or want to, the same line as last time stands. Come tell us what you'd want from a tool like this. Reply here, find us on X as &lt;a href="https://x.com/ChoiceStoryDev" rel="noopener noreferrer"&gt;@ChoiceStoryDev&lt;/a&gt;, &lt;a href="mailto:contact@choicestorystudio.com"&gt;email&lt;/a&gt;,whatever's easiest. The harsh stuff especially.&lt;/p&gt;

&lt;p&gt;More soon...&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>gamedev</category>
      <category>indiedev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Building a desktop studio for interactive video stories like Late Shift - Devlog #1</title>
      <dc:creator>Choice Story Studio</dc:creator>
      <pubDate>Wed, 20 May 2026 14:41:03 +0000</pubDate>
      <link>https://dev.to/choicestorystudio/building-a-desktop-studio-for-interactive-video-stories-like-late-shift-devlog-1-4h6d</link>
      <guid>https://dev.to/choicestorystudio/building-a-desktop-studio-for-interactive-video-stories-like-late-shift-devlog-1-4h6d</guid>
      <description>&lt;p&gt;Hey everyone.&lt;/p&gt;

&lt;p&gt;I'm starting this devlog mostly because we've been heads-down on a project for about six weeks now and I've been wanting to talk about it with people who aren't just my teammates. So here we are.&lt;/p&gt;

&lt;p&gt;We're a small team based in Antalya, working on a desktop app called ChoiceStory Studio. The short version: you drag your own videos and images onto a canvas, connect them with lines, and the app turns the whole thing into a branching, choice-driven story. When you're done you export it as a single installer file. No code, no game engine, no online accounts. It runs offline, end to end.&lt;/p&gt;

&lt;p&gt;Here's what putting a tiny scene together actually looks like : one image, one video, a line between them, and the choice screen comes out of that automatically:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv7mkh1ojjy9w7ouocb9d.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv7mkh1ojjy9w7ouocb9d.gif" alt=" " width="720" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Right now we're focused on video because that's where the hard part lives. When the player makes a choice and the next clip starts, the cut has to feel invisible. No black frame, no audio gap, no "loading." If that's not smooth, the whole illusion falls apart and we might as well not exist. So we're spending a lot of our time on that one problem before pushing for breadth.&lt;/p&gt;

&lt;p&gt;The canvas itself isn't going to stay video-only though. Visual novels, text-driven branching games, training simulations, kiosk experiences  anything where "what happens next" depends on the audience we want to support all of it eventually, all from the same tool. But one thing at a time. We'd rather get the hard part right first than do five mediums badly.&lt;/p&gt;

&lt;p&gt;Now the honest part, and the actual reason I'm writing this post:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We're heading into an early access release pretty soon.&lt;/strong&gt; And I'm starting this devlog &lt;em&gt;before&lt;/em&gt; launch on purpose,because I genuinely don't want to ship something, lock it in, and then call it done. I have my own ideas about what this tool should become, but they're just my ideas. If the people who actually try to use it tell us "we really need X," or "this thing you're spending weeks on doesn't matter to us," that's what should drive the next version. Not my taste, not my hunches. The people building stories with it.&lt;/p&gt;

&lt;p&gt;So if any of this sounds even mildly interesting, and you have things you'd want from a tool like this a feature, a workflow, a use case I haven't thought of please come tell us. Reply here, find us on X as &lt;strong&gt;&lt;a href="https://x.com/ChoiceStoryDev" rel="noopener noreferrer"&gt;@ChoiceStoryDev&lt;/a&gt;&lt;/strong&gt;, email, whatever's easiest. I read everything. Even the harsh stuff. Especially the harsh stuff.&lt;/p&gt;

&lt;p&gt;I'll keep posting here as things move. What we built that week. What we threw away (already done that once burned seven iterations on a custom file protocol before scrapping it for a boring local HTTP server, that's a write-up for another day). Where we're stuck and could use outside eyes.&lt;/p&gt;

&lt;p&gt;That's about it for the introduction. Thanks for being here this early. More soon.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>gamedev</category>
      <category>indiedev</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
