From nethercore
Core development workflow for Nethercore WASM games. Covers the nether CLI (build, run, pack), nether.toml manifest authoring, required WASM exports, and determinism rules for rollback netcode. Use when building, configuring, or structuring a Nethercore game project.
npx claudepluginhub nethercore-systems/nethercore-ai-plugins --plugin nethercoreThis skill uses the workspace's default tool permissions.
Nethercore games compile to WASM and run in the Nethercore player with rollback netcode. All consoles share the same WASM core, ensuring determinism across platforms.
Generates design tokens/docs from CSS/Tailwind/styled-components codebases, audits visual consistency across 10 dimensions, detects AI slop in UI.
Records polished WebM UI demo videos of web apps using Playwright with cursor overlay, natural pacing, and three-phase scripting. Activates for demo, walkthrough, screen recording, or tutorial requests.
Delivers idiomatic Kotlin patterns for null safety, immutability, sealed classes, coroutines, Flows, extensions, DSL builders, and Gradle DSL. Use when writing, reviewing, refactoring, or designing Kotlin code.
Nethercore games compile to WASM and run in the Nethercore player with rollback netcode. All consoles share the same WASM core, ensuring determinism across platforms.
Every game exports three functions:
#[no_mangle] pub extern "C" fn init() { } // Setup, asset loading
#[no_mangle] pub extern "C" fn update() { } // Deterministic logic
#[no_mangle] pub extern "C" fn render() { } // Drawing only
| Command | Purpose |
|---|---|
nether init | Create nether.toml manifest |
nether compile | Compile WASM from source |
nether pack | Bundle WASM + assets into ROM |
nether build | compile + pack (main command) |
nether run | Build and launch in player |
[game]
id = "my-game"
title = "My Game"
author = "Your Name"
version = "1.0.0"
[build]
script = "cargo build --target wasm32-unknown-unknown --release"
wasm = "target/wasm32-unknown-unknown/release/my_game.wasm"
[[assets.textures]]
id = "player"
path = "assets/player.png"
The Nethercore player handles all networking automatically:
Your only responsibility: Make update() deterministic.
Never write: Networking code, rollback logic, state sync, or input transmission.
The update() function must be deterministic for rollback netcode. Given identical inputs, all clients must produce identical state.
random() functions - Never external randomnesstick_count() not system time - Frame-based logic only| Pattern | Problem | Correct Alternative |
|---|---|---|
rand::thread_rng() | External RNG | FFI random(), random_range() |
SystemTime::now() | System clock | FFI tick_count() |
HashMap iteration | Unordered | Arrays, BTreeMap |
| State changes in render() | Skipped during rollback | Move to update() |
nether run --sync-test --frames 1000
If this fails, you have non-deterministic code.
my-game/
├── nether.toml # Game manifest
├── src/
│ ├── lib.rs # Entry point (init/update/render)
│ └── zx.rs # FFI bindings (console-specific)
├── assets/
│ ├── textures/
│ ├── meshes/
│ └── audio/
└── Cargo.toml
Key principle: Keep entry files minimal (~50 lines). FFI bindings in separate module.