I Built a Business Directory with a Dark Theme. Everyone Said I Was Crazy.

Projects· 5 min read

I Built a Business Directory with a Dark Theme. Everyone Said I Was Crazy.

There was a specific moment when I decided gestorías-cerca-de-mi was going to be different.

I was reviewing competitors. White backgrounds, horizontal menus with dozens of options, CAPTCHAs just to contact someone, corporate typography from the 2000s. And I thought: nobody designs these sites for the user who actually uses them.

Here are the UX decisions I made, why I made them, and what I learned along the way.

The most controversial decision: dark theme as primary design

Business directories in Spain are, almost without exception, white. That’s the norm. White + corporate blue = credibility. So they say.

I broke it.

Dark theme as the primary design — not as an alternative, as the base — was the first decision I made when I opened the project in Next.js. The reason is simple: when does someone actually search for a gestoría near them?

Not at 10am with sunlight pouring through an office window. They search in the evening after work, on the couch with their phone. Or early morning, on the metro, with screen brightness on minimum.

A white background in that context is literally uncomfortable. TailwindCSS v4 with dark mode + Framer Motion for transitions. Built for the real moment people use this.

The reaction? “It looks like a crypto site, not a business directory.” Good. If you’re saying that, you’ll remember it.

Mobile-first isn’t a slogan: it’s the architecture

Most websites claim to be mobile-first. Then they have a desktop design with a mobile version as an afterthought.

With gestorías-cerca-de-mi I started from mobile. Responsive breakpoints from the outside in. Every component validated on 375px screens before scaling up.

The reason is the same as the dark theme: the urgent user searches on mobile. When someone needs to find a gestoría nearby, they’re not in front of their computer with free time. They’re on a break, moving, in a hurry.

Microsoft Clarity helps me see real sessions. The recordings show what no pageview analytics shows: how people swipe, where they get stuck, what they can’t find. That data informs every iteration.

PostGIS: the difference between “in Madrid” and “500 meters away”

A common mistake in local directories: filter by city.

“Gestorías in Madrid” returns 200 results. That doesn’t help anyone.

What I built uses PostGIS with Supabase for real proximity queries. Not city. Coordinates. The user arrives, their location is detected (or they enter their postal code), and results are ordered by actual distance in meters.

That’s what makes “gestorías near me” literally meaningful. It’s not an aspirational domain name. It’s the backend architecture.

This requires no external map APIs for distance calculations. Supabase with the PostGIS extension handles it directly in the database. Faster, more cost-effective, no external dependencies.

Why I removed CAPTCHA (and what I put in its place)

CAPTCHA is the worst invention in the history of user experience.

In a directory where the main objective is getting the user to contact a professional, putting friction right before contact is counterproductive. Every failed CAPTCHA is a lost conversion.

I replaced it with honeypot. A hidden field in the form that no human sees or fills out, but bots do. If the field has data: silent spam. If it’s empty: real human.

Result: zero friction for legitimate users, effective bot protection, and forms people actually complete. The submission system uses Resend for email notifications and a Supabase RPC function to persist the data.

URLs as design

This sounds technical but it’s pure UX.

Every search in gestorías-cerca-de-mi generates a URL with readable parameters:

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

That means the user can:

  • Bookmark their search
  • Share it with someone (“check out Barcelona gestorías for freelancers”)
  • Use the browser back button without losing applied filters

These are small details. But they’re the details that decide whether a user comes back or not.

What the directory teaches about local UX

After building this, with 897 verified gestorías and 71,895 real reviews indexed, there’s one clear conclusion:

Local directories have a systemic UX problem because nobody puts themselves in the real user’s situation. They’re designed to impress, not to work in the moment of urgency.

The user searching for a gestoría nearby:

  • Is on mobile
  • Has low battery or limited time
  • Wants real distance, not just city
  • Doesn’t want to solve a puzzle to send an email
  • Is probably doing this at night

Design for that user. Not for the one browsing comfortably from home on a Sunday morning.

Two things you can apply today

If you’re building a local directory or any professional services website:

1. Replace CAPTCHA with honeypot. Improves the experience for real users without sacrificing protection. The code is simple and the conversion impact is immediate.

2. Use URL parameters for search filters. Not React local state, not sessionStorage. URL. It’s free, improves SEO, and makes the experience more human.

The directory is still being built. The last round of commits from last December was Phase 9-11 of mobile UX improvements. More to come. I share it as it progresses.

Brian Mena

Brian Mena

Software engineer building profitable digital products: SaaS, directories and AI agents. All from scratch, all in production.

LinkedIn