// wear os ยท nfc ยท host card emulation

Your watch is an NFC tag now.

Pick a link on your wrist, hold the watch to someone's phone, and their phone opens it. Your website, a video, your contact card, or a "totally normal link". No app on their end. No pairing. No account.

๐ŸŒ
My website
โ— armed
9:41
NFC TAGOpen link?rusty.is-a.dev
drag the phone onto the watch

Small app.
Unreasonably fun.

Everything a tag can hold, on a watch you already wear, with presets you edit from a real keyboard.

๐Ÿ”—

Any link, instantly

Android opens it the moment it reads the tag, YouTube links straight into the YouTube app. iPhones show a banner to tap.

๐Ÿ‘ค

Contact cards

Beam a vCard and Android offers to save you.

๐Ÿงฉ

Quick tile

Seven presets, one swipe from the watch face.

๐Ÿ“

Browser editor

Paste, rename, reorder. It autosaves and the watch syncs.

โœˆ๏ธ

Offline

Presets are cached, so beaming never needs a network.

๐Ÿ“ณ

Buzz buzz

Two taps on your wrist when the phone has read the whole tag.

๐Ÿ›ก๏ธ

Wallet-safe

An "other" category service, so tap-to-pay never notices it.

How a watch
becomes a tag.

Android's Host Card Emulation lets an app answer the exact commands a real NFC Forum Type 4 tag would. Flick implements just enough of that tag, and nothing else.

1

The phone asks for the NDEF app. Flick registers the standard NDEF AID, so any phone that reads tags will knock.

2

The watch hands over a capability container, then one NDEF file built from whatever preset is armed, snapshotted so a switch can't tear a message.

3

Nothing armed? It says "file not found". The watch simply isn't a tag until you want it to be.

phone00 A4 04 00 07 D2760000850101select the NDEF application
90 00yep, I'm a tag
phone00 A4 00 0C 02 E103select the capability container
00 0F 20 00 3B 00 34 04 06 E104 ...here's how to read me
phone00 B0 00 00 2Aread the NDEF file
D1 01 26 55 04 72 75 73 74 79 ...URI record: https://rusty.is-a.dev
*bzzt bzzt*read complete, buzzing your wrist

What their phone does.

Android, unlockedOpens the link right away
iPhone XS or newerShows a banner; tap it
Contact card, Android"Add contact" sheet
Contact card, iPhoneIgnored, iOS doesn't open vCards from tags
Where to hold itWatch face flat on the phone's NFC spot: middle of the back on Android, top edge on iPhone

Set it up.

Two pieces: a tiny editor server on any always-on Linux box, and the watch app.

The editor

# server/flick.env: FLICK_KEY=..., PORT=8480
scp server/flick.py server/editor.html \
    server/flick.env box:~/flick/
scp server/systemd/flick.service \
    box:~/.config/systemd/user/
ssh box 'systemctl --user enable --now flick'
# then open http://box:8480/#k=FLICK_KEY once

The watch

cp flick.properties.example flick.properties
# set server.key = FLICK_KEY
./gradlew :app:assembleRelease
adb install -r app/build/outputs/apk/release/app-release.apk
adb shell cmd package compile -m speed \
    -f com.rusty.flick