Top 10 Developer Tooling and Productivity SaaS Ideas to Launch in 2026 to Double User Engagement and Session Duration
1. AI-Powered Code Review & Refactoring Assistant
This SaaS leverages advanced LLMs to go beyond basic linting. It analyzes pull requests not just for syntax errors but for potential performance bottlenecks, security vulnerabilities, and adherence to architectural patterns. The key is to provide actionable, context-aware refactoring suggestions directly within the developer’s workflow.
Consider a Python-based backend using Flask. The assistant would integrate with GitHub webhooks. Upon a `pull_request` event, a webhook triggers a Lambda function. This function fetches the diff, passes it to a fine-tuned LLM (e.g., a GPT-4 variant or a custom model trained on secure coding practices), and then posts comments back to the PR.
Integration Workflow Example (GitHub Actions)
A GitHub Actions workflow can orchestrate this. A workflow file like `.github/workflows/ai-review.yml` would look like this:
name: AI Code Review
on:
pull_request:
types: [opened, synchronize]
jobs:
review:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
with:
fetch-depth: 0 # Fetch all history for diff analysis
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install dependencies
run: pip install -r requirements.txt # Assuming review tool dependencies are here
- name: Run AI Reviewer
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} # Or your LLM provider's key
PR_NUMBER: ${{ github.event.pull_request.number }}
REPO_OWNER: ${{ github.repository_owner }}
REPO_NAME: ${{ github.event.repository.name }}
run: |
python scripts/ai_reviewer.py \
--pr-number $PR_NUMBER \
--repo-owner $REPO_OWNER \
--repo-name $REPO_NAME \
--base-branch ${{ github.event.pull_request.base.ref }} \
--head-branch ${{ github.event.pull_request.head.ref }}
Core Python Script Snippet (`scripts/ai_reviewer.py`)
import os
import requests
import subprocess
import json
from github import Github # PyGithub library
def get_diff(repo_owner, repo_name, base_branch, head_branch):
# Use git command to get the diff between branches
# This is a simplified example; a real implementation might fetch PR details via GitHub API
try:
diff_process = subprocess.run(
["git", "diff", f"origin/{base_branch}", f"origin/{head_branch}"],
capture_output=True,
text=True,
check=True
)
return diff_process.stdout
except subprocess.CalledProcessError as e:
print(f"Error getting diff: {e}")
return None
def analyze_code_with_llm(code_diff):
# Placeholder for LLM API call
# In a real scenario, you'd use an SDK like openai or a custom API client
api_key = os.environ.get("OPENAI_API_KEY")
if not api_key:
raise ValueError("OPENAI_API_KEY not set")
prompt = f"""
Analyze the following code diff for potential issues:
- Security vulnerabilities (e.g., SQL injection, XSS)
- Performance bottlenecks (e.g., inefficient loops, N+1 queries)
- Code smells and anti-patterns
- Adherence to best practices for Python/Flask.
Provide specific, actionable suggestions for improvement. Format your response as a JSON object with 'suggestions' as a list of dictionaries, each containing 'line_number', 'message', and 'severity' (e.g., 'error', 'warning', 'info').
Code Diff:
```diff
{code_diff}
```
"""
# Example using OpenAI API (replace with your actual LLM endpoint and client)
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
payload = {
"model": "gpt-4", # Or your fine-tuned model
"messages": [{"role": "user", "content": prompt}],
"temperature": 0.2,
"max_tokens": 1000
}
# response = requests.post("https://api.openai.com/v1/chat/completions", json=payload, headers=headers)
# response.raise_for_status()
# llm_output = response.json()
# return json.loads(llm_output['choices'][0]['message']['content'])
# Mock response for demonstration
return {
"suggestions": [
{"line_number": 42, "message": "Consider using parameterized queries to prevent SQL injection.", "severity": "error"},
{"line_number": 78, "message": "This loop might be inefficient for large datasets. Consider optimizing data retrieval.", "severity": "warning"}
]
}
def post_to_github_pr(repo_owner, repo_name, pr_number, suggestions):
g = Github(os.environ.get("GITHUB_TOKEN"))
repo = g.get_user(repo_owner).get_repo(repo_name)
pr = repo.get_pull(pr_number)
for suggestion in suggestions:
comment_body = f"AI Reviewer: [{suggestion['severity'].upper()}] {suggestion['message']}"
# For line-specific comments, you'd need to map suggestion['line_number'] to a specific file and line in the diff.
# This is complex and often requires parsing the diff output.
# For simplicity, we'll post a general comment or a file-specific comment if possible.
# A more advanced implementation would use the 'path' and 'position' parameters for inline comments.
pr.create_issue_comment(comment_body)
print(f"Posted comment: {comment_body}")
if __name__ == "__main__":
repo_owner = os.environ.get("REPO_OWNER")
repo_name = os.environ.get("REPO_NAME")
pr_number = int(os.environ.get("PR_NUMBER"))
base_branch = os.environ.get("BASE_BRANCH")
head_branch = os.environ.get("HEAD_BRANCH")
code_diff = get_diff(repo_owner, repo_name, base_branch, head_branch)
if code_diff:
try:
analysis_results = analyze_code_with_llm(code_diff)
if analysis_results and "suggestions" in analysis_results:
post_to_github_pr(repo_owner, repo_name, pr_number, analysis_results["suggestions"])
else:
print("No suggestions from LLM or unexpected format.")
except Exception as e:
print(f"Error during LLM analysis or posting: {e}")
else:
print("Could not retrieve code diff.")
2. Real-time E-commerce Performance Monitoring & Optimization Dashboard
This SaaS provides deep, real-time insights into e-commerce site performance, focusing on metrics that directly impact conversion rates and user experience. It goes beyond basic APM by correlating frontend metrics (LCP, FID, CLS) with backend performance (database query times, API response latency, cache hit rates) and business metrics (add-to-cart rate, checkout abandonment).
The architecture involves a distributed tracing system (like OpenTelemetry) integrated with frontend RUM (Real User Monitoring) agents and backend application instrumentation. Data is streamed to a time-series database (e.g., Prometheus, InfluxDB) and visualized on a Grafana dashboard.
Data Ingestion Pipeline
Frontend (JavaScript RUM): A small JS snippet injected into the e-commerce site captures performance timings and user interactions. It sends data via `navigator.sendBeacon` or `fetch` to a collection endpoint.
// Example: ecommerce-rum.js snippet
(function() {
const collect = (data) => {
navigator.sendBeacon('/api/rum-collector', JSON.stringify(data));
};
// Capture Core Web Vitals
new PerformanceObserver((entryList) => {
for (const entry of entryList.getEntries()) {
if (entry.entryType === 'largest-contentful-paint') {
collect({ type: 'lcp', value: entry.renderTime || entry.loadTime, element: entry.element?.tagName });
} else if (entry.entryType === 'first-input') {
collect({ type: 'fid', value: entry.processingStart - entry.startTime });
} else if (entry.entryType === 'layout-shift') {
collect({ type: 'cls', value: entry.value, had_recent_input: entry.hadRecentInput });
}
}
}).observe({ type: 'largest-contentful-paint', includeAllActivities: true });
new PerformanceObserver((entryList) => {
for (const entry of entryList.getEntries()) {
if (entry.entryType === 'first-input') {
collect({ type: 'fid', value: entry.processingStart - entry.startTime });
}
}
}).observe({ type: 'first-input', buffered: true });
new PerformanceObserver((entryList) => {
for (const entry of entryList.getEntries()) {
if (entry.entryType === 'layout-shift') {
collect({ type: 'cls', value: entry.value, had_recent_input: entry.hadRecentInput });
}
}
}).observe({ type: 'layout-shift', buffered: true });
// Capture business events (e.g., add to cart)
document.body.addEventListener('click', (event) => {
if (event.target.closest('[data-action="add-to-cart"]')) {
collect({ type: 'business_event', name: 'add_to_cart', timestamp: Date.now() });
}
});
})();
Backend (OpenTelemetry): Instrument your backend application (e.g., PHP/Laravel, Python/Django) to export traces.
// Example: PHP/Laravel with OpenTelemetry SDK
// composer require open-telemetry/sdk open-telemetry/exporter-otlp
// composer require open-telemetry/auto-instrumentation-laravel
// In bootstrap/app.php or a service provider:
use OpenTelemetry\API\Trace\TracerProvider;
use OpenTelemetry\SDK\Trace\Sampler\AlwaysOnSampler;
use OpenTelemetry\SDK\Trace\SpanProcessor\BatchSpanProcessor;
use OpenTelemetry\SDK\Trace\TracerProvider as SDKTracerProvider;
use OpenTelemetry\Exporter\Otlp\OtlpExporter;
use OpenTelemetry\SDK\Resource\ResourceBuilder;
use OpenTelemetry\Context\Context;
// Configure the exporter (e.g., to send to Jaeger or Prometheus via OTLP)
$exporter = new OtlpExporter('http://otel-collector:4317'); // OTLP/gRPC endpoint
// Create a tracer provider
$resource = ResourceBuilder::getDefault()
->addService('ecommerce-backend')
->build();
$tracerProvider = new SDKTracerProvider(
new BatchSpanProcessor($exporter),
new AlwaysOnSampler(),
$resource
);
// Set the global tracer provider
OpenTelemetry\API\GlobalTracerProvider::set($tracerProvider);
// The auto-instrumentation package will handle most of the tracing automatically.
// For custom spans:
$tracer = OpenTelemetry\API\GlobalTracerProvider::getTracerProvider()->getTracer('my-ecommerce-app');
// Example of manual span creation
$span = $tracer->spanBuilder('database_query.get_products')
->setSpanKind(\OpenTelemetry\API\Trace\SpanKind::KIND_INTERNAL)
->start();
try {
// Simulate database query
sleep(rand(50, 200) / 1000); // Simulate latency
$span->setAttribute('db.system', 'mysql');
$span->setAttribute('db.statement', 'SELECT * FROM products WHERE category_id = ?');
// ... execute query ...
} catch (\Throwable $e) {
$span->recordException($e);
$span->setStatus(\OpenTelemetry\API\Trace\StatusCode::STATUS_ERROR, $e->getMessage());
throw $e;
} finally {
$span->end();
}
// Ensure spans are flushed on shutdown
register_shutdown_function(function () use ($tracerProvider) {
$tracerProvider->shutdown();
});
Collector & Backend: An OpenTelemetry Collector receives data, processes it (e.g., batching, filtering), and exports it to Prometheus for metrics and Jaeger/Tempo for traces. Grafana queries these backends for visualization.
# Example: otel-collector-config.yaml
receivers:
otlp:
protocols:
grpc:
http:
processors:
batch:
memory_limiter:
check_interval: 1s
limit_percentage: 10
spike_limit_percentage: 5
exporters:
prometheus:
endpoint: "0.0.0.0:8889" # Expose Prometheus metrics
logging:
loglevel: debug
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch, memory_limiter]
exporters: [logging] # Send traces to logging for debugging, or to Tempo/Jaeger
metrics:
receivers: [otlp]
processors: [batch, memory_limiter]
exporters: [prometheus] # Send metrics to Prometheus
3. Intelligent A/B Testing & Personalization Platform
This SaaS moves beyond simple A/B testing by incorporating machine learning to dynamically allocate traffic to winning variations, personalize experiences based on user segments, and predict conversion uplift. It integrates with e-commerce platforms (Shopify, Magento) and CDNs.
The core is a multi-armed bandit algorithm for traffic allocation and a recommendation engine for personalization. Data is stored in a scalable database (e.g., PostgreSQL with TimescaleDB extension for time-series data) and served via a low-latency API.
Dynamic Traffic Allocation (Python Example)
import random
import math
from collections import defaultdict
class UCB1Bandit:
def __init__(self, actions, exploration_param=2):
self.actions = actions # List of variation IDs
self.exploration_param = exploration_param
self.counts = defaultdict(int) # Count of times each action was chosen
self.values = defaultdict(float) # Sum of rewards for each action
def select_action(self):
n_total = sum(self.counts.values())
if n_total == 0:
# If no actions taken yet, pick one randomly
return random.choice(self.actions)
ucb_values = {}
for action in self.actions:
if self.counts[action] == 0:
# Prioritize unplayed actions
return action
mean_reward = self.values[action] / self.counts[action]
exploration_term = self.exploration_param * math.sqrt(math.log(n_total) / self.counts[action])
ucb_values[action] = mean_reward + exploration_term
# Select action with the highest UCB value
return max(ucb_values, key=ucb_values.get)
def update(self, action, reward):
self.counts[action] += 1
self.values[action] += reward
# Example Usage:
# Assume 'variation_A', 'variation_B', 'variation_C' are possible variations
# Assume 'reward' is 1 if conversion, 0 otherwise.
# bandit = UCB1Bandit(['variation_A', 'variation_B', 'variation_C'])
#
# # Simulate user interaction
# chosen_variation = bandit.select_action()
# print(f"Showing variation: {chosen_variation}")
#
# # Simulate conversion outcome
# conversion_occurred = random.choice([True, False])
# reward = 1 if conversion_occurred else 0
# bandit.update(chosen_variation, reward)
# print(f"Updated bandit with reward: {reward}")
4. Automated API Contract Testing & Mocking Service
This SaaS simplifies API development and integration by providing a centralized platform for defining, testing, and mocking API contracts (e.g., OpenAPI/Swagger specs). It automatically generates tests based on the contract and provides on-demand mock servers.
Key features include: contract validation against generated tests, real-time mock server deployment, and integration with CI/CD pipelines. The backend could use Node.js with Express for the mock server API and a Python/Go service for contract analysis and test generation.
Contract Validation & Mock Server Deployment
# Example: Using a CLI tool to validate an OpenAPI spec and start a mock server # Assume 'api-contract-cli' is the command-line tool for the SaaS # 1. Validate the OpenAPI specification api-contract-cli validate --spec ./openapi.yaml # 2. Deploy a mock server for a specific version of the API # This command would provision a containerized mock server instance api-contract-cli mock deploy --spec ./openapi.yaml --version v1.2.0 --port 8080 # The mock server will now respond to requests based on openapi.yaml at http://localhost:8080 # Example request to the mock server: curl http://localhost:8080/users/123
// Example: Node.js mock server implementation (simplified)
const express = require('express');
const swaggerUi = require('swagger-ui-express');
const YAML = require('yamljs');
const jsf = require('json-schema-faker'); // For generating mock data
const app = express();
const port = 8080;
// Load OpenAPI spec
const spec = YAML.load('./openapi.yaml');
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(spec));
// Generate mock responses based on schema
const generateMockResponse = (schema) => {
try {
return jsf.generate(schema);
} catch (error) {
console.error("Error generating mock data:", error);
return { error: "Failed to generate mock data" };
}
};
// Dynamically create routes based on OpenAPI spec
for (const path in spec.paths) {
for (const method in spec.paths[path]) {
const operation = spec.paths[path][method];
const responses = operation.responses;
// Handle GET requests for simplicity
if (method.toLowerCase() === 'get' && responses['200'] && responses['200'].content && responses['200'].content['application/json']) {
const schema = responses['200'].content['application/json'].schema;
app.get(path, (req, res) => {
console.log(`Mock GET ${path}`);
res.json(generateMockResponse(schema));
});
}
// Add more handlers for POST, PUT, DELETE, and different status codes
}
}
app.listen(port, () => {
console.log(`Mock API server listening at http://localhost:${port}`);
console.log(`API Docs available at http://localhost:${port}/api-docs`);
});
5. Git Repository Intelligence & Security Scanner
This SaaS analyzes Git repositories for security vulnerabilities, compliance issues, and code quality trends. It scans for hardcoded secrets, detects suspicious commit patterns, and enforces branch protection rules. It integrates with GitHub, GitLab, and Bitbucket.
The core technology involves static analysis tools (e.g., `gitleaks`, `semgrep`) and custom heuristics for detecting anomalies. A backend service processes repository data, stores findings, and provides a dashboard.
Scanning for Hardcoded Secrets (using Gitleaks)
# Example: Running Gitleaks locally or in a CI/CD pipeline # Install Gitleaks: https://github.com/gitleaks/gitleaks # Scan the current directory (assuming it's a Git repo) gitleaks detect --source . --report-path gitleaks-report.json --report-format json # Scan a specific commit range gitleaks detect --source . --commits HEAD~10..HEAD --report-path gitleaks-report.json --report-format json # Scan a remote repository (requires cloning or fetching) # For CI/CD, you'd typically clone the repo first git clone [email protected]:your-org/your-repo.git cd your-repo gitleaks detect --source . --report-path gitleaks-report.json --report-format json cd .. # Example of a Gitleaks JSON report snippet: # [ # { # "ruleId": "8a2100f25eff7198", # "description": "AWS Access Key ID", # "secret": "AKIAIOSFODNN7EXAMPLE", # "commit": "a1b2c3d4e5f6...", # "author": "John Doe", # "email": "[email protected]", # "date": "2023-10-27T10:00:00Z", # "filePath": "config/aws.py", # "line": 5, # "tags": ["aws", "key"] # } # ]
6. Intelligent Log Analysis & Anomaly Detection Platform
This SaaS ingests logs from various sources (applications, servers, cloud services), applies machine learning to detect anomalies, and provides intelligent alerting. It aims to reduce alert fatigue and surface critical issues faster than traditional log aggregation tools.
The architecture typically involves a log shipper (Fluentd, Logstash), a scalable log storage (Elasticsearch, Loki), and a processing layer (Python/Spark) for ML analysis. Anomaly detection algorithms like Isolation Forest or LSTM networks can be employed.
Log Ingestion & Anomaly Detection Pipeline
# Example: Using Fluentd to collect logs and forward to Elasticsearch
# Fluentd configuration (fluent.conf)
<source>
@type tail
path /var/log/nginx/access.log
pos_file /var/log/td-agent/nginx-access.pos
tag nginx.access
<parse>
@type nginx
</parse>
</source>
<source>
@type tail
path /var/log/app/production.log
pos_file /var/log/td-agent/app-prod.pos
tag app.prod
<parse>
@type json # Assuming application logs are JSON
</parse>
</source>
<match nginx.** app.**>
@type elasticsearch
host elasticsearch.example.com
port 9200
logstash_format true
logstash_prefix logstash # Index prefix
include_tag_key true
tag_key @log_name
flush_interval 5s
</match>
# Example: Python script for anomaly detection using Isolation Forest
import pandas as pd
from sklearn.ensemble import IsolationForest
import json
from elasticsearch import Elasticsearch
# Connect to Elasticsearch
es = Elasticsearch([{'host': 'elasticsearch.example.com', 'port': 9200}])
def fetch_logs(index_name, hours=1):
query = {
"query": {
"range": {
"@timestamp": {
"gte": f"now-{hours}h",
"lt": "now"
}
}
},
"_source": ["message", "@timestamp"] # Fetch relevant fields
}
res = es.search(index=index_name, body=query, size=10000) # Adjust size as needed
logs = []
for hit in res['hits']['hits']:
logs.append({
'timestamp': hit['_source'].get('@timestamp'),
'message': hit['_source'].get('message')
})
return pd.DataFrame(logs)
def analyze_anomalies(df):
if df.empty:
return pd.DataFrame()
# Feature Engineering: Convert log messages to numerical features (e.g., TF-IDF, embeddings)
# This is a simplified example; real-world scenarios need robust NLP
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(stop_words='english', max_features=100)
try:
features = vectorizer.fit_transform(df['message']).toarray()
except ValueError: # Handle cases with empty messages or only stop words
print("Warning: Could not vectorize messages. Skipping anomaly detection for this batch.")
return pd.DataFrame()
# Train Isolation Forest model
model = IsolationForest(n_estimators=100, contamination='auto', random_state=42)
model.fit(features)
# Predict anomalies (-1 for outliers, 1 for inliers)
df['anomaly_score'] = model.decision_function(features)
df['is_anomaly'] = model.predict(features)
return df[df['is_anomaly'] == -1].sort_values('anomaly_score')
if __name__ == "__main__":
log_df = fetch_logs("logstash-*", hours=1) # Fetch logs from the last hour
anomalies = analyze_anomalies(log_df)
if not anomalies.empty:
print("Detected Anomalies:")
print(anomalies.to_string())
# TODO: Implement alerting mechanism (e.g., send to Slack, PagerDuty)
else:
print("No anomalies detected.")
7. Developer Portal for Internal Microservices
This SaaS provides a centralized, searchable catalog of all internal microservices, their documentation, ownership, dependencies, and API contracts. It acts as a single source of truth, improving discoverability and reducing integration friction.
Features include: automated discovery of services (via service registries like Consul/etcd), integration with Git for API specs, and a user-friendly UI. The backend could use a graph database (Neo4j) to model service dependencies.
Service Discovery & Dependency Mapping
# Example: Using Consul for service registration and discovery
# Service A registers itself with Consul on startup
consul services register -name service-a -port 8080 -tags "api:v1,team:backend"
# Service B, needing to call Service A, queries Consul
consul services read -name service-a
# The Developer Portal queries Consul/API Gateway/etc. to build its internal graph
# Example API call to Consul's Catalog API:
curl "http://consul.service.consul:8500/v1/catalog/service/service-a"
# Expected JSON response snippet:
# [
# {
# "ID": "...",
# "Node": "node-1",
# "Address": "10.0.1.10",
# "ServiceID": "...",
# "ServiceName": "service-a",
# "ServiceTags": ["api:v1", "team:backend"],
# "ServicePort": 8080,
# ...
# }
# ]
# Example: Querying Neo4j to visualize dependencies # Assuming services are nodes with labels like :Service # And dependencies are relationships like :DEPENDS_ON MATCH (s1:Service)-[:DEPENDS_ON]->(s2:Service) WHERE s1.name = 'service-b' RETURN s1, s2 # This query would return nodes representing 'service-b' and the services it depends on. # The Developer Portal would use this data to render a dependency graph.
8. Intelligent CI/CD Pipeline Optimizer
This SaaS analyzes CI/CD pipeline execution data to identify bottlenecks, optimize build times, and predict flaky tests. It provides actionable recommendations to speed up the development cycle and improve release reliability.
It integrates with CI/CD platforms (Jenkins, GitHub Actions, GitLab CI) via webhooks or APIs. Data is collected on job durations, test results, and resource utilization. ML models can predict test flakiness and suggest parallelization strategies.
Pipeline Bottleneck Analysis
# Example: Analyzing Jenkins build logs or API data
# Assume a Python script fetches job data via Jenkins API
import requests
import pandas as pd
from collections import defaultdict
JENKINS_URL = "http://jenkins.example.com"
JENKINS_USER = "your_user"
JENKINS_TOKEN = "your_token"
def get_build_data(job_name):
api_url = f"{JENKINS_URL}/job/{job_name}/api/json?tree=builds[number,duration,timestamp,url]"
response = requests.get(api_url, auth=(JENKINS_USER, JENKINS_TOKEN))
response.raise_for_status()
data = response.json()
builds = []
for build in data.get('builds', []):
build_info_url = f"{build['url']}api/json?tree=actions[causes[shortDescription]],result,stages[duration,name]"
build_info_response = requests.get(build_info_url, auth=(JENKINS_USER, JENKINS_TOKEN))
build_info_response.raise_for_status()
build_details = build_info_response.json()
stages_data = {}
if 'stages' in build_details:
for stage in build_details['stages']:
stages_data[stage['name']] = stage['duration']
builds.append({
'number': build['number'],
'duration_ms': build['duration'],
'timestamp': build['timestamp'],
'result': build_details.get('result'),
'stages': stages_data
})
return pd.DataFrame(builds)
# Analyze stage durations
# df = get_build_data("my-app-pipeline")
# stage_avg_durations = defaultdict(float)
# stage_counts = defaultdict(int)
#
# for index, row in df.iterrows():
# for stage_name, duration in row['stages'].items():
# stage_avg_durations[stage_name] += duration
# stage_counts[stage_name] += 1
#
# for stage_name in stage_avg_durations:
# stage_avg_durations[stage_name] /= stage_counts[stage_name]
#
# sorted_stages = sorted(stage_avg_durations.items(), key=lambda item: item[1], reverse=True)
# print("Average stage durations (ms):", sorted_stages)
# This data can be used to identify the longest-running stages, which are potential bottlenecks.
9. AI-Assisted Documentation Generator
This SaaS automatically generates and maintains technical documentation from code, commit messages, and issue trackers. It uses LLMs to understand code context and