fuzzyworld

basin / commit

Improve readme: add Play/Source links and a Deploy section

8552650402a0d87af7d3749268c8fe48c4c8c1c8 · Pavel Safronov · 2026-07-01 07:55:08 -0700 · parents bfd86d6e59ef

Improve readme: add Play/Source links and a Deploy section

Adds the live GitLab Pages URL and the GitLab repo URL up top, documents the
unambiguous-solution guarantee, and restructures into clear sections (How it
works / How to play / Configuring & sharing boards / Develop / Deploy /
Architecture) with a Deploy section covering the CI to GitLab Pages pipeline.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
 readme.md | 31 ++++++++++++++++++++++++++++---
 1 file changed, 28 insertions(+), 3 deletions(-)

diff --git a/readme.md b/readme.md
index 50d0ecb..817a862 100644
--- a/readme.md
+++ b/readme.md
@@ -1,6 +1,15 @@
 # basin
 
-A puzzle game about water basins.
+A browser puzzle game about water basins — read a coastline and deduce where the
+rivers begin.
+
+- **▶ Play:** <https://pavelsafronov.gitlab.io/basin/>
+- **Source:** <https://gitlab.com/PavelSafronov/basin>
+
+Built with Vite + vanilla TypeScript + Canvas2D; no framework, no backend. Every
+board is a seed, so a board is just a link.
+
+## How it works
 
 Each board has a heightmap that falls to the sea at its **ocean** sides. Water
 released from a *spring* flows downhill, branching to every strictly-lower
@@ -13,12 +22,20 @@ a **mountain wall** (high ground that blocks water). Walls make canyons: e.g.
 north + south walls with east + west oceans is a valley that drains sideways.
 Water can never leave through a wall.
 
+## How to play
+
 **Goal:** find the positions of the hidden springs that reproduce that signature.
 Tap cells to explore the terrain — a wrong tap just previews its flow (and marks
 any edges it wrongly wets in red), while landing on a real spring **locks it in**
 (green, numbered). Find them all to solve the board.
 
-## Configuring boards
+Generation guarantees the puzzle is **unambiguous**: the hidden springs are the
+*only* set of that size whose combined flow produces the target signature, so the
+gold-edge hint always pins down a single answer (no redundant or interchangeable
+springs). Boards that can't be made unique fall back to the richest signature
+found, so a board is always produced.
+
+## Configuring & sharing boards
 
 Every axis of a board is a control in the panel: **size**, **spring count**, which
 sides are **walls**, and the **terrain seed**. All of it is captured in a single
@@ -41,6 +58,13 @@ npm run build    # type-check + production build
 npm test         # run the model tests (Vitest)
 ```
 
+## Deploy
+
+`.gitlab-ci.yml` builds the app and publishes it to **GitLab Pages** on every push
+to the default branch. Vite is configured with `base: '/basin/'` and builds into
+`public/` (the dir Pages serves), so the live site is
+<https://pavelsafronov.gitlab.io/basin/>.
+
 ## Architecture
 
 The model (typed arrays) is decoupled from the renderer so a tiled/WebGL renderer
@@ -51,6 +75,7 @@ can replace Canvas2D for large boards later.
   edge, seeded only from ocean sides).
 - `src/model/flow.ts` — the branching watershed flood (single- and multi-spring).
 - `src/model/puzzle.ts` — the board `Config`, its shareable code (encode/decode),
-  config-driven puzzle generation, and the solution check.
+  config-driven puzzle generation (with an unambiguous-solution check), and the
+  solution check.
 - `src/render/renderer.ts` — Canvas2D board + puzzle overlay.
 - `src/game.ts` — puzzle state: exploration probe, locked springs, win detection.