The week my calendar app stopped being just mine

I built Calendula for myself. I wanted a fast, good-looking, privacy-respecting calendar that didn’t own my data, couldn’t find one, and so I made one. For a while that was all it was: my app, my phone, my taste.

Then people showed up. Not many, and not all at once, but enough in about two weeks that the project stopped feeling like a thing I have and started feeling like a thing I’m responsible for. This is a note about that shift, because it happened much faster than I expected.

From requests to a rhythm

The first issues were classic solo-dev fare. Someone asked for a setting to choose which view the app opens on. I shipped it in v2.9.0 within hours, and “that was quick!” came back. Then a tappable month grid, then a Saturday week start, each one small and turned around fast. Then someone asked to limit the agenda view to today, or this week, or the next 30 days. That’s where it got interesting, because I stopped building the literal request and started asking what options would you actually want, and we designed it together in the thread.

That rhythm of report, discuss, ship, “thank you” keeps a small open project moving. It can also become a trap, because not every request should be built. Saying yes quickly is easy. The harder skill is saying no well and keeping the app inside its lane while the person still leaves happy.

The moment it gets real

For me, one sentence changed how I felt about the project. It arrived on an issue about registering an intent filter, from someone who’d hit a papercut on GrapheneOS:

I have been looking out for a well-designed and fast calendar since switching to Android four years ago and your software seems to be on point.

Four years of waiting. Here was someone who’d been holding out for exactly this and was ready to depend on it. In the same thread I admitted a limitation: Android has no API for an app to set itself as the default calendar, so an in-app button isn’t possible, only the system picker. Being upfront about that went over better than a workaround would have. People rely on software they trust, and in my experience trust mostly comes from not overpromising.

When users become co-designers

I noticed a community forming when people started doing the thinking with me as well as the reporting.

A request to make the view quick-switch button configurable turned into an actual design debate. Should reordering live in a settings tab, or should you long-press and drag items in place? Would drag-in-place cause accidental reordering? We went back and forth on the interaction itself. On the contact-birthdays feature, a user who wasn’t even the original reporter created test contacts, one Google and one CardDAV, to help me isolate why some birthdays showed up and others didn’t. That’s debugging with me.

I don’t have a big community. I have a handful of people who care about a good calendar as much as I do, and who’ve started treating its rough edges as our problem.

The unglamorous parts, on purpose

In the same fortnight I shipped a release that mangled the month widget’s switching buttons, a regression a user caught and I had to dig out of a recent change. The birthday feature still doesn’t handle every account type. I could have left those out of this post. But I work in the open, on a public tracker, so the reasoning and the mistakes stay readable, and anyone can follow the conversation later instead of finding a terse “closed” label.

A project stops being just yours once someone else would notice if it broke. Calendula got there quietly, in a week of issue threads, and it has changed how I write every commit since. I used to ask whether a change pleased me. Now I ask whether I’d want to explain the decision to the people in the comments.