A local web app for creating and managing Azure support tickets through the Azure Support REST API (Microsoft.Support, 2024-04-01).
- List and filter tickets for a subscription or at tenant level, by status, created date, service and severity, with paging.
- Ticket detail: description, SLA, contact, support engineer, messages, chat transcripts.
- Create tickets in a guided flow: service → problem type (with optional AI suggestions from the preview classify API) → details → contact → review.
- Update and reply: change severity, status, diagnostic consent or contact details, and add messages.
- Attachments: list a ticket's files and upload new ones (up to 5 MB each), including files picked while creating a ticket.
- Safe by default: every write is a dry run that shows the exact request. Real calls need
SUPPORT_LIVE_MODE=trueand a confirm click. - Three auth modes: Azure CLI, service principal, or Entra ID user sign-in.
az login
npm install
npm run devOpen http://localhost:3000. With no .env.local, the app uses your Azure CLI login in dry-run mode. For the other auth modes, RBAC and going live, see docs/SETUP.md.
Browser (React client components)
│ fetch /api/* (no Azure tokens in the browser)
▼
Next.js route handlers ── src/app/api/**
│ auth: AzureCliCredential | ClientSecret/CertificateCredential | MSAL user session
│ guard: dry run unless SUPPORT_LIVE_MODE=true and confirm: true
▼
SupportClient / ArmClient ── src/lib/azure-support/**
│ api-version, error mapping, nextLink paging, long-running operation polling
▼
https://management.azure.com/…/providers/Microsoft.Support/…
| Area | Operation groups used |
|---|---|
| Catalog | Services, Problem Classifications, classifyProblems (2025-06-01-preview) |
| Tickets | Support Tickets, Support Tickets No Subscription (list, get, create, update, check name) |
| Messages | Communications, Communications No Subscription (list, create, check name) |
| Chats | Chat Transcripts, Chat Transcripts No Subscription (list) |
| Attachments | Files, Files No Subscription (list, create, upload) in the ticket-number file workspace |
The scope picker in the header switches between a subscription (/subscriptions/{id}/providers/Microsoft.Support/…) and the tenant-level "No Subscription" endpoints (/providers/Microsoft.Support/…). A ticket can only be read from the scope it was created in.
| Command | What it does |
|---|---|
npm run dev |
Start the app on http://localhost:3000 |
npm test |
Unit tests (Vitest) against mocked ARM responses; they never call Azure |
npm run typecheck |
Generate Next.js route types and run tsc |
npm run lint |
ESLint |
GitHub Actions runs lint, typecheck, tests and next build on every pull request and push to main (.github/workflows/ci.yml). Dependabot proposes dependency updates weekly.
- Downloading attachments (the API has no download operation)
- Hosting and multi-user deployment
- Severity can't be filtered server-side (the API only supports status, created date, service and problem classification), so the severity filter applies to loaded pages only.