index / work / bubba

Building Bubba

A desk object with an NFC chip in it, and an iOS app that locks your distracting apps until you get up and tap the object. Moulded puck, cast concrete base, brass inserts set into the pour so it comes apart cleanly. The object is the only key.

Live, early access. In testing with 20 people.1 No traction numbers on this page: testing has only just started, and what comes out of it goes in the log rather than here. The physical object is not photographed yet because it is still changing.

rolesole designer, engineer and manufacturer
stackSwift, SwiftUI, FamilyControls, ManagedSettings, DeviceActivityMonitor, Core NFC, CloudKit, Supabase
screens11
voice lines85 across 15 banks2
hardwarev6 prototype, in-house moulding route
testers20

The mechanism

three parts, and the middle one is the product

The object

A circular recycled polypropylene puck sitting in a cast base, with an NFC tag behind the puck face. It has no battery, no pairing dance and nothing to charge. It sits where you work.

The gate

The app selects apps to block using Apple's Family Controls and ManagedSettings, at the system level. Not a timer that nags you, not a screen you can swipe away. The blocked apps do not open.

The walk

The only way to unlock mid-session is to physically return to the object and tap it again. Tapping opens thirty seconds of a flat grey screen with one line on it, then five minutes of unlocked apps, then the session resumes where it paused.

Every focus app sells discipline. Bubba sells the walk back to the desk, which is the part that actually works.

The distinction matters commercially as well as behaviourally. Software friction can be defeated from the sofa, so it gets defeated. Friction with a floor plan in it does not.

The Bubba holding page: a blackletter wordmark in red over a dark, heavily dithered engraving of a lamplit hall.
The holding page at tapbubba.com. Art direction rather than product: the object is not photographed yet, so the page carries the engraving and the wordmark and nothing it cannot stand behind.

The app

four of the 11 screens, and one that is iOS's

The Bubba home screen: a dithered engraving of stone steps, the numeral zero, and a button reading MAKE A VOW.
The home screen. The engravings are public-domain plates put through a dither at two colours, and which image appears depends on the time of day and what the record says.
The Vow screen: five duration options from thirty minutes to four hours, and a button reading SIGN THE CONTRACT.An active session: a dithered engraving of a stone staircase, a timer reading twenty-nine minutes fifty-eight, and a SURRENDER button.A screen reading "You know where the totem is", with a button reading TAP THE TOTEM.
Signing, serving, and the only way out. Five fixed durations and no free-text field, because a minutes box invites you to negotiate before the session starts. The third screen is the whole product: the app will not unlock until you have walked back to the object.
The iOS block screen over a locked app: a horn illustration, the heading THE INCARCERATED, and the line "You know where the totem is."
The screen iOS renders over a blocked app. The icon, the title, the subtitle and one button label are mine. The shape, the typeface, the background and the second button are the system's and cannot be changed, which is why this screen looks like a different product to the rest.

The object

two components, and why they come apart

Two components. A black recycled PP puck, partially recessed into a cast Jesmonite base in charcoal, raw finish, no sealer. BUBBA is set into the front face of the base in recessed blackletter, cut into the mould rather than added to the object afterwards. Brass inserts go into the pour so the two halves bolt together and come apart again, which matters for repair, for replacing the tag, and for getting the electronics out at end of life.

The NFC inlay goes in behind the puck face after moulding rather than during it, because the tag does not survive the heat. That is a small decision that changed the assembly order and the underside geometry of the puck. The production chip is an NTAG215, chosen over the cheaper 213 for read lifetime rather than memory: this is an object you tap several times a day for years, so the number of reads it is rated for is the specification that matters.

Made in-house rather than tooled out. A desktop injection moulder produces the puck from shredded recycled PP, a printed polycarbonate insert gives the puck its surface, and the base mould is a printed master, cast in silicone, poured in Jesmonite. 6 prototype iterations so far. The reason for the in-house route is not cost, it is that the design is not finished, and a tooled part would have frozen it at v2.

Silicone mould held above three cast and printed bases.
The negative and the positives. The blue silicone is cast from a printed master, and the bases under it are three iterations of what comes out of it. Every part of this except the silicone was made on a printer on a desk.
The mould lettering above the cast lettering it produces.
Lettering runs printed, then mirrored in silicone, then recessed in the cast. Half a millimetre of relief is the working minimum before the letterform stops surviving the pour. The pinholes are the raw finish, not a fault to be sealed over.
Printed mould box clamped shut on a tile, ready to pour.
The mould box clamped up before a pour. Bulldog clips and a spare tile, which is what the manufacturing route actually looks like at this stage.

Decisions

drawn from the log

No app without the object.

Install the app without a paired object and you reach a dead end that does not offer a workaround, a trial or a soft version. The product is a £50 object with the software attached, not a subscription with a novelty accessory, and a soft gate would have made it the second thing within a week.

Five durations, no custom field.

30 minutes, 60, 90, two hours, four. A free-text minutes box invites you to negotiate with yourself before the session starts, and that negotiation is the behaviour the product exists to interrupt.

Surrender is an event, not an outcome.

Walking over and unlocking mid-session does not fail the session. Only deliberately abandoning it does. The record shows both, so a completed session that took three interruptions reads as a completed session that took three interruptions, which is the truth and is more useful than a failure.

The clock pauses, it never rewinds.

Interrupting a 60-minute session costs you the walk and the wait, not the 40 minutes you already served. Punishing served time would teach people to abandon sessions instead of returning to them.

One notification.

A single nudge after three days of inactivity, and nothing else. There is no streak reminder, no daily prompt and no re-engagement sequence. An app about not being interrupted does not get to interrupt you.

Red is rationed.

One accent colour, seven permitted uses, written down as a list rather than left to judgement. Two typefaces, no exceptions.

What it actually took

the unglamorous parts

The Family Controls entitlement is granted by Apple case by case, and the APIs behave differently under it than they do in the documentation examples. Sessions have to survive the app being backgrounded and the phone being locked, which is DeviceActivityMonitor rather than an in-app timer, and getting that persistence honest took longer than building every screen in the app put together.

The hardware moved from a supplier route to an in-house one after the first quotes came back. A 500-unit injection moulding quote was on file and viable, and taking it would have meant committing the design before the surface texture, the puck dimensions and the fixing were settled. The printer and the moulder together cost less than that run and left the design unfrozen.

Copy is not written into the interface. Every line the product says comes out of a JSON voice bank, banked by moment, so the tone can be revised without touching a view, and the same line never has to be found in three places. This is the part that will look like over-engineering until the first round of tester feedback says a screen reads wrong.

A field existing in the data does not entitle it to a screen.

The stats screen counts seven things and refuses several more that were easy to compute. Anything that turned the app into a dashboard came out, including the entry count on the home screen, which made a threshold feel like an inbox.

What is not done

known gaps, stated plainly

Sources

  1. 20 people in the test group, counted from the tester list. It counts access granted, and says nothing about how many of them use it.
  2. Screen and voice line counts taken from the build and the voice bank on 3 September 2026. Counts what exists, not what is finished.