AI-Powered Similar Issues Detection for Project Management

linear · Tech · 2023 · source Agentic: no · promotional bias: low · source-backed · extracted with prompt 0.5.4 (schema v2)

Generated from extraction.json — do not edit by hand. Every claim cites verbatim source evidence; stated means the quote directly asserts the claim, implied means it supports it indirectly.

Problem

Domain: Issue tracking and project-management backlog hygiene

Linear needed to reduce duplicate issues across large team workflows before duplicate work accumulated in backlogs, triage inboxes, and support integrations.

Constraints:

Architecture

Linear built Similar Issues around LLM-generated vector embeddings and pgvector-backed cosine similarity search. Issue text is concatenated and converted to embeddings through an API call, stored with workspace/team/status metadata in PostgreSQL on Google Cloud, partitioned by workspace ID across hundreds of partitions, and indexed per partition. The feature surfaces semantically similar issues during issue creation, in the Triage inbox, and directly inside support integrations such as Intercom so support and engineering teams can detect duplicates earlier.

Diagram confidence: reconstructed (reconstructed from prose).

flowchart LR
  issue-content-extractor["issue-content-extractor"] --> embedding-api["embedding-api"]
  backfill-task-runner["backfill-task-runner"] --> issue-content-extractor
  embedding-api --> pgvector-embedding-store["pgvector-embedding-store"]
  pgvector-embedding-store --> similarity-search-service["similarity-search-service"]
  similarity-search-service --> issue-creation-surface["issue-creation-surface"]
  similarity-search-service --> triage-inbox-surface["triage-inbox-surface"]
  similarity-search-service --> support-integration-surface["support-integration-surface"]
Drag to pan · scroll or use +/− to zoom · reconstructed from the source's described component topology

Components

Component Role Interacts with
issue-content-extractor Concatenates issue textual content for embedding generation. embedding-api, backfill-task-runner
embedding-api LLM-powered API call that converts issue text or support messages into semantic vectors. issue-content-extractor, pgvector-embedding-store
backfill-task-runner Existing internal framework that processes embedding backfill jobs in parallel on Kubernetes. issue-content-extractor, pgvector-embedding-store
pgvector-embedding-store PostgreSQL/pgvector store for embeddings and metadata, partitioned by workspace. embedding-api, similarity-search-service
similarity-search-service Runs cosine similarity queries and returns related issues with status/context. pgvector-embedding-store, issue-creation-surface, triage-inbox-surface, support-integration-surface
issue-creation-surface Shows possible duplicates while users create new issues. similarity-search-service
triage-inbox-surface Shows similar issues for external-source issues inside Linear Triage. similarity-search-service
support-integration-surface Shows similar issues next to incoming support emails such as Intercom messages. similarity-search-service

Data flow

For backfill, Linear iterates through all existing issues, concatenates textual content, calls an embedding API, and stores the resulting vector with workspace, team, and status metadata. At query time, a new issue or incoming support message is embedded and compared against the relevant workspace/team partitions with cosine similarity. Results are shown in the issue composer, Triage, or support integration, including related issue status so teams can mark duplicates or respond without switching tools.

4 supporting quotes
“writing a small “task” to iterate through issues, concatenating the content, and converting the resulting text to a vector through a single API request.”article, stated
“fill out the database with the vector embeddings and metadata such as status, workspace, and team identifiers.”article, stated
“partitioning the embeddings table by workspace ID across several hundred partitions and creating indexes on each partition separately.”article, stated
“the support team can clearly see if a related issue already exists and what its status is.”article, stated

Why this architecture

Linear used embeddings because duplicate issues often use different words for the same concept. It chose pgvector on PostgreSQL after vector-specific databases introduced downtime, cost, or operational complexity; PostgreSQL was already maintainable for a small team and still gave reasonable cosine-query response times. Partitioning by workspace made tens-of-millions-scale indexing workable while preserving the product's natural data boundary.

4 supporting quotes
“It seemed as though this would be a great application of large language models (LLMs), which would offer a level of accuracy that wouldn’t be possible by simply computing similarity based on properties or keywords alone.”article, stated
“We experimented with several vector-specific databases, but each came with drawbacks such as downtime to scale, high cost, or increased ops complexity.”article, stated
“Postgres is a known quantity that our small engineering team can maintain with confidence”article, stated
“Because we’re adding this feature to an existing product, we have tens of millions of issues from the get-go.”article, stated

Models used: LLM embeddings · PostgreSQL · pgvector · Google Cloud Platform · Kubernetes · cosine similarity

Scale

Alternatives considered (roads not taken)

property or keyword-based duplicate detection

Rejected because: It could not match semantically similar issue language such as bug, problem, and broken.

“wouldn’t be possible by simply computing similarity based on properties or keywords alone.”article, stated
““bug”, “problem”, “broken” are all different keywords but within the context of a Linear issue mean very similar things.”article, stated

vector-specific databases

Rejected because: They introduced downtime to scale, high cost, or additional operations complexity.

“each came with drawbacks such as downtime to scale, high cost, or increased ops complexity.”article, stated

store embeddings only after issue creation

Rejected because: Linear wanted to catch duplicates earlier, including directly beside incoming customer emails.

“it could still be too late in the process since the issue is already created.”article, stated
“So, we decided to push the detection even closer to the edge and ‌surface similar issues in support integrations as well, directly next to incoming customer emails.”article, stated

Patterns

rag-retrieval (knowledge-grounding)

Linear uses embeddings and vector similarity over existing issues to retrieve semantically related records.

“Embeddings encode the semantic meaning or concept of a piece of data as a matrix of floating point numbers”article, stated
“Using cosine similarity queries, issues that are conceptually similar would have a score closer to 1”article, stated

batch-offline-processing (operations)

Existing task runners backfilled embeddings for all historical issues in parallel on Kubernetes.

“existing internal framework for running data backfills using our task runners to process jobs in parallel on a kubernetes cluster”article, stated

retrieval-ranking (retrieval)

Linear indexes issue embeddings and retrieves nearest matches with cosine similarity for duplicate detection.

“initial naive testing saw cosine similarity queries regularly timing out or taking multiple seconds to complete.”article, stated
“we largely followed pgvector’s recommendations to maintain sufficient search accuracy.”article, stated

Tradeoffs

Use PostgreSQL with pgvector for vector storage.

Chose known maintainable database plus pgvector over specialized vector database providers.

Rationale: The small team preferred operational confidence and reasonable query times over new database operational risk.

“Postgres is a known quantity that our small engineering team can maintain with confidence”article, stated
“it still provides very reasonable response times for cosine similarity queries.”article, stated

Start with embeddings stored as blobs during proof of concept.

Chose primary datastore blob storage for quick iteration over choosing a long-term vector store before validating the idea.

Rationale: The team could evaluate feature behavior and storage options without upfront database migration work.

“This let the team iterate quickly on ideas while we evaluated other long-term options for storage.”article, stated
“It turned out to be a pretty good trade-off”article, stated

Gotchas (what bit them)

Naive vector search timed out at product scale.

Root cause: Tens of millions of issue embeddings and no suitable indexing made cosine similarity queries too slow.

Resolution: Partition embeddings by workspace ID across hundreds of partitions and index each partition separately.

“Without indexing, searching across this database was (unsurprisingly) very slow”article, stated
“initial naive testing saw cosine similarity queries regularly timing out or taking multiple seconds to complete.”article, stated

Embedding blobs can accidentally bloat ordinary queries.

Root cause: Vectors are much larger than typical database fields.

Resolution: Avoid selecting the vector/blob column unless the query needs it.

“it’s important to ensure the giant blob column is not being selected in queries unnecessarily”article, stated
“vectors can be quite large compared to most other data we store.”article, stated

Duplicate detection after issue creation was too late for support workflows.

Root cause: The issue already existed by the time Triage saw it.

Resolution: Move similarity detection to support integrations beside incoming customer emails.

“it could still be too late in the process since the issue is already created.”article, stated
“Without having to jump between different tools, they can respond accordingly.”article, stated

Evaluation

Linear evaluated the feature through production rollout to all workspaces, response-time/indexing iteration, customer-experience usage in Intercom, community feedback, and future search-quality improvements.

Metrics: all workspaces rollout · cosine queries timing out or multiple seconds before indexing · tens of millions of issues indexed · support issue consolidation feedback

“Surfacing similar issues has already helped our customer experience team consolidate support issues in Intercom”article, stated
“We’ve also received some early feedback from the community that the feature is helping folks better manage their backlogs”article, stated

Outcomes

The main scale facts are all-workspace rollout, tens of millions of issues, several hundred workspace partitions, and Kubernetes-parallel backfill.

3 supporting quotes
“Similar Issues was one of the first fully-fledged features to come out of our AI experimentation”article, stated
“Make the feature available in more integrations”article, stated
“Use this index as a signal for our main search functionality, which is currently powered by ElasticSearch.”article, stated