Interactive network explorer for replication and open science evidence.
# Install uv if you don't have it
curl -Lsf https://astral.sh/uv/install.sh | sh
# Clone / enter the project folder
cd lighthouse
# Create venv and install dependencies
uv sync
# Run the development server
uv run flask --app app run --port 8080Then open http://localhost:8080
macOS note: port 5000 is occupied by AirPlay Receiver — use 8080 or any other free port.
lighthouse/
├── app.py # Flask server and API endpoints
├── import_xlsx.py # Script to convert Excel data → data/data.json
├── data/
│ └── data.json # Data read by the app at startup (generated, don't edit manually)
├── content/
│ └── about.md # Content of the About page (edit this to update it)
├── templates/
│ ├── index.html # Main app shell
│ └── about.html # About page wrapper (layout only)
├── static/
│ ├── css/
│ │ ├── style.css # All app styles
│ │ └── about.css # Styles specific to the About page
│ └── js/
│ └── app.js # All frontend logic (visualization, navigation, search)
└── FORRT_Lighthouse_Data.xlsx # Source data (edit this, then run import_xlsx.py)
- We are currently using a local copy of the data stored in:
FORRT_Lighthouse_Data.xlsx, with three main sheets:effects_review— one row per effect/phenomenonpapers_review— one row per paper linked to an effecteffects_wikipedia— Wikipedia entries linked to effects (entries marked asnon-relatedin thevalidationcolumn are excluded from the app)
- Running
import_xlsx.pyconverts the Excel intodata/data.json - The Flask app loads
data.jsononce at startup into memory - The frontend fetches data through the API as the user navigates
In the near future we will start reading directly from Google Sheets
Edit FORRT_Lighthouse_Data.xlsx and run:
uv run python import_xlsx.py
# or with an explicit path:
uv run python import_xlsx.py path/to/FORRT_Lighthouse_Data.xlsxThis regenerates data/data.json. Restart the server to pick up the changes.
| Column | Description |
|---|---|
effect_name |
Name of the effect |
field |
Broad academic field |
subfield |
Academic sub-field |
cluster_a, cluster_b, cluster_c |
Thematic groupings used for sub-navigation within a discipline |
description |
Plain-text description |
| Column | Description |
|---|---|
effect_name |
Links the paper to an effect |
title |
Paper title |
doi |
DOI |
year |
Publication year |
apa_reference |
APA citation |
current_classification |
Paper type (foundational, critique, meta_analysis, replication, reproduction) |
summary |
Plain-text summary |
| Column | Description |
|---|---|
effect_name |
Links the entry to an effect |
wiki_title |
Title of the Wikipedia article |
validation |
Relevance check — entries marked non-related are excluded from the app |
wiki_url |
URL of the Wikipedia article |
year |
Year the article was last reviewed |
The About page content lives in content/about.md — edit that file directly using Markdown. The app converts it to HTML automatically on each request; no restart needed.
The app is configured for deployment on Render via render.yaml. Each push to main triggers an automatic redeploy.
To run in production manually:
uv run gunicorn app:app --bind 0.0.0.0:${PORT:-8080} --workers 4A previous iteration of this project is available on this repository.