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 2, 2026 · 3 min

Rewriting the camera

Light Phonedesign

A camera app is not a new idea. I want to say that before anything else, because Roll is the app people bring up most, and the truth is that most of it is things every camera app has: a shutter, filters, a gallery. The only part I’d defend as mine is the layout, and even that is stolen — from paper.

One gesture

Here’s the whole design. The photo roll sits above the viewfinder. Pull down on the camera and your photographs come into view — the newest one against the corner of the frame, older ones running up and leftward behind it, the way a contact sheet reads. Flick up from anywhere and you’re back at the shutter.

That’s it. That’s the entire navigation model. There are no tabs, no gallery icon in a corner, no separate app to open. The camera and everything it has ever produced are one continuous surface, and you move between them the way you’d tilt a stack of prints toward yourself.

I spent longer on this than on any feature. Not building it — deciding it. Every draft with more structure felt like the phone it was replacing. The Light Phone’s whole argument is that a screen this size, in grayscale, can’t sustain interfaces built from chrome and menus, so the interface had to be a gesture you could learn in one use and never think about again.

Why a rewrite and not a fork

The stock Camera and stock Album are two separate apps, and the boundary between them is exactly the thing I wanted to remove. There was no way to fork my way there; the design decision I cared about lived in the space between the two codebases. So Roll replaces both, and it’s written from scratch. You can set it as the phone’s default camera, so the hardware camera button opens it.

The wheel works as a lens ring, because a physical dial on the side of a camera is too good a coincidence to waste.

The filters got away from me

I planned three filters. There are now more than I’m comfortable counting, and the filter picker needed its own scrolling design to hold them. In my defense, a grayscale sensor is a strange and generous canvas — with no color to protect, you can push tone curves, grain, and halftone dots much further before a photo stops feeling like a photo. Film looks with stamped date backs. Dithering that turns a shot into something a 1985 Mac would print. A Bulge lens for when a cat’s face demands it. None of this is novel — film simulation is a whole industry and I’m at the hobbyist end — but the constraint makes it fresh to work in.

The one I’m most attached to is the purikura filter. If you’ve ever crammed into a Japanese photo-booth, you know the look: blown-out skin, inky outlines, everything slightly a sticker. I spent a summer in Tokyo in high school and a shameful amount of it in those booths, so this one is less a filter than a memory with a tone curve. It has no business being on a monochrome dumbphone. People use it constantly.

The current experiments are with datamoshing — deliberately corrupting the compression so motion smears and blocks bleed into each other. It’s mostly a video-codec trick, which makes it awkward to do to stills, so I’ve been faking the spirit of it: shifting blocks between consecutive frames from the film-roll burst and letting the errors accumulate. Most attempts produce mud. Every so often one produces a photograph that looks like a memory degrading in real time, which is exactly the energy this phone deserves, and why I keep going. Nothing has shipped yet. Some of it may never — a filter that fails nine times in ten is a darkroom, not a feature.

What shipped it

Roll has shipped more releases than anything else I’ve made, and I can’t take credit for the pace. People keep sending good ideas. Every one of my apps has shake-to-report built in, and a decent fraction of what comes through isn’t bug reports at all — it’s what if pulling down went behind the viewfinder instead of over it, from someone I’ve never met, who was right.