Building an emoji-only chat app
My daughter finds emoji hilarious. She’s 6 and will scroll through an emoji picker for ages. My wife and I started by letting her use WhatsApp’s emoji picker to send us messages, but that quickly polluted our chat history with emoji spam. We tried a few dedicated emoji-only apps like Emojichat, but there was this uncertainty about how they handled data. Most of them were also 1:1 only. I wanted the three of us in the same room.

I built Moji over a weekend to see what happens when everything gets stripped down. Emoji only. No accounts. Rooms are just URLs with random IDs. Messages sync peer-to-peer and persist in browser storage.
The constraints are simple. Emoji only - the app only allows non-alphanumeric characters. Random room IDs get generated when starting a chat, but any string works. No accounts means nothing to store, nothing to manage. Type a name when joining and that’s it.
I used GunDB for peer-to-peer messaging so messages stay between whoever’s in the room, not on my server or in the cloud. The frontend is React, using Vite and Tailwind. The relay server is just Express with GunDB, about 15 lines - it only helps peers find each other.
I deployed both to Fly.io. Frontend as a static site, relay as a separate app. The free tier covers what I need, and deployment is just fly deploy. Didn’t have to think about it much.
She picked it up immediately. No explanation needed. She doesn’t just send single emoji back and forth - she builds little narratives. A sequence of emoji that tells a story. Sometimes it makes sense. Sometimes it doesn’t. She’ll periodically ping me messages throughout the day when she has screen time and I’m working in another room.

Emoji render differently across devices. The picker shows one set of glyphs, but messages display in whatever the system provides. I tried using Twemoji to keep things consistent but gave up - too much overhead. Works fine for now.
Messages are stored locally in browser storage, so there’s no central database. Nothing to archive, nothing to moderate, nothing to maintain. I don’t worry about what she’s sending or who might see it.
It’s live at https://moji-frontend.fly.dev/ and works as a PWA. Source is on GitHub. She uses it occasionally - her interest is sporadic, as with most things 6-year-olds do. It’s not her go-to when she has screen time, but it’s been fun watching her use it.
Related posts
- Baking webmentions into the build
Back in 2022 I added webmention support to this blog. The implementation worked but it was entirely client-side, so the page would load, JS would fire, fetch from webmention.io, and render the results into the DOM. With JS disabled or on a slow connection, the discussion section was just empty. It worked well enough that I didn’t touch it for three years, but the rate-limit situation had been silently catching visitors out and eventually I started pulling at the thread.
- Building a Balatro-lite game with vanilla web tech
I’ve spent countless hours playing Balatro, and I’ve always wanted to create my own game with similar mechanics. When TrinketOS announced a game jam, it was the perfect excuse to make it happen.
- A Bit of a Bodge To Make MASSIVE Emoji
I’ve been fiddling with an instance of Known over on social.omgmog.net. As part of my fiddling I’ve been trying out some of the plugins for Known. I came across the “Render Emoji Unicode” plugin but it was using an old library, and referencing an old version of Twemoji, so I updated it to use the latest Twemoji library.
Discussion
- 2026
- T
A look at Max Glenister’s emoji-only Moji chat app, which he created in a weekend for his young daughter to enjoy.
Join the conversation
Comment on the GitHub issue, or reply from your own site with a Webmention (how?).
