Projects
Live queue and door status for Berghain

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
01

Showcase

1 video
Loading showcase
27sBergline — A Reddit thread turned into one honest reading of the queue. Rendered live with Remotion, not a video file.
02

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.

03

Modules

3 units
01

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
02

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
03

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
04

Engineering

What was hard
01

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.

02

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.

03

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.

05

Stack

5 entries
  • 01Next.js
  • 02TypeScript
  • 03Claude
  • 04Reddit API
  • 05Web Push