clone

a browser grid puzzle game where you push words around to rewrite the rules of each level

main
miau-is-true
README.md

Miau Is True

A small browser puzzle engine for moving words, changing rules, and solving grid puzzles. The current verified content set contains nine authored proofs: three core levels, three Basic Proofs levels, and three Word Lab levels.

Run it

npm install
npm run dev

Open the local URL printed by Vite. Run npm test for the engine, pack, sharing, and content fixtures, and npm run build to produce dist/.

The current public test build is revision 10 at the stable nzip address public:miau-is-true. It is a static test origin that can support a later shoo.dev identity integration. The current game has no account or sign-in flow.

Play

  • Arrow keys or WASD: move one cell.
  • Z: undo a successful move.
  • R: restart the current level.
  • Space: wait one turn in an automata proof; active automata then take their next pattern step. The mobile proof shows a WAIT button.
  • The desktop fullscreen button is available in developer mode (?dev).
  • Workshop is visible from Title and INDEX with Space, and is also available from Pause.
  • Pause includes sound and optional music controls.
  • Touch controls, Undo, Restart, and Continue are available on screen.

Each word is a pushable object. Straight sentences read left to right or top to bottom. MIAU IS YOU makes the cat controllable; moving STOP out of ROCK IS STOP makes rocks passable. AND can join subjects or predicates. Words can also turn one noun into another, such as MIAU IS ROCK.

The first property set is YOU, PUSH, STOP, WIN, SINK, and DEFEAT. A mod can declare a level-scoped behavior property such as TICK: a formed FENN IS TICK sentence activates FENN's repeating move/wait pattern. The pattern follows that property if the sentence changes; its phase is included in Undo, reset, snapshots, and the solver. This engine has its own MIAU levels and presentation; it does not attempt full compatibility with Baba Is You.

MIAU's 🐈 glyph has a declared native left-facing pose. Successful horizontal movement, including a push, turns it toward travel even when a pack repeats MIAU: '🐈' as a plain palette string. Up/down travel keeps its last horizontal pose; other profile glyphs can declare a native direction with faces in their palette entry.

The engine also exposes physical sentence spans for presentation. Each span keeps its word IDs and horizontal or vertical axis, while semantic rules remain deduplicated. Settled turn events report movement, push provenance, rule deltas, transformations, destruction, blocked inputs, and win state.

The bundled content is currently:

  • Core: src/levels.js, three required onboarding proofs.
  • Basic Proofs: mods/garden-basics.cjs (stable internal pack ID garden-basics), PUSH, SINK, and DEFEAT follow-ups.
  • Word Lab: mods/word-lab.cjs, shared control, noun transformation, and rule cargo.

The INDEX keeps one chapter opener available for each bundled pack on a fresh save: core/break-the-rule (01), garden-basics/garden-push (04), and word-lab/shared-control (07). Later locks and completion progress are keyed by stable packId/levelId pairs, even when the chapters share one sheet.

The pack service and persistent pack library are implemented and tested for preview, explicit install, reload, export, URL sharing, replacement, forking, and removal. The completed E3 sentence-span and E4 sharing changes are archived under openspec/changes/archive/. A local module imported from Workshop first opens a Gift preview; the player chooses Keep and play before it is installed. A shared #pack= URL follows the same pending Gift flow. Workshop provides Import, Play, Share link, Export, and Remove actions. URL data is decoded without evaluating CommonJS source.

The full-screen stage, scene flow, input routing, audio events, local font, mobile behavior, reduced-motion behavior, and developer flow are implemented. Revision 9 passes 183 Node tests, the production build, and desktop/mobile browser checks for the campaign, sharing, automata, and Undo after death. The designer accepted the earlier stage visual gate. The automata visual review remains in the active add-rule-driven-automata OpenSpec change.

Make a mod

Open Workshop from Title or INDEX, then choose Import… to select a trusted local .cjs or .js file. A mod exports a CommonJS object with a manifest, level data, and optional noun palette. See the example mod and modding guide. Local modules execute JavaScript in the browser, so load files you trust.

To try the automata mechanic, import the FENN clock example through Workshop. It is a mechanics sample outside the default campaign while the Clockwork world is being authored. Patterns are bounded declarative data in the pack, and shared links preserve that data without executing source.

Design and workflow

  • Design backbone: vocabulary, turn order, puzzle design research, and extension boundaries.
  • Roadmap: verified work, active OpenSpec changes, and long-term plans.
  • Architecture review: runtime ownership, scaling risks, and the staged refactor plan.
  • openspec/: behavioral specs and the history of proposed changes. Start a new feature with openspec new change <name>, read openspec instructions for each artifact, validate before implementation, then archive after verification.

Pretext sizes variable-length hint copy. Grid coordinates are fixed integers, so emoji and text metrics never change collision geometry. UI sounds come from the supplied Kenney UI Pack (CC0; license in public/audio/LICENSE.txt).