Thanks for wanting to contribute!
After cloning the repo, run the setup script to link the Bobbin addon into the Godot test project:
Windows (PowerShell):
.\scripts\setup.ps1Linux/Mac:
chmod +x scripts/setup.sh
./scripts/setup.shThis creates a junction (Windows) or symlink (Linux/Mac) so that changes to godot/addons/bobbin/ are immediately reflected in the test project, and builds the Docker image for containerized builds. You only need to run this once per clone.
From the repo root:
# Local development (fast builds)
docker compose run --rm --build godot windows
docker compose run --rm --build godot windows debug
docker compose run --rm --build godot all # all platforms × all types
# All platforms, single build type
docker compose run --rm --build godot all release
docker compose run --rm --build godot all debug
# CI builds (optimized, smaller binaries)
docker compose run --rm --build godot all --ciArtifacts are automatically copied to bindings/godot/addons/bobbin/bin/.
| Target | Debug | Release | Notes |
|---|---|---|---|
| windows | .debug.dll |
.dll |
Cross-compiled via mingw-w64 |
| linux | .debug.so |
.so |
Native Linux build |
| wasm | .wasm |
.wasm |
Debug only; fixed name required by gdext |
| all | All targets | All targets | Builds all platforms × all types by default |
| Flag | Effect |
|---|---|
--ci |
Use optimized profiles (slower build, smaller binaries) |
Notes:
- By default, builds use fast profiles for quick local iteration. Use
--cifor optimized release builds. - macOS builds are not supported by the Docker container (cross-compiling for macOS requires Apple SDK). macOS builds will be handled by CI/CD on native macOS runners.
- WASM release builds are not yet supported due to nightly toolchain requirements.
Open test-projects/godot/bobbin-test-project/ in Godot Editor.
cargo test -p bobbin-runtimeRuntime tests live in runtime/tests/ with this structure:
basic.rs— Simple dialogue testschoices.rs— Choice/branching testscommands.rs— Command invocation testsconditionals.rs— Conditional (if/elseif/else) testsexpressions.rs— Expression operator testsvariables.rs— Variable and interpolation testssyntax.rs— Syntax error testssupport/— Test utilities and runnerscases/— Test case data files organized by feature
Run a specific test category:
cargo test -p bobbin-runtime --test choices- Create a
.bobbinfile in the appropriatecases/subdirectory - Create a sidecar file with expected output:
.outfor linear output tests (one expected line per line).tracefor interactive tests with choices (see format below).errfor error tests (substrings that must appear in error message)
- Add a
#[test]function in the corresponding test file (e.g.,choices.rs)
.out — Expected output lines (one per line):
Hello, World!
How are you?
.trace — Execution trace with named paths for interactive tests:
--- path: select_first
> How are you?
[advance]
? Good | Bad
[choice 0]
! done
--- path: select_second
> How are you?
[advance]
[choice 1]
! done
Format elements:
--- path: <name>— Start named execution path> <text>— Assertcurrent_line()equals text? A | B— Assertcurrent_choices()equals["A", "B"]! done— Asserthas_more()is false! has_more— Asserthas_more()is true! waiting_for_choice— Assertis_waiting_for_choice()is true! command <name>(<args>)— Assert command was called with given arguments[advance]— Calladvance()[choice <n>]— Callselect_choice(n)[host <var> = <value>]— Set extern variable before execution[command <name>(<arity>) = mock]— Register mock command with given arity# comment— Comment (ignored)
.err — Substrings that must appear in error message (one per line, case-insensitive):
undefined
name
Bobbin includes an LSP server and VS Code extension for editor support.
The language server lives in lsp/ and provides diagnostics to any LSP-compatible editor.
# Build and install
cargo install --path lsp
# Or just build for development
cd lsp && cargo buildThe extension lives in editors/vscode/.
Setup:
cd editors/vscode
npm install
npm run compileRunning (choose one):
-
Extension Development Host — Press
F5with the extension folder open, or select "Run Bobbin Extension" from the debug dropdown at the repo root. -
Install in your VS Code — Link the extension into your extensions folder:
Windows (CMD):
mklink /J "%USERPROFILE%\.vscode\extensions\bobbin-vscode" "C:\path\to\bobbin\editors\vscode"
macOS/Linux:
ln -s /path/to/bobbin/editors/vscode ~/.vscode/extensions/bobbin-vscodeThen reload VS Code (
Ctrl+Shift+P→ "Reload Window").
After changes:
- TypeScript changes:
npm run compilethen reload VS Code - LSP changes:
cargo install --path lspthen reload VS Code
Releases are automated via GitHub Actions. There are two ways to trigger a release:
# Update version in bindings/godot/Cargo.toml, then:
git tag godot-addon-v1.0.0
git push origin godot-addon-v1.0.0- Go to Actions → "Release Godot Addon"
- Click "Run workflow"
- Enter the version (e.g.,
1.0.0) - Click "Run workflow"
The workflow builds for Windows, Linux, macOS, and WASM, then creates a GitHub Release with the addon zip attached.
- Use semantic versioning:
MAJOR.MINOR.PATCH - Tag format:
{component}-v{version}(e.g.,godot-addon-v1.0.0) - Each distributable is versioned independently
By submitting a pull request, you agree that:
- You have the right to submit the code (it's yours, or you have permission)
- Your contribution will be incorporated into the project and distributed under the Bobbin License
- You retain copyright to your contribution
- You grant Snowfrog Studio a non-exclusive, perpetual, worldwide license to use, modify, relicense, or sublicense your contribution as part of the Bobbin project — including for commercial purposes
This keeps the project consistently licensed and allows for future possibilities such as commercial arrangements with studios.
See LICENSE.md for the full project license terms.