Image to Three.js Model
img2threejs/img2threejs
Rebuilds the object in a reference image as a procedural, animation-ready Three.js model written entirely in code, using staged sculpting with quality checks.
A skill your agent uses when adding or changing persisted user state — settings defaults, audio, camera/orbit, panel positions, feature flags, and the in-app "Save Defaults" pipeline that snapshots…
$ npx skills add jasonkneen/tiny-world-builder --skill tinyworld-runtime-state -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install jasonkneen/tiny-world-builder tinyworld-runtime-state --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/jasonkneen/tiny-world-builder.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.codex/skills/tinyworld-runtime-state .claude/skills/tinyworld-runtime-state && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "tinyworld-runtime-state" agent skill from https://github.com/jasonkneen/tiny-world-builder/tree/main/.codex/skills/tinyworld-runtime-state into .claude/skills/tinyworld-runtime-state/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tinyworld-runtime-state", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/jasonkneen/tiny-world-builder/tree/main/.codex/skills/tinyworld-runtime-stateType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add jasonkneen/tiny-world-builder --skill tinyworld-runtime-state -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install jasonkneen/tiny-world-builder tinyworld-runtime-state --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jasonkneen/tiny-world-builder.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.codex/skills/tinyworld-runtime-state .agents/skills/tinyworld-runtime-state && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "tinyworld-runtime-state" agent skill from https://github.com/jasonkneen/tiny-world-builder/tree/main/.codex/skills/tinyworld-runtime-state into .agents/skills/tinyworld-runtime-state/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tinyworld-runtime-state", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add jasonkneen/tiny-world-builder --skill tinyworld-runtime-state -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install jasonkneen/tiny-world-builder tinyworld-runtime-state --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jasonkneen/tiny-world-builder.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.codex/skills/tinyworld-runtime-state .cursor/skills/tinyworld-runtime-state && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "tinyworld-runtime-state" agent skill from https://github.com/jasonkneen/tiny-world-builder/tree/main/.codex/skills/tinyworld-runtime-state into .cursor/skills/tinyworld-runtime-state/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tinyworld-runtime-state", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/jasonkneen/tiny-world-builder.git --path .codex/skills/tinyworld-runtime-state--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add jasonkneen/tiny-world-builder --skill tinyworld-runtime-state -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install jasonkneen/tiny-world-builder tinyworld-runtime-state --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jasonkneen/tiny-world-builder.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.codex/skills/tinyworld-runtime-state .gemini/skills/tinyworld-runtime-state && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "tinyworld-runtime-state" agent skill from https://github.com/jasonkneen/tiny-world-builder/tree/main/.codex/skills/tinyworld-runtime-state into .gemini/skills/tinyworld-runtime-state/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tinyworld-runtime-state", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install jasonkneen/tiny-world-builder tinyworld-runtime-stateInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add jasonkneen/tiny-world-builder --skill tinyworld-runtime-state -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/jasonkneen/tiny-world-builder.git skills-src && mkdir -p .github/skills && cp -r skills-src/.codex/skills/tinyworld-runtime-state .github/skills/tinyworld-runtime-state && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "tinyworld-runtime-state" agent skill from https://github.com/jasonkneen/tiny-world-builder/tree/main/.codex/skills/tinyworld-runtime-state into .github/skills/tinyworld-runtime-state/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tinyworld-runtime-state", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add jasonkneen/tiny-world-builder --skill tinyworld-runtime-state -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install jasonkneen/tiny-world-builder tinyworld-runtime-state --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jasonkneen/tiny-world-builder.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.codex/skills/tinyworld-runtime-state .opencode/skills/tinyworld-runtime-state && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "tinyworld-runtime-state" agent skill from https://github.com/jasonkneen/tiny-world-builder/tree/main/.codex/skills/tinyworld-runtime-state into .opencode/skills/tinyworld-runtime-state/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tinyworld-runtime-state", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
tinyworld-runtime-stateA skill your agent uses when adding or changing persisted user state — settings defaults, audio, camera/orbit, panel positions, feature flags, and the in-app "Save Defaults" pipeline that snapshots…
Tinyworld Runtime State is an agent skill from jasonkneen/tiny-world-builder. Use when adding or changing persisted user state — settings defaults, audio, camera/orbit, panel positions, feature flags, and the in-app "Save Defaults" pipeline that snapshots localStorage into tinyworld-defaults.json. Also covers the inline-script regex gotcha that has burned us twice.
Its SKILL.md is about 3.7k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Game Development. The licence is AGPL-3.0.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 90bc6f3. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npmnodeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npm, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Tinyworld Runtime State loads about 3.7k tokens when it runs. Until then it costs about 78 tokens; SKILL.md has 1,708 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from jasonkneen/tiny-world-builder at commit 90bc6f3, republished under its AGPL-3.0 licence (© jasonkneen). 1,708 words, ~3,677 tokens.
.claude/skills/tinyworld-runtime-state/SKILL.md (or your agent's skills folder).Most browser-local persisted user state lives in localStorage under the
tinyworld:* prefix. Read/write convention: stringified primitives or
JSON.stringify for objects. Never store credentials, local world saves, cloud
world saves, or per-viewport pixel positions in the shipped defaults file — see
exclusion list below.
Persisted render/material settings that affect shared Three materials must be
re-applied during late boot, not only from control input handlers. In
particular, material wear (tinyworld:render:materialWear) needs the
applyPersistedMaterialSettingsOnBoot() pass so saved wear is visible on first
render without toggling the slider.
Builder directional sun defaults to 10.0 (1000%) under
tinyworld:render:directionalSun. Keep the one-time migration narrow: upgrade
missing/old untouched 1.0 builder values to 10.0, but preserve clearly
user-edited non-default values. Island Viewer has its own
tinyworld:island-viewer:* graphics keys and migrates its old 1.1 default
separately.
Cloud saves are separate from defaults/localStorage:
/api/builds) backed by Netlify Database.tinyworld:worlds.v1 are
uploaded to /api/builds; the active unslotted tinyworld:v1 state gets a
local slot first so it can be bound to a cloud row. Top-menu "My worlds" and
account-modal "My Worlds" must read from the same cloud-aware list./api/share;
public share URLs load by resolving ?share=<id> to same-origin
/api/share?id=<id>./api/assets stores
custom voxel-build stamps and saved asset templates, then merges the remote
library into localStorage before pushing the merged local copy back up.snapshotCurrentState() in sync with saveState() so account saves and
share URLs include grid size, islands, moorings, custom voxel stamps, camera,
landscape settings, and cells outside the home board that the user edited.cells at the root), cloud/account envelopes (data or state
containing a world), named-world/localStorage lists, and exported asset
bundles. Imported worlds should be inserted into tinyworld:worlds.v1 so the
account DB sync can pick them up after login.<label for="import-file"> trigger with an off-screen file input, not only a
button that programmatically clicks a hidden input. Some browsers silently
drop hidden-input file picker calls even when the click handler ran./api/builds
request is in flight. Keep a pending retry flag around twCloudWorldSyncing
so imports and saves made during bootstrap still reach the database.cell.set snapshots, then apply them through setCell() so
rendering and later account saves stay on the normal persistence path.There is a "Save Defaults" button in Settings → Workspace (visible only on
localhost / 127.0.0.1 / file:). When clicked:
tinyworld:* localStorage key (minus the
exclusion list).{ settings: { key: value, ... } } to /api/save-defaults.tools/dev-server.js writes the result to tinyworld-defaults.json at the
repo root.publish.sh copies that file into dist/ so it ships with the site.<script id="tinyworld-defaults-bootstrap">
does a synchronous XMLHttpRequest for tinyworld-defaults.json. For
each key the user does NOT already have in localStorage, it seeds the
default. Existing user prefs win — defaults never overwrite.The bootstrap script MUST have an attribute (e.g. id="tinyworld-defaults-bootstrap")
so the tools/check.js regex doesn't grab it. See the inline-script gotcha
below.
Mirror these regexes in both tools/dev-server.js (server filter) and the
inline setupDevSaveDefaults() IIFE (client filter):
/^tinyworld:v\d+$/ — serialised home world/^tinyworld:worlds\.v\d+/ — multi-world saves/^tinyworld:ai:key:/ — API credentials (SECURITY)/^tinyworld:auth:/ — account/session credentials (SECURITY)/^tinyworld:ai:prompt$/ — user prompt text/^tinyworld:vehicle-demo:/ — session demo state/^tinyworld:audio:music-track$/ — per-user manual music choice/^tinyworld:audio:music-mode$/ — random vs manual music mode/^tinyworld:welcome:dismissedId$/ — per-user welcome dismissal/:backup$/ — any explicit backup/\.pos$/, /-pos$/, /:pos$/ — panel/widget positions (viewport-specific)If you persist a new value that should NOT ship as a default, add a matching pattern to both lists in the same change.
Draggable panels (minimap, crowd panel, agent panel, future panels) MUST save their position as percentage of viewport, not absolute pixels. Absolute pixels saved on a wide monitor land off-screen for users on smaller displays.
Format:
localStorage.setItem(KEY, JSON.stringify({
topPct: +(r.top / window.innerHeight).toFixed(4),
leftPct: +(r.left / window.innerWidth).toFixed(4),
}));Read with backward compatibility for legacy absolute values:
let top, left;
if (Number.isFinite(p.topPct) && Number.isFinite(p.leftPct)) {
top = p.topPct * window.innerHeight;
left = p.leftPct * window.innerWidth;
} else if (Number.isFinite(p.top) && Number.isFinite(p.left)) {
top = p.top; left = p.left;
}Always re-apply on window.addEventListener('resize') and clamp to
[8, innerWidth - w - 8] / [8, innerHeight - h - 8].
The existing minimap implementation (clampMinimapPosition /
setMinimapPosition / applyStoredMinimapPos / endMinimapDrag) is the
reference pattern. Minimap collapse must shrink in place; do not use a
translateX(...) trick that pushes the map outside the viewport.
The AI chat panel is a fixed right-side rail, not a draggable bottom prompt.
Persist only width/collapse state under tinyworld:agent:panel-pos (the -pos
suffix keeps it out of shipped defaults). Do not restore absolute left/top
coordinates for the AI chat; it should stay anchored to the right edge, with a
left-edge resize grip and a compact collapsed rail.
Two layers:
(sourceWorldPos - camera.position) projected onto camera-right.State keys (AUDIO_LS):
tinyworld:audio:music / music-muted / music-track / music-modetinyworld:audio:sfx / sfx-mutedtinyworld:audio:ambient / ambient-mutedtinyworld:audio:engines / engines-mutedMusic tracks: MUSIC_TRACKS array (currently 6 horizon + 1 rising). Random
playback must use only MUSIC_RANDOM_TRACKS / the music-horizon-* files;
music-rising-1.mp3 stays selectable manually but should not ship as a default
or be picked by automatic random playback. Avoid
prop engine files (large-prop-engine-*, foley-propellers-*) — the planes
have jet engines, use foley-rocket-engines-1..4. Water variants:
foley-water-1..4. Loop seams are hidden by overlaying two variants at
different start offsets and per-source gains.
UI: single #sound-icon button lives inside the toolbar (appended in
buildToolbar() near the audio panel reference). Click toggles the floating
#sound-panel with track list + 4 volume rows (Music, Effects, Ambient,
Engines). currentMusicTrack() resolves the persisted choice or random.
Single key tinyworld:view.camera holds:
{ "mode": "perspective", "azimuth": 1.2, "polar": 0.9, "viewSize": 8.2,
"target": { "x": 0, "y": 0, "z": 0 } }updateCamera() schedules a throttled save (250ms debounce) every frame the
camera changes. On boot, the let declarations read this key and apply with
clamping (clampViewSize, MIN_ORBIT_POLAR/MAX_ORBIT_POLAR). Ships in
defaults — sets the welcome shot for new users.
tinyworld:worlds.activeTinyverse.v1 is per-device navigation state for
refreshing back into the last active Tinyverse world. It is not a world save,
not account-synced, and must stay excluded from shipped defaults in both
tools/dev-server.js and the client Save Defaults filter.47-worlds-room.js internal leaveRoom() should only tear down sockets/HUDs/
avatars/minimaps. User-facing island exits should call WS.exitToWorldPicker(),
which clears tinyworld:worlds.activeTinyverse.v1, restores the pre-room
builder state through WS.restoreFreeform(), and opens the picker overlay.
Do not hide picker navigation inside minimap or teardown helpers; that has
previously exposed legacy multi-gate selector boards.__tinyworldMode.setPlayTemporary()
when forcing multiplayer play chrome, do not persist that to
tinyworld:build-play-mode.v1, and make room exit restore Build so the toolbar
is not trapped hidden after refresh/exit.window.__tinyworldShowWelcomeLaunch() instead of navigating to / or
logging the user out. That launch modal is the canonical route back to
Tinyverse / Battleworlds / Build./api/worlds normalization and the client
universe overlay should strip legacy multi-gate cells, replace any center
object with a single { kind: 'stargate', dest: '__world-picker' }, and keep
the picker itself as UI chrome rather than a Nexus board./api/worlds detail response and its
signed join token, including deploy-preview/test hosts. Do not create
tokenless client-only preview worlds for entry; a PartyKit world room with a
join secret will correctly downgrade those joins to observer.tinyworld:features:cluso — legacy Cluso flag; no app runtime path reads this
key. The Cluso embed is now injected local-dev-only by tools/dev-server.js
(see tinyworld-single-file SKILL), not gated by this key.tinyworld:features:ai — AI panel. AI surfaces ([data-ai-interface]) are
hidden on prod via html.ai-disabled, enabled by local host / ?ai=1 / this
flag. Additionally, signed-in accounts whose email is in AI_ACCOUNT_ALLOWLIST
(in 30-ui-boot-wiring.js) unlock AI live on login (applyAccountAiEntitlement)
and revert on logout — tied to the account, not persisted to this key.tinyworld:features:model-stamp-api — stamp-defaults dev endpoint.<script> gotcha (read this!)tools/check.js uses this regex to extract the main app script:
html.match(/<script>([\s\S]*?)<\/script>\s*<\/body>/);It matches the first plain <script> through to the last </script></body>.
If you add an extra inline <script> block (e.g. a bootstrap loader), it MUST
have an attribute so the regex skips it:
<script id="my-bootstrap">...</script> <!-- ✓ regex ignores -->
<script>...</script> <!-- ✗ would be conflated -->Symptom when wrong: npm test fails with
inline app script syntax error: Unexpected token '<' because the regex
grabbed your bootstrap + the </script><script> separator + the main app.
After any persistence change:
node tools/check.js — inline JS syntax + schema parity.node tools/smoke-static.js — no-browser smoke.http://localhost:3000/tiny-world-builder with clean
localStorage in a fresh tab — confirm defaults seed correctly and the
app doesn't error.<script> without an attribute (breaks npm test).npm run dev after editing tools/dev-server.js —
the running process won't have the new route, returns 405.<input type="file"> while the native file picker is
still open. Dynamic JSON pickers should clean up after change/cancel, not
via a short timeout.DEFAULT_AZIMUTH/
DEFAULT_POLAR/DEFAULT_TARGET — keep restored state clamped to those
ranges.The JSON file export (#export handler in 20-input-place-erase.js) must
serialize the same payload as saveState() (29-persistence-api.js) so an
imported world is fully self-contained. Both include: islands
(serializeEditableIslands), moorings (serializeMooringCables, carries each
cable's style), cells, voxelBuildStamps (referencedVoxelBuildStamps(cells)
— inlines custom block voxels/customParts/footprint), camera, landscape,
and planetLandscape. applyState() restores voxelBuildStamps on import.
Model stamps are bundled manifest assets referenced by appearance.modelStampId
(no binary to embed). When adding any new persisted world concept, add it to
both saveState and the export object, and handle it in applyState.
© jasonkneen, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .codex/skills/tinyworld-runtime-state of jasonkneen/tiny-world-builder.
Open the folder on GitHubat commit 90bc6f3
Tinyworld Runtime State next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Tinyworld Runtime State this skilljasonkneen/tiny-world-builder | 1.6k | — | ~3.7k | Automated safety check: Pass | AGPL-3.0 | |
| Image to Three.js Modelimg2threejs/img2threejs | 18k | 1 repos | ~8.2k | Automated safety check: Pass | Apache-2.0 | |
| Web CloneJane-xiaoer/claude-skill-web-clone | 1k | 2 repos | ~2.7k | Automated safety check: Pass | MIT | |
| Threejs Game Directormajidmanzarpour/threejs-game-skills | 2.4k | — | ~2.2k | Automated safety check: Pass | MIT | |
| Game Asset Generatorhtdt/godogen | 7.1k | — | ~2.8k | Automated safety check: Pass | MIT | |
| Threejs Gameplay Systemsvalkor-ai/loom | 1.2k | 1 repos | ~1.4k | Automated safety check: Pass | Apache-2.0 |
img2threejs/img2threejs
Rebuilds the object in a reference image as a procedural, animation-ready Three.js model written entirely in code, using staged sculpting with quality checks.
Jane-xiaoer/claude-skill-web-clone
网站复刻 / 克隆方法论。USE WHEN 用户说 复刻网站、克隆网站、clone website、抄个站、仿站、 照着这个站做一个、reproduce site、还原某个网页效果、把这个站搬下来改成我的、 复刻某个交互/WebGL/Canvas/Three.js 效果。提供「先拿真源码 → 判路径 → 逆向拆解 → 搭工程 → 替换内容」的可移植决策树,覆盖静态站 /…
majidmanzarpour/threejs-game-skills
Entrypoint for building, upgrading, and finishing Three.js browser games.
htdt/godogen
Generates game art from text prompts: PNG images, GLB 3D models, rigged characters, animations and sprites, with background removal.
valkor-ai/loom
Build and iterate playable Three.js game systems: starter scaffold, architecture, design briefs, core loops, level and encounter design, entities, input, camera, collision and physics, scoring…
CyberAgentGameEntertainment/NovaShader
Execute C with Unity APIs when existing uloop tools cannot inspect or edit enough.
jasonkneen/tiny-world-builder
Lightweight 3D effects for decorative elements and micro-interactions using Zdog, Vanta.js, and Vanilla-Tilt.js.
jasonkneen/tiny-world-builder
create robust, browser-runnable three.js primitive reconstructions from static low-poly, voxel, isometric, or stylized game-art reference images.
jasonkneen/tiny-world-builder
A skill your agent uses whenever an LLM agent needs to search, browse, or download 3D models from Poly Pizza (poly.pizza) using their REST API.
jasonkneen/tiny-world-builder
A skill your agent uses when styling any tool/block button, palette tile, icon chip, or new clickable square in Tiny World Builder.
jasonkneen/tiny-world-builder
A skill your agent uses when changing ghost board generation, path / road / river continuity, deterministic regen, edge connections, or anything that runs inside makeGhostWorld in…
jasonkneen/tiny-world-builder
A skill your agent uses when changing the home island layout, edge dressing, undersides, autoincentive sponsor banner (now a top-left logo-adjacent DOM banner), plane/crop-duster flight paths…
Categories
A skill your agent uses when adding or changing persisted user state — settings defaults, audio, camera/orbit, panel positions, feature flags, and the in-app "Save Defaults" pipeline that snapshots…. Tinyworld Runtime State is an agent skill from jasonkneen/tiny-world-builder.json.
Tinyworld Runtime State fits situations like: changing persisted user state — settings defaults; panel positions; the in-app Save Defaults pipeline that snapshots localStorage into tinyworld-defaults.json.
Run `npx skills add jasonkneen/tiny-world-builder --skill tinyworld-runtime-state -a claude-code`. Or copy the skill folder (.codex/skills/tinyworld-runtime-state in jasonkneen/tiny-world-builder) into .claude/skills/tinyworld-runtime-state in your project. Claude Code loads it when a task matches its description.
Run `npx skills add jasonkneen/tiny-world-builder --skill tinyworld-runtime-state -a codex`. Or copy the skill folder (.codex/skills/tinyworld-runtime-state in jasonkneen/tiny-world-builder) into .agents/skills/tinyworld-runtime-state in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add jasonkneen/tiny-world-builder --skill tinyworld-runtime-state -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/tinyworld-runtime-state, .gemini/skills/tinyworld-runtime-state, .github/skills/tinyworld-runtime-state and .opencode/skills/tinyworld-runtime-state in your project.
Going by SKILL.md and its folder, Tinyworld Runtime State needs the command-line tools its instructions call (npm and node).
SKILL.md contains no URLs. Its commands use npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Tinyworld Runtime State is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.7k tokens (SKILL.md is roughly 15k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Tinyworld Runtime State: Image to Three.js Model (img2threejs/img2threejs, 18k stars), Web Clone (Jane-xiaoer/claude-skill-web-clone, 1k stars), Threejs Game Director (majidmanzarpour/threejs-game-skills, 2.4k stars) and Game Asset Generator (htdt/godogen, 7.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
jasonkneen (a GitHub user) maintains it in jasonkneen/tiny-world-builder, which has 1,591 GitHub stars. The repository holds 29 skills in this directory. The repository was last updated on October 8, 2026.
Source: jasonkneen/tiny-world-builder on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.