Tower — Design
Tower is the setting of a novel. This app exists to serve that: first as an instrument for the author to see the place and keep it consistent, and second as a companion piece readers can explore. Where a choice trades spectacle against coherence, coherence wins — canon here is series-bible material, and the book is downstream of it.
Tower is a smart cylinder in orbit around Earth, spun for 1 g, with an inner surface the size of Wisconsin, lit by sunlight piped down its axis and scattered by a swarm of mirrors it flies itself. It is also a person.
The app has three linked views:
- Exterior — a 3D render of Tower from outside, with its collector, beam and orbit. You pick a point on the hull.
- Map — a 2D unrolled map of the inner surface. You pick a point here too; the two pickers stay in sync.
- Interior — a first-person "streetview" from the picked point, with live controls for time of day and spin phase.
1. Canon
1.1 Dimensions
All numbers derive from two free parameters — radius and length — chosen so the inner surface matches Wisconsin.
| Quantity | Value | Notes |
|---|---|---|
| Radius | 50 km | floor to axis |
| Length | 540 km | sun cap to far cap |
| Wall depth | 1 km | floor to outer skin, D-044 |
| Circumference | 314.16 km | the world's "width" |
| Inner surface area | 169,646 km² | Wisconsin total area, 169,635 km² |
| Habitable land area | 169,646 km² | all of it — the hull is sealed (§1.4) |
Every square metre of the inner surface is land. There are no windows in the wall, so nothing is subtracted. An earlier version sized star slats to leave exactly Wisconsin's land area of 140,268 km²; D-017 removes them and that second coincidence with it.
1.2 Spin and gravity
| Quantity | Value |
|---|---|
| Angular velocity ω | 0.014005 rad/s |
| Spin period | 448.6 s = 7 min 29 s |
| Rotation rate | 0.134 rpm |
| Rim speed | 700.2 m/s |
| Floor gravity | 1.000 g by construction |
Consequences that the app should show or at least respect:
- Gravity falls off linearly with height. g(h) = ω²(R−h). A 1 km peak sits at 0.98 g; the axis is weightless. Mirrors at the axis float.
- Coriolis is mild but real. 2ω = 0.0280 s⁻¹. Walking is unaffected (0.4 % g). A ball thrown at 30 m/s deflects at 8.6 % g — enough that Tower's sports differ from Earth's, and enough that thrown objects visibly curve.
- Nothing in the sky moves, except through the far cap. The wall is sealed (§1.4), so along 539 of the 540 km there is nothing to wheel past — the far side of the world overhead co-rotates with you and hangs perfectly still. The one exception is the far cap window, where the sky is outside and does not co-rotate: it turns once every 7 min 29 s about a single motionless star on the axis. The spin is invisible upward and obvious deepward, and only at night.
- But everything that falls leans. Rain hangs at a permanent 1.47° slant, smoke drifts the other way, and a 1 km waterfall lands 133 m off its own cliff (§1.9.2). This inversion is the alien fact the interior view must sell: the sky is still and the water is not.
1.3 The sun system
Sunlight enters through the sun-facing end cap and runs the full 540 km axis.
- Collector. A mirror array flies ahead of Tower, gathering sunlight and concentrating it into the beam. 46,900 km² of aperture — a disc ~244 km across, two and a half times Tower's own diameter. It is the dominant visual element of the exterior view.
- Beam. 10 km in circumference — 1,592 m radius, 7.96 km² cross-section — carrying 54.3 TW at a concentration of 5,000×, or 6.8 MW/m². It runs the axis from sun cap to far cap.
- Diffusers. Not lamps — a swarm. See §1.3.1.
- The beam is visible, and it glows by itself. There is real air at the axis (§1.5), and a 6.8 MW/m² beam Rayleigh-scattering through 3.18 km of it radiates 779 W/m²/sr — 26× brighter than clear blue sky, 25,700× dimmer than the sun's disc. It is a brilliantly sunlit cloud extruded into a rod, safe to look at directly. From the floor 50 km below it is 3.65° wide, about seven sun-widths, running the whole length of the sky. This glow is a property of the beam and the air, not of the diffusers — it would be there if the beam were empty.
1.3.0 Tower never sees the sun
The collector is 244 km across and flies 320 km ahead of the sun cap, which puts it 41.8° wide in Tower's sky against the sun's 0.53° — 79 times the sun's diameter. It sits squarely between Tower and the sun, so it occults it completely, and the umbra it casts is 120 km across where Tower's 51 km sits inside it. The eclipse is total, permanent, and self-inflicted.
So nobody aboard can see the sun, for the same reason nobody can see Earth (§1.4). What they can see, through the sun cap window, is the back of the collector: 46,938 km² of structure radiating its own waste heat at about 245 K — infrared, and therefore black. It is the only object in Tower's sky that is neither Tower nor a star, and it never moves, because the collector flies in formation rather than spinning. D-050.
Its edge is not black. The face is a mirror pointed away, but the collector is backlit, and the structure holding 46,938 km² flat stands proud of the mirror plane at the rim, where the sun strikes it side-on. With the scatter any real mirror throws at grazing incidence, the edge reads as a thin sun-coloured ring — so the collector is a hole in the stars with a lit rim rather than an absence, which is how anything backlit looks. It is not sunlight leaking past the edge: Tower is wholly inside the umbra, so the sun's disc is hidden from every point in the world. The ring is lit structure. D-054.
And Tower keeps its clock on it. Two lit lines from the collector's hub: one running the full radius, fixed normal to the plane of the solar system, and one stopping short of the rim at an angle θ from it, where θ runs 0 to 2π over a day. The collector is the only surface in the sky worth writing on — it does not spin, and it is always dead ahead through the sun cap window.
The time is the angle between the two lines, and it has to be. From inside, the whole collector face appears to wheel once every 7 min 29 s along with the stars, because the observer co-rotates and it does not. A single hand against a fixed dial would be unreadable, since the dial is not fixed; the angle between two marks is invariant under that rotation. It is a clock built for people who cannot stop the dial turning. D-055.
1.3.1 The diffuser swarm
The diffusers must be individually invisible, or the sky becomes a row of separate suns. Two thresholds govern this, and only the second one binds:
- Resolvability. At 50 km, one arcminute is 14.5 m. Anything larger is a resolved disc with a visible edge.
- Visibility. Being unresolved is not enough — stars are unresolved and we see them. A mirror preserves radiance, so a mirrorlet aimed at an observer shows the sun's own surface brightness over a tiny angle. A 1 m mirrorlet reads at magnitude −13.6, brighter than the full moon. Blending into daylight requires ~1.2 cm, at magnitude −4.0, just under Venus.
Diverting 54.3 TW needs 11.3 km² of mirror, so:
| Mirrorlet size | 1.2 cm, ~1.4 cm², 2 mg |
| Count | 78 billion |
| Total mass | 158 tonnes — the entire sun system |
| Mean spacing in beam | 3.8 m — sparse enough to fly through |
| Optical depth over 540 km | 1.41, so 24 % of light reaches the far cap |
The swarm cannot be passive — it must fly, always. The axis is not weightless. At the beam's edge gravity is 0.312 m/s², enough that a foil sinks outward at 0.26 m/s and leaves the beam in 1.7 hours. A drifting swarm dissolves the same afternoon. Every foil is therefore under continuous individual control. This is not a flourish on a working system; it is the only configuration that works.
They have absurd power to do it with. Each foil intercepts 979 W of beam. Harvesting 0.1 % gives it ~1 W on a 2 mg body — 489,600 W/kg, some fifty times a jet engine's specific power.
| Down-beam, riding radiation pressure | 0.85 m/s, 7.4 days |
| Back up-beam under its own power at 1.5 m/s | 15 µW, 4.2 days |
| Harvestable from ambient world-light | 14,400 µW — a 1000× margin |
So there is no recirculation machinery, at either cap. The foils fly home on scavenged daylight. Nothing needs to be built for them, and the 1000× power margin means Tower can afford to move them wastefully — in spirals, shoals and patterns that cost energy for no reason but preference.
Lighting is a render target, not a schedule. 78 billion independently aimed mirrors put any intensity on any patch of ground at any time. Dawn, dusk, moving cloud shadows and seasons are compositing problems, not optical ones.
Aiming resolution is human-sized. A 1.2 cm mirror is diffraction-limited to 4.6×10⁻⁵ rad, so its reflection lands as a 2.3 m spot on the floor 50 km below. Tower can put a glint on one person that someone five metres away cannot see. The privacy is set by the wavelength of light, not by any protocol.
Mirrorfall. A failed foil sinks out of the beam and falls. Terminal velocity at the floor is 0.48 m/s; the descent takes about two days and it lands like a snowflake. There is a permanent slow glitter coming down out of Tower's sky.
Illumination is a dial, not a constant
54.3 TW is Tower's capability, not its setting. Spread over the inner surface it is 320 W/m² mean, which — with roughly half the surface lit at a time and a sinusoidal day profile — puts local noon at ~1,000 W/m², Earth clear-sky daylight. But the diffusers are software-controlled, so brightness is genuinely adjustable in-world across the full range:
| Setting | Mean W/m² | Feels like |
|---|---|---|
| Twilight | 30 | permanent overcast dusk |
| Temperate | 200 | Earth's global mean |
| Full | 320 | Earth clear-sky noon |
This should be a control in the app, not a fixed number. It is the most characterful thing about a world whose sun is a machine.
Headroom
5,000× is 11 % of the étendue limit (46,223× at 1 AU). Tower could in principle
push the beam 9.2× further and cook itself; the diffuser network is as much a safety
system as a lighting system. 5,000× was chosen because it is demonstrated
technology — the Odeillo solar furnace reaches ~10 MW/m² on Earth today. Nothing in
Tower's sun system requires physics that does not exist. See decisions.md D-003.
1.3.2 Night, and the difference between banked and off
Night cannot be made by aiming the swarm away. The glow above belongs to the beam and the air, not to the diffusers, so a fully lit beam lights the world whatever the mirrorlets are doing: 779 W/m²/sr over a strip 3.65° wide running horizon to horizon is about 0.2 sr, which lands ~100 W/m² on the floor — half of temperate, and no kind of night. Tower's night is therefore made by banking the beam itself, to a thousandth of full: 0.32 W/m², a rod you can still find overhead and a world you can just make out under it (D-046).
Shutting the beam down entirely is a different state and a much worse one. No airlight, no lit ground, no rod — the only thing left in the world is the sky through the far cap. §1.9.4 gives the thermal mass about a week of coasting, so this is a state Tower can survive and not one it can sit in.
| Setting | Floor | What it is |
|---|---|---|
| Dark | 0 | the beam shut down. Stars, and nothing else. |
| Night | 0.32 W/m² | the beam banked to a thousandth |
| Twilight | 30 W/m² | |
| Temperate | 200 W/m² | |
| Full | 320 W/m² | Earth clear-sky noon |
1.3.3 The far cap mirror, and where the last quarter of the beam goes
The swarm has optical depth 1.41, so 24% of the beam survives all 540 km — and it survives collimated, in the beam's own 7.96 km² cross-section. That is the whole shape of the problem: not 13 TW spread over a 7,854 km² cap, but 1.7 MW/m² in a 3.2 km spot, about 1,200 suns. An absorber there sits at 2,330 K.
So the spot is a mirror (D-048), and only the spot: it is a thousandth of the cap's area, which is what leaves the other 99.9% free to be window (§1.4). A mirror is the cheap answer rather than the expensive one — at 99.9% it absorbs 1,665 W/m², about 1.2 Earth solar constants, so the thing that would have glowed white is merely warm.
It also recovers the energy. The residual goes back up the column, which makes the optical path 1,080 km instead of 540 and utilisation 1 - e^(-2τ) = 94% rather than 76%. What survives even the return trip leaves through the beam aperture toward the collector, which sends it back again; in the limit the whole 54.3 TW lands on the inner surface. This is why full brightness is 320 W/m² and not 243 — the figure in §1.3 assumes the entire beam is eventually used, and with the cavity closed at both ends it is.
Aiming light at a region to warm it is a separate lever and stays one (§1.9.4). The mirror is about not wasting the beam; the desert is about where the weather goes.
1.3.4 The day, and why dawn has a direction
Tower's day is 24 hours, chosen for the people living under it — nothing physical offers one, since the spin is 7.5 minutes and has nothing to do with light.
Dawn cannot be a dimmer, and it cannot be the swarm either. §1.3 gives the glow to the beam and the air, so the sky, the airlight and the rod overhead all brighten together the moment beam power comes up; there is no way to have one end of the axis light before the other. But the ground is lit by the diffusers, and they can put the light wherever they like. So Tower brings the day up as a front running deepward from the sun cap, 540 km in 40 minutes — 225 m/s, near Tower's own rim speed, and slow enough to stand and watch arrive.
The result is a morning nothing on Earth has: a fully lit sky over dark ground, with a line of daylight coming toward you along the world. §1.9.4 says Tower has no latitude. The cycle gives it longitude — 40 minutes of it, sun cap to far cap.
Dusk runs the same way, so the light withdraws in the direction it arrived and the sun-cap end always has the shorter day by a hair. Nothing forces that; the alternative was a dusk that retreats, and a consistent direction of time reads as designed rather than as an oscillation.
1.4 Sealed hull, and the cap windows
The cylinder wall is opaque and unbroken. No slats, no windows, no view out along any of the 540 km. From anywhere on the inner surface, the sky is land, haze and the beam — nothing else. See D-017.
The only views out are at the end caps, and they are peculiar:
- A cap is a wall, not a floor. Gravity there points radially outward, which is tangent to the cap's surface, so nothing rests on it — you would slide to the rim. Each cap is a 50 km vertical cliff standing at the end of the world, and its windows sit at its base, at eye level for anyone standing on the floor.
- The sky through them does not sweep — it turns. A cap window looks along the spin axis, which is the celestial pole. Stars rotate about a fixed centre, one full turn every 7.5 minutes, with one motionless star at the middle. A pinwheel sky. It is the only moving sky anyone in Tower ever sees — and because the axis is horizontal from the floor, it wheels about a point on the horizon rather than overhead.
- The far cap is glazed whole — a 100 km window looking into deep anti-sun space, not a wall with windows at its foot (D-045). Its structure survives as the window's mullions, on the same polar tessellation the checker used and at the same cell pitch, so the one object in the world with a known scale still is one: the rule now reads against the sky instead of against a plate. The sun cap faces the collector rather than the sun, and is glazed too (D-050): §1.3.0 retires the "heavy glare management" this section used to demand of it, because no direct sunlight has ever reached it. Through it, a 244 km black disc, stars round the edge of it, and the beam blazing out of the aperture at its centre.
- By day the window is simply blue. §1.5 puts the far cap 100–200 km into the haze, so from anywhere but the deepward end the airlight in front of it swamps whatever is behind, and the cap reads as a disc of sky. The stars are there at noon and unseeable, which is a fact about eyes and not about the glass.
- The beam does not go through it. §1.3.3 puts the surviving quarter of the beam on a 3.2 km bullseye at the centre of the cap, and that bullseye is a mirror rather than glass: it returns the residual up the column for a second pass. The window is everything else, which is 99.9% of the disc.
- The mirror is not the pinwheel's centre, and it is worth being clear why. The sky turns about the direction parallel to the spin axis, and from anywhere on the floor that direction is horizontal — so the pinwheel's centre is at eye level, dead ahead, down where the window meets the ground, not overhead and not at the middle of the cap. The mirror is a physical object on the axis, which from 270 km sits about 10° above that. They coincide only for an observer standing on the axis itself, and nobody can. By day the mirror blazes — it is returning 1.7 MW/m² — and is the brightest thing in Tower's sky; at night it banks with the beam and goes dark.
Nobody aboard can ever see Earth. Tower holds a terminator orbit (D-004), which puts Earth roughly 90° off the axis — out the side of the cylinder, which is now solid hull. A habitat in Earth orbit whose inhabitants have never seen the planet they orbit.
The caps are therefore the only places in the world with a horizon that is not Tower. Whatever grows up around them, it will not be ordinary.
1.5 Atmosphere and the look of the sky
Air co-rotates with the shell. Because g falls linearly to zero at the axis, the atmosphere is much deeper than Earth's:
- Pressure at the axis, 50 km up: 5.2 kPa — thin, but genuinely air.
- A vertical column floor-to-axis is ~10,600 kg/m², about one Earth atmosphere.
So the interior sky behaves like this, and the shader must reproduce it:
- Straight up you look through ~1 atmosphere and see the far side of the world 100 km away — visible, but washed to pale blue like a very distant mountain range.
- Along the axis you look through many atmospheres. The far end cap is not visible as a wall; it dissolves into blue haze around 100–200 km out. The world reads as endless in the axial direction and closed in the circumferential one.
- The ground curves up on both sides into that same blue, meeting overhead.
- The beam is a self-luminous scattering shaft 3.65° wide at 779 W/m²/sr — render it as a bright sunlit cloud, not as a light source with a halo. With the hull sealed, it is the only thing in the sky that is not land.
1.6 Orbit and attitude
- Tower holds a high circular orbit with its orbital plane kept normal to the Earth–Sun line — a terminator orbit. This is why one cap can face the sun permanently and Tower is never eclipsed.
- The plane precesses 360° per year to track the sun. Tower's angular momentum is enormous, so this 1°/day reorientation is actively driven, continuously, forever. Canon treats this as Tower's defining maintenance burden.
- Consequence for the interior view: the star field slowly drifts across the year while spinning fast every 7.5 minutes. Two nested motions.
1.7 Coordinates
The canonical surface coordinate is (θ, z):
θ— angle around the cylinder, 0 to 2π. θ = 0 is the centre of land strip 0.z— distance from the sun cap, 0 to 540 km.
The 2D map is the direct unroll: x = z, y = (θ − θ₀) · R. No projection
distortion — a cylinder unrolls exactly. This is a genuine advantage over mapping a
globe and the map view should lean on it.
The map shows the surface once, bounded, so its extent is readable. That means it needs an edge, and the edge is placed at θ₀ = the centre of the last slat. Land strip 0 is centred on θ = 0, so cutting there would slice a whole strip in half across the top and bottom margins; cutting at a slat centre leaves every land strip whole and splits only a band of stars, which carries no geography. Same reasoning as putting Earth's map edge at the antimeridian. A sightline whose short route crosses the edge is drawn as two segments, so the drawn path always matches the measured distance.
1.8 Sightlines: Tower has two horizons
Along the axis the floor is perfectly flat and never falls away, so nothing is ever hidden by curvature. Tower's horizon is haze. Circumferentially the floor curves up, so distant land rises into the sky rather than sinking below a line. The two directions behave completely differently, and this is one of the most alien facts about living there.
Rayleigh transmission from a floor-level observer:
| Distance | Along the axis | Across the interior (overhead) |
|---|---|---|
| 26 km | 78 % | 77 % |
| 50 km | 56 % | 70 % |
| 100 km | 31 % | 78 % |
| 270 km (far cap from midpoint) | 4 % — a ghost | — |
Two consequences:
- The axial horizon closes at 100–150 km. From the midpoint you cannot see either end cap. Everyone can see 100 km, knows there is more beyond, and cannot resolve it — a different psychology of distance than Earth's 5 km cliff-edge.
- The far side of the world is clearer than the ground at the same distance, because a sightline across the interior rises through thin axis air while one along the floor grinds through full density. It gets better with distance: the land directly overhead, 100 km away, is the crispest far object in Tower at 78 %. Distant geography is best seen by looking up. People would orient by what is overhead; the ground is the vague part. This inverts the human default.
1.9 Water
Tower's hydrology is stranger than its geometry, and most of it follows from one fact and one absence.
1.9.1 Coriolis never pushes surface water sideways
The floor's tangent plane is spanned by θ̂ and ẑ, and the spin axis is ẑ. For any flow along the surface:
- along the axis —
ẑ × ẑ = 0, no Coriolis force at all; - around the circumference —
ẑ × θ̂ = −ŝ, the force is purely radial.
The Coriolis term never has a component inside the surface. So Tower's rivers do not curve. No hemispheres, no Baer's law, no preferred bank erosion, no gyres, no cyclones. Every large-scale rotational habit of Earth's water and weather is absent, and a meander in Tower is pure flow dynamics with no thumb on the scale.
1.9.2 What it does instead: everything vertical leans
The force goes into the floor rather than across it, so it appears whenever water moves up or down. Deflection of a free fall goes as h^1.5:
| Fall | Lands (retrograde) | Lean of the path | Lean at impact |
|---|---|---|---|
| 100 m | 4.2 m | 2.4° | 3.6° |
| 500 m | 47 m | 5.4° | 8.1° |
| 1,000 m | 133 m | 7.6° | 11.3° |
| 2,000 m | 377 m | 10.7° | 15.8° |
Two different angles, and the interior view needs both. The path leans by where
the water lands against how far it fell — the tilt of a waterfall's plume seen
whole. The impact lean is the direction the water is actually moving when it
arrives, which is what a streak of it is drawn at, and it is half again the other in
tangent. src/canon/motion.ts computes both.
Rain falls permanently slanted — a raindrop at terminal velocity sits at a fixed 1.47° against the spin, ~51 m of drift over a 2 km fall, never varying, never reversing. It is fixed because drag holds the fall speed constant, so unlike free fall the angle does not grow with the drop: rain leans the same 1.5° whatever the cloud. Set against a waterfall's 11°, the waterfall is the compass and the rain is not, which is the opposite of what §2.4 originally assumed (D-034). Rising things lean the opposite way: smoke drifts spinward, rain drifts anti-spinward. Every plume and every shower in Tower tilts, and they tilt against each other.
The same applies to anything that descends, not just water — see §1.11 on what it does to skiing.
Horizontal flow changes weight rather than direction (Eötvös): +0.57 % for a 2 m/s prograde river, negligible hydrologically. It only matters at speed — an express train at 100 m/s gains 29 %, and anything moving retrograde at the 700 m/s rim speed is stationary in space and therefore weightless.
1.9.3 A perfect cylinder has no slope anywhere
Potential depends only on radius, so the whole floor is a single equipotential surface. Water on it has no preferred direction: a perfect Tower has no rivers at all, forever.
Every river in Tower exists because the floor was shaped. There are no tectonics and no uplift, so erosion is strictly one-way — a 3 km range wears flat in ~30 Myr under a wet engineered climate, ~150 Myr under a dry one. Tower's rivers are steadily destroying its landscape and the highlands must be rebuilt to keep them running. This is D-004's theme again: Tower's rivers are plumbing it chose to install and has to keep re-installing.
Two corollaries:
- No river can circumnavigate. A closed loop has no net descent.
- Lakes curve upward. Level means constant radius, so across a 30 km lake the far shore rides 2.3 km above your tangent plane — Earth would hide it 18 m below the horizon. You look up at the opposite beach, and water appears to climb away from you.
1.9.4 There is no passive climate at all
Tower has no latitude — every point is equidistant from the light — and with the hull sealed it has no windows either. Nothing breaks the thermal uniformity. A uniform hull radiates at 274 K everywhere, so left alone the world settles into a flat calm: no gradient, no wind, no evaporation, no rain, no rivers.
So every weather system in Tower is deliberate. Tower makes climate the only way left to it — by aiming light. It warms where it wants convection and shades where it wants condensation; the hull's uniform loss is the sink. Every cloud, every rainfall, every jet stream is something Tower is doing, continuously, on purpose.
This is D-009 arriving at its conclusion. The mirrorlet swarm was already Tower's body language; now it is also its lungs and its weather. There is no autonomic layer underneath. If Tower's attention ever lapses, the rain stops.
Costs, for scale against a 54.3 TW budget:
| Earth-like rainfall, 1,000 mm/yr | 12.2 TW | 22.4 % — Earth spends the same fraction |
| Recirculating all runoff (1,792 m³/s) against 500 m | 8.8 GW | 0.016 % |
1.9.5 Rivers are a closed, pumped circulation
With no natural cycle and no natural slope, a Tower river is a loop: a headwater reservoir, a shaped descent through the landscape, a lake at the bottom, and a lift back to the top. Source and sink are the same system.
Two ways to close the loop, and they give completely different rivers:
- The pump outfall. A river begins at a machine. Walk to the source of any river and find a wall of water coming out of a structure — not a spring, an outlet. Costs a rounding error (above).
- The made cloud. Tower evaporates the lake with aimed light and condenses it over the highlands, so rain falls exactly where the river should start. No machinery: the swarm is the pump. Costs the 22.4 % above, and buys real weather with it.
Canon uses both — made weather for the world's general hydrology, pumps for watercourses Tower wants under precise control.
Two consequences of the sealed hull:
- A river can circle the world. The surface is one unbroken sheet, so a channel can run the full 314 km circumference and close on itself — a lazy river returning to its own source. Gravity cannot drive a closed loop, so it is pumped.
- The water inventory is conserved and exactly known. Nothing evaporates to space. Tower knows how much water it has, to the litre, forever.
Lifting is also slightly cheaper than on Earth, since gravity falls off with height: 1 % cheaper at 1 km, 5 % at 5 km, 25 % at 25 km.
1.10 Slat orientation — RESOLVED: none
Axial strips versus rings was weighed at length (D-016) and answered by removing slats entirely (D-017). The comparison is kept in D-016 because it established what the choice cost, and because the reasoning — that slat layout sets the shape of Tower's countries, its climate map and its astronomy all at once — is what made "none" a real option rather than an absence.
1.11 The world as built
Authored geography lives in content/geography.json — the source of truth — and
npm run terrain renders it. Names are provisional. Tower is laid out in belts
along the axis, which is the natural grain of an engineered climate (§1.9.4):
| z | ||
|---|---|---|
| 0–42 km | The Sunward Sea | ring ocean at the foot of the sun cap |
| 55–140 km | the range | Westwall, The Sisters, Snowcrown (4,300 m), Eastwall — the named high points of The Girdle, which rings the world at z 90 km (D-051) |
| 148–218 km | The Dry Reach | desert ringing the world, 22,000 km², 13% of the surface |
| 176/190/203 km | three ridges | ringing, concentric — and The Narrows is the only breach in all three |
| 214–430 km | Greatwood | forest belt |
| 248–402 km | The Deep | 154 × 32 km sea, long down the axis and narrow around |
| 270 km | The Capital / The Spindle | axial midpoint, on The Deep's antispinward shore |
| 496–540 km | The Deepward Sea | ring ocean at the foot of the far cap |
Why the desert rings
On a cylinder you cannot go around a band. Every desert on Earth can be circumnavigated; a ringed one cannot. It is an absolute barrier across the world's waist, and with the three ridges ringing too it becomes three concentric walls.
The drainage, and why it keeps the chokepoint
Four rivers come off the range — Westwall Water, Sisters Water, Eastwall Water and The Long Water. On Earth most drainages do not cut through a rising ridge; they are defeated and diverted, and only an antecedent river with enough power keeps its course. So three of the four are turned by First Ridge, run along its front gathering each other, and leave with the fourth through the single gap.
- The Narrows carries the entire world's runoff — ~392 m³/s off a 9,800 km² range, lifted 1,780 m for 6.9 GW (0.013% of budget).
- The ridge-front reaches are the only circumferential water in Tower, and weigh fractionally more or less for it (§1.9.2). Everything else runs axially, where Coriolis is exactly zero.
- Whoever holds The Narrows holds the axis of the world. The Capital sits behind it.
The Deep is oriented for the view
Long down the axis and narrow around it, so you cross it the short way — around θ, where the floor curves up. From the Capital the far shore is 32 km away and stands 2.6 km above eye level. Crossing it lengthwise instead would be dead flat. The orientation is the whole point.
It is also the world's flywheel: 19× the diurnal heat storage of bare ground, and 5.9 days at full power to move its temperature one kelvin. Tower still supplies every joule (§1.9.4), but the world now coasts for about a week rather than stopping the moment attention lapses.
The cap seas are not designed
Gravity on an end cap points radially outward — tangent to the cap. Nothing rests there; water runs down to the rim and pools. Both ring oceans exist whether anyone planned them or not, each with a 314 km shoreline and a 50 km cliff standing behind it. The only windows in the world are at their feet (§1.4).
Skiing, because it is a different sport here
Level motion feels no Coriolis (§1.9.1) but a descending skier has radial velocity, and that does deflect:
- Down the axis: a steady sideways push, always antispinward — 1.5% of g at 15 m/s on a 20° slope, 6.4% at 35 m/s on 40°.
- Around the cylinder: you get heavier or lighter. 8.6% at 30 m/s, 11.4% at 40.
So a retrograde run gets lighter the faster you go, which is self-reinforcing, while a prograde run grips harder as it accelerates. Every slope in Tower has a handedness. No Earth mountain does. Settlements sit at the tarns — Sisters Station, Hollow Station — around 2,100 m, with the runs above them.
Open questions
- The Spindle's height. 3.2 km is a placeholder; an object dropped from its top lands ~760 m antispinward of its base.
- z 430–496 km is unauthored. The circumference outside the named peaks is no longer empty — The Girdle carries the range round the whole 314 km — but it is unwalked: peaks with no names, and no rivers drawn off them yet.
2. Application architecture
2.1 Stack
- Vite + TypeScript (strict), no framework — the app is three canvases and a control panel, and a framework would not earn its weight.
- One layout breakpoint, at 720 px: above it the panel is a column beside the world, below it a drawer over it (D-043). The world is a full-bleed canvas in both, because all three views are drag-to-look and a scrolling page would be fighting them for every touch.
- Three.js for the exterior and interior 3D views.
- Canvas 2D for the map view.
- GitLab CI → GitLab Pages, publishing
dist/asstatic/.
2.2 Module layout
src/
canon/
constants.ts single source of truth for every number in §1
geometry.ts (θ,z) <-> 3D, slat layout, map <-> surface
atmosphere.ts the rotational density profile and its extinction (§1.5)
motion.ts how things fall in the rotating frame (§1.9.2) — the only
evidence of the spin anywhere but the far cap window
views/
palette.ts one colour per place kind, shared by map, list and editor
raster.ts what npm run terrain wrote: grid, and what white means
world/
schema.ts world.json types + validation
store.ts places CRUD, localStorage drafts, JSON import/export
instruments.ts sightline, viewshed, lighting probe, travel (§3.3)
state/
store.ts selected point, time-of-day, spin phase, view mode, writer flag
views/
exterior.ts Three.js: hull, caps, collector, beam, spin, point picker
map.ts Canvas 2D: unrolled surface, slats, terminator, point picker
interior.ts Three.js: shell geometry, the haze shader of §1.5, beam, rain
ui/
app.ts the whole panel: tools, editor, readouts, view switching
scales.ts slider mappings — kept out of views/ so the panel can label
the eye-height slider without pulling in Three.js
main.ts
tools/ node-only, never bundled; plain .mjs with no build step
terrain.mjs renders content/geography.json into static/ (§1.11)
png.mjs minimal PNG encoder — zlib is its only dependency
noise.mjs fbm and ridged noise for the terrain relief
screenshots.mjs drives the running application in a headless browser and
photographs it into docs/screenshots/ (D-042)
canon/constants.ts is the spine. Every derived figure — period, rim speed, land
area, slat width — is computed from radius, length, slat count and target land
area, never hard-coded. Changing the radius changes the whole app coherently.
2.3 State
One small observable store. Views subscribe; nothing owns anything else.
type TowerState = {
point: { theta: number; z: number } | null // the picked location
tod: number // 0..1, position in the diffuser day cycle
brightness: number // W/m^2 mean, 30..320 -- the diffuser output setting
spinPhase: number // 0..2pi, rotation for star motion
spinning: boolean
view: 'exterior' | 'map' | 'interior'
writer: boolean // ?writer=1 -- a UI mode, not a security boundary
probe: { from: SurfacePoint; to: SurfacePoint } | null
}
The exterior and map pickers both write point; the interior view reads it. That
is the entire interaction loop.
2.4 The exterior view
Scene units are kilometres, so the code reads in canon numbers. Tower's axis lies
along world Z with the sun cap at z = 0, which puts a canon surface point at
(R cos θ, R sin θ, z) in the hull's own frame. The hull spins about Z and carries
that frame with it, so picking resolves the ray hit back through
worldToLocal — otherwise every point picked off a turning hull would be wrong by
the spin phase.
Two deliberate departures from physics, both reading aids of the same kind as the map's hillshade:
- Fill lighting. Real sunlight here runs parallel to the axis, so Tower's flank is edge-on to it and renders very nearly black — accurate and useless. Two fill lights lift the hull enough to read its shape.
- A visible beam. In vacuum there is nothing between collector and cap to scatter light, so the converging beam would not be visible at all. It is drawn as rays because it is the thing the view is about.
Everything in the scene is captioned — collector, beam, both caps — with screen-space labels. A pale disc and a cone of light are not self-explanatory, and the collector is the least intuitive object in Tower: it is larger than the world it feeds.
The default camera frames the whole system rather than Tower alone: the collector is 244 km across and flies 320 km ahead, and it is the larger object.
The hull has two readings, and the view switches between them (D-047). True is the outer skin: bare structure, the checkered sun cap, and the glazed far cap. X-ray wraps the terrain raster onto the outside instead — from outside Tower is structure, so what that texture shows is what is inside, which makes it a diagram and not a view. Both are worth having and they are not the same claim, so the control is a two-way switch rather than a checkbox.
The wall is drawn as two meshes rather than one double-sided one, because its two faces show different things: the outer skin changes with the mode, and the inner surface is always the land. Since the far cap became a window (D-045) that inner surface is genuinely visible from outside — look in through the glass in true mode and the world is really there, lit and 540 km deep. It is the only line of sight into Tower that is not a projection. Three's cylinder runs u around and v along, while the raster is the other way round, so the UVs are rewritten from the original attribute rather than derived from vertex positions — the seam vertices are duplicated, and deriving an angle from them smears one column of triangles across the whole image.
The camera position persists across reloads, alongside the active view, so returning to the page returns to the vantage you left. Both end caps are places in their own right, so the view can frame them: a cap's marker sits on the axis, because a cap is a disc across the end and a point on its rim would ride round the edge as Tower turns.
Markers are scaled per frame to hold a roughly constant size on screen. A 4 km dot is legible from 200 km and sub-pixel from the 1,200 km of the default view, which is to say the places would simply not be there.
2.4 The interior view — built
Scope held: real geometry, simple ground.
Real: the shell is the actual cylinder, curving up on both sides and closing
overhead, displaced by terrain-height.png and painted with terrain-color.png.
Stars only through the far cap — the wall is sealed (§1.4), so for 539 of the
540 km the sky is land and light. The far cap is glazed (D-045) and the sky beyond
it is sampled by view direction in an azimuthal-equidistant projection about the
spin axis, which makes the pinwheel fall out of the projection rather than being
animated into it: azimuth plus spin phase, one turn every 7 min 29 s, and the
point on the axis genuinely motionless.
Simple: the ground is the raster plus a little procedural grain in the near field, not modelled scenery. No buildings, no vegetation meshes. Cells are 0.7 km and texels 264 m, so relief a valley away is real and the ground underfoot is not. Detailed procedural scenery stays deferred.
Haze is the shader, and it is integrated rather than faked. Every fragment samples the rotational density profile 24 times along the ray to the camera and extinguishes per channel — red survives twice as far as green, blue half as far, which is what makes distance blue rather than grey. From the floor it reproduces §1.8 from the inside: 78% straight up against 31% for the same 100 km along the ground, printed in the readout so the claim can be checked rather than believed. The airlight the haze adds is neutral; tinting it blue double-counts the wavelength dependence and turns even the desert mauve (D-034).
Nothing inside the scene rotates, because the observer, the ground and the air
all co-rotate. What falls carries the spin, and §1.9.2 is lopsided about how: rain
leans a fixed 1.5° whatever the cloud, because drag pins its speed, while only free
fall keeps accelerating and so keeps leaning. The waterfall is the compass; the
rain is barely a hint. Rain is no longer drawn (D-049) — 1.5° is not a picture,
and the pinwheel below does the job it was standing in for. The physics stays in
canon/motion.ts and stays tested; it was only ever the rendering that could not
carry it.
The one thing that does turn is outside. The sky through the caps does not co-rotate, so it wheels once every 7 min 29 s about the motionless star on the axis (D-045). It is by a wide margin the plainest evidence of the spin in the view, and it is the only evidence left now that the rain is gone. Both caps are windows (D-050), so it can be had looking either way along the axis — deepward into empty space, or sunward past the black disc of the collector.
The observer stands on the terrain, which means the height raster is read back onto the CPU and sampled against the mesh's own cell corners — the GPU cannot be asked where the ground is (D-035).
Instruments in the view: eye height from 1.7 m to 25 km with the local gravity beside it, the five canon illumination settings of §1.3, the field of view as a pair of binoculars, and captions on every place still visible through the haze. Selecting a place walks the observer to it (D-038) — the haze horizon closes at 100–150 km, so turning to face something usually just points at haze.
The caps are no longer the same object. The sun cap is checkered (D-041) — polar, six rings, cells about 8 km. The far cap is glazed (D-045), and the checker survives on it as the window's mullions: the same tessellation at the same pitch, so it is still the only object in the world with a known size and still doubles as a scale for judging distance, now read against sky rather than plate. Both patterns are shared with the exterior view.
The far cap's glazing is set a kilometre into its own frame, so from inside there is a 1 km reveal around it. That is the only place the wall depth of D-044 can be seen from within the world, which is why it is the only place it is drawn.
Not modelled: water has no surface. Lakes and seas are painted in the raster and cut into the shell as basins, so standing in one puts you on its floor.
3. Writer mode and the world file
The app is an instrument for writing the novel as much as a thing to look at. It must answer questions like can the far face be seen from the midpoint?, where does a central embassy go?, can a lake overhang? — and let their answers be placed, named and kept.
3.1 Two modes over one data file
| Reader (default) | Writer (?writer=1) |
|
|---|---|---|
| World content | committed world.json, read-only |
editable, drafts in localStorage |
| Instruments (§3.3) | sightline probe only | all |
| Output | permalinks to a point or place | Export JSON for the author to commit |
| Panel | read-only detail card | full editor, canon controls, import/export |
There is no backend — GitLab Pages is static. The loop is: the author edits in the
browser, exports world.json, commits it, and the published site serves it. Simple,
versioned in git alongside the prose, and diffable.
Writer mode is a UI mode, not a security boundary. Anyone may set ?writer=1;
they can only edit their own local copy, which persists nowhere and reaches nobody.
This is fine, and arguably good — a reader who finds it gets a sandbox. It must not
be mistaken for access control.
3.2 The world file
{
"version": 1,
"places": [{
"id": "hallow-crossing", // permalink target; see below
"name": "Hallow Crossing",
"kind": "city|embassy|lake|region|landmark|note",
"geometry": { "type": "point", "theta": 1.9635, "z": 270000 },
// or { "type": "polygon", "points": [[theta,z], ...] } for lakes, regions
"blurb": "public description, shown to readers",
"notes": "the author's working notes — NEVER shipped",
"public": true // false = not ready to exist publicly
}]
}
Two text fields, deliberately separate. blurb is written for readers and
ships; notes is the author's working thinking and never leaves the machine except
in a backup. One field with a flag would have made every note a publication
accident waiting to happen.
Ids follow the name until pinned. An id is a permalink target and must be
stable once published, but during world-building names churn constantly and a file
full of new-city-7 is unreadable. So the id tracks the name while it still
matches it, and editing the id field freezes it for good. The editor shows the id
for exactly this reason.
Coordinates are canon (θ radians, z metres, §1.7) — never map pixels, so the file survives any change to how the map is drawn.
The public flag is a privacy trap worth naming. Working notes ("embassy here?
check sightline to the cap") must not ship to readers. But a world.json committed
to a public repository is public regardless of any flag in it. So export writes two
files: world.json (public entries only, committed) and
world.private.json (everything, gitignored by default). Whether private notes
should nonetheless be version-controlled — in a private repo, or a second one — is
the author's call and is deliberately unresolved.
3.3 Instruments
The measuring tools are the real substance of writer mode. Each answers a question the novel actually raised:
- Sightline probe. Pick two points; get surface distance, straight-line distance, optical depth, transmission, and a plain verdict (crisp / hazy / ghost / invisible). This is the tool that answered §1.8. Available to readers too — it is the single most illustrative thing in the app.
- Viewshed overlay. From a selected point, shade the whole map by transmission. It renders the axis-versus-overhead asymmetry as one picture, which is worth more than the table in §1.8.
- Lighting probe. At a point, illumination across the day cycle at the current brightness setting (§1.3) — for writing a scene at a specific hour.
- Travel. Surface distance and journey time between points at chosen speeds, including whether the route crosses a slat.
- Sky-at-a-time. Star field, beam position and Earth transits for a given point and moment, so a described sky is a correct sky.
3.4 What readers get
The public link is the finished map: embassies, towns, lakes, named regions — the permanent things, behaving like any map application. Plus the exterior view, the interior view from any point, and permalinks so a reader can be handed a place and a moment. Reading the world, not editing it.
4. Phases
- Design — this document and
decisions.md. ← current - Scaffold — Vite/TS/Three, CI to Pages,
canon/implemented and unit-tested. - Exterior — ✅ hull, caps, collector, beam, spin, and hull point picking.
- Map — unrolled surface, slat rendering, picking, sync with exterior.
- Interior — ✅ shell geometry, the haze shader, the beam, rain, eye height, and the five illumination settings. Stars, but only through the far cap window.
- Writer mode — ✅ built ahead of 3–5, at the author's request, because the world needs developing before there is anything to render. Map view, place editing for all thirteen kinds, points/polylines/polygons, localStorage autosave, backup and static exports, import, and the sightline probe.
- Content pipeline and reader mode — ✅
content/geography.json+npm run terrain(D-019); the rendered terrain drawn under the map; reader and writer modes (D-011); permalinks (D-010). - Polish — mobile ✅ (the sidebar is a drawer below 720 px, D-043) and a screenshot tour that photographs all ten views through the UI, D-042. Remaining: transitions, performance.
All five view phases are built. Phase 2's canon/ landed with phase 6, since the
map could not be drawn without it.
Shareable permalinks are implemented (phase 7) — the app has readers, and "stand here and look at this" is the whole reason it exists as a companion piece. Named locations from the novel should be markable on the map for the same reason.
Later, explicitly out of scope for now: procedural scenery, settlements, weather systems.