Data repository for the μLearn contributions leaderboard, deployed at contributions.mulearn.org.
This repo holds muLearn's config, branding, and scraped contribution data. The app engine (ohcnetwork/leaderboard) is pulled at build time — it is not forked. Only this repo, the scraper plugin (gtech-mulearn/mulearn-github-plugin), the Cloudflare Pages project, and the domain belong to muLearn.
| Path | Purpose |
|---|---|
config.yaml |
Org info, roles, plugin config, branding pointers |
theme.css |
μLearn brand colors (overrides the engine's CSS variables) |
assets/ |
Logo, favicon, OG image, badge SVGs (see assets/README.md) |
.github/workflows/scrape.yml |
Cron (every 6h): scrape the org → commit data → upload DB to R2 |
.github/workflows/deploy.yml |
On push: build the static site → deploy to Cloudflare Pages |
contributors/ |
Generated + human-editable contributor profiles |
activities/, aggregates/ |
Generated scrape output (committed by the workflow) |
scrape.ymlruns every 6 hours: authenticates as themulearn-leaderboard-botGitHub App, scrapes every repo ingtech-mulearnvia the plugin, commits the updated data back tomain, and uploads the SQLite DB to Cloudflare R2.- The data commit triggers
deploy.yml, which builds the static site from the committed data and deploys it to Cloudflare Pages.
Set under Settings → Secrets and variables → Actions:
Secrets: GH_APP_PRIVATE_KEY (PKCS#8), CLOUDFLARE_API_TOKEN,
CLOUDFLARE_ACCOUNT_ID
Variables: GH_APP_ID, CLOUDFLARE_PAGES_PROJECT_NAME,
LEADERBOARD_DATA_DB_URL
Also enable Settings → Actions → General → Workflow permissions → Read and write.
Everyone defaults to contributor. To mark someone core team, add
contributors/<github-username>.md:
---
username: someusername
role: core
---Commit → the next deploy shows the new role. Human-edited profiles always win over scraped data.