Inspiration
Every time our friend group tries to plan a trip, it goes the same way. Someone wants a nonstop flight, someone else can't spend more than $600, and all of it gets buried in the group chat. Eventually one person gets tired of it and books whatever, and half the group is annoyed.
The problem isn't finding flights. There are plenty of apps for that. The problem is that nobody wants to be the one negotiating between five people, and nobody wants to say "I can't afford that" in front of everyone.
One rule shaped the rest of the app: a hard limit is never traded away. If you can't spend more than $600, no amount of group enthusiasm for a $700 flight should override that. Preferences can bend. Limits can't.
We also wanted it to be fun to open, the kind of app where you look at it and think "ok, where are we going?"
What it does
Artemis is a mobile app for planning trips with friends (or alone). It takes the trip from a globe on your home screen all the way to a paper ticket you keep.
The home screen is a dot-matrix globe showing where you are and your next trip. Tapping a destination opens a full-screen photo page for it.
To plan, each person privately marks their preferences at one of three levels:
- MUST: a hard limit. Any option that breaks it is removed.
- PREFER: something you care about. It moves options up or down, but never removes them.
- NICE: a small bonus if it happens.
No one sees anyone else's answers until everyone has submitted. That way nobody changes their answer to match the group, and nobody has to announce their budget out loud. Once everyone's in, Artemis shows which preferences are shared, which are flexible and which conflict.
Every option comes with a reason, like "$53 under your $600 limit" or "1 stop. Sofia prefers nonstop, but you're fine with it." We didn't want a black box picking your vacation.
Everyone then ranks the flights that fit, and Artemis combines those rankings into one group order.
Before anything gets booked, it goes through the Trust Engine, which runs identity, policy and payment checks in order. Routine bookings go through on their own. Anything unusual gets blocked or sent to you to approve.
After booking, you tear off a paper ticket and the stub goes into My Trips. During the trip, you can watch your plane move across the same globe you started on.
How we built it
Artemis is built with React Native, Expo (SDK 57) and TypeScript, using Expo Router, Reanimated and Gesture Handler. It runs in Expo Go, so anyone can try it without installing a build.
We split the app so the team could work in parallel:
- The domain engine (matching, the Trust Engine, itineraries and time zones) is plain TypeScript with no UI code in it. That made it easy to test, and it has 150 automated tests.
- The globe, the plane and the ticket are drawn with React Native Skia.
- App state lives in Zustand and is saved on the device.
For group decisions, MUST limits filter options out first, and PREFER and NICE only reorder what's left. The rankings are combined with a Borda count, where each person's ranking gives points to every option, so a flight that's everyone's second choice can beat one that's loved by one person and hated by the rest.
Challenges we ran into
Our first idea was to score every flight and average everyone's preferences. It fell apart right away. If one person has a $600 cap and three people want a $700 nonstop, an average says book the nonstop, and now your friend can't afford the trip. That's why we split preferences into hard limits and soft ones.
The ticket was harder than it looks. 3D flip transforms don't work on Skia canvases, so we built the flip and the tear animations ourselves.
Time zones were painful. A flight that leaves at 10pm in one city and lands "the next morning" in another is easy to get wrong. We show every time in the local time of its airport, and we wrote our own daylight saving rules so the app doesn't depend on the phone's settings.
Accomplishments that we're proud of
The whole flow works start to finish: pick a place on the globe, collect everyone's preferences, book, get your ticket, then follow your plane on the same globe.
Nobody's hard limit ever gets overridden by the group.
Preferences stay private until everyone answers, and we don't use any real card or ID data.
You can watch the Trust Engine make decisions, including when it blocks a booking or asks you to approve one.
What we learned
Group decisions aren't a math average. Some preferences are rules and some are wishes, and treating them the same way makes someone unhappy.
People are more honest when their answers are private. Hiding everyone's answers until the end turned out to matter as much as the matching itself.
Explaining a result matters as much as the result. A recommendation you don't understand is one you don't trust.
On the technical side, we learned Skia and Reanimated 4, how sharing works in Expo SDK 57 with Expo Go and EAS Update, and more about daylight saving time than we ever wanted to know.
What's next for Artemis
Right now flights and hotels are sample data and no real payments happen. Here's where we'd go next:
- Real providers: live flights and hotels, price tracking and split payments.
- Real accounts and invites, so each person answers from their own phone.
- More social features: see your friends' upcoming trips on your globe, invite them to a trip easily, and share ticket stubs and photos after you get back.
- An AI agent that plans and books for you, with the Trust Engine deciding what it's allowed to do without asking.
Built With
- claude
- expo-router
- expo.io
- gesture-handler
- react-native
- react-native-skia
- reanimated
- typescript
Log in or sign up for Devpost to join the conversation.