cf4f8772 2026-09-07 Pavel Safronov | 1 | # Tower |
| 2 | |
5e8a8703 2026-10-27 Pavel Safronov | 3 | **Live map — <https://apps.fuzzyworld.net/tower/>** · [Source](https://code.fuzzyworld.net/tower/) |
cf4f8772 2026-09-07 Pavel Safronov | 4 | |
| 5 | Companion piece to a novel set inside **Tower** — a fictional smart cylinder orbiting Earth, |
| 6 | spun for 1 g, with an inner surface the size of Wisconsin, lit by 54 TW of sunlight |
769726ea 2026-09-08 Pavel Safronov | 7 | piped down its axis and scattered by mirrors that make its days and nights. Its wall |
| 8 | is a kilometre of sealed hull: no windows along all 540 km, and no view of the Earth |
9c891d2e 2026-09-08 Pavel Safronov | 9 | it orbits. Both end caps are windows, though — 100 km of glass each, and the only |
| 10 | places in the world with a horizon that is not Tower. Nobody aboard can see the sun |
| 11 | either: the 244 km collector sits between Tower and it, 79 times its diameter, so |
49b0d64d 2026-09-08 Pavel Safronov | 12 | the sun cap looks out at a black disc and the stars around it — black except at its |
| 13 | edge, where the structure holding it flat catches the sun side-on and traces the |
| 14 | whole 244 km in a thin sun-coloured ring. |
cf4f8772 2026-09-07 Pavel Safronov | 15 | |
28f9a6bc 2026-09-07 Pavel Safronov | 16 | Explore Tower from outside, pick a spot on the inner surface, and stand there — with |
| 17 | the ground curving up on both sides and the far side of the world hanging 100 km |
| 18 | overhead, clearer than the ground at your feet. Turn its sun up to Earth clear-sky |
769726ea 2026-09-08 Pavel Safronov | 19 | noon, down to permanent dusk, or shut the beam off entirely and watch the sky come |
| 20 | out: through the far cap the stars wheel once every 7 min 29 s about a single |
| 21 | motionless star on the axis. Nothing inside Tower rotates, because you and the |
| 22 | ground and the air all turn together — so that window is the only place the spin is |
| 23 | visible at all. |
cf4f8772 2026-09-07 Pavel Safronov | 24 | |
| 25 | Tower flies all 78 billion mirrors of its own sunlight, individually, because |
| 26 | nothing passive would stay in the beam past mid-afternoon. It is a person. |
| 27 | |
| 28 | ## Status |
| 29 | |
376f2ce6 2026-09-16 Pavel Safronov | 30 | **All three views are built** — map, exterior and interior — over a world that |
9d5a061c 2026-09-27 Pavel Safronov | 31 | **generates itself live, in the browser**, from a file of authored features. |
376f2ce6 2026-09-16 Pavel Safronov | 32 | |
| 33 | Built: the unrolled surface map, Tower from outside, standing inside it and flying |
59c12827 2026-09-28 Pavel Safronov | 34 | over it, a detail card for every place, Tower's published weather, a sun that crosses |
de3d60d6 2026-09-29 Pavel Safronov | 35 | the world each day on Pisa's clock and a moon by night with Earth's phases, two railways, a scenic tour that flies the world's |
99a2821b 2026-09-29 Pavel Safronov | 36 | paragliders, aircraft, airships, trains and spacecraft inside and out, permalinks, and the |
| 37 | sightline probe. |
9d5a061c 2026-09-27 Pavel Safronov | 38 | |
| 39 | **The app is for looking; the world is changed in the repository.** The author writes |
| 40 | alongside Tower rather than in it, and changes the world by talking it through with |
| 41 | Claude, who edits [`content/world.json`](content/world.json). That file is the one |
| 42 | authoritative copy — there is no editor in the browser, no local draft, and nothing to |
| 43 | import or export (decisions.md D-072). |
376f2ce6 2026-09-16 Pavel Safronov | 44 | |
51c39d8b 2026-09-17 Pavel Safronov | 45 | **In progress: [world-generation.md](world-generation.md).** Phases 1 to 5 are built — |
376f2ce6 2026-09-16 Pavel Safronov | 46 | the terrain is no longer baked into images by a build step; every mountain, lake, |
| 47 | sea, river, desert and forest is a feature the browser turns into ground on demand, |
a088e5d5 2026-09-17 Pavel Safronov | 48 | in web workers, from a metre underfoot to the whole world. Mountain ranges are summits |
| 49 | joined by ridges and cut by water into valleys; lakes, seas and rivers are water with |
| 50 | waves, flow and waterfalls; Tower publishes a weather plan, and ships sail the ring seas |
00ceeedb 2026-09-27 Pavel Safronov | 51 | by it. The Dry Reach has mesas, dune fields, dry washes and salt pans, and Greatwood is |
| 52 | three billion individual trees with meadows through it and a wood of 100 m giants near the |
| 53 | Capital. Phases 7–8 add settlements and roads. |
cf4f8772 2026-09-07 Pavel Safronov | 54 | |
| 55 | - [design.md](design.md) — canon, physics and application architecture |
376f2ce6 2026-09-16 Pavel Safronov | 56 | - [world-generation.md](world-generation.md) — how the world is generated, and the plan |
cf4f8772 2026-09-07 Pavel Safronov | 57 | - [decisions.md](decisions.md) — choices made and why |
| 58 | |
| 59 | Both are series-bible material: coherence outranks spectacle, and the prose is |
| 60 | downstream of them. |
| 61 | |
fc11b064 2026-09-08 Pavel Safronov | 62 | On a phone the sidebar is a **drawer** rather than a column: below 720 px the world |
| 63 | gets the whole screen and the panel slides in over it, one tap away and one tap |
| 64 | gone. Picking a place closes it, because in every view selecting a place is how you |
| 65 | travel there — see [decisions.md](decisions.md) D-043. |
| 66 | |
6364748a 2026-09-08 Pavel Safronov | 67 | ## Screenshots |
| 68 | |
a088e5d5 2026-09-17 Pavel Safronov | 69 | [](docs/screenshots/overview.png) |
6364748a 2026-09-08 Pavel Safronov | 70 | |
| 71 | `npm run screenshots` drives the real application in a headless browser — clicking |
| 72 | the view buttons, picking places out of the list, dragging to orbit and to look up — |
| 73 | and writes [`docs/screenshots/`](docs/screenshots/). Taking them *through the UI* is |
| 74 | the point: a shot taken this way fails when the UI fails, so a black canvas ends up |
| 75 | in the picture instead of hiding behind a passing unit test. |
| 76 | |
51c39d8b 2026-09-17 Pavel Safronov | 77 | A scene the tour photographs is held at one moment with the water's clock stopped too, so |
| 78 | the sea in a shot is the same sea every run and a divergence means a real change. |
| 79 | `--only <ids>` retakes a few shots and leaves the sheet alone. |
| 80 | |
| 81 | The whole tour takes about **three minutes**, and waits on the world being |
80bcc97a 2026-09-17 Pavel Safronov | 82 | generated rather than on fixed delays: a shot is taken once the terrain has compiled, the |
| 83 | map is drawn, and every tile of ground the view wants has arrived. It is kept light on the |
| 84 | machine: the world is **compiled once** for the whole tour and every shot starts from that |
| 85 | cache, and each page runs **two** terrain workers rather than a full pool — four pages at |
| 86 | once each compiling the world with six workers was a laptop running hot. It once took six and a |
376f2ce6 2026-09-16 Pavel Safronov | 87 | half minutes, nearly all of them spent rendering Tower's haze integral on the CPU — |
| 88 | the default headless browser has no GPU. It now asks for the full Chrome build, which reaches |
18958d3d 2026-09-08 Pavel Safronov | 89 | the real one, and photographs four shots at a time, since a shot is mostly spent |
| 90 | waiting. The cost is that the committed images are tied to the GPU that drew them: |
| 91 | another machine will show a large one-off divergence rather than a regression. |
| 92 | |
6364748a 2026-09-08 Pavel Safronov | 93 | | Desktop — 1440×900 | | |
| 94 | |---|---| |
| 95 | | [map](docs/screenshots/desktop-map.png) | the unrolled inner surface, with a place selected | |
| 96 | | [map-sightline](docs/screenshots/desktop-map-sightline.png) | shift-click two points to measure a sightline through the air | |
4699e6cb 2026-09-08 Pavel Safronov | 97 | | [exterior](docs/screenshots/desktop-exterior.png) | x-ray hull — the inner surface projected out, with the caps and the collector | |
| 98 | | [exterior-true](docs/screenshots/desktop-exterior-true.png) | true hull — bare skin, and the land visible through the far cap window | |
6364748a 2026-09-08 Pavel Safronov | 99 | | [interior](docs/screenshots/desktop-interior.png) | standing at The Narrows, the ground curving up on both sides | |
a088e5d5 2026-09-17 Pavel Safronov | 100 | | [tour-falls](docs/screenshots/desktop-tour-falls.png) | scenic tour: a helicopter circling the Long Water's 680 m fall | |
99a2821b 2026-09-29 Pavel Safronov | 101 | | [tour-falls-glide](docs/screenshots/desktop-tour-falls-glide.png) | scenic tour: a paraglider past the same fall | |
a088e5d5 2026-09-17 Pavel Safronov | 102 | | [tour-ship](docs/screenshots/desktop-tour-ship.png) | scenic tour: following a ship round the Sunward Sea | |
| 103 | | [tour-squall](docs/screenshots/desktop-tour-squall.png) | scenic tour: a ship caught out by a gale Tower gave no warning of | |
99a2821b 2026-09-29 Pavel Safronov | 104 | | [tour-summit](docs/screenshots/desktop-tour-summit.png) | scenic tour: an airship off Snowcrown, 4,300 m | |
| 105 | | [tour-ridge](docs/screenshots/desktop-tour-ridge.png) | scenic tour: a paraglider ridge-soaring on a summit's flank | |
| 106 | | [tour-thermal](docs/screenshots/desktop-tour-thermal.png) | scenic tour: a glider climbing in a thermal over the Dry Reach | |
| 107 | | [tour-mesas](docs/screenshots/desktop-tour-mesas.png) | scenic tour: past the mesas of the Dry Reach, strata lining up across all of them | |
00ceeedb 2026-09-27 Pavel Safronov | 108 | | [tour-giants](docs/screenshots/desktop-tour-giants.png) | scenic tour: under the giants of the Tall Wood, 115 m of them | |
| 109 | | [tour-canopy](docs/screenshots/desktop-tour-canopy.png) | scenic tour: low over Greatwood, closed canopy and the meadows left open in it | |
99a2821b 2026-09-29 Pavel Safronov | 110 | | [tour-deep](docs/screenshots/desktop-tour-deep.png) | scenic tour: a seaplane out from the Capital over The Deep | |
| 111 | | [tour-girdle](docs/screenshots/desktop-tour-girdle.png) | scenic tour: an airliner over the Girdle, antispinward and lighter for it | |
| 112 | | [tour-climb](docs/screenshots/desktop-tour-climb.png) | scenic tour: a giant airship climbing out of the Capital, the world closing overhead | |
| 113 | | [tour-sun-circuit](docs/screenshots/desktop-tour-sun-circuit.png) | scenic tour: a giant airship round the sun, outside the beam | |
| 114 | | [tour-far-cap](docs/screenshots/desktop-tour-far-cap.png) | scenic tour: toward the far cap by night | |
42b4554e 2026-09-29 Pavel Safronov | 115 | | [tour-moonlight](docs/screenshots/desktop-tour-moonlight.png) | scenic tour: over The Deep by the light of Tower's moon | |
99a2821b 2026-09-29 Pavel Safronov | 116 | | [tour-train-narrows](docs/screenshots/desktop-tour-train-narrows.png) | scenic tour: a train on the Axial Line through The Narrows | |
| 117 | | [tour-train-ring](docs/screenshots/desktop-tour-train-ring.png) | scenic tour: a train on the Uplands Ring | |
| 118 | | [tour-grand](docs/screenshots/desktop-tour-grand.png) | scenic tour: outside: Tower, its collector and the sun in one frame | |
| 119 | | [tour-docking](docs/screenshots/desktop-tour-docking.png) | scenic tour: outside: a spacecraft docking on the shell | |
| 120 | | [tour-far-cap-peek](docs/screenshots/desktop-tour-far-cap-peek.png) | scenic tour: outside: looking in through the far cap | |
| 121 | | [tour-hull-skim](docs/screenshots/desktop-tour-hull-skim.png) | scenic tour: outside: skimming the hull as it turns | |
6364748a 2026-09-08 Pavel Safronov | 122 | | [interior-overhead](docs/screenshots/desktop-interior-overhead.png) | looking up: the far side 100 km overhead is clearer than ground 100 km away | |
59c12827 2026-09-28 Pavel Safronov | 123 | | [interior-morning](docs/screenshots/desktop-interior-morning.png) | 06:30 — the sun just out from the sun cap and coming, the rod lit only behind it | |
9d5a061c 2026-09-27 Pavel Safronov | 124 | | [detail](docs/screenshots/desktop-detail.png) | a place selected: its detail card, with what the world made of it | |
6364748a 2026-09-08 Pavel Safronov | 125 | |
| 126 | | Mobile — 390×844 | | |
| 127 | |---|---| |
| 128 | | [map](docs/screenshots/mobile-map.png) | the world with the whole screen, the panel one tap away | |
| 129 | | [exterior](docs/screenshots/mobile-exterior.png) | the spin readout dropped clear of the panel button | |
| 130 | | [interior](docs/screenshots/mobile-interior.png) | the standing readout at a size that fits 390 px | |
| 131 | | [panel](docs/screenshots/mobile-panel.png) | the sidebar as a drawer, opened over the world | |
| 132 | |
| 133 | ### Looking before committing |
| 134 | |
99a2821b 2026-09-29 Pavel Safronov | 135 | [`overview.png`](docs/screenshots/overview.png) is a contact sheet of every shot. It |
6364748a 2026-09-08 Pavel Safronov | 136 | exists to be **looked at, once, before committing** — one image that answers "is the |
| 137 | application still there?". Regenerate, glance at it, then commit. |
| 138 | |
| 139 | `--check` puts a number on the same question. Every shot is compared against the |
| 140 | committed one and the run fails if any of them moved too far: |
| 141 | |
| 142 | ``` |
| 143 | npm run screenshots -- --check # fail past 3% divergence on any shot |
| 144 | npm run screenshots -- --threshold 8 # report only, looser bar |
| 145 | npm run screenshots -- --url http://localhost:5173 # use a dev server already up |
| 146 | ``` |
| 147 | |
18958d3d 2026-09-08 Pavel Safronov | 148 | The threshold is measured at both ends, not guessed. The 2D shots come out |
| 149 | **byte-identical** between runs — nothing in Tower is stochastic, the exterior spin |
| 150 | is switched off, and every shot gets a fresh browser context so no camera leaks into |
| 151 | the next. **The WebGL shots do not**, because the tour draws on the real GPU and |
| 152 | Metal does not schedule floating-point work identically twice; they drift by 0.1% to |
| 153 | **0.9%**. Against that, hiding both 3D canvases scored **7% to 31%**, and a view |
| 154 | going entirely black scores 12% to 39%. |
6364748a 2026-09-08 Pavel Safronov | 155 | |
| 156 | **3% is three times the worst noise and less than half the mildest real failure.** |
| 157 | It is a smoke alarm, not a verdict: when it fires, go and look at the sheet. Note |
| 158 | that a view which never worked scores 0% when it breaks further — this catches |
| 159 | regressions, not things that were already broken. |
| 160 | |
3cc2b5bd 2026-10-04 Pavel Safronov | 161 | ## Photographs |
| 162 | |
| 163 | A view worth keeping — things lined up, at a particular time — is saved as numbers and |
| 164 | rendered again whenever it is wanted, so an illustration can always be remade from the |
| 165 | latest world and the latest renderer (D-099). |
| 166 | |
| 167 | 1. `npm run dev`, open the **exterior** or the **interior**, and frame the shot: the camera, |
| 168 | the day and time, the Light, the hull. |
| 169 | 2. Press **P**, or **Save this shot** under View, and give it a name. The shot goes into |
| 170 | [`content/photos.json`](content/photos.json). Saving under a name already in the list |
| 171 | re-frames that shot. The button and the key exist only on a dev server, and it takes a |
| 172 | shot only from the machine it runs on; the published site has neither. |
| 173 | 3. `npm run photos` renders every shot to `photos/<name>.png`. |
| 174 | |
| 175 | To go back to a shot, pick it from **Saved shots**, under the button: the app opens its |
| 176 | view, puts the camera where the shot has it, and stops the clock at its moment (and, |
| 177 | outside, the spin), and carries on from there. Adjust it and save under the same name — |
| 178 | the name is filled in — to re-frame it. The list is read from the file each time it is |
| 179 | opened, so a shot typed by hand is in it too. |
| 180 | |
| 181 | ``` |
| 182 | npm run photos # every shot in content/photos.json |
| 183 | npm run photos -- --only far-cap # just the shots whose names start so |
| 184 | npm run photos -- --long-edge 5760 # bigger; the default is 3840 (4K) |
| 185 | npm run photos -- --url http://localhost:5173 # use a dev server already up |
| 186 | ``` |
| 187 | |
| 188 | A render is **the view alone** — no panel, no readouts, no gauge, no labels — at the shape |
| 189 | of the window the shot was framed in, 3840 px along its long edge. The file name never |
| 190 | changes, so rendering again replaces the picture with the newest version of itself. |
| 191 | `photos/` is not committed: the list is what is kept, and the pictures are made from it. |
| 192 | |
| 193 | An entry is plain numbers, and is meant to be edited by hand as well: |
| 194 | |
| 195 | | | | |
| 196 | |---|---| |
| 197 | | `id` | the file's name: lower-case letters, digits, hyphens | |
| 198 | | `note` | anything worth remembering; kept when the shot is re-framed | |
| 199 | | `view` | `exterior` or `interior` | |
| 200 | | `hours` | the world clock, hours since day 0 began (day 2, 06:30 is `54.5`) | |
| 201 | | `dial` | the Light: `dark`, `twilight`, `temperate`, `full` | |
| 202 | | `aspect` | width over height of the frame | |
| 203 | | interior: `theta`, `z`, `eyeM` | where the observer stands: radians round, metres from the sun cap, eye height in metres | |
| 204 | | interior: `yaw`, `pitch`, `fovDeg` | heading in radians from deepward (`0` faces the far cap, `3.14159` the sun cap), elevation in radians, field of view in degrees | |
| 205 | | interior: `spin` | how far the sky through the far cap has wheeled, radians | |
| 206 | | exterior: `position`, `target` | the camera and the point it looks at, in kilometres | |
| 207 | | exterior: `phase`, `hull` | how far the hull has turned, radians; and the hull reading | |
| 208 | | exterior: `fovDeg` | field of view in degrees. The view's own is `42` and it has no zoom, so a saved shot says `42`; type a smaller number to frame it tighter | |
| 209 | |
| 210 | A render holds still: the hull does not turn, the sky through the far cap does not wheel, |
| 211 | and the water is held at one moment, so the same entry gives the same file every time. A |
| 212 | shot cannot be saved while a scenic tour is running — its flyers belong to the tour — so |
| 213 | stop the tour first. |
| 214 | |
| 215 | The list holds the two caps as seen from 300 m over the Capital at 08:45, and |
| 216 | `tower-from-the-far-end`, the blog illustration of 2026-08-19 worked back from its JPEG: |
| 217 | the camera and the field of view fitted to where the far cap, the collector and the sun |
| 218 | fall in it, the day from the stars and the hour from the lit rod. How far the hull had |
| 219 | turned could only be told to a sixth of a turn, so the rock is not lump for lump the same. |
| 220 | |
cf4f8772 2026-09-07 Pavel Safronov | 221 | ## Development |
| 222 | |
| 223 | ``` |
| 224 | npm install |
b55cf01b 2026-09-08 Pavel Safronov | 225 | npm run dev # http://localhost:5173, plus a LAN URL and a QR code for it |
3cc2b5bd 2026-10-04 Pavel Safronov | 226 | npm test # 279 tests; canon figures are pinned to design.md |
cf4f8772 2026-09-07 Pavel Safronov | 227 | npm run build |
6364748a 2026-09-08 Pavel Safronov | 228 | npm run screenshots # drive the app and rephotograph docs/screenshots/ |
99a2821b 2026-09-29 Pavel Safronov | 229 | npm run screenshots -- --only tour-grand # just those shots, for working on one view |
3cc2b5bd 2026-10-04 Pavel Safronov | 230 | npm run photos # render the saved shots in content/photos.json to photos/ |
cf4f8772 2026-09-07 Pavel Safronov | 231 | ``` |
| 232 | |
b55cf01b 2026-09-08 Pavel Safronov | 233 | `npm run dev` binds to every interface (`vite --host`) and prints a scannable QR |
| 234 | code of the network URL, so the touch interactions can be tried on a phone on the |
| 235 | same Wi-Fi without typing an address. The server is reachable by anyone on that |
| 236 | network while it runs; drop the `--host` if that is not wanted. |
| 237 | |
cf4f8772 2026-09-07 Pavel Safronov | 238 | Vite + TypeScript, deployed to GitLab Pages by `.gitlab-ci.yml` on every push to the |
28f9a6bc 2026-09-07 Pavel Safronov | 239 | default branch. Three.js is loaded only when a 3D view is opened, so a reader who |
376f2ce6 2026-09-16 Pavel Safronov | 240 | stays on the map never downloads it. There is no terrain build step: the world is |
9d5a061c 2026-09-27 Pavel Safronov | 241 | generated in the browser from `world.json`, which the build makes from |
| 242 | `content/world.json` (world-generation.md §5). |
cf4f8772 2026-09-07 Pavel Safronov | 243 | |
b4b8e46c 2026-09-28 Pavel Safronov | 244 | **Every branch is on Pages too.** The default branch is at the site root and every other |
5e8a8703 2026-10-27 Pavel Safronov | 245 | branch at `/tower/<branch>/` — `forest` at <https://apps.fuzzyworld.net/tower/forest/> — |
b4b8e46c 2026-09-28 Pavel Safronov | 246 | so a branch can be looked at without a dev server. When the site holds more than one |
| 247 | branch, a **branch picker** in the panel header switches between them, keeping the view and |
| 248 | place in the URL. [`tools/build-pages.sh`](tools/build-pages.sh) builds them all from the |
| 249 | default branch's pipeline, and a push to any other branch triggers that pipeline, so a |
| 250 | preview is a few minutes behind its branch. A branch that fails to build is left out rather |
| 251 | than taking the site down. All of them share one origin, so they share browser storage: the |
| 252 | remembered view, camera and label setting follow you between branches. |
| 253 | |
4a8aed84 2026-09-07 Pavel Safronov | 254 | Assets are referenced **relatively**, so the same build works whether Pages serves |
5e8a8703 2026-10-27 Pavel Safronov | 255 | it from `https://apps.fuzzyworld.net/tower/` or from a generated unique domain |
4a8aed84 2026-09-07 Pavel Safronov | 256 | at a root. Set a `BASE` CI variable to force an absolute base if that is ever |
| 257 | needed. |
cf4f8772 2026-09-07 Pavel Safronov | 258 | |
d975fc10 2026-09-09 Pavel Safronov | 259 | ### When the interior view looks wrong |
| 260 | |
| 261 | The interior keeps a flight recorder — the last quarter-minute of camera, draw calls |
| 262 | and frame colour — because the rendering faults worth catching there have all been |
| 263 | intermittent (decisions.md D-057, D-058). While the fault is **still on screen**, open |
| 264 | the console and call: |
| 265 | |
| 266 | ```js |
| 267 | towerDump() // logs the whole state and copies it to the clipboard |
| 268 | ``` |
| 269 | |
| 270 | The first line is the answer most of the time. It draws each surface alone and |
| 271 | measures how colourful it is: |
| 272 | |
| 273 | ``` |
| 274 | [tower] alone in frame — ground 31.32, sunCap 19, farCap 31.3, bore 19, beam 19 (19 = nothing drawn) |
| 275 | ``` |
| 276 | |
| 277 | `19` is the clear colour, so it means that surface put nothing in the middle of the |
| 278 | view — expected for anything currently off screen. The ground reads about `30` when it |
| 279 | is carrying land. **A ground near `19` while you are looking at the ground is the |
376f2ce6 2026-09-16 Pavel Safronov | 280 | diagnosis**: the ground's tiles are missing or its shader is failing. The dump's |
| 281 | `terrain` entry says which: the world generation the view is drawing, how many tiles are |
| 282 | on screen, whether every tile it wants has arrived, and how busy the worker pool is. The |
| 283 | rest carries the camera and the per-frame trace, with the tile count in every frame, so |
| 284 | the heading the view changed at can be read off afterwards. `window.tower` is the view |
| 285 | itself, and `window.towerTerrain` the terrain service, for poking at directly. |
d975fc10 2026-09-09 Pavel Safronov | 286 | |
| 287 | This is on in the built site as well as in dev, deliberately: the fault has only ever |
| 288 | turned up in ordinary use, and it costs two properties on `window` that do nothing |
| 289 | until they are called. |
| 290 | |
cf4f8772 2026-09-07 Pavel Safronov | 291 | ## Geography |
| 292 | |
376f2ce6 2026-09-16 Pavel Safronov | 293 | [`content/world.json`](content/world.json) is the world: every feature — mountains, |
| 294 | lakes, seas, rivers, desert, forest, settlements and plain markers — with its shape in |
| 295 | canon coordinates (θ, z) and its parameters beside it, plus the author's notes. The |
| 296 | browser generates the terrain from it live (world-generation.md, decisions.md D-062); |
| 297 | there is no build step and there are no terrain images. |
9d5a061c 2026-09-27 Pavel Safronov | 298 | It is the **only copy**: what the app loads is `world.json`, made from it by |
| 299 | [`vite.config.ts`](vite.config.ts) — served by the dev server, written into the build — |
| 300 | with every note removed and any feature marked `"public": false` left out. It is never |
| 301 | committed, so it cannot drift from the file it comes from. Save `content/world.json` |
| 302 | with `npm run dev` running and the open page reloads with the change. |
cf4f8772 2026-09-07 Pavel Safronov | 303 | |
376f2ce6 2026-09-16 Pavel Safronov | 304 | Generation is deterministic. The seeds are in the file, so every reader sees the same |
| 305 | world the author does, to the tree. |
cf4f8772 2026-09-07 Pavel Safronov | 306 | |
80bcc97a 2026-09-17 Pavel Safronov | 307 | The compiled world is kept in the browser's IndexedDB, keyed by the world and the build |
| 308 | that compiled it, so a returning visit to an unchanged world skips compiling. |
| 309 | |
376f2ce6 2026-09-16 Pavel Safronov | 310 | When the world loads, and after any edit that changes the ground, it is compiled in a |
| 311 | worker — rivers given their long profiles, lake levels found, summits measured. If that |
| 312 | takes longer than 400 ms a dialog says what Tower is making, one step at a time. A |
| 313 | rename, a blurb or a note changes nothing on the ground and regenerates nothing. |
cf4f8772 2026-09-07 Pavel Safronov | 314 | |
376f2ce6 2026-09-16 Pavel Safronov | 315 | The world was ported from v1's `content/geography.json` by |
| 316 | [`tools/port-world.mjs`](tools/port-world.mjs), kept for reading; there is no |
| 317 | backwards compatibility with v1 files. |
cf4f8772 2026-09-07 Pavel Safronov | 318 | |
9d5a061c 2026-09-27 Pavel Safronov | 319 | ## Reading |
| 320 | |
| 321 | The app only reads the world. Select a place — in the list, on the map, or in the |
| 322 | interior — to see its detail card: its name, its blurb, where it is, and what the world |
| 323 | made of it — a range's named summits, the sea running on a lake or sea *now* by the |
| 324 | clock, how many trees a forest holds and how far apart, what a desert's landforms came |
| 325 | to. **Shift-click two points** on the map to measure a sightline (Esc clears it), and |
1c0284d0 2026-09-27 Pavel Safronov | 326 | **F** fits the map. **Show labels** in the View section — or **L**, in any view — hides |
| 327 | or shows every label at once: the map's place names and captions, and the captions over |
| 328 | the exterior and interior. The choice is remembered across reloads. |
cf4f8772 2026-09-07 Pavel Safronov | 329 | |
9d5a061c 2026-09-27 Pavel Safronov | 330 | Changes to the world — a new place, a moved summit, a storm in the weather plan — are |
| 331 | made in `content/world.json`, not in the browser (D-072). |
cf4f8772 2026-09-07 Pavel Safronov | 332 | |
| 333 | Any selection updates the URL, so a link is always shareable: |
| 334 | |
| 335 | | | | |
| 336 | |---|---| |
| 337 | | `#place=the-narrows` | select and centre a place | |
| 338 | | `#at=0.03,170000` | drop a sightline endpoint at (θ, z) | |
| 339 | |
5f38efd0 2026-09-07 Pavel Safronov | 340 | ## Views |
| 341 | |
a3f01bd7 2026-09-08 Pavel Safronov | 342 | **Map** is the unrolled inner surface. **Exterior** is Tower from outside — a |
e331ec2a 2026-09-28 Pavel Safronov | 343 | kilometre of hull, a window at each cap, the real night sky, the 244 km collector |
a3f01bd7 2026-09-08 Pavel Safronov | 344 | flying ahead and the beam converging into the sun cap. Each piece is captioned. |
| 345 | |
e331ec2a 2026-09-28 Pavel Safronov | 346 | **The stars are Earth's** — every naked-eye star in the Yale Bright Star Catalogue, about |
| 347 | 9,100 of them to magnitude 6.5, at their true positions, brightnesses and colours. The same |
| 348 | sky is seen through the cap windows from inside. Tower's axis points at the sun, so the far |
| 349 | cap looks at the point opposite it, and the sky behind Tower turns once a year with the |
| 350 | clock's date; from outside, ecliptic north is up. `node tools/bright-stars.mjs` rebuilds |
| 351 | the catalogue file (`src/data/bright-stars.json`) from CDS. |
| 352 | |
ab6ae94f 2026-09-28 Pavel Safronov | 353 | The hull reads five ways and the **Hull** switch picks one; it opens on True and |
aa201500 2026-09-14 Pavel Safronov | 354 | remembers whichever you last chose. **True** is the outer |
6bb061a6 2026-09-14 Pavel Safronov | 355 | skin: bare structure, and both caps real windows — look in through either and the |
| 356 | land is actually there, hazed exactly as the interior view hazes it and receding |
| 357 | 540 km down the tube. It is the only line |
a3f01bd7 2026-09-08 Pavel Safronov | 358 | of sight into Tower that is not a diagram. **X-ray** wraps the terrain onto the |
| 359 | outside instead, which is a diagram of what is inside rather than a view of it, and |
6368edcf 2026-09-28 Pavel Safronov | 360 | useful precisely because the wall is opaque. **Rock** and **Piping** are experiments, not |
| 361 | canon. Rock dresses the hull as an asteroid: a cratered, lumpy shell of rock a few |
| 362 | kilometres thick laid over the skin, with the windows left clear. Piping dresses it as |
| 363 | industrial plant: panelled plating, a band with hoop pipes every ~36 km, bundles of pipes |
| 364 | 0.6–2.2 km across running between them, and blocks of plant. Vents open at random, each |
| 365 | on its own clock: grilles flare hot and fall back to an ember, and exhaust shoots out and |
| 366 | fades. Near each end are thruster pods — what holds Tower's attitude — and every so often |
| 367 | one fires a long flame that fans out into space and lights the plating round it. All of it |
ab6ae94f 2026-09-28 Pavel Safronov | 368 | wears a layer of dust, thickest on whatever faces outward. **Rock and piping** puts the |
| 369 | two together: the plant half buried under banks of rock heaped on as shielding, bare |
| 370 | plating and plant rooms in the gaps, the bands and pipe runs going under the rock and out |
| 371 | again, and the rock dug clear round each thruster pod. The active view is remembered and travels in the permalink, so |
99a2821b 2026-09-29 Pavel Safronov | 372 | `#view=exterior&place=the-narrows` opens where you left off. Drag to orbit, scroll to zoom, click the hull to drop a point. |
| 373 | **Scenic tour** in the exterior's panel flies spacecraft instead: skimming the hull while it |
| 374 | turns under them at 700 m/s, docking on it — ships dock anywhere on the shell, and hang from |
| 375 | it at 1.02 g — looking in through the far cap, over the collector's rim, down the outside of |
| 376 | the beam, and Tower, the collector and the sun in one frame; the spin runs at |
5f38efd0 2026-09-07 Pavel Safronov | 377 | 1x to 1200x real time, and a point picked off the turning hull still comes back in |
| 378 | canon coordinates. |
| 379 | |
376f2ce6 2026-09-16 Pavel Safronov | 380 | **Interior** is standing inside. The ground is the real cylinder, built from |
| 381 | generated tiles that get finer around you — half a metre between vertices underfoot, |
| 382 | half a kilometre on the far side of the world — so it curves up on both sides and |
| 383 | closes overhead. Haze is integrated through Tower's rotational air column for |
28f9a6bc 2026-09-07 Pavel Safronov | 384 | every pixel, which reproduces the strangest fact about the place: the land 100 km |
| 385 | straight up is **78%** clear while the ground 100 km away is **31%** — distant |
| 386 | geography here is best seen by looking up. |
| 387 | |
8cb6755f 2026-09-09 Pavel Safronov | 388 | **One finger looks and two fingers move** (D-059). Dragging with two takes hold of |
| 389 | the ground under them and keeps it under them, so the distance covered comes out |
| 390 | right by itself and the tilt of your head is the gearing: level, a screen of drag |
3e898b51 2026-09-28 Pavel Safronov | 391 | walks you 1.9 km, and tipped 23° down it steps 26 m. On a trackpad the two-finger |
| 392 | swipe moves you too, and so does a mouse wheel: a screen's swipe walks about 70 m from |
| 393 | standing and some 40 km from a kilometre up, the ground following your fingers. A |
| 394 | mouse has only ever one pointer, so shift-drag or the middle button stands in for the |
| 395 | second finger. There is no zoom: the field of view is fixed at 60° (D-083). Selecting a place — in the list or by its |
8cb6755f 2026-09-09 Pavel Safronov | 396 | caption — still **walks you there**, which is the only way to cross the world in |
| 397 | one move: most of it is beyond the haze horizon from any given spot, so travelling |
| 398 | is more use than turning. |
28f9a6bc 2026-09-07 Pavel Safronov | 399 | |
00ceeedb 2026-09-27 Pavel Safronov | 400 | **The forest is trees.** Greatwood is about three billion of them, so only the ones you |
| 401 | could see as trees exist at any moment: meshes within a couple of hundred metres, then |
| 402 | cards turned to face you, then clumps — one card for every thirty metres of wood — out to |
| 403 | nearly three kilometres, over a canopy that closes the ground behind them, with the meadows |
| 404 | showing through as grass. Which trees stand where is a rule rather than a list, so they are the |
| 405 | same trees for everyone and they are still there when you walk back. **The Tall Wood** is |
| 406 | 52 km² of giants near the Capital — 90 to 115 m, about as tall as a tree can be at 1 g — |
| 407 | placed once from the world's seed and then left where it fell. |
| 408 | |
| 409 | A settlement clears the trees it stands on, so the Capital is a 20 km opening in Greatwood |
| 410 | rather than a city in a wood. |
| 411 | |
51c39d8b 2026-09-17 Pavel Safronov | 412 | **The desert is a desert.** The Dry Reach rings the world with tiers of rock standing over |
| 413 | dune fields, hills, dry washes routed the way water would have routed them, and salt pans |
| 414 | in its lowest ground with the shorelines of lakes that never stood stepped around them. |
| 415 | None of it is a remnant: Tower had seen deserts on Earth and built one. |
| 416 | |
80bcc97a 2026-09-17 Pavel Safronov | 417 | **The water is water.** Lakes, seas and rivers are surfaces at their own levels, with |
| 418 | waves sized from each body's wind and fetch, rivers running downstream, and rapids white. |
| 419 | A river that cannot slope falls: the Long Water drops 680 m off the range into a gorge, |
| 420 | and the falling water drifts antispinward as it goes — the spin, shown by what falls. |
| 421 | |
a088e5d5 2026-09-17 Pavel Safronov | 422 | **The weather is Tower's, and it is published.** Waves follow Tower's weather plan: a |
| 423 | storm builds the sea over a few hours, whitecaps spread with the wind, and the sea keeps |
| 424 | running after the wind drops. **Ships** sail both ring seas, each on its own lane round the |
| 425 | world, riding the waves drawn under it with its mainsail set to the wind. When a gale or |
| 426 | storm has been published for their sea in time, they stay in harbour — even if Tower has |
| 427 | since called it off, because people act on what they were told — and a squall announced |
59c12827 2026-09-28 Pavel Safronov | 428 | too late catches them at sea. Set the **Day** under **Time**, or run the clock, to move |
a088e5d5 2026-09-17 Pavel Safronov | 429 | through the plan. |
| 430 | |
99a2821b 2026-09-29 Pavel Safronov | 431 | **Or take the scenic tour.** *Scenic tour* in the view panel hands you from one of the |
| 432 | world's flyers to the next, every twelve to eighteen seconds, in an order dealt at random: |
| 433 | a paraglider on Snowcrown's flank, a glider circling up in a thermal over the Dry Reach, a |
| 434 | helicopter round the great waterfall, a seaplane across The Deep, an airliner round the |
| 435 | Girdle — flying antispinward, and so weighing a third of what it would at rest — a giant |
| 436 | airship climbing out of the Capital until the world closes overhead, another circling the |
| 437 | sun, outside the beam as every aircraft must be, trains on the two railways, and ships in |
| 438 | fair weather and in a squall. The camera rides in the craft or chases it, banks with it, |
| 439 | and turns to whatever can be seen from there — never at something the haze has eaten. The |
ec1a6075 2026-09-30 Pavel Safronov | 440 | slow legs are time-lapses and the caption says so. The caption's border fills in clockwise |
| 441 | from its top-left corner as the leg runs, and the next leg comes when it closes. **N** skips ahead; **Esc**, a drag or a |
99a2821b 2026-09-29 Pavel Safronov | 442 | flight key stops it and leaves you where it was. |
a088e5d5 2026-09-17 Pavel Safronov | 443 | |
376f2ce6 2026-09-16 Pavel Safronov | 444 | **Or fly.** W A S D or the arrow keys move you, E climbs and Q descends, and shift |
| 445 | goes five times faster. Speed follows your height above the ground: a brisk walk |
| 446 | at standing height, and a sea crossed in seconds from ten kilometres up, with nothing |
| 447 | to set in between. |
| 448 | |
59c12827 2026-09-28 Pavel Safronov | 449 | **The caps have more than one name.** The **sun cap** is the end the beam comes in at. The |
42b4554e 2026-09-29 Pavel Safronov | 450 | **far cap** is also the **star cap**, since it is the one that shows the stars, and the **night |
| 451 | cap**, since the night starts there: the sun goes out at it, and the moon sets out from it. More |
| 452 | names get added as they come into use. |
59c12827 2026-09-28 Pavel Safronov | 453 | |
769726ea 2026-09-08 Pavel Safronov | 454 | **The far cap is a window** — 100 km of it, looking into deep anti-sun space. By day |
| 455 | it is simply a disc of blue, because 540 km of air in front of it scatters more |
| 456 | light than anything behind it sends; the stars are there at noon and unseeable, |
59c12827 2026-09-28 Pavel Safronov | 457 | which is a fact about eyes rather than about glass. At night they |
| 458 | come out. The sun cap is glazed too: it faces the collector, not the sun, so it has |
| 459 | nothing to manage the glare of (design.md §1.3.0). |
769726ea 2026-09-08 Pavel Safronov | 460 | |
da6bcb0e 2026-09-08 Pavel Safronov | 461 | The one part of the far cap that is not glass is a **3.2 km mirror** on the axis. |
| 462 | A quarter of the beam survives all 540 km and arrives collimated, so it lands as |
| 463 | 1.7 MW/m² — 1,200 suns — on a spot a thousandth of the cap's area; the mirror sends |
| 464 | it back up the column for a second pass, which lifts the beam's utilisation from 76% |
f16f084e 2026-09-28 Pavel Safronov | 465 | to 94%. The rod reaches it at every hour: by day the sun takes part of the beam and the |
| 466 | rest runs on past it, so the beam is one line of light from cap to cap with the sun |
| 467 | moving along it, and the mirror is a lit disc where the rod ends. |
da6bcb0e 2026-09-08 Pavel Safronov | 468 | |
c954a775 2026-09-28 Pavel Safronov | 469 | Both caps' windows are framed by **mullions** in a lattice of identical equilateral |
| 470 | triangles, 8.3 km on a side, six meeting at the axis. That is the pitch of the checker the |
| 471 | caps once had, so the frame is still the only object in the world with a known size and |
| 472 | the only rule anyone has for judging distance, read against sky. |
769726ea 2026-09-08 Pavel Safronov | 473 | |
9f91e995 2026-09-29 Pavel Safronov | 474 | **The far end of the world is cold.** The far cap's glass is single, and glass does not let |
| 475 | heat out as light: it soaks it up and radiates it to space from its outer face, 1–2 TW over |
| 476 | the whole cap. So the window is a cold wall, with a cold wind running down it onto the |
| 477 | Deepward Sea, and Tower keeps that end dim and lets it freeze: open water at freezing, then |
e18dad04 2026-09-30 Pavel Safronov | 478 | pack ice, then fast ice, dusk by day and dark by night — and against the window **ice |
| 479 | mountains**, the Cap Range, 2 to 3 km high: rock Tower raised at the cap's foot for the ice |
| 480 | to stand on, since ice alone spreads out before it gets higher than a few hundred metres. The |
9f91e995 2026-09-29 Pavel Safronov | 481 | glass frosts too, and Tower clears it one pane per turn of the world, in an order reshuffled |
| 482 | every 35.1-hour loop, so close to the window is white with a scatter of clear, starry |
e18dad04 2026-09-30 Pavel Safronov | 483 | triangles — from inside and from outside. Tower can do this because it controls how much heat |
9f91e995 2026-09-29 Pavel Safronov | 484 | the hull loses where, up to about 5 TW (design.md §1.9.4, §1.9.6; D-090). The sun cap is |
| 485 | double-glazed and does none of this: the Sunward Sea is a temperate one. |
| 486 | |
abc0aad0 2026-10-01 Pavel Safronov | 487 | **The farms keep their own days.** Nine farms round the world — on the Uplands, in clearings |
| 488 | cut out of Greatwood, and before the far end where the railway ends — share 250 km² of |
| 489 | farmland — tulips, lavender, sunflowers, rapeseed, poppies, flax, maize, potatoes, tomatoes, |
| 490 | wheat and more, most of it in bloom — is lit by Tower as each crop wants: as at noon from |
| 491 | sunrise for twelve to eighteen hours, long-day crops on into the night and short-day ones |
| 492 | dimmed early, and every one of them given some darkness, which flowering plants need. After |
| 493 | sunset the fields blaze in a dark world and go out one crop at a time (design.md §1.9.7; |
| 494 | D-095). |
| 495 | |
59c12827 2026-09-28 Pavel Safronov | 496 | **Tower has a sun, and it crosses the world once a day.** The mirrorlets that fly in the |
| 497 | beam gather into one shoal and throw the beam's light out sideways there, which makes a |
| 498 | single blazing sun at one point on the beam. It lights at the **sun cap** at sunrise, moves |
| 499 | at a steady pace down the whole length of the world, and reaches the **far cap** at sunset, |
| 500 | where it goes out: that is nightfall. Through the night the beam is banked to a thousandth, |
| 501 | and the next morning the sun lights at the sun cap again. So Tower's sun moves from one end |
| 502 | of the world to the other, every day. |
| 503 | |
de3d60d6 2026-09-29 Pavel Safronov | 504 | **Tower keeps Pisa's days.** Its clock is Pisa's — Italian time, daylight saving included — |
| 505 | and its sun comes on at Pisa's sunrise and goes out at Pisa's sunset, so the days lengthen and |
| 506 | shorten with Pisa's seasons: about 44 km/h at the equinoxes, when day 0 falls, 61 km/h at |
| 507 | midwinter and 35 km/h at midsummer. The city and the date of day 0 are the `calendar` in |
| 508 | `content/world.json`. (Until D-089 it kept Sydney's.) |
59c12827 2026-09-28 Pavel Safronov | 509 | |
| 510 | **Every place has its own noon.** Tower aims the swarm so the sun is as bright seen from |
| 511 | anywhere as seen from under it, so the ground is lit by how high the sun stands, as it is |
| 512 | under Earth's. From The Capital, halfway along, the morning sun is low in the sunward sky, |
| 513 | it passes overhead at midday, and it sinks away deepward in the afternoon; it never sets, |
42b4554e 2026-09-29 Pavel Safronov | 514 | since 50 km up and 540 km away it is still 5° high. The **beam** glows from cap to cap at |
| 515 | every hour, a little dimmer past the sun, which takes part of it and lets the rest run on to |
| 516 | the far cap's mirror (D-079). Inside and out it is the same sun: the exterior looks in through |
| 517 | the windows at the one the interior stands under. |
| 518 | |
| 519 | **By night Tower has a moon.** A second, smaller gathering of the swarm lights at the far cap |
| 520 | as the sun goes out there, and crosses the world the other way through the night, reaching the |
| 521 | sun cap by sunrise. It is as lit as Earth's Moon is that night — full, gibbous, a crescent lit |
| 522 | toward the far cap while it waxes and toward the sun cap while it wanes, or nothing at new moon |
| 523 | — and it lights the ground by it: a full-moon night is twice as bright as a moonless one, with |
| 524 | a path of light across the water toward it. The Time section says where it is and how lit, and |
| 525 | the map draws a pale line where it is overhead. |
59c12827 2026-09-28 Pavel Safronov | 526 | |
de3d60d6 2026-09-29 Pavel Safronov | 527 | **The clock opens at the time in Pisa now, and runs.** It starts from Pisa's current |
1d447a1a 2026-09-28 Pavel Safronov | 528 | date and time and goes forward at whatever speed it was last run at — 900x until you choose |
de3d60d6 2026-09-29 Pavel Safronov | 529 | another, and 1x keeps it in step with Pisa. Add **`?clock=<hours>`** to the address to |
1d447a1a 2026-09-28 Pavel Safronov | 530 | hold it at a moment instead, stopped: `?clock=12` is noon on day 0. That is how the |
| 531 | screenshot tour gets the same sky every run. |
| 532 | |
de3d60d6 2026-09-29 Pavel Safronov | 533 | **Time**, in the panel, works in every view: the **Day** (with its date in Pisa), the |
59c12827 2026-09-28 Pavel Safronov | 534 | **Time** of day, **Run the clock** and its rate, and the **Light** — how bright Tower runs |
| 535 | its day. It says when the sun rises and sets and where it is now, and the map marks it. |
| 536 | **Dark** shuts the 54 TW beam down entirely and is the only setting that is genuinely black — |
| 537 | no sun, no airlight, no rod, and nothing left in the world but the sky. Twilight, Temperate |
| 538 | and Full set how bright the day is; night comes by itself, with the clock. |
769726ea 2026-09-08 Pavel Safronov | 539 | |
3e898b51 2026-09-28 Pavel Safronov | 540 | **Eye height** is a gauge up the right-hand side of the view, from 1.7 m to the beam, 48.4 km up, on a |
| 541 | log scale: drag it, or click it and use the arrow keys. It is marked with things of known |
| 542 | height — an adult, a two-storey house, the Eiffel Tower, Everest, an airliner cruising, a |
| 543 | weather balloon, and at the top the beam itself — which light up as you pass them, and the readout by the thumb gives the |
| 544 | height, the local gravity, and what it compares with ("≈ the Eiffel Tower", "2.0× the |
7a5edd5f 2026-10-02 Pavel Safronov | 545 | Burj Khalifa"). On a phone that readout fades once the height has been still for two |
| 546 | seconds, and comes back as soon as it changes or you touch the gauge. The **Where you stand** readout in the bottom-left corner folds down to its |
3e898b51 2026-09-28 Pavel Safronov | 547 | title with a click, and stays as you left it; on a phone it starts folded. |
| 548 | |
| 549 | Nothing *inside* rotates, because you, the ground and the air all turn together. The |
| 550 | exception is the window: the sky out there does not co-rotate, and wheels once every 7 min 29 s about the one motionless star on the |
| 551 | axis. It is the one sign of the spin anywhere in the view, and |
769726ea 2026-09-08 Pavel Safronov | 552 | it is only available at night, at the deepward end, looking the one direction that |
| 553 | has ever had anything in it but Tower. |
28f9a6bc 2026-09-07 Pavel Safronov | 554 | |
9d5a061c 2026-09-27 Pavel Safronov | 555 | ## What the world file says |
| 556 | |
| 557 | Each feature in `content/world.json` has a kind, a shape — a point, an open line (a |
| 558 | river runs source first), an outline, or a band ringing the world — and its kind's |
| 559 | parameters beside it. Changing any of them is a conversation and an edit to the file; |
| 560 | the ground regenerates on the next load. This is what the parameters mean. |
| 561 | |
| 562 | A **mountain range** has named **summits**, each held at exactly its elevation, and |
| 563 | parameters for how high its unnamed summits stand and how many there are, how rugged it |
| 564 | is, how deeply water cuts it, and its snowline. A change regenerates the range — a few |
| 565 | seconds for the Girdle, under the status dialog. |
| 566 | |
| 567 | A **lake or sea** has a **wind**: the direction it blows toward and its speed. That is |
| 568 | its usual wind, which blows whenever the weather plan has nothing scheduled. The detail |
| 569 | card says what sea is running there *now*, by the clock — a 10 m/s wind over The Deep |
a088e5d5 2026-09-17 Pavel Safronov | 570 | makes waves under a metre; the same wind round a ring sea, which never runs out of water |
| 571 | to blow over, makes 2 m, and 20 m/s makes 8.6. A sea also has a number of ships. |
| 572 | |
9d5a061c 2026-09-27 Pavel Safronov | 573 | **Weather** is Tower's plan: events over a lake or sea, each published at a moment and |
| 574 | revisable later with a reason — the storm eased because someone foolish went sailing — |
| 575 | and a number of days the plan takes to repeat. The panel's **Weather** section shows what |
| 576 | is blowing now and the next fortnight, as far as it has been published, with any revision |
| 577 | listed under the event it changed and the original struck through. None of it |
| 578 | regenerates the ground. |
| 579 | |
| 580 | A **settlement** has a size — hamlet, village, town, city or station — and how far it |
| 581 | reaches. It is a point with an extent, not a traced outline: Tower lays the streets out |
| 582 | inside it. The Capital is 20 km across, centred on the axial midpoint of the world, which |
| 583 | is just wide enough to put its spinward edge on The Deep's shore. |
| 584 | |
| 585 | A **forest** has what Tower planted there: stems per hectare, how much of it is conifer, |
| 586 | how much of the ground is left open as meadows, the treeline, and whether it is a wood of |
| 587 | giants. The detail card says what that comes to — how many trees, over how much ground, |
00ceeedb 2026-09-27 Pavel Safronov | 588 | how far apart, and how high the canopy stands. |
| 589 | |
9d5a061c 2026-09-27 Pavel Safronov | 590 | A **desert** has its landforms: how high its dunes stand, how far apart, and which way |
| 591 | Tower blows the sand; how much of it is rocky hills; how tall its plateaus are, how much |
| 592 | of the ground they cover, and how many cliff bands they are cut into; and how much past |
| 593 | water Tower quotes there — dry washes, how many salt pans, and whether they are ringed by |
| 594 | the shorelines of lakes that never stood. The detail card says what was actually made: |
| 595 | "24% standing rock, 37% dune field, 35% cut by washes, 4 salt pans." |
51c39d8b 2026-09-17 Pavel Safronov | 596 | |
99a2821b 2026-09-29 Pavel Safronov | 597 | A **railway** is a line with a line speed. Its track keeps a grade of its own over the |
| 598 | ground rather than cutting it — the highest ground within a kilometre either side, eased — |
| 599 | so it stands on piers much of the way and crosses the gorges on viaducts. There are two: |
| 600 | the **Axial Line**, from Sisters Station through The Narrows and past the Capital to the |
| 601 | Deepward Sea, and the **Uplands Ring**, round the world at 140 km, whose trains weigh 31% |
| 602 | more running spinward and 27% less running antispinward. |
| 603 | |
9d5a061c 2026-09-27 Pavel Safronov | 604 | A **region** is a label, and it can also be ground Tower raised: give it an uplift and |
14d35b7d 2026-09-16 Pavel Safronov | 605 | everything inside it is lifted to that height above the open ground, wherever that is |
| 606 | higher than what is there. The Uplands are one. |
| 607 | |
9d5a061c 2026-09-27 Pavel Safronov | 608 | Every feature also has a **blurb**, shown to readers; **notes**, which are the author's |
| 609 | and never reach the app — though the repository is public, so they are not secret; **`public`**, false for a feature not ready to exist in the app |
| 610 | at all; and a **seed**, written once, so it generates the same forever. |
cf4f8772 2026-09-07 Pavel Safronov | 611 | |
cf37225c 2026-09-07 Pavel Safronov | 612 | Canon is **0 star slats** — the hull is sealed, the inner surface is one unbroken |
| 613 | 169,646 km², and the only views out are at the end caps. The runtime control for |
376f2ce6 2026-09-16 Pavel Safronov | 614 | this is disabled and hidden (decisions.md D-033): the world is generated as one |
| 615 | unbroken surface, so any other count draws bands over land that has none. |