Terminus: beams, not blankets

Proposal section 7: beams, not blankets

A satellite over the tidally locked planet casting many independent pencil beams, each landing on its own lit town along the twilight band rather than one wide blanket, with the red dwarf low on the horizon

Last time ended with a confession: all our link arithmetic imagined one satellite dish talking to one terminal dish. Neither of them turns out to be a dish — that is the second half of this section — and a satellite lighting its whole 5,000-kilometer-wide footprint with one beam is not talking to anyone in particular. It is throwing a blanket over a hundred settlements at once — every watt and every hertz shared by everyone underneath, and every terminal left to solve, on its own, a surprisingly nasty problem that we have kept off-stage until now.

This section replaces the blanket with a hundred pencils of light, and in doing so discharges one of the strangest requirements in the RFP: that a terminal dropped by parachute into a meadow must never search for its signal. To see why that requirement is strange, first meet the problem.

The problem: everything is moving

Stand in a village and listen on the radio to a satellite of the wheel sweeping overhead at 6.8 kilometers per second. You know the ambulance-siren effect: sound from an approaching source arrives pitched higher, from a receding one pitched lower. The cause is pure geometry — each wave crest is emitted a little nearer to you than the crest before it, so the crests reach you squeezed together: a higher frequency. From a receding source they arrive stretched apart: a lower one. Light and radio do the same, and astronomy long ago named the two cases after the ends of the visible spectrum the shifted light leans toward — a blue shift toward higher frequency when the source approaches, a red shift toward lower when it recedes. At orbital speeds this is no subtlety. As a satellite rises, crosses, and sets, the frequency a terminal actually receives slides across a window of ±460 kilohertz around the official carrier at Ka band. Timing is no better: depending on where you sit in the footprint, the satellite's signal takes anywhere from 7.3 to 12.1 milliseconds to arrive — a window 4.8 milliseconds wide, an eternity when symbols last microseconds.

A terminal that knows nothing must therefore search: sweep an old radio dial across nearly a megahertz of static, at every candidate timing offset, while the station drifts under its fingers — and repeat some of that work at every handover, every 11 minutes, forever. Terrestrial phones do a version of this, aided by databases and almanacs and their own GPS receivers. Our terminals are sealed boxes in a meadow, required to serve for ten years untouched. Every dial we ask them to sweep is a way for a village to lose its library. The RFP's TER-REQ-009 forbids it outright: no blind search.

So we must make the search unnecessary. The tool is the beam.

A choir instead of a dish

Our satellites do not carry one big dish pointed down. They carry a flat panel of hundreds of small antennas — at Ka wavelengths, a panel less than a meter across. How a sheet of little antennas comes to act like a steerable dish is worth building up in three small steps, because the rest of this proposal leans on it twice.

One small antenna. Drop a pebble in a pond: rings spread everywhere. A small antenna transmitting is exactly that — its signal ripples outward in every direction at once, wide and weak. It has no beam, and equally no blind spot. (Hold that thought. On the day a terminal wakes up in a meadow knowing nothing, an everywhere-at-once view will be precisely what it needs.)

Many, fired together. Now drop a straight row of pebbles, all at the same instant. Between the stones the rings overlap; straight ahead of the row, crest lands on crest, and they pile into one tall wave, while off to the sides crests meet troughs and flatten to almost nothing. The row now has a direction. The piling-up is called constructive interference, and the result is a beam: the power one antenna spread across the whole sky, gathered up and spent where the crests agree.

Stagger the entries. Fire each antenna a little later than its neighbor, and the line along which the crests agree tilts: the beam leans. That is the entire mechanism of the phased array. The staggers are picoseconds — neighboring antennas sit half a wavelength apart, five millimeters at Ka — and they are set by arithmetic, not machinery, so the beam swings in microseconds with nothing moving at all. Run several sets of staggers through the same panel at once, and it holds several agreements at once: hundreds of independent pencil beams from a single sheet of antennas, each aimed at its own patch of ground.

Watch the mechanism run. Drag the steering and read the staggers it costs; then flip to One singer to see the first step again — one element, no beam, everywhere at once. And note what the choir does not do: sing louder. No element spends one watt more in the choir than it did alone — the array creates no power at all. The lone singer's dome is one element's energy spread across the whole sky; the petal is everyone's ripples gathered into agreement. Focus, not force:

Stagger per neighbour
Beam angle
Moving parts0

The wave is slowed enormously for the eye; the geometry is honest. Neighbouring elements sit half a wavelength apart — five millimeters at Ka — so the staggers that swing the beam across the whole sky are a matter of picoseconds, shown live above. The shaded glow is where the power goes. Flip to One singer and the petal becomes a dome over the whole sky — one element's energy spread thin. No element ever sings louder in the choir; an array creates no power, it only gathers the ripples into agreement. And that everywhere-at-once dome is exactly the wide-open ear first contact will listen with.

A phased array is a choir, not a mirror. Every element sings the same note; the only thing that ever changes is when each one comes in. In step, the crests agree straight ahead. Stagger the entries by picoseconds and the line of agreement tilts: the beam steers, in microseconds, with nothing moving but arithmetic — and the same panel can run many staggers at once, which is how one sheet of antennas throws hundreds of independent pencils. Drawn as one slice: the real panel is a two-dimensional sheet of elements, and the same staggers steer in azimuth and elevation at once — the pointing is fully three-dimensional.

From 2,200 km, a one-degree pencil pointed straight down paints a spot about 19 kilometers in radius — a town and its fields, not a province. The settlements never move, so the map of spots is drawn once per ring pass and replayed; a satellite crossing the twilight band walks its beams from town to town like a lamplighter who knows every doorway on the street.

Watch the lamplighter work. The satellites cross left to right, each dragging its footprint — the stretch of ground that sees it at least 25 degrees up — across a row of fixed towns. Every pencil is pinned to its town, not to the sky: it leans as the satellite moves, and its spot on the ground stretches and tightens for reasons the next two sections will price exactly. Towns rise into the footprint and are granted a beam; towns setting out of it are dropped — and the satellite riding 30 degrees behind has already covered them, so the new pencil forms before the old one dies. Flip to One satellite to see the outage the ring exists to prevent:

Clock (real)
Pencils lit
Most-leaned spot
Towns dark

Time runs ~45× fast — a real crossing takes 16.6 minutes and a handover comes every 11 — and spots are drawn 8× size so they read at planet scale; their stretch is the honest farther · flatter · fatter geometry, up to 5.3× at the rim. Beams are pinned to towns, not to the satellite: watch a pencil lean, stretch, tighten overhead, and stretch again. Flip to One satellite to see what the ring is for: a setting town simply goes dark until the next pass.

The lamplighter at work. Each satellite holds a Ka pencil on every town inside its moving footprint — gaining a beam as a town rises past the 25° rim, dropping it as the town sets — and because the next satellite rides 30 degrees behind, every setting town is already covered: the new pencil forms before the old one is dropped, and the handover is a routing event, not an outage. Spot geometry and timing from spot_beams / the rings post, tags terminus-post-8..8d.

Every shift is one dot product

Before spending those pencils, be precise about what the satellite must correct. A user does not hear the satellite's whole 6.8 km/s — they hear only the part of it aimed at them: the projection of the velocity vector onto the line of sight. Call the velocity v and the unit vector from user to satellite , and the entire "problem" of the moving sky collapses into one line of arithmetic:

/// Rate of change of slant range (m/s, positive receding) for a ground user
/// anywhere in the footprint: the satellite's velocity vector projected onto
/// the line of sight — one dot product, `v · r̂`.
pub fn range_rate_at(body: &CentralBody, altitude: f64, along_track: f64, cross_track: f64) -> f64 {
    let user = ground_position(body, along_track, cross_track);
    let sat = [0.0, 0.0, body.radius + altitude];
    let omega = 2.0 * std::f64::consts::PI / orbital_period(body, altitude);
    let velocity = [(body.radius + altitude) * omega, 0.0, 0.0];
    let los = [sat[0] - user[0], sat[1] - user[1], sat[2] - user[2]];
    let slant = dot(los, los).sqrt();
    let los_unit = [los[0] / slant, los[1] / slant, los[2] / slant];
    dot(velocity, los_unit)
}

Multiply by the carrier over the speed of light and flip the sign, and that is the shift: shift = (f/c) · v·cos θ, where θ is the angle between the velocity and the line of sight. Ahead of the satellite θ is acute, the dot product positive, the range closing: a blue shift. Behind it θ is obtuse: a red shift. And for a user watching the satellite pass exactly abeam — displaced purely cross-track — the velocity is entirely sideways, the dot product exactly zero, the carrier received exactly as sent.

In the flat picture, then, the projection is a plain cosine. But a footprint is not a line drawn under the orbit — it is a disc 2,500 km in radius, and most of its villages sit off the track, where the line of sight leans out of the orbit plane altogether. That is exactly why the function above takes a dot product rather than measuring an angle: the dot product is the cosine, in whatever plane the two vectors happen to span, and sideways needs no special case:

One dot product, the whole footprint

satellitevon the track:a flat cosineoff the track:same dot productabeam: θ = 90°shift = 0zero linev · r̂motionshift = (f/c) · v · r̂ — in any plane, v cos θto scale: 2,200 km up, 2,518 km rim

The cosine survives the third dimension. For the user ahead on the track, velocity and sight line share a plane, and the shift is the flat-picture shadow v cos θ. For the user abeam, the sight line is perpendicular to the velocity: shift exactly zero — that is the map's zero line. And for the user off the track, the sight line leans out of the orbit plane entirely — yet the construction is unchanged, because v · r̂ is v cos θ for the true angle between the vectors, whatever plane they span. One rule, no special cases: which is why the satellite prices every beam with a single dot product and never asks where the beam points.

Evaluate that one product at every point of the footprint, and you get the satellite's Doppler weather map:

The Doppler map: blue ahead, red behind

blue shift+460 kHzred shift−460 kHz0motion100200300400nadir spot11.9 kHz acrossedge spotalso 11.9 kHzspots ×5 size

Where the shift lives. Every point ahead of the satellite hears the carrier high, every point behind hears it low, and the zero line is the one place the motion is entirely sideways. The contours crowd toward the center — yet no beam suffers for standing there, because toward the rim the beam's spot stretches by exactly the factor the contours relax: every spot in the footprint spans the same 11.9 kHz. Geometry charges each beam one fixed price, (f/c) · v · β.

One dot product

vθv cos θahead: bluebehind: θ > 90°, redsatelliteshift = (f/c) · v cos θ

How any point is priced. A user hears only the part of the satellite's velocity that points along the line of sight — the shadow v cos θ that the velocity casts on it. Approaching, the waves arrive compressed: a blue shift, received above the carrier. Receding (θ past 90°), stretched: a red shift, below it. One dot product per beam, and the satellite knows every shift in its footprint.

The whole map is shift = (f/c) · v · r̂ evaluated across the footprint: ±460 kHz at the rim of a 2,518 km blanket, and the reason no single beam should ever try to cover all of it. The map is drawn in the satellite's own frame for a reason: our access rings run along the twilight band, so “ahead” is north on the ascending half of a lap and south on the descending half. The geography flips every pass; the map never does — which is exactly why the correction is computed per beam, per pass, in orbit, rather than learned once on the ground.

Read the map the way the satellite does. The half of the footprint the satellite is flying toward hears the carrier high; the half it is leaving hears it low; the zero line runs cross-track through the point directly beneath it. And notice where the contours crowd: not at the rim but at the center. Straight overhead, a satellite crosses from approaching to receding in seconds, and the shift sweeps through zero so steeply that the two ends of a single nadir spot — thirty-eight kilometers apart — already disagree by 11.9 kHz. In contrast, those same thirty-eight kilometers out at the rim, where the shift is enormous but nearly flat, would disagree by barely 2 kHz. Yet look at the two spots drawn on the map: the small circle in the middle and the long ellipse at the rim span the same 11.9 kHz. That is not a coincidence, and it is the next thing to explain.

What a small spot buys

First, why the rim spot is stretched. A beam is not a patch of ground; it is a cone of fixed angle, and what it paints depends on where it lands. Pointed straight down, our one-degree cone meets the ground face-on from 2,200 km up: a 19-kilometer circle. Leaning toward the footprint's rim, the same cone pays three times over. It lands farther — the slant is 3,642 km, 1.66× the altitude. It strikes flatter — ground met at a 25-degree graze stretches a beam along the slope by 1/sin 25°, another 2.37×. And it leans fatter — a flat phased array steered 42 degrees off its face presents a foreshortened aperture, so the beam itself widens by 1/cos 42°, a final 1.35×. Multiply, and the rim spot is an ellipse 5.3 times longer than the nadir circle: ±102 km along the ground, ±32 km across.

Now the coincidence on the Doppler map resolves into a small law. In the orbit plane the received shift is (f/c) · v·sin η, where η is the nadir angle — how far off straight-down the beam looks. The shift a beam sweeps per degree of η is therefore (f/c) · v·cos η; and the beam's own width in η grows as 1/cos η. The two cancel to the digit:

Doppler spread of any beam  =  (f/c) · v · β

— carrier, orbital speed, beamwidth, nothing else. 11.9 kHz for every beam in the footprint, wherever it points, forever. Geometry sets one fixed price and charges every spot the same.

Delay is not so forgiving, but it is even simpler to price. How long a signal takes to reach a user is set by the slant range — the third side of a triangle this proposal has drawn before. Put the planet's center at O, the satellite at S, and the user at U, anywhere in the footprint. Two sides are known before anything moves: O→U is the planet's radius R, and O→S is R + h. In shelves of the sky we knew the elevation angle at U and solved this triangle with the law of sines; here we know the angle at O — the central angle γ, how far along the ground the user stands from the sub-satellite point — and two sides with the angle between them is the law of cosines:

d(γ)  = √( R² + (R+h)² − 2·R·(R+h)·cos γ )
delay = d(γ) / c

Two known sides, one known angle

OSUγR + hRR·γd(γ)3,642 km= 12.15 msγ = 0: 2,200 km= 7.34 msto scale

The triangle, solved the other way. In shelves of the sky we stood at U, knew the elevation angle, and used the law of sines. Here we stand at O and know the angle γ directly — it is nothing but the user's ground distance from the sub-satellite point, divided by R. Two sides and the angle between them is the law of cosines, and it hands over the third side d(γ) whole: 2,200 km and 7.34 ms straight down, 3,642 km and 12.15 ms at the rim, and every ring of the map below in between.

Which is the toolkit, verbatim:

/// Slant range (m) from a ground user at central angle `ground_angle` (rad)
/// to a satellite at `altitude` (m).
pub fn slant_range(body: &CentralBody, altitude: f64, ground_angle: f64) -> f64 {
    let r = body.radius + altitude;
    let big_r = body.radius;
    (big_r * big_r + r * r - 2.0 * big_r * r * ground_angle.cos()).sqrt()
}

One function, one input — and the input is nothing but distance from the sub-satellite point, which is why the equal-delay lines are perfect concentric circles: 7.34 ms in the middle, 12.15 ms at the rim, crowding outward as the ground falls away from the satellite. A beam, in turn, is just two values of γ. Centered at γ with an in-plane half-extent a on the ground, it touches its nearest ground at central angle γ − a/R and its farthest at γ + a/R, and its timing spread is one subtraction:

near = d(γ − a/R)        far = d(γ + a/R)
Δt   = (far − near) / c

The rim is exactly where the stretched spots land, so timing gets charged twice out there — the construction below draws that subtraction with a compass:

Delay: rings that crowd toward the rim

89101112.15 ms7.34 ms herenadir spot0.4 µs acrossedge spot617 µs acrossspots ×5 size

Where the wait lives. Slant range cares only about how far from the sub-satellite point you stand, so equal-delay lines are perfect circles — and they bunch up toward the rim, where the ground falls away from the satellite fastest. Timing is charged twice out there: the rings crowd, and the beam's spot stretches. The nadir spot sits between sparse rings — its rim trails its own center by just 0.4 µs. The rim ellipse straddles the crowd: 617 µs.

Same beam, two landings

satellite2,200 kmsame 1° beamnearfarΔfar − near = 185 km ⇒ Δt = 617 µsequal: 0.4 µsnear = d(λ − a/R)far = d(λ + a/R)Δt = (far − near)/cbeams ×5 width

Why the rim beam pays more. Both cones are the same 1° beam. Straight down, it lands 2,200 km away on flat-on ground: a 19 km circle whose two edge slants are equal — the whole spot spans 0.4 µs, the rim trailing the center by 113 m of path. Leaning to the rim it lands farther (3,642 km: 1.66×), strikes flatter (a 25° graze: 2.37×), and leans fatter (a tilted array's beam widens 1.35×): a spot 5.3× longer. Its timing spread is just the extra path: Δt = (far − near)/c = 185 km ⇒ 617 µs.

What the terminals inherit after each beam is pre-corrected to its spot center: ±6 kHz of frequency residual under every spot alike, at most ±308 µs of timing residual under the rim beam — versus the ±460 kHz and 4.81 ms a blanket would leave them to search.

Here, then, is the quiet miracle, and the reason this section exists. Across a full footprint, the two maps span huge windows — ±460 kHz, 4.81 ms — because positions differ wildly. But everyone inside one beam's spot stands in nearly the same place:

cargo run -p terminus-orbits --example spot_beams

Across the full footprint (a blanket beam):
  range rate at the edges: ±4.59 km/s  ⇒  Doppler window ±460 kHz
  slant range 2200-3642 km  ⇒  delay window 4.81 ms wide

One 1° phased-array beam paints:
  straight down: a circle of 19 km radius
  at the footprint edge: an ellipse ±102 km radial × ±32 km cross —
    farther (slant 1.66×) · flatter (1/sin 25° = 2.37×) ·
    fatter (scan broadening 1/cos η = 1.35×)  =  5.3× elongation

Doppler spread across any beam's spot: (f/c)·v·β = 11.9 kHz — the
same for every beam in the footprint

Delay spread across a beam's spot grows toward the rim:
  0.00 of edge: 0.4 µs
  0.25 of edge:  55 µs
  0.50 of edge: 144 µs
  0.75 of edge: 310 µs
  1.00 of edge: 617 µs

Seventy-seven times less frequency uncertainty, everywhere alike; eight times less timing uncertainty at the worst spot on the worst beam; purely from geometry, before any cleverness.

And now the cleverness costs nothing. The satellite knows its own orbit to the meter — orbits are clocks, as we said when scheduling the minds — and it knows exactly where each spot lies. So for every beam, it pre-corrects its own motion: transmits slightly off-frequency and slightly early, by precisely the amounts its trajectory will impose on that spot, so that at the spot's center the signal arrives exactly on frequency and exactly on time. A terminal anywhere in any spot sees residual errors of at most ±6 kHz — the same bound under every beam alike — and ±308 microseconds under the stretched beam at the rim, both within the ordinary tracking range of the humblest receiver. Nothing to sweep. Nothing to hunt. The terminal locks on the first thing it hears, because the first thing it hears is already correct. On the uplink, the satellite closes the loop the same way: it measures the terminal's first transmission, replies with a timing correction, and alignment converges in a single round trip — because inside a spot, the uncertainty was never larger than 308 microseconds to begin with.

The rock has a panel too

Now the confession we owe from three sections back. Every link budget so far said "a half-meter dish at the terminal," and a dish is a curved mirror: it looks along its own axis and nowhere else. To follow a satellite, it must be turned — a mount, a motor, two bearings, grease.

Ask what that mount would have to do here. Our sky has no fixed star to bolt onto; nothing stands still overhead. A serving satellite rises, crosses, and sets in about 16.6 minutes, and the terminal's Ka beam is a 1.4-degree pencil — aim it a couple of degrees wrong, and the link is gone. And the mount would not even get the full 16.6 minutes: the ring hands the link along at its own spacing, every 11 minutes, the next satellite already climbing before the current one sets. So the mount must track, smoothly, then whip across the sky to catch the next satellite, and do it again. Five and a half times an hour. 130 times an Earth day — this planet's own day runs 11.2 of those. 48,000 handovers an Earth year. For ten of those years, in weather, in dust, with nobody coming to service it — the RFP is blunt about that, and a bearing is the most reliably mortal thing an engineer can ship.

There is a second, quieter objection. A dish has exactly one beamwidth, forever, set by its shape. But the box on its first dawn needs a wide view to hear the beacon at all, and a narrow one to carry traffic afterward. One aperture, two jobs, and a mirror can do only one.

So the terminal is not a dish. It is the same thing the satellite carries, smaller and pointed the other way: a flat panel, half a meter across, lying face-up under the sky — the same choir of little antennas, the same staggered timings, the same beam steered by arithmetic instead of by motors. It repoints in microseconds, so a handover costs the antenna nothing at all. And for the beacon it does what no mirror could: it stops being a beam entirely — each of its little antennas alone hears the whole sky at once, the pond-ripple view from the top of this section, which is how a newborn box catches a signal it has no idea where to look for. First contact collects that debt in full. It has no moving parts, because there is nothing in it that moves. A settler could bolt it flat to a roof, or leave it lying in the grass where the parachute set it down, and never touch it again.

What the panel costs

Nothing is free, and this costs something honest. A flat face aimed straight up is a full half-meter of aperture to a satellite at the zenith. To a satellite low in the sky it is a half-meter face seen at a slant — foreshortened, like a coin tilted away from you until it is a thin ellipse. Less area presented means less signal, by the cosine of the tilt, and a little more besides because each small antenna also dims off its own axis:

/// Scan loss (dB) of a planar aperture steered `scan_angle` off boresight.
/// `rolloff` = 1.0 is the ideal projected-aperture law; real arrays fit 1.2-1.5.
pub fn scan_loss_db(scan_angle: f64, rolloff: f64) -> f64 {
    10.0 * rolloff * scan_angle.cos().log10()
}
cargo run -p terminus-orbits --example terminal_aperture

elev (deg)  scan θ    cosθ loss    ×1.2 loss  gain (dBi)  beam (deg)
        90      0°        +0.00        +0.00       41.71        1.40
        75     15°        -0.15        -0.18       41.53        1.45
        60     30°        -0.62        -0.75       40.96        1.62
        45     45°        -1.51        -1.81       39.90        1.98
        30     60°        -3.01        -3.61       38.10        2.80
        25     65°        -3.74        -4.49       37.22        3.31

Read the last column too: as the beam leans over, it also fattens, from a 1.4-degree pencil overhead to 3.3 degrees at the horizon — the same foreshortening, seen from the other side.

And now the reason this is a cost and not a risk. Look at where the table stops. Our coverage rule from rings over twilight already promises that somewhere in this sky, always, everywhere along the twilight band, a satellite stands at least 25 degrees up. The panel is therefore never asked to lean further than 65 degrees off vertical, ever, anywhere, for the life of the system. Its worst moment costs 4.5 decibels — and there is no worse moment. A decision that hands you a bounded, worst-case, computed-once number is a decision that has stopped being an argument.

We pay those 4.5 dB out of link margin rather than out of the box. Holding full gain down at 25 degrees would want a 0.84-meter panel — two-thirds wider, nearly triple the area, on ten thousand boxes today and a million later. The MEO trade taught us where the expensive hardware lives, and it is never in orbit.

One last reassurance, for the reader who saw a link budget shift and worried about the section before this one. Scan loss does not care what frequency you are using — a tilted coin is tilted at every wavelength — so it subtracts equally from every band and cancels out of the comparison between them. Ka beats L-band by 25.5 dB with the panel pointed at the zenith, and by 25.5 dB with it leaning 65 degrees over. The band plan stands exactly as written; only the absolute margin moved, and we knew we owed it. The aperture decision itself is recorded as ADR-0013.

Where complexity should live

Step back and see the design philosophy, because it governs everything on this planet. Our patron can manufacture spacecraft of arbitrary sophistication — but the ten thousand boxes under parachutes must work, untouched and unexplained, in the hands of a civilization that has not yet invented the vacuum tube. So every hard problem that can move to orbit, must. The satellite computes the beams, corrects the physics, measures the offsets, commands the fixes. The terminal listens, locks, and serves WiFi to a curious child. One side of the link is a marvel; the other side is almost a rock — and it is precisely the marvel's job to let the rock stay a rock.

The network moves so the terminals never search. Recorded as ADR-0006, with the residual budgets — ±6 kHz, and the swept ±308 µs rounded up to a ±310 µs ceiling — written into the requirement it discharges.

One case remains uncovered, and it is the very first one. Everything above assumes the terminal already knows which spot it is in and which satellite to listen for. But the box in the meadow, on its first dawn — no almanac, no clock, no idea what sky it fell under — knows nothing. How the very first contact happens, from parachute to full service in under fifteen minutes, is the next section: first contact.