We will be undergoing planned maintenance on Oct 7th 6:00AM UTC / Oct 7th 2:00AM ET

Inspiration

It's not like most of us are unaware of what we need to change. We need to work out. We need to do more reading. We need to reach out to our parents. So, what's actually holding us back? Ultimately, completing tasks and doing things that we know we need to do is not the end. Running a mile goes unnoticed and reading a book goes unspoken to.

That feeling is what we were trying to solve. We understand what it feels like to build a routine and have no one see it. It's not a sad feeling. It's a bit dull. It's like building a monument for yourself that will never let anyone by.

Our question was, what would it be like if every single routine we built had an audience of one? This doesn't mean building a public feed and having a leaderboard of people we never interact with. This means having your running partner, the one that your sibling who is reading more than you, the friend that said "let's do this together,".

What it does

Sprout is a unique photo proof habit tracker that focuses on real accountability. Once a task is completed, a photo is snapped, and the task is marked as completed. The stamp then gets sent to the feeds of your Sprout Duo and friends. No checkboxes or empty numbers. Just proof that you completed the task.

The main components of Sprout is to first select a habit, then choose a partner, and complete the habit daily. After the habit is completed for the day, an accountability photo is snapped and then posted. If a habit partner forgets to snap a photo, the streaks of both users will be broken.

New users that have no friends will have their feeds automatically populated through Atlas Vector Search, and will have their interests matched with a public profile, to prevent the user from having an empty feed.

How we built it

The purpose of our hand-drawn HTML prototype was to establish the look and feel of the app before we started coding in React Native. The finalized prototype gave us the exact colors, fonts, and layout to inform the app's design theme.

For our front end, we chose Expo 54 and React Native, supported by TanStack React Query and Zustand, and for our backend we used Express and MongoDB Atlas with 7 Mongoose models. Our feed offers both a friends path (cursor paginated) and a discover path (Vector Search with Voyage AI's auto-embedding). Streak logic accounts for time zones by normalizing the completion to the user's preferred local date.

For iOS and Android cross-platform rendering, we used primitive components (Stamp, DashedCard, Ticket) which employ SVGs for dashed borders. This was necessary because of the inconsistency of React Native's native dashed borders across platforms.

Challenges we ran into

Every new social app attracts the same problem; the new user has no friends, and their social feed is empty. To bootstrap our app we had to deal with random public entries, trending entries, and manual curation, all of which had limited success. The solution was Atlas Vector Search with autoEmbed. No external embedding APIs or complex pipelines; we simply did a text query and let Atlas do the work.

Innovating on the problem of time zone awareness, we accounted for the user who completes the task at 11:59 and the user who completes the task at 12:01 as having completed it on different days. We adjusted task completion to the time zone of the user and used localDate as the time zone on task completion.

The final product looks as desired with a scrapbook filmstrip effect, but it took two days of work for the three separate animated stages. Each stage had to be sequentially timed to accurately portray the position of each individual task in a flying grid.

The hearts give the desired effect of instant updates. Getting the instant update of the React Query cache while allowing the request to progress in the background with a rollback on failure was more difficult than anticipated.

Accomplishments that we're proud of

The Discover Feed. Most social media apps neglect to solve the cold-start problem, but this does not have to be the case. We have elected to have our users select interests when signing up. Immediately afterward, they will have the possibility to interact with real-users content. The first connection can be the most important.

The Duo Streak System. The accountability of a couple is defined by the rise and fall of each of their streaks. There will always be a more significant reason to keep a streak from falling than any form of game-like interactivity.

The Scrapbook Animation. A seamless animated transition that takes a week’s worth of stamps and animates it to transpose from a tiny filmstrip to a fullscreen grid. It does not use web views or Lottie files, just pure React Native Animated.

Seven clean Mongoose Models. These are the result of having proper compound indexes, and referential integrity and are of time-zone normalized dates. Day one consistency was the goal of the data model.

What we learned

Proof goes beyond a simple check mark to show a social contract. For example, a check mark shows that you went to the gym, but posting a picture of you at the gym at 6 AM shows others a contract to keep you motivated.

What used to be a cold-start problem, Vector Search now helps solve. The Discovery Feed helps turn an empty display into an active community for all of the new users. The Discovery Feed helps solve a usability concern in a way that we never thought a database function would.

An optimistic update is an invisible update. If it ‘feels’ like a user has done an action, they most likely have not noticed the constant update. If it is done well, users won’t notice the system behind it.

The app now focuses on how active the community and the relationships are. When using the app alone you are getting a number, but using it with someone else builds trust. Shared Streaks were done so well that they ended up being ‘relationship infrastructure.’

What's next for Sprout

Push notifications. The Expo notifications package is installed and registered, but we still need to wire it to the streak engine. A polite push saying "Your partner is waiting" around 9 PM may alleviate many broken streaks.

Large scale photo storage. Right now, photos are saved in Base64 format in MongoDB. This is sufficient for hackathon scale implementations. The next step for the infrastructure would be using object storage along with presigned URLs.

Squad Expansion. Current implementation provides 1:1 accountability. The most logical next step would be to implement small accountability groups of 3-4 people, with group streaks.

Task templates and difficulty tiers. To help users establish a new habit, pre-made (gym, reading, meditation) task templates with point values based on task difficulty (easy, medium, hard) would be useful.

Calendar and stats views. A monthly calendar with completion density and a stats view with completion breakdown by categories would be useful to provide users with a long-term view on accountability.

Built With

+ 1 more
Share this project:

Updates

Submission history