{
  "version": "2",
  "generatedAt": "2026-11-03T22:49:39.280Z",
  "listing": {
    "slug": "cdinnison--ray-finance",
    "name": "Ray Finance",
    "tagline": "Local-first AI financial advisor CLI over Plaid or Bridge bank data, bring your own model.",
    "shortTagline": "AI financial advisor CLI",
    "description": "Ray syncs bank accounts through Plaid (US/CA) or Bridge (EU) into an encrypted SQLite file and answers 'can I afford this' from a persistent context file about your goals. Dashboard commands (status, spending, budgets, goals, alerts) are deterministic; the chat calls your chosen model with PII masked. Free with your own keys; a $10/month Pro edition supplies the keys.",
    "capabilities": [
      "adaptable",
      "operable"
    ],
    "vertical": "invoicing-finance",
    "alternativeTo": [
      "Copilot Money",
      "Monarch Money"
    ],
    "shape": "agent-workflow",
    "formFactor": "cli",
    "executionModel": "hybrid",
    "provenance": "unknown",
    "codeStack": {
      "languages": [
        "TypeScript"
      ],
      "frameworks": [],
      "packageManager": "npm",
      "database": [
        "SQLite (SQLCipher)"
      ],
      "hostingTarget": [
        "local machine",
        "Docker"
      ]
    },
    "modelStack": {
      "providers": [
        "Anthropic",
        "OpenAI",
        "Ollama",
        "any OpenAI-compatible endpoint"
      ],
      "models": [],
      "requiredKeys": [
        "RAY_PROVIDER",
        "RAY_MODEL",
        "ANTHROPIC_API_KEY",
        "OPENAI_COMPATIBLE_KEY",
        "OPENAI_COMPATIBLE_BASE_URL"
      ],
      "promptLocations": [
        "~/.ray/context.md"
      ],
      "tools": [
        "add_recat_rule",
        "budgets",
        "goals",
        "alerts",
        "scoring"
      ]
    },
    "repos": [
      {
        "url": "https://github.com/cdinnison/ray-finance",
        "owner": "cdinnison",
        "name": "ray-finance",
        "license": "MIT",
        "stars": 301,
        "lastCommit": "2026-08-01"
      }
    ],
    "interface": {
      "kind": "cli",
      "url": "https://github.com/cdinnison/ray-finance#commands",
      "official": true,
      "hosted": "local"
    },
    "operability": "official",
    "recommendedWrapper": null,
    "reach": [
      {
        "job": "Link bank accounts",
        "reachable": false,
        "evidence": "ray link opens Plaid Link or Bridge in a browser and needs the human to authenticate"
      },
      {
        "job": "Sync transactions and balances",
        "reachable": true,
        "evidence": "ray sync; scheduled by launchd or cron"
      },
      {
        "job": "Financial dashboard, accounts, transactions",
        "reachable": true,
        "evidence": "ray status, ray accounts, ray transactions (filterable)"
      },
      {
        "job": "Spending breakdown and monthly recap",
        "reachable": true,
        "evidence": "ray spending [period], ray recap [period]"
      },
      {
        "job": "Budgets and goals",
        "reachable": true,
        "evidence": "ray budgets, ray goals"
      },
      {
        "job": "Daily score, streaks and alerts",
        "reachable": true,
        "evidence": "ray score, ray alerts"
      },
      {
        "job": "Ask the advisor a question",
        "reachable": null,
        "evidence": "ray starts an interactive chat; no documented one-shot or piped prompt mode"
      },
      {
        "job": "Import Apple Card CSV and manual accounts",
        "reachable": true,
        "evidence": "ray import-apple <path>, ray add"
      },
      {
        "job": "Backup and restore",
        "reachable": true,
        "evidence": "ray export, ray import"
      }
    ],
    "editions": [
      {
        "name": "Bring your own keys",
        "price": null,
        "open": true,
        "distributions": [
          {
            "kind": "source",
            "url": "https://github.com/cdinnison/ray-finance"
          },
          {
            "kind": "installable",
            "url": "https://www.npmjs.com/package/ray-finance",
            "command": "npm install -g ray-finance"
          }
        ]
      },
      {
        "name": "Pro (managed keys)",
        "price": {
          "amount": 10,
          "currency": "USD",
          "period": "month"
        },
        "open": false,
        "distributions": [
          {
            "kind": "hosted",
            "url": "https://rayfinance.app"
          }
        ]
      }
    ],
    "skills": {
      "kind": "none",
      "paths": [],
      "install": null,
      "note": "No SKILL.md, Claude Code plugin, or skills install target in the repo."
    },
    "customization": {
      "summary": "Pick the model provider and model in .env or ~/.ray/config.json, add Plaid or Bridge credentials, and edit ~/.ray/context.md, the persistent profile the advisor reads before every answer. That file is where an Adopter changes the advice: household, goals, strategy, rules.",
      "envVars": [
        "RAY_PROVIDER",
        "RAY_MODEL",
        "ANTHROPIC_API_KEY",
        "OPENAI_COMPATIBLE_KEY",
        "OPENAI_COMPATIBLE_BASE_URL",
        "PLAID_CLIENT_ID",
        "PLAID_SECRET",
        "PLAID_ENV",
        "PLAID_REDIRECT_URI",
        "PLAID_OPTIONAL_PRODUCTS",
        "BRIDGE_CLIENT_ID",
        "BRIDGE_CLIENT_SECRET",
        "DB_ENCRYPTION_KEY",
        "PLAID_TOKEN_SECRET",
        "RAY_PORT"
      ],
      "configFiles": [
        "~/.ray/config.json",
        ".env"
      ],
      "promptFiles": [
        "~/.ray/context.md"
      ],
      "effort": "config-only",
      "editCount": 18
    },
    "useWhen": [
      "I want a money advisor that knows my situation and runs on my laptop with a model I choose",
      "I want cron to sync my banks and my agent to read spending and budget status from the CLI"
    ],
    "accounts": [
      "Plaid developer account (US/CA) or Bridge (EU)",
      "LLM provider account, or Ray Pro"
    ],
    "active": true,
    "lastActivity": "2026-08-01",
    "gotchas": [
      "Plaid OAuth banks (Chase, Capital One) need PLAID_REDIRECT_URI registered in the Plaid dashboard",
      "Plaid production access requires Plaid approval; sandbox only gives fake data",
      "The chat is interactive; there is no documented non-interactive prompt flag for agents"
    ],
    "fit": {
      "adaptable": 3,
      "operable": 2
    },
    "evidence": {
      "formFactor": "npm CLI, ray command table in README",
      "executionModel": "dashboard commands are deterministic; chat calls an LLM with tools (README How It Works)",
      "operability": "official CLI from the Builder; no MCP or API",
      "effort": "README Configuration section names env vars, config.json and context.md",
      "editions": "README: bring-your-own-keys free forever; Pro $10/mo with Stripe checkout",
      "active": "GitHub pushedAt 2026-08-01; HN comments May 2026"
    },
    "confidence": {
      "formFactor": 0.95,
      "executionModel": 0.9,
      "operability": 0.85,
      "effort": 0.9,
      "reach": 0.8,
      "editions": 0.85
    },
    "openQuestions": [
      "Whether ray accepts a prompt argument or stdin for non-interactive advisor calls",
      "Is context.md safe to edit by hand or only through the self-updating flow"
    ],
    "sources": [
      {
        "url": "https://github.com/cdinnison/ray-finance",
        "foundBy": "sourcing:invoicing-finance:community"
      },
      {
        "url": "https://www.npmjs.com/package/ray-finance",
        "foundBy": "analysis:invoicing-finance"
      }
    ],
    "research": {
      "stage": "verified",
      "verdict": "unverified",
      "reason": "Config-only with a real prompt file (context.md); official CLI with partial Reach since bank linking and chat are interactive.",
      "disputed": []
    },
    "url": "apps/cdinnison--ray-finance.html",
    "coverage": "partial",
    "paid": true,
    "source": "research/verified/cdinnison--ray-finance.json"
  }
}
