How it works
FILE.md ──► doc.rs ──────► draft.rs ─────────► scene.rs ──► Bevy
sections + WorldManifest entities,
BLAKE3 hashes (localgpt-world- lights, fog
types) ▲
▲ │
watch.rs: poll the file, recompile on save tour.rs: camera + caption
doc.rs: Markdown → title, front matter (genre: …), and one section per place — a##heading (world) or a----separated slide (deck). Each section carries a hash of its text (plus anyworldfence).draft.rs: sections → aWorldManifestwith one region per section — a winding path (world) or a straight presentation path (deck) — and a tour with one stop per section. Deterministic, with entity ids that are stable per section, so editing one section leaves the other regions untouched. Per section the first of these wins: aworldfence's exact entities, the sidecar's cached agent build, the cached recipe — else the rules.agent.rs/assets.rs(llmfeature): the tool-calling agent (ported from Verse) and the pack's manifest/kind/span math. A pure interpreter applies the model's tool calls to platform-local entities; the pack's real CC0 models are placed by semantic kind.recipe.rs/sidecar.rs(pure): the clamped per-region recipe type with its lenient LLM-reply parse, and the hash-keyed<doc>.world.jsonv2 cache (builds + recipes). Compiled in every build; only the authoring is feature-gated.llm.rs/generation.rs(llmfeature): the model (ported from Verse) and the worker thread running the tier chain — agent build → recipe → draft — in the background while the draft is already on screen.scene.rs: spawns the manifest in Bevy using the same mapping as LocalGPT Gen, and loads placed GLBs.tour.rsandwatch.rs: navigation and hot reload.
Worlds use localgpt-world-types, the format LocalGPT Gen saves as world.ron, and pass Gen's own validation. --print-ron prints exactly that file.
Develop
cargo test
cargo clippy --all-targets -- -D warnings
cargo fmt --check
LocalGPT MD is open source under Apache-2.0; the code is at github.com/localgpt-app/localgpt-md.