All projects

Local SEO Toolkit

SEO Tracker

Dockerized toolkit for local search visibility, built on a dedicated Postgres instance.

DockerPostgresGoogle APIsPythonGeo-grid

The problem

Local rank is not a single number — a business can sit at #2 four blocks away and drop off the map pack entirely a mile out. Off-the-shelf trackers either hide that or charge per grid point.

How it's built

  • Coordinate grid generator produces search points around a business address at configurable radius and density
  • Scrapers collect map-pack results per point and store them with their coordinates
  • Google Business Profile metrics ingested alongside rank data for correlation
  • NAP (name/address/phone) citation checks flag inconsistencies across directories
  • Dedicated Postgres instance in Docker, separate from other project databases

Outcome

Rank becomes a heatmap instead of a number, which makes it obvious where visibility actually ends — and which citation problems are dragging it down.

At a glance

Geo-grid
Rank sampled per coordinate, not once
Dedicated
Postgres instance, isolated in Docker
NAP
Citation consistency checked automatically

Decisions & tradeoffs

Considered: A commercial rank tracker

Chose: Building the grid sampler myself

Why: Per-grid-point pricing made honest coverage testing unaffordable.

Tradeoff: I maintain the scrapers when result markup changes.

Considered: Sharing the main Postgres instance

Chose: A separate database container per project

Why: Scrape volume shouldn't compete with product traffic for connections.

Tradeoff: Slightly more memory on the host and one more service to back up.

More case studies