You check in, you get a card, the card says xK9#mP2$vL7@nQ. You type it on a glass keyboard, squinting, and it fails. Was that a zero or an O? A one or an l? You try again. Then your partner asks for the password and you read it out loud, character by character, like a hostage.
I've done this in enough hotel rooms and Airbnbs to want it gone, so I built an app for it. BlinkFi is on the App Store as of this week. You point your iPhone at the WiFi card, the sticker on the back of a router or the sign on a café counter, it reads the network name and password, and you tap once to join. Nothing typed.
BlinkFi: WiFi Scanner on the App Store. iPhone and iPad, iOS 18 or later. Free for your first three networks, $4.99 once after that.
Why the camera
iOS has had a Scan Text option in text fields for years, but it fills one field at a time and you have to select the right text yourself. Every WiFi QR app I tried assumes there's a QR code to scan. The hotels and cafés I end up in still print the credentials as plain text, and more than one has written them on a sticky note.
So BlinkFi takes the photo, works out which bit is the network and which bit is the password, and hands them to iOS.
How a scan works
The Scan tab is the camera. You line the card up inside the brackets and tap the shutter. It's a still photo, not live processing, which keeps the recognition on a full-resolution frame and the battery from melting.
The text comes out of Apple's Vision framework with language correction switched off. The same correction that turns teh into the would happily turn a password into a word, and a password that's been helpfully corrected is worse than no password at all.
Then a parser has to decide what the text means. It tries three things, in order:
Label: valueon one line. Network: Harbor_Guest, Pass: welcome-home-22. Labels in English and Serbian, with the usual separators.- A label on one line and the value on the next, worked out from where the text sits on the card, since OCR gives you bounding boxes along with the words.
- No labels at all. Two blocks of text that don't look like labels, so the first is probably the network and the second the password.
It also ignores text that isn't near the brackets, which is what stops the room service menu next to the card from becoming your password.
When the parser isn't confident, there's a fallback. On an iPhone 15 Pro or later running iOS 26 with Apple Intelligence on, the recognized text goes to the on-device model with a two-field schema and a prompt that says, in short, don't guess. It runs on the phone and there's no charge for it; on other phones the parser's answer is what you get.
Either way you land on the Review screen, where the password is shown large and monospaced with the digits in a different colour, under a hint that says check 0/O, 5/S, 8/B. If the parser swapped the fields there's a button for that. If it picked the wrong text, you tap the right block in the photo instead. Then you tap Connect to Network.
Connecting is the part Apple makes you earn
Joining a network from an app goes through NEHotspotConfigurationManager. It needs the Hotspot Configuration entitlement, the kind of thing that looks simple on paper and turns into a form. It also shows a system dialog, "BlinkFi wants to join Wi-Fi network Harbor_Guest", that you can't skip. Fair enough.
The part I didn't expect: the join call can return without an error when the password is wrong. The system accepted the configuration, which isn't the same as the phone being on the network. So after the join, BlinkFi reads back the name of the network the phone is actually on, for up to five seconds, and only says Connected once it matches. Reading that name needs a second entitlement, Access Wi-Fi Information, and it works without asking for your location because the app only reads the networks it configured itself.
The hotspot API doesn't exist on Macs with Apple silicon or on Vision Pro, so the app isn't offered there. It's an iPhone and iPad thing.
Sharing it
Once you're on, you can show a QR code in the standard WIFI: format. Any phone camera reads it and offers to join, iPhone or Android, and nobody else needs the app. The networks you've used stay in a history list, with the passwords in the Keychain rather than in a database, so you can reconnect next week or share the code again without finding the card.
Three networks, then $4.99
The free tier is three networks, counted for the lifetime of the install, not per month. A network only counts when you actually get something out of it: a confirmed join, a QR code shown or shared, or a password copied. A misread you catch on the Review screen costs nothing, and neither does a join that fails. Reconnecting to or resharing a network you've already used is free as well.
There's one more rule, and it came out of imagining the moment the paywall would appear. You're at the limit, you've scanned the fourth network, and you have no internet, because that's the whole reason you're scanning. Asking for money right then is both rude and pointless. So the limit comes with one bonus connection per install, and the upgrade offer only shows up once the join is confirmed.
Pro is $4.99, once, with Family Sharing. No subscription, since there's nothing to subscribe to: the app has no server and no account. The App Store privacy label says Data Not Collected. There's nothing in the app to collect it with.
Getting it through review
Publishing an app is a lot more involved than it was the last time I did it, years ago. Back in March the app was built, and the thing holding it up was my Apple Developer account. I'd published apps on this platform before, and the account still sat in approval for months before I was allowed to submit anything. Once it cleared, the app waited on me for a while longer, which is the least interesting kind of delay: other work came first. When I picked it back up in October it took about ten days to go from "works on my phone" to a listing, with most of that time spent on screenshots, a preview video and the paperwork, not on code.
Then the first submission was rejected. It wasn't the entitlements or the purchase. It was the word Enable on the button before the camera prompt. Apple's position is that a button called Enable camera nudges you toward the system alert's Allow button, so it has to say Continue instead. Both buttons call the same function. Both lead to the same alert. One of them is manipulation and the other isn't, and the difference is six letters. I wrote that one up separately: Guideline 5.1.1(iv): App Review rejected my first app over one word. I fixed the button, kept going with a few more touch-ups while I was in there, and the next build I submitted was approved.
The password's already on the card. I just wanted to stop typing it. BlinkFi is on the App Store if you'd like to stop too.
