Find truly available GitHub issues by filtering out those with linked PRs
Project description
๐ Gitish
Find truly available open source issues - Stop wasting time on issues someone is already working on
๐ฏ The Problem
You find an interesting GitHub issue, spend time understanding it, start working on it... only to discover someone already submitted a PR. Time wasted.
โจ The Solution
This tool checks for linked pull requests and shows you only issues that are truly available to work on.
What Makes This Unique?
- โ Filters by Linked PRs - No other tool does this
- โ Beautiful Architecture - Clean, organized, maintainable
- โ Multi-Repository - Works with any GitHub repository
- โ Zero Dependencies - Uses only Python stdlib
- โ Smart Caching - Respects GitHub rate limits
- โ Professional CLI - Well-structured commands
๐ Quick Start
Installation
From PyPI (Recommended)
pip install gitish
From Source
# Clone the repository
git clone https://github.com/rifat-simoom/gitish.git
cd gitish
# Install
pip install -e .
Development Installation
# Clone and install with dev dependencies
git clone https://github.com/rifat-simoom/gitish.git
cd gitish
pip install -e ".[dev]"
Requirements
Python 3.8+ - That's it! No other dependencies.
๐ Usage
List Repositories
gitish list
# Output:
# ๐ Configured Repositories:
# โ symfony symfony/symfony
# laravel laravel/framework
# react facebook/react
# ...17 repos total
Find Available Issues
# Find available issues in Symfony
gitish available symfony
# Find bugs in Laravel
gitish available laravel --label=bug
# Find good first issues in React
gitish available react --label="good first issue"
# Use any repository (owner/repo format)
gitish available microsoft/TypeScript --label=bug
View Issue Details
# See full issue with comments and linked PRs
gitish show 12345 symfony
๐จ Example Output
๐ Fetching issues from symfony/symfony...
Filtering by label: DX
โจ Found 2 available issues
#62497 [Scheduler] [DX] Schedule's with() method is prone to w...
Labels: DX, Scheduler
Comments: 1 Updated: 2026-04-23
#40794 [DX] Static vs. runtime env vars
Labels: DX, Help wanted, Keep open
Comments: 47 Updated: 2025-05-09
๐ก Tips:
โข View details: gitish show <number> symfony
โข Filter: --label="bug" or --label="good first issue"
โข More results: --limit=50
๐๏ธ Project Structure
gitish/
โโโ gitish/ # Main package
โ โโโ __init__.py # Package initialization
โ โโโ config.py # Configuration and settings
โ โโโ cli.py # CLI entry point
โ โโโ commands/ # Command implementations
โ โ โโโ __init__.py
โ โ โโโ list_repos.py # List repositories
โ โ โโโ available_issues.py # Find available issues
โ โ โโโ show_issue.py # Show issue details
โ โโโ services/ # Business logic
โ โ โโโ __init__.py
โ โ โโโ github_api.py # GitHub API client
โ โโโ utils/ # Utilities
โ โโโ __init__.py
โ โโโ repository.py # Repository resolution
โ โโโ formatters.py # Output formatting
โโโ tests/ # Test suite
โ โโโ __init__.py
โ โโโ conftest.py # Pytest fixtures
โ โโโ test_github_api.py # API tests
โ โโโ test_repository.py # Repository tests
โ โโโ test_formatters.py # Formatter tests
โ โโโ test_cli.py # CLI tests
โโโ .github/
โ โโโ workflows/ # GitHub Actions
โ โโโ ci.yml # CI pipeline
โ โโโ publish.yml # PyPI publishing
โ โโโ release.yml # Release automation
โโโ pyproject.toml # Modern Python packaging
โโโ setup.py # Setup script
โโโ Makefile # Development commands
โโโ README.md # This file
โโโ LICENSE # MIT License
โโโ CONTRIBUTING.md # Contribution guidelines
Architecture Highlights
- Clean Separation - Commands, services, and utilities are separate
- Service Layer - GitHub API interactions isolated in service
- Command Pattern - Each command is a separate class
- Utilities - Reusable formatters and helpers
- No Dependencies - Uses only Python standard library
โ๏ธ Configuration
Built-in Repositories
Pre-configured with 17 popular projects:
PHP: Symfony, Laravel, PHPUnit, Doctrine, Guzzle
JavaScript: React, Vue, Angular, Node.js, TypeScript
Python: Django, Flask, pytest
Other: Rust, Go, Rails, .NET
Add Custom Repositories
Edit gitish/config.py:
REPOSITORIES = {
'myproject': 'username/repository',
# ... existing repos
}
Or use owner/repo format directly:
gitish available username/repository
GitHub Token (Recommended)
Increase rate limit from 60 to 5,000 requests/hour:
# Get token at: https://github.com/settings/tokens
export GITHUB_TOKEN="your_github_token_here"
# Add to ~/.bashrc or ~/.zshrc to persist
echo 'export GITHUB_TOKEN="your_github_token_here"' >> ~/.bashrc
Note: Token only needs read access (no scopes required)
๐ How It Works
- Fetches Issues - Uses GitHub API to get open issues
- Checks Timeline - Examines timeline for cross-referenced PRs
- Filters Results - Shows only issues without linked PRs
- Caches Data - Stores in
~/.gitish/cache/for 5 minutes
Why This Matters
- Saves Time - No manual checking of each issue
- Avoids Conflicts - Don't work on issues with existing PRs
- Better Success - Focus on truly available issues
- Clear Visibility - See PR status at a glance
๐ค Contributing
Contributions welcome! This project has a clean architecture that's easy to extend.
Development Setup
# Clone the repository
git clone https://github.com/rifat-simoom/gitish.git
cd gitish
# Install in development mode with dev dependencies
pip install -e ".[dev]"
# Or use make
make install-dev
Running Tests
# Run all tests with coverage
make test
# Or use pytest directly
pytest --cov=gitish --cov-report=term-missing
Code Quality
# Format code
make format
# Run linters
make lint
# Or run individually
black gitish tests
isort gitish tests
flake8 gitish tests
mypy gitish
Pre-commit Hooks (Optional)
# Install pre-commit
pip install pre-commit
# Set up git hooks
pre-commit install
# Run manually
pre-commit run --all-files
Development Commands
make help # Show all available commands
make install # Install package
make install-dev # Install with dev dependencies
make test # Run tests with coverage
make lint # Run linters
make format # Format code
make clean # Remove build artifacts
make build # Build distribution packages
Code Style
- Follow PEP 8
- Use type hints where possible
- Add docstrings to all functions
- Keep functions small and focused
- Write tests for new features
- Format with Black (line length 100)
- Sort imports with isort
See CONTRIBUTING.md for detailed guidelines.
๐ Roadmap
Current (v1.0)
- โ Multi-repository support
- โ Linked PR detection
- โ Beautiful CLI interface
- โ Smart caching
- โ GitHub token support
- โ Clean architecture
Planned (v2.0)
- Config file support (
~/.gitish.conf) - Colorized output with rich/colorama
- Progress indicators
- Watch for new issues
- Export to JSON/CSV
- Shell completion (bash/zsh)
Future Ideas
- Web dashboard
- Browser extension
- IDE plugins
- Team collaboration features
- Contribution analytics
๐ฏ Use Cases
For Contributors
- Quickly find available issues across multiple projects
- Avoid wasted effort on taken issues
- Discover good first issues
- Track multiple repositories easily
For Maintainers
- Help contributors find available work
- Reduce duplicate PRs
- Improve contributor experience
- Share with your community
For Teams
- Coordinate open source contributions
- Find issues matching team expertise
- Track contribution opportunities
- Encourage OSS participation
๐ Comparison
| Feature | This Tool | GitHub CLI | GitKraken | Others |
|---|---|---|---|---|
| Filters by linked PRs | โ | โ | โ | โ |
| Clean architecture | โ | โ | โ | Varies |
| No dependencies | โ | โ | โ | โ |
| Multi-repo | โ | โ | โ | โ |
| Open source | โ | โ | โ | Varies |
๐ Troubleshooting
Rate Limit Errors
Problem: 403 rate limit exceeded
Solution: Add GitHub token (see Configuration section)
No Issues Found
Possible reasons:
- All issues have linked PRs (try different label)
- Repository has no open issues
- Network/API issues
Solution: Try different filters or repositories
Import Errors
Problem: ModuleNotFoundError
Solution:
# Install the package
pip install -e .
# Or run from project root
python -m gitish.cli list
๐ License
MIT License - see LICENSE for details.
๐ Acknowledgments
- Built with Python standard library
- Powered by GitHub API
- Inspired by the need to contribute more effectively to open source
๐ Support
- ๐ Report Issues
- ๐ฌ Discussions
- โญ Star the repo if this helps you!
๐ Why This Project?
The Story
While trying to contribute to Symfony, I kept finding "good first issues" that already had PRs in progress. After wasting hours on this, I built a tool to solve it. Now you can find truly available issues in seconds.
The Impact
- Saves Hours - No more manual checking
- Helps Thousands - Any contributor can use this
- Unique Solution - No other tool filters by linked PRs
- Beautiful Code - Clean architecture, easy to maintain
Made with โค๏ธ for the open source community
Stop wasting time on taken issues. Find truly available work in seconds.
Beautiful architecture. Zero dependencies. Just works. ๐
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file gitish-1.0.0.tar.gz.
File metadata
- Download URL: gitish-1.0.0.tar.gz
- Upload date:
- Size: 27.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.20
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e2876da678728f7c17c918e7e9af93c68519ee5149079228d4a91e6fa1e7befd
|
|
| MD5 |
9bc69ec5410f61f01ea7d6fdf0ae2d0a
|
|
| BLAKE2b-256 |
6c84eac54b67f83b3cdfe68bd3d2a47d0c206c9f3ace6f3aa58a98fda478b68c
|
File details
Details for the file gitish-1.0.0-py3-none-any.whl.
File metadata
- Download URL: gitish-1.0.0-py3-none-any.whl
- Upload date:
- Size: 18.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.20
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
05da535f4ec89d776abed0af2e00575e4771d63f198af12ca5ae417ba8fd2c00
|
|
| MD5 |
dda8b59e7a69c5960ec7c72a9c3753e8
|
|
| BLAKE2b-256 |
e44c9db067fb40673b7431602a337ffd6530953c5116657e515bfe0d018142cb
|