Azure DevOps Powered Support Ticketing
Production • Quick Start • Features • Documentation
ZapDesk is a Zendesk-style support ticketing portal that uses Azure DevOps as its backend. Built by KnowAll.
- Microsoft Authentication - Sign in with Azure AD/Microsoft accounts
- Azure DevOps Integration - Work items tagged as "ticket" appear as support tickets
- Multi-tenant Support - Different clients have different DevOps projects (e.g., Medite, Cairn Homes)
- Permission-based Access - Users only see tickets from projects they have access to
- Email-to-Ticket - Send emails to a configured mailbox to create tickets automatically
- Email Responses - Replies to tickets email the requester via Exchange Online
- Zendesk-like UI - Familiar interface with views, filters, and ticket management
- Node.js 20+ (runtime for the server)
- Bun 1.2+ (package manager)
- Azure DevOps organization
- Azure AD application for authentication
- Exchange Online mailbox (for email integration)
-
Clone the repository
git clone https://github.com/knowall-ai/zapdesk.git cd zapdesk -
Install dependencies
bun install
-
Configure environment variables
cp .env.example .env
Edit
.envwith your values (see .env.example) -
Run the development server
bun run dev
-
Open the application Navigate to http://localhost:3000
- Register a new application in Azure AD
- Add redirect URIs:
- Development:
http://localhost:3000/api/auth/callback/azure-ad - Production:
https://zapdesk.knowall.ai/api/auth/callback/azure-ad
- Development:
- Configure API permissions for Azure DevOps:
499b84ac-1321-427f-aa17-267ca6975798/.default(Azure DevOps)
- Create a client secret and note it down
Only Azure DevOps work items with the "ticket" tag will appear in ZapDesk. To convert any work item into a support ticket:
- Open the work item in Azure DevOps
- Add the tag "ticket"
- The item will now appear in ZapDesk
ZapDesk maps Azure DevOps projects to organizations/clients:
| Project | Domain | Description |
|---|---|---|
| Medite | medite.com | Medite client project |
| Cairn Homes | cairnhomes.com | Cairn Homes client project |
| KnowAll | knowall.ai | Internal KnowAll project |
Customers send emails to the configured support mailbox to create tickets:
- Set up an Exchange Online shared mailbox
- Configure mail flow rule to forward to webhook
- Or use Power Automate to POST to
/api/email/webhook
When agents reply to tickets, the requester receives an email:
- Configure Exchange Online SMTP settings
- Set
SMTP_*environment variables - Replies include ticket reference for threading
- Create shared mailbox for your support email address
- Enable SMTP AUTH for the mailbox
- Create app password or configure OAuth
- Set up mail flow rules for inbound processing
See docs/EMAIL_SETUP.adoc for detailed instructions.
- Framework: Next.js 16 (App Router)
- Runtime: Node.js (production), Bun (local development)
- Package Manager: Bun
- Language: TypeScript
- Styling: Tailwind CSS 4
- Authentication: NextAuth.js with Azure AD
- Backend: Azure DevOps REST API
- Icons: Lucide React
- Deployment: Azure App Service
zapdesk/
├── src/
│ ├── app/ # Next.js app router pages
│ │ ├── api/ # API routes
│ │ │ ├── auth/ # NextAuth endpoints
│ │ │ ├── devops/ # DevOps API proxy
│ │ │ └── email/ # Email webhook
│ │ ├── tickets/ # Ticket pages
│ │ ├── customers/ # Customer pages
│ │ ├── organizations/ # Organization pages
│ │ └── login/ # Login page
│ ├── components/ # React components
│ ├── lib/ # Utility functions
│ └── types/ # TypeScript types
├── docs/ # Documentation
├── tests/ # Playwright tests
└── public/ # Static assets
# Run development server
bun run dev
# Build for production
bun run build
# Run production server
bun run startThe following checks run automatically on every pull request via GitHub Actions:
# Run all checks (recommended before pushing)
bun run check
# Individual checks
bun run typecheck # TypeScript type checking
bun run lint # ESLint
bun run lint:fix # ESLint with auto-fix
bun run format:check # Prettier format check
bun run format # Prettier auto-format
# Run tests
bun run testAll checks must pass before a PR can be merged.
Proprietary - KnowAll AI Ltd.
For support, email support@knowall.ai or visit knowall.ai.