olive

for the things that won't leave your head

A personal save-and-reflect app built in React Native. Save anything that catches your attention, add a note about why it caught you, and let the app find the patterns you didn't notice yourself.

Gemini AIClaude CodeExpo React NativeFirebaseSwiftCloud Functions

The problem

I had the usual graveyard: TikToks, Reddit threads, articles — all saved with the vague sense I'd need them later. Later arrived as a wall of thumbnails I didn't trust enough to open.

The gap wasn't storage. It was that nothing I saved had any context attached to it. I'd saved a Reddit thread of NYC bakeries but by the time I landed in Manhattan I couldn't remember which of my forty saved links it was. The save was useless at exactly the moment it should have been useful.

What I built first — and why I changed it

The first version was a retrieval app. Save a link, attach context cues ("NYC trip", "May"), and get a filtered shortlist of three to five concrete picks when that moment arrived. The pitch: less noise at the moment of use.

It worked. But using it revealed something the brief didn't capture. The notes people wrote when saving — "pandan i love pandannn", "people come people go i still have people to eat with", "I am struggling but contented somehow" — were more interesting than the saves themselves. The notes were a record of a person's thinking over time. And the app was ignoring them completely.

The pivot: stop optimizing for retrieval speed and start treating the corpus of saves and notes as a body of thought worth surfacing patterns from. The question changed from "what did I save for this situation?" to "what has my mind been circling without me noticing?"

Olive canvas showing saved items and paper note jots in masonry grid
The canvas — saves and jots accumulate together. Paper notes for raw thoughts, thumbnails for saved content.

What it does now

Olive has three surfaces that build on each other:

  • Your mind — a masonry canvas of everything saved. Media saves with real thumbnails, manual jots as paper notes with slight rotation. The canvas is deliberately unorganized — it's a brain dump, not a filing system.
  • When — saves grouped by occasion. The occasion name is extracted by AI from the user's note ("London trip in May" → "London trip") not from a calendar picker. This distinction matters: the user is naming their context in natural language, not filling in a form.
  • Echoes — AI-found patterns across saves and notes, surfaced as threads. Each thread has a title that names the pattern with a slight interpretive lean ("You keep reaching for structure while writing about contentment"), fragments of the user's own words in chronological order, and a provocation — one question the user can't answer immediately. Users can respond, add traces, and return to threads over time.
Thread detail showing AI-found pattern with user fragments and provocation
A thread — fragments of the user's own words, connected by AI, ending in a question.

Key decisions

Processing on device, not the server

The original architecture processed saves server-side via Cloud Functions. It broke on Reddit: hosted server IPs are routinely blocked by Reddit's JSON API. Moving extraction to the device fixed it immediately — the device can reach Reddit just fine.

This shaped a broader principle: the client is responsible for content it can legally and technically reach. The server handles expensive AI passes (thread generation) where it has the right context and credentials. New saves enter Firestore with status: 'processing' — a flag that tells the Cloud Function to skip them, preventing double-processing without any coordination logic.

AI extraction with a confidence threshold

Early builds extracted occasion names from every save. A save with the note "pandan so yummm" would produce an occasion called "pandan" — meaningless as a grouping. Worse, a save with a calendar date in the note would produce an occasion called "May 1 2026" instead of something human like "London trip".

The fix: the extraction prompt returns a confidence score. Only high-confidence extractions — notes that clearly contain a named event and a time reference — produce an occasion name. Everything else saves ungrouped. The occasions tab shows fewer cards but every card means something.

Thread quality over thread volume

Thread generation runs as a callable Cloud Function triggered manually during development — not on a schedule. The deliberate choice: don't automate until the output quality is confirmed. Running the manual trigger against real saves and reading the output is how you catch a prompt that produces connector text that sounds like a database report ("Additionally, on this date, you also saved:") versus one that sounds like a thoughtful friend reading your notes ("Three days later, you wrote —"). That difference is entirely in the prompt and only visible with real data.

The vocabulary is a design decision

Every label in the app was deliberately chosen. Not "Vault" but "your mind." Not "Occasions" but "when." Not "Threads" but "echoes." Not "add a thought" but "leave a trace." Not "dismiss" but "silence it." The language signals what kind of space this is — personal, unpolished, taken seriously — before any feature does.

Occasions tab showing saves grouped by context with coming up badge
When — occasion names extracted from notes, not from a date picker.

What's next

In priority order:

  • Thread traces — users can already respond to a thread's provocation. The next step is letting them add traces over time: written thoughts, saves attached from the canvas, new saves added directly into a thread. The thread becomes a living document about a line of thought, not a one-time read.
  • Scheduled thread generation — currently triggered manually for quality control. Move to a nightly Cloud Function with eligibility filtering (active users only, minimum 3-day gap between runs) once prompt quality is confirmed on real data.
  • Onboarding — the first screen a new user sees should be the product's personality, not a feature list. The designed flow gets users to drop their first thought into the app before they've finished setting up. The canvas isn't empty when they land on it for the first time.

What I'd do differently

I built the retrieval system fully before validating that retrieval was the right problem. The shortlist feature — AI filtering a save down to three to five concrete picks — took significant time to get right. By the time I'd confirmed it worked, I'd already noticed that the notes people wrote when saving were more interesting than the saves themselves. The pivot was right but it came late.

Earlier: build the note field and canvas first, use the app myself for two weeks, and let the pattern of what I was actually writing tell me what the product should do. The retrieval feature would have either confirmed itself as necessary or revealed itself as a distraction much sooner.

Olive is not trying to replace search or social. It is trying to answer one question well: what has my mind been circling, and what does it mean?

See it in motion

The product is working on device with real saves and real AI-generated threads. Replace the link above with a 90-second screen recording — canvas, thread detail, occasions — or reach out for a live walkthrough.

Request a walkthrough →