Cardano Doorbell
A Raspberry Pi Pico W that watches a Cardano wallet and lights an LED when a transaction tagged "PIJAM" arrives on-chain. No server. No middleman that can revoke access. Just hardware reading public chain state.
the_idea
Most blockchain demos happen on screens — a wallet balance updates, an explorer page refreshes. Nothing about that feels real. The Cardano Doorbell was built to make decentralization physical: someone sends a transaction from anywhere in the world, and a light turns on in a room in Uyo.
The trigger isn't a webhook or a company's push notification service. The Pico W reads public chain state directly. If Blockfrost disappeared tomorrow, the same script could point at any other Cardano API — or eventually a local node — because the data itself lives on-chain, owned by no one.
It was built as the centerpiece demo for Pi Jam Uyo Vol. 2 — Hardware Corner (July 31, 2026): a live demonstration where attendees send a tagged transaction and watch the LED respond seconds later.
how_it_works
[Eternl wallet, anywhere]
|
| tx with metadata "PIJAM"
v
[Cardano preprod chain]
|
| polled every 10s via Blockfrost
| /addresses/{address}/transactions
v
[Raspberry Pi Pico W]
|
| metadata parsed, tag matched
v
[Onboard LED — 3 seconds]The script polls one specific known address — it is address-scoped, not scanning the whole chain. When a new transaction appears, it fetches the transaction's metadata and checks for the "PIJAM" tag.
Metadata detection is wallet-agnostic. It handles three formats:
- Plain string (Eternl's free "Add on-chain Message" feature)
- List of strings
- Proper CIP-20
{"msg": [...]}dict format - Plus a raw-string fallback across the entire metadata response
A METADATA_FILTER toggle switches behavior: True = only trigger on "PIJAM"-tagged transactions, False = trigger on any new transaction (plain tip-jar mode).
There are two versions of the firmware:
cardano_doorbell.py— the core: poll, match, blinkcardano_doorbell_with_status.py— additionally serves a local status webpage on the same WiFi network, auto-refreshing every 5 seconds, showing: status, watched address, last poll time, last tx hash, tag match result, LED state, poll/trigger counts, and uptime
build_it_yourself
Hardware
| Component | Notes |
|---|---|
| Raspberry Pi Pico W | Onboard LED is the output — nothing else needed |
| USB cable | Power + flashing |
That's the whole BOM. The point is minimalism — chain state to physical output with the least hardware possible.
Setup
- Create a free Blockfrost account and a PREPROD project — the
project_idis passed as a request header - Install Eternl wallet, switch it to the Preprod network, fund it via the official Cardano testnet faucet
- Flash MicroPython onto the Pico W
- Copy
cardano_doorbell.pyacross, set your WiFi credentials, Blockfrost project ID, and the watched address - Run it. Send a transaction to the watched address with "PIJAM" in the metadata (Eternl: "Add on-chain Message"). Watch the LED.
Config values
METADATA_FILTER— tag-gated vs any-transaction mode- Poll interval — default 10 seconds
- LED duration — default 3 seconds
what_i_learned
- On-chain metadata is messier than the CIP suggests — every wallet writes it slightly differently, which is why the parser handles three formats plus a fallback. Robustness against wallet variance mattered more than elegance.
- MicroPython's TCP stack gets fragile when the Pico W is simultaneously polling Blockfrost and serving HTTP. The
_with_statusversion needs bench-testing under concurrent load before live event use — flagged as the main open risk. - The demo lands harder than dashboards ever do. "The blockchain turned on a light" is instantly legible to a non-technical audience in a way that explorer screenshots are not.
what_comes_next
- [ ] Bench-test
cardano_doorbell_with_status.pyunder concurrent load (WiFi polling + HTTP serving + Blockfrost calls) - [ ]
blink.pystarter script for the event's hands-on session - [ ] README.md and SETUP.md for the repo
- [ ] Live deployment: Pi Jam Uyo Vol. 2 — July 31, 2026
- [ ] Long-term: point at a local Cardano node instead of Blockfrost for full decentralization