A Bash script that syncs your TASKS.md file with GitHub and Gitea/Codeberg issues automatically. Manage all your tasks in a simple Markdown checklist and let the script handle issue creation, updates, and closure across multiple platforms.
- 📝 Single Source of Truth - Manage all tasks in one
TASKS.mdfile - 🔄 Multi-Platform Sync - Works with GitHub (org & personal) and Gitea/Codeberg
- 🎯 Smart Operations - Creates, updates, and closes issues automatically
- 🔒 Secure - Credentials stored in
.envfile (never committed) - 🍎 macOS Compatible - Works with Bash 3.2+ (macOS default)
- 🎓 Teaching-Friendly - Extensively commented for learning
- 🚀 Zero Dependencies - Only requires bash, curl, and jq
- Bash 3.2 or higher
curl(usually pre-installed)jq(installation guide)
- Clone this repository:
git clone https://github.com/octokas/issue-tracker.git
cd issue-tracker- Copy the example files:
cp .env.example .env
cp TASKS.md.example TASKS.md- Configure your credentials in
.env:
# Edit .env with your tokens and repositories
nano .env- Make the script executable:
chmod +x issue-tracker.sh- Add tasks to
TASKS.mdusing this format:
- [ ] (P1) [feature] Add user login - @username - est: 2h - due: 2025-12-31- Run the sync script:
./issue-tracker.sh- Watch as issues are created/updated/closed across your platforms! 🎉
- [ ] (P#) [type] Title - @assignee - est: time - due: YYYY-MM-DD
Components:
[ ]= Open task,[x]= Completed task(P0-P3)= Priority (P0=critical, P1=high, P2=medium, P3=low)[type]=feature,bug, orchore@assignee= GitHub/Gitea usernameest:= Estimated time (e.g.,2h,1d,3d)due:= Due date (YYYY-MM-DD)
Example:
- [ ] (P0) [bug] Fix authentication timeout - @johndoe - est: 4h - due: 2025-12-28
- [x] (P1) [feature] Add dark mode - @janedoe - est: 1d - due: 2025-12-20The script supports three platforms simultaneously:
- GitHub Organization - For team/org repositories
- GitHub Personal - For your personal repositories
- Gitea/Codeberg - For self-hosted or Codeberg repos
Configure each in your .env file (see .env.example).
GitHub:
- Go to Settings → Developer settings → Personal access tokens → Tokens (classic)
- Click "Generate new token"
- Select scopes:
repo(full control) - Copy the token to your
.envfile
Gitea/Codeberg:
- Go to Settings → Applications → Generate New Token
- Give it a name and select scopes
- Copy the token to your
.envfile
The script includes platform-specific assignee mapping. Edit lines 179-181 and 305-307 to customize:
# Example: Map awestomates to octokas for GitHub platforms
if [[ "$name" == "githubpersonal" || "$name" == "githuborg" ]] && [[ "$assignee" == "awestomates" ]]; then
assignee="octokas"
fi- Parse - Reads
TASKS.mdand extracts open[ ]and completed[x]tasks - Fetch - Gets existing issues from each configured platform
- Sync - For each platform:
- Creates issues for new tasks
- Updates issues when task details change
- Closes issues when tasks are marked complete
- Skips issues that are already in sync
- Report - Shows a summary of all operations
This script is designed to be teaching-friendly with:
- Numbered sections and subsections
- Detailed inline comments
- Clear variable naming
- Examples of common Bash patterns
Perfect for learning:
- Bash scripting fundamentals
- API interactions with
curl - JSON processing with
jq - Regex pattern matching
- Parallel array data structures
- Error handling and defensive programming
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.
What this means:
- ✅ Free to use for any purpose
- ✅ Can modify and distribute
- ✅ Must keep modifications open source
- ❌ Cannot be sold as proprietary software
Built with love for developers who prefer simple, transparent tools over complex systems.
Made with 💞 and Bash | Star ⭐ this repo if you find it helpful!