The most obvious use‑case for crypto is everyday payments. Cash is all but dead in developed countries, causing credit card issuers to have a de-facto 2% tax on the worlds commerce. Despite this we still cant pay for every day goods and services without middlemen, the original promise of crypto.
I spent some time exploring exactly what's stopping this future. My goal: let anyone pay for goods or services, in any currency they choose, with no intermediaries — and make the user experience (UX) at least as smooth as tapping a bank card. No one should have to sacrifice UX for decentralization.
So I built a payment terminal:
Even when both customer and merchant have crypto wallets, the current flow is a hassle: decide on a chain, agree on a token, scan a QR code, wait for confirmation, then reconcile sales manually because none of it plugs into the merchant’s point‑of‑sale (POS) system. This device strips that friction away.
The merchant sets up their shop address and WiFi beforehand. To accept payment they simply input the amount you're paying, you tap your phone, and it automatically negotiates how to get payment to the merchant.
Even this is easier said than done. In testing I discovered only two wallets have the full capability of making this work - Coinbase and Metamask, and they don't have any native NFC integration so I needed to build a companion app.
The app auto‑detects installed wallets and allows you to select what wallet you want to pay with (ahead of time). The goal is to get wallets to add native support, so this app won't be necessary.
When you tap the terminal it first requests the wallet address, fetches your balances on all chains the merchant supports using Alchemy, and crafts a payment link with whatever token makes the most sense - stablecoins first, ETH second. This then makes the screen pop up with the payment request and you hit pay. Payment only takes a few seconds.
Here's the full demo of it in action:
Here's every flaw I've found so far:
There is no function to request the wallet address immediately, hence the need for the companion app. Reading the wallet address is necessary to read all the users tokens and create a transaction immediately. Otherwise you're back to negotiating chains/tokens. This could be solved with ERC-7811 or ERC-2256 but no wallets have implemented them yet.
Most wallets don't correctly support ERC-681 links, either stalling or doing nothing.
No wallets support auto swapping before sending, this would be useful when you are on the same chain as the merchant but don't have any currencies they support.
No wallets support auto bridging before sending, this would be useful when you have tokens on another chain (this is less of a problem as a merchant can just support most of the common chains).
If you're building a wallet and want to add these features, let me know!
All the code is open‑sourced, and the terminal repo ships with a script that burns a Raspberry Pi image so you can test with your own wallet today.
Merchant Terminal App: https://github.com/FreePayPOS/merchant-app
Customer Companion App: https://github.com/FreePayPOS/customer-android-app
Now the next big problem is obviously distribution - how would we get these payment terminal or payment code distributed globally? This is what I'll be diving into next article, along with other failed attempts at in person payments we've seen over the years.