- Add Veeam RPO analysis page (/veeam-analysis) and comparison page (/veeam-comparison) - Add API routes: /api/veeam/rpo-analyze, rpo-comparison, rpo-offline-log, ticket-analysis - Add veeam-rpo-service.ts enhancements (RPO logic, offline detection, comparison) - Add veeam-analysis-state.ts and rmm-device-resolver.ts services - Add migrations 065-068: company_teams, veeam_rpo_offline_log, rpo_comparison_tables, veeam_ticket_analysis - Add backup-status page updates and nav links for new Veeam pages - Add scripts: deactivate-cis-for-inactive-companies, workstation category updates - Add docs: mimecast-api-guide, veeam-backup-alerting-recommendation, workstation-backup-overview, ticket-analyzer-prompt - Minor: webhook-service, entity-sync, entity-mapper, sync-helpers, sync.ts, middleware.ts updates
3.5 KiB
Pulse
Internal PSA management dashboard for Wulf Consulting. Pulse syncs Autotask data into Postgres and layers dashboards, ticket workflow automation, and analytics across a number of MSP tooling integrations (Microsoft 365, Datto RMM, Veeam, Auvik, Addigy, IT Glue, Mimecast, SentinelOne, Duo, Zoom, QuickBooks Online, Zabbix, and more).
Stack
- Next.js 16 (App Router) + React 19, TypeScript
- PostgreSQL 16 via
pg(no ORM); Redis for caching - Better Auth — magic link, TOTP 2FA, Microsoft OAuth
- Tailwind 4 + shadcn/ui, recharts, sonner, lucide
- Anthropic SDK for AI triage and analysis features
- node-cron scheduler embedded in the app process
- Docker Compose for local and prod (Traefik-fronted)
Quick start
Prerequisites: Docker + Docker Compose, or Node 20+ and a local Postgres/Redis.
cp .env.example .env.local # if present, otherwise see docker-compose.yml
docker compose up -d # Postgres applies migrations/ on first init
npm install
npm run dev # http://localhost:3100
The first user to authenticate is bootstrapped as super-admin from
DEFAULT_ADMIN_EMAIL.
Scripts
| Command | What it does |
|---|---|
npm run dev |
Next.js dev server on port 3100 |
npm run build |
Production build (turbopack) |
npm start |
Run the built app |
npm run lint |
ESLint |
npx tsc --noEmit --pretty |
Type check (the project's only automated check — there is no test suite or CI) |
Project layout
app/ Next.js App Router — pages and app/api/**/route.ts handlers
components/ Feature components; components/ui/ is shadcn primitives
lib/services/ Integration clients, sync services, scheduler
lib/types/ Shared TypeScript types per domain
lib/auth*.ts Better Auth config and helpers
migrations/ Numbered SQL migrations applied on Postgres init
scripts/ One-off ops/diagnostic scripts (not tests)
docs/ Deep-dive guides per integration and feature
Configuration
All credentials come from environment variables. The major groups:
- Database / cache:
POSTGRES_HOST/PORT/DB/USER/PASSWORD(orDATABASE_URL),REDIS_URL - Auth:
BETTER_AUTH_SECRET,BETTER_AUTH_URL,MICROSOFT_CLIENT_ID/SECRET/TENANT_ID,DEFAULT_ADMIN_EMAIL - Autotask:
AUTOTASK_API_URL,AUTOTASK_USERNAME,AUTOTASK_SECRET,AUTOTASK_API_INTEGRATION_CODE,AUTOTASK_WEBHOOK_SECRET - Microsoft 365 Graph (app):
MSGRAPH_CLIENT_ID/SECRET/TENANT_ID - Other integrations:
DATTO_RMM_*,VEEAM_VSPC_*,AUVIK_*,ADDIGY_*,ITGLUE_*,MIMECAST_*,S1_*,DUO_*,ZOOM_*,QBO_*,ZABBIX_*,SALESBLDR_* - AI:
ANTHROPIC_API_KEY
See AUTOTASK_API_GUIDE.md and ADDIGY_API_GUIDE.md for credential setup.
docs/ has per-integration guides for the rest.
Documentation
CLAUDE.md— repo orientation for AI coding sessions; also a useful overview for new contributorsAUTOTASK_API_GUIDE.md,ADDIGY_API_GUIDE.md— credential setupPOSTGRES_SYNC_SETUP.md— database initializationDOCKER_README.md— Docker workflowPULSE_DATABASE_SKILL.md— diagnostic SQL queriesdocs/— sync behavior, webhook setup, workflow editor, per-integration guides
Deployment
Production runs via docker compose up -d behind Traefik. The app is reachable
at pulse.wulfconsulting.cloud. There is no CI/CD pipeline — deploys are manual
(rebuild image, recreate containers).
License
Internal use only.