- readsLaunch Library's T−0 times
- becomesimminence → mass, recomputed every second
- writes
--w - you seethe next launch literally gains weight as T−0 approaches — time itself drives the field
No canvas is drawn here — the field is invisible; these variables are its only output. Without it you would build: a countdown per row and a cron that re-sorts.
field-ui · invisible fields · calendar
The next launch pulls hardest.
A launch schedule lists every mission at the same weight: a rocket lifting off in nineteen hours sits in the same row style as one penciled in for the end of the month. This is the same schedule from Launch Library 2 run as a field: imminence is gravitational mass, and the weight ramps as T−0 approaches — heavier type, darker ink, a stronger left anchor.
This is the one page where the field's input is time itself. The soonest launch is the biggest thing on the wall — a featured "next up" card with the countdown as its centerpiece — and the rest lay out as a day agenda, a seven-column week, or a month grid: three calendar geometries over the same thirty launches. A 1-second clock recomputes every weight and re-picks the featured launch in whichever view is mounted, so when a window passes the wall advances on its own; passed and undated launches drift to a dimmed "unscheduled" cluster. Toggle the field off and the wall flattens — but the countdowns keep ticking, because they're data, not field.
size = imminence — weight ramps as T−0 approaches, recomputed every second · color = launch status — Go is confirmed, TBC awaits confirmation
- Aa size = imminence — the next launch is the biggest thing on the wall
- color = status (Go teal · TBC amber · TBD dim)
- T− the countdown is live — when a window passes, the wall re-picks "next up"
- the ink is live — --w is the clock's imminence and --cat the status lens; --d is the engine's local density (hold a card and the field gathers — the hero's countdown burns brighter) and --field-attention the recipe's eased attention as you scroll.
Next up
HASTE | Curveball
Rocket Lab Launch Complex 2 (Launch Area 0 C) · Wallops Flight Facility, Virginia, USA
Thursday, June 11UTC
- HASTE | CurveballT− 1d 03:21:43 Go Sub
- Long March 5 | Unknown PayloadT− 1d 06:51:43 Go
- Falcon 9 Block 5 | Starlink Group 17-44T− 1d 13:21:43 Go LEO
Friday, June 12UTC
- H3-30 | H3-30 Test FlightT− 2d 00:15:42 Go SSO
- Falcon 9 Block 5 | Starlink Group 10-54T− 2d 11:48:43 Go LEO
Monday, June 15UTC
- Kinetica 1 | Unknown PayloadT− 5d 03:01:43 Go
- Falcon 9 Block 5 | Starlink Group 17-54T− 5d 13:21:43 Go LEO
- Spectrum | Onward and UpwardT− 5d 19:21:43 TBC SSO
Tuesday, June 16UTC
- Long March 3B/E | Unknown PayloadT− 6d 09:06:43 Go
Wednesday, June 17UTC
- Long March 12 | Unknown PayloadT− 7d 01:21:43 TBC
- Falcon 9 Block 5 | BlueBird Block 2 #3-5T− 7d 06:00:43 Go LEO
- Falcon 9 Block 5 | NROL-179T− 7d 08:29:43 TBC
- Ariane 64 Block 2 | Amazon Leo (LE-03)T− 7d 11:14:43 Go LEO
- Electron | Ten Owl Of Ten (StriX Launch 10)T− 7d 20:01:43 Go SSO
Saturday, June 20UTC
- Falcon 9 Block 5 | Globalstar 2-R Mission 1 (x 9)T− 10d 06:00:43 TBC LEO
Tuesday, June 23UTC
- Long March 7A | Unknown PayloadT− 13d 01:21:43 TBC
Unscheduledwindow passed · date TBD
- Zhuque-2E Block 2 | 2 x SatNet DTC test satelliteswindow passed · snapshot Success LEO
- Electron | The Grain Goddess Provides (iQPS Launch 7)TBD TBD LEO
- GSLV Mk II | GISAT-1A (EOS-05)TBD TBD GTO
- Pegasus XL | Swift Rescue MissionTBD TBD LEO
- Smart Dragon 3 | Unknown PayloadTBD TBD
- South Korean ADD Solid-Fuel SLV | Demo FlightTBD TBD LEO
- Falcon 9 Block 5 | SDA Tranche 1 Tracking Layer ATBD TBD PO
- Falcon 9 Block 5 | SDA Tranche 1 Tracking Layer CTBD TBD PO
- Falcon 9 Block 5 | SDA Tranche 1 Tracking Layer ETBD TBD PO
- Falcon 9 Block 5 | SDA Tranche 1 Transport Layer ATBD TBD PO
- Falcon 9 Block 5 | SDA Tranche 1 Transport Layer DTBD TBD PO
- Falcon 9 Block 5 | SDA Tranche 1 Transport Layer ETBD TBD PO
- Falcon 9 Block 5 | SDA Tranche 1 Transport Layer FTBD TBD PO
- Falcon 9 Block 5 | Sirius SXM-11TBD TBD GTO
How it's built
Every launch is an ordinary <li> with its NET timestamp in a data
attribute. A 1-second clock turns distance-to-T−0 into a weight, writes it back as a CSS
custom property, and the type carries the measurement. No canvas, no chart library — the
only moving part is time. On top of the clock sit two live channels the engine writes back
every frame — --d (local density, gathered by data-hot on hover)
and --field-attention (the recipe's eased attention) — which touch only ink;
the 1 Hz weight ramp is untouched. The day / week / month toggle re-renders the records
zone from the same launch list and re-applies the scoped field over the new bodies — full
cards in day, compact cards in week, chips in month — and every channel keeps working.
1 — each launch is a field body
<!-- each launch is a body. data-feedback: the engine writes
--d (live local density) back every frame. data-hot:
hover/focus a card and the field gathers toward it —
hold the hero and its countdown burns brighter. -->
<li
data-body="attract"
data-strength="1.43"
data-feedback
data-hot
data-net="2026-06-11T04:00:00Z"
data-status="Go"
style="--w: 0.646; --cat: #2dd4bf;"
>
<!-- name · provider · countdown -->
</li> data-net— the no-earlier-than instant the clock measures againstdata-strength— gravitational mass, re-set every second--cat— the status color the CSS mixes indata-feedback— opt in to--field-*writebacks (--d)data-hot— hover/focus gathers the field toward this card
2 — one clock, three geometries
// the world-time kernel — 1 at T−0,
// log-ramping from 0 across the horizon:
import { imminence, weightToStrength }
from "@fundamental-engine/core";
// every second, for every launch:
const netMs = Date.parse(row.dataset.net);
const w = netMs > Date.now()
? Math.max(0.08, // the page's floor
imminence(netMs, Date.now(),
30 * 24 * 36e5)) // 30-day horizon
: 0.08; // window passed · snapshot
row.style.setProperty("--w", w);
row.dataset.strength =
weightToStrength(w).toFixed(2);
// the 0.4..2.0 attract-body contract
// the scoped field runs invisible (renderless)
// and asks for the attention metric lane —
// the pipeline writes --field-attention per
// card (eased 0..1):
field = applyRecipe(zone, base, {
renderless: true,
extraMetrics: ["attention"],
/* …bodies below */
}); // three geometries, one contract — every
// view renders the same 30 launches
// as the same bodies:
const render =
{ day, week, month }[view];
viewAc?.abort(); // the old view's
viewAc = // listeners die with it
new AbortController();
zone.innerHTML = render(records, now);
// the bodies changed — destroy the
// scoped field and re-apply the recipe
// over the new geometry:
field?.destroy();
const bodies = [
...zone.querySelectorAll("[data-body]"),
hero,
];
field = applyRecipe(zone, base, {
bodies,
annotateBodies: false,
renderless: true,
extraMetrics: ["attention"],
});
// the field doesn't care about the
// layout — it measures whatever
// geometry you give it. The soonest launch is the heaviest; as its T−0 approaches the ramp steepens, so the page's center of gravity slides toward the pad. The day / week / month toggle swaps the entire geometry under the same bodies — the field doesn't care about the layout; it measures whatever geometry you give it. That's the lesson of this page.
3 — CSS reads the field's output
.cal-row {
/* --w = imminence (1 Hz clock) · --d = live engine
density, data-hot gathers it · --field-attention =
the recipe's eased attention */
--live: var(--d, 0);
opacity: calc(0.58 + var(--w) * 0.42);
box-shadow: 0 0 calc(var(--live) * 16px) -6px
color-mix(in srgb,
var(--cat) calc(var(--live) * 55%), transparent);
}
/* the rail dot charges with the density */
.cal-row::before {
transform: translateY(-50%)
scale(calc(1 + var(--live) * 0.35));
}
/* hold the hero — the T-minus digits burn brighter */
.cal-hero-count {
text-shadow: 0 0 calc(var(--live) * 18px)
color-mix(in srgb,
var(--cat) calc(var(--live) * 65%), transparent);
}