- Tickets get a random display ID (V + 9 digits, e.g. V325813929)
- Ticket detail page has Overview / Comments / Audit Log tabs
- Audit log records every action (create, status, assignee, severity,
reroute, title/overview edit, comment add/delete) with who and when
- Comments redesigned: avatar (initials + color), markdown rendering
via react-markdown + remark-gfm, Write/Preview toggle
- Dashboard shows displayId and assignee avatar
- URLs now use displayId (/tickets/V325813929)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Eliminates the need to generate and commit migration files locally
before first deploy. Schema is synced directly from schema.prisma
on container start.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Prisma's schema engine requires libssl on Alpine.
Without it, migrate deploy fails with a JSON parse error
wrapping an ELF load failure.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Internal ticketing app with CTI routing, severity levels, and n8n integration.
Stack: Express + TypeScript + Prisma + PostgreSQL / React + Vite + Tailwind
- JWT auth for users, API key auth for service accounts (Goddard/n8n)
- CTI hierarchy (Category > Type > Item) for ticket routing
- Severity 1-5, auto-close resolved tickets after 14 days
- Gitea Actions CI/CD building separate server/client images
- Production docker-compose.yml with Traefik integration
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>