Share a Joplin note or a link to NoteTag, hold an NFC tag against the back of the phone, and the tag carries that note from then on: tap it later and it opens. That is the whole product — a narrow note-and-link NFC utility, and deliberately nothing else.
- Application id
com.loosecannon.notetag, labelNoteTag. - NDEF external type
com.loosecannon.notetag:tag— the only type NoteTag writes, and the only one its singleNDEF_DISCOVEREDfilter matches. - No Android Application Record. A NoteTag tag never carries an app to install.
- The deep-link scheme
notetagis reserved and undeclared: noVIEWfilter is registered at reconstruction, and the scheme is held for the roadmap below. - The icon and theme use a blue palette derived from Joplin's, not its colours.
Each of those values is typed once, in app/build.gradle.kts; the manifest carries a placeholder
and BuildConfig carries the same strings, so the filter and the codec cannot drift apart.
One record, format v1 — version | kind | flags | body — in one of three kinds: JOPLIN_NOTE
(the note's 16 id bytes, 49 bytes as an NDEF message), URI (the link itself), or LOCAL_REF (a 16-byte
UUID that means nothing without this phone).
The writer decides on its own and tells you what it did: a Joplin note is written as the compact
JOPLIN_NOTE; any other link is written whole as a URI when the encoded message fits the tag's
measured Ndef.maxSize; only when it does not fit does the writer fall back to a LOCAL_REF and
keep the link in a small JSON map on the phone. Tags written as a local reference only work on
this phone — NoteTag says so before the write and again when it lands, and the mapping is saved
before any byte reaches the tag.
- No chooser. The kind is the writer's decision, not a question put to you.
- It does not write ServiceTag tags, and does not read them as damage. A tag belonging to the sibling product is named as ServiceTag's, and overwriting it takes one explicit confirmation.
- No export or import of the local map yet, so a
LOCAL_REFtag does not survive a move to a new phone. Back up the app if you rely on one. The map is excluded from Android's cloud backup and from device-to-device transfer by design (res/xml/data_extraction_rules.xml) until the recovery roadmap item lands, so a restored or transferred install starts with no mappings rather than with mappings it cannot vouch for. - On a tap it opens
joplin,obsidian,logseq,httpandhttpslinks; any other scheme becomes a sentence on the list rather than a launch.
Roadmap, inherited from the original line and retitled under the NoteTag name: #6
"Generalize external note/deep-link support beyond Joplin" and #36 "First-class deep-link
support for Joplin, Obsidian, Logseq, Evernote, Notion, OneNote and Todoist" — a notetag://
VIEW filter belongs to those, which is why the scheme is only reserved here. The LOCAL_REF
export and import is its own item.
./gradlew :core:test :app:testDebugUnitTest :app:assembleDebug
A fresh clone has no local.properties (it is gitignored), so supply the SDK path out of band:
ANDROID_HOME=~/Android/Sdk. From Phase G, when the tag format moves into the shared
nfc-tag-core library, clone with --recurse-submodules.
:app:assembleRelease signs with the existing key when
~/.config/notenfc/keystore.properties is present and carries all four values — storeFile,
storePassword, keyAlias, keyPassword. The path keeps its original name on purpose: it is
the same key the 2024 app shipped with, so an installed NoteTag updates instead of colliding. A
missing or partial file fails the signing, not the configuration: the build still runs and
produces app-release-unsigned.apk.
The key's SHA-256 certificate fingerprint is recorded once, in the ServiceTag repository's
docs/design/phase-1a-evidence.md. It is not reproduced here, and the keystore itself never
enters the repository (keystore.properties, *.jks and *.keystore are gitignored).
A release is a tag of the form notetag-v<versionName> (e.g. notetag-v2.0) pushed to
GitHub. That tag alone triggers .github/workflows/release.yml, which checks out the exact
commit under the release environment, runs the full test gate, builds the signed APK from that
environment's four secrets (RELEASE_KEYSTORE_BASE64, RELEASE_STORE_PASSWORD,
RELEASE_KEY_ALIAS, RELEASE_KEY_PASSWORD), verifies the built APK's certificate against the
public repository variable RELEASE_CERT_SHA256 and its versionName against the tag, and only
then publishes the signed APK and its SHA-256 checksum as a GitHub Release. Ordinary CI
(.github/workflows/ci.yml) never sees any of that signing material — it stays unprivileged and
runs on every push. tools/release-dry-run.sh is the local, no-secrets equivalent: it runs the
same checks against whatever signing material is on this machine and reports PASS, PARTIAL — signing identity not independently checked, or BLOCKED without ever printing a fingerprint,
password or keystore path.
The narrow note-and-link NFC utility, reconstructed from its own history. This repository's
master continues the original noteNFC line unchanged through c84b881 (the last commit before
that product grew into ServiceTag) and starts the NoteTag rewrite from there.
It deletes the ServiceTag design documents and the 2024 release APK from the tree, because they belong to the other product. It does not scrub anything from history, and no history rewrite will ever be performed here. Reachable in this repository's public history, deliberately: the ServiceTag design documents; the owner's public GitHub handle and issue links; the release-signer certificate digests; and the author name and email on every preserved commit. None of it is a secret — a public handle and public-key fingerprints — and all of it is already public in the repository this one was cloned from.
Everything else about NoteTag — identity, tag format, store, screens — is written fresh in the
commits that follow; see the migration runbook in the ServiceTag repository
(docs/architecture/product-split-migration.md, §A.2) for the sequence.
- ServiceTag — the maintenance-tracker product the same codebase grew into, and the sibling whose tags NoteTag names rather than reads. Its repository holds the split's architecture, migration and evidence documents.
- nfc-tag-core — the shared tag-format library both products will adopt in Phase G. Not yet created; until it exists, NoteTag carries its own copy of the format and of the thin NDEF bridge around it.