Open data
The index, as JSON
Every page on goha is rendered from static JSON files under /data/. There is no API key, no auth and no rate limit — the same files the site fetches are the ones you can read. They are rebuilt by the daily scrape, so everything here is a snapshot, not a live stream.
Endpoints
| Path | What it holds | Shape |
|---|---|---|
/data/projects.json | Every entity in one contract: models, datasets, companies, papers. | Project[] |
/data/papers.json | Research index with derived language and task tags. | { data: Paper[] } |
/data/orgs.json | Organization footprints merged with curated company records. | { data: Org[] } |
/data/leaderboard.json | Published evaluations normalized per task, best first. | { sections: Section[] } |
/data/stats.json | Counts, index freshness and the featured model. | Stats |
/data/activity.json | Recent ecosystem events with entity links. | { data: Event[] } |
/data/insights.json | Weekly download movers and most-downloaded models. | Insights |
/data/languages.json | Language index — name, slug and script glyph. | { data: Language[] } |
/data/language-coverage.json | Language × task matrix used by the radar and gap report. | { rows, languages, tasks } |
/data/growth.json | Daily model/dataset counts from every snapshot. | { data: GrowthPoint[] } |
/data/top-models-history.json | Download history of the five most-used models. | { rows, series } |
/data/lineage.json | Model family tree — nodes, edges, families, layout. | { nodes, links, families } |
/data/taxonomy.json | Categories and language/tech stacks used by filters. | { categories, techStacks } |
Examples
Read the freshness of the index:
curl -s https://goha.enoch.et/data/stats.json | jq .countsFilter Amharic speech models with jq:
curl -s https://goha.enoch.et/data/projects.json \
| jq '[.[] | select(
(.projectCategories[1].name // "") == "ASR"
and ((.repositoryDetails.languages // []) | index("Amharic"))
) | { title, downloadsMonthly, repoUrl }]'Pull published ASR results as CSV:
curl -s https://goha.enoch.et/data/leaderboard.json \
| jq -r '.sections[] | select(.task=="ASR")
| .rows[] | [.model, .org, .metric, .display, .dataset]
| @csv'The Project shape
projects.json is the one contract everything else renders from. The goha-specific fields are additive to the original open-source schema:
{
"id": "pjt_…",
"title": "wav2vec2-large-xlsr-53-amharic",
"description": "Speech recognition model for Amharic.",
"owner": { "name": "agkphysics" },
"projectCategories": [{ "name": "Model" }, { "name": "ASR" }],
"repositoryDetails": {
"stars": 5,
"license": "mit",
"languages": ["Amharic"],
"readme": "<base64 model card>"
},
"downloadsMonthly": 73007,
"growth": 30,
"sparkline": { "points": [ … ], "timestamps": [ … ] },
"evaluations": [ … ], // published metric tables
"baseModel": "…", // lineage edge
"paramCount": 315678570
}Honest caveats
- These are static files. Freshness is the scrape cadence — check
stats.json → indexedAt. - Language and task tags are derived from model-card metadata and names, not authored by us; the derivation is documented on the gap report.
- Hosting is GitHub Pages. Server-side fetches always work; for browser fetch from another origin, check the response's CORS headers before relying on it.
- The data is public ecosystem data aggregated under MIT; the upstream model cards keep their own licenses — always check the asset itself before reuse.

