Hermeia

A team messenger running on Android and iOS from one codebase. Servers, channels, threads, roles, DMs and groups - the full set, smooth like Telegram. Distributed outside the app stores, under the owner's control.

Hermeia
TL;DR

Hermeia is a messenger meant to replace Discord for a team: servers, channels, threads, roles, DMs and groups. On the phone it has to be as smooth as the competition, because otherwise nobody switches. Android and iOS from one codebase, and distribution outside the stores - so we also had to build our own update mechanism.

Overview

Hermeia is a messenger meant to replace Discord for a team: servers with channels, threads, roles with permissions, direct and group messages. A messenger is nothing new in itself - which is exactly why it is hard.

People do not compare it to an abstract ideal but to the Discord and Telegram they use every day and have in their fingers. If the conversation list scrolls with a stutter or opening a channel takes a beat too long, the switch is over within the first week, before anyone appreciates anything else.

The Android and iOS app is built from one codebase, so one team maintains one source of truth instead of two apps drifting apart. And since Hermeia spreads outside the stores, one more job came on top of all this: our own update mechanism.

The bar is set by Telegram

The first of the two hard problems is smoothness. There is no discount here: a user who scrolls thousands of messages in Telegram every day will feel every stutter in a fraction of a second. The message list has to scroll cleanly on long history, and transitions between screens have to be instant.

Scrolling smoothness on long history (illustrative, fps)

A page in a WebView
34
Native, one codebase
60

This is not cosmetics that would be "nice to have". For a messenger, smoothness is a core feature - as important as the message actually arriving. An app that stutters is perceived as broken, even if it does everything else well.

One codebase and distribution without a store

The second problem is distribution. Hermeia spreads outside the official stores, so we do not have the convenient update channel a store gives for free. Since nobody will push a new version to the user for us, we have to do it ourselves - and in a way that does not make updating painful.

On top of that comes the decision on one codebase for both platforms. Maintaining two separate apps for Android and iOS is double the work and double the room for drift - a fix on one platform that never reached the other. A single codebase with shared logic and data model lifts that weight, while the native finish stays where the platform difference actually shows.

Two apps versus one codebase

AspectTwo separate appsOne codebase (Hermeia)
Maintenancedouble the workone team, one source
Drift riska fix gets lost on one platformthe same logic on both
Data modelthe same one twiceshared
Native finishseparatelynative where the difference shows
!
Warning

Distribution outside the stores is a deliberate choice with a price: there are no automatic store updates, so an old version can sit on someone's phone for a long time. That is why version checking and a clear update prompt are not an add-on - they are part of how the app works.

The full Discord model, not a trimmed subset

It would be easy to ship a messenger with half the features and add the rest "later". But a team that is to switch from Discord compares one to one: if threads or roles with permissions are missing, they see it at once and go back to the old tool. So from the start we mapped the full model the team genuinely uses.

Servers with channels, threads, roles and permissions, direct and group messages - this is not a selected fragment of Discord but the whole skeleton daily communication rests on. Without it a "replacement" is a replacement in name only.

1
One codebase, two platforms

Android and iOS from a single base, shared logic and data model, native finish where the platform difference actually shows.

2
The full Discord model

servers, channels, threads, roles with permissions, DMs and groups; not a trimmed subset, but what a team genuinely uses.

3
Smoothness as a requirement, not a wish

message and channel lists designed for consistently smooth scrolling, with no stutter on long history.

4
Our own update mechanism

since distribution goes outside the stores, the app checks whether a newer version exists and walks the user through updating.

The update nobody will send for us

On start, the client compares its version against what the server advertises, and knows whether the update is optional or required. The manifest has a simple shape: the latest version, the lowest still supported, package addresses and a flag for whether the update is mandatory.

The split into optional and required is the key here. A small fix can wait until the user decides for themselves. But a change that breaks compatibility with the old protocol has to be forced - otherwise part of the team gets stuck on a version that stopped talking to the rest.

update-manifest.json · json
{
  "latest": "1.8.0",
  "minSupported": "1.6.0",
  "android": "https://dl.hermeia.app/android/1.8.0.apk",
  "ios": "https://dl.hermeia.app/ios/1.8.0.ipa",
  "mandatory": false
}
1
codebase for Android and iOS
60 fps
target for smooth list scrolling
2
release channels: optional and required

It wins by not lagging behind

Hermeia does not win on a new idea for a messenger - it wins by not lagging behind what people already know on the phone, and by staying under the owner's control instead of depending on a store. This is the quiet kind of quality: it does not catch the eye as long as it works, and it would catch it at once if it did not.

Smoothness and a self-owned update path are two things easiest to put off "for later", and then they come back to bite on the first serious change. We built them from the start, because in a messenger these are not add-ons - they are the foundation everything else stands on.

Nobody switches messengers because of a pretty menu. They switch when for a week they do not once think about the fact that they are using something new.

More projects

More work from the same category - see how we tackle similar challenges.

Have a similar project?

Get in touch - a quote is free and comes back within an hour.