No description
Find a file
lorentz 9bfb57553d feat(design): nav/visual overhaul — brand layer, /status route, KPI dashboard, TanStack DataTable
Major UI refresh on the nav-design-improvements branch.  Drops 2013-era
inline styles and consolidates patterns behind shared primitives.

Foundation
- New Wulf brand layer in app/styles/brand.css repointing --primary to
  the standards-guide blue (#0075AD) with utility classes for numerics
  (.num / .num-lg / .num-xl), metric labels, surface tints, and the
  wolf-mark watermark
- Switch primary face to IBM Plex Sans + IBM Plex Mono via next/font;
  Helvetica/Arial stays in the fallback chain for brand fidelity
- Wordmark subtitle changed from "PSA Management System" to
  "Operations console" everywhere it appeared
- Tagline footer ("Don't be afraid to cry") on every non-mobile page

Status moved out of /dashboard
- New /status route with integration tiles grouped by category, sync
  health table, worker pulse cards (analyzer / RMM / sync scheduler),
  token-expiry section, conditional alert banner
- Top-bar StatusIndicator polls integration health every 60s and links
  to /status
- INTEGRATIONS_DISABLED env var suppresses operator-disabled
  integrations (e.g. SentinelOne) — no failure noise from broken-on-
  purpose entries.  Aliases supported (sentinelone → s1, etc.)

Dashboard rebuilt around KPIs
- /api/dashboard/overview adds today snapshot (opened, resolved, open
  total, SLA breaches) with delta math
- /api/dashboard/trends backs queue × priority heatmap, 30-day volume
  area chart, 30-day mean resolution time line chart, today's active
  engineers leaderboard

Components
- StatusBadge driven by lib/status-registry.ts (priority, ticket
  status, classification, source, company type, publish, active /
  yes-no / billable / approved registries)
- StatusLight (8px geometric square, five states, three sizes)
- EmptyState (shared dashed panel with icon + headline + optional CTA)
- KpiCard with delta indicator and tonal left border
- WulfMark (mark / wordmark variants from /public/branding)
- Skeleton helpers (SkeletonRow / Rows / Card / Chart / Header / Table)

Navigation
- Admin flat link → dropdown with seven shortcuts
- New UserMenu (initials avatar, role badge, settings + sign-out)
- Active-route highlight is now a 2px Wulf-blue underline echoing the
  PageHeader rule (consistent across flat links and submenu triggers);
  active children inside dropdowns use bg-primary/10
- Submenu width is content-driven (min-w 320 / max-w 440, single col)
- Mobile hamburger via Sheet, reuses the same nav config

Pages migrated
- 16 admin sub-pages adopt PageHeader (with accent prop)
- /addigy-devices: shadcn Table + Checkbox; PageHeader; status badges
- 10 raw <table> blocks across admin/sync/* migrated to shadcn Table
- /veeam-analysis migrated to shadcn Table (kept its expansion logic)
- Detail routes (analyzer ticket, analyzer analysis) get breadcrumbs

DataTable
- Rewritten on @tanstack/react-table v8 in manual mode; external API
  unchanged so all 10+ data-browser pages keep working
- New optional props for drill-down rows: getRowCanExpand + renderSubRow

Mobile
- Multi-select Popover gets max-w-[calc(100vw-1rem)] and
  collisionPadding so dropdowns can't overflow narrow viewports
- CI filter bar wraps and shrinks; stat pill flows below

Docs
- New ARCHITECTURE.md (load-bearing reference for runtime, data flow,
  workers, analyzer pipeline, auth, deployment, gotchas)
- New DESIGN.md (tokens, layout, navigation IA, component vocabulary,
  rolling backlog of remaining cleanup)
- CLAUDE.md refreshed with pointers to the two new docs and the
  INTEGRATIONS_DISABLED operator config note
- shadcn registry registered as project-level MCP server (.mcp.json)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 09:33:13 -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(design): nav/visual overhaul — brand layer, /status route, KPI dashboard, TanStack DataTable 2026-05-03 09:33:13 -04:00
components feat(design): nav/visual overhaul — brand layer, /status route, KPI dashboard, TanStack DataTable 2026-05-03 09:33:13 -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(design): nav/visual overhaul — brand layer, /status route, KPI dashboard, TanStack DataTable 2026-05-03 09:33:13 -04:00
migrations feat: RMM Overshell, IT Glue audit/write-back, LogLift, link-aware bundles, dashboard overhaul 2026-05-03 07:13:18 -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(design): nav/visual overhaul — brand layer, /status route, KPI dashboard, TanStack DataTable 2026-05-03 09:33:13 -04:00
components.json Restructure: rename to Pulse and move app to root 2025-10-28 23:08:54 -04:00
DESIGN.md feat(design): nav/visual overhaul — brand layer, /status route, KPI dashboard, TanStack DataTable 2026-05-03 09:33:13 -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(design): nav/visual overhaul — brand layer, /status route, KPI dashboard, TanStack DataTable 2026-05-03 09:33:13 -04:00
package.json feat(design): nav/visual overhaul — brand layer, /status route, KPI dashboard, TanStack DataTable 2026-05-03 09:33:13 -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.