GitHub repository portfolio management and presentation toolkit with LLM-powered categorization and beautiful site generation
A comprehensive command-line tool for managing GitHub repository portfolios at scale. Perfect for academics, educators, and developers who need to organize, categorize, and showcase their GitHub repositories professionally.
- π Repository Management - List, filter, and extract comprehensive repository data
- π€ LLM-Powered Categorization - Intelligent repository classification using Claude AI
- π Description Generation - AI-powered repository description creation
- π·οΈ Automated Topic Tagging - Smart topic suggestions with custom tag preferences
- π Topic Badges - Generate shields.io badges from repository topics
- π©Ί Repository Health Checking - Comprehensive quality audits with best practices compliance
- π¨ Portfolio Site Generation - Beautiful, responsive HTML portfolios with 4 themes
- π Landing Page Generation - Convert README.md to stunning HTML or Jekyll pages
- π§ Invitation Management - Bulk accept/leave repository collaborations
- π’ Organization READMEs - Generate and push org profile READMEs directly to GitHub
- π― Academic Workflow - Perfect alternative to GitHub Classroom
- π₯οΈ Interactive TUI - Full-featured terminal UI for visual repository management
- β‘ Modern CLI - Built with typer and rich for beautiful terminal experience
gh-toolkit complements the official GitHub CLI (gh) rather than replacing it.
Use gh for |
Use gh-toolkit for |
|---|---|
| Pull requests & issues | Portfolio site generation |
| GitHub Actions workflows | Bulk repository operations |
| Releases & gists | AI-powered categorization |
| Codespaces & projects | Repository health auditing |
| Single-repo operations | Cross-org portfolio management |
| Raw API access | Academic/educator workflows |
They work great together:
# Daily work with gh
gh pr create --fill && gh run watch
# Portfolio presentation with gh-toolkit
gh-toolkit repo extract my-repos.txt --output data.json
gh-toolkit site generate data.json --theme resumeSee docs/gh-cli-comparison.md for a detailed feature comparison.
Working with local clones instead? gh-toolkit manages your repos on GitHub. For the checkouts on your disk, two focused tools pair well with it: gita for multi-repo status and batch
gitcommands across many clones, and git-reclaim β a tiny, zero-dependencygit reclaimsubcommand that frees disk space (purge regenerable caches,git gc) and flags clones that are safe to delete because the remote already has everything.
pip install gh-toolkitMost commands need a GitHub token. gh-toolkit resolves one from the first
available source, so if you already use the gh CLI
there's nothing to set up:
- The
--tokenflag (visible in shell history/process lists β prefer the others) - The
GITHUB_TOKENenvironment variable - A
tokenkey in the config file (see below) - The
ghCLI's stored token (gh auth token)
Put repeated defaults in gh-toolkit.toml (project-local, takes precedence) or
~/.config/gh-toolkit/config.toml:
token = "ghp_..." # optional β env var or gh CLI usually better# List repositories
gh-toolkit repo list username
# Extract repository data with LLM categorization
gh-toolkit repo extract repos.txt --anthropic-key=sk-...
# Generate beautiful portfolio site
gh-toolkit site generate repos_data.json --theme educational
# Convert README to landing page
gh-toolkit page generate README.md --output index.html
# Check repository health and best practices
gh-toolkit repo health username/repo --rules academic
# Add topic tags to repositories
gh-toolkit repo tag username/* --dry-run
# Manage invitations (perfect for educators)
gh-toolkit invite accept --dry-run# List repositories with filters
gh-toolkit repo list michael-borck --public --language Python
# Machine-readable output for piping (jq, spreadsheets, gradebooks)
gh-toolkit repo list michael-borck --json | jq '.[].name'
# Extract comprehensive data (concurrent; --resume continues an interrupted run)
gh-toolkit repo extract repos.txt \
--anthropic-key=sk-... \
--parallel 8 \
--output portfolio_data.json
gh-toolkit repo extract repos.txt --resume --output portfolio_data.json
# Generate repository descriptions with AI
gh-toolkit repo describe "user/*" --dry-run
gh-toolkit repo describe user/repo --model claude-sonnet-4-6
# Add intelligent topic tags
gh-toolkit repo tag user/repo --force --anthropic-key=sk-...
gh-toolkit repo tag "user/*" --tags "edtech: Educational, tool: CLI tools"
# Generate topic badges for READMEs
gh-toolkit repo badges user/repo
gh-toolkit repo badges "user/*" --apply # Auto-update READMEs
# Check repository health and compliance
gh-toolkit repo health user/repo --rules professional --min-score 80
gh-toolkit repo health "user/*" --json | jq '.[] | {repo: .repository, grade}'
# Custom rubric: re-weight checks, set grade thresholds, mark checks required
gh-toolkit repo health user/repo --rubric example_rubric.yaml
# Post the health report back as a GitHub issue (idempotent; confirms first)
gh-toolkit repo health "org/*" --post-issue
# Roster submission report (joins health to a class roster CSV)
gh-toolkit repo roster students.csv --org cs101 --repo-pattern "lab1-{github}"
# Clone repos; --before snapshots each at the last commit before a deadline
gh-toolkit repo clone student_repos.txt --target-dir ./submissions
gh-toolkit repo clone student_repos.txt --before "2026-06-12 23:59"# Generate portfolio with different themes
gh-toolkit site generate repos.json --theme educational
gh-toolkit site generate repos.json --theme resume
gh-toolkit site generate repos.json --theme research
gh-toolkit site generate repos.json --theme portfolio
# Custom title and metadata
gh-toolkit site generate repos.json \
--title "My Projects" \
--description "My awesome software" \
--metadata custom.yaml# Generate standalone HTML landing page
gh-toolkit page generate README.md
# Generate Jekyll-compatible markdown
gh-toolkit page generate README.md --jekyll --output index.md
# Custom title and description
gh-toolkit page generate README.md --jekyll \
--title "My Project" \
--description "Amazing software project"# Generate README for an organization
gh-toolkit org readme my-org --template detailed
# Push README directly to organization's GitHub profile
gh-toolkit org readme my-org --apply
# Generate with filtering
gh-toolkit org readme my-org --max-repos 20 --min-stars 5 --apply# Generate cross-organization portfolio
gh-toolkit portfolio generate --discover
gh-toolkit portfolio generate --org org1 --org org2 --html portfolio.html
# Audit repositories for missing metadata
gh-toolkit portfolio audit --discover
gh-toolkit portfolio audit --user --output audit-report.json
# Fix what the audit finds: generate missing descriptions/topics in place
gh-toolkit portfolio audit --org my-org --fix --dry-run # preview first
gh-toolkit portfolio audit --org my-org --fix --license mit# Accept all pending invitations
gh-toolkit invite accept --dry-run
# Leave repositories you're collaborating on
gh-toolkit invite leave --confirmgh-toolkit includes a full-featured terminal user interface for visual repository management.
# Install with TUI support
pip install gh-toolkit[tui]gh-toolkit tui- Browse Organizations - Navigate your GitHub organizations visually
- Search & Filter - Press
/to search repos by name or description - Multi-Select - Use
Spaceto select multiple repos,Ctrl+Ato select all - Bulk Actions - Press
ato open the action modal for selected repos - Context-Aware - Actions apply to selected items or all visible items
| Key | Action |
|---|---|
? |
Show help |
a |
Open actions menu |
/ |
Search/filter |
Space |
Toggle selection |
Ctrl+A |
Select all |
Ctrl+D |
Deselect all |
Enter |
View/drill down |
Esc |
Back/cancel |
s |
Cycle sort (in org view) |
g |
Generate README (in org view) |
The TUI provides form-based action selection:
- Generate Descriptions - AI-powered descriptions with model selection
- Add Topics - Intelligent tagging with preferred tag support
- Generate Badges - Create shields.io badges with style options
- Health Check - Audit repository quality
- Audit - Find missing metadata
All actions support dry-run mode for safe previewing.
Perfect for educators and academic portfolios
- Purple gradient design
- Emphasizes learning resources and tools
- Category order: Desktop β Web β Python β Learning Resources
Professional showcase for career portfolios
- Blue corporate design
- Highlights technical expertise
- Category order: Web β Desktop β Python β Infrastructure
Academic research and scientific computing
- Green academic design
- Focuses on publications and analysis
- Category order: Learning β Analysis β Python β Web
General project showcase
- Indigo modern design
- Balanced category presentation
- Category order: Web β Desktop β Python β Infrastructure
gh-toolkit integrates with Anthropic's Claude for intelligent repository analysis:
- Smart Categorization - Analyzes README, description, languages, and topics
- Confidence Scoring - Shows certainty of AI classifications
- Graceful Fallback - Uses rule-based classification when LLM unavailable
- Topic Generation - Suggests relevant GitHub topics based on content
export ANTHROPIC_API_KEY=sk-ant-...
gh-toolkit repo extract repos.txt # Uses LLM automaticallyPerfect alternative to GitHub Classroom:
# Students accept repository invitations
gh-toolkit invite accept
# Track submissions against a class roster (CSV with a github username column).
# Reports who set up their repo and its hygiene score β not a mark of the work.
gh-toolkit repo roster students.csv --org cs101 --repo-pattern "lab1-{github}"
gh-toolkit repo roster students.csv --org cs101 --output submissions.csv
# Snapshot every submission at the deadline (last commit before the due date),
# producing an owner/repo folder tree ready for content-assessment tools.
gh-toolkit repo clone student_repos.txt --before "2026-06-12 23:59" \
--target-dir ./submissions
# Extract all student repositories
gh-toolkit repo extract student_repos.txt --anthropic-key=sk-...
# Generate class portfolio site
gh-toolkit site generate student_data.json \
--theme educational \
--title "CS 101 Student Projects" \
--output class_portfolio.htmlThe roster CSV needs a GitHub username column (github, username, handle,
β¦); name, student_id, and an explicit repo column are optional and
auto-detected. Each student's repo is resolved from an explicit repo column,
the --repo-pattern (fields: {github}, {username}, {id}, {name}), or
org/<username>. See example_roster.csv. This is the GitHub-side companion to
content-assessment tools β it tracks whether the repo was submitted and set up
well, leaving marking of the work to a human (see docs/ROADMAP.md).
git clone https://github.com/michael-borck/gh-toolkit.git
cd gh-toolkit
uv sync --group dev# Run all tests
./scripts/test.sh
# Generate coverage report
./scripts/coverage.sh
# Run specific test suites
uv run pytest tests/unit/ -v
uv run pytest tests/integration/ -vsrc/gh_toolkit/
βββ cli.py # Main CLI entry point
βββ commands/ # Command implementations
β βββ repo.py # Repository management (list, extract, describe, badges, health)
β βββ org.py # Organization commands (readme)
β βββ portfolio.py # Portfolio commands (generate, audit)
β βββ site.py # Site generation
β βββ tag.py # Topic tagging
β βββ invite.py # Invitation management
βββ tui/ # Terminal UI (optional)
β βββ app.py # Main TUI application
β βββ screens/ # TUI screens (home, org, repo, help)
β βββ widgets/ # Reusable widgets (action modal, etc.)
βββ core/ # Core functionality
βββ github_client.py # GitHub API client
βββ repo_extractor.py # Data extraction
βββ site_generator.py # HTML generation
βββ readme_generator.py # Organization README generation
βββ topic_tagger.py # LLM tagging
export GITHUB_TOKEN=ghp_... # GitHub personal access token
export ANTHROPIC_API_KEY=sk-ant-... # Anthropic API key (optional)repo- Access repositoriesread:org- Read organization membershipwrite:org- Accept organization invitations
# 1. Extract repository data
gh-toolkit repo extract my_repos.txt \
--anthropic-key=$ANTHROPIC_API_KEY \
--output extracted_data.json
# 2. Add topic tags
gh-toolkit repo tag my_repos.txt \
--anthropic-key=$ANTHROPIC_API_KEY \
--force
# 3. Generate portfolio site
gh-toolkit site generate extracted_data.json \
--theme portfolio \
--title "My Software Portfolio" \
--output index.html
# 4. Deploy to GitHub Pages
# Upload index.html to your GitHub Pages repository- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit changes (
git commit -m 'Add amazing feature') - Push to branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Built with typer and rich
- LLM integration powered by Anthropic Claude
- Modern Python tooling with uv
β Star this repository if gh-toolkit helps you manage your GitHub portfolio!