Tilde
A free, open-source Android app that turns a phone into an NFC business card, and the Tilde Card, a 3D-printable business card to go with it. Tap phones or scan the code to share a full contact card, a website or WhatsApp, switching between them in one tap, with no account, nothing to install on the other phone and no internet permission on mine.
Mine end to end: the product, the Android app and its NFC protocol layer, the Tilde Card’s model and its automated checks, releases and documentation. I built it with AI coding agents, using the process on the how-i-work page, and tested it on real phones and real prints.
the problem
Paper business cards get lost, and digital-card apps usually share a link to the vendor’s own servers and want an account on at least one side. I wanted something that works with any phone, needs nothing on the other person’s side, and keeps my details on my phone until I share them.
two halves of one idea
It started as a printed card for events: a QR code on the front and an NFC sticker sealed inside, both opening my site’s /hello page. Then I wanted the same thing when the card was in a drawer.
Android lets an app answer NFC readers as if it were a tag, so the phone itself can be the card. An iPhone reads it the way it reads any NFC sticker, with no app installed. Tilde can also write your link onto the Tilde Card’s NFC sticker, so the app and the card work as a pair.
speaking the protocol
Under the interface, Tilde answers as an NFC Forum Type 4 Tag: it handles the reader’s commands one by one, from selecting the NDEF application to serving long messages in chunks. That whole exchange runs in unit tests on the JVM, so protocol changes are checked without a phone.
Testing on real phones shaped the product. iPhones only act on links from a tap, so the contact card goes out as a vCard followed by my website: Android offers to save the contact, an iPhone opens the site, and the QR code on screen saves the contact on either. The Share screen says which options need a scan on an iPhone.
private by construction
Tilde has no internet permission, so it cannot send anything anywhere. My cards, their photos and the list of people I have met stay on the phone unless I choose to send them, and the app opts out of cloud backup; moving phones is a backup file I keep. A photo only goes out with a contact card I send, and only if I switch that on. Taps are answered only while Tilde is on screen, unless I choose otherwise, and never from the lock screen. There are no analytics and no account.
Nothing personal is in the source. My own details reach my debug builds from a file git ignores, release builds never include it, and I checked the first release APK for my phone numbers before publishing it.
a 3D model that checks itself
The card is a parametric OpenSCAD model in four colors of PLA, printed face-down because the first sample showed the plate side comes out flat and matte. The printer pauses halfway, the NFC sticker goes in, and the rest of the card seals it.
Every build rasterizes the exported model, decodes the QR code and checks every letter stroke and gap against what the nozzle can print, before anything reaches the printer. To let anyone customize the card on MakerWorld, which runs a single OpenSCAD file with no scripts, I wrote a QR encoder in OpenSCAD from the ISO standard; a test compares it with a reference library module for module across every size and mask the card uses.
shipping it like a product
Both halves are public under the MIT license, with documentation written for non-technical people: how to install the app, which stickers to buy and how to print the card. Every push runs the tests and lint in CI. A version tag builds a signed, shrunk release and publishes it on GitHub, where the Obtainium app picks up updates.
Using 1.0 every day shaped 1.1: a four-step welcome with a live preview of the card, saved links with a quick-switch row, and Send for people who aren’t in the room. Changes are tried on my phone as a separate debug app that installs next to the release; a pre-release then updates the real app through Obtainium, so the signed upgrade is tested before anyone else gets it.
Planning for events shaped 1.2. People present themselves differently to a recruiter, a friend and a meetup, so a card became one of several identities, each with its own name, photo, links and color, switched with a swipe. I wrote up what belongs to a card (the identity, what it shares) and what stays global (the Met list, the event name, guest Wi-Fi) in a spec before any code. 1.2 also added backup to a file instead of a cloud, a choice of what each card’s contact card leaves out, a light theme, a home-screen widget and a Portuguese interface.
Several identities in one app is where products like Blinq and Popl put their value, with the identities on their servers. Tilde keeps them on the phone.
screens
architecture
what i built
- An Android app in Kotlin that emulates an NFC Forum Type 4 Tag with Host Card Emulation, serving links, vCards and Wi-Fi credentials as NDEF records.
- Sharing that switches in one tap or a swipe: a full contact card (vCard), a website or profile link, saved links, a WhatsApp chat or guest Wi-Fi, with Send and Copy for sharing at a distance. Plus receive and write modes: read other NFC stickers, cards and phones, or write a link or contact card onto an NFC sticker or a Tilde Card.
- A Met list of everyone a tap reached, with notes, event names and CSV export; a four-step welcome with a live card preview and country-aware phone numbers; a profile photo with an in-app cropper; and a Quick Settings tile.
- Several cards, each a complete identity with its own choice of what its contact card includes; backup and restore through a file; a light theme; the Tilde QR code home-screen widget; and the whole app in English and European Portuguese.
- Unit tests for the tag protocol, NDEF records, vCards, saved links and the Met log, plus CI and tag-triggered, signed GitHub releases (R8 keeps the APK under 2 MB).
- A parametric OpenSCAD card in four colors: QR code only or with an NFC sticker sealed inside (thin or thick), three back styles, 0.2 mm and 0.4 mm nozzle versions, and text that shrinks to fit using the font’s own metrics.
- A QR encoder written in OpenSCAD and a build pipeline that decodes the QR code and measures strokes and gaps on the exported model before printing.
what changed
- Two releases two days apart: 1.1 installs over 1.0 and keeps the card, which I tested by updating through Obtainium from a pre-release before anyone else got it.
- Two permissions, NFC and vibration, and no internet permission.
- Tested on an Android phone with an iPhone reading it, from the first beta.
looking back
What I’d do differently: test phone-to-phone with a second Android phone before 1.0. Next: phone-to-phone taps between two Android phones, the customizable card on MakerWorld, and the Play Store.


