A data story visualizing SDG 4 (Quality Education). Every tree in this forest represents a country — its trunk height encodes years in school, and its canopy density encodes how much children actually learn.
silent-forest/
├── data/ Python data pipeline
│ ├── raw/ Source CSV data
│ ├── src/ Pipeline code (Pydantic models, transforms)
│ └── output/ Generated education.json consumed by the frontend
└── web/ Next.js App Router frontend
├── app/ Pages and layouts
├── components/ Forest visualization + shadcn/ui
└── lib/ Types, constants, utilities
- Python 3.11+
- Node.js 18+
- pnpm — install with
npm install -g pnpmif you don't have it
git clone https://github.com/Leonardo-Notargiacomo/silent-forest.git
cd silent-forestcd data
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r <(echo "pandas\npydantic") # or: pip install pandas pydantic
python -m src.pipelineThis reads raw/education.csv, validates every row with Pydantic, and writes output/education.json.
cd web
pnpm install
pnpm devOpen http://localhost:3000.
cd web
pnpm build
pnpm start| Layer | Technology |
|---|---|
| Data pipeline | Python 3.11+, pandas, Pydantic |
| Frontend | Next.js 16 (App Router), React 19 |
| Styling | Tailwind CSS 4, shadcn/ui (new-york) |
| Animation | Framer Motion |
| Icons | Lucide React |
Contributions are welcome! Whether it's fixing a bug, improving the visualization, adding new data, or refining the narrative — every bit helps.
- Fork the repository
- Create a branch for your change:
git checkout -b feat/your-feature
- Make your changes — see the sections below for area-specific guidance
- Test locally — make sure the pipeline runs and the frontend builds:
cd data && python -m src.pipeline cd ../web && pnpm build
- Commit with a clear message describing what and why
- Open a Pull Request against
master
- Data — Add more countries, update metrics with newer sources, add new indicators to the CSV and pipeline
- Visualization — Improve the tree rendering, add new interaction modes, enhance mobile responsiveness
- Narrative — Refine chapter text, add new story chapters, improve accessibility
- Infrastructure — CI/CD, testing, performance, documentation
- Python — follow PEP 8; Pydantic models for all data structures
- TypeScript — strict mode; prefer
"use client"only where hooks or browser APIs are needed - CSS — use Tailwind utilities; custom CSS goes in
globals.css - Commits — concise messages focused on the "why" (e.g.
fix: correct canopy scaling for edge cases)
- Edit
data/raw/education.csvwith the new or updated rows - Run the pipeline to validate:
cd data && python -m src.pipeline - The pipeline will reject invalid rows (bad region names, out-of-range values, etc.)
- Commit both the CSV and the regenerated
output/education.json
This project is open source. See the repository for license details.