ottolink-dev/hesiod/hesiod-generate
Claude Code and agent skill by ottolink-dev/hesiod
- community
Checking that the SKILL.md file is still in the repository.
Generate Hesiod procedural terrain (.hsd) graphs and large maps programmatically via the hsd toolkit. Use when a developer wants to author, validate, and batch-render terrain heightmaps/textures from code or natural language — especially procedural or large-map generation (seed sweeps, big shapes, tiling).
Install
npx vskill@latest install ottolink-dev/hesiod/hesiod-generateSKILL.md
hesiod-generate — Hesiod terrain graph authoring skill
1. What this is
The hsd toolkit lets you author, validate, and render Hesiod procedural terrain graphs without touching the GUI. You write a compact JSON spec that names nodes, their params, and the wires between them; the toolkit compiles it to a valid .hsd file and drives the Hesiod binary headlessly to produce a 16-bit grayscale heightmap PNG and a colourised preview PNG. This skill is scoped to game-dev / procedural / large-map workflows: seed sweeps, biome parameter exploration, tiling big terrain sheets, and programmatic generation pipelines.
2. Prerequisites
All commands run from the repository root (the directory containing scripts/ and Hesiod/). Prefix every invocation with PYTHONPATH=scripts:
For rendering (the --run flag or hsd run), the runner auto-locates the Hesiod binary and you must suppress the display:
- In-tree build (
build/bin/hesiodexists under the repo root): no extra config needed — the runner finds it automatically. - Binary elsewhere: set
HESIOD_BINbefore running:
``bash export HESIOD_BIN=/path/to/hesiod ``
- Always set
QT_QPA_PLATFORM=offscreenfor headless rendering:
``bash export QT_QPA_PLATFORM=offscreen ``
Without QT_QPA_PLATFORM=offscreen the binary tries to open an X display. Without a binary (either in-tree or via HESIOD_BIN), the runner raises an error.
3. Workflow
- Discover nodes. Find what node types exist before inventing names.
``bash PYTHONPATH=scripts python3 -m hsd nodes --search Noise # keyword search PYTHONPATH=scripts python3 -m hsd nodes --category Erosion # browse a category PYTHONPATH=scripts python3 -m hsd nodes --show NoiseFbm # ports + params ``
Always run --show TYPE before wiring a node — port names are not guessable (see §4).
- Write a JSON spec. See §5 and
reference/specs/for the shape.
- Validate.
``bash PYTHONPATH=scripts python3 -m hsd validate my_spec.json ``
Structured errors name the offending node and suggest a fix. Fix all errors before proceeding.
- Lint (optional). Checks model↔UI consistency in a compiled
.hsdfile (not a
spec JSON). Run it on the .hsd output of hsd build or hsd make:
``bash PYTHONPATH=scripts python3 -m hsd lint out.hsd ``
- Build + run in one step.
``bash QT_QPA_PLATFORM=offscreen \ PYTHONPATH=scripts python3 -m hsd make my_spec.json -o out.hsd --run \ --shape 1024,1024 --tiling 1,1 --overlap 0.0 ``
--shape, --tiling, --overlap override the compute config used by each graph node at render time. They do not change the exported PNG resolution — that comes from export_param.shape baked into the .hsd at build time from the spec's config.shape. To change the output file's dimensions, set config.shape in the spec JSON and rebuild.
- Inspect outputs.
make --runwrites files at the path(s) set in the spec's
export[].path field (not derived from -o). For heightmap_export.json (export path "heightmap.png") that is:
heightmap.png— 16-bit grayscale heightmap (relative to cwd)heightmap_preview.png— TERRAIN colourmap + hillshade (relative to cwd)
Open out_preview.png for a visual gut-check, but verify numerically — the colourmap misleads (a flat max plateau can look thin, value ranges are remapped). Use the built-in inspector on the raw 16-bit out.png:
``bash PYTHONPATH=scripts python3 -m hsd inspect out.png # dims, bitdepth, min/max/mean PYTHONPATH=scripts python3 -m hsd inspect out.png --edges # border means + left/right wrap-seam match PYTHONPATH=scripts python3 -m hsd inspect out.png --landfrac 0.5 # fraction of pixels above a threshold PYTHONPATH=scripts python3 -m hsd inspect out.png --profile col --profile-n 16 # column-mean profile ``
This catches what the preview hides — e.g. confirming borders are 0, caps are symmetric, or a wrap seam matches. Outputs are only written if the spec contains an `export` entry — a spec without export builds and runs but produces no files.
- Iterate. Adjust params, re-validate, re-run. For large shapes or tiling sweeps, work at 512 × 512 first, then scale up.
You can also separate build and run:
4. The hard rule — port data-type compatibility
Every link must connect ports of the same `data_type`. The two types are:
| Type | Meaning | Typical nodes | |
|---|---|---|---|
VirtualArray | Heightmap / scalar field | NoiseFbm, HydraulicParticle, ExportHeightmap | |
VirtualTexture | RGBA colour image | ColorizeGradient, ColorizeSolid, ExportTexture |
These are incompatible. Wiring VirtualArray → VirtualTexture or vice versa produces a validation error.
The bridge: ColorizeGradient accepts a VirtualArray on its level input and emits a VirtualTexture on its texture output. ColorizeSolid also outputs a VirtualTexture but its inputs differ — it takes an optional alpha (VirtualArray) and renders a uniform colour set via its color param; it has no level input. Use ColorizeGradient when you need to map heightmap values to a colour gradient.
Exporting both heightmap and colour requires a fork:
Always run `hsd nodes --show TYPE` before wiring. Port names are often not input/output. Confirmed examples:
ColorizeGradient: inputslevel,alpha,noise(all VirtualArray), outputtexture(VirtualTexture)ColorizeSolid: inputalpha(VirtualArray, optional), outputtexture(VirtualTexture); nolevelportExportHeightmap: inputinput(VirtualArray) — no output portExportTexture: inputtexture(VirtualTexture) — no output portHydraulicParticle: inputinput, outputoutput(both VirtualArray); alsoerosion,depositionoutputs
5. Spec format
Full schema and field-by-field reference: `reference/spec-schema.md`
Quick shape:
Rules:
idvalues are arbitrary strings; they scope link endpoints as"id.port".- Only list params you want to override — omitted params use Hesiod's defaults (tolerant loader).
configcan be omitted; defaults areshape:[1024,1024],tiling:[1,1],overlap:0.0.exportis required for file output. Without it the graph runs but writes nothing.- Enumeration / Choice params take a plain string. The toolkit resolves it to the correct
integer. Run hsd nodes --show TYPE to see valid choices listed inline next to the param name. Example — "blending_method": "maximum" for a Blend node. A handful of uncatalogued enums still need a full value-object dict; --show will print (pass a full value-object dict) for those, and validation will flag invalid strings.
``json {"id": "blend", "type": "Blend", "params": {"blending_method": "maximum"}} ``
6. Recipes
Full recipe catalogue with commentary: `reference/recipes.md`
Verified ready-to-run specs in `reference/specs/`:
| File | What it demonstrates | |
|---|---|---|
heightmap_export.json | Minimal noise → erosion → heightmap export | |
colour_fork.json | Fork to both ExportHeightmap and colourised ExportTexture | |
tiled_large.json | 4096 × 4096 map, 4 × 4 tiling, 0.25 overlap | |
fmg_globe.json | 4096 × 2048 equirectangular planet heightmap for Azgaar's FMG (3 continents, ocean borders, polar ice caps, X-only tiling) | |
multi_graph_world.json | 2 × 2 region graphs over a broadcast base continent, single flattened export |
Run a recipe directly:
7. Procedural / large-map generation
Seed sweep — shell loop
Programmatic generation — Python API
The library is importable directly for tighter loops (no subprocess overhead per spec):
compile_spec(spec, catalog) returns a Project; call .to_hsd() to get the JSON dict ready for json.dump. Validate the spec first with hsd.validate (or hsd validate CLI) — compile_spec assumes a valid spec and raises KeyError on bad node types.
Large maps with tiling
Tiling splits a large logical map into tiling.x × tiling.y tiles at render time. The overlap ratio (0–1) controls the blending margin Hesiod uses to stitch tiles seamlessly — use 0.25 for large maps.
The --shape/--tiling/--overlap flags on make and run override the compute config for each node. Note that the exported PNG resolution is controlled by config.shape baked into the .hsd at build time; to change the output file dimensions, update config.shape in the spec and rebuild.
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingbridges/Claude/.claude/skills/hesiod-generate/SKILL.md
Popularity
- Repository stars
- 251
- Repository forks
- 17
- 7-day trend score
- 28
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/ottolink-dev/hesiod/hesiod-generate)