Bergline
Reads a live Reddit thread with a model and aggregates strangers on the internet into one honest answer: how long the queue is, and whether the door is letting people in.
- Role
- Solo
- Period
- 2026
- Type
- Lab
- Status
- live
- 5
- Minute poll interval
- 8
- Queue ladder rungs
- 2
- Independent data paths
Showcase
Overview
You are about to stand in a queue in Berlin for an unknown number of hours with an unknown chance of getting in. The information exists — people in that queue are posting about it in real time — but it is scattered across a Reddit thread as unstructured, contradictory, timestamped-by-accident prose.
Bergline reads that thread incrementally with a model, and takes a second input that needs no model at all: a QR placard on the street that lets someone in the queue report it directly. Both paths converge into observations, observations aggregate into a snapshot, and the snapshot is one page — the wait, the door, and every queue somebody reported.
The whole design is one idea applied repeatedly: a fact is only worth storing if you also store which queue, which moment and which person it came from. Almost every bug in its history was one of those three going missing.
Modules
Ingestion
Two independent paths into the same observation table, one of which does not need a model.
- Reddit thread polled every 5 minutes, inside a night’s listening window
- Comments prefiltered before the model sees them, so tokens go to signal
- A QR placard on the street feeding a direct report form
- Every observation carries its queue, its moment and its source
The reading
Turning contradictory reports into a number that is allowed to be published.
- An eight-rung queue ladder for physical position
- Two calculation paths for the wait, depending on what the night actually gave
- Trend direction, which usually and correctly says nothing
- Door status, re-entry and the other queues tracked separately
What it refuses to do
The rules that keep it honest, encoded rather than hoped for.
- Never state a reading only one person claimed
- Never guess a wait nobody actually served
- Never publish a number without publishing how old it is
Engineering
Provenance is the whole architecture
It is tempting to store "the wait is 90 minutes". That fact is useless an hour later and unfalsifiable immediately. Storing instead that a specific person, at a specific moment, in a specific queue, reported a specific thing is what makes aggregation, decay and disagreement all tractable — and every failure the project has had traces back to one of those three fields going missing.
Spending model calls like they cost money
A naive build would send the whole thread to a model every poll. This one prefilters first, calls once per poll that found new comments, and only narrates when the reading actually moves. A measured night — 37 kept comments — came to 2,669 tokens in and 4,278 out.
A second path that needs no model at all
The placard exists because a model reading strangers’ prose will always be the weaker source. Someone standing in the queue with a phone can just tell you. Designing the schema so both paths produce the same shape of observation is what let the cheap, reliable input sit alongside the clever one.
Stack
- 01Next.js
- 02TypeScript
- 03Claude
- 04Reddit API
- 05Web Push