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?"

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.

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.

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 →