{
  "version": "2",
  "generatedAt": "2026-11-03T22:49:39.280Z",
  "listing": {
    "slug": "trycompai--crm",
    "name": "Comp AI CRM",
    "tagline": "Self-hosted CRM where a scheduled research agent keeps the records, tuned by four markdown skill files.",
    "shortTagline": "CRM kept by a research agent",
    "description": "An MIT-licensed CRM whose built-in agent runs on its own schedule, reads your mail threads and signature blocks, researches contacts, and writes only strongly evidenced facts back. Three deployments (Next.js app, NestJS tRPC API, agent) share one .env; the agent's behavior lives in prompt files you can edit. There is no token-authenticated API for an outside agent yet.",
    "capabilities": [
      "adaptable",
      "operable"
    ],
    "vertical": "smb-ops-crm",
    "alternativeTo": [
      "Attio",
      "HubSpot"
    ],
    "shape": "business-app",
    "formFactor": "web-app",
    "executionModel": "hybrid",
    "provenance": "unknown",
    "codeStack": {
      "languages": [
        "TypeScript"
      ],
      "frameworks": [
        "Next.js",
        "NestJS",
        "nestjs-trpc",
        "Prisma",
        "Better Auth",
        "eve"
      ],
      "packageManager": "bun",
      "database": [
        "PostgreSQL",
        "Redis (optional)"
      ],
      "hostingTarget": [
        "Vercel",
        "Docker"
      ]
    },
    "modelStack": {
      "providers": [
        "Vercel AI Gateway",
        "Perplexity (optional)",
        "Context (optional)"
      ],
      "models": [],
      "requiredKeys": [
        "AI_GATEWAY_API_KEY",
        "PERPLEXITY_API_KEY",
        "AGENT_BRIDGE_SECRET"
      ],
      "promptLocations": [
        "apps/agent/agent/instructions.md",
        "apps/agent/agent/skills/evidence.md",
        "apps/agent/agent/skills/identity-matching.md",
        "apps/agent/agent/skills/data-boundaries.md",
        "apps/agent/agent/skills/writing-a-brief.md",
        "apps/agent/agent/subagents/agent_runner/instructions.md"
      ],
      "tools": [
        "read_crm_history",
        "search_crm",
        "identify_contact",
        "research_person",
        "enrich_company",
        "record_fact",
        "schedule_recheck",
        "query_crm",
        "read_crm_record",
        "create_crm_activity",
        "post_slack_message"
      ]
    },
    "repos": [
      {
        "url": "https://github.com/trycompai/crm",
        "owner": "trycompai",
        "name": "crm",
        "license": "MIT",
        "stars": 9383,
        "lastCommit": "2026-09-02"
      }
    ],
    "interface": {
      "kind": "gui",
      "url": "https://github.com/trycompai/crm",
      "official": true,
      "hosted": "local"
    },
    "operability": "gui",
    "recommendedWrapper": null,
    "reach": [
      {
        "job": "Research and enrich a contact or company",
        "reachable": false,
        "evidence": "Runs on the bundled agent's schedule; no endpoint or token for an outside agent to trigger it"
      },
      {
        "job": "Read pipeline records",
        "reachable": false,
        "evidence": "tRPC router in apps/api sits behind a Better Auth IdP session cookie; README: 'there is no way to get a session from a terminal'"
      },
      {
        "job": "Write facts and activities to a record",
        "reachable": false,
        "evidence": "Same tRPC surface, same cookie-only auth; no API token or key flow documented"
      },
      {
        "job": "Talk to the agent about a contact",
        "reachable": false,
        "evidence": "Agent tab in the web app, guarded by AGENT_BRIDGE_SECRET; not an external endpoint"
      },
      {
        "job": "Sync Gmail or Microsoft mailboxes",
        "reachable": true,
        "evidence": "POST /internal/sync/mailboxes guarded by the CRON_SECRET env var, documented in README Deploying; the one non-interactive endpoint"
      },
      {
        "job": "Schedule a re-check on a person",
        "reachable": false,
        "evidence": "schedule_recheck is an internal agent tool, not exposed outside the agent"
      },
      {
        "job": "Manage sign-in allow-list and SSO",
        "reachable": true,
        "evidence": "ALLOWED_SIGN_IN env var; Settings → SSO in-app"
      }
    ],
    "editions": [
      {
        "name": "Free",
        "price": null,
        "open": true,
        "distributions": [
          {
            "kind": "source",
            "url": "https://github.com/trycompai/crm"
          },
          {
            "kind": "container",
            "url": "https://github.com/trycompai/crm/blob/release/docker-compose.yml"
          }
        ]
      }
    ],
    "skills": {
      "kind": "contributor",
      "paths": [
        ".agents/skills/ai-elements/SKILL.md"
      ],
      "install": null,
      "note": "One repo tooling skill for AI UI elements used by contributors."
    },
    "customization": {
      "summary": "One .env at the repo root feeds all three processes; the README table lists which values matter. Sign-in is an allow-list (ALLOWED_SIGN_IN) plus Google or Microsoft OAuth. The agent's judgement is prose in apps/agent/agent/skills/*.md and instructions.md, versioned like code; edit those to change what counts as evidence, how identities are matched, and what a brief looks like. Optional keys open more sources.",
      "envVars": [
        "DATABASE_URL",
        "BETTER_AUTH_SECRET",
        "ALLOWED_SIGN_IN",
        "GOOGLE_CLIENT_ID",
        "GOOGLE_CLIENT_SECRET",
        "MICROSOFT_CLIENT_ID",
        "MICROSOFT_CLIENT_SECRET",
        "MICROSOFT_TENANT_ID",
        "API_URL",
        "APP_URL",
        "AUTH_COOKIE_DOMAIN",
        "PERPLEXITY_API_KEY",
        "AI_GATEWAY_API_KEY",
        "AGENT_BRIDGE_SECRET",
        "REDIS_URL",
        "CRON_SECRET",
        "SLACK_CLIENT_ID",
        "SLACK_CLIENT_SECRET",
        "CRM_TELEMETRY_DISABLED"
      ],
      "configFiles": [
        ".env.example",
        "docker-compose.yml",
        "apps/agent/agent/schedules/dispatch.ts"
      ],
      "promptFiles": [
        "apps/agent/agent/instructions.md",
        "apps/agent/agent/skills/evidence.md",
        "apps/agent/agent/skills/identity-matching.md",
        "apps/agent/agent/skills/data-boundaries.md",
        "apps/agent/agent/skills/writing-a-brief.md"
      ],
      "effort": "config-only",
      "editCount": 27
    },
    "useWhen": [
      "I want a CRM that fills itself in from our inboxes instead of nagging reps to log calls",
      "I want to change what the research agent is allowed to look at and write, without rewriting the app"
    ],
    "accounts": [
      "Google Cloud OAuth client or Microsoft Entra app (at least one)",
      "Perplexity (optional)",
      "Context (optional)",
      "Vercel AI Gateway (optional)"
    ],
    "active": true,
    "lastActivity": "2026-09-02",
    "gotchas": [
      "No API tokens: every request needs an identity-provider session, so an outside agent has no documented way in",
      "Three separate deployments must agree on DATABASE_URL and BETTER_AUTH_SECRET or you get a redirect loop",
      "Microsoft client secrets expire (6 months default) and mail sync fails silently when they do",
      "Default branch is release, not main"
    ],
    "fit": {
      "adaptable": 3,
      "operable": 1
    },
    "evidence": {
      "formFactor": "README: Next.js app plus NestJS API plus agent deployment",
      "executionModel": "README The agent: model-driven research with a fixed dispatcher and evidence ledger; runs with no keys at all",
      "operability": "README (release branch): app talks to the API over tRPC; sign-in only through Google/Microsoft IdP, session cookie minted by Better Auth; no token, API key, or REST docs. Only non-interactive route is POST /internal/sync/mailboxes with CRON_SECRET. Screen control of the web app is the fallback.",
      "effort": "README Configuration table and .env.example; skills are markdown files in apps/agent/agent/skills",
      "editions": "README License: MIT; no paid edition found",
      "active": "GitHub pushedAt 2026-09-02"
    },
    "confidence": {
      "formFactor": 0.95,
      "executionModel": 0.9,
      "operability": 0.9,
      "effort": 0.9,
      "reach": 0.8,
      "editions": 0.8
    },
    "openQuestions": [
      "Is a token-authenticated API or MCP endpoint planned for outside agents?",
      "Which model does the agent call through AI_GATEWAY_API_KEY by default?",
      "Is trycrm.ai a hosted edition with pricing?"
    ],
    "sources": [
      {
        "url": "https://github.com/trycompai/crm",
        "foundBy": "sourcing:smb-ops-crm:github"
      },
      {
        "url": "https://trycrm.ai",
        "foundBy": "sourcing:smb-ops-crm:github"
      }
    ],
    "research": {
      "stage": "verified",
      "verdict": "dispute",
      "reason": "The tRPC API needs an IdP session cookie and the README says no session can be obtained from a terminal, so it is not an agent interface; the web app is drivable only by screen control. Adaptable case is unchanged and strong.",
      "disputed": [
        {
          "field": "operability",
          "reason": "Claimed official/api but the only API is tRPC behind cookie session auth with no token flow; downgraded to gui"
        }
      ]
    },
    "url": "apps/trycompai--crm.html",
    "coverage": "partial",
    "paid": false,
    "source": "research/verified/trycompai--crm.json"
  }
}
