{"id":34904606,"url":"https://github.com/snowfrogdev/bobbin","last_synced_at":"2026-01-27T00:26:37.640Z","repository":{"id":328025900,"uuid":"1113450616","full_name":"snowfrogdev/bobbin","owner":"snowfrogdev","description":"A clean, fast narrative scripting language for branching dialogue and interactive stories. Designed for writers \u0026 devs — simple syntax, instant parsing, seamless integration.","archived":false,"fork":false,"pushed_at":"2026-01-26T11:55:42.000Z","size":1232,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-26T17:14:46.221Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/snowfrogdev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-10T02:00:54.000Z","updated_at":"2026-01-26T11:55:46.000Z","dependencies_parsed_at":"2026-01-26T04:02:12.918Z","dependency_job_id":null,"html_url":"https://github.com/snowfrogdev/bobbin","commit_stats":null,"previous_names":["snowfrogdev/bobbin"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/snowfrogdev/bobbin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snowfrogdev%2Fbobbin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snowfrogdev%2Fbobbin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snowfrogdev%2Fbobbin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snowfrogdev%2Fbobbin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/snowfrogdev","download_url":"https://codeload.github.com/snowfrogdev/bobbin/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snowfrogdev%2Fbobbin/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28792997,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-26T21:49:50.245Z","status":"ssl_error","status_checked_at":"2026-01-26T21:48:29.455Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-12-26T09:55:57.467Z","updated_at":"2026-01-27T00:26:37.632Z","avatar_url":"https://github.com/snowfrogdev.png","language":"Rust","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"branding/bobbin_logo.png\" alt=\"Bobbin Logo\" width=\"100\" height=\"100\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eBobbin\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  A clean, readable scripting language for branching dialogue and interactive stories.\u003cbr\u003e\n  Built for game developers. Ships with first-class Godot support.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/snowfrogdev/bobbin/actions/workflows/build-and-test.yml\"\u003e\u003cimg src=\"https://github.com/snowfrogdev/bobbin/actions/workflows/build-and-test.yml/badge.svg\" alt=\"CI\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/snowfrogdev/bobbin/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/snowfrogdev/bobbin?label=Release\" alt=\"Release\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://godotengine.org\"\u003e\u003cimg src=\"https://img.shields.io/badge/Godot-4.5+-478CBF?logo=godotengine\u0026logoColor=white\" alt=\"Godot 4.5+\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://deepwiki.com/snowfrogdev/bobbin\"\u003e\u003cimg src=\"https://deepwiki.com/badge.svg\" alt=\"Ask DeepWiki\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003e **WARNING:** Bobbin is in early development... You should expect:\n\u003e - Some features may be missing or incomplete\n\u003e - Documentation is sparse\n\u003e - There may be breaking changes between releases\n\u003e - The API is not yet stable\n\n## Example\n\n```bobbin\nextern player_name\nextern gold\nsave met_merchant = false\n\nWelcome to the Brass Lantern, {player_name}!\n\n- Browse wares\n    set met_merchant = true\n    The merchant spreads out their goods.\n    - Buy healing potion (10 gold)\n        if gold \u003e= 10\n            temp price = 10\n            You hand over {price} gold coins.\n            if met_merchant\n                Here's a 2 gold discount for a returning customer!\n                Actually, you only owe {price - 2} gold.\n        else\n            You don't have enough gold.\n    - Just looking\n        No problem, take your time.\n    Come back anytime!\n\n- Ask about rumors\n    The merchant leans in close...\n    Heard there's treasure in the old ruins.\n\nFarewell, {player_name}! You have {gold} gold remaining.\n```\n\n## Features\n\n- **Writer-friendly syntax** — No boilerplate, just dialogue and choices\n- **Smart variable scoping** — `save` persists across sessions, `temp` lives for the scene, `extern` reads from your game\n- **Nested branching** — Unlimited nesting depth with automatic gather points\n- **Conditional logic** — `if`/`elseif`/`else` with full expression support\n- **Expressions everywhere** — Arithmetic, comparison, and logical operators in assignments and interpolations\n- **String interpolation** — Embed variables and expressions in dialogue with `{variable}` or `{a + b}`\n- **Rich error messages** — Rust-quality diagnostics that point to exactly what went wrong\n- **Fast \u0026 lightweight** — Rust-powered runtime, instant parsing\n- **Cross-platform** — Linux, Windows, macOS, and WASM (web exports)\n\n## Godot\n\n### Installation\n\n1. Download the latest release from [GitHub Releases](https://github.com/snowfrogdev/bobbin/releases)\n2. Extract the `addons/` folder into your Godot project root\n3. Enable the plugin in **Project → Project Settings → Plugins**\n\n### Quick Start\n\n```gdscript\n# Create runtime with extern variables\nvar host_state = { \"player_name\": \"Ada\" }\nvar runtime = BobbinRuntime.from_string_with_host(script_content, host_state)\n\n# Main dialogue loop\nwhile runtime.has_more():\n    runtime.advance()\n    print(runtime.current_line())\n\n    if runtime.is_waiting_for_choice():\n        var choices = runtime.current_choices()\n        for i in choices.size():\n            print(\"  %d. %s\" % [i + 1, choices[i]])\n        runtime.select_choice(0)  # Pick first choice\n```\n\n## What's Next\n\n- Character/speaker management\n- Localization support\n- Event triggering/callbacks\n- Visit tracking for choices\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsnowfrogdev%2Fbobbin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsnowfrogdev%2Fbobbin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsnowfrogdev%2Fbobbin/lists"}