Your one-stop solution for tracking, monitoring, and visualizing all OWASP GitHub repositories with beautiful sparklines and comprehensive metadata!
π View Live Demo β’ π Documentation β’ π Report Bug β’ β¨ Request Feature
OWASP-Bumper is an intelligent GitHub Action-powered tool that automatically generates a comprehensive, interactive HTML dashboard displaying all repositories in the OWASP GitHub organization. It provides deep insights into repository activity, health, and metadata - all updated daily without any manual intervention!
Perfect for organization administrators, project leaders, and contributors who need to:
- π Monitor repository activity across the entire OWASP ecosystem
- π Visualize commit patterns with 52-week activity sparklines
- π·οΈ Categorize projects and chapters at a glance
- π Track inactive repositories that need attention
- π Analyze project health metrics (stars, forks, issues, PRs)
|
|
|
|
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β GitHub Actions Trigger β
β (Daily at 00:00 UTC or Manual/Push) β
ββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Python Script (generate_repo_list.py) β
β β
β 1. Fetch all repos via GitHub API β
β ββ> GET /orgs/{org}/repos (paginated) β
β β
β 2. Enrich with metadata (parallel requests): β
β ββ> Fetch index.md (YAML frontmatter parsing) β
β ββ> Fetch open PR counts β
β ββ> Fetch 52-week commit stats (/stats/participation) β
β β
β 3. Generate static HTML with embedded data β
β ββ> JSON array embedded in JavaScript β
ββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Commit & Push to Main β
β (index.html updated automatically) β
ββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Deploy to GitHub Pages β
β (Accessible at username.github.io/repo) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
| Component | Technology | Purpose |
|---|---|---|
| Backend | Python 3.11+ | Repository data fetching and HTML generation |
| CI/CD | GitHub Actions | Automated daily runs and deployment |
| Hosting | GitHub Pages | Free, fast, and reliable static hosting |
| Frontend | Vanilla JS/HTML/CSS | Zero-dependency interactive dashboard |
| API | GitHub REST API v3 | Repository data and statistics |
| Styling | Custom CSS3 | Modern, responsive design with Flexbox/Grid |
One of the most powerful aspects of OWASP-Bumper is its zero-dependency architecture:
- β
Python: Uses only the standard library (
urllib,json,base64, etc.) - β JavaScript: Pure vanilla JS - no jQuery, React, or Vue needed
- β CSS: Handcrafted responsive styles without Bootstrap or Tailwind
- β Deployment: Native GitHub Actions - no third-party services
Why this matters:
- π Faster execution (no dependency installation time)
- π More secure (no supply chain vulnerabilities)
- π― Easier maintenance (no version conflicts)
- π° Cost-effective (runs in seconds, not minutes)
The generated HTML page uses a modern client-side rendering approach:
- Data Embedding: All repository data is embedded as a JSON array in the HTML
- Dynamic Rendering: JavaScript generates DOM elements on the fly
- Efficient Filtering: Client-side filtering and sorting for instant results
- SVG Sparklines: Commit activity charts generated programmatically
- XSS Protection: All user content sanitized through
escapeHtml()function
The script intelligently handles GitHub's API rate limits:
| Feature | Rate Limit Impact | Optimization Strategy |
|---|---|---|
| Basic repo fetch | ~10 requests | Paginated fetching (100 per page) |
| Sparkline data | 1 request per repo | Batched with 1s delay per 100 repos |
| index.md fetch | 1 request per repo | Optional (can be disabled) |
| PR counts | 1 request per repo | Optional (can be disabled) |
Rate Limit Tiers:
- π Unauthenticated: 60 requests/hour (not recommended)
- π Authenticated: 5,000 requests/hour (used by default in Actions)
- β‘ GitHub Actions: Special higher limits for workflows
Pro Tips:
- Set
FETCH_SPARKLINES=falseto reduce API calls by ~N (N = number of repos) - Set
FETCH_METADATA=falseto reduce API calls by ~2N - Local testing benefits from using
GITHUB_TOKENenvironment variable
The workflow is already configured and runs automatically! Just watch it work:
-
β° Wait for the daily run at 00:00 UTC, or
-
π±οΈ Trigger manually:
- Go to Actions tab
- Select "Generate OWASP Repository List"
- Click "Run workflow"
-
π View the results at: https://owasp-blt.github.io/OWASP-Bumper/
Want to use this for your own GitHub organization? Easy!
- Fork this repository
- Enable GitHub Pages:
- Go to Settings β Pages
- Set source to GitHub Actions
- Configure the organization:
- Edit
.github/workflows/generate-repo-list.yml - Change
GITHUB_ORG: owaspto your organization name
- Edit
- Run the workflow and enjoy your dashboard!
π See SETUP.md for detailed instructions.
# Clone the repository
git clone https://github.com/OWASP-BLT/OWASP-Bumper.git
cd OWASP-Bumper
# Run with default settings (OWASP organization)
python3 generate_repo_list.py
# Open the generated page
open index.html # macOS
xdg-open index.html # Linux
start index.html # WindowsUsing a GitHub token avoids rate limits and enables all features:
# Create a Personal Access Token at: https://github.com/settings/tokens
# Required scope: public_repo (or repo for private repos)
export GITHUB_TOKEN=ghp_your_token_here
python3 generate_repo_list.pyCustomize behavior with these environment variables:
| Variable | Default | Description | Example |
|---|---|---|---|
GITHUB_ORG |
owasp |
Target GitHub organization | export GITHUB_ORG=microsoft |
GITHUB_TOKEN |
(none) | GitHub Personal Access Token | export GITHUB_TOKEN=ghp_xxx |
OUTPUT_FILE |
index.html |
Output HTML filename | export OUTPUT_FILE=repos.html |
FETCH_SPARKLINES |
true |
Enable 52-week activity charts | export FETCH_SPARKLINES=false |
FETCH_METADATA |
true |
Enable index.md parsing & PR counts | export FETCH_METADATA=false |
# Fetch only basic data (fast, minimal API calls)
export GITHUB_TOKEN=ghp_xxx
export GITHUB_ORG=owasp
export FETCH_SPARKLINES=false
export FETCH_METADATA=false
python3 generate_repo_list.py
# Generate for a different organization with all features
export GITHUB_TOKEN=ghp_xxx
export GITHUB_ORG=microsoft
export OUTPUT_FILE=microsoft_repos.html
python3 generate_repo_list.py
# Test without authentication (limited to small orgs due to rate limits)
export GITHUB_ORG=your-small-org
export FETCH_SPARKLINES=false
export FETCH_METADATA=false
python3 generate_repo_list.pyEdit .github/workflows/generate-repo-list.yml:
on:
schedule:
- cron: '0 */6 * * *' # Every 6 hours
# Other examples:
# - cron: '0 0 * * 1' # Weekly (every Monday)
# - cron: '0 0 1 * *' # Monthly (1st of month)The HTML generation is in generate_repo_list.py, in the generate_html() function:
- Styles: Embedded CSS starting at line ~268
- Layout: HTML structure starting at line ~262
- JavaScript: Client-side logic starting at line ~956
Want to add more features? Here are some ideas:
- Add more badges: Modify the badge generation in
generate_html() - New sorting options: Add cases to the
sortRepos()JS function - Custom filters: Extend the
filterRepos()JS function - Additional metadata: Fetch more data in the main script and embed it in JSON
OWASP-Bumper/
βββ π generate_repo_list.py # Main Python script (generates HTML)
βββ π index.html # Generated output (auto-generated)
βββ π .github/
β βββ π workflows/
β βββ π generate-repo-list.yml # GitHub Actions workflow
βββ π README.md # This file
βββ π SETUP.md # Detailed setup instructions
βββ π .gitignore # Git ignore patterns
generate_repo_list.py (1,453 lines)
- Fetches all repos from GitHub API with pagination
- Enriches data with sparklines, metadata, and PR counts
- Generates a complete, self-contained HTML file
- Uses only Python standard library
.github/workflows/generate-repo-list.yml
- Defines automated workflow triggers (daily/manual/push)
- Sets up Python environment
- Runs the generation script
- Commits and deploys to GitHub Pages
index.html (auto-generated)
- Complete single-page application
- Embedded JSON data array
- Vanilla JavaScript for interactivity
- Responsive CSS for all screen sizes
- π Monitor the health of all repositories at a glance
- π Identify inactive projects that need attention or archiving
- π Track commit activity trends across the organization
- π·οΈ Categorize and organize projects and chapters
- π’ Report on organization activity to stakeholders
- π Discover related projects within OWASP
- π Compare your project's stars, forks, and activity
- π Monitor open PRs and issues across projects
- π Track OWASP maturity levels
- π€ Find potential collaborators and similar projects
- π Find new projects to contribute to
- π₯ Identify active vs. inactive projects
- π Analyze project health before contributing
- π·οΈ Filter by technology stack (programming language)
- π Locate local chapters by region/country
We β€οΈ contributions! Here's how you can help:
- π΄ Fork the repository
- πΏ Create a feature branch (
git checkout -b feature/amazing-feature) - βοΈ Commit your changes (
git commit -m 'Add amazing feature') - π€ Push to the branch (
git push origin feature/amazing-feature) - π Open a Pull Request
- π¨ UI/UX improvements
- π New sorting or filtering options
- π Internationalization (i18n)
- π Additional chart types or visualizations
- π Better notification/reminder systems
- π Documentation improvements
- π Bug fixes and performance optimizations
- β¨ New features or integrations
Typical execution times for the OWASP organization (~400 repositories):
| Operation | Time | API Calls |
|---|---|---|
| Fetch repository list | ~5s | ~4 requests |
| Fetch sparklines | ~60s | ~400 requests |
| Fetch metadata | ~60s | ~800 requests |
| Generate HTML | ~1s | 0 requests |
| Total | ~2 minutes | ~1,204 requests |
With optimizations (sparklines & metadata disabled): ~6 seconds total
- β All user-generated content is escaped to prevent XSS attacks
- β
Uses GitHub's built-in
GITHUB_TOKEN(no secrets needed) - β No external dependencies = no supply chain vulnerabilities
- β Read-only API operations (no write permissions needed)
- β Static HTML output (no server-side execution)
This project is licensed under the MIT License - see the LICENSE file for details.
- π Built for the OWASP community
- π Powered by GitHub Actions
- π¨ Inspired by GitHub's own repository insights
- π Part of the OWASP BLT ecosystem
- π Bug Reports: Open an issue
- π¬ Questions: GitHub Discussions
- π§ Email: Contact the OWASP BLT team
- π Website: OWASP BLT Project
Made with β€οΈ by the OWASP BLT Team
β Star us on GitHub if you find this useful! β
π Homepage β’ π Docs β’ π Issues β’ π€ Contribute