Skip to content
All work
ActiveAugust 2026 – Present

A drawing app for exactly two people.

ILY

Phase 7 of 9. Web app and NFC contract working; physical-object qualification open.

Not yet public
  • TypeScript
  • React
  • Vite
  • Cloudflare Workers
  • Cloudflare D1
  • Durable Objects
  • Web Push
  • Web NFC

One thumb, patchy signal, two time zones, and an object you tap to open it.

What it is

An installable web app that lives on two phones. You draw something with your thumb, you send it, the other phone says it arrived. Tapping a small printed object with an NFC tag in it opens the app and starts the connection. That is the entire product.

A small idea taken seriously: a shared archive of what has been sent, both local times on screen at once, and a doodle sent to someone with no signal still arrives when they come back. 12,100 lines, 201 tests, 241 commits.

It does not scale, on purpose

Built for exactly two approved people. The design would have to be thrown away to support three.

No feed, no discovery, no sharing outward, no sign-up. Every decision that would normally go to growth went to the two people who use it, which is a rarer exercise than it sounds, because almost every default in modern web tooling assumes the opposite.

Where the hard parts were

Four constraints set the problem: one thumb, two time zones, patchy signal, and a physical object. Three of them turned out to be the engineering.

Idempotent NFC finalization. A phone tapping a tag is lossy and retry-prone, and the naive version double-fires. Finalization runs through a Durable Object, so a repeated tap resolves to the same event rather than a second one. That is the same approved-equals-executed problem as VERONICA, in a much smaller frame.

Offline as the normal case. A doodle sent to someone with no signal is the expected path, not the error path. The archive rolls and delivery is eventually-consistent, because the alternative is an interface that lies about state.

Costs bounded by architecture. Workers, D1, Durable Objects and static hosting keep a two-person product inside Cloudflare's free tier, with the domain the only intended recurring cost. A design constraint that changes what you build, not a bill you optimize afterward.

The accessibility bar

WCAG 2.2 AA, full keyboard operation, prefers-reduced-motion substituted rather than switched off, 44×44 minimum targets, colour never the sole carrier of state.

A two-person drawing app is exactly where it would be easiest to argue the standard does not apply. Nobody is auditing it. That is the reason to apply it, and the reason the bar is the same one I hold on work somebody is paying for.

Physical and digital

Phase 7 of 9. The web app works and meshes verify locally. The NFC object is a printed enclosure on a layer contract the geometry is not allowed to violate, and the phase closes when a real phone reads a real printed object reliably.

The interesting half is already proved: a product where the hardware, the network and the person can each fail, and the app tells the truth in every one of those cases.