Startup ecosystem intelligence

Tamil Nadu Startup Map turns fragmented ecosystem data into a navigable public product. People can discover companies by geography, sector, stage, status, age, and ecosystem tier; move between map and directory views; open structured profiles; and continue to company websites or career opportunities.

Next.js 16React 19TypeScript MapLibre GLSupabasePostgreSQL Full-text searchScrapyGeocoding

Startupmap

A case study by Haroon K MProduct · Data · Geospatial engineering
Built with
Next.js 16.3React 19.2TypeScript 5Tailwind CSS 4 MapLibre GL 6react-map-gl 8SupabasePostgres 17 PostgRESTZod 4GSAP 3Scrapy 2.17Vitest 4
The thesis

A startup ecosystem is difficult to navigate when company data is scattered across registries, incubator directories, websites, and press. The product creates a single discovery layer: source-aware records underneath, fast search and filters in the middle, and a map-first interface that makes the ecosystem legible to talent, founders, investors, and collaborators.

See the product

From a state-wide overview to one company’s story

The experience moves from clustered geography to individual company markers, then into a structured profile with business context, funding and team signals, website access, and a careers pathway. The map is the interface; the product underneath is the searchable, classified ecosystem dataset.

Open live platform →
01
The pipeline

Evidence to map

Publishing a trustworthy marker is a data-engineering problem before it is a visual one. The workflow keeps acquisition, judgement, coordinates, and publication reviewable.

01

Discover

Collect candidate companies from public Startup India profiles, the IIT Madras Research Park directory, company websites, and permitted official or ecosystem sources.

02

Normalize

Convert inconsistent source shapes into one typed record vocabulary for names, domains, categories, stages, status, funding, locations, and provenance.

03

Deduplicate

Resolve records by stable slugs, domains, registered names, and source evidence while preserving curated facts over weaker scraped values.

04

Validate

Enforce required fields, controlled taxonomies, location rules, website checks, and at least one traceable source. Unknown facts stay unknown instead of being invented.

05

Geocode

Turn source-backed addresses into cached Nominatim or CARTO candidates, then apply metro bounds, precision, confidence, reverse-address, and water-feature checks before promotion.

06

Classify

Calculate an explainable ecosystem tier from documented funding, stage, employees, company age, investor, market, growth, and revenue signals.

07

Publish safely

Write verified JSON into Supabase through chunked, retry-aware, idempotent upserts. Completeness checks, slug migration, and withdrawal guards stop partial runs from silently damaging the live directory.

02
Discovery

What people can do

The same public dataset supports two browsing modes and multiple ways into a company, without requiring an account.

Explore the map

Navigate a globe-to-flat vector map with clustered company counts, logo markers, animated camera movement, and precise expansion behavior.

Browse the directory

Switch to a responsive card grid without losing the same search and filter vocabulary used by the map.

Search deeply

PostgreSQL full-text search covers company names, categories, subcategories, and descriptions through a weighted GIN index.

Filter the ecosystem

Narrow by city, sector, stage, ecosystem tier, company type, founded year, and operating status; the URL keeps the view shareable.

Read company profiles

See available location, category, founding, team, funding, round, status, website, and careers information in one profile.

Find career paths

Use a verified company careers page when one was found; otherwise the interface clearly falls back to a company-specific jobs search.

Propose a startup

Submit a company, address, optional map pin, sector, stage, description, and contact email for human review.

Move without dead ends

Return from a company to the exact filtered list you came from, or continue to its own website and opportunities.

Share and index

Company and taxonomy routes carry metadata, structured JSON-LD, sitemap entries, and stable URLs for search engines and direct sharing.

03
Geospatial system

Density without noise

The hard part is not placing one pin. It is keeping hundreds of nearby companies readable without pretending a display offset is a new fact.

752
Companies in the live directory
11
Selectable Tamil Nadu cities
z7
Globe-to-flat transition
  • MapLibre owns the vector basemap, projection, camera, and worker-based clustering; React owns accessible DOM marker chips and company cards above the GL canvas.
  • Clusters form from screen-space collision rules rather than arbitrary geography, so a count appears where company chips would genuinely overlap.
  • Companies sharing one sourced address are fanned out for legibility while their stored latitude and longitude remain untouched.
  • A decluttering pass offsets residual chip collisions in screen space and animates the result, preserving click targets without rewriting the underlying coordinates.
  • The committed map style is derived from OpenFreeMap Liberty and uses keyless OpenStreetMap-based vector tiles; CARTO Voyager remains a documented fallback.
  • MapLibre’s worker is copied into the public build during install, development, and production build steps, avoiding fragile runtime worker discovery.
04
Under the hood

Built for honest scale

The architecture is deliberately explicit about what is sourced, what is calculated, what is still unknown, and what the public is allowed to read or write.

  • Server and client split: Next.js App Router server components fetch directory data; the map, toolbar, filters, command search, and interaction state run on the client.
  • Lean payloads: list queries select only fields the explorer renders. Funding history and verification detail are fetched one company at a time instead of being repeated hundreds of times.
  • Complete reads: PostgREST rows are paged below its default ceiling, fetched in parallel, and compared with count(*); the page refuses to serve a silently truncated dataset.
  • Five-minute freshness: shared database reads and incrementally regenerated pages use a 300-second lifetime, so data updates can reach the site without a code deployment.
  • Least-privilege submissions: anonymous users may insert only form-owned columns. They cannot read, update, delete, set review state, or publish a submission; database constraints and rate guards backstop the API.
  • Deterministic, not black-box AI: ecosystem tiers and category inference are reproducible rules over sourced fields. The platform does not claim embeddings, semantic search, recommendation models, or automated matchmaking.
  • Operational deployment: the app is Vercel-compatible and the current public production response is served through Railway; environment secrets remain server-side.
  • Testable boundaries: Vitest covers filters, marker derivation, selection, validation, rate limiting, ETL logic, geocoding rules, seeding safeguards, careers discovery, and rendered map components.
By the numbers
4
Core ETL stages before publication
300s
Cache and page revalidation window
1
Public API route: controlled startup submission
Explore the work

See the ecosystem in motion.

Open the live map to browse companies, or inspect the public repository for the product, data, geospatial, and testing architecture.