About this tool
This page is an NFC tag reader online, and a way to write an NFC tag without an app. It talks to the tag in this tab through Web NFC (NDEFReader). Nothing is uploaded. It runs in Android Chrome, on HTTPS, after a tap. iPhone and desktop visitors still get the about text, the FAQ, and an honest support matrix — the tool does not vanish on them.
What a tag can hold
A reading event carries serialNumber and message.records. Each record has recordType, mediaType, id, data (a DataView), encoding, lang. text shows the string plus lang and encoding. url / absolute-url become a link only for http:, https:, mailto:, tel: and a short whitelist — javascript:, data:, vbscript: stay plain text and are marked unsafe. mime is mediaType plus a hex dump in the hex-editor language. application/vnd.wfa.wsc is a Wi-Fi WPS credential: SSID, authentication, encryption; the Network Key is hidden until you tap, and the page warns that the password will appear in the clear. unknown and external types (example.com:foo) are hex. Bytes this page cannot name stay hex. It will not guess a type.
Writing overwrites. Locking is forever
ndef.write(message, { overwrite: true }) replaces what is on the tag. That payload is gone unless you already exported a backup from a read. ndef.makeReadOnly() permanently locks the tag. There is no rescue — not a factory reset, not a programmer. Both actions stay behind a closed danger panel, then an Arm → Confirm step copied from the fuse writer. Locking also requires typing LOCK. Scan never writes. Write never runs inside the read path.
Waiting is not empty
Holding the phone out and getting nothing yet is "not read", not "the tag is empty". An empty NDEF message (zero records) is a separate result. readingerror is "this tag could not be read". NotAllowedError is permission or a locked tag, not a missing tag. If permissions.query({ name: "nfc" }) throws, that is unknown, never denied.
Android Chrome only
Web NFC is specified for Android Chrome. Desktop Chrome has no NDEFReader. iOS Safari has none. Edge on Android is untested here and marked that way. Feature detection runs after mount ("NDEFReader" in window). Trust the live row, not a version table.