No description
Find a file
lorentz a0a6e7f192 fix(itglue): list flexible assets per type to satisfy API 422 requirement
IT Glue's /flexible_assets endpoint refuses requests without a
filter[flexible-asset-type-id] (returns 422 "Cannot index flexible
assets without providing a flexible asset type ID filter"). The
analyzer's Stage 2 search was caught and tolerated, but never returned
docs.

Added getFlexibleAssetsForOrganization(orgId) on ITGlueClient. It
fetches the type list once per process (memoized), then fans out
per-type fetches with Promise.allSettled so a permission-restricted
type doesn't poison the whole org. Wired into itglue-search and
aggregate-persistence.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 14:48:53 -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 fix(analyzer): priorities has no is_deleted column 2026-04-29 14:36:22 -04:00
components fix(analyzer): multi-select option click swallowed by nested Radix button 2026-04-29 14:26:50 -04:00
dev feat: AI ticket analyzer (phases 1-6) 2026-04-29 10:59:40 -04:00
docs feat(analyzer): Phase 2 — full stage persistence, fingerprints, aggregate reports, cost guards 2026-04-29 14:00:22 -04:00
hooks Add comprehensive admin features and multi-system integration 2025-11-19 14:18:16 -05:00
lib fix(itglue): list flexible assets per type to satisfy API 422 requirement 2026-04-29 14:48:53 -04:00
migrations feat(analyzer): Phase 2 — full stage persistence, fingerprints, aggregate reports, cost guards 2026-04-29 14:00:22 -04:00
public fix: add missing favicons for SentinelOne, IT Glue, Mimecast 2026-04-01 06:48:36 -04:00
scripts feat(analyzer): Phase 2 — full stage persistence, fingerprints, aggregate reports, cost guards 2026-04-29 14:00:22 -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
_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
AUTOTASK_API_GUIDE.md Add comprehensive admin features and multi-system integration 2025-11-19 14:18:16 -05:00
CLAUDE.md feat: AI ticket analyzer (phases 1-6) 2026-04-29 10:59:40 -04:00
components.json Restructure: rename to Pulse and move app to root 2025-10-28 23:08:54 -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: Veeam RPO analysis, comparison, ticket analysis + company teams table 2026-04-29 09:16:46 -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(analyzer): Phase 2 — full stage persistence, fingerprints, aggregate reports, cost guards 2026-04-29 14:00:22 -04:00
package.json feat(analyzer): Phase 2 — full stage persistence, fingerprints, aggregate reports, cost guards 2026-04-29 14:00:22 -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.