This project has been succeeded by GraphReFly. New development happens at graphrefly-ts. npm install @graphrefly/graphrefly
Skip to content

Engineering Blog

Behind-the-scenes stories from building callbag-recharge — the architecture decisions, the bugs that taught us something, and the ideas that didn't survive contact with reality.

The callbag-recharge Chronicle

Arc 1: Origins — Why Revive Callbag?

#PostDateRead time
1Callbag Is Dead. Long Live Callbag.March 21, 20268 min
2The Protocol That Already Solved Your ProblemMarch 21, 202610 min
3Signals Are Not EnoughMarch 21, 202610 min

Arc 2: Architecture v1 — The Naive First Attempt

#PostDateRead time
4Push Dirty, Pull Values: Our First Diamond SolutionMarch 22, 20268 min
5Why Explicit Dependencies Beat Magic TrackingMarch 22, 20268 min
6The Inspector Pattern: Observability as a First-Class CitizenMarch 22, 20268 min

Arc 3: Architecture v2 — The Great Unification

#PostDateRead time
7Data Should Flow Through the Graph, Not Around ItMarch 23, 20269 min
8Two-Phase Push: DIRTY First, Values SecondMarch 23, 20269 min
9From Pull-Phase to Push-Phase MemoizationMarch 23, 20268 min

Arc 4: Architecture v3 — The Type 3 Breakthrough

#PostDateRead time
10The Day We Read the Callbag Spec (Again)March 24, 20267 min
11Why Control Signals Don't Belong in the Data StreamMarch 24, 20267 min
12RESOLVED: The Signal That Skips Entire SubtreesMarch 24, 20267 min
13Five Primitives, Two Tiers, Zero SchedulersMarch 24, 20268 min

Arc 5: Architecture v4 — Performance Without Compromise

#PostDateRead time
14Output Slot: How null->fn->Set Saves 90% MemoryMarch 25, 20267 min
15When We Removed the ADOPT ProtocolMarch 25, 20266 min
16Lazy Tier 2: The switchMap Footgun We Had to KillMarch 25, 20266 min
17Bitmask Flag Packing in TypeScriptMarch 25, 20266 min

Arc 6: Correctness Stories

#PostDateRead time
18Diamond Resolution Without Pull-Phase ComputationMarch 25, 20266 min
19When Not to Dedup: Understanding Callbag Operator SemanticsMarch 25, 20265 min
20Benchmark Regression Exposed 3 Operator BugsMarch 25, 20265 min
21The Cost of Correctness: 9.8M ops/sec vs Preact's 34MMarch 25, 20266 min

Arc 7: From Library to Platform

#PostDateRead time
23Stores All the Way Down: Adding State to Reactive ProgrammingMarch 25, 20266 min
24Why Our Computed States Are Eagerly ReactiveMarch 25, 20266 min
25From Zustand to Reactive OrchestrationMarch 25, 20266 min
26The Missing Middle: Why Signals Aren't Enough for AI StreamingMarch 25, 20266 min

Arc 8: Engineering Deep Cuts

#PostDateRead time
22Promises Are the New Callback HellMarch 25, 20266 min
27switchMap Error Handling: The Bug That Tests Didn't CatchMarch 25, 20265 min
28Skip DIRTY: How We Halved Dispatch for Single-Dep PathsMarch 25, 20265 min
29Bitmask Overflow at >32 DependenciesMarch 25, 20265 min
30Why We Don't Use queueMicrotask (And Neither Should You)March 25, 20265 min

Released under the MIT License.