Mimecast blast-radius fixes: future end-date no longer silently swallowed into a false-clean result, and campaigns from companies with their own registered mimecast_tenants row (e.g. Seubert & Associates) now resolve against that tenant instead of always querying the global Wulf tenant. |
||
|---|---|---|
| .devin/workflows | ||
| .firecrawl | ||
| .planning | ||
| app | ||
| components | ||
| dev | ||
| docs | ||
| hooks | ||
| lib | ||
| migrations | ||
| public | ||
| scripts | ||
| tasks | ||
| .dockerignore | ||
| .gitignore | ||
| .mcp.json | ||
| _clientMiddlewareManifest.json | ||
| ADDIGY_API_GUIDE.md | ||
| ARCHITECTURE.md | ||
| AUTOTASK_API_GUIDE.md | ||
| CLAUDE.md | ||
| components.json | ||
| DESIGN.md | ||
| docker-compose.yml | ||
| DOCKER_README.md | ||
| Dockerfile | ||
| eslint.config.mjs | ||
| favicon.0b3bf435.ico | ||
| FIX_TICKET_SYNC.md | ||
| get-config-text.js | ||
| LCI_FEATURE_DESIGN.md | ||
| mcp.json | ||
| middleware.ts | ||
| next-development.log | ||
| next-devtools-config.json | ||
| next.config.ts | ||
| package-lock.json | ||
| package.json | ||
| postcss.config.mjs | ||
| POSTGRES_SYNC_SETUP.md | ||
| PULSE_DATABASE_SKILL.md | ||
| README.md | ||
| routes.d.ts | ||
| test-config.js | ||
| test-time-entry.js | ||
| tsconfig.json | ||
| vitest.config.ts | ||
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/wulf-pulse-ticket-analyzer-runbook.md— AI ticket analyzer operator runbook (cost monitoring, IT Glue alias map, failure triage)docs/— 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.