No description
Find a file
lorentz db375fb0e6 feat(admin): client scope — filter analytics to recurring-revenue companies
Adds company-level opt-out scoping so white-label / subcontract clients
(TTG, LEC, PER, VCF, Trivium Packaging, TNT Pizza, etc.) can be excluded
from Wulf's own dashboard KPIs and ticket analytics without affecting
per-company drill-down views.

- migration 082: company_scope table (opt-out; absent row = in scope)
- GET/PATCH /api/admin/company-scope[/companyId] — list + upsert
- /admin/client-scope — searchable company list with Switch per row,
  type filter, and in/out scope filter; excluded rows are dimmed
- dashboard overview KPIs now exclude out-of-scope company tickets
- analyzer /tickets query excludes out-of-scope when no specific
  client is selected (explicit per-company selection still works)
- "Client Scope" tile added to admin Tools & Data section

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 11:40:47 -04:00
.firecrawl feat: Mimecast multi-tenant held mail viewer 2026-03-31 22:38:22 -04:00
.windsurf/workflows feat: IT Glue integration, workflow engine, pipelines, Zabbix WAN, notification channels, backup status UI improvements, nav alignment fixes 2026-02-27 14:52:14 -05:00
app feat(admin): client scope — filter analytics to recurring-revenue companies 2026-05-03 11:40:47 -04:00
components fix(nav): replace NavigationMenu submenus with DropdownMenu 2026-05-03 11:18:52 -04:00
dev feat: AI ticket analyzer (phases 1-6) 2026-04-29 10:59:40 -04:00
docs feat(design): nav/visual overhaul — brand layer, /status route, KPI dashboard, TanStack DataTable 2026-05-03 09:33:13 -04:00
hooks Add comprehensive admin features and multi-system integration 2025-11-19 14:18:16 -05:00
lib feat(admin): DB-backed integration toggles + sticky cols + dark contrast 2026-05-03 09:55:22 -04:00
migrations feat(admin): client scope — filter analytics to recurring-revenue companies 2026-05-03 11:40:47 -04:00
public feat(design): nav/visual overhaul — brand layer, /status route, KPI dashboard, TanStack DataTable 2026-05-03 09:33:13 -04:00
scripts feat: RMM Overshell, IT Glue audit/write-back, LogLift, link-aware bundles, dashboard overhaul 2026-05-03 07:13:18 -04:00
tasks feat: Duo Security integration — full data sync from Accounts + Admin API 2026-03-27 11:10:30 -04:00
.dockerignore Restructure: rename to Pulse and move app to root 2025-10-28 23:08:54 -04:00
.gitignore chore: remove build artifacts and update gitignore 2025-10-28 23:21:59 -04:00
.mcp.json feat(design): nav/visual overhaul — brand layer, /status route, KPI dashboard, TanStack DataTable 2026-05-03 09:33:13 -04:00
_clientMiddlewareManifest.json Restructure: rename to Pulse and move app to root 2025-10-28 23:08:54 -04:00
ADDIGY_API_GUIDE.md Add Addigy API integration and Docker deployment with Redis caching 2025-10-28 22:49:08 -04:00
ARCHITECTURE.md feat(design): nav/visual overhaul — brand layer, /status route, KPI dashboard, TanStack DataTable 2026-05-03 09:33:13 -04:00
AUTOTASK_API_GUIDE.md Add comprehensive admin features and multi-system integration 2025-11-19 14:18:16 -05:00
CLAUDE.md feat(admin): DB-backed integration toggles + sticky cols + dark contrast 2026-05-03 09:55:22 -04:00
components.json Restructure: rename to Pulse and move app to root 2025-10-28 23:08:54 -04:00
DESIGN.md feat: status popover + CSV export 2026-05-03 10:20:27 -04:00
docker-compose.yml feat: Veeam RPO analysis, comparison, ticket analysis + company teams table 2026-04-29 09:16:46 -04:00
DOCKER_README.md Restructure: rename to Pulse and move app to root 2025-10-28 23:08:54 -04:00
Dockerfile Restructure: rename to Pulse and move app to root 2025-10-28 23:08:54 -04:00
eslint.config.mjs Restructure: rename to Pulse and move app to root 2025-10-28 23:08:54 -04:00
favicon.0b3bf435.ico Restructure: rename to Pulse and move app to root 2025-10-28 23:08:54 -04:00
FIX_TICKET_SYNC.md Add comprehensive admin features and multi-system integration 2025-11-19 14:18:16 -05:00
get-config-text.js Add comprehensive admin features and multi-system integration 2025-11-19 14:18:16 -05:00
LCI_FEATURE_DESIGN.md feat: QuickBooks Online integration 2026-03-17 07:39:55 -04:00
mcp.json feat: add authentication, user management, and admin features 2026-01-31 12:43:14 -05:00
middleware.ts feat: RMM Overshell, IT Glue audit/write-back, LogLift, link-aware bundles, dashboard overhaul 2026-05-03 07:13:18 -04:00
next-development.log Restructure: rename to Pulse and move app to root 2025-10-28 23:08:54 -04:00
next-devtools-config.json Restructure: rename to Pulse and move app to root 2025-10-28 23:08:54 -04:00
next.config.ts Restructure: rename to Pulse and move app to root 2025-10-28 23:08:54 -04:00
package-lock.json feat(nav): global ⌘K command palette 2026-05-03 10:11:08 -04:00
package.json feat(nav): global ⌘K command palette 2026-05-03 10:11:08 -04:00
postcss.config.mjs Restructure: rename to Pulse and move app to root 2025-10-28 23:08:54 -04:00
POSTGRES_SYNC_SETUP.md Add comprehensive admin features and multi-system integration 2025-11-19 14:18:16 -05:00
PULSE_DATABASE_SKILL.md docs: refresh database skill — timezone (UTC), full picklist tables, updated row counts 2026-03-17 23:05:57 -04:00
README.md docs(analyzer): phase 8 — operator runbook 2026-04-29 11:05:46 -04:00
routes.d.ts Restructure: rename to Pulse and move app to root 2025-10-28 23:08:54 -04:00
test-config.js Add comprehensive admin features and multi-system integration 2025-11-19 14:18:16 -05:00
test-time-entry.js Add comprehensive admin features and multi-system integration 2025-11-19 14:18:16 -05:00
tsconfig.json Restructure: rename to Pulse and move app to root 2025-10-28 23:08:54 -04:00
vitest.config.ts feat: AI ticket analyzer (phases 1-6) 2026-04-29 10:59:40 -04:00

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 (or DATABASE_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 contributors
  • AUTOTASK_API_GUIDE.md, ADDIGY_API_GUIDE.md — credential setup
  • POSTGRES_SYNC_SETUP.md — database initialization
  • DOCKER_README.md — Docker workflow
  • PULSE_DATABASE_SKILL.md — diagnostic SQL queries
  • docs/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.