World Bank Data Browser
A web app that syncs the World Bank Indicators catalogue into PostgreSQL and serves a dashboard to browse, query, and download global development data.
Overview
The World Bank publishes thousands of development indicators — GDP, population, health, education, climate — but the raw Indicators API is awkward to explore and slow to query at scale. World Bank Data Browser fixes that: it syncs the entire catalogue into a local PostgreSQL database, then serves a clean dashboard to browse sources, indicators, and countries, and to query and download the time-series behind them.
It’s a compact, end-to-end data platform — ingestion, modeling, storage, and serving — built in the same shape as production systems.
What it does
- Catalogue sync — on first boot it pulls the full World Bank catalogue (sources, indicators, countries) into Postgres automatically.
- Browse & search — explore sources and indicators, with fuzzy text search
powered by Postgres
pg_trgm. - Query & download — pull the time-series for any indicator/country and export it for downstream use.
- Dark-mode dashboard — a server-rendered UI, no heavyweight frontend build.
Under the hood
- FastAPI serves both the API routes and the Jinja2-rendered pages.
- Async SQLAlchemy + Alembic model the data and manage migrations, which run automatically when the container starts.
- Resilient ETL — the World Bank client uses
httpxwithtenacityfor retries and backoff, so transient API failures don’t break a sync. - PostgreSQL 16 with the
pg_trgmextension for fast fuzzy search. - Dockerized end to end via Docker Compose, with a GitHub Actions pipeline running lint and tests against the same image used in production.
Why it’s here
This project is the clearest single picture of how I work on the data side: take a
messy external source, make it resilient to ingest, model it properly, and put a
usable interface on top. It’s also the technical groundwork for the AI and
productivity tools I’m building next on tools.cyv.me — same FastAPI foundation,
new surface.