Joyn
One home for a whole community: chat, events, polls, boards and files, and who's around right now.
Free for up to 100 members
- What I did
- Everything: product, design, web, iOS and Android, the API and the realtime gateway
- Runs on
- The web, iPhone, iPad and Android, in English and Danish
- For
- Sports clubs, churches, associations, schools, choirs and volunteer groups

Made for the people who keep a club going.
Most of them run on a group chat, a shared drive, a Facebook event and a mailing list. Joyn puts the whole community in one space, gives every crew inside it a group of its own, and speaks Danish as well as English.
Take a walk through a space.
Channels for every topic
A channel can be a conversation, announcements, a to-do list, a weekly check-in or a kanban board. Conversations have reactions, mentions, GIFs, polls and questions, and you can see who's typing and who's online.

Events people actually show up to
RSVP in one tap, with a waitlist when it's full, recurring events, reminders and co-organisers. Public events let guests sign up with just a name and an email, and everything exports to your own calendar.

Polls that end the back-and-forth
Ask the whole club in a channel or under an event, watch the votes come in, and close it when it's decided.

Boards, to-dos and check-ins
Kanban boards with a comment thread on every card, to-do lists, and check-ins that ask the same question on a schedule, so the committee's work lives next to the conversation about it.

Files and pages
Folders for the club's files, and pages the committee writes together, live, like a shared document that lives inside the space.

Groups and roles
Every crew gets a group inside the space, public or private, with its own channels, events, files and admins. Custom roles and per-channel permissions decide who can do what.
A front door for new people
Every space can have a public page with its upcoming events, news and a join button, and it never shows members' names.
Realtime, all the way down.
A community app lives or dies on feeling alive. Messages, reactions, typing and who's online travel through a WebSocket gateway of its own, separate from the API.
Who's online works the same way. However many parts of a screen care about a topic, the app subscribes to it once, and presence requests go out in batches of 50.
- 1Sofie hits sendHer app shows the message straight away and tags it with a one-time nonce.
- 2The API saves itFastify writes it to Postgres and works out which members should hear about it.
- 3Redis carries itIt is published on Redis, addressed to each gateway machine those members are connected to.
- 4The gateway delivers itEvery gateway pushes it down its open WebSockets, and each phone and browser in the channel shows it.
- 5Sofie's copy comes back tooThe nonce tells her app it already has this one, so it never shows up twice.
And the rest of it
- Pages written together
- Committee documents with live co-editing, on BlockNote, Yjs and a Hocuspocus server of its own.
- Fast first paint
- Pages are fetched on the server and handed to React Query, so lists are there before the JavaScript is.
- It feels instant
- Reactions, RSVPs and moves on a board change on screen before the server has answered.
- Works on the bus
- The phone app keeps its data on the device and retries with backoff when the signal drops. A message that fails can be sent again.
- Nobody misses anything
- Push notifications through Firebase, and weekly digests and unread-message emails sent by BullMQ jobs.
- Pictures that load nicely
- Uploads go to Cloudflare R2, resized with sharp, with a blurhash to show while they arrive.
- Bugs fixed overnight
- A card on Joyn's own kanban board can be picked up by Claude Code at night and come back as a draft pull request.
Bring your club
under one roof.
Joyn is free for up to 100 members. After that it's €4 a person a month, or €250 a month for a community of any size.
Odense, Denmark ·Available now
Got an idea?
Tell me about it.
Big, small, half-baked or a bit weird, I'd love to hear it. One sentence is plenty to start.