productivity

    NFC Wizard: NFC Tag Reader & Writer for iPhone, Built in Flutter

    NFC Wizard: NFC Tag Reader & Writer for iPhone, Built in Flutter

    Duration

    Design, build & launch (August to October 2026)

    Year

    2026

    My Role

    Founder, designer and sole engineer: product design, the Flutter app, Firebase backend and Cloud Functions, monetization, the website, App Store listing and launch

    Technologies Used

    FlutterRiverpodgo_routernfc_managerFirebase AuthCloud FirestoreCloud FunctionsFirebase App CheckCrashlyticsRevenueCatAdMobSwift (App Intents)React (website)

    The Challenge

    Phones have had NFC for years, but the apps for it fall into two camps. Power tools show every chip register and assume you know what an AUTH0 byte is. Single-purpose apps write a link and stop. The people in between, like an events team tagging 500 wristbands, someone who wants a business card on a sticker or a smart-home hobbyist, end up juggling three apps and still can't check that a batch was written correctly. I wanted one app that makes the common jobs fast and safe without hiding the details that matter: which chip you're holding, how much fits on it, and whether a lock can be undone.

    The Solution

    What's in the app

    • Scan and read. Tag type, capacity and every NDEF record, with one-tap actions (open the link, call the number, view the location) and a searchable scan history.
    • Write 11 data types. Links, text, phone, SMS, email and video links are free. Wi-Fi credentials, contact cards (vCard), social profiles, map locations and (on Android) Bluetooth pairing are Premium.
    • Tag tools. Edit records in place, copy one tag onto another, erase, format and delete single records.
    • Security. Password-protect NTAG213/215/216 tags against rewrites, unlock them again, or lock a tag permanently, with a security log of every change.
    • Bulk Write. One payload to up to 9,999 tags, with optional serial numbers (?sn=0001), read-back verification, a failure log, and pause and resume.
    • QR to NFC. Scan a QR code or pick a screenshot. The app works out whether it holds a link, text, contact or Wi-Fi login and writes the matching NFC record.
    • Digital business card. Your details plus 13 social platforms, shared as a QR code, written to a sticker or added to Apple Wallet, with 30-day share analytics.
    • Templates and Cloud Backup. Ready-made tags (guest Wi-Fi, business card, portfolio link, Home Assistant) and optional Premium sync of history, card and templates.

    My own NDEF codec

    nfc_manager handles platform access, but I wrote the encoding layer myself so I control every byte. URIs use the NFC Forum prefix table, so https://www. is stored as one byte. Text records carry the UTF-8 flag and language code. Contact cards are text/vcard media records. Wi-Fi logins are Wi-Fi Simple Configuration TLVs (application/vnd.wfa.wsc), the format Android reads to join a network. Every record knows its encoded size, so the app tells you before writing whether the content fits the tag in your hand.

    NTAG password protection from the datasheet

    NTAG21x chips support a 32-bit write password, but the Flutter NFC plugins only reach it through raw commands. I built it from NXP's datasheet: identify the exact chip with GET_VERSION, find its configuration pages, then write the password, its acknowledgement and the protection boundary in a fixed order. Get the order wrong and the tag locks itself with the factory password. Platforms differ in the bytes, too: Android returns an empty frame for the chip's ACK where iOS returns 0x0A. All of it sits behind a single transceive function, so the protocol is unit-tested without a phone or a tag.

    A bulk writer you can trust

    The bulk session is plain, testable state: target count, serial numbers, a verify flag and a log. The screen drives the NFC loop. Each tag is read back to verify it, a tag still resting on the phone is ignored so it isn't written twice, a failure is logged without stopping the run, and the session pauses cleanly when no tag arrives.

    Backend, privacy and store compliance

    • Local first. Scans, templates and the card stay on the device and no account is needed. Nothing syncs unless the user turns on Cloud Backup.
    • Wallet passes from Cloud Functions. Two callable functions return a signed Apple Wallet .pkpass and a Google Wallet save link. Both require authentication and App Check, cap request size, validate every card field and return generic errors, so a bad request never leaks internals.
    • Owner-only data. Firestore and Storage rules are default-deny and owner-only, with their own emulator test suite.
    • In-app account deletion (App Store guideline 5.1.1(v)). Re-authenticate, delete cloud data in batches, then delete the user, in that order, so a failure never leaves orphaned data or a half-deleted account.
    • No tracking on iOS. AdMob runs without the advertising identifier, so there's no ATT prompt, and the App Store privacy label shows no data used to track you. The privacy policy names every SDK: AdMob, Analytics, Crashlytics, App Check and RevenueCat.
    • Hardening. The in-app browser refuses javascript:, file:, intent: and similar schemes from tag payloads, iOS blocks cleartext web content, and Android backups and cleartext traffic are off.

    Built to be found

    • Siri and Shortcuts. iOS App Intents and App Shortcuts for Scan, Write, Bulk Write, QR to NFC and My Card, so they work from Siri, Spotlight and Shortcuts with no setup. Android gets launcher shortcuts and App Actions.
    • Rating prompts with rules. Asked only after 5 successful scans or writes, at least 2 days after install and at most every 120 days. When the prompt shows, it replaces the ad that would have appeared.
    • App Store Optimization. Keywords that don't repeat words already in the name, so all 100 characters count.
    • A website search engines can read. The NFC Wizard website is a pre-rendered React site with per-page structured data, real 404s, guides and a blog. Analytics and attribution load only after cookie consent.

    Business model

    Free with ads covers everyday reading and writing, every tag tool, QR to NFC and the business card. Premium ($4.99 a month or $1.59 a week) removes ads and unlocks the advanced write types, Bulk Write and Cloud Backup. A one-time $1.99 purchase removes ads for people who don't want a subscription. Free users can try any Premium tool once by watching a short ad, which turns a paywall into a free trial. RevenueCat handles subscriptions, and the website sends buyers to the store or straight to the in-app paywall through a deep link.

    Decisions & Trade-offs

    • Write the NDEF codec instead of using a package. More code to own, but exact control over bytes, record sizes and the Wi-Fi format, and every encoder is unit-tested.
    • Hardware behind one seam. Raw NFC commands go through a single transceive function, so the riskiest code (passwords and locks) is also the best-tested, without needing a device.
    • Local first, sync optional. No account to start, and data stays on the phone. Cloud Backup is Premium, which keeps Firestore costs tied to paying users.
    • Try once with an ad, then decide. A rewarded ad unlocks one Premium use, so people can test Bulk Write or Wi-Fi tags on their own hardware before paying.
    • Friction on irreversible actions. A permanent lock gets a confirmation dialog that states the consequence in plain words. Speed matters less there than not bricking someone's tags.
    • Leave out what iOS can't do. App-launch records, Bluetooth pairing records, MIFARE Classic and joining Wi-Fi from a tag aren't promised in the iOS listing, so the copy matches what users actually get.

    Results

    • Live on the App Store as "NFC Wizard: Tag Reader Writer" (Utilities, iOS 15.5+, rated 4+). The Android build is signed and ready for Google Play.
    • About 240 automated Flutter tests covering the NDEF codec, NTAG password protocol, bulk sessions, sync, purchases, account deletion, deep links and assistant shortcuts, plus separate suites for Firestore rules and Cloud Functions.
    • Every write type, tag tool and Premium flow ships from one Flutter codebase, with native Swift only where iOS requires it (App Intents and the Wallet sheet).

    Next Steps

    Publish on Google Play, add a privacy-options entry for EEA/UK ad consent, give the assistant shortcuts their own icons, and turn on Smart Automations, which is built but hidden until after launch.

    Impact

    NFC Wizard is the kind of product I like building most: hardware protocols on one side, store rules and subscriptions on the other. The hard parts don't show in the interface. The app tells you a lock is permanent before you tap it, checks that a write actually landed, and doesn't track you.

    Share this project

    Building something like NFC Wizard: NFC Tag Reader & Writer for iPhone, Built in Flutter? Let's talk.

    Work With Me