Communities and channels
Each community holds its own channels, and can group them into categories. Membership is per community, and a channel's permissions come from the community's roles.
Features
Every capability below ships in the product today. Where a feature is off by default, opt-in, or still in progress, the card says so.
The interface
Channels and roles, direct messages, search, files, moderation and the appeals that follow it, all in the same client. What is on the right is the product itself; the demo runs it live.
Channels
Conversations
Each community holds its own channels, and can group them into categories. Membership is per community, and a channel's permissions come from the community's roles.
One-to-one conversations outside any community, with a friends list and requests, so people you know do not need a shared community to talk.
Messages carry reactions and file attachments. Uploads are size-limited per instance, and the limit is a setting rather than a constant in the code.
Messages are searchable across the communities you can already see. Search respects permissions, so it never surfaces a channel you cannot open.
Who is online, idle or away, and who is typing, over the realtime gateway. Presence is per instance and never leaves it.
In-app notifications for mentions and replies, with per-conversation mutes when a channel is too busy to follow.
Running a community
Roles carry granular permissions and are assigned per member. A misspelled permission is a startup error, not a silent grant or refusal.
Codes that can expire and be limited in use, so you can open a door for a while without leaving it open permanently.
Members report messages and people. Moderators review, warn, time out or ban, and every action is recorded against the account that took it.
A suspended account has a path to appeal, and the appeal is a record the platform administrators can see and act on.
Instance-wide announcements for maintenance and policy, so operators do not have to rely on a side chat nobody reads.
A separate Trust and Safety surface for reports that cross communities, plus a configuration centre where every setting has an effect.
Accounts and safety
Registration can be open, require manual approval by an admin, or be closed entirely. Users can be invited by code instead.
Time-based codes with recovery codes, available per account and enforced by the account, not by the instance.
Verification and password reset deliver through SMTP or an HTTPS mail API. With mail unconfigured, recovery refuses rather than pretending to send.
An account can export its data and delete itself, with a cooling-off window. Deletion is a real deletion, not a flag.
The instance
Communities can publish themselves to a public directory with a preview of their channels. Private communities never appear in it, and the whole feature can be switched off.
A bot API and per-community integrations with webhooks, so a community can connect things without a human relaying messages.
A default dark and light theme, plus custom themes that write the same design tokens the stylesheet defines, so a theme cannot invent values the app does not have.
Start on a single SQLite file and move to MySQL when you outgrow it. The database is a configuration profile, not a different build.
Still in progress
A few parts of the product are deliberately incomplete. Here they are, with the state each one is actually in.
The signalling and room model are in place behind a single provider. It is off by default, ships with one provider, and is not a finished calling product.
The switch and supporting code exist, and both default to off. In-app notifications work today; delivery to a sleeping phone does not yet.
Each instance stands alone today. There is a global sync setting and early groundwork for it, but separate instances do not yet federate.
See it
It runs the same client against this instance's public data, and it needs no account.