Blog
Why your CalDAV calendar reminders never fire on Android
Your Nextcloud events sync to Android and the reminders stay silent. Four causes, in the order worth checking, including the one you can't see from the phone.
What Material 3 Expressive actually changes in Compose
Material 3 Expressive is mostly a motion system. What motionScheme gives you, which spec to reach for, and the two defaults worth overriding.
Opening an .ics file on Android without Google Calendar
Why an .ics attachment so often does nothing on Android, what the file actually is, and how to import one into a calendar app that doesn't need an account.
Nextcloud calendar on Android: DAVx⁵ and the other half
DAVx⁵ syncs your Nextcloud calendars into Android's own calendar store. Choosing what displays them, and delivers the reminders, is the half guides skip.
The feature I said no to (and the one I found instead)
A user asked Calendula to sync itself to a plain .ics file. Talking it through in the open turned that "no" into a smaller and better feature.
Why your CalDAV events show sixty shades of the same blue
Why CalDAV calendars hand Android an overstuffed colour picker, and why dark event titles turn unreadable. Both trace back to the calendar provider.
The translator who emailed me
I self-hosted Weblate to invite translators. A missing email setting silently blocked the first one who showed up, until he emailed me directly.
"This event only" vs "all events": the edit that did nothing
What "this event", "this and following events" and "all events" each do to a recurring event, and why saving a single instance is the sharpest edge in the calendar model. A bug in Calendula, explained.
The week my calendar app stopped being just mine
Calendula was something I built for myself. Then strangers started relying on it, filing issues and debating design, and it grew a small community.
Compose for widgets, RemoteViews underneath
Jetpack Glance lets you write Android home-screen widgets in Compose, but it compiles down to RemoteViews, so the old constraints still bite. Three bugs.
Hello, world
The hello-world post for this site: what it is for, how it is built with Astro, and what I plan to write about here.
Why my calendar app has no internet permission
A calendar app without internet permission: Calendula has no INTERNET line in its manifest at all, because it builds on Android's CalendarContract.
Open standards as a constraint, not a checkbox
CalDAV, iCalendar, OpenTasks, DecSync: why I treat open standards as a hard boundary for what the Floret apps are allowed to do.