Every website operator eventually confronts the chaotic reality of user feedback. A visitor encounters a broken button and sends a frantic email. Another leaves a social media comment about a mobile loading failure, while a third fills out a contact form with a feature suggestion that quietly languishes in an inbox between newsletters and digital receipts. When development teams finally sit down to address these reports, they typically find bug descriptions scattered across disparate platforms, half of them missing critical context, while others have been manually copy-pasted into GitHub issues—sometimes with sensitive user details inadvertently exposed.

Seeking a more streamlined solution for his own projects, developer Andrew Baisden has built and released IssueRelay, an open-source platform designed to integrate a lightweight support widget into any React website. The tool allows visitors to ask questions, report bugs, or suggest features directly from the page. Every incoming report is immediately secured in a local database before an artificial intelligence model known as Jev classifies the content. Strict code policies then determine the ticket’s destination, leaving human administrators to review the findings in a private dashboard. Upon confirmation that a report constitutes a genuine bug, IssueRelay automatically generates a clean, privacy-filtered GitHub issue and synchronizes the workflow so that closing the issue on GitHub automatically resolves the corresponding support ticket.

The complete system is open source on GitHub under the repository andrewbaisden/issuerelay, while the browser widget is published on npm as @issuerelay/widget. The software is already running in a live production environment on Baisden’s personal portfolio website.

Addressing the Chaos of Fragmented Website Feedback
The administrative headache of managing user feedback is a universal challenge for digital creators. Without a centralized intake pipeline, reports are easily lost, security risks multiply when personal data is mishandled, and engineers waste valuable time manually formatting bug reports instead of writing code. IssueRelay aims to solve these pain points by establishing a single landing zone for all incoming messages, safeguarding every submission against third-party outages, and intelligently sorting the data so developers can focus on high-priority items.

Crucially, the system implements a strict governance model regarding automation: artificial intelligence recommends classifications, but human operators always confirm the decisions, and deterministic code enforces the ultimate rules. Because AI models can occasionally misinterpret context, the platform ensures that public GitHub issues are never created based purely on unverified algorithmic guesses.

The Architecture and the Role of Jev
At the core of the classification engine is Jev, a model developed by TypeSafe tailored specifically for bounded computational judgments rather than open-ended text generation. Rather than prompting a model to draft paragraphs that require complex parsing, the system provides Jev with a constrained state and specific questions mapped to fixed sets of allowed answers. Jev evaluates the input and returns categorical probabilities for each option.

This architecture fits support triage perfectly, as incoming tickets can be reliably categorized as bugs, general questions, feature requests, billing inquiries, or spam, alongside designated severity levels. Because the model selects from pre-determined labels rather than free-form text, the output is structurally predictable and easily validated by code. Furthermore, the integration protects user privacy by transmitting only the visitor’s message and their chosen topic to the AI model, completely withholding names, email addresses, and identification numbers.

The broader technical stack utilizes a modern TypeScript monorepo split into specialized packages. Boundaries between components are strictly enforced: React components never communicate directly with GitHub, the database, or the AI service, and browser-side code is entirely isolated from server secrets. This separation ensures that the widget can be published to npm as a lightweight module without dragging along server-side dependencies.

From Browser Widget to Synchronized GitHub Issue
The lifecycle of a support ticket begins when a visitor interacts with the React widget installed on a host website. Utilizing a submission client that operates without cookies or session credentials, the widget assigns a unique submission identifier to prevent duplicate tickets during network retries. Under the hood, the widget renders inside a Shadow DOM with bundled styles, preventing CSS conflicts with the host site.

Upon reaching the platform API, the report’s first and most critical destination is the PostgreSQL database via a transaction. This "save first, think later" design guarantees that transient outages involving AI providers or GitHub will never result in lost user messages. Once safely stored, the triage service engages Jev to analyze the content, followed by validation through strict schemas.

Deterministic code policies subsequently evaluate the classification. A routing function maps bugs to engineering queues, feature requests to product teams, and spam to quarantine. Meanwhile, a separate escalation policy assesses whether a ticket meets the rigorous criteria required to become a public GitHub issue. It must be explicitly classified as a bug, assigned to the engineering queue, and achieve a high confidence score.

Before any issue is generated, a built-in privacy gate scans the report for email addresses, phone numbers, API keys, JSON web tokens, and other sensitive markers. Even if a visitor includes personal data in their message or contact fields, the privacy filter intercepts the text to ensure no private information leaks into a public repository. Once approved, creating the GitHub issue is handled securely through a dedicated GitHub App integration.

Finally, synchronization is maintained through secure webhooks. When a developer closes the issue on GitHub, the platform verifies the event using cryptographic HMAC SHA256 signatures with timing-safe comparisons to prevent signature-guessing attacks. Upon successful verification, the corresponding support ticket in the dashboard automatically updates to a resolved status, closing the feedback loop entirely.

Deployment and Production Adoption
Designed for rapid deployment, IssueRelay can be self-hosted on infrastructure providers like Vercel and Neon within minutes. A dedicated setup interface securely provisions the owner account and project keys while validating allowed site addresses to prevent unauthorized cross-origin submissions. To simplify repository integration, a manifest command automates the creation and configuration of the necessary GitHub App.

Having successfully deployed the system to his personal portfolio, Baisden reports that the workflow has effectively streamlined his own development and maintenance processes. Real-world testing confirmed that incoming visitor inquiries regarding questions, bugs, and feature requests were accurately classified and routed without exposing personal contact details in public repositories. By combining automated triage with human oversight and strict privacy boundaries, the project provides a robust, self-hosted alternative to traditional, third-party customer support desks.

