Shipped GHub Creator and maintainer Open core 2026 - present

GeGroups

Groups and mailing lists, built to be run.

The shared-address, shared-thread primitive teams and communities keep needing, without running your own mail stack for it.

What it is

Mailing lists. The shared-address, shared-thread primitive that teams and communities keep needing, without running a mail stack yourself.

Lists are still one of the oldest bits of collaboration infrastructure in daily use, and most of the options are either stuck in 2005 or priced for a procurement department. GeGroups sits in between. Shipped, open core, built to be run rather than admired.

The name keeps the "Ge". GeGroups, not GGroups.

The shape of it

A group owns a subdomain. Under that group sit one or more lists: a main list plus any subgroups it needs. Each list has a web archive, its own membership, and its own delivery.

That is the groups.io model, and it is the right one. The subdomain is what makes a group feel like a place rather than a row in somebody's database.

The mail side

This is the part people underestimate. Running lists means running mail, and running mail means the parts that are unglamorous and non-negotiable.

Inbound arrives over LMTP into a dedicated listener. Outbound goes through a transport that signs with DKIM, because unsigned list mail is filtered mail. Storage for attachments and archives is MinIO or any S3-compatible target. Search is Meilisearch.

Every mutation is a workflow

The unusual decision here is that background jobs and mutations both run on Temporal, against a versioned worker deployment.

A mailing list is a distributed system whether you admit it or not. A single inbound message fans out to hundreds of deliveries, some of which fail, some of which need retrying hours later, and all of which have to stay consistent with an archive somebody is reading at the same time. Doing that with a job queue and a cron table works right up until it doesn't, and then you are debugging a half-delivered message with no history of what happened.

Temporal gives every one of those a durable execution history. When something breaks, the question "what actually happened to this message" has an answer.

Redis stayed, but only for realtime pub/sub. It is no longer load-bearing.

Stack

Next.js and React on the front, Tailwind. Drizzle over PostgreSQL. Temporal for the worker. Authentication runs through a self-hosted identity service rather than a third-party one, which is the same position the rest of the line takes.

Status

Shipped. Open core, with the base version free and the paid tiers proprietary.