Now boarding

Computer science fundamentals for engineers who already ship.

Cohort
01 Founding
Departs
Jan 2027
Seats left
488
Fare
$29/mo for life
Boarding in
92 days

Learn how systems work
by building them.


What slowcs is

Build a rate limiter, a vector database, a B-tree storage engine and Raft yourself, in any of ten languages. Each stage starts where your last design breaks: a test finds the case it can’t handle, a lecture explains why, and you build the version that survives it.

Why it’s worth your eveningsAI can hand you a finished design. It can’t give you the failures that shaped it, and those are what you reach for when production breaks in a way nobody planned for.

Free to join$29/month for lifeNo card

1Distributed Systems/Rate limiter
  1. 03 · Token bucket
Go 1.23 MK
Opened after your first run · 14 min
03
Stage 03 · Lecture · Buckets, leaky and not

Token bucket

Refill at a steady rate, allow bursts up to capacity.

Your sliding log from stage 02 was exact, and the memory test showed what exact costs: a timestamp for every request in the window. A client at 100,000 requests a minute kept 100,000 of them. The fix is to stop remembering requests and remember a budget instead.

A token bucket holds up to capacity tokens and every request spends one. Tokens drip back in at a fixed rate, so over a long window a client gets exactly that rate, but a client that has been quiet can spend a burst all at once.

refill 2 / s capacity 5 request takes 1 full burst refill 2 / s time
Fig. 3.1 Tokens over timeA quiet client spends 5 at once, then gets 2 a second.

You don’t need a timer. Keep the time you last looked and how many tokens you had; on each request, work out how many have dripped in since.

bucket.gosketch · not your code
1func (b *Bucket) Take(now time.Time) bool {2    elapsed := now.Sub(b.last).Seconds()monotonic clock3    b.tokens = min(b.capacity, b.tokens+elapsed*b.rate)4    b.last = now5    if b.tokens < 1 {6        return false7    }8    b.tokens--9    return true10}

Line 2 is where this stage’s hardest test lives. Wall-clock time can jump backwards when NTP corrects it, and a bucket that trusts it will either mint free tokens or lock a client out.

03
Stage 03 · Brief

What to build

Start here. Build the simplest thing that could work, run the suite, and let it show you what you missed.

Why this stage exists

Your sliding log was exact, and test 06 of stage 02 measured the price: 3.2 MB for one busy client. Build a limiter that remembers two numbers per client and still allows short bursts.

  1. 01

    Accept capacity and rate for each client at start-up.

    01 spends one token
  2. 02

    Let a quiet client spend up to capacity requests at once, then reject until tokens return.

    02 burst03 empty bucket
  3. 03

    Refill continuously: half a second at 2/s is one token, not zero.

    06 smooth refill08 fractional rates
  4. 04

    Never hold more than capacity, however long a client is idle, and never share a bucket between clients.

    04 capacity05 separate clients
  5. 05

    Stay correct when the wall clock jumps, forwards or backwards.

    07 clock jumps back
  1. “…but a client that has been quiet can spend a burst all at once.”

    Burst size = capacity. Rate only matters after the burst. Sliding log (stage 02) had no burst at all; that was the point of it.

    Lecture ¶2Today
  2. elapsed := now.Sub(b.last).Seconds()

    Go’s time.Since keeps the monotonic reading. Don’t round-trip through Unix(), it strips it.

    Lecture · line 2Today
  3. refills smoothly, not in steps failing

    Refill is stepwise because I floor tokens to an int on every read. Store tokens as a float, floor only when spending.

    Test 06Yesterday
Line

Six designs, one lineEach stage starts where the last design broke. The next opens when yours survives its tests.

Read

Problem first, then the lectureThe brief sets the problem. After your first run, the lecture explains why your attempt broke and how the field fixed it.

Test

Tests that refuteEach failing test is a counterexample: the input, what it expected, what you returned, and a hint if you’re stuck.

02Why build

AI writes the boilerplate.
Somebody still has to understand the system.

When the p99 spikes, a node drops out of the cluster, or the index stops fitting in memory, the code that was quick to generate is no help. Knowing what’s underneath is.

Every design you rely on is a repair of one that broke. Sliding windows exist because fixed windows let bursts through; Raft exists because Paxos was too hard to get right. On slowcs you retrace that path: build the simple version, watch a test break it, learn why, build the next one.

Watching a course Building it on slowcs
Who writes the code The instructor You, every line
How you learn The final design, explained Your design breaks on a test, you find out why, you fix it
When the theory comes Before you need it Right after your design breaks
Language Theirs Yours: Go, Rust, C, C++, Zig, Java, Kotlin, Python, TypeScript or OCaml
What you have at the end A certificate A rate limiter, a B-tree, a Raft cluster. You built them and can explain every choice

✓For you if

  • You ship production code and want to know what’s under it.
  • You use Redis, Postgres or Kafka every week and couldn’t build one.
  • You learn by writing code and breaking it, not by watching.

×Not for you if

  • You’re just starting to program. Start there; we’ll be here.
  • You want a certificate by the weekend.
  • You’d rather someone else wrote the database.
03Timetable

Each project runs like a line. Every stage starts where your last design breaks.


1Rate limiter
6stages
44tests
25 also on

Stage You build What breaks it Tests The lecture
01 Fixed windowCount requests per client per minute. The boundary burst: 10 requests at 0:59 and 10 more at 1:00 pass a limit of 10 a minute. 7
Counting in time
Why windows have edges
02 Sliding logKeep a timestamp for every request. Exact at any instant. Memory. A busy client keeps 100,000 timestamps, and the suite measures every byte. 6
Exact vs. approximate
What exactness costs
03 Token bucketKeep two numbers and refill as you go. Two threads see one token left and both take it. 8
Buckets, leaky and not
From 1980s network policing
04 ConcurrencyMake every check-and-take atomic. Three nodes each allow the full limit, so the cluster lets through three times as much. 7
Races you can’t see
Compare-and-swap
05 DistributedShare one limit across three nodes. The network splits and the nodes can’t agree on the count. 9
The cost of agreeing
Sync vs. gossip
06 Under failureDecide what happens when nodes can’t talk, and prove it. The line ends here. The limiter comes back on AI Infrastructure and Security with new stages. 7
Choosing how to fail
Availability budgets

Every project on every line is laid out like this: six designs, each one repairing the last, with the tests that break them and a lecture on why.

See all six lines
04Network

Six lines, one network.

Projects are stations. Where two lines meet, something you built on one comes back on the other, asked a harder question.

32 projects on six lines, tied together by five interchanges. The rate limiter you build for Distributed Systems comes back in AI Infrastructure to meter tokens for a model API, and in Security as the core of a web firewall.

125Rate limiterThree lines meet here. Limit a cluster, budget tokens for a model API, then write firewall rules on top of it.

14RaftAgreement between machines, then the replication under a real database.

24Vector databaseRetrieval for a model, then an index that has to survive a crash.

1

Distributed
Systems

7 projects3 interchanges

Time, failure and agreement between machines that can’t see each other.

Rate limiter 25 Consistent hashingLoad balancerDistributed cachePub/sub queueRaft 4API gateway 5
2

AI
Infrastructure

7 projects2 interchanges

The systems around the model: retrieval, serving, caching, batching and agents.

Vector database 4RAG pipelineInference serverRate limiter 15Prompt cacheAgent orchestratorLoRA fine-tuning
3

Systems
Programming

6 projects1 interchange

Memory, threads and scheduling: the layer every other system stands on.

Memory allocatorThread poolLock-free queueAsync runtimeProfiler 6Garbage collector
4

Databases

7 projects2 interchanges

How data gets to disk, survives a crash there, and comes back fast and correct.

Write-ahead logB-tree storage engineLSM treeRaft 1Vector database 2SQL parser & plannerIsolation levels
5

Security

6 projects2 interchanges

Build the defences yourself, so you know exactly where they give.

JWT authOAuth2 flowTLS handshakeSecrets managerRate limiter 12API gateway 1
6

Observability

5 projects1 interchangeOpens after launch

Metrics, logs and traces: how a running system tells you what it’s doing.

Metrics exporterLog pipelineTracing agentProfiler 3eBPF tracer
05Fare

After launch it’s $49 a month.
Founding members pay $29, for life.

Cohort 01 is 500 engineers. Join it and you pay $29 a month for as long as you stay, whatever slowcs costs later.

Founding memberCohort 01 · Jan 2027
$29a month
$49 after launch

That’s $240 a year less than the launch price, every year you stay. Reserving is free; you decide whether to subscribe when your line opens.

Reserve a founding seat
  • Free to reserve
  • No card until your line opens
  • $29 for as long as you stay
Every founding membership includes
  • All six lines and all 32 projectsIncluding every project added after you join
  • A test suite for every stageRun it from your machine or on push, in any of ten languages
  • A lecture for every stageAnd notes that follow you between projects
  • A say in what ships firstFounding members vote on which stages and projects come next
  • A seat in Cohort 01Boarding January 2027, ahead of everyone after launch
Departures
Cohort 01 boards in
92Days
:
00Hours
:
00Minutes
:
00Seconds
Cohort Departs Seats Fare Status
01 Founding January 2027 500 $29 / month, for life Boarding list open
Next cohorts After launch Open $49 / month Not yet scheduled
Seat map · Cohort 01

12 of 500 seats reserved · 488 left

ReservedFreeYours

Reserve a seat and it lights up here.

06Reserve

Early
access

Pick the line you want to ride first and the language you’ll build in. We’ll write once, when it opens.

  1. 01500 seats in Cohort 01. After that, $49 a month.
  2. 02Founding members pay $29 a month for as long as they stay.
  3. 03Founding members vote on which stages ship first.
  4. 04One email when your line opens. Nothing weekly. Change your line or language any time.
slowcs · Cohort 01123456
Where we write when your line opens
First line Pick one
Language Change it later

Questionsbefore boarding

Something else? Write to hello@slowcs.com

When does it open, and how many people get in?

Cohort 01 opens in January 2027 and is capped at 500 engineers. Seats go to the list in the order people reserved them.

Do I pay anything to reserve a seat?

No. Reserving is free and needs no card. When your line opens you decide whether to subscribe. Founding members pay $29 a month for as long as they stay; after launch the price is $49.

Can my employer pay?

Yes. You’ll get an invoice with your company’s details, so it can go on a learning budget like a book or a conference ticket.

What if I cancel?

Cancel any time from your account. The founding price stays only while you’re a member, so if you come back later you pay the price of the day.

How much time does it take?

A stage takes most people one to three evenings. There’s no schedule: the cohort opens together, then you go at your own pace.

I’ve never written a database. Is that a problem?

That’s the point. slowcs is for engineers who already ship features. If you’re comfortable in one language and can read a failing test, you’re ready for stage 01.

Why start with a design that breaks?

Because that’s how the field got here. Fixed windows let bursts through, so sliding logs; sliding logs cost too much memory, so token buckets. Once you’ve watched a test break your version, the next design stops being a rule to remember and becomes the obvious fix. That’s what lets you reason about systems nobody has written a lecture on yet.

Which languages can I build in?

Go, Rust, C, C++, Zig, Java, Kotlin, Python, TypeScript and OCaml. The tests check what your program does, not how it’s written, so you can switch language between projects.