Terracraft quickstart

Terracraft is the Tiny registry name for the imported Terracotta Sandbox: a Preact browser application for arranging Minecraft glazed-terracotta blocks. It has a palette, a block grid, four presets, and a tool toolbar. The initial grid is 8 × 8; presets replace it with a 4 × 4 pattern.

The tool is mounted at /t/terracraft/ on tiny.loca.zone. Its interactions are browser-proven on a loopback serving of the built artifact (see Current state); public HTTPS ingress is prepared and awaiting the Gatekeeper seat, so the public address may not resolve until that is applied. No account is intended.

Run locally now

Python 3 and a browser are sufficient to serve the original static source. Run:

python3 -m http.server 55333 --bind 127.0.0.1 --directory /home/loca/dev/tiny/sources/terracraft

Open http://127.0.0.1:55333/ on that machine. The bind is loopback-only; it is not a public deployment command. Stop the server with Ctrl+C. This serves the immutable clone without editing it. The source imports Preact 10.19.2 and HTM 3.1.1 from esm.sh, so this original-source run needs network access to that dependency provider. A loading overlay that never clears can indicate a missing texture; the source has no texture-error recovery handler.

The old README URL http://0rk.de:55333/ is stale: the ground-truth socket observation found no listener there. Do not treat that advertised address as a working service.

Make and export a pattern

Core controls were exercised end-to-end in the c2 headless-Chrome run against the built mount at 390 and 1280 widths: placing via real click, right-click quarter-turn rotation (stored in the grid), R placement rotation, 512 × 512 PNG export, and reload persistence all passed with zero console errors and zero non-local requests. Presets and the fill/pick tools are documented from the source but were not part of that run.

  1. Choose a texture from the palette. There are 16 glazed-terracotta colors.
  2. Select the place toolbar button and click cells. Dragging while holding the mouse places blocks across cells.
  3. Use the rotate toolbar button or R to rotate the selected placement orientation. Right-clicking an occupied cell rotates that placed tile independently.
  4. Select erase to remove cells, pick to copy a placed cell’s block and rotation back into the placement tool, or fill to replace a connected region matching both block and rotation.
  5. Try Arrow, Creeper, Spiral, or Check in the preset pane. A preset replaces the current grid with its 4 × 4 pattern; save an export first if the current pattern matters.
  6. Click the export toolbar button. The implementation downloads terracotta.png, using 64 pixels per grid cell: 512 × 512 for the default grid and 256 × 256 for a preset. Empty cells remain transparent. X is not implemented as an export shortcut.

The grid is saved in browser localStorage under tc-grid. That stores only the grid, not tool selection or undo history. It is origin-local browser data, not a server account or synchronized backup; a localhost session and the production domain do not share it. PNG export is an image, not an editable project round trip. Use a dedicated browser profile when testing persistence so acceptance steps do not overwrite a user’s pattern.

flowchart LR
  Palette[Select texture and rotation] --> Place[Place or fill cells]
  Place --> Grid[Browser grid]
  Preset[4 by 4 preset] --> Grid
  Grid --> Storage[Local browser storage]
  Grid --> Export[Export button]
  Export --> PNG[terracotta.png]

Controls and limitations

ActionInspected controlImportant limit
Placeplace toolbar buttonNo dedicated place shortcut in the handler
EraseE or eraseDrag erases cells
PickI or pickOccupied cell only; returns to place
FillF or fillRegion matching includes rotation
Rotate placementR or rotateQuarter turns
Rotate placed tileRight mouse buttonNot added to undo history
Select palette entries1–9, then 0Shortcuts select only the first ten colors
Undoundo, Ctrl+Z or Meta+ZFirst placed snapshot cannot undo to the initial empty grid
Redoredo buttonHandler has a Shift+Z branch, but checks lowercase e.key === 'z'; browser shortcut behavior needs proof
Export PNGexport buttonX is not implemented
Clearclear buttonClear and preset replacement do not push history

README claims versus inspected source

The README is project context, not an acceptance report. The handler does not implement X export or Ctrl+Y redo. The implementation caps history at 30 snapshots, not the README’s 50. Undo does not cover every transition: right-click rotation, preset replacement, and clear bypass history, and the initial empty state is not recorded. There is no configurable grid-size UI or coordinate-label UI in the inspected source. These limitations are preserved rather than silently fixed during mounting.

Runtime behavior proven in the c2 browser run (host Chrome, loopback serving of dist): placement and rotation, R orientation, 512 × 512 PNG download, reload persistence, mobile and desktop layouts, dock navigation with correct active state, zero console errors, and zero third-party requests thanks to the locally vendored dependencies. Not yet browser-exercised: presets, fill/pick, keyboard behavior beyond R, and the original esm.sh source runtime (the proof ran against the vendored mount, not the frozen clone). A static build alone proves none of this — the recorded run in /home/loca/dev/tiny/evidence/2026-09-28-tiny-5b1edec5-c2/ is the evidence.

Frozen origin and file map

Original source location: dv@0rk.de:/home/dv/dev/terracraft.

Frozen export commit: 243f3e39a06516d4d92324eb00d0e277978c9281.

The original remote directory was left unchanged. A separate export copy was initialized and committed, then transferred into the loca bare anchor /home/loca/dev/tiny-terracraft.git and cloned into /home/loca/dev/tiny/sources/terracraft. Preserve both anchors; do not develop in the imported clone.

Path relative to the imported sourceRole
index.htmlApp markup, styles, Preact components, grid state, keyboard handler, persistence, and PNG export
assets/*_glazed_terracotta.pngSixteen texture PNGs loaded by relative URL
README.mdOriginal run instructions and feature claims; discrepancies listed above
project.yamlOriginal project description
PIMP.md, PIMP-UI.md, REASONING.mdHistorical project and UI reasoning, not proof of current behavior

Dependencies are Preact 10.19.2, Preact hooks from the same 10.19.2 module family, and HTM 3.1.1. The original module URLs point at esm.sh. The Tiny integration vendors those pinned dependencies locally through an import map in the generated mount, built from the project’s committed lockfile; the frozen clone itself is unchanged.

For source development, clone the bare anchor into a separate working copy, serve it with Python, edit that copy, and reload the browser. The complete commands, registry fields, and publication order are in Adding tools. The application shell and its npm run build output in dist are a separate integration layer, not the original source development loop.