The Fediverse represents the future of social media — decentralized, open, and user-controlled. As
platforms like Mastodon, Friendica, and Lemmy gain momentum, developers face a crucial question:
how do you build modern, cross-platform applications that can keep pace with this rapidly evolving
ecosystem?
The answer lies in Kotlin Multiplatform (KMP) combined with Compose Multiplatform (CMP) — a
technology stack that is uniquely suited to solve what I refer to as «Fediverse development
challenge».
Modern users expect native experiences across mobile, desktop, and web platforms. Traditional
approaches usually force developers to choose between:
- building separate native apps (which is expensive and slow to iterate)
- creating web-only solutions (with the disadvantage of limited platform integration )
- using older cross-platform frameworks for app development (which may imply performance tradeoffs
or increase the side of the app package).
Fediverse protocols like ActivityPub are intricate, requiring sophisticated networking, JSON
parsing, proper state management and a well-designed and future-proof implementation.
Duplicating this logic across multiple platforms introduces maintenance overhead for sure, plus it
may potentially lead to bugs.
The Fediverse moves fast: new features, protocol extensions, and federation behaviors emerge
regularly. The development stack needs to support quick iterations and seamless updates across
all platforms, in order to adapt to changes rapidly, release quickly and reach the widest possible
audience.
KMP is flexible and allows you to choose what to share: for example, you can share the complex
business logic — ActivityPub implementation, federation handling, data models, and networking —
while keeping platform-specific UI native. Otherwise, you can also share some UI parts or, if you
are brave enough, all of it with Compose Multiplatform (CMP) as we do in Procyon.
The key concept is, it is not an "all or nothing" choice where you either opt in or opt out
completely at once, you can gradually choose what to share and when to do it, which gives you as a
developer great power (even to roll back some of your decisions if you want to).
The expect/actual mechanism, moreover, makes it possible to access underlying operating system
features (such as filesystem, gallery, camera, video playback, push notifications, inter-process
communication e.g. sharing data to other apps or receive data from other apps through deep links)
when you need them, defining your own abstractions to call from common code.
Kotlin's strong type system and sealed classes make it excellent for modeling ActivityPub entities
and activities. You can create robust, compile-time-safe representations of posts, actors, and
interactions that work identically across all platforms.
There are even libraries,
like LemmyBackwardsCompatibleAPI which offer
abstractions for Lemmy data types and a unified adapter to endpoints which make it transparent for
client-apps developers which version of the backend is used by the current instance.
Libraries like Ktor, Ktorfit and
kotlinx.serialization provide first-class
support for HTTP clients, API modeling and JSON parsing — essential for Fediverse applications that
constantly communicate with various servers and handle complex data.
Using these three libraries in conjunction (with KSP, the Kotlin Symbol Processor) makes it
extremely simple to define endpoint calls, handling asynchronous result and errors in an idiomatic
way. Dealing with KSP in a multi-module and multi-platform project may pose some difficulties,
nonetheless, stay tuned for updates on this in future posts.
Kotlin coroutines excel at handling the asynchronous, real-time nature of social media
apps. Parent-child relationships between tasks, when background operations are tied with the
lifecycle of a screen, allow to gracefully cancel tasks when their result is not needed, saving
battery power and limiting data transmission over the network.
Social media interfaces are inherently complex — timelines, media galleries, thread
visualizations for discussions, and real-time updates. The declarative approach of Compose
Multiplatform makes these interfaces easier to build and maintain than traditional imperative UI
frameworks.
Fediverse apps benefit from consistent branding and behavior across platforms. Compose Multiplatform
lets you implement your design once and deploy it everywhere, ensuring users get the same
experience (no matter whether they're on Android, iOS, desktop, or web).
Material Design 3 is a modern and robust design system which ensures consistency, accessibility and
customization options.
Unlike web-base cross-platform solutions, Compose Multiplatform compiles to native code, providing
the smooth scrolling and responsive interactions that social media users expect, which are
especially important to make the Fediverse as engaging as possible for users and promote its
adoption.
When new ActivityPub extensions or features emerge, you can implement them once in shared KMP
code and immediately have support everywhere. This is crucial to keep up with the
fast-moving Fediverse ecosystem.
For example, Raccoon is going to provide Lemmy 1.x support to all its target platform (Android, iOS)
at once, see this issue to
monitor the state of integration.
Not only the implementation code is shared, with KMP you can also share tests. For business logic
this is pretty straightforward (more on this in future posts, especially for mocking libraries) —
whereas UI tests need a device to run (iOS simulator, Android emulator, etc.) but it is nonetheless
possible to write tests once and run them on multiple devices (more on
this here).
A single, well-structured Kotlin codebase is more approachable for open-source contributors than
maintaining separate applications. This matters for Fediverse projects that often rely on community
development, when the workforce is often limited to few volunteers.
The Kotlin and Compose Multiplatform ecosystem has matured significantly over the past few years and
at Procyon I've seen it grow from 2023 on.
Key libraries for Fediverse development include:
Building a modern Fediverse app requires balancing rapid development, protocol complexity,
and user experience across multiple platforms.
Kotlin Multiplatform and Compose Multiplatform provide the perfect foundation — letting you focus on
what makes your Fediverse app unique while sharing the complex domain code that makes your app work.
The Fediverse represents a return to user agency and open protocols. Your development stack should
embody those same principles: open, flexible, and designed for the long term. Kotlin Multiplatform
and Compose Multiplatform deliver exactly that.
Tip
Ready to build the next great Fediverse app? The tools are here, the protocols are maturing,
and the community is waiting.