← Cairn

Notes on setting it down

I shipped a journaling app to the App Store and then stopped using it. Here is why.

Cairn is a small journal. You pick one word each morning, and add a sentence in the evening if you want to. It runs on iPhone and Apple Watch, has widgets and watch complications, syncs through your own iCloud, and collects no data at all. No accounts, no analytics, no servers.

It works, and it is still on the App Store. I stopped opening it about two months after launch.

The problem was the trade, not the app

Cairn asked for a Home Screen slot and a deliberate daily open. In return it gave back one word. Those are two of the most expensive things you can ask of someone's phone, and one word does not cover them. When I finally said it plainly, it came out as this:

I needed my phone real estate more than I needed a word.

The mistake is visible in my own commit history. After launch I added six things: memories that resurface on anniversaries, a growing cairn built from your words, a year in words poster, milestone celebrations, rotating encouragements, and an engine that brings old words back. All six were attempts to increase what the app gave back.

None of them reduced what it asked for.

My roadmap had a phase called "Delight and retention" and a phase called "Monetize." It had no phase for making the daily habit cheaper. I spent months raising the payoff and no time at all lowering the cost.

What it should have been

The version that would have worked was already built. I just never committed to it. The widget should have been the product, and the app should have been the accessory.

That version has no Home Screen presence. You tap the Lock Screen widget, a few suggested words appear, you tap one, and you are done. Two seconds, no app launch, no typing. The typing matters more than it sounds. Composing a word from scratch is a fifteen second task that needs energy I did not always have at 7am. Picking from a short list is one tap.

It would also have no reminder and no streak. The widget would just sit there, answerable, costing nothing on the days you ignored it. And the reward would not be a screen of stats you have to go looking for. It would be one thing a year, delivered outside the app: a printed book of your words.

That is a different product, and about a third of the code. I am not going to build it. But it is the honest answer to what this should have been.

The question I should have asked first

What does this cost someone every day, and what does it give back on the first day?

If something outside the user supplies the deadline or the effort, a product can afford to earn its place slowly. A birthday supplies urgency. A job supplies obligation. Other people supply the content. If nothing outside the user does any of that, the product has to be worth more than the attention it costs immediately, because nothing else is holding it up.

Cairn had no deadline and no second contributor. It was just me, asked once a day, indefinitely, to supply the only material the app had to work with. That is the hardest shape a capture product can take, and I picked it without noticing I was picking anything.

What it taught me

This was the first thing I shipped to the App Store, and most of what I got out of it was the shipping.

Keeping state in sync across devices is harder than it looks. Cairn shows the same day's word on an iPhone, an Apple Watch, a Home Screen widget, a Lock Screen widget and a watch complication. CloudKit handles the durable part, but it is not fast, so the watch could sit there showing yesterday while the phone already knew better. I ended up adding a direct phone to watch channel for the current day only, and leaving CloudKit to own the history. Two mechanisms, one source of truth, and a rule for which one wins when they disagree.

The other lesson is how little control you have once you leave the app. Lock Screen widgets and complications get a small space, a fixed set of layouts, and refreshes on the system's schedule rather than yours. You cannot assume your widget is current, so it reads from a cache the app keeps warm, and it has to look right even when that cache is a little stale. Designing for that is a different job from designing a screen.

Where it is now

Still on the App Store, still free, still collecting nothing. I shipped one last release to fix two real bugs, wrote this, and stopped.

I did not delete it. Cairn was built on the idea that a missed day is not a failure, which is why it counts words instead of streaks. It would be strange to hold the app to a stricter standard than it holds its user. If there is a stretch where one word a morning sounds good again, it will be there, working, with my words still in it.

Not never. Just not now.