Side project · live·8 min read·shipped in 2 weeks

NEEDLE SPACE

Find a cafe in Seattle area you can work and boost productivity, in under two minutes.

created by Google Veo
Washington · WA · 252 cafes

Timeline

Shipped in two weeks

Team

1 PM (me), solo. All product decisions, design and copy.

My Role

Product strategy, search architecture, eval methodology, cost discipline

Scope & Scale

464 cafes pre-tagged across 17 Seattle-metro neighbourhoods · solo build · Google Places API (legal cap: 5 reviews/cafe)

Stakeholders

Target users: remote workers / freelancers / students mid-cafe-hunt · Data source: Google Places API · Owner: solo PM

Business Objective

Surface workable-cafe signals (laptop policy, seating, WiFi) that live buried in Google reviews. No AI transcripts required to trust the answer.

Core Challenge

Show users which cafes are actually workable. Prove the answer is trustworthy without making them dig for it.

Try this · the buried signal

The data you need lives in Google reviews — it's just not phrased the way you'd search.tap a bean ↓

Soojin Park

★★★★★ · 3 weeks ago

Local Guide · review 3 of 5

Found this place during a long walk through the neighborhood. Super peaceful and the staff is so kind. I ended up sitting in the corner with my laptop for 3 hoursnobody bothered me. Outlets at every table, free fast WiFi. The latte art is also nice if that's your thing.

brew your search →

01. TL;DR

  • Problem: Remote workers waste ~20 minutes hunting for a cafe with reliable WiFi, outlets and a laptop-friendly policy. The answer is already in the reviews, buried under thousands of comments.

  • Strategy: Rejected a chatbot. Chose a search bar with filter chips that just works. Every cafe pre-tagged from real reviews and photos, every claim backed by the quote it came from.

  • Impact: "Laptops welcome" went from 60 cafes to 277, "ample or adequate seating" from 142 to 252. Users see 1.8–4.6× more workable options, with no transcripts to read.

02. Problem Solved

Remote workers, freelancers and students lose ~20 minutes per attempt. The data exists; it is buried under thousands of irrelevant comments. The fix is to curate what is already there for the right question.

  • Is the WiFi fast enough for a call?
  • Are there outlets I can actually reach?
  • Will I be asked to close my laptop at 11am?

Why now? Remote work made cafe-as-office common, and AI can now read reviews the way a person does: "calm" and "peaceful" mean "quiet."

03. How I Validated

Step 1 — Survey (n=21) before writing a line of code. Tested whether the attributes I was about to build around (laptop policy, seating, vibe, hours) are what people actually weight.

SignalFindingWhat this meant
Visit frequency67% visit cafes ≥1×/weekRealistic, not aspirational.
Work-from-cafe52% named "study or work" as a top reasonPrimary use case is half the sample, not a niche.
Laptop-friendly weight86% Always/Often weight itLaptop friendly is the primary filter chip.
Seating weight86% Always/Often weight itAmple seating is also a key factor.
Hours weight71% Always consider hours; "late hours" surfaced unprompted twice"Open now" option is also necessary.
Vibe weight76% Always/Often consider vibeVibe can vary, but for work purposes, quiet vibe comes first.
Pet-friendly / Parking<15% Always for eitherConfirmed dropping both from the primary chip set.
Helpfulness of current sourcesMean 3.57 / 5The laptop-friendly cafe search experience gap is real!

"I would be interested in having a way to see what coffee shops are best to study at by answering questions like: is there Wi-Fi? How many tables are there? Can I get seating? Is there a pleasant vibe?"
— UW grad student (F, 25–29)

Step 2 — Shipped a constrained MVP.

Wall 1 · 5-review API cap → Most attributes came back blank.
Google's API legally returns 5 reviews per cafe, so volume was off the table. Meaning-extraction over fewer reviews was the only honest move.

Wall 2 · word ≠ meaning → "Peaceful" never matched "quiet."
Keyword search punishes users for not guessing the reviewer's exact word. The model had to know "calm," "peaceful" and "laid-back" answer the same question.

04. How I Decided the Path

What I picked, and what I said no to.

Rejected · chatbot. Forces users to learn a new pattern and read transcripts just to trust a result.

Selected · context-aware pre-tag. Read reviews + main photo ahead of time. Store tags with source quotes. Search is plain filtering.

Two cups, one decision: 20 minutes of manual searching → 2 minutes through pre-tagged AI.

05. How I Built

Trust lens · invisible AI with auditable claims

  • Matched meaning, not words. "Calm," "peaceful" and "laid-back" all resolve to quiet.
  • Showed the score's math. Every cafe pre-tagged, every weight visible.
  • Evidence for every tag. The reviewer's own quote sits beside the claim.
  • Photos as a second opinion. Never over a clear text answer.

Engagement lens · earning the second visit

  • List and Map as equal views. Not a default with a buried toggle.
  • A "Surprise Me" mode with swipe-to-decide, borrowed from dating apps.

06. Search Quality: Before & After

More of each cafe written down, so more of them findable. Reading reviews for meaning, and checking the main photo as a second opinion, filled in attributes that keyword matching never reached. Measured across all 464 cafes, keyword matching versus the same reviews read for meaning:

AttributeKeyword matchingReviews read for meaning
WiFi2%55%
Laptop policy13%74%
Outlets8%38%
Seating31%87%
Noise65%86%

That coverage is what moves the search. "Laptops welcome" returned 60 cafes before and 277 after; "ample or adequate seating" went from 142 to 252. The dataset never grew — the same cafes simply had more of themselves recorded.

Where it stops. Outlets sit at 38%, the weakest of the five, and that is a ceiling rather than a backlog. Reviewers mention power outlets in roughly 3% of reviews; Google's own review summaries mention them in 3%; and a vision pass over 458 cafes' photos produced outlet tags for two, because Places photos are lattes and storefronts, not walls with sockets. No further scraping moves this number. It needs people who are sitting in the cafe — which makes it a product decision, not a data one.

Bars · scaled to 252 cafes

"ample seating" cafes

+144 cafes · 2.8× more

keyword78 / 252
context-aware222 / 252

"laptops welcome" cafes

+111 cafes · 3.6× more

keyword43 / 252
context-aware154 / 252

Laptop-policy coverage

before17%
after61%

+44 pts

Seating-info coverage

before31%
after88%

+57 pts

07. Impact Delivered

Before Needle Space
Open Google Maps → scroll 20+ results → open 5+ profiles → read ~30 reviews, photos and menus → still unsure → pick one → arrive → no outlets.

With Needle Space
Pick a location and a filter → 10+ cafes match on productivity score → take the closest → it is what was promised. 2 minutes.

The win is not the time saved. It is the certainty. Every claim on every card carries the reviewer quote behind it.

08. What I'd Do Differently

1. Check that the yardstick measures the right thing. I nearly dropped the noise tag over an agreement number. The LLM and the keyword tagger agree on noise only 30% of the time, and I read that as "noise is too contextual to tag."

The one-line version: the keyword tagger scored "cozy" and "hidden gem" as evidence of quiet, so it called 301 of 464 cafes quiet and never once said loud — it was measuring charm, not sound.

Its keyword list put "cozy", "small cafe", "intimate", "tucked away" and "hidden gem" in the quiet bucket, each worth +2. Those words describe ambiance and appear in most cafe reviews, so almost every cafe tipped into quiet before a real noise word was weighed. The LLM reads the sentence instead of matching the word: of its 88 quiet tags carrying a quote, 87 cite an actual acoustic statement"quiet enough to actually hear the person sitting across from you." Across the 197 cafes where the two disagree, the LLM cites supporting evidence 89% of the time. Low agreement meant my baseline was wrong, not that the feature was unbuildable.

What I did about it: 28 cafes were still displaying "Quiet" on keyword evidence alone, because the app fell back to the keyword tag wherever the LLM had none. Those now show nothing. An empty space is honest; a confident wrong label is not.

Agreement with a baseline is not quality. I replaced it with two measures that need no ground truth — how often the tagger has to answer unknown, and how often it can cite a quote for the answer it gave — and gated the monthly pipeline on those instead. A metric that would have talked me out of a working feature is worse than no metric.

2. Check with the possible options in the beginning phase. I spent hours building keyword-based filters before realising they miss the context of a review. Exploring the options first would have saved all of it.

09. Why This Matters

The constraint forced a better product. Five reviews per cafe meant I couldn't lean on volume or even web scraping due to platform violation. I had to make the system logic that actually can increase the accuracy. The user never sees that work. The user wants to go to the best cafe to work, and searching for the cafe should be their minimum efforts.

Live prototype

Try Needle Space yourself.

Live at needle-space.netlify.app ↗ — embedded below.

https://needle-space.netlify.app/