A 1D Burridge-Knopoff chain of N=30 blocks rests on a frictional surface. Each block is coupled to its two neighbors by springs of stiffness kc, and pulled forward by a slowly-creeping tectonic plate through a loading spring of stiffness kℓ. The instantaneous force on block i is
Fi=kℓ(Xplate−xi)+kc(xi−1−2xi+xi+1).
Each block carries an independent static-friction threshold Fs(i) drawn from a narrow distribution — the in-built **heterogeneity** of a real fault zone. Blocks **stick** as long as ∣Fi∣≤Fs(i) and **slip** when the loading plate has wound the springs tight enough to exceed it. A slip releases stored elastic energy by jumping the block until its force drops to −sign(F)ηFs(i) (dynamic-friction undershoot, η<1); that sudden displacement perturbs the neighbors via the coupling springs and can push *them* over threshold too. The cascade of slips that propagates from one nucleation site **is** the earthquake; its size s — number of blocks that slipped before the chain quiets — is a proxy for seismic moment.
Bin events by magnitude M=log10(s) and accumulate a histogram of counts N(M). The hallmark observation of seismology, the **Gutenberg-Richter law**, is that
log10N=a−bM,
with b≈1 across most tectonic regions. The same line emerges here from nothing but threshold heterogeneity + nearest-neighbor coupling + slow uniform loading; the running least-squares fit is drawn live in yellow over the histogram bars as the catalog grows. The block strip up top is colored by current ∣Fi∣/Fs(i) — cool teal is well below threshold, hot red is right at the brink — and lights up white at the moment of slip so you can watch ruptures propagate along the chain. **Interaction:** dragging the mouse from top to bottom of the canvas scrubs the tectonic loading rate vℓ from glacially slow (rare, system-spanning quakes) to fast (frequent small ones, smaller b). Clicking a block injects a localized stress perturbation — manual nucleation of a quake at the cursor.