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

The MetroCard inside my phone

Light PhonehardwareNFC

Of everything I gave up moving to this phone, tap-to-pay was the one I actually felt. Not apps, not the camera — the turnstile. Standing at the OMNY reader fishing for a card while the person behind me radiates New York patience. The Light Phone III has NFC hardware in it, and the community keeps asking when it’ll do something; so far, nothing shipped uses it. So I stopped waiting and put a MetroCard inside the phone.

I posted the short version on Reddit. This is the long one.

A card is packaging

The thing to understand about a contactless card is that almost none of it is the card. Inside the plastic there are exactly two functional parts: a chip about the size of a grain of rice, and a loop of wire running around the card’s perimeter. The wire is the antenna, and it’s also the power supply — the card has no battery. The reader radiates a 13.56 MHz field; the loop harvests enough energy from it to wake the chip, and the same coupling carries the conversation. That’s the whole machine. The plastic is packaging, and packaging can go.

The acetone part

Transit cards are laminated PVC. Soak one in 100% acetone overnight — pure hardware-store acetone, not nail polish remover, which has oils in it — and the laminate gives up. The layers soften and peel, and what’s left is the chip with its antenna coil attached, looking like the card’s nervous system with the body dissolved away.

An OMNY card dissolving in a bowl of acetone, layers separating, the mag stripe peeling away Overnight in the bowl. The laminate gives up in layers; the mag stripe goes first.

Handle it like a cobweb. The coil is fine wire, the bond between coil and chip is the weakest point, and there is no fixing it if it tears. It took me a few tries to end up with a working one. I don’t think the task is genuinely hard; I think I’m clumsy, and the difference matters because you should budget more than one card either way.

The install

The chip-and-coil goes in the battery compartment. Two things I learned at actual turnstiles, by failing at them:

The coil wants to be spread to the very edges of the cavity while staying a coil. Loop area is everything — the voltage the chip harvests scales with the area the field passes through, and a scrunched-up coil is a deaf one.

Orientation matters more than it has any right to. Chip black-side down reads most reliably for me. I can’t give you the physics for that one; I can give you the turnstile data.

The Light Phone III's open battery compartment with the chip and antenna coil held under strips of blue painter's tape, the fine wire spread to the compartment's edges An earlier build, taped in for testing — you can see the coil spread to the cavity’s edges. The one currently in my phone is working too consistently to risk opening up for a photo.

The part where the phone fights back

First full test: intermittent failures, maybe one read in three. The culprit is the phone itself. The LP3’s NFC front end is a coil too, sitting in the same few cubic centimeters, and even idle it detunes the space around it — two resonant loops that close together pull each other’s resonance off frequency, and a transit chip living on harvested power has no margin for that.

The fix is to shut the phone’s radio up:

adb shell svc nfc disable

and svc nfc enable to undo it. The setting survives reboots. With the phone’s NFC off, my read rate went to effectively always. I’m working on an app to make this toggle less of a ritual, because a hardware mod that requires adb for daily operation is only half done.

Living with it

This is the part that makes it practical rather than a stunt: OMNY lets you register a card on their website and attach auto-reload. So the card inside my phone refills itself, and the phone taps through turnstiles like it always should have. My card expires in 2033. When it does, I’ll do it again.

The obvious next question — someone asked it within an hour — is a credit card. It should work identically; it’s the same physics and mostly the same chips. I haven’t tried, for the boring reason that I can’t walk into my bank and ask for five test cards. If you try it, I want to hear how it went. And for the advanced class: one commenter re-wound a card’s antenna around the bare chip with a NanoVNA to verify the resonant frequency, and wears it as a ring. That’s real radio work. Mine is the lazy version, and I’m at peace with that.

Caveats, honestly

Do this to a card you can afford to kill, because your first one probably dies. Acetone wants ventilation and patience. The MTA would presumably rather you didn’t, so consider this documentation, not advice. And if the phone ever ships a real wallet, I’ll be first in line to dissolve nothing at all.