Inspiration

We often remember that we care about someone at the wrong moment: between meetings, after their birthday, or when another busy week has already passed. The intention is there. The timing and context are what slip away.

We built O’llo to keep that context close: the last conversation, the small detail worth remembering, and the next opportunity to say hello.

Every hello has its time.

O’llo approaches relationship care as a personal practice. It gives people a private place to remember and reconnect, without a public feed or follower count.

What it does

O’llo brings people, relationship history, reminders, and meetup planning into one experience on iOS and the web.

  • Remember the person. Save interests, notes, groups, location, and the context of previous conversations and meetings.
  • Find a rhythm. Set a contact or meeting cadence for each person, review reminders, and snooze or complete them when appropriate.
  • See the connections. Explore a private relationship graph and filter it to find people and groups.
  • Find the words. Generate optional AI message drafts informed by saved context, then review and edit them before sharing.
  • Make time together. Create an availability poll, share a response link, and choose a time for a meetup.

The interface is available in English and Korean. O’llo does not automatically send AI messages: the user decides what to share and with whom.

How we built it

We built O’llo in TypeScript, with React Native and Expo for the iOS app and Next.js and React for the web application and API. Shared domain types and API clients help keep the two experiences consistent.

Neo4j stores people, groups, relationship links, and interactions as a graph. Supabase provides authentication, PostgreSQL for account and operational records, and file storage. The OpenAI API generates optional message drafts and recommendations through server-side requests.

RevenueCat powers native subscription purchases, purchase restoration, and Pro entitlement handling. The app reads the available subscription package and localized price from RevenueCat. Web billing uses Stripe, with server-side integration to keep Pro access aligned with RevenueCat entitlements.

The web application runs on Vercel, and we use Expo Application Services for native builds. Vitest, TypeScript checks, and platform-specific QA support development across both interfaces.

Challenges we faced

Keeping the experience personal. Relationship reminders can easily feel like a task list. We chose warm language, individual rhythms, and actions such as snoozing so the user can decide when a reminder is useful.

Keeping context consistent. People and interactions belong naturally in a graph, while accounts, reminder actions, and billing need transactional records. We had to maintain account ownership and authorization across those boundaries.

Making Pro access understandable. A purchase, a restored subscription, and an account change must lead to the right access state. RevenueCat gave us a common entitlement model, while the app provides purchase, restore, and subscription-management actions.

Respecting the difference between platforms. Shared types help maintain consistent behavior, but the native app still needs navigation, keyboard handling, and layouts suited to a phone. We worked through those details separately from the web interface.

What we learned

The most useful relationship tool helps a person take a small action they already wanted to take. Remembering a detail or making it easier to write an opening sentence can be more valuable than adding another dashboard.

AI works best here when its output stays editable. It can help someone begin a message, while the judgment and the voice remain their own.

We also learned to treat implementation, device testing, and store distribution as separate milestones. Each provides a different kind of evidence that the experience is ready for someone else to use.

What’s next

Our next priority is to learn from early users: which reminders help them reconnect, where drafting or scheduling still feels difficult, and which parts of the interface need to become simpler. Those observations will guide improvements to the existing experience.

Built With

Share this project:

Updates

Submission history