Shortly after releasing version 1.0.0, someone else's announcement was under the spot for being machine-translated and, transitively, the entire app was labelled as "AI slop". The OP and me trying to defend myself were pointed at like "bots" and the discussion degenerated in a weird conversation where everyone had to prove being human (despite account creation dates being messed up due to federation). In today's article, I clarify why a project like Raccoon is not the right use case for AI: why I develop it, what return on investment I get from maintaining it and why it is still important to create things "by hand" for both personal and professional enrichment. In corporate environments some logics apply, in personal projects the dynamics are a little bit different.

reshared this

Navigation is a core feature of every app, it has deep implications in architecture, component lifecycle, state management and restoration and presentation strategies to better adapt to the available space. In Compose Multiplatform, until 2024, there were no official libraries. In today's article we'll see how Raccoon switched from a third-pary solution (Voyager) to Navigation Compose in 2025, to end with Navigation 3 (introduced in CMP 1.10.0) in 2026. We'll briefly analyze how nested navigation, deep links and adaptive layouts were dealt with in each approach, when custom adapters were useful or not during migrations, and conclude with some consideration about how to choose libraries and use them in a future-proof way.

reshared this

This is the last post of our sequence dedicated to ActivityPub groups. It covers how replies are fetched, organized and laid out inside the detail screen for each thread in a given topic. We will describe the tree-like structure of replies, with particular attention on which visual guidelines are added to make it easier to identify relationships between posts. We will then proceed to describe how the structure can be recreated using the available APIs, how the tree is linearized to a user-digestible list and how the points where the tree was pruned are identified.

reshared this

This is the first of a two-article sequence on ActivityPub groups. Part 1 covers ActivityStreams definitions, Mastodon API integration, and the client rendering logic. Part 2 will follow with a deep dive into the code behind populating the reply tree. Here we will briefly go through what a "group" Actor is in theory and how this maps to entities returned by APIs, what UX decisions were made to render posts published by a group and, when moving to the list to the detail screen, how conversations are displayed.

reshared this

Starting from September 30, 2026 the "Android Developer Verification" initiative is going to be rolled out: this means each app must be linked to a verified developer identity, otherwise users will have to face the Advanced Sideloading Flow. While there are well-understandable safety reasons for that, on the other hand, this may endanger platforms like F-Droid, designed around privacy and user freedom. In today's article we'll go though what is going to change, the community reactions and how we'll adapt to this change.

reshared this

When working on a new technology like KMP and CMP, sometimes you run into sharp edges. One of them was Compose Multiplatform previews, requiring either tons of compromises or a setup nighmare. Sometimes, especially when only Developer Experience is involved, it is better to wait until the technology matures. In this article I'll explain how Preview changed with Compose Multiplatform 1.10.0 and how finally adopting them helped me cleanup and improve code.

reshared this

Working on open-source apps and balance maintenance, experimentation and feature requests in one's spare time is not always an easy task. If people start pointing fingers and judge by the way social posts (rather than code) are written, we have a problem. In today's article I discuss why I keep working on side projects, how tasks are priorities and why some choices were reverted over time rather than just pile new features one on top of the other.

The Fediverse is built on the promise of decentralized communication. However, when users from different instances federate, they often encounter a barrier that code alone can not fix: language. Some platforms are designed to integrate with external translation providers, but this has downsides for instance admins (cost and/or maintenance overhead). In this article we'll discuss how managing translation on clients may help distribute costs and let users configure their favorite service.

Beyond contentDescription, this article explores some techniques to improve accessibility in Compose Multiplatform apps. Using Raccoon as a case study, it covers design ideas for better screen reader integration, ensuring content parity and preserving semantics integrity. It highlights that a11y is a collaborative effort: together we can make the Fediverse more inclusive and usable for everyone.

Gradle is the de facto standard build tool for KMP projects and for a reason: it is extremely powerful and highly flexible. However, if not configured correctly, it may result in suboptimal build performance or its configuration may become hard to maintain over time. In this article we'll discuss what are the main issues I experienced and what solutions I adopted to mitigate them in Raccoon; namely its module structure and the convention plugins it uses.

Did you notice that in the latest beta versions, besides APKs to install on Android a .deb package has popped up to be installed on Debian-based Linux distros? This is not by chance: thanks to Kotlin Multiplatform's power, Raccoon has been ported to JVM and can now run as a desktop app. In this post I'll shortly describe how this came to be, from ideation to implementation; which were the main challenges I found in the migration process and what potential implications it has on the project and its users.