# Elmeg Bug Tracker Spec

**Domain:** bugs.elmeg.xyz  
**Style:** Zendesk-inspired support portal  
**Date:** 2023-12-23

---

## Overview

A lightweight, self-hosted bug/feedback tracker with a clean, user-first interface. Users can submit issues, track status, and browse known issues. Admins can triage, respond, and resolve.

---

## User-Facing Features

### 1. Submit a Report

- **Type:** Bug, Feature Request, Question, Other
- **Title:** Short description (required)
- **Description:** Rich text with markdown support
- **Attachments:** Screenshot upload (optional)
- **Priority:** (auto or user-selectable) Low, Medium, High, Critical
- **Email:** For anonymous users (logged-in users auto-fill)
- **Environment:** Auto-capture: Browser, OS, page URL

### 2. My Tickets

- View submitted tickets
- Track status: Open → In Progress → Resolved → Closed
- Add comments/updates to existing tickets
- Receive email notifications on updates

### 3. Knowledge Base / Known Issues

- Browse open bugs (public visibility toggle per ticket)
- Search functionality
- "Me too" upvote button
- FAQ section

### 4. Anonymous vs Authenticated

- Logged-in Elmeg users: auto-linked, no email required
- Anonymous: requires email for updates

---

## Admin Features

### Dashboard

- Ticket queue (filterable by status, type, priority, date)
- Unassigned tickets highlight
- Metrics: open count, avg response time, resolution rate

### Ticket Management

- Assign to self or team member
- Internal notes (not visible to user)
- Public reply
- Change status, priority, type
- Merge duplicate tickets
- Mark as known issue (public)

### Canned Responses

- Pre-written templates for common issues
- Variable substitution: `{user_name}`, `{ticket_id}`

---

## Technical Architecture

### Stack

- **Frontend:** Next.js (standalone app, shares Elmeg styling)
- **Backend:** FastAPI (can share auth with main Elmeg backend)
- **Database:** PostgreSQL (new schema in same db or separate)
- **Storage:** S3/local for attachments

### Models

```
Ticket
├── id (uuid)
├── ticket_number (auto-increment display ID: ELM-001)
├── type (bug | feature | question | other)
├── status (open | in_progress | resolved | closed)
├── priority (low | medium | high | critical)
├── title
├── description
├── reporter_email
├── reporter_user_id (nullable, FK to elmeg user)
├── assigned_to (nullable, FK to admin user)
├── is_public (for known issues)
├── upvotes
├── environment (JSON: browser, os, url)
├── created_at
├── updated_at
├── resolved_at

TicketComment
├── id
├── ticket_id (FK)
├── author_id (FK)
├── author_email (for anonymous)
├── content
├── is_internal (admin-only visibility)
├── created_at

TicketAttachment
├── id
├── ticket_id (FK)
├── filename
├── url
├── created_at

CannedResponse
├── id
├── title
├── content
├── created_by
```

### API Endpoints

**Public:**

- `POST /tickets` - Create ticket
- `GET /tickets/{ticket_number}` - View ticket (if public or owned)
- `POST /tickets/{id}/comments` - Add comment
- `POST /tickets/{id}/upvote` - Upvote known issue
- `GET /known-issues` - List public tickets

**Authenticated (Elmeg user):**

- `GET /my-tickets` - User's tickets

**Admin:**

- `GET /admin/tickets` - All tickets (filtered)
- `PATCH /admin/tickets/{id}` - Update status, assign, etc.
- `POST /admin/tickets/{id}/internal-note` - Add internal note
- `GET /admin/canned-responses`
- `POST /admin/canned-responses`

---

## UI Pages

| Route | Purpose |
|-------|---------|
| `/` | Landing: "How can we help?" + Submit form |
| `/submit` | Full bug report form |
| `/my-tickets` | User's submitted tickets |
| `/ticket/[id]` | Ticket detail + comments |
| `/known-issues` | Public bug list with search |
| `/admin` | Admin dashboard |
| `/admin/ticket/[id]` | Admin ticket view |

---

## Email Notifications

| Event | Recipient |
|-------|-----------|
| Ticket created | User (confirmation) |
| Admin replies | User |
| Status changed | User |
| User comment | Assigned admin |

Uses existing AWS SES integration.

---

## Deployment

### Docker Compose (separate service)

```yaml
services:
  bugs-frontend:
    build: ./bugs-frontend
    labels:
      - "traefik.http.routers.bugs.rule=Host(`bugs.elmeg.xyz`)"
      
  bugs-backend:
    build: ./bugs-backend
    environment:
      - DATABASE_URL=postgresql://...
      - ELMEG_API_URL=https://elmeg.xyz/api
```

### DNS

Add A record or CNAME for `bugs.elmeg.xyz` → production server

### Auth Integration

- Share JWT validation with main Elmeg backend
- Or standalone with optional Elmeg SSO

---

## MVP Scope (Phase 1)

- [ ] Submit ticket form
- [ ] My tickets list
- [ ] Ticket detail with comments
- [ ] Admin ticket queue
- [ ] Email on ticket creation
- [ ] Basic styling matching Elmeg

## Phase 2

- [ ] Known issues page
- [ ] Upvoting
- [ ] Canned responses
- [ ] Internal notes
- [ ] Attachment uploads
- [ ] Search

## Phase 3

- [ ] Metrics dashboard
- [ ] Merge tickets
- [ ] Tags/labels
- [ ] Webhook integrations (Discord, Slack)

---

## Estimated Effort

| Phase | Effort |
|-------|--------|
| MVP | 2-3 days |
| Phase 2 | 2 days |
| Phase 3 | 2 days |

---

## Next Steps

1. Create `/srv/containers/elmeg-bugs` directory structure
2. Initialize Next.js + FastAPI project
3. Set up Traefik routing for `bugs.elmeg.xyz`
4. Implement MVP models + endpoints
5. Deploy
