Builds on the env-var INTEGRATIONS_DISABLED shipped with the nav-design overhaul. Adds a DB-backed admin UI so operators can flip integrations without editing .env and restarting the container, plus the remaining visual cleanup items from the design backlog. Integration toggles - Migration 081 — integration_settings table (key PK, disabled flag, reason, disabled_by audit, disabled_at). Seeded with all 13 known integrations as enabled. - GET / PATCH /api/admin/integrations — gated by requirePermission (admin, access). PATCH clears the in-process integration-health cache so toggles take effect within seconds. - /admin/integrations admin page with a Switch per integration, optional reason input, audit-info subtitle (disabled by, when, why), live status light from /api/dashboard/integration-health. - integration-health service merges env-var disable list with DB rows; degrades gracefully if migration unapplied / DB unreachable. - Wired into the Admin nav dropdown (eight items now). - CLAUDE.md describes both env + DB sources. Sticky first column on tables - Table primitive accepts stickyFirstColumn?: boolean. When true, TH and TD :first-child stay pinned during horizontal scroll, with background inheritance preserving hover and selected row tints. - DataTable exposes the prop too — on by default for paginated tables. - /addigy-devices opts in. Dark-mode contrast - --border lifted from 10% to 14% in .dark; --input from 15% to 18%; --sidebar-border to 14%. - StatusLight outline ring lifted from /10 to /15 (light) and /20 (dark). - DetailModal empty-cell em-dash lifted from /40 to /70 so missing values are legible on dark surfaces. DESIGN.md - Closed sticky-first-column, dark-mode contrast, and palette-audit items (palette deprioritized — most uses are semantic). - Skeleton helpers documented as preferred for new code; existing ad-hoc patterns left in place. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .firecrawl | ||
| .windsurf/workflows | ||
| 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.