Chapter 4 · Section 5
Sending Out Matter at the Physical Nova
The BPT law
BPT Part 2.9 (The Gas of the Physical Nova) and Part 3.6 (Data Novas and Dimensional Evolution): "at the Physical Nova (the Causal Nova of Part 3.6) the physical layer condenses from the data that has filled the lattice since the Data Nova, where that data lies"; in our universe that matter is the Primordial Gas of big-bang nucleosynthesis. BPT Part 3.11 (The First Ripples) says the matter starts "almost perfectly even", its ripples "the unevenness of that data on the lattice, densest along its lines and densest of all at its nodes", and describes the simulation's start: "One body for each quantum of matter, as many as the device that draws it can hold (every quantum, about 19,000, at level 5), is laid on an even grid".
BPT Part 3.13 counts what is sent out. The Data Nova fires when the Pulsecore's data, f(n) = (n + 1)², fills the Bifold's χ∂ = 16 · 4^L places, at n + 1 = 4 · 2^L; that whole skin turns out onto the scaffold and stays data, the Data Matter. The Physical Nova comes 2^L/3 Tempos later in the data's own count, at n + 1 = (13/3) · 2^L, and "what the core gathered between the two novas, f − χ∂ = (169/9 − 16) · 4^L = (25/9) · 4^L, is the first data born at the physical layer, the data the Physical Nova sends out as the big bang: the ordinary matter." This is the Data Matter Count, N◍ / N_b = 16 · 4^L / ((13/3)² · 4^L − 16 · 4^L).
The established physics
None beyond Part 4.6: how many bodies a simulation uses, and how many quanta each holds, is a numerical choice (every N-body code samples a continuous density with finite particles; Hockney & Eastwood 1988).
The game's math
sendOutMatter(frame, total) app.js:1192, called by burstPulsecore() app.js:1267 with total = dataWithin(n) = (n + 1)² (pinpoint.js:38), n = ⌊(pulseCounter − 1)/2⌋, the Tempos since the Pulsecore began.
BUD = matterBudget() bodies this device is given (below)
N = max(1, min(BUD, round(total))) bodies
q = total / N cells of matter each body holds
Each body is placed by zeldovichStart() (Part 4.6) from a weight per cell, so that matter condenses where the data lies and most where the lattice runs:
wt[i] = 0 where the cell holds no data
wt[i] = SCAFFOLD_FLOOR + scaffoldWeight[i] where it does (lines ≈ 1, nodes ≈ 2, scene3d), SCAFFOLD_FLOOR = 0.1 (app.js:1098)
Then sendOutMatter() sets the clocks: physStart (now), physLife = max(4, 2·(lifeEndTempo − universePulses)) flips (app.js:1225), a₀ = 1 and a = expansionA(); the Friedmann G (Part 4.3); matter.darkMass = Q·darkRatio() (Part 4.10); the stars' clock tauSun and the level's Sun (Chapter 5). The scene's point count for drawing is set to max(BUD, 15000) (app.js:1198).
matterBudget() app.js:1176:
phone: 8000
other: mem = min(8, navigator.deviceMemory or 4)
cores = min(16, navigator.hardwareConcurrency or 4)
BUD = round( clamp( 2000·mem·min(1, cores/8) + 2000, 8000, 16000 ) )
A desktop with 8 GB and 8 cores or more gets 16,000; one with 4 GB and 4 cores computes 6,000 and is raised to 8,000. Browsers report deviceMemory at most 8, so the min(8, ·) rarely binds.
Worked case. At the Physical Nova n + 1 ≈ 4·2^Lm + 2^Lm/3 = (13/3)·2^Lm, as BPT Part 3.13 places it (the Data Nova at n + 1 = 4·2^Lm, novaTempo() pinpoint.js:42, then a third of the life). Desktop, Lm = 6: n + 1 ≈ 256 + 22 = 278, total ≈ 77,300 cells, N = 16,000 bodies, q ≈ 4.8 cells a body. Level 5: n + 1 ≈ 139, total ≈ 19,300 cells; N = 16,000, q ≈ 1.2. Phone, Lm = 4: n + 1 ≈ 70, total ≈ 4,900 cells; N = 4,900 bodies of one cell each.
In the game
The Physical Nova is the third nova of a run (the HUD's Layer line reads 3, "the physical layer"), and it is the game's big bang. In 3D the torus has drawn in to the pin head (Part 4.4); burstPulsecore() then calls scene.burstInner() (scene3d.js:1067), "a white-gold flash from the centre past the torus, a shockwave ring, and the whole cloud of the data within blasting outward", and the torus grows back out with the new stars on it. Over the next 3.5 seconds of drawn time the lattice fades from 95 % to 12 % opacity behind them (scene3d.js:2137): the physical overtakes the scaffold. A toast names the moment (app.js:1286): "the big bang: Space erupts from the pin head and the data on the scaffold condenses into N bodies of matter, smooth but for tiny ripples · gravity will grow them into a web as the universe expands", with N the bodies laid.
Each body is drawn as a small swarm of points, as many as its share of all the matter (up to 4,000 for one body), the whole sky drawn with the scene's point count (setMatter() scene3d.js:705–709). Its points take part of the color of the data they condensed from, "the data becomes the universe" (scene3d.js:746–748). Gas is drawn as a faint haze in the data's color, stars as sharp points (Chapter 5). If frames run slow the scene draws fewer points (scene3d.js:2001–2003); the bodies themselves do not change.
In the 2D field (Universe panel, View: "2D · the field") each body is a dot (app.js:408–417): small gray dust, a pale blue-white dot of radius one cell once it holds a cloud's mass, two cells at twice that, and orange from three clouds' mass.
At shallow levels the burst carries a warning instead of stars: "no stable matter: … every quantum of matter collapses into its own micro-well and evaporates, a universe of light and wells" below about level 12, and "matter, but no stars: … stars begin at about level 23" below the Star Existence Condition (app.js:1254–1255; Chapter 5). The run's saved record keeps the number of bodies (bodies, app.js:2212) and the device's body count (bodies_budget, app.js:4438).
The scale model
A body stands for q cells of matter. The total matter is the scale model's own count; a body is a sampling unit, not a star, a cluster or a clump. Chapter 5 sizes the game's Sun from this total so that the stars drawn stand for the law's count (Part 5.3).
Where the game and the theory differ
- What counts as ordinary matter. BPT Part 3.13's ordinary matter is f(n↯) − χ_∂ = (25/9)·4^L, the data the core gathered between the Data Nova and the Physical Nova. The game sends out the whole f(n↯) = (n + 1)², about (169/9)·4^L, 6.76 times as much, by an earlier ruling (2026-10-25, quoted at app.js:1262–1264: "all of the Pulsecore's data becomes the physical world"), and then adds Data Matter of 5.4 times that on top (Part 4.10). The code and the book disagree on the ordinary matter by that factor. This is recorded, not resolved, here.
- Not every quantum a body. BPT Part 3.11 says the simulation lays "every quantum, about 19,000, at level 5" as its own body, following the comment at app.js:1151–1155. Since 8.3 the most bodies on any device is 16,000, so at level 5 on a desktop the 19,300 cells go out as 16,000 bodies of about 1.2 cells each. (A phone draws level 5 on its level-4 model, Part 4.15, whose 4,900 cells are still one body each.)
- A stale comment. The same comment, app.js:1151–1155, still says "Phones 12,000; other devices by their memory and cores, up to 60,000". The code since 8.3 (comment at app.js:1178–1179, 2026-10-27) gives phones 8,000 and every other device at most 16,000. A consequence lands in Chapter 5 (Part 5.12):
applyFeedback()testsmatterBudget() >= 30000(app.js:764) for a "strong" device, which can no longer be true. - Dead code.
MATTER_MAX = 6000(app.js:1149) is never used.vmax,mid,rnd,spinAtandrowAreainsidesendOutMatter()(app.js:1199–1236) are computed and then discarded withvoid; they record approaches that were tried and dropped (an outward burst speed, an added spin, a per-row area weight).
Fixed numbers
| Number | Where | What it is | Kind |
|---|---|---|---|
| 8000 | matterBudget() app.js:1180 |
Bodies on a phone | CAP (device class) |
| 16000 | matterBudget() app.js:1182 |
Most bodies on any device | CAP |
| 8000 | matterBudget() app.js:1182 |
Fewest bodies on a non-phone | CAP (floor) |
| 2000, 2000 | matterBudget() app.js:1182 |
Bodies per GB of memory, plus a base | CAP (dressed as a formula) |
| 8, 16 | matterBudget() app.js:1181 |
Ceilings on memory (GB) and cores read | CAP |
| 8 | matterBudget() app.js:1182 |
Cores for full share, min(1, cores/8) | CAP |
| 4, 4 | matterBudget() app.js:1181 |
Memory and cores assumed when unreported | METHOD (defaults) |
| 15000 | sendOutMatter() app.js:1198 |
Floor on the scene's point budget | CAP (drawing) |
| 0.1 | SCAFFOLD_FLOOR app.js:1098 |
Weight of a data cell off the lattice | METHOD (named choice: voids thin, not empty) |
| 6000 | MATTER_MAX app.js:1149 |
Old body ceiling, unused | CAP (dead code) |
| 8, 0.9, 0.45, 4 | sendOutMatter() app.js:1199–1200 |
Floors and shares of the unused burst speed vmax | METHOD (dead code) |
| 2654435761, 40503 | sendOutMatter() app.js:1201 |
Hash constants of the unused draw | METHOD (dead code) |
| 2166136261, 16777619, 3, 7 | sendOutMatter() app.js:1229 |
FNV hash of the data that seeds the ripples' phases; every third cell | METHOD (reproducible seed) |