An open-source transparency dashboard inspired by cal.com/open and other open startup initiatives. This project builds and publishes a beautiful static dashboard showing public open-source contributions by your GitHub organization.
- π― Modern Transparency Page: Hero section, metric cards, and "Why We're Open" section
- π Enhanced Analytics: Track PR success rates, merge times, PR sizes, and repository stars
- π Ecosyste.ms Integration: Repository health scores, dependency analysis, and community engagement metrics
- π Advanced Visualizations:
- PR success rate (merged vs closed)
- Issues vs PRs ratio over time
- PR merge time and size trends
- Repository stars ranking
- Repository health scores (via Ecosyste.ms)
- Dependency and impact analysis
- Community engagement metrics
- π₯ Contributor Leaderboard: Celebrate your top contributors
- π Weekly Trends: Visualize activity over time with interactive charts
- π’ Multi-Organization Support: Track multiple GitHub organizations
- π Dynamic Organization Switching: View any public organization's metrics via URL parameter or UI selector
- π¨ Fully Customizable: Easy configuration for branding and content
- π Privacy-First: Only public data, no private repo access needed
- π Static Site: Deploy to GitHub Pages with zero runtime API calls
To track and visualize engagement in open source projects over time, ensuring we are contributing back to the community with radical transparency.
-
Fork this repository
-
Configure your organization by editing
site/config.json:{ "organization": { "name": "Your Org Name", "tagline": "Your tagline here", "description": "Why you're transparent...", "githubOrg": "your-github-org" } } -
Update data collection settings in
scripts/config.json:{ "orgAllowlist": ["your-github-org"], "historyWeeks": 52 } -
Set up GitHub Actions:
- Add
GITHUB_TOKENsecret to your repository - Enable GitHub Pages (deploy from GitHub Actions)
- The workflow will automatically collect and publish metrics weekly
- Add
-
Deploy: Push to GitHub and the Actions workflow will build and deploy your dashboard!
This system allows you to publish metrics without exposing private data or hitting GitHub API rate limits at runtime.
-
Data Pipeline (
scripts/):- Runs on a scheduled GitHub Action (daily/weekly configurable).
- Queries GitHub GraphQL API for PRs and Issues in your allowed org list.
- Filters for repositories with Open Source licenses (SPDX allowlist).
- Stores counts in a local SQLite database (
data/participation.sqlite) incrementally. - Exports aggregated anonymous JSON metrics to
data/metrics.json.
-
Frontend (
site/):- A Vite + React static site with modern transparency design.
- Deployed to GitHub Pages.
- Consumes
data/metrics.jsonat runtime. - Displays hero section, metric cards, charts, and leaderboards.
{
"organization": {
"name": "CivicActions",
"tagline": "Building in the open, together",
"description": "Your transparency statement...",
"githubOrg": "civicactions",
"website": "https://civicactions.com"
},
"branding": {
"primaryColor": "#004488",
"primaryLightColor": "#0066bb",
"accentColor": "#107c10"
},
"transparency": {
"whyOpen": {
"enabled": true,
"items": [
{
"icon": "π",
"title": "Your Value",
"description": "Why this matters to you..."
}
]
}
},
"metrics": {
"cards": [
{
"id": "total_contributions",
"title": "Total Contributions",
"icon": "π",
"enabled": true
}
]
}
}{
"orgAllowlist": ["your-org", "partner-org"],
"historyWeeks": 260,
"maxWeeksPerRun": 10,
"collectAllPublic": false,
"licenseFilter": "oss",
"collectEcosystemsData": false,
"collectOpenContributions": false
}Options:
orgAllowlist: List of GitHub organizations to trackhistoryWeeks: How far back to collect data (default: 260 weeks / 5 years)collectAllPublic: Track all public repos (not just org repos) for staff memberslicenseFilter: "oss" (only open source) or "all"collectEcosystemsData: Enable Ecosyste.ms integration for repository health and community metrics (default: false)collectOpenContributions: Check tracked repos for.well-known/open-contributions.jsondescriptors and surface them in the dashboard (default: false)
- Node.js 24+
- A GitHub Personal Access Token (classic) with
read:orgscope (if you want to run the data collection locally).
Root (for scripts):
npm installSite (for frontend):
cd site
npm install-
Create a
.envfile in the root with your GitHub token:GITHUB_TOKEN=ghp_your_token_here(Note: The scripts use
process.env.GITHUB_TOKEN. If running locally, you might need to load dotenv or export the variable in your shell). -
Run the update script:
export GITHUB_TOKEN=... npm run updateThis will create/update
data/participation.sqlite. -
Export the metrics JSON:
npm run exportThis generates
data/metrics.json.
- Make sure
data/metrics.jsonexists (see above). - Copy
data/metrics.jsontosite/public/data/(config.json is automatically copied by Vite):mkdir -p site/public/data cp data/metrics.json site/public/data/
- Start Vite:
cd site npm run dev - Open http://localhost:5173 in your browser
Note: The build process automatically copies
site/config.jsontosite/public/config.json, so you only need to maintain the single source file atsite/config.json.
If you change the org allowlist or staff allowlist and need historical data recomputed with the new lists:
- Update allowlists: set
ORG_ALLOWLISTrepo variable and/orSTAFF_ALLOWLIST_JSONsecret (JSON array of usernames). Keep them public-only per AGENTS.md rules. - Trigger Update participation data via Run workflow and supply one of:
reprocess_from_week(YYYY-MM-DD Monday) to restart from that week, orreprocess_weeks(number) to rebuild that many full weeks back from the last complete week. These map toREPROCESS_FROM_WEEK/REPROCESS_WEEKSenvs consumed byscripts/update_sqlite.mjs.
- Let the workflow finish; it will rewrite
data/participation.sqliteanddata/metrics.jsonfor the specified window, then the Pages deploy will publish the new aggregates.
The dashboard is automatically deployed to GitHub Pages via GitHub Actions:
- Workflow runs weekly (or manually triggered)
- Collects latest metrics from GitHub API
- Builds the static site
- Deploys to GitHub Pages
No runtime API calls are needed - everything is pre-generated!
The dashboard supports viewing metrics for any public GitHub organization without forking or reconfiguring:
Add ?org=<orgname> to the URL to view any organization's metrics:
https://your-dashboard-url.github.io/?org=openplus
https://your-dashboard-url.github.io/?org=civicactions
The URL parameter accepts:
- Organization name:
?org=openplus - Full GitHub URL:
?org=https://github.com/openplus - URL without scheme:
?org=github.com/openplus
At the bottom of the page, you'll find the "Choose Organization" section where you can:
- Enter an organization name (e.g.,
openplus) or GitHub URL - Click "Apply" to switch organizations
- Your choice is saved in browser localStorage and persists across page refreshes
- Click "Reset" to return to the default organization
Note: The URL parameter always takes precedence over localStorage settings.
The dashboard can optionally integrate with Ecosyste.ms to provide enhanced repository insights:
- Repository Health Scores: Automated health assessments (0-100%) based on activity and maintenance
- Dependency Analysis: Track dependencies and reverse dependencies (impact)
- Community Engagement: Issue resolution times, comment engagement, and contributor metrics
- Maintenance Indicators: Identify projects that need attention
To enable, set "collectEcosystemsData": true in scripts/config.json. See ECOSYSTEMS_INTEGRATION.md for details.
The dashboard can optionally discover and display Open Contributions Descriptors published by tracked repositories.
A .well-known/open-contributions.json file is a machine-readable descriptor that a repository can publish to describe how it accepts contributions β types of work welcomed, contact points, policies, and more. This project aligns closely with that goal of mapping open-source contribution pathways.
When enabled, the collector:
- Looks for
.well-known/open-contributions.jsonin each tracked repository via the GitHub Contents API. - Stores whether a descriptor was found, and its parsed contents if present, in the SQLite cache.
- Exports this data in
data/metrics.jsonso the dashboard can display:- Which repos publish a descriptor (π badge on repo cards in the Projects view)
- A dedicated Open Contributions Descriptors section with per-repo details
To enable, set "collectOpenContributions": true in scripts/config.json:
node scripts/set_config.mjs --collectOpenContributions=trueThen re-run the collector:
node scripts/update_sqlite.mjs
node scripts/export_metrics.mjsThis project is inspired by the open startup movement and transparency pages like:
- cal.com/open - Open startup transparency
- Buffer's Open page - Revenue and metrics transparency
- Ghost's Open page - Open source product metrics
This project is committed to transparency about AI usage. Below is a record of AI tools that have been used in this project and how they were used.
| AI Tool | Model / Version | How it was used |
|---|---|---|
| GitHub Copilot (Coding Agent) | Claude Sonnet (via GitHub Copilot) | Used to write and refactor code, generate documentation, implement new features, and review pull requests throughout the development of this project. |
None. The data collection scripts (scripts/update_sqlite.mjs, scripts/export_metrics.mjs) query the GitHub GraphQL API directly and do not use any AI or machine-learning services.
None. The dashboard is a fully static site. No browser-based AI features are enabled. The deployed site makes no runtime API calls to any AI service.
Note for contributors and AI agents: If you use an AI tool to contribute to this project, please add or update your tool's entry in the table above. See
AGENTS.mdfor the full disclosure policy.
Contributions are welcome! This project is designed to be:
- Easy to fork and customize for any organization
- Privacy-focused (public data only)
- Performant (static site, no runtime API calls)
- Extensible (add your own metrics and visualizations)
MIT
