Greenroom started as the one-click version of a teacher's 7:50 ritual. Every version since was cut from a real morning class: something broke, something was missing, and the fix shipped before the next one. This is the whole record, including the build that never launched.
01 · The shape of it
Lines of Swift in the app at each release, on the day it shipped. The size of the code is a blunt measure, but it shows where the work went: a first day that produced most of the app, ten days of hardening in the 0.3 series, one Sunday (0.4.0) that doubled it, and two September mornings that gave it a browser and a way onto YouTube. Then the two largest releases of all: a console for the class (0.8.0), and Screenroom (0.9.0), which added more code than the whole app had in its first week.
git ls-tree on each release tag, Swift files under
App/ only. The hollow amber point is 0.3.0, which shipped missing a framework and could not launch; it is the
reason the release script now verifies every linked library and smoke-launches the exact bytes before publishing.| Version | Published | Commits | Swift lines | Headline |
|---|---|---|---|---|
| 0.1.0 | Aug 6, 05:47 | 1 | 4,274 | First packaged build |
| 0.2.0 | Aug 6, 15:15 | 39 | 5,989 | Most of the app |
| 0.2.1 | Aug 6, 16:37 | 4 | 6,020 | Clean quit |
| 0.3.0 | Aug 7, 12:21 | 7 | 6,041 | Never launched |
| 0.3.1 | Aug 9, 16:55 | 2 | 6,041 | Self-updating |
| 0.3.2 | Aug 10, 04:13 | 4 | 6,108 | Browser windows, quiet OBS |
| 0.3.3 | Aug 17, 06:08 | 5 | 6,246 | Presets, transparency page |
| 0.3.4 | Aug 18, 07:22 | 11 | 6,781 | Stability from real classes |
| 0.3.5 | Aug 18, 09:03 | 9 | 6,947 | Dual display done right |
| 0.3.6 | Aug 18, 10:34 | 8 | 7,205 | Drag-to-resize layout |
| 0.3.7 | Aug 19, 01:47 | 19 | 7,385 | Design-system pass |
| 0.3.8 | Aug 20, 06:30 | 9 | 8,018 | Right display, quiet quit |
| 0.4.0 | Aug 24, 04:23 | 52 | 16,588 | Clips, participants panel |
| 0.4.1 | Aug 24, 04:41 | 2 | 16,599 | Tile identified first |
| 0.5.0 | Aug 24, 07:02 | 4 | 16,802 | Live speaker window |
| 0.5.1 | Sep 3, 11:24 | 2 | 16,821 | Recordings have sound |
| 0.6.0 | Sep 3, 12:49 | 7 | 18,781 | Greenroom Browser |
| 0.7.0 | Sep 4, 04:06 | 19 | 20,290 | YouTube upload, Sessions |
| 0.8.0 | Sep 18, 02:53 | 51 | 27,115 | Classroom console |
| 0.9.0 | Sep 26, 09:22 | 71 | 38,621 | Screenroom, Cues, camera switching |
02 · Release by release
Filled dots are patch releases; lime dots added a whole capability. Each era shows the stage as it stood by its end. Full notes for every version are on GitHub Releases.
Three releases before dinner. The first was the ritual as a script; the second turned out to be most of the app.
OBS virtual camera with you keyed in, a Zoom meeting, and a tiled layout. Credentials travel as one settings file.
Also fixed: the cutout rendered you at 1% opacity, and the freezes that needed a force-quit.
The Zoom SDK crashed in its own teardown at exit; Greenroom now shuts it down first. It also returns to the front when a session ends.
The updater arrived, failed once, then made every later install automatic. The rest is what a real classroom did to the app.
A build step deleted the Sparkle framework from the bundle; the app crashed on open everywhere and downloads were pulled. The release script has verified every library and smoke-launched every build since.
A session had been tiling the teacher's whole tab pile.
Deterministic placement, a guard against stray meeting windows, safe quitting, an unmirrored self-view.
Speaker tile on the main screen, participant grid with controls on the second. They had been swapped.
Brand green everywhere; the participant grid stops fleeing its display; quitting feels instant.
The custom meeting UI becomes the app's own console, and the recorder learns to clip the past. The code doubles in a day.
It could be mistaken for the gallery and pushed behind the workspace.
Participant video stops going black: every stream is sized against Zoom's subscription budget.
A quiet bug that had shadowed every recording; the first piece of the workspace Greenroom draws itself; then the recording leaves the Mac for the first time, on purpose, with a switch.
Every recording so far had a silent track: nothing in the scene was listening to the mic. A dedicated mic input now follows the system device.
A WebKit window Greenroom owns, so it tiles itself with no permission to grant. Chrome and friends stay in the list.
Off by default and its own channel on the safety page: a finished recording uploads as unlisted, asked or automatic, in the background.
The participants panel stops being one long column and becomes a console. Then the two things built beside it ship: Cues, which listens in class, and Screenroom, where a student's talk is recorded, marked and watched back.
The one long rail is gone. Everything that competed for space in it has its own place, and End session is always in reach. The fixes were all found by running real classes. Cues is built and runs, but it is held back: nothing listens to the microphone in this release.
Screenroom records a student's talk, takes your notes as they speak, and counts pace, filler words, pauses and time facing the room on this Mac. An agent you already run can write the feedback; the video and audio are not sent. Cues, held back in 0.8.0, is here on macOS 26.
Every release above answered something a real class did. If yours does something new, say so.