When GitHub Issues needs structure: adding issue types

Wrote at June 21, 2026

GitHub Issues is a fine starting point. It lives next to your code, every developer already has access and filing an issue takes seconds. But at some point, the flat list stops working. Bugs mix with features. Labels multiply. You spend more time organizing issues than doing the work they describe.

That's not a GitHub problem. It's a structure problem. And it usually shows up the moment your project grows past a handful of contributors.

TL;DR: GitHub Issues works well until bugs, features and tasks blur together in one flat list. Custom issue types give each category its own identity and workflow. You don't need to abandon GitHub. You need structure it wasn't designed to provide.

What are issue types in project management?

Issue types in project management are categories that define the nature of a work item, such as Bug, Feature, Task or Improvement. Each type carries its own expectations about what information is needed, how the issue moves through a workflow and who typically handles it. Issue types let teams separate "something is broken" from "we want to build something new" at a structural level, not just with a label.

How do you know your GitHub Issues setup needs more structure?

These don't happen all at once. They creep in gradually, and by the time you notice, the mess is already there.

Your labels are doing too many jobs. You have bug, feature, enhancement, task, question, wontfix, priority-high, priority-low, frontend, backend and needs-discussion all in the same label list. Some describe what the issue is. Some describe its priority. Some describe where it lives in your codebase. Labels have no hierarchy or type enforcement, so they end up carrying every piece of metadata that GitHub Issues doesn't support natively.

Bugs and features live in the same undifferentiated list. A critical login bug sits next to a nice-to-have UI suggestion. Both are "open issues." The only way to tell them apart is by scanning labels, which someone may or may not have applied correctly.

You can't tell where an issue is in the process. GitHub gives you Open and Closed. That's it. Is this bug being investigated? Is that feature in code review? Is this task waiting on design? You either add more label hacks (in-progress, needs-review, blocked) or you accept that your issue list tells you what exists but not where anything stands.

New team members don't know what to file. Without defined issue types, people create issues in whatever format feels right. One person writes a one-line bug report. Another writes a detailed feature spec. A third files something that's half question, half feature request. Everyone formats differently because there's no structure guiding them.

Milestones and projects can't compensate. GitHub Projects and milestones add some grouping, but they don't change what an issue fundamentally is. You can organize issues into a board, but a bug and a feature on the same board still look identical unless you squint at the labels.

Why GitHub Issues doesn't support alternative issue types natively

GitHub Issues was built as a lightweight issue tracker for code repositories. Its design reflects that: every issue is the same. There are no built-in types, no custom fields and no workflow states beyond open and closed.

This is intentional. GitHub prioritizes simplicity and developer familiarity. Adding issue types, custom workflows and structured fields would make it a different product. GitHub chose to stay simple and let other tools fill the gap.

That means there's no GitHub-native path from "all issues look the same" to "bugs, features and tasks are distinct types with different workflows." You either keep hacking labels or you reach for a tool that treats issue types as a first-class concept.

What does a GitHub Issues alternative with issue types look like?

The shift is smaller than it sounds. You're not replacing your entire development workflow. You're adding a layer of structure to how work is categorized and tracked.

Here's what changes:

Each issue has a type. When you create an issue, you pick Bug, Feature or Task. This isn't a label you might forget to apply. It's a required field that defines what the issue is.

Types carry different expectations. A Bug needs reproduction steps, a severity level and an affected area. A Feature needs a description of the desired behavior. A Task needs a clear definition of done. The type shapes what information gets captured.

Types can follow different workflows. A Bug might flow through Reported, Triaged, In Progress, Fixed, Closed. A Feature might move through Proposed, Approved, In Development, In Review, Done. Same project, different processes for different kinds of work. Read more about designing workflows with custom statuses in project management.

Filtering and views become meaningful. Show me all open bugs sorted by severity. Show me all features in the Approved stage. Show me tasks assigned to me this week. These queries require structure that flat issues with labels can't reliably provide.

Before and after: a real project comparison

Consider a team building a web application. They have 45 open issues in GitHub. Here's what the label situation looks like:

Before (GitHub Issues with labels):

Issue title Labels
Login fails on Safari bug, priority-high, frontend, auth
Add dark mode feature, enhancement, frontend, design
Update API docs task, documentation, backend
Search returns wrong results bug, priority-medium, backend, search
Refactor user model task, tech-debt, backend
Add export to CSV feature, priority-low, backend, data
Fix typo on settings page bug, priority-low, frontend
SSO integration feature, priority-high, auth, backend

Every issue carries 3-4 labels to encode its type, priority, area and component. The label list has 18 entries. Some issues are missing labels. The priority-high label is applied inconsistently. There's no way to view just bugs sorted by severity.

After (with custom issue types and structured fields):

Issue title Type Status Priority Area
Login fails on Safari Bug Triaged High Auth
Add dark mode Feature Proposed Medium Frontend
Update API docs Task To Do Low Docs
Search returns wrong results Bug In Progress Medium Search
Refactor user model Task Scheduled Medium Backend
Add export to CSV Feature Backlog Low Data
Fix typo on settings page Bug Reported Low Frontend
SSO integration Feature In Development High Auth

Same issues. But now type, status and priority are separate dimensions. You can filter bugs by severity. You can see which features are in development vs proposed. Each piece of metadata has its own field instead of competing for space in a shared label list.

For a deeper look at when to use labels vs fields, see the guide on labels vs custom fields vs custom statuses.

How to add issue types as a GitHub Issues alternative in Eigenfocus

Setting up issue types takes about two minutes. Here's the practical setup.

Step 1: Define your types. Start with three: Bug, Feature and Task. You can add more later (Improvement, Documentation, Spike) but three covers most development work.

Step 2: Create custom statuses per type. Bugs get: Reported, Triaged, In Progress, Fixed, Closed. Features get: Proposed, Approved, In Development, In Review, Done. Tasks get: To Do, In Progress, Done. Each type follows a workflow that makes sense for that kind of work. For a complete bug workflow setup, see the guide on building a bug triage workflow.

Step 3: Add custom fields for the data labels were carrying. Priority (single-select: Low, Medium, High, Critical), Area (single-select: Frontend, Backend, Auth, Data) and Effort (single-select: S, M, L, XL). These replace the priority and component labels you were hacking into GitHub.

Step 4: Set up a board view. Group by status. Your board now shows where every issue stands in its workflow. Bugs flow through triage. Features flow through development. The board reads left to right as a process.

That's it. No admin configuration. No workflow scheme editor. No permission changes needed.

See how Eigenfocus works for software development teams.

Do you need to leave GitHub entirely?

No. Adding issue types doesn't mean abandoning GitHub. Your code, pull requests and CI/CD stay exactly where they are. The question is whether GitHub Issues is the right place to manage work that has outgrown flat lists.

Many teams keep GitHub for code-related issues (build failures, dependency updates, CI bugs) and move project-level work to a tool with proper structure. Others migrate everything. The right answer depends on how much of your work needs types, statuses and fields vs how much is genuinely "file a quick issue against this repo."

Eigenfocus is source-available and runs on SQLite. You can self-host it alongside your existing infrastructure or use the cloud version. Either way, your data stays under your control.

Common questions about GitHub Issues alternative issue types

Can I migrate my existing GitHub Issues to a tool with issue types?

Yes. Export your GitHub issues, map your labels to issue types (anything labeled bug becomes a Bug type, feature becomes a Feature type) and import them. The label-to-type mapping usually reveals how many labels were acting as surrogate issue types all along.

How many issue types should a dev team start with?

Three. Bug, Feature and Task cover the vast majority of development work. Some teams add a fourth (Improvement or Spike) after a few weeks. Resist the urge to create ten types upfront. Each type should represent a genuinely different workflow or set of required information.

Are custom issue types the same as GitHub's label categories?

No. Labels are tags you optionally apply. Issue types are a structural category that every issue must have. A label like bug is easy to forget or misapply. An issue type is required at creation time and determines which fields and workflow stages apply. They solve the same surface-level problem (telling bugs from features) but types enforce it structurally.

What if my team is too used to GitHub Issues to switch?

The learning curve is small because the concepts transfer directly. Issues are still issues. The difference is that each one now has a type, a set of statuses and structured fields instead of a pile of labels. Most developers adapt within a day because the structure matches what they were already trying to do with labels.

Can I still use labels alongside issue types?

Yes. Labels remain useful for cross-cutting concerns that don't fit into types, statuses or fields. Tags like needs-discussion, tech-debt or sprint-12 work well as labels even when you have issue types. The key is that labels stop carrying the weight of encoding type, priority and status.

Move from label hacks to real issue types

Define three types, set up your statuses and let the structure do the organizing for you.

See pricing

You can also read about how teams use Eigenfocus for software development, learn when to add workflow stages to your issue tracker or see the anti-Jira dev project setup.