Markdown Converter
Agent skill for markdown-converter
This file provides guidance to Claude Code (claude.ai/code) when working with the VEAGA codebase.
Sign in to like and favorite skills
This file provides guidance to Claude Code (claude.ai/code) when working with the VEAGA codebase.
VEAGA is a multi-tenant SaaS platform that enables nonprofit gift officers and donor concierges to scale authentic donor relationships through AI-powered engagement flows with human-in-the-loop governance.
Scale personal donor relationships from ~50 to 100+ donors per officer while maintaining authenticity, compliance, and human oversight through visual donor engagement flows.
This is a TurboStarter-based monorepo with embedded Flowise for donor engagement flow execution. The platform uses pnpm workspaces, Turbo, and Next.js with specialized nonprofit functionality.
apps/web: Next.js 15 dashboard with embedded Flowise canvas for donor engagement flowsapps/mobile: React Native app for mobile donor managementapps/extension: Browser extension for CRM integrationpackages/db: Multi-tenant database with donor flow schema using Drizzle ORMpackages/api: Hono-based API with Flowise integration and tenant isolationpackages/flowise-client: Integration layer for embedded Flowise instancepackages/auth: Multi-tenant authentication with organization-based accesspackages/billing: Usage-based billing for flow executions and AI tokenspackages/ui: Donor engagement UI components and flow canvas integrationpackages/email: Email templates for donor communicationspackages/storage: Document storage for knowledge bases and donor filesflow-templates/)# Install dependencies pnpm install # Start all services (PostgreSQL + embedded Flowise) pnpm services:start # Run database migrations and setup pnpm services:setup # Initialize Flowise with custom donor nodes pnpm flowise:setup # Copy .env.example to .env and configure cp .env.example .env
# Start all development servers (Web + Mobile + Extension + Flowise) pnpm dev # Start specific services pnpm --filter web dev # Web app with embedded canvas on http://localhost:3000 pnpm --filter mobile dev # Mobile app with Expo pnpm --filter extension dev # Browser extension pnpm services:start:flowise # Embedded Flowise service on http://localhost:3001 # VEAGA-specific development pnpm dev:flows # Flow template development and testing pnpm dev:canvas # Canvas integration development # Build all apps pnpm build # Type checking pnpm typecheck # Linting pnpm lint pnpm lint:fix # Formatting pnpm format pnpm format:fix # Clean build artifacts pnpm clean
# Generate migrations after schema changes (donor flows, approvals, etc.) pnpm with-env -F @veaga/db generate # Apply migrations (includes donor engagement schema) pnpm with-env -F @veaga/db migrate # Push schema changes directly (safe envs only) pnpm with-env -F @veaga/db push # Check schema drift pnpm with-env -F @veaga/db check # Open Drizzle Studio for database inspection pnpm with-env -F @veaga/db studio # First-time setup with VEAGA schema pnpm --filter @veaga/db setup
# Start embedded Flowise service pnpm services:start:flowise # Deploy custom donor engagement nodes pnpm flowise:deploy-nodes # Sync flow templates to Flowise pnpm flowise:sync-templates # Update Flowise configuration pnpm flowise:configure # View Flowise logs pnpm services:logs:flowise # Reset Flowise instance (development only) pnpm flowise:reset
# Start all services (PostgreSQL + Flowise) pnpm services:start # Stop all services pnpm services:stop # View service logs pnpm services:logs # Check service status pnpm services:status # Start specific services pnpm services:start:db # PostgreSQL only pnpm services:start:flowise # Embedded Flowise only
# Flow template validation pnpm test:flows # Multi-tenant isolation tests pnpm test:tenancy # Embedded Flowise integration tests pnpm test:flowise # Donor engagement node tests pnpm test:nodes # End-to-end flow execution tests pnpm test:e2e # Package-specific tests pnpm --filter [package-name] test # Run specific test file pnpm --filter [package-name] test [test-file-path]
The monorepo uses Node.js 22.17+ (pnpm 10.15.x) and requires the following environment variables:
DATABASE_URL: PostgreSQL connection string for multi-tenant dataPRODUCT_NAME: "VEAGA" - Virtual Engagement and Giving AssistantURL: Web application URL for tenant isolationDEFAULT_LOCALE: Default locale for internationalizationFLOWISE_INTERNAL_URL: Internal Flowise service URL (e.g., http://localhost:3001)FLOWISE_DATABASE_URL: Dedicated Flowise database connectionFLOWISE_ADMIN_PASSWORD: Admin password for Flowise managementFLOWISE_SECRET_KEY: Secret key for Flowise API authenticationESP_PROVIDER: Email service provider (sendgrid|mailgun|ses)SMS_PROVIDER: SMS service provider (twilio)CRM_PROVIDER: CRM integration (salesforce|bloomerang|neoncrm)QUIET_HOURS_START: Default quiet hours start time (21:00)QUIET_HOURS_END: Default quiet hours end time (09:00)MAX_DAILY_SENDS: Default maximum daily sends per donor (5)CONSENT_REQUIRED: Require explicit consent for all communications (true)Each app may have additional
.env requirements - check their respective directories.
The web application uses Hono-based API routes through the
@veaga/api package with organization-scoped endpoints. All API calls are tenant-isolated and use Zod for validation.
Database models are defined in
packages/db/src/schema/ using Drizzle ORM with specialized tables:
Authentication is centralized in
packages/auth with organization-based access control:
Specialized Flowise nodes for nonprofit use cases:
approvalNode for HITL governancesegmentAnalyzer, lapseAnalyzer, impactCalculatoremailSender, smsSender, voiceCallerdonorLookup, recordUpdater, activityLoggerquietHoursChecker, consentValidator, frequencyCapperisLoading, hasError)flow-templates/ with descriptive JSON structurepackages/flowise-nodes/ with proper TypeScript typespackages/*Web Dashboard (Next.js):
use client, useEffect, setStateMobile App (React Native/Expo):
SafeAreaProvider and SafeAreaView for safe areasuseState/useEffect; use memoizationexpo-image with WebP formatExtension (WXT):
flow-templates/[name].jsonpnpm test:flows to validate flow structurepnpm flowise:sync-templatespackages/flowise-nodes/pnpm flowise:deploy-nodes to add to embedded instanceorganizationId in all queriespnpm install at the root, never in individual packagespnpm --filter [package-name] or pnpm -F [package-name] for specific packagespnpm flowise:sync-templates to update embedded instancepnpm-workspace.yamlpnpm clean if you encounter issues.env via with-envany and unsafe casts