Local SEO Toolkit
SEO Tracker
Dockerized toolkit for local search visibility, built on a dedicated Postgres instance.
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.