Announcing Nicolium v0.1.0

ok i just realized i can’t really write a good blog post, so i’ll publish it on my personal website rather than the project page.

i’m finally releasing a ‘stable’ version of Nicolium, a Fediverse client i’ve been working on for almost two years now. as the project’s actually being used by Fediverse users, it kinda makes sense to start doing tagged releases, so you don’t have to rely on the develop branch where i break stuff pretty often.

history, what’s Nicolium

Nicolium started in april 2024 as a fork of Soapbox, a web client for platforms implementing the Mastodon API that was initially forked from the official Mastodon web client. it was a codebase i was familiar with, so i quickly began working on major changes to it. shortly after the fork, i named it pl-fe, after the name of my other project—pl—which was my soft fork of Pleroma backend. it was a bad name i always considered to be just a placeholder.

after making the fork, i quickly realized there are so many things i wanted to change about the codebase, how opinionated the Soapbox UI was (eg. it doesn’t let you react to a post with more than one emoji at the same time). while there are some goals shared between projects (like the inherited feature checking that helps with supporting multiple platforms) and the styling stayed mostly the same, i don’t believe it makes sense to define Nicolium as a ‘Soapbox fork’ anymore, the same way it wouldn’t make sense to call it simply a ‘Mastodon fork’ either. i spent a lot of time refactoring the codebase, while also adding a lot of features and fun stuff.

i’ve made significant changes to the codebase—fully replacing the state management system inherited from Mastodon with TanStack Query and Zustand, migrated from React Router to TanStack Router which will help me implement the multi-column interface the way I want it to work, and mostly migrated the styles back to SCSS instead of Tailwind CSS, which i don’t like, but—more importantly—makes customization harder for users relying on userstyles.

while posting about it on my personal profile, without doing much to promote it, i got a lot of positive feedback from people who started using it, notably Iceshrimp.NET users (its official client is not as complete and polished as the backend yet), which made me work more on supporting Iceshrimp.NET features specifically and make it possible to run Nicolium alongside Iceshrimp.NET backend. i’ve seen people using Nicolium at events such as Sesja Linuksowa, Chaos Communication Congress and FediDay Berlin and learned that some people i’ve known for years started using it, which feels really rewarding. i got a lot of feedback that helped me improve the project and influenced the direction of development.

i don’t really know how many people Nicolium actually has, there’s no telemetry or anything, but it’s really nice to see it getting some recognition and being used by others.

so what IS Nicolium?

Nicolium is a web client for the Fediverse, built with web technologies such as TypeScript and React. it supports platforms implementing the Mastodon API, such as Mastodon, Pleroma, GoToSocial, and more. it has an explicit goal of supporting features that are not part of the Mastodon API, such as emoji reactions, chats, interaction policies and so. it also has a lot of client-side features, such as a WYSIWYG post editor, draft posts, or a warning that helps you remove tracking parameters from links before posting them. it has a lot of customization options, letting you change the color scheme, the way threads work and so on.

and it displays cat ears on your avatar if you enyable them (on supported backends).

as part of working on Nicolium, i also created a library called pl-api, which is a Mastodon API client which also supports features that are not part of the Mastodon API, such as the aforementioned emoji reactions and chats. it tries to abstract out the differences between Fediverse backends and provide a type-safe way to interact with them. the feature checking system is now part of pl-api, so it can be used by other clients as well. i hope this will be useful for other client developers, because it can be really hard to support multiple platforms manually. also, Mastodon doesn’t help by implementing new API features that are often incompatible with schemas that’ve been used by other platforms for a long time, so it’s nice to have a library that can handle all the differences for you.

future plans?

for the v1.0.0 release, i want to get rid of Tailwind CSS fully and implement the multi-column interface (aka Deck) with full multi-account support. i might possibly implement missing features of some backends, but i don’t want to focus too much on new features for now. just adding new features without properly refactoring the codebase feels a lot like ‘vibe-coding’. it’s easy, feels rewarding, but generates a lot of technical debt and makes the project unmaintainable in the long run (but at least home-made human slop won’t become more expensive as the AI companies switch to a more profitable business model). i want to spend more time improving the code quality.

next releases will probably be focused on improving customization options. i also want to make the client feel more like a native app, making it work better with limited network connectivity and so on.

release notes?

i don’t think it makes sense to cover all the changes since the fork. there’s a changelog in the repo, but it might not actually be complete. instead, i recommend just trying it out. i will start doing proper release notes for future releases (and i hope it doesn’t make me defer releases for too long because it would force me to write a changelog).

you can try Nicolium out by visiting web.nicolium.app and find the source code on Codeberg. if you’ve encountered any bugs or want to suggest a feature, you can open an issue on Codeberg. the documentation describes how to deploy Nicolium alongside your own fedi instance and how to start contributing. you can also join Nicolium IRC channel on libera.chat if you want to chat about it.