Inspiration

In 2016, a Harvard study tracked people who had just installed Pokémon GO. In the first week, they walked 955 more steps a day. By week six, they were back to exactly where they started.

That number describes almost every app built to get people outside: novelty gets you out the door, but novelty does not last.

So we stopped asking, “How do we make going outside fun?” and started asking, “What would make two friends actually show up for each other?”

The answer we landed on is a tree. Not a metaphorical one — a real tree, one you both stood under.

What it does

You and a friend start by connecting your accounts and growing one shared tree. Each day, Bloom gives you five activities designed to encourage meaningful time together — from going for a walk to sharing a meal or visiting somewhere new.

To complete an activity, you have to do it together in the real world. Bloom verifies that both friends were physically together, and the completed activity contributes to the tree's growth.

The tree only grows when you do things together.

You can complete up to three activities each day, with each activity contributing approximately 5–10% toward the tree's next growth stage. When the progress bar reaches 100%, the tree grows. Once the tree is fully grown, it is added to your shared garden and you can begin growing a new one.

The tree is not a score. It is a record of the experiences you have shared.

How we built it

Frontend — HTML, JavaScript, CSS Backend — Python, FastAPI Database — MongoDB

The stack is not the interesting part. The interesting part is that we could not trust a single phone to tell us the truth.

Our co-presence check uses a server-issued challenge:

  1. User A calls POST /copresence/start — the server issues a one-time nonce valid for 60 seconds.
  2. A broadcasts that nonce over BLE / a QR code — a channel designed to work only at close range.
  3. B receives it and calls POST /copresence/join, authenticated with B's own token.
  4. The server sees two independently authenticated requests sharing a secret that could only have been obtained at close range, and opens the session.

Neither client is trusted. Duration is measured server-side using heartbeats rather than reported by the app, and daily limits prevent rings from being easily farmed.

Challenges we ran into

"Being together" turned out to be difficult to verify. Our original idea relied heavily on friends completing activities together, but we quickly realised that simply asking users to press a button or upload a photo would make the system easy to fake.

We needed a way to verify that two people were actually together without relying on a single phone to tell us the truth.

We solved this by using a server-issued co-presence challenge. One user starts a session and receives a short-lived nonce. The nonce is shared at close range, and the second user joins using their own authenticated account. The server then verifies both users independently before allowing the activity to count.

This means the photo captures the memory, while co-presence provides an additional layer of proof that the friends were actually together.

Accomplishments that we're proud of

A co-presence protocol that is resistant to single-client spoofing, and that we can explain in four steps. A decay system designed to create longing instead of guilt. Removing one of the hardest moments in friendship maintenance — being the person who always has to ask to meet — by making the tree itself provide a gentle reminder.

What we learned

Novelty gets people outside temporarily, but relationships keep them coming back. So Bloom's retention has to be carried by the relationship, not by points. When a mechanic is technically difficult to verify, the fix is often to change the question, rather than build a more complicated classifier. Choosing metrics is a design decision. DAU and session length are not our primary measures of success. We care more about time spent together, new connections formed, and whether people are still meeting 30 days later.

What's next for Bloom

Seeds. A mature tree produces a seed, and a seed can only be handed to someone in person who does not have a tree yet. Growth comes from real relationships rather than ads — and it means we never need city-wide density to start, only one pair of friends. Over a semester, a campus could grow a visible family tree showing how connections spread from person to person.

Public trees. Right now, Bloom deepens friendships people already have. Public trees — unowned trees that two people can discover and care for together — could help Bloom create new connections, beginning with caring for something together rather than starting with a conversation.

Safety before scale. Any mechanic that draws people to a coordinate can create safety risks. Meeting points should therefore remain restricted to public, high-footfall locations, with appropriate time-of-day limits and group visibility.

Built With

Share this project:

Updates

Submission history