The pitch was simple to say and much harder to build: search should work the way you actually remember things, not the way a filing system does. You don't remember the exact title of that screenshot. You remember it was warm-toned, or that you saved it around when you were working on a specific project, or roughly what it was about. So search should let you type something like "that packaging inspiration from last month" and just work.
We said that sentence in a pitch deck a full year before it was actually true. Here's what happened in between.
The version that looked done but wasn't
Early on, we shipped what we called smart search. It had the right pieces on paper: a tokenizer, synonym expansion, temporal parsing so "last summer" meant something, color-range matching. Multiple internal docs described it as complete.
It had never actually run. Not "worked poorly," not "worked for some queries." It never received a single real request in production, for months, and nobody caught it, because the failure was silent instead of loud. The client code was checking for a piece of the authentication system that simply doesn't exist under the version of the login library we were using. Every search request quietly died before it left the browser. No error, no crash, just nothing happening, which from the outside looks a lot like "there's just nothing in there yet" rather than "this is broken."
That's the lesson that stuck with me most out of this whole thing: a feature can look completely finished, pass every design review, and still have never worked, if the thing that's silently swallowing the failure looks enough like normal behavior.
What was harder than expected once it actually ran
Fixing the connection was the easy part, once we found it. What surprised me was how much harder "search by feeling" turned out to be than "search by keyword," even once requests were actually reaching the server.
The core issue: the database we use is good at exact matches and terrible at anything fuzzy. It can tell you which items contain the word "warm." It cannot, on its own, tell you which items feel warm. So a huge amount of the real work isn't search at all, it's translation: turning "warm tones" into an actual list of color values before the query ever runs, turning "last month" into real date boundaries, expanding a word like "cozy" into a list of related words ahead of time so the literal search underneath has something concrete to match against. The database never gets asked a fuzzy question. It only ever sees a very precise one that we did the fuzzy thinking to arrive at beforehand.
The other surprise was how differently the two kinds of search needed to behave. Fast search, the kind that runs on every keystroke, over titles and tags and short descriptions, is a genuinely different problem from deep search, the kind that reads the actual text inside an image or the full body of a note. We'd originally folded both into one system, which meant deep search was either too slow to feel instant, or fast search was missing obvious matches buried in a screenshot's text. Splitting them into two separate, deliberately different systems, one instant and shallow, one slower and thorough, made both better at the thing they were actually for, instead of one system compromising at both.
Where "search by feeling" honestly stands right now
I want to be straight about this rather than overstate it. What ships today is real and useful: search by color, by rough time range, by keyword and tag and the text buried inside your screenshots. What it isn't yet is true semantic search, the kind that understands "cozy autumn evening" as a concept rather than a set of expanded keywords and a color range. That's a genuinely harder problem, and we'd rather tell you honestly where the line currently sits than let the pitch-deck version of the feature imply something the product doesn't do yet.
The gap between "search by feeling" as an idea and as a shipped feature turned out to be most of the actual work. The idea took an afternoon. Closing that gap, even partially, took the better part of a year, and we're still not finished.