πŸ•΅οΈ Dive Bar Detective

Discover hidden gems the algorithms miss
by Jeff Brines

Request Your City

This project currently only supports Denver
Want your city supported?
I'd love to expand this to more cities! However, current data acquisition and API costs are higher than I'd like to do this work at scale.
πŸ’‘ Good news
I'm actively working on ways to reduce costs. For approximately $30, I can likely add your city to the platform.
Interested? Let me know!
βœ“ Request submitted! Check your email for next steps.
Or email me directly at jeff.brines@gmail.com to chat about adding your city!

Support This Project

Help keep this project running
This project has real costs
Running Dive Bar Detective involves ongoing expenses:
  • OpenAI API β€” Analyzing 4,260+ reviews with LLM
  • Supabase β€” Database hosting and storage
  • Google Maps API β€” Place data collection
  • Outscraper API β€” Review data acquisition (this one kills me)
  • Compute costs β€” ML feature generation and updates
Buy me a coffee (or beer!) 🍺
β˜• $5 β€” Coffee 🍺 $10 β€” Beer 🍽️ $20 β€” Lunch
Your support helps keep this free tool running. Thank you! πŸ™

About Dive Bar Detective

A proof-of-concept data science exploration by Jeff Brines.
What this is
A data-driven "Sommelier for Dive Bars" that helps you find off-the-beaten-path spots in your town (or for now, Denver only). We use ML, AI and NLP to analyze reviews and extract what matters (at least what matters to Jeff): food quality, vibe, authenticity, and local recommendations.
The dataset
251 locations and 4,260+ reviews from Denver bars and restaurants. Being this is a proof of concept, I didn't pull in all locations from Google's Places API, but rather selected a subset of locations that I thought would be interesting and would be a good fit for the project. Overall, I wanted to select a diverse set of locations that would be a good fit for the project. No chains, focused on neighborhood joints with real character. Each review is analyzed to extract 9 quality and vibe signals..
How scoring works
Scores use percentile-based ranking within our dataset. A score of 9.5 means "top of our curated list" β€” not a perfect 10, but the best relative to other authentic Denver spots. This makes scores comparable across all lenses and helps you quickly identify standouts. And again, the dataset was already limited to only 251 locations, so the scores are not perfect, but they are a good starting point.
The lenses (0–10)
  • Quality: "Is it good?" β€” food/drink, recommendations, service, value.
  • Character: "Has soul?" β€” authenticity, classic, unpretentious, dive-y.
  • Underrated: "Better than Google says?" β€” our analysis vs star ratings.
  • Blended: 40% Quality + 35% Character + 25% Underrated.
  • Custom: Your own weights for all 9 signals.
Two ways to explore
  • πŸ“‹ List: Browse places sorted by your chosen lens. Click any card for details.
  • 🎯 Vibe Map: Scatter plot of Quality (X) vs Character (Y). Top-right = best finds!
How the Vibe Map works
The Vibe Map visualizes all 251 locations based on their Quality and Character scores. Dashed lines show the median β€” places in the top-right quadrant are above average on both axes. Bubble size reflects the current lens score. Scroll to zoom, shift+drag to pan.
Tech behind the scenes
NLP Pipeline: LLM-based sentiment analysis and signal extraction from review text.
UMAP (umap-learn): Dimensionality reduction for clustering similar places.
scikit-learn: K-Means clustering for vibe tags, Isolation Forest for "Unique" badge detection.
BERTopic: Auto-tag extraction (e.g., "late-night", "craft-beer") from review topics.
Transformers: RoBERTa-based sentiment scoring as a secondary signal.

Lens guide

How Quality, Character, Underrated, and Blended scores work.
Filters
0.0

πŸŽ›οΈ Build Your Custom Lens

50%
30%
40%
20%
30%
30%
40%
50%
30%
Showing 0 results
Denver only Β· Add your city
Locating targets...

🎯 Vibe Map β€” Quality vs Character

Dashed lines = median scores (splits places in half). Top-right = above average on both axes. Click dots for details. Scroll to zoom, shift+drag to pan.

Gem (8+) Solid (6-8) Meh (<6) | Scroll to zoom β€’ Shift+drag to pan |
0.0
Loading...
Quality --
Character --
Blended --
Tap name for full details
Loading…

Key reviews

Select a place…