Astral Polity · World Generation

A planet built from
published geomorphology

Every landform below was produced by a solver implementing peer-reviewed process laws — stream power, threshold hillslopes, Davy & Lague deposition, Leopold & Maddock hydraulic geometry. Nothing here is sculpted, painted, or noise dressed up as terrain. This page renders the actual shipped bake, read straight from riverworld80p7268s1618.bytes.

160 km across, 80,425 km² of solved surface — within a few per cent of the area of Austria — carried at 17.29 m between height samples, every square metre of it the output of the same solver rather than a heightmap someone painted.

Drag to rotate · scroll to zoom ·

The 25 km predecessor, and it is labelled rather than relabelled. Equirectangular sample of six baked cube faces (1024² each), re-projected about the generator's true polar axis; shading is computed per-pixel from the height field, so the light responds as you turn the globe — it is not a painted shadow. This render is of riverworld, the 25 km world that shipped until 2026-08-15. The world the game now binds is the 80 km riverworld80p7268s1618; the headline figures above are measured against it, while the deeper sections below still carry figures re-measured against the earlier 50 km riverworld50 blob, and say so where they do. The globe is older than both, because the equirect renderer that produced these textures is not in the repository and the bake's own history snapshot recorded map.png NOT WRITTEN for the same run. Re-rendering it from a description would be a picture of a world nobody generated — the same reason the stage film below is still empty.

The process laws

Each of these is in the solver, with the citation in the source. Where a coefficient was chosen, the published range it was chosen from is recorded beside it.

Nomenclature — every symbol used below
SymbolQuantityDimensionUnits
zground-surface elevationLm
ttimeTyr
Urock uplift rate, relative to base levelL T−1m yr−1
Efluvial incision rate; E = K Am SnL T−1m yr−1
Kbedrock erodibilityL1−2m T−1depends on m
Aupstream drainage areaL2m2
Schannel gradient along the flow path1
m, nstream-power exponents1
Gdeposition coefficient1
Qsvolumetric sediment flux through a nodeL3 T−1m3 yr−1
qshillslope sediment flux per unit widthL2 T−1m2 yr−1
Kdhillslope diffusivityL2 T−1m2 yr−1
∇zground-surface gradient1
Sccritical gradient the material can hold1
wchannel widthLm
Qwater dischargeL3 T−1m3 s−1
ζbank migration rateL T−1m yr−1
ubnear-bank excess velocityL T−1m s−1
Rcradius of curvature of a bendLm
ysine of latitude1
P2(y)second Legendre polynomial — a function, not a stored variable1
Tmean annual temperatureΘ°C
Pmean annual precipitationL T−1mm yr−1

Symbols repeat deliberately. E, A, z, w and S mean the same thing in every law that uses them — the drainage area in the incision law is the drainage area in the deposition law and in the width relation. Three pairs are close enough to be worth separating explicitly: Qs is a volumetric flux (m3 yr−1) while qs is per unit width (m2 yr−1); K is a fluvial erodibility while Kd is a hillslope diffusivity, and they do not even share dimensions; and P is precipitation while P2(y) is the Legendre polynomial. Both of those last two are standard in their own literature, so they are kept and disambiguated here rather than renamed into something no reader would recognise. A dimension of 1 means dimensionless.

Fluvial incision — stream power

E=KAmSn

E incision rate · K erodibility · A upstream drainage area · S channel gradient · m, n exponents (dimensionless)

Erosion rate scales with upstream drainage area A (a proxy for discharge) and local slope S. This is the term that cuts valleys, and in the shipped bake it does 74.3% of all the work.

Consequence the solver had to handle: on a drainage divide A is one cell by definition, so stream power is ~0 there. Summits cannot erode by this law at all — which is precisely why a hillslope term is required, and why its absence is visible.

The sediment film shows what this law builds. This one shows what it is. Base level falls once, at the right-hand outlet, and then nothing else is done to the landscape. For n = 1 the incision law is a wave equation: the step does not decay where it stands, it travels upstream at celerity c = K Am. That is a knickpoint — a waterfall, in the field — and it is why a river whose outlet has been lowered rejuvenates from the mouth up rather than everywhere at once. Watch the retreat rate in the readout. It runs fast down the trunk where A is large and stalls as it climbs into the small tributaries, because the celerity carries Am with it. Nothing scripted would slow down there. No deposition term at all (G = 0), deliberately: this is the bare incision law, so the difference from the sediment film below is exactly the difference between one term and two. Toy domain. Not the shipped bake.

Threshold hillslopes

qs=Kdz1|zSc|2

qs sediment flux per unit width (m2 yr−1) · Kd hillslope diffusivity (m2 yr−1) · ∇z surface gradient · Sc critical gradient — flux diverges as ∇z approaches Sc

Roering, Kirchner & Dietrich (1999)

Non-linear soil creep: flux rises smoothly at low gradient and diverges as slope approaches the critical angle Sc, which caps hillslopes at a repose-like limit instead of letting them steepen indefinitely.

Measured in the shipped bake: 0 km moved, 0.0%, hillslope faces active 0. The talus term (25.7%) and fluvial term (74.3%) account for all of it. This is reported rather than hidden — the law is implemented and contributed nothing to this particular world, and finding out why is open work.

A scarp the day it was made, and then left alone. Linear diffusion — the denominator deleted — relaxes this into a convex bulge and has no maximum angle at all: feed it a cliff and it will hold a 70° face for as long as you care to watch. The term 1 − (|∇z|/Sc)2 sends the flux to infinity as the gradient approaches Sc, so no slope can sit above it for more than an instant and the relaxed profile comes out planar rather than convex — which is what a real threshold hillslope looks like. The checkable claim is in the readout and it is an output: the maximum gradient starts at roughly 13× the threshold and then asymptotes onto it — measured off this build: 1.85× Sc a third of the way through, 1.02× at the end, and it never crosses. It flattens out there rather than continuing to decay because the instant a slope drops below threshold the flux amplification collapses with it, and the channel at the foot keeps cutting down and holding it up. No line in the solver says do not exceed. One honest caveat: that amplification is capped at 12× for numerical stability, which is why the maximum settles a few per cent above Sc rather than exactly on it. Toy domain. Not the shipped bake.

Sediment transport & deposition

zt=UKAmSn+GQsA

z elevation · t time · U uplift rate · K Am Sn the incision term E above · G deposition coefficient (dimensionless) · Qs volumetric sediment flux through the node · A drainage area. Qs/A has dimensions of a rate because a volume flux over an area is a thickness per unit time.

Davy & Lague (2009) · coefficient range from Yuan et al. (2019)

The transport-limited counterpart to pure incision. G sets how strongly suspended load redeposits: G = 0 is detachment-limited (rivers only cut), G > 0 lets valley floors aggrade, building fans, floodplains and deltas.

Shipped value G = 0.03. The bake logs record the search that landed there — G = 1.0, then 0.1, then 0.03, with the last two bakes both at 0.03 — and at every one of those values 78.2 % of cells received sediment. Coverage therefore could not separate them at all; the value was chosen on how much was laid down, not on whether anything was. Predictions were written before the bake: valley floors must rise, relief p99 must fall slightly, and sediment delivered to the sea must exceed zero — a closed planet that erodes but never exports is mass-conserving only by accident.

The term that is easy to skip is G Qs/A, and this is what it does. A range uplifts on the left. Flow is routed downhill, drainage area A is summed upslope-first, each cell incises at K AmSn — and the material it removes is carried downstream and put down again where the slope can no longer hold it, building the wedge in the basin. Red lines are cutting, gold lines are aggrading. The readout tracks eroded against deposited: those two numbers track each other because the transport step conserves volume, which is the one thing a scripted morph between two shapes could not reproduce. Toy domain. Not the shipped bake — the bake ships G = 0.03 and routes multiple-flow; this runs hotter so a fan appears inside ten seconds.

Channel width — hydraulic geometry

wQ0.5QA0.70.8wA0.350.4

w channel width · Q water discharge · A drainage area — the same A as the incision law, which is what lets the two compose

Leopold & Maddock (1953), measured across four orders of magnitude of discharge

At the exponent 0.4, a confluence that doubles drainage area widens the channel by 20.41.32× — a third wider below the junction than above it, which is what a real confluence looks like.

Why the exponent, not the constants: an earlier logarithmic width law widened a doubled river by 4·log₁₀2 ≈ 1.2 m on a 3–14 m half-width. No tuning could fix that, because the shape of the curve was wrong. The reported symptom was exact: rivers now merge instead. the merged river however fails to become larger.

Meander migration

ζubpeak atRcw23

ζ bank migration rate · ub near-bank excess velocity · Rc radius of curvature of the bend · w channel width, from the width relation above

Howard & Knutson (1984); Ikeda, Parker & Sawai (1981); Hickin & Nanson (1975)

Bend migration is driven by near-bank excess velocity with a weighted memory of upstream curvature, so bends grow, sharpen and eventually cut off.

The counter-intuitive part, and the reason the naive version was wrong: migration rate is not proportional to river size. Hickin & Nanson measured it peaking at an intermediate curvature-to-width ratio and falling for tighter bends.

Plan view, not a profile — this law is about a line, not a surface. The migration rate is driven by the near-bank excess velocity, and the part that matters is that the excess is not the local curvature: it is a weighted memory of the curvature upstream, decaying as exp(−ks). Each bend is steered by the bend above it. That single non-local term is why meanders migrate downstream and lean over instead of growing symmetrically in place. The checkable claim is in the readout: sinuosity climbs from 1.00 to about 3.3, and along the way a neck cutoff fires — two of them in this clip — and each one removes an entire loop in a single step. Watch the sinuosity figure drop when it does. Over geological time that is the whole reason meandering rivers have a sinuosity ceiling at all: length is added continuously and removed in jumps. A scripted animation would grow forever, or stop where it was told. The migration rate also carries Hickin & Nanson’s limiter, which is printed on the card beside this film: rate peaks at an intermediate curvature and falls for tighter bends. Without it the leading bend accelerates into itself and winds up as a spiral no river makes — which is exactly what the first build of this film did. Pale loops are abandoned oxbows. Every bank here is equally erodible, which is why the pattern is so regular; a real valley is not, and neither is the bake’s. Not the shipped bake.

Insolation & the ice line

P2(y)=12(3y21)warmth=1P21.5

y sine of latitude (0 at the equator, ±1 at the poles) · P2(y) the second Legendre polynomial — a function of y, not a stored field, and not the precipitation P below. Warmth is normalised so the equator is 1 and the poles are 0.

Second Legendre polynomial — the standard latitudinal insolation shape in EBMs · North (1984)

Warmth follows the second Legendre polynomial in y = cos(colatitude), the classic energy-balance form. The equilibrium line altitude is derived from this climate, not authored.

North's small-ice-cap instability is respected: a cap shrinking past a critical size disappears entirely rather than thinning away smoothly, so polar caps are bistable.

This world's poles are on the X axis (PolarAxis = (1,0,0)) — worth knowing, because assuming Y produced a map whose cold biomes sat at mean |lat| 22.9°. Re-projected about the true axis they sit at 58.6°, and the tropics fall to 0.03%.

Biome classification

biome=f(T,P)

T mean annual temperature (°C) · P mean annual precipitation (mm yr−1) — the two axes of the Whittaker plane

Whittaker's temperature × precipitation scheme

Desert, savanna, rainforest, grassland, forest, taiga and tundra are assigned on the Whittaker plane rather than by altitude bands, so a cold-wet cell becomes boreal forest and a cold-dry one becomes tundra.

Freshwater zonation is limnological, not invented: a supralittoral band, an emergent macrophyte belt, then the profundal — because our lakes run 44–68 m deep while rooted plants stop at 3–10 m, so most of a lake's area is genuinely below the photic shelf.

Cave morphology

branchwork ≫ network ≫ anastomotic ≫ ramiform ≫ spongework

Palmer (1991), on the distribution of solutional cave patterns

Cave families are generated in the proportions Palmer measured in real karst. The note in the source is the useful part: an earlier generator produced spongework, which is the rarest pattern in nature — a plausible-looking result that was statistically almost impossible.

Ice flow & the glacial buzzsaw

q=ΓHn+2|s|n1s

q ice flux · H ice thickness · s ice SURFACE (bed + H) · n Glen's exponent = 3 · Γ deformation constant

Glen's flow law; abrasion Eg = KgUsl after Humphrey & Raymond (1994), exponent revisited by Herman et al. (2015)

Stream power is EAmSn and drainage area is one cell on a divide by definition, so rivers cannot erode a summit. Ice can — it flows from the divides. That is what cuts cirques back into a peak, leaves horns and arêtes between them, and replaces V-notches with U-troughs. Mass balance is keyed to the equilibrium line altitude: b(z) = clamp(γ (z − ELA)), accumulating above it and ablating below.

Note it is the ice SURFACE slope, not the bed slope. That one substitution is why glaciers overdeepen — they can erode below their own outlet — which is the origin of finger and ribbon lakes. Abrasion peaks where ice is thick and moving, mid-glacier near the ELA, so summit height is limited by physics rather than by a hand-tuned clamp. The solver relaxes toward the SIA steady state with a bounded per-face transfer instead of sub-cycling an explicit scheme whose stable timestep collapses as H5: correct where the landscape ends up, wrong about how fast it gets there, which is the right trade for a bake.

This is the equation above, integrated, not an animation of one. The block starts as a stream-power landscape — note the V-shaped notch, which is what E = K AmSn cuts. As the ELA drops, ice accumulates where b = β(s−ELA) is positive, spreads by the shallow-ice flux q = ΓHn+2|∇s|n−1s, and cuts the bed at ė = KgUs. The U-trough is an output, and the readout measures it: the section index runs 0.5 → 1.0, which is a linear V becoming a flat-floored U. It happens because abrasion acts normal to the bed, so the same cut on a steep wall lowers the surface far more and cuts the wall back — erosion that merely followed ice thickness would deepen the V instead, and in testing it did. Watch the summit figure fall too: that is the buzzsaw. Then the ELA rises again and the ice retreats, which is what uncovers the trough. Toy domain, ~1,500 cells, seconds standing for 105 years. Not the shipped bake, not its resolution, not its constants.

Orographic precipitation

Udqcds=Sqcτc,P=qsτf

qc cloud water · qs hydrometeors · τc conversion time · τf fallout time · S = Cw max(U·∇h, 0) forced uplift

Smith & Barstad (2004), A linear theory of orographic precipitation

Two coupled advection–relaxation equations along the wind. The max(…, 0) in the source term is the rain shadow: air descending a lee slope does not condense, so the lee gets only what survives the fallout timescale. One ridge therefore becomes a rainforest flank and a desert flank — and on this world that matters more than temperature does, because the measured pole-to-equator contrast is only 2.50 K. Precipitation is what carries the map.

Solved in real space, not with an FFT, and the reason is a scar. The published solver is a Fourier transfer function. A per-cube-face FFT cannot see across a cube edge, and this generator has already paid for that once — great-circle arcs of fake mountains, seam ratio 1.74× driven back to 1.02×. The real-space upwind march is identical physics with identical parameters and inherits seam-freedom from the cross-face neighbour topology instead of fighting for it again. Information travels downwind only, so sorting cells along the wind makes a single pass exact.

Delete the two delays and this becomes a cartoon. With τc and τf removed, precipitation is proportional to uplift: rain exactly on the windward face, none past the crest, perfectly symmetric. The delays mean water is lifted here and falls there, and there is downwind. The checkable claim, and a cartoon cannot make it: in its last third the film raises the wind from 8 to 22 m/s, and the precipitation maximum crosses the crest. Measured off this build: at 8 m/s the peak sits 0.7 % of the transect UPWIND of the summit; at 22 m/s it is 7.6 % DOWNWIND of it, and the far lee goes from 5.7 % of the peak to 22.8 %. A faster flow carries the drops further before they land. That is why real ranges are wettest just over the crest rather than on the face, and why a rain shadow deepens when the flow is strong. The blue curve is accumulated precipitation, the pale verticals are cloud water aloft. A 1-D transect: there is no cross-wind term here at all.

Wave exposure & the coastal ecotone

16 great-circle rays · ≈45 samples per ray, log-spaced · breaker index γ ≈ 0.78 · shoal termination at 2.5 m

Effective fetch / relative exposure index; Burrows' wave-fetch model; NOAA WEMo

Mangrove, tidal flat, salt marsh and estuary are decided by six per-cell tests — tidal frame, flatness, shelter, thermal class, substrate, ponding. Two of those had no field behind them, and they are precisely the two that discriminate: build the biomes first and you gate on a test that always returns true, which is how you get mangroves on cliffs.

A shoreline is a 1-D feature in a 2-D grid — order 0.2–1% of the planet at 19 m cells — and that single fact is what makes the expensive, correct method affordable: real ray-cast fetch on a quarter-million cells instead of a blurred mask on a hundred million.

Every cheap alternative fails in the same place. Distance transform, gaussian blur, mip-pyramid land fraction, diffusion — none can represent DIRECTION, and direction is the entire difference between a lee shore and a windward one. Sixteen rays because eight aliases: a 45° gap either fully counts or vanishes, so bays flicker between sheltered and exposed under tiny coastline changes. Rays march the great circle in 3-D as p cos a + t sin a, which makes cube seams a non-issue by construction rather than by patching.

Reefs as a constructional landform

no reef above 2 m · dense cover 5–25 m · framework stops at 40 m · shelf break derives at ≈162 m

Hermatypic coral growth; light as the master control

The only landform here that is built by life: coral lays down carbonate and grows toward the light, so the rock is the organism's output rather than the solver's. It writes height and hardness and then gets out of the way — the same shape the volcanic and canyon passes use, and for the same reason.

Capping growth just below sea level produces all three reef types for free: a shore with nothing to enclose gets a fringing reef; a rim that caps while the ground behind stays deeper is a barrier reef with a lagoon; the same rim around a drowned volcanic edifice is an atoll.

Below 2 m there is no reef, and that is the counter-intuitive half. The reef FLAT is the harshest zone on the whole structure — emersion at low tide, thermal and salinity extremes, wave shock — so it is pavement, rubble and algal ridge, never the coral garden. Substrate splits the result in two: on soft bottom the animal builds its own framework (Reef), on rock the rock reads through a veneer (RockyReef). Invert the substrate test, drop the construction, and the same pass yields Seagrass — which in reality covers far more sea floor than coral.

Two rules. Three landforms. The solver does not contain the word “atoll”. Coral accretes at dC/dt = G (1 − depth/Dphotic) wherever it is under water and above the photic floor, and may not grow past sea level. And the rate scales with exposure — the fraction of eight compass rays from a cell that reach open ocean without crossing a crest. That second rule was not in the first build, and the film is what said so: light alone fills the entire shallow platform, because a cell behind the rim is lit exactly as well as a cell on it, and the readout printed lagoon depth 0.000. What starves a back-reef is not darkness, it is still water. Nothing else is written down. Then the island subsides. While it stands high the reef hugs the shore — fringing. As the ground sinks the reef keeps pace with sea level but the shoreline retreats behind it, and the water between them deepens: that gap is a lagoon and the reef is now a barrier. When the last of the island goes under, the rim is still there — an atoll. That is Darwin’s 1842 argument, and here it is an output. The readout names the stage, and it is computed from the grid — land cells, and water enclosed between two crests — never from the frame number. Sea level never moves; the ground does, which is the choice the bake makes and the reason the subsidence is printed. Toy domain. Not the shipped bake.

Volcanic edifices

h/w0.10,θ¯12°

shields 2–10° · stratovolcanoes 25–35° · one viscosity parameter spans the continuum

Volcano morphometry: the shield/strato split is a single number, not two species

An edifice is a constructional landform — lava erupted and piled up — so writing height is the physics, not a shortcut. It is stamped before the erosion solver with a hardness anomaly beneath it, so the solver then cuts radial gullies into the flanks, dissects the soft ash and leaves the resistant core. That dissection is what stops it reading as a smooth cone-shaped bump.

Low-viscosity basalt flows before it piles (shields); viscous gas-rich andesite piles where it lands (stratovolcanoes). One knob spans both — exactly what an exoplanet generator wants.

The caldera costs nothing and pays for itself. The summit carries a depression and the bake already segments lakes out of the depression fill, so a caldera fills itself with a crater lake: no lake code, no special case, just a hole in the right place. Islands are the same feature placed on the shelf — a cone tall enough to breach sea level from shallow water is a volcanic island, which is how real arcs form, and the drowned ones that fail to breach become the platforms atolls grow on.

Two rules, and the stratocone profile is not one of them. (1) each eruption lays a thickness that falls off with distance from the vent; (2) between eruptions the pile relaxes any face steeper than the angle of repose. That is the whole model, and the concave-up flank of a real volcano comes out of it without being written down anywhere. The checkable claim is in the readout: the flank angle climbs and then stops at repose while the summit keeps rising — which is the observation the shape is usually justified by, arriving here as a consequence instead of an assumption. And the caldera is not a dent. It is the roof of an emptied chamber failing: one eruption an order of magnitude larger than the rest withdraws more than the pile can bridge and the summit drops into the volume it just erupted. Nothing is subtracted that was not first put there. Toy domain. Not the shipped bake.

Canyons

repose=lerp(θsoil,θrock,H)

H hardness · incision ∝ Am concentrates power into a line · wall retreat relaxes to repose

A canyon is not a shape, it is a ratio: incision must beat wall retreat. Every term that decides it was already in the pipeline. Stream power cuts as Am, so a big river concentrates its power into a narrow line — that is the cutting. Thermal erosion relaxes slopes to an angle interpolated by hardness, so hard rock already stands steeper — that is the wall. Uplift supplies the vertical range — that is the depth.

The load-bearing coincidence: the one field that resists widening is the same field that lets the walls stay vertical, so a single hardness anomaly buys both halves and no new solver is needed. The pass therefore writes a plateau and a resistance and lets the existing river cut it, which comes out sinuous instead of stamped.

Eight of these fourteen cards carry a film, and here is why the other six do not. A film is worth building only where the law describes something that moves, so the absence is a judgement and it is stated rather than left to look like an oversight. Channel width and biome classification are not processes — one is a scaling relation and the other a classifier, and integrating either forward would produce a picture of nothing happening. Insolation and the ice line is a curve, and the thing it drives is already the glacier film’s whole plot. Canyons integrate the same two terms as the fluvial and hillslope films with one parameter changed, so a third film would repeat two you have already watched. Wave exposure and cave morphology are the two honest gaps: both are genuinely animatable, both need a solver of their own — a plan-view fetch cast and a 3-D dissolution network — and neither is written yet.

Photographs: NASA — public domain. Grand Canyon (ISS074-E-208848) · Andes (ISS058-E-000188) · Lena Delta (GSFC) · Amazon (ISS069-E-033689) · Meandering Mississippi (GSFC) · Malaspina Glacier (GSFC) · Kakadu (ISS073-E-0078217) · Karst, China (JPL PIA18230). These are Earth analogues, not our world: each shows the landform the law beside it produces. The Lena, Mississippi and karst frames are false-colour instrument composites; the rest are true-colour photographs taken from orbit.

Erosion budget of the shipped world

120 coupled solver steps over six cube faces. These are the bake's own numbers, not an estimate.

74.3% fluvial 25.7% talus 0%
Fluvial incision
74.3% of all material moved
Talus / repose failure
25.7%
Threshold hillslope
0.0% · faces active 0
Height range
−1,424.4 m to +4,367.3 m
Total relief
5,791.7 m
Mean elevation
−92.4 m — below sea level, as a water world should be
Relief scale
2,607.1 m
Snow line
2,514.0 m
Below sea level
62,567,663 cells · 62.16%
Lakes segmented (riverworld50)
3,303 · median radius 52 m, median depth 5.7 m, deepest 128.9 m
River splines (riverworld50)
1,918 · 2,201,433 nodes — NOT the shipped 70 km world, which reads 2,684 splines at runtime

Which of these are measurements of the shipped blob, and which are not. Every row from Height range down was recomputed from riverworld50.bytes for this revision: the height statistics by a full pass over all 100,663,296 samples, the lake and spline figures by parsing the vector tail. The two erosion share percentages at the top are not — they come from the [EROSION] census of the 25 km predecessor bake, because the 50 km bake's census was not archived and the solver does not store its budget in the blob. They are kept because the split is a property of the model rather than of the world, and dropping them would lose the page's most quoted number; they are marked because the alternative is a figure that reads measured and is not. The third row stays flagged: threshold hillslope moved nothing, which is a live finding and not a rounding artefact.

What changed since this page was written

This page first went up on 2026-08-12 against a 25 km world. On 2026-08-15 the scene was rebound to a 50 km one, and the generator has gained six solver stages since. A page whose whole claim is that its numbers can be checked cannot carry stale ones, so here is the diff rather than a quiet overwrite.

Quantity2026-08-12nowwhy
Worldriverworldriverworld50 the scene binder's bakeResource; every consumer now derives its filenames from it rather than hard-coding a name
Radius25,000 m50,000 m
Face resolution1024²4096² 16× the samples per face; 19.2 m per cell
Height samples6,291,456100,663,296
Blob123.8 MB2.56 GB moved Resources/StreamingAssets/ and streamed: Unity's single-object ceiling is 2 GB, so a 4096-face blob could not be a TextAsset
FormatPLNT v6PLNT v7 + per-cell Sediment and Precip fields, appended after the v6 prefix
Relief scale1,536.1 m2,607.1 m
Height range−566 … +2,767 m −1,424 … +4,367 m
Ocean20.4%54.5% the earlier figure was a hypsometric estimate on a unimodal curve; this is a cell count of the two marine classes. 62.2% of the surface is below sea level once beach and reef are included
River splines1,0191,918 2,201,433 nodes
Lakes3533,303
Biome classes1735 declared, 33 present see below
Bare rock22.94%3.85% the largest single correction on this page. A generic 20–40° slope ramp was painting bare cliff onto every soil hillside the erosion solver had built — the angle of repose is 32°, which is 53% of the way up that ramp. Grassland went from 0.66% to 8.31% in the same fix

Six solver stages arrived with those classes, each of them a landform the world previously did not contain: volcanic edifices with self-filling calderas, canyons as an incision-versus- wall-retreat ratio, glacial ice bodies and the moraine ring at their maximum extent, talus aprons painted from where the thermal pass actually deposited, the photic zone as reef and seagrass, and the coastal ecotone gated on real ray-cast wave fetch. The new cards above cover the five with a governing equation; scree and moraine have none, because they are painted from bookkeeping the erosion model was already doing and throwing away.

The projection was wrong, and two constants had been right all along

2026-08-17/18. The largest correction on this page since the bare-rock fix — and unlike that one it changed no tuning value at all, only the geometry every value had been measured against.

The cube‑sphere mapped face coordinates linearly onto the cube and then normalised: the naive gnomonic projection, whose cells vary in area by 3√3 = 5.196× between a face centre and a corner. Two of the generator's load‑bearing constants, however, were written for the equi‑angular map:

PlanetBaker      cellSize = R · (π/2) / N      ← equi-angular centre spacing, EXACTLY
PlanetFarTerrain n.arc    = radius · size · (π/4)  ← equi-angular arc formula,    EXACTLY

Neither matched the map underneath them. The fix is four lines — warp each axis through tan(s·π/4), unwarp with atan.

Quantitygnomonicequi-angularwhy it matters
Cell area ratio, max/min5.1961.4099
Cells within ±20% of mean32.5%100.0% more than half the grid used to be finer than the quality bar it was sized against, and paid full memory and full bake time for it
Coarsest cell2R/NR·(π/2)/N exactly the shipped detail is set by the worst cell, and it is now the number the code always claimed
Seam relief bias1.74~1.00 the visible one. Erosion computes slope as dh/spacing and was fed a constant up to 1.67× wrong toward the seams, so it systematically under-eroded there and inflated seam peaks. Removed at the source rather than compensated
Seam adjacency tablevalidvalid, unchanged the warp is separable and fixes s = ±1 exactly, so every face boundary lands on the same great circle. An exact equal‑area map would not survive this: it is non‑separable, and breaks 4 of the 12 seams by up to 76.5 cells

Every baked world before this is invalid, and no checksum could tell you

The bytes are fine. What changed is what they mean: cell (face, x, z) now names a different direction — up to 8° out near a face corner. An old blob under the new map is a rotated, stretched planet that loads without complaint and puts the rivers in the wrong place. The format version therefore refuses anything older by name rather than tolerating it, which is a deliberate break with the read‑older‑versions policy every previous bump followed.

The planet no longer has to fit in RAM

The runtime used to materialise seven planes × six faces as managed arrays — 25 bytes per cell, resident for the whole session, with no cap and no eviction. That was 118 MB when the pattern was written and 2.4 GB for the world below. It is now read straight out of the file it was already shipping:

And the bake stopped hoarding

Peak memory fell from 256 bytes per cell (the original audit measurement) to 113.8, without changing the precision of a single field. The largest single win was not in the audit: the drainage router allocated 29 B/cell of scratch on every call, and it is called once per erosion iteration — 120 times — which is roughly 1.4 TB of large‑object churn on a big world.

Why the square biome patches were on the green. Every non‑water class gets the same boundary warp, so the difference was never the warp — it is the field being thresholded. Coast and shelf follow the erosion contour; rock and snow follow altitude on dissected mountains; both are fractal and turn constantly. The vegetated classes are thresholded from temperature and moisture, which are smooth, planet‑scale fields. A smooth boundary running near‑tangent to a grid line produces a tread of about 2√(2R) cells, so the smoothest inputs produce the longest straight edges on the planet. The patches concentrated exactly where the classifier's input was smoothest.

What the world is made of

Every figure below is a cell count recomputed from the shipped blob, and every arc is drawn from that count — a slice cannot disagree with the number printed beside it. 100,663,296 classified cells, 33 of the generator's 35 surface classes present. Colour is the only thing here that was chosen rather than measured.

The whole sphere by province
Ocean floor — 54.52% (54,883,023 cells) Reef & meadow — 1.83% (1,846,769 cells) Coast — 6.31% (6,353,199 cells) Fresh water — 1.40% (1,412,066 cells) Grass & steppe — 12.71% (12,796,216 cells) Forest — 6.50% (6,545,951 cells) Arid — 5.72% (5,758,013 cells) Rock & alpine — 6.50% (6,543,230 cells) Ice & tundra — 4.50% (4,524,829 cells) 54.52% Ocean floor
Land, coast and fresh water 43.6% of the sphere, renormalised
Grassland — 19.04% (8,366,960 cells) Beach — 12.91% (5,672,439 cells) Rock — 8.82% (3,874,620 cells) Forest — 8.80% (3,868,336 cells) Desert — 8.76% (3,847,136 cells) Savanna — 8.08% (3,549,152 cells) Snow — 5.38% (2,364,994 cells) Dunes — 4.21% (1,848,202 cells) Tundra — 3.95% (1,733,306 cells) Rainforest — 3.66% (1,608,222 cells) AlpineMeadow — 2.78% (1,222,094 cells) Wetland — 2.35% (1,033,605 cells) Steppe — 2.00% (880,104 cells) ConiferForest — 1.56% (685,984 cells) Canyon — 1.50% (660,132 cells) SaltMarsh — 1.48% (649,751 cells) Scree — 1.23% (538,623 cells) Ice — 0.97% (426,529 cells) Taiga — 0.87% (383,409 cells) Swamp — 0.41% (180,422 cells) LakeBed — 0.30% (131,421 cells) VolcanicAsh — 0.30% (131,241 cells) LakeShore — 0.15% (66,618 cells) Basalt — 0.15% (66,363 cells) SaltFlat — 0.14% (62,675 cells) Moraine — 0.11% (50,157 cells) TidalFlat — 0.04% (17,393 cells) Estuary — 0.03% (13,616 cells) 19.04% Grassland

Why two charts. This world is 54.5% sea floor by classification and 62.2% of its surface lies below sea level, so a single pie renders every land biome as a sliver. The right-hand chart drops the five marine classes and renormalises to the remaining 43,933,504 cells — the ground a player can stand on, wade in, or fly over.

Every class, with its exact cell count
ClassProvinceCells of sphereof landWhat it is
DeepSeabedOcean floor43,797,33043.509%abyssal plain
ShelfOcean floor11,085,69311.013%continental shelf
GrasslandGrass & steppe8,366,9608.312%19.04%temperate + dry
BeachCoast5,672,4395.635%12.91%marine sand at the waterline
RockRock & alpine3,874,6203.849%8.82%exposed bedrock
ForestForest3,868,3363.843%8.80%temperate + wet
DesertArid3,847,1363.822%8.76%hot + dry
SavannaGrass & steppe3,549,1523.526%8.08%hot + medium
SnowIce & tundra2,364,9942.349%5.38%wind-drifted surface
DunesArid1,848,2021.836%4.21%erg — the one biome that writes height
TundraIce & tundra1,733,3061.722%3.95%cold + dry
RainforestForest1,608,2221.598%3.66%hot + wet
ReefReef & meadow1,472,4251.463%carbonate framework, 2–40 m
AlpineMeadowRock & alpine1,222,0941.214%2.78%treeline to bare rock
WetlandFresh water1,033,6051.027%2.35%marsh and floodplain
SteppeGrass & steppe880,1040.874%2.00%high, flat, dry continental
ConiferForestForest685,9840.681%1.56%cold-temperate + wet
CanyonRock & alpine660,1320.656%1.50%stratified wall rock
SaltMarshCoast649,7510.645%1.48%herbaceous, above mean high water
ScreeRock & alpine538,6230.535%1.23%talus the slope shed
IceIce & tundra426,5290.424%0.97%glacier body, walkable
TaigaForest383,4090.381%0.87%cold + wet boreal
SeagrassReef & meadow191,8730.191%soft-bottom photic meadow
RockyReefReef & meadow182,4710.181%coral veneer on rock
SwampFresh water180,4220.179%0.41%ponded, saturated, vegetated
LakeBedFresh water131,4210.131%0.30%submerged freshwater bed
VolcanicAshRock & alpine131,2410.130%0.30%tephra flanks the solver gullies
LakeShoreFresh water66,6180.066%0.15%emergent macrophyte margin
BasaltRock & alpine66,3630.066%0.15%cone and caldera rim
SaltFlatArid62,6750.062%0.14%evaporite in a closed basin
MoraineRock & alpine50,1570.050%0.11%till at maximum ice extent
TidalFlatCoast17,3930.017%0.04%bare intertidal mud and sand
EstuaryCoast13,6160.014%0.03%drowned low-energy river mouth
MangroveCoast00.000%0.00%intertidal forest on anoxic mud
SoilUnclassified00.000%0.00%altitude-only fallback — never reached

Two classes read zero, for two different reasons, and only one of them is expected. Soil is the altitude-only fallback in Classify; the Whittaker classifier runs on every land cell, so nothing should ever fall through to it, and zero is the correct answer. Mangrove is not: it is a shipped classifier with its own SurfaceRules.Adjust case, and the six gates that decide it (tidal frame, flatness, shelter, thermal class, substrate, ponding) evidently never co-occur on this world. Its cold-climate counterpart SaltMarsh holds 649,751 cells, so the coastal pass itself is running. Raised with the generator's owner rather than tuned from here.

The climate this world was solved for

Eleven authored inputs and eight derived quantities, stored in the blob itself since format v6 and read back out of riverworld50.bytes for this page. This replaces a warning. The previous revision could not locate the climate contract in the shipped file — no tail offset yields physically plausible values — and therefore printed no climate number it could not source. The record was there; the parse was walking the lake array as fixed-width when it is length-prefixed. Every value below cross-checks against the file header: the contract's RadiusM reads 50,000 m and so does the header.

Insolation
1,361 W m−2 · Bond albedo 0.30
Body
radius 50,000 m · gravity 9.81 m s−2 · rotation period 72,000 s (20 h) · not tidally locked
Atmosphere
101,325 Pa · 28.97 g mol−1 · cp 1,004 J kg−1K−1 · τLW 0.844 · lapse fraction 0.665
Global mean temperature
287.78 K — 14.63 °C
Scale height
8,419 m · Brunt–Väisälä N = 0.01056 s−1
Environmental lapse
6.498 K km−1
Circulation regime
SlowLd/a = 14.41. A single global Hadley cell, weak contrast, a seasonally migrating ITCZ. Titan and Venus live here; so does a small planet with a twenty-hour day.
Pole–equator contrast
2.50 K, and the blob records that this value was floored — the solution wanted less. That is the honest consequence of the regime above, and it is why orographic precipitation rather than temperature is what places the biome map.

Evolution of the bake

Partly instrumented · still not rendered

The sequence below — protoplanet, tectonic uplift, 120 erosion steps, sediment, glaciation, hydrology, climate, biomes — is not rendered here yet, deliberately. The bake currently emits its final state plus text censuses; it does not snapshot intermediate fields. Reconstructing the stages procedurally would produce a plausible-looking animation that is not what the solver did, which is worse than showing nothing.

The specification for what the bake must emit is filed as epic PLANETVIZ phase 2: a PlanetBakeFilm sidecar of downsampled cube snapshots (256² per face is sufficient, ~5 MB for a 14-stage film), each carrying the min/max/mean/p99 of its field so captions are generated from measurements rather than written by hand.

Half of it now exists, and the half that does not is the interesting half. Since 2026-08-15 every bake archives a snapshot to _bakes_history/ — an equirectangular map and a census naming the world, the seed, the face resolution, the wall-clock bake time, the blob's SHA-256 and the biome shares recomputed from the blob rather than copied from the log. That is per bake, not per stage: it makes successive worlds comparable, which is how the bare-rock correction in the table above was caught, but it still cannot show a valley cutting in.

The first archived snapshot is instructive about why this page shows the 25 km globe. Its census records map.png NOT WRITTEN — the colour bake (.apcx) is not open, so there was no colour authority to sample. The numbers above are still valid. A snapshot that refuses to write an image it cannot source, and says so, is the behaviour this section was arguing for.

  1. Protoplanet — pre-tectonic sphere
  2. Tectonic uplift — continents, ranges, hardness
  3. Pre-erosion relief — the baseline everything is measured against
  4. Erosion ×120 — valleys cutting in, every 10th step
  5. Sediment — Davy & Lague deposition filling basins
  6. Glaciation — caps, ELA field, U-valleys
  7. Hydrology — the drainage network lighting up
  8. Climate — temperature and moisture fields
  9. Biomes — the Whittaker colouring

Provenance

What this page is made of, so any number on it can be checked.

Source
Assets/StreamingAssets/riverworld50.bytes — 2,560,698,176 B, format PLNT v7, six cube faces at 4096², radius 50,000 m, 19.2 m per cell. SHA-256 1AA57D0A7C85FF220492BBA88CEF4A5E3C2ADD9225A21A4B20486DD6B221003F
Fields read
Height, Drainage, Hardness, Biome, RiverSdf, Sediment, Precip, 1,918 river splines, 3,303 lakes, and the v6 climate contract
Biome figures
A full pass over all six Biome planes — 100,663,296 bytes — counted into a histogram, then divided. Not sampled, not read off the globe render, and not copied from a log: the arcs in the chart are generated from the same counts printed beside them
Previous render
The interactive globe is still the 25 km riverworld world and is captioned as such. Re-projecting the 50 km blob needs the equirect renderer that produced those textures, which is not in the repository
Projection
Equirectangular 2048×1024, sampled through the generator's own cube-face convention (0=+X 1=−X 2=+Y 3=−Y 4=+Z 5=−Z), about the true polar axis (1,0,0)
Projection check
Cold biomes verified at mean |latitude| 58.6° (median 55.5°) against a 45° all-cell mean — the test that caught an initial 90°-rotated projection
Erosion shares
From the [EROSION] census of the 25 km predecessor bake — the only two figures on this page not measured against the shipped blob, and marked wherever they appear. The solver does not store its budget in the blob and the 50 km bake's census was not archived
Climate figures
Now read from the blob, replacing the previous revision's warning that the contract could not be located. Cross-checked against the file header: the contract's RadiusM and the header radius both read 50,000 m
Last re-measured
2026-08-17, against the blob dated 2026-08-16 23:47
<