gzl.dev/blog
field notes, mostly
18 posts
August 27, 2026
7 min
Nine ways to say yes
I taught a Light Phone to speak an Oura ring's protocol over BLE. Then I spent a week failing to tap a button that doesn't exist.
Light PhoneBrightOuraBluetoothAndroid
August 21, 2026
6 min
Field notes on LightOS
What the Light Phone III's OS actually is underneath: Android with the Google removed, hardware that talks in key events, and conventions nobody voted on.
Light PhoneLightOSAndroid
August 21, 2026
1 min
A tape recorder, not a voice recorder
BrightRecorder: clips named for where and when, tapes that are just folders of WAVs, and the wheel finally doing the job it was born for.
Light PhoneBrightRecorder
August 18, 2026
2 min
Why I put an app store on a phone designed to have none
Yes, I see the irony. The argument for building it, why there's no server behind it, and the afternoon I accidentally dropped everyone's apps from the index.
Light PhoneBrightMarket
August 14, 2026
2 min
A good fork says thank you
A lot of what I ship is other people's work with my name nearer the top than it deserves. Some rules I try to fork by.
Light Phoneopen source
August 11, 2026
2 min
My bug reports file themselves
Shake the phone three times and the app files its own GitHub issue. Then an AI triages the queue every hour — under strict instructions that guessing is worse than waiting.
Light PhoneAItooling
August 8, 2026
2 min
Fifteen copies of the same file
The least interesting code I maintain is the code I'd save first in a fire. On finally building the shared library.
Light PhoneKotlin
August 8, 2026
2 min
BrightMarket is out
The app store ships: browse on a desktop, install by QR, track updates on the phone, and get your own app into the catalog.
Light PhoneBrightMarket
August 7, 2026
2 min
One column of scores
Twenty-two leagues from four keyless public APIs, in one grayscale column. How BrightSports gets scores with no account and no push.
Light PhoneBrightSports
August 6, 2026
3 min
The MetroCard inside my phone
I dissolved a transit card in acetone and moved its nervous system into the battery compartment. Tap-to-pay is back, sort of.
Light PhonehardwareNFC
August 6, 2026
2 min
Every button does what you tell it to
The follow-up to the keylayout post: BrightControl itself, why the defaults took longer than the code, and the trust problem with accessibility services.
Light PhoneBrightControldesign
August 5, 2026
1 min
Roll is out
The camera app ships: a filter wheel on real hardware, purikura with four-shot strips, date backs, and a privacy lesson from launch day.
Light PhoneRoll
August 4, 2026
2 min
The keylayout file Light left behind
The scroll wheel is just key events. Everything I learned reading Generic.kl off the phone, and the accessibility service that became BrightControl.
Light PhoneAndroid
August 2, 2026
3 min
Rewriting the camera
Roll's whole design is one gesture, stolen from a contact sheet. Plus the filters that got away from me — purikura on a monochrome phone, and datamoshing experiments that mostly produce mud.
Light Phonedesign
July 29, 2026
1 min
A QR scanner, and its desktop twin
The modern world hands you addresses as QR codes and the Light Phone couldn't read them. A scanner for the phone, a generator page for every other screen.
Light PhoneLightQR
March 22, 2026
1 min
BasilNet, a year later
What broke, what I'd trim, and how the media server quietly became infrastructure for everything else I build.
Dockerhomelabself-hosting
March 8, 2026
1 min
I built a bad DSLR on purpose
It took worse pictures than my phone. It's one of the most useful things I've ever built.
hardwarephotography
January 10, 2025
1 min
Building BasilNet: My Home Server Stack
How I built a 15-service media server with Docker Compose, Gluetun VPN, and Home Assistant integrations.
Dockerhomelabself-hosting
← all posts
August 21, 2026 · 1 min

A tape recorder, not a voice recorder

Light PhoneBrightRecorder

The newest app on my shelf is BrightRecorder, and the fastest way to describe it is by what it refuses to be. It is not a voice recorder. There is no transcription, no trimming, no waveform editor, no file manager. It records rooms, streets, weather, rain on windows — and the only thing it does with them is let you find them again.

Tapes, not files

Record a moment and it becomes a clip named for where you were and when. Clips live on tapes, and you keep more than one — a tape for a trip, a tape for the apartment, a tape for the year. The machine holds exactly one tape at a time, and you swipe through the rest on a shelf. Each tape gets a name and a pattern on its label, which is what color would be if this panel had any.

Under the hood a tape is a directory of WAV files and nothing more. The clip’s timestamp and place are the filename. Rename the folder, you’ve renamed the tape. Plug the phone into a desktop and the whole collection reads as itself — no database, no export step, no app required to get your own recordings back. I keep coming back to that rule in these apps: the storage format should make the app optional.

The wheel finally has its job

The part I’m happiest with: winding. Turn the brightness wheel and you wind through a tape, forwards or backwards, and you hear it while you wind, the way a real tape machine chatters while you scrub. Let go and it plays from where you landed.

I’ve put the wheel to work in most of my apps — scrolling, lens ring, brightness — but this is the first time it’s felt less like an adaptation and more like the thing the hardware was born for. A physical wheel wants to shuttle tape. It’s been waiting for this job since the phone shipped.

None of this is a new idea. It’s the oldest audio interface there is, drawn in software. That’s the whole appeal — a tape recorder was already a nearly perfect object, and the only modern thing this phone needed to add was the filename.