The problem
School data in Nepal is spread across annual reports, spreadsheets, private directories and volunteer maps. Each holds a piece, they disagree, and none can answer where schools are missing or how schooling spread over time.
Without one place to look, parents, journalists and planners can't easily see basic patterns, like how few rural schools are private or where +2 schools stop.
Constraints
No official open dataset to start from: a directory of about 4,000 schools and OpenStreetMap's 25,000 had to be merged, and they overlap and disagree.
Many fields are sparse: founding years exist for only 9% of schools and enrolment for about the same.
The site had to resist bulk scraping, since the merged dataset is the valuable part.
The decision
A Python pipeline places every school in its province, district and local level using the Survey Department's boundaries, links the two sources one-to-one, and skips ambiguous matches rather than guessing.
Fill gaps from Nepali naming conventions ("Ma. Vi.", "Shree" plus a level word) only where the rule was checked against known labels, and flag every inferred value so it can be excluded from analysis.
Serve everything through a Next.js app on Postgres, with every API call behind a bot check, a signed session and rate limits, and no endpoint that returns records in bulk.
The trade-off
Precision over recall in matching: some real duplicates stay unlinked, in exchange for never merging two different schools.
The insights page keeps a caveat under each chart, unlike the rest of the site. Figures such as hill districts looking almost entirely community-run would mislead without them.
Outcome
26,115 schools with 99.9% on the map, a quality report on every build, and an insights page with patterns: 70% of schools in metropolitan cities are private against 2.4% in rural municipalities.
The next step is linking to the Ministry of Education's school register, which would confirm the gaps and add enrolment.