Skip to content

Repository files navigation

Bobbin Logo

Bobbin

A clean, readable scripting language for branching dialogue and interactive stories.
Built for game developers. Ships with first-class Godot support.

CIReleaseGodot 4.5+Ask DeepWiki

WARNING: Bobbin is in early development... You should expect:

  • Some features may be missing or incomplete
  • Documentation is sparse
  • There may be breaking changes between releases
  • The API is not yet stable

Example

extern player_name
extern gold
save met_merchant = false
Welcome to the Brass Lantern, {player_name}!
- Browse wares
set met_merchant = true
The merchant spreads out their goods.
- Buy healing potion (10 gold)
if gold >= 10
temp price = 10
You hand over {price} gold coins.
if met_merchant
Here's a 2 gold discount for a returning customer!
Actually, you only owe {price - 2} gold.
else
You don't have enough gold.
- Just looking
No problem, take your time.
Come back anytime!
- Ask about rumors
The merchant leans in close...
Heard there's treasure in the old ruins.
Farewell, {player_name}! You have {gold} gold remaining.

Features

  • Writer-friendly syntax — No boilerplate, just dialogue and choices
  • Smart variable scopingsave persists across sessions, temp lives for the scene, extern reads from your game
  • Nested branching — Unlimited nesting depth with automatic gather points
  • Conditional logicif/elseif/else with full expression support
  • Expressions everywhere — Arithmetic, comparison, and logical operators in assignments and interpolations
  • String interpolation — Embed variables and expressions in dialogue with {variable} or {a + b}
  • Commands — Trigger game effects like give_item("sword", 1) with compile-time validation
  • Rich error messages — Rust-quality diagnostics that point to exactly what went wrong
  • Fast & lightweight — Rust-powered runtime, instant parsing
  • Cross-platform — Linux, Windows, macOS, and WASM (web exports)

Godot

Installation

  1. Download the latest release from GitHub Releases
  2. Extract the addons/ folder into your Godot project root
  3. Enable the plugin in Project → Project Settings → Plugins

Quick Start

# Create runtime with host state and commandsvarruntime=Bobbin.create("res://dialogue/intro.bobbin", {}, {
"player_name": "Ada",
"gold": 100,
}, {
"give_item": func(args): inventory.add(args[0], int(args[1])),
})
# Main dialogue loopwhileruntime.has_more():
runtime.advance()
print(runtime.current_line())
ifruntime.is_waiting_for_choice():
varchoices=runtime.current_choices()
foriinchoices.size():
print(" %d. %s"% [i+1, choices[i]])
runtime.select_choice(0) # Pick first choice

What's Next

  • Character/speaker management
  • Localization support
  • Visit tracking for choices

Contributing

See CONTRIBUTING.md for development setup and guidelines.

About

A clean, fast narrative scripting language for branching dialogue and interactive stories. Designed for writers & devs — simple syntax, instant parsing, seamless integration.

Resources

Contributing

Stars

5 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages