Build1 distinct publisher3 min readPublished
Per-client byte diffing needs the server to know what each of thousands of sockets already holds. Old Light states added, removed and updated facts instead, and its visibility rules fall out of the same design.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
The scrub function is the part worth reading closely, because it behaves as a default and not as a filter. Six fields are copied unconditionally into the public player row: id, name, kind, spawn, score, and owned, with each owned hex reduced to coord, name, score and an empty buildings array [16]. Two more are carried only when set, protectedUntil and banner [18]. That is eight fields at most [21]. Credits, transits and unread counts are not blocked anywhere; they are simply not on the list, and a field added to the player type later stays private until somebody promotes it [17]. The stated reasons for the two promotions are specific: a rival sees the beginner-protection countdown because otherwise a refused attack looks like a bug, and the crest is cosmetic [19]. Decisions with a reason attached, which is more than most allowlists get.
Absolute values are what make one broadcast safe for a tab that slept through part of the stream. Every value in a delta is the new total and the client assigns it, with no arithmetic against what it already holds [10]. A duplicate lands on the same state, and a message that never arrives leaves the client stale but not corrupted, because the next update of that entity is also the whole truth [11]. Increments would need exactly-once, in-order delivery, which a browser tab reconnecting on a different network does not provide [12].
What the post does not address is reordering. Replace keyed by id [10] is last write wins, so an older player row arriving after a newer one regresses the client until that entity is touched again. The delta already carries serverNow [5], which is the obvious place to hang a per-entity version check if that ever bites in production.
This design transfers under conditions. Your state has to be addressable by stable ids, because the merge is a map lookup [10]. Your visibility boundary has to line up with per-entity fields, because that is the granularity the scrub operates at [16]. And your clients have to tolerate being briefly stale, because dirtySectors carries no payload: it names a surface that moved and leaves the client holding it to go and read it [6].
That last condition is where the accounting sits. Pushing full marketplace payloads to every socket spends bandwidth on sockets that are not looking; naming the stale surface instead spends one request per client that is [6]. For a board watched by a few players out of many, the trade is clearly right, and it inverts when the ratio does. Deal updates avoid the question entirely by going only to the negotiation's two parties [7].
The visibility property is structural rather than defensive. One empire event produces two messages [14], and the public one never holds economy, build queue, fleet or credits at any point in its life [20], while the private one does. The server never has to remember who is allowed to see what, because the message it sent was already the answer [8].
Ranked by verification strength, evidence, and original report placement.
Old Light is a browser strategy game where a tab can stay open for days.
The Old Light client holds a full copy of the galaxy state it is allowed to see, and the server keeps it honest by sending every change as a world.delta message that the client merges into what it already has.
Byte diffing requires the sender to know which version the receiver holds.
The WorldDelta interface has added.players, removed.playerIds, updated.players, updated.sectors, updated.dirtySectors, updated.tradeBoard, updated.deals, and a serverNow timestamp.
dirtySectors marks map data that went stale and must be refetched; two of the delta fields carry no payload and instead say a surface moved, so a client with that surface open goes and reads it, which keeps a busy marketplace off every socket that is not looking at one.
A deals update reflects a negotiation that moved, and only its two parties receive it.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 30, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
build
Three manual interventions in a month, and every guard was working as designed1 distinct publisher
build
Six MariaDB versions, one real difference: the only reason to leave 10.6 is the July 2026 clock1 distinct publisher
build
Force the tool call, then hand Lightsail a long-lived key1 distinct publisher
build
Separating moderation rejections moved one API gateway's success rate from 95.5% to 98.9%1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
One implementer, real code, no numbers
The strongest thing going for this reporting is that the artefacts are on the page: the WorldDelta interface, the two-line merge, the scrub with its conditional promotions are quoted rather than described, so the mechanism claims stand on their own. Everything around them is thinner. There is no repository to read, no test, no second engineer, no before-and-after byte count, and the account itself cuts off mid-sentence on the capture merge — the one case the author flags as subtle.
Nothing counted
Old Light is presented as a running game with tabs left open for days, but no quantity of any kind appears — no players, no concurrent sockets, no other project reported using this delta shape. The thousands of sockets in the argument are a design target, not observed traffic, and we won't convert a hypothetical into uptake.
Underclaimed, one unpriced premise
The developer calls his own scheme textbook, then spends most of the post on ways it breaks: a message arriving twice, a tab asleep for hours, an empty owned list that must never be read as a wiped empire. That is the opposite of a pitch, and it is why the story reads as slightly undersold rather than inflated. The single reach is the cost argument against per-client diffing — asserted, not benchmarked, and passing unchallenged mainly because it matches what everyone already believes.
A builder writing up his own build
This is a developer describing his own game on a personal-publishing platform, so the design is also its own review: no adversary, no dissenting engineer, no cost to being wrong. What restrains it is the shape of the reward — a post like this earns readers by looking sharp about edge cases, not by claiming traction, and it behaves accordingly. There is no product to buy and no metric being talked up.
Firm on mechanism, blind past it
What Old Light's protocol does, we can state plainly, because the contract and the scrub are printed and internally consistent. Whether it holds at the scale it invokes, and whether the unfinished capture rule closes the last hole, we cannot say at all. That split — high certainty about design, none about behaviour — is what puts this in the middle of the range rather than either end.