Edinburgh University Releases a Free 20-Page Paper: The Simple Math Behind ChatGPT

Fed up with AI jargon, a statistician re-explained the large language model from scratch using the standard language of his own field.
By 爱丁堡大学 CRC Working Papers08-10 · 14 min read⚑ Research paper
🎧 Listen to the podcast0:00 / --:--
0:00 / --:--
Research Deep Dive · Xiaohu Insights
The 60-Second Read
  • A researcher with decades of experience in statistical modeling wanted to understand LLMs but got tripped up by terms like attention, Query, and Key. His conclusion: the math isn't hard—it's the jargon that's the barrier.
  • So he wrote a free 20-page paper re-explaining the math inside ChatGPT using standard statistical terminology. All you need is three things from your first year of university.
  • Attention, the most hyped concept, is just a weighted average that a high school student could grasp. The real complexity lies elsewhere.
The Backstory

A Math Expert Couldn't Read AI Papers, and He Blames the Jargon

The Credit Research Centre (CRC) at the University of Edinburgh Business School has published a free 20-page paper titled "The Simple Mathematics of Large Language Models." After reading it, you'll be able to explain exactly what's being computed inside ChatGPT and Claude, without wading through multi-hundred-page deep learning textbooks. All it requires is a working knowledge of matrix multiplication, conditional probability, and the concept that statistical model parameters are estimated from data.

The author is Joseph L. Breeden, who has spent decades working on nonlinear systems modeling, statistics, and linguistics, and runs his own analytics company. He expected reading about LLMs to be straightforward, but the vocabulary tripped him up:

"A token isn't a 'query.' Linguists don't say 'key.' And what in the world is a 'head'? I could guess these words came from computer science, but even the 'no-jargon' explainers start throwing around query, key, value. So let's just start over."

Joseph L. Breeden, "The Simple Mathematics of Large Language Models"

Attention, Query, Key, Value, head—these terms were borrowed from database theory, cognitive science, and electrical engineering. These borrowings are imprecise, and they hide the fact that the math is actually quite ordinary. So he replaced all of them with names that already exist in statistics, explaining along the way what was wrong with the original terms. This renaming effort is the paper's second major thread; we've compiled it into a glossary at the end of this article.

The Problem

An LLM Does One Thing: Guess the Next Word

A language model takes a piece of text and outputs a probability distribution for what the next word might be. Given "The cat sat on the," the words mat, floor, and chair will get high probabilities, while democracy gets a probability close to zero.

Writing an essay just repeats this one action hundreds of times: compute a probability distribution, pick a word, add it to the context, and repeat. You can step through this loop in the demo below.

Click a step, and the model writes one more word
The cat sat on the ?
mat42%
floor18%
chair9%
democracy≈0%
In this step, the model does one thing: assign a probability to every word in its vocabulary. It picks the word with the highest probability—mat.
The cat sat on the mat ?
. (period)37%
and14%
while8%
purple≈0%
The freshly written mat is now part of the context. The same process repeats, but the probability distribution looks completely different this time.
The cat sat on the mat. It ?
was25%
looked12%
purred7%
democracy≈0%
The longer the context, the more constrained the choices become. Knowing that "It" refers to the cat requires the first half of the sentence. How that works is the topic of the next few sections.
The patient was diagnosed with a rare ?
blood disease29%
genetic disorder21%
tumor12%
Tuesday≈0%
Same process, different language and topic. When you read that sentence fragment, you also know a disease name is coming. That's the predictability the model has learned.
Interactive demo (made by us; percentages are illustrative, not measured): Four steps walk through the complete loop—"compute probabilities → pick a word → add it to the context → repeat." Writing a full essay is this loop repeated hundreds or thousands of times.

Why does modeling the probability of a sequence of words suffice? Probability theory gives us an identity called the chain rule (an identity, not an assumption): the probability of an entire sentence can be factored into a product of conditional probabilities—the probability of the first word, times the probability of the second word given the first, times the probability of the third given the first two, and so on. So if you can compute "the next word given the context," you've modeled the entire language. That's all an LLM does.

Where the Difficulty Lies: More Contexts Than Atoms in the Universe

The challenge isn't the formula itself; it's the number of possible contexts. With a vocabulary of, say, 50,000 tokens, a 10-word context has 50,00010 possible combinations—a number larger than the estimated number of atoms in the observable universe. Looking things up in a table is hopeless. You can't store a probability table for every possible context.

So you have to learn a function that generalizes: if you've seen "the cat sat on the mat," you can handle "the dog lay on the rug." The rest of the paper is about what that function looks like.

Two reality checks. First, calling LLMs "stochastic parrots" doesn't hold up—a parrot stitches phrases from shallow frequency, but an LLM processes substantial context before generating the next word. If the context is "Genie explained she couldn't clean the floor because…", the next word is almost forced. Second, a cold shower the other way: an LLM is, strictly, a finite-order Markov model. The context window is a hard limit; anything outside it is, in principle, invisible to the model, no matter the data.
Representation

Machines Don't Read: Words as Points, Similar Ones Nearby

The lazy approach is to give each token an ID: word 1, word 2, etc. In math, that's a long vector with a single 1 and zeros elsewhere. But that's like declaring all words are unrelated: the distance from "cat" to "dog" equals that from "cat" to "however." Clearly wrong. Cats and dogs are both animals, both pets, and both nouns.

A better approach: represent each word as a point in a high-dimensional space (typically 1,000 to 10,000 dimensions), placing words with similar meanings or grammatical functions close together and unrelated words far apart. The coordinates are learned from data during training; no one sets them by hand. This technique is called an embedding. In statistical terms, it resembles Principal Component Analysis (PCA): compressing many attributes into fewer dimensions. The resulting dimensions may have intuitive meanings, or not.

Similar words are close together cat dog rabbit Animals cluster together mat rug Household items form another cluster however (far away) You can even do arithmetic with the points. king − man + woman ≈ queen (the most famous example from word2vec)
Illustration (drawn by us): Once words become points in space, "similarity" becomes measurable distance, and "gender difference" becomes a direction you can add or subtract.

This idea has roots in linguistics. In 1957, linguist J.R. Firth observed, "You shall know a word by the company it keeps." Words in similar contexts tend to have similar meanings. Models learn word embeddings precisely by exploiting this rule: words that can be substituted for each other in many sentences end up with similar vectors. Word2vec in 2013 proved this approach works and produced that famous example: king − man + woman ≈ queen.

The Catch

But a Word Has Many Meanings, and One Point Isn't Enough

Once we have our points, a new problem appears. Consider the English word bank:

Click a sentence to see where the word bank gets pulled
I deposited money at the bank.I went to the bank to deposit money.
Money-related cluster River-related cluster Action-related cluster money loan river shore tilt turn bank The same word "bank" lands in three different clusters in three sentences
The left cluster is for money-related words. "bank" sits right in the middle of them.
We walked along the river bank.We took a walk along the river bank.
Money-related cluster River-related cluster Action-related cluster money loan river shore tilt turn bank The same word "bank" lands in three different clusters in three sentences
Same word, but now it's in the river cluster. The word itself didn't change; the surrounding words moved it here.
The plane banked sharply left.The plane banked (tilted) sharply to the left.
Money-related cluster River-related cluster Action-related cluster money loan river shore tilt turn bank The same word "bank" lands in three different clusters in three sentences
Third sentence, third set of neighbors. A single static point can't be close to all three clusters at once.
Interactive demo (made by us; positions are illustrative): The English verb "run" has dozens of senses, and "set" has over 400 dictionary definitions. So what we really need is a point that shifts based on context.

What we need is a point that deforms with context: the same "bank" is near "money" in the savings sentence, near "river" in the walking sentence, shaped by the surrounding words. A single fixed point per word isn't enough. The entire transformer architecture exists to perform this shaping.

Core Mechanism

Attention Sounds Mysterious, But It's a Weighted Average

This is the heart of the paper. The author's demystification of attention boils down to one sentence: mathematically, it's a weighted average. The only clever part is that the weights are learned from data, not set by hand.

Understanding Weighted Averages

Calculating a final grade: homework counts for 30%, the final exam for 70%. You're combining several numbers into one, but each number has a different say. When an LLM computes a new representation for a word, it's doing the same thing—averaging the vectors of all the surrounding words, but the "how much does each count" is learned by the model.

Take "The cat sat on the mat." Suppose we want a new, context-aware representation for sat. "cat" is the subject (who is sitting), so its weight should be large. "mat" is the location, so it gets a medium weight. "the" is a function word with little semantic content, so its weight should be small. Use these weights to average the content of each word, and the result is a "sat" that knows about the cat and the mat.

Click a word to see who it gathers information from when computing its new representation
The cat sat on the mat
Thefunction word, ~none
catsubject: who is sitting
satitself
onpreposition
thefunction word
matlocation: sitting where
Averaging these six pieces of content with the weights above gives you a "sat" that knows it's a cat sitting on a mat.
The cat sat on the mat
Thearticle, marks it as specific
catitself
satwhat the cat is doing
onpreposition
thefunction word
matthe scene
Notice the difference from the previous screen: when computing "sat," "cat" contributed 72%; when computing "cat," "sat" contributed 64%. Those aren't the same. Influence is directional. Who influences whom has to be computed separately. That's the number one reason the three matrices exist.
The cat sat on the mat
Thefunction word
catwho's on it
satwhat it's used for
onpositional relation
thearticle
matitself
Same sentence, same parameters, but compute for a different word and the entire weight distribution changes. This is done for every position, and you've completed one layer.
Interactive demo (made by us; weights are illustrative, not measured): Computing for these three words shows how each word gathers information differently and asymmetrically from the same sentence.

The author makes two renames here. He calls the jargon term attention score the influence score and attention weight the influence weight. His reasoning: the latter names describe what the number actually does in the computation, while the former are just anthropomorphic metaphors.

How to Compute the Weights: The Dot Product

The more aligned two vectors are, the larger their dot product. If they point in opposite directions, the dot product is negative. The dot product was chosen for two reasons: it's the simplest of all similarity measures and fast to compute; and it's differentiable, which is required for gradient descent learning.

What a Dot Product Feels Like

Two people pushing a car: if they push in the same direction, their forces combine at maximum strength. If one pushes east and the other north, only part of the force is combined. If they push against each other, they cancel out. A dot product measures how aligned the two forces are.

Why Not Just Dot Product the Word Vectors Directly? Why the Three Matrices?

In the jargon, these three matrices are called Query, Key, and Value. The author rejects this database metaphor and uses neutral labels WA, WB, and WC. Position i isn't "querying" anything; there's no database and nothing is being "looked up."

Passing each word vector through its own linear transformation before taking the dot product solves two specific problems:

Problem 1
Influence is Asymmetric

The influence of "cat" on "sat" is not the same as the influence of "sat" on "cat." But the dot product is inherently symmetric (a·b always equals b·a). Having each side pass through a different matrix before the dot product makes asymmetry possible.

Problem 2
"Why It Influences" and "What It Passes Along" Are Different Things

The features that determine "should this word have influence?" aren't the same features as "what content is actually passed along?" One matrix handles the former, the other handles the latter, and the model can learn the distinction.

The paper's own example clarifies the second point. Still computing the representation for "sat":

Features extracted by WB
Why does "cat" get a high weight?

Because of syntax: it's the subject of this verb, a noun in subject position.

Features extracted by WC
What does "cat" actually pass along?

Semantic content: this subject is an animal, small, domesticated.

"I have a grammatical relation to this verb" and "I am a cat" are two different kinds of information. Splitting them into two matrices lets the model learn them separately. What's in these matrices initially? Random numbers that extract nothing. It's only through training on trillions of tokens, with the parameters repeatedly adjusted, that they become useful feature extractors. These structures are found, not designed.

From Scores to Weights: The Real Name for Softmax

Dot products can be positive or negative, so they can't be used directly as weights. They are first divided by √k (where k is the vector dimension) to prevent numerical issues, then passed through an exponential normalization, which turns a list of real numbers into a set of non-negative weights that sum to exactly 1.

Another Renaming

Neural networks call this step softmax. But statisticians have known it for ages: it's the inverse transform from "log-odds to probability" in multinomial logistic regression. The name "softmax" only describes its computational nature (it's a smooth version of argmax). It says nothing about what it is statistically.

Two further notes for the mathematically inclined. First, the entire influence score is a bilinear form. Factoring it into two smaller matrices multiplied together is called low-rank parameterization, which reduces the number of parameters and acts as a form of regularization against overfitting. Second, these matrices are not uniquely determined: multiplying them by an orthogonal matrix leaves the predictions completely unchanged. So don't expect to decompose one of these matrices and "read off" what it has learned. This is the same old problem as in factor analysis, where factors are only determined up to a rotation.

Parallelism

"Multi-Head" Isn't Mysterious: Dozens of Sets Learn in Parallel, and the Division of Labor Emerges on Its Own

One set of WA/WB/WC can learn only one pattern of influence. But words relate to each other in more than one way: subject-verb is a syntactic relation, near-synonyms have a semantic relation, a pronoun referring back to a previous noun is an anaphoric relation, and adjacent words often have grammatical ties.

The solution: run H sets of matrices in parallel, let each learn its own thing, then concatenate the outputs and project back to the original dimension. In practice, H is typically between 12 and 96.

Same sentence, three sets of matrices each draw their own connections Marie said she was tired Set 1: connects subject and verb Marie said she was tired Set 2: connects "she" back to "Marie" Marie said she was tired Set 3: only adjacent words
Illustration (drawn by us; lines are illustrative): Post-hoc analysis of a trained model does show some relation groups tracking syntax, some tracking anaphora, and some just tracking proximity. But the correspondence isn't neat. Some groups seem to capture patterns that linguistics has no name for.

The jargon calls each set an attention head. This term draws the paper's strongest criticism. "Head" suggests a designed, specialized component, like the read/write head of a hard drive, each responsible for reading specific data. The reality is the opposite,

Nobody Assigns Roles

Nothing tells set #7 to handle pronoun resolution or set #12 to handle subject-verb agreement. The H sets share an identical structure, all start from random initialization, and are all trained on the same objective (predicting the next word). The division of labor emerges during training on its own: if two sets become identical, that's wasted capacity, so there's an implicit pressure pushing them to differentiate.

This has a direct analogue in statistics. In factor analysis, factors differentiate for the same reason: it's more efficient to explain different sources of variance separately. No one assigns them roles. So the author suggests calling these parallel sets "relations," acknowledging that the original architectural inspiration came from linguistics while also acknowledging that the learned patterns only partially match linguistic categories.

Architecture

Stack Dozens of Layers, Remember Word Order, and the Machine Is Complete

One pass of weighted averaging is only enough for words to absorb nearby information. But some dependencies span a long distance. Consider this sentence:

"The scientist who discovered high-temperature superconductors won the Nobel ____ Prize."

The blank is almost certainly "Physics," but to figure that out, you have to connect "Nobel Prize" all the way back across the long relative clause to "superconductors" and "scientist." The solution is to stack many layers of this weighted-average operation, feeding the output of one layer into the next. Modern LLMs stack 32 to 128 layers, each with its own complete set of parameters, sharing nothing with the other layers. This is where the explosion in parameter counts comes from: a model with a dimension of 12,288, 96 layers, and 96 relations per layer has hundreds of billions of numbers in these matrices alone.

The output of one layer is the input to the next Layer 96 ⋮ Layer 2 Layer 1 Embedding + position Residual stream: goes straight through, no attenuation ① nonlinearity: prevents collapse ② residual: prevents vanishing gradients ③ normalization: prevents divergence Every layer has these three, each fixing one problem
Illustration (drawn by us): Combine all of this—embeddings, positional information, dozens of stacked layers, each layer's weighted average and feed-forward transform, and a final projection—and you have the transformer, named in 2017. Today's LLMs use a simpler variant: one stack of layers, generating one token at a time.

The Three Additions in Each Layer, Each Fixing One Problem

The nonlinearity prevents "wasted stacking." The most common choice is ReLU, which does exactly one thing: turns all negative numbers into zero. Without it, multiple layers of linear transformations collapse into a single layer (linear composed with linear is still linear), so stacking layers has no effect.

The residual connection prevents training signals from failing to propagate. Instead of recomputing the entire representation in each layer, it makes an incremental correction: output = input + correction. During training, the prediction error must be backpropagated from the last layer to the first. The chain of multiplied derivatives shrinks exponentially, meaning early layers get no signal—this is the vanishing gradient problem. The additive structure ensures there's always an identity path in the derivative, so the signal has a route back.

Normalization prevents numerical values from spiraling out of control. After each step, the vector is scaled to have mean 0 and variance 1, so numbers don't grow or shrink unstably across dozens of layers.

One More Thing: This Machine Is Naturally Blind to Order

There's a pitfall we skipped. The weighted-average operation treats the context as a bag of words, not a sequence. Shuffle the words in a sentence, and the computed influence scores remain unchanged. But "dog bites man" and "man bites dog" are clearly not the same thing.

So position has to be fed in explicitly. An early approach was to add a "position vector" to each word embedding, marking it as the nth word. The problem is extrapolation: if the model never saw the 10,000th position during training, its vector is effectively untrained, and performance degrades on long texts.

Linguistic intuition, however, says what matters is relative position—whether a verb is two words away from its subject is the same whether they're at positions 5 and 3 or 500 and 498. The now-dominant RoPE (Rotary Position Embedding) follows this logic: instead of adding a vector, it rotates the vector by an angle proportional to its position. When computing the dot product, the two angles automatically subtract, leaving only the distance between the two words. The alternative, ALiBi, is simpler: the influence score is penalized linearly with distance, leaving the word vectors themselves completely unchanged.

Training

Training Is Simple: When You Guess Wrong, Adjust Until You Guess Right

With the structure in place, how are those hundreds of billions of numbers determined? Let's look at the output side: the final layer's representation is dot-producted with the output vector of every word in the vocabulary, and the result is passed through that same softmax from before. That yields the probability distribution for the next word. The author points out a useful fact: this final step is a multinomial logistic regression with 50,000 classes, using the final representation as input features.

The training objective is maximum likelihood, the standard recipe in statistics: adjust the parameters to maximize the probability the model assigns to the sentences that actually occur in the training corpus. Taking the logarithm turns the product into a sum, which is equivalent to minimizing the cross-entropy.

Cross-Entropy in Plain English

It measures "how surprised the model is by reality." If a weather forecaster says 90% chance of rain, and it rains, you're not surprised. If they say 1% chance, and it pours, that's a major failure. Training is just pushing that failure rate down, step by step.

The actual next word was "mat." How much probability did the model assign to it?
The cat sat on the matThe model assigned 90% to "mat," almost a perfect guess.
Surprise0.11 · barely any penalty
This step barely requires any adjustment. Most of the positions the model has already learned look like this.
The cat sat on the matThe model assigned 50% to "mat," not very confident.
Surprise0.69 · mild penalty
Cut the probability in half, and the penalty jumps more than sixfold. It doesn't let "close enough" slide.
The cat sat on the matThe model assigned only 10% to "mat," a wrong bet.
Surprise2.30 · heavy penalty
Gradient descent will use this penalty to push all parameters in the direction of "don't do that again."
The cat sat on the matThe model assigned only 1% to "mat," meaning it had no idea.
Surprise4.61 · maximum penalty
Drop the probability from 10% to 1%, and the penalty doubles again. This is the worst case: no predictability at all for what actually happened.
Interactive demo (made by us): Surprise is −log(probability the model assigned to the actual word). The four values are computed with natural logarithm. Training for trillions of steps just squeezes these bars down, one by one.

How do you minimize it? Gradient descent. The entire model, from embeddings to output probabilities, is a composition of differentiable functions. The chain rule of calculus gives you the derivative of the objective with respect to any parameter, and the rest is handled by software. In practice, training uses stochastic gradient descent: the derivative is estimated from a small batch of data at each step. The estimate is noisy but unbiased, and convergence still happens.

The author cautions against thinking of training as "one giant stew"—that's a misconception. Real frontier model training happens in several distinct stages, each carefully designed:

Stage 1
Pre-train on raw text

The learning rate warms up and then decays, and training data is often ordered from simple to complex (a technique called curriculum learning). This stage learns the rules of language itself.

Stage 2
Fine-tune with human examples

Supervised fine-tuning makes it useful, and then Reinforcement Learning from Human Feedback (RLHF) aligns its outputs with human preferences.

His analogy is human education: children go to school in stages, building foundations before tackling advanced material. No one is immersed in all knowledge at once. LLM training has converged on the same idea.

100B–1T+

tokens of training data: books, articles, web pages, code

Thousands

of specialized processors, running for weeks to months

$1M+

cost for a single training run

What you get is a model that has read more text than any person could in a lifetime. And considering how much writing has been produced and then never read by anyone, it may have read more than all of humanity combined.

Capabilities & Limits

The Model Learns a Great Deal, But Four Things Are Structurally Impossible

Dissecting a trained model reveals that structures no one wrote in have emerged on their own. Some relation groups track syntax, others track pronouns back to their referents. Shallow layers tend to handle local grammar and parts of speech, while deeper layers move toward semantics, discourse structure, and long-range relationships. At sufficient scale, a qualitative change occurs—from the GPT-3 generation with 175 billion parameters onward, coherent writing, reasoning-like question answering, factual knowledge, translation, summarization, and code generation all emerge.

The author places this in the broad family of "emergence": thermodynamics emerges from statistical mechanics, fluid dynamics from molecular interactions, and the complex choreography of bird flocks from a few simple rules each bird follows. Macroscopic phenomena arise from microscopic mechanisms, and you can't see it by staring at the low-level rules. Why a goal as simple as "predict the next word" grows capabilities that no one explicitly wrote in, at sufficient scale, remains an open scientific question.

The other half has to be said: four things are structurally impossible for this mechanism.

No Grounding

It learns only from text. It has no sensory experience, and therefore no way to check its statements against reality.

Confident Fabrication

The model optimizes likelihood, not truth. Given that the training data is full of novels and nonsense, whether it has any concept of "truth" at all is questionable.

No Strict Reasoning

It's a powerful pattern matcher, not a deductive engine. It can reproduce common reasoning patterns from its training data, but performance can collapse if you rename variables, embed a familiar problem in an unfamiliar narrative, or add irrelevant details. A logician wouldn't be fooled by such superficial changes.

Bounded Context

The window size is fixed at design time, usually a few thousand to tens of thousands of tokens. Words outside the window simply don't exist for the model.

The author's suggested direction is to use LLMs as dispatchers: let the model translate a human intention into a well-defined problem, hand it off to a specialized solver (a theorem prover, a symbolic math system, a database), and translate the result back into human language. Such hybrid architectures are emerging, but they are not yet as mature as the monolithic approach.

Takeaways

What to Take Away: A Jargon Translation Table, and the 20-Page Paper Itself

Here's the entire translation effort of the paper condensed into a table. The left column is the term you'll see elsewhere. The middle is its mathematical name. The last column is what was wrong with the original term.

Jargon you'll readWhat it is mathematicallyWhat was wrong with the original term
attention score influence score An anthropomorphic metaphor that obscures its role in the computation
attention weight influence weight It's just the weight in a weighted average. Nothing more.
Query / Key / Value three learned projection matrices Borrowed from database retrieval. But there's no database, no one is querying, and nothing is being looked up.
attention head relation group "Head" implies designed, specialized components. They're structurally identical and start from random. Their specialization is something that emerges from training.
softmax multinomial logit inverse transform Only describes its computational nature, not what it is statistically. Statisticians have known it for over a century.
Table compiled from the paper's sections. The author's stance: these names were borrowed from database theory, cognitive science, and electrical engineering, and they're largely disconnected from the underlying math and statistics. They obscure more than they illuminate.

The paper's conclusion in a few sentences: an LLM is a conditional probability distribution "next word given context." The core mechanism is a learned weighted average. Influence is measured by a dot product of projected vectors. Stacking many layers, each with many parallel relation groups, allows learning multiple levels of complex relationships. The mathematics involved goes no deeper than linear algebra (matrix multiplication, dot products), probability (conditional distributions, exponential normalization), and optimization (gradient descent). The truly remarkable part is the combination and the scale: when these ordinary components are assembled this way and scaled to this magnitude, capabilities emerge that look like forming concepts and recognizing complex relationships.

A free 20-page PDF, written for anyone with a math or statistics background who wants to genuinely understand what LLMs are computing. The prerequisites are just three: matrix multiplication, conditional probability, and the idea that statistical model parameters are estimated from data. No neural network or machine learning background required.
Source
The Simple Mathematics of Large Language ModelsJoseph L. Breeden (Deep Future Analytics) · University of Edinburgh Business School, Credit Research Centre·Full PDF·2026-01
Our note
The original paper contains no figures. All charts in this article are illustrations drawn by us; bar lengths and lines are illustrative, not measured data. The paper's internal page is dated December 9, 2025; the cover and CRC archive page say January 2026. We've used the latter.
↑ End of article
✓ This article is free to read in full

Members can copy or download the full Markdown, and let their AI subscribe and ask.

Read the original ↗
📮 New explainers, straight to your inbox

Found this useful? Leave your email — every new explainer, the moment it's out. Unsubscribe anytime.