cp .env.example .env
npm install
docker compose up -d
npm run prisma:migrate
npm run prisma:seed
npm run devOpen:
Frontend: http://localhost:5173
API: http://localhost:4000
If Vite says Port 5173 is in use, open the printed URL, usually http://localhost:5174.
Demo accounts:
user@deskflow.dev / demo1234
support@deskflow.dev / demo1234
admin@deskflow.dev / demo1234
If Docker is not installed, start any PostgreSQL 16 instance manually and set DATABASE_URL in .env.
On Arch, install Docker and Docker Compose, then start the Docker service:
sudo pacman -Syu
sudo pacman -S docker docker-compose
sudo systemctl enable --now docker
sudo usermod -aG docker "$USER"
newgrp dockerCheck Compose:
docker compose versionIf docker compose is not available but docker-compose is available, use:
docker-compose up -dinstead of:
docker compose up -dnpm run typecheck
npm test
npm run build
npm run checkExpected result:
typecheck: no TypeScript errors
test: all Vitest tests passed
build: server and client production build completed
check: typecheck + tests passed
- Open
/login. - Click each demo account button and verify credentials are filled.
- Login as USER, SUPPORT and ADMIN.
- Logout returns to login.
- Register creates a new USER account.
- Login as
user@deskflow.dev. - Open
/my/tickets. - Verify only this user's tickets are visible.
- Search tickets by title text.
- Filter by status and priority.
- Sort newest, oldest, priority and SLA.
- Open
/my/tickets/new. - Create a ticket with title, description, category and priority.
- Open created ticket detail.
- Add a public comment.
- Delete your own public comment.
- Upload allowed file type: png, jpg, jpeg, pdf or txt, max 5MB.
- Close the ticket.
- Delete your own ticket.
- Verify USER does not see internal comments or activity log.
- Login as
support@deskflow.dev. - Open
/support/dashboard. - Verify metric cards and grouped charts are visible.
- Open
/support/tickets. - Verify all tickets are visible, not only own tickets.
- Search, filter and sort the queue.
- Open a ticket detail.
- Click
Assign to me. - Change status to
IN_PROGRESS,PENDING,RESOLVED. - Change priority.
- Add a public comment.
- Add an internal note.
- Delete any public or internal comment.
- Delete any ticket from the ticket detail page.
- Verify activity log records actions.
- Verify SLA badge changes between On track, At risk, Overdue and Resolved based on ticket state.
- Login as
admin@deskflow.dev. - Open
/admin/users. - Change a user's role.
- Block and activate a user.
- Open
/admin/categories. - Create a category.
- Disable and enable a category.
- Open
/admin/audit. - Verify activity logs are visible.
- As USER, try opening a support route like
/support/dashboard; it should redirect away. - As SUPPORT, try opening
/admin/users; it should redirect away. - As USER, open own ticket detail and verify internal notes are hidden.
- As SUPPORT or ADMIN, open the same ticket and verify internal notes are visible.
Login:
curl -s http://localhost:4000/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"support@deskflow.dev","password":"demo1234"}'Use returned token:
TOKEN="paste-token-here"
curl -s http://localhost:4000/api/auth/me \
-H "Authorization: Bearer $TOKEN"
curl -s http://localhost:4000/api/tickets \
-H "Authorization: Bearer $TOKEN"
curl -s http://localhost:4000/api/support/dashboard \
-H "Authorization: Bearer $TOKEN"
curl -s http://localhost:4000/api/healthnpm run prisma:migrate
npm run prisma:seedFor a full Docker database reset:
docker compose down -v
docker compose up -d
npm run prisma:migrate
npm run prisma:seedInstall Docker Desktop or run PostgreSQL manually and update .env.
Check that PostgreSQL is running:
docker compose psThen verify DATABASE_URL matches .env.example.
Run seed:
npm run prisma:seedOnly these MIME types are accepted:
png, jpg, jpeg, pdf, txt
Max file size is 5MB.