Develop a robot on your computer
Choose a language starter from Clunkyard's game kit. Each repository contains the same starter as the online editor, normal source files and a small Makefile. Shared build, download and match code lives in the @clunkyard/cli npm package. Bring Node 20+ with npm and your existing compiler or interpreter; the CLI downloads the common engine and only that language's binding.
For C:
git clone https://github.com/clunkyard/starter-c.git
cd starter-c
make doctor
make
make match
make replay
The first run downloads the CLI through npm, along with the match engine and
your language's SDK. Downloaded files go under .clunkyard/ in your project.
Install your compiler or interpreter separately. To use an existing matching
native SDK, set CLUNKYARD_SDK to its path.
Supported platforms
Install Node 20+ with npm and your selected language's compiler or interpreter. The CLI downloads the SDK for your operating system and CPU, then builds with those tools. It never installs compilers or the all-language builder.
| Local platform | Native language starters |
|---|---|
| Linux x86-64, glibc 2.39+; Ubuntu 24.04+ or WSL2 Ubuntu 24.04+ | All offered native profiles |
| Linux AArch64, glibc 2.39+ | C and C++ |
| macOS, Apple Silicon | C, C++, Python, Rust, Ruby, Swift, Java and C# |
| macOS, Intel | C, C++, Python and Rust |
| Windows 11 x86-64 | C, C++, Python, Rust and C# |
JavaScript, TypeScript and the Vane/Cadence/Glyph Node routes work on Linux, macOS and Windows through the WebAssembly core. TypeScript also needs its compiler. Other local profiles, including the Wasmtime-based profiles, use Linux packages. You can use hosted builds and trials when your computer lacks a language's local SDK or toolchain.
On macOS, C/C++ use Xcode Command Line Tools. On Windows, use MSVC's Developer PowerShell or Developer Command Prompt for C/C++, or a working Clang toolchain. Python, Rust's MSVC toolchain and C# can use ordinary PowerShell; SDK binding installation needs no Unix shell or GNU Make. Use the direct CLI commands below if Make is not installed.
| Toolchain | Official setup |
|---|---|
| C/C++ on macOS | Xcode and Command Line Tools |
| C/C++ on Windows | Visual Studio C++ tools and Developer Shell |
| Python | Python downloads |
| Rust | rustup installation; choose the MSVC toolchain on Windows |
| Ruby | Ruby installation |
| Swift | Swift installation |
| Java | JDK setup; JDK 22+ with javac |
| C# | .NET SDK downloads; the starter targets .NET 10 |
The native macOS core targets macOS 11 or later; Node and your selected
compiler can have a newer OS requirement. Rust's desktop binding loads the
shared C runtime, so it rebuilds with your Rust compiler without bundling
another compiler's standard library. Compiler-specific modules rebuild after
your toolchain version changes. A custom matching installation can be selected
with an absolute or relative CLUNKYARD_SDK path.
Without Make, use the CLI directly from the project directory:
npx @clunkyard/cli doctor
npx @clunkyard/cli build
npx @clunkyard/cli match
npx @clunkyard/cli replay
You can also create the same starter without cloning its repository:
npx @clunkyard/cli new c my-robot
Replace c with your language and choose a directory that does not exist yet.
The CLI reads bot.json from your current directory; use --project PATH to
work on another project. doctor checks the selected tools and never installs
one automatically.
Your project
Keep your robot source, bot.json, README, .gitignore, small Makefile and
any normal language build files. JavaScript and TypeScript projects also keep
package.json and package-lock.json for the npm SDK.
The Makefile uses CLUNKYARD ?= npx --yes @clunkyard/cli, so tooling
updates are available without editing every starter. To record the CLI version
used for a trial:
npx @clunkyard/cli --version
Record that version with your source commit and language lockfiles when comparing trials. Ordinary setup commands use the current CLI.
JavaScript and TypeScript from npm
Use starter-javascript or starter-typescript for the complete edit, build, match and replay flow. Their robot API is available on npm as @clunkyard/sdk. To add it to another Node 20+ project:
npm install clunkyard@npm:@clunkyard/sdk
Use require('clunkyard') or import ... from 'clunkyard' in robot source so
the same import works in the hosted arena. The package includes the WebAssembly
core and TypeScript declarations. Keep the generated package-lock.json in
Git and use npm ci to restore its exact dependency versions. Keep
node_modules/ ignored. TypeScript also needs your installed TypeScript
compiler. For local matches, use a starter project: its CLI and Make targets
provide the match engine and the matching SDK.
Install only your adapter's dependencies
doctor checks the selected compiler commands and adapter prerequisites. It
reports a missing dependency with an installation hint; it never installs one.
Use the language guide's official installation links for the toolchain.
| Adapter | Additional local requirements |
|---|---|
| Java, Kotlin, Scala, Clojure | JDK 22+, including javac. Scala and Clojure also need their own runtime libraries. Use SCALA_LIBRARY_JAR, CLOJURE_JAR or CLOJURE_CLASSPATH for a custom installation; the Clojure CLI classpath is also accepted. |
| CLIPS | Python 3 with clipspy==1.0.6. Create and activate a virtual environment, then run python3 -m pip install clipspy==1.0.6. A standalone CLIPS executable is insufficient. |
| Forth | Python 3 and GForth (gforth on PATH). |
| APL | Python 3 and GNU APL 2.0 (apl on PATH). |
| BQN | Node and CBQN 0.12.0 (bqn on PATH). |
| MiniZinc | Python 3, MiniZinc, Gecode and fzn-gecode on PATH. |
| Perl | Perl development headers and a C compiler; the XS shim rebuilds for your Perl. Ubuntu: libperl-dev and build-essential. |
| Lua | Lua 5.4, its development headers, pkg-config and a C compiler. Ubuntu: liblua5.4-dev, pkg-config and build-essential. |
| PHP | PHP's FFI extension; the local launcher enables FFI for its own process. |
| R | R development headers and a C compiler. Ubuntu: r-base-dev. |
| Erlang / Elixir | Erlang development headers and a C compiler. Ubuntu: erlang-dev and build-essential. |
| TypeScript | TypeScript 6+, qualified with 6.0.3. |
| C → WebAssembly | Clang's wasm32 backend and wasm-ld (Ubuntu's lld package). |
| Rust → WebAssembly | The wasm32-unknown-unknown target: rustup target add wasm32-unknown-unknown. |
| AssemblyScript | asc, qualified with AssemblyScript 0.28.20. |
| Zig / Zig → WebAssembly | Qualified with Zig 0.17.0; older build flags may differ. |
| Hew | Hew 0.10.0 or later and a C compiler. |
Other bindings use their listed compiler/interpreter and normal system libraries. Compiler-specific SDK modules are rebuilt by that installation. Native qualification uses Ubuntu 24.04 and the recorded release toolchains; a different compiler version can still require a language-specific adjustment.
Repeat a real local trial
npx @clunkyard/cli match 42 2d classic
npx @clunkyard/cli match 77 3d zero-g
npx @clunkyard/cli replay replays/trial-42.json
Edit the entry file, rebuild and repeat several seeds and rulesets. Keep a baseline commit. The replay records the engine's real states, shots, hits and failures; pause and step through the first useful difference. Local programs run as your user. Local timing is useful for compatibility checks but does not replace authoritative arena budget qualification.
See local trials for matched comparisons and both seat orders, and the C API and ABI and adapter guides for the complete API.
Use a contained toolchain when needed
The C, Python, JavaScript and DSL starters also offer an optional Dockerfile. It uses official public Node and Ubuntu 24.04 bases and installs the selected toolchain. It does not require a Clunkyard registry login or download 56 languages. Native SDK packages use the same glibc baseline as the container.
mkdir -p replays
docker build -t my-clunkyard-c .
docker run --rm -v "$PWD/replays:/workspace/replays" my-clunkyard-c match
The first image build downloads its public base and selected OS packages;
the first run downloads its pinned SDK and engine. Containers currently
target Linux x86-64. Other CPUs can request --platform linux/amd64 for both
commands with emulation overhead. On Linux, output created by the container
may need an ownership adjustment. Use the native Make route when the
toolchain is already installed.
Connect the project to the arena
Open New bot and choose a language starter or a published House bot, then choose its source home. For a private arena project, install the @clunkyard/git helper from npm, sign in with an agent access key and copy the clone command from the bot's Connections → Private Git panel. Edit, commit and push: each accepted push saves a source revision and queues its hosted build. The private Git guide explains how to bring an existing language starter into that private clone and merge browser or WebDAV edits before pushing.
For code already on GitHub, choose
An existing GitHub project.
Connect your personal account, then pick a repository, branch and project
folder. Clunkyard reads its language from bot.json; its first revision
contains your selected source. For a new starter or House copy, choose
My GitHub account as its source home and confirm the new private
repository's name and source. Commits pushed to the selected ref become immutable saved source
revisions and queue builds. Run an arena trial, then follow its replay back
to the revision that played.
Save browser edits before syncing, and resolve conflicts explicitly. Keep SDK downloads, output and access tokens out of Git. Browser editing and WebDAV remain available for players who prefer them.
Public releases retain their checksums. A changed release requires a new version, rather than overwriting an asset that an existing checkout pins.
Connect code running on your computer
Use Node 22+ for the connection's built-in WebSocket client. Copy the connection
settings from your bot's Connections panel into shell environment variables:
CLUNKYARD_REMOTE_URL, CLUNKYARD_REMOTE_TOKEN and CLUNKYARD_BOT_ID. Keep the
key out of source and command arguments. Then run from your robot directory:
npx @clunkyard/cli connect
npx @clunkyard/cli connect --strategist python3 strategist.py
With no command, the CLI builds the project and starts its SDK-aware stdio runner, including the downloaded language binding and native library. Use an explicit command only for a self-contained protocol program with its dependencies already installed.
The shared CLI contains the same remote bridge as the standalone download.
It starts your command without a shell, sends match messages over its standard
input/output and reconnects when the network drops. A remote robot plays Open;
a strategist supplies policy to its hosted reflex between turns. The child
receives no Clunkyard connection keys. For additional environment variables
your program needs, list their names in CLUNKYARD_BOT_ENV_ALLOW. Keep the CLI
running until the match ends; Ctrl-C stops the connection and child processes.