Røket
An anti-loneliness app that shows what people nearby are doing right now and lets you post or join activities. Built with React Native and Firebase and published on Google Play.
Røket is my biggest and most polished personal project. The idea is to make it easy to do something with people nearby, like a coffee, a walk or a board game, instead of scrolling through profiles.
What the app does
- A live map. The front page shows what people nearby are doing right now, with a list of the same activities sorted by distance.
- A time window. You drag a three-hour window along the day to see what’s happening later. It runs at 60 fps on the UI thread with Reanimated, and the map and list filter instantly.
- Open invitations. You post an activity, people nearby can join, and every activity gets its own group chat.
- Keep in touch. After an activity, you can ask to stay in touch and get a private chat.
- Guest mode. You can see the whole app without an account, and anonymous accounts are cleaned up automatically after 30 days.
- Six languages and a dark theme. Danish, English, Spanish, German, French and Portuguese, and the map changes style with the theme.
How it’s built
The app is written in React Native with TypeScript and uses Firebase for sign-in, the database, files and push notifications. Anything that needs special permissions lives in Cloud Functions, so it’s never decided in the app:
- Connections as a state machine. Breaking, re-requesting and blocking are one-way transitions that Firestore security rules let each user set exactly once. Cloud Functions clean up afterwards.
- Image moderation. Uploaded images are scanned with Google Cloud Vision, and unsafe images are removed and logged automatically. On top of that there are reports, warnings and bans, and chat photos are deleted after 12 hours.
- Custom map markers. The markers are themed React components. With React Native’s New Architecture, they needed a dedicated workaround before they rendered correctly on the map.
- No gaps in translations. All copy lives in one place with a type derived from one of the languages, so a missing translation fails as soon as the code is built.
The hardest part
The whole user journey in the chat. A chat looks simple, but a conversation in Røket can be in many states: the activity may have ended, one person may have deleted the conversation or blocked the other, and a guest without an account needs to be told why there are no messages. Every state has to show the right buttons, information and error messages in all six languages. It took a lot of testing and adjusting before everything worked and looked right. The chat screens alone have changed in 35 commits. Three examples:
- Deleted conversations. When one person deletes a private conversation, the messages are deleted on the server and the chat is locked. The other person sees a system message, and the text field is replaced by buttons to request contact again or delete the conversation for good. I tested the flow end to end on two devices.
- New messages. A message you’ve just sent has no timestamp until the server responds, so the date heading popped in a moment later and shifted the conversation. Now a pending message counts as today’s, and new messages grow into place, so the rest of the conversation slides up smoothly.
- Error messages. Errors from Firebase are turned into a clear message in the user’s language instead of an error code. Along the way I also found that the app crashed on sign-out, because Firestore rejected the listeners that were still active. Now every listener that needs a signed-in user has its own error handling.
Status
Røket is published on Google Play. It’s a spare-time project I built to keep my skills sharp while job hunting, and to try out AI tools on a real project from idea to release. A social app needs marketing to get users, and I haven’t spent money on that, so the goal has been the app itself.