Ultimate Guide: Build a Complete Issue Tracker with the GitHub API

Dilshad 👨‍💻 - Oct 28 - - Dev Community

This guide will help you create an automated, efficient issue tracker integrated with the GitHub API. You'll learn how to set up issue creation, assignments, notifications, and more—step by step!


1. Step 1: Get Your GitHub Personal Access Token (PAT)

To access private repositories or avoid rate limits, you need a Personal Access Token (PAT).

How to Generate a Token:

  1. Go to Settings > Developer Settings > Personal Access Tokens in your GitHub account.
  2. Click on Generate New Token.
  3. Select permissions like repo (for repository access).
  4. Save the token—you’ll need it for authorization in your code.

2. Step 2: Create a Basic Issue Tracker

This code lets you create an issue in any of your repositories via the GitHub API.

async function createIssue(owner, repo, title, body, token) {
  const url = `https://api.github.com/repos/${owner}/${repo}/issues`;
  const response = await fetch(url, {
    method: 'POST',
    headers: {
      Authorization: `token ${token}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ title, body }),
  });

  const issue = await response.json();
  console.log(`Issue Created: ${issue.html_url}`);
}

createIssue('YourGitHubUsername', 'my-repo', 'Bug Report', 'Details about the bug.', 'your_token');
Enter fullscreen mode Exit fullscreen mode

💡 How it works:

  • Replace "YourGitHubUsername" and "my-repo" with your username and repository name.
  • This function posts a new issue to the repository.
  • Check the console log for the issue link.

3. Step 3: Automate Issue Assignment

Ensure that every issue gets assigned to a team member automatically. This step can save time, ensuring accountability.

async function assignIssue(owner, repo, issueNumber, assignees, token) {
  const url = `https://api.github.com/repos/${owner}/${repo}/issues/${issueNumber}`;
  const response = await fetch(url, {
    method: 'PATCH',
    headers: {
      Authorization: `token ${token}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ assignees }),
  });

  const updatedIssue = await response.json();
  console.log(`Issue Assigned: ${updatedIssue.html_url}`);
}

assignIssue('YourGitHubUsername', 'my-repo', 42, ['assignee_username'], 'your_token');
Enter fullscreen mode Exit fullscreen mode

💡 What this does:

  • Use this function after creating an issue to assign it to a team member.
  • Replace 42 with the issue number you want to assign.

4. Step 4: Fetch Open Issues for Better Management

Tracking all open issues is essential for managing a project efficiently. Use this code to list all unresolved issues.

async function getOpenIssues(owner, repo, token) {
  const url = `https://api.github.com/repos/${owner}/${repo}/issues?state=open`;
  const response = await fetch(url, {
    headers: { Authorization: `token ${token}` },
  });

  const issues = await response.json();
  console.log(`Total Open Issues: ${issues.length}`);
  issues.forEach(issue => console.log(`#${issue.number}: ${issue.title}`));
}

getOpenIssues('YourGitHubUsername', 'my-repo', 'your_token');
Enter fullscreen mode Exit fullscreen mode

💡 How it helps:

  • Fetches all open issues in the repository.
  • You can display them in a dashboard or send notifications to developers.

5. Step 5: Monitor Stale Issues and Send Alerts

Create alerts for issues that remain unresolved for too long. Set a cron job to run this code periodically (e.g., every day) and send notifications through Slack or email.

async function checkStaleIssues(owner, repo, daysOld, token) {
  const url = `https://api.github.com/repos/${owner}/${repo}/issues?state=open`;
  const response = await fetch(url, {
    headers: { Authorization: `token ${token}` },
  });

  const issues = await response.json();
  const today = new Date();

  issues.forEach(issue => {
    const createdDate = new Date(issue.created_at);
    const ageInDays = (today - createdDate) / (1000 * 60 * 60 * 24);

    if (ageInDays > daysOld) {
      console.log(`Stale Issue: #${issue.number} - ${issue.title}`);
      // Send alert logic here (e.g., Slack or email notification)
    }
  });
}

checkStaleIssues('YourGitHubUsername', 'my-repo', 7, 'your_token');
Enter fullscreen mode Exit fullscreen mode

💡 What this does:

  • Identifies stale issues older than the specified number of days.
  • Use this function with Slack, Discord, or email alerts to notify team members.

6. Step 6: Automate Issue Labels Based on Keywords

Automatically label issues based on their content using simple keyword matching. This can help categorize issues instantly.

async function labelIssue(owner, repo, issueNumber, labels, token) {
  const url = `https://api.github.com/repos/${owner}/${repo}/issues/${issueNumber}/labels`;
  const response = await fetch(url, {
    method: 'POST',
    headers: {
      Authorization: `token ${token}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(labels),
  });

  const updatedIssue = await response.json();
  console.log(`Labels Added to Issue #${issueNumber}: ${labels.join(', ')}`);
}

labelIssue('YourGitHubUsername', 'my-repo', 42, ['bug', 'high-priority'], 'your_token');
Enter fullscreen mode Exit fullscreen mode

💡 Usage:

  • Automatically add labels like "bug" or "feature request" to relevant issues.
  • Combine this with text analysis to detect keywords (e.g., "error", "request") in the issue title or description.

7. Step 7: Build a Dashboard to Display Issues

Create a dashboard using JavaScript and the GitHub API to display all open issues on a web page. You can visualize issue statuses, assignments, and labels.

async function displayIssuesInDashboard(owner, repo, token) {
  const response = await fetch(`https://api.github.com/repos/${owner}/${repo}/issues`, {
    headers: { Authorization: `token ${token}` },
  });

  const issues = await response.json();
  const dashboard = document.getElementById('issue-dashboard');
  dashboard.innerHTML = '';

  issues.forEach(issue => {
    const issueItem = document.createElement('li');
    issueItem.textContent = `#${issue.number}: ${issue.title} (${issue.state})`;
    dashboard.appendChild(issueItem);
  });
}

displayIssuesInDashboard('YourGitHubUsername', 'my-repo', 'your_token');
Enter fullscreen mode Exit fullscreen mode

💡 How this works:

  • This code dynamically displays issues in a web-based dashboard.
  • Style it with CSS to make it visually appealing.

8. Step 8: Deploy Your Issue Tracker

Deployment Options:

  1. Vercel/Netlify: Perfect for deploying static dashboards.
  2. Heroku: Ideal for back-end services that need periodic alerts.
  3. GitHub Actions: Automate tasks directly in GitHub (e.g., create issues on commits).

9. Conclusion

By building an issue tracker with the GitHub API, you automate project management, improve productivity, and ensure accountability. Whether you’re managing small projects or large open-source repositories, these automation tools can save time and keep your team on track.

. . . . . . . . . . .