{
  "version": "2",
  "generatedAt": "2026-11-03T22:49:39.280Z",
  "listing": {
    "slug": "kirill-markin--expense-budget-tracker",
    "name": "Expense Budget Tracker",
    "tagline": "Self-hosted expense and budget tracker on Postgres with an OAuth MCP server and a SQL agent API.",
    "shortTagline": "Self-hosted with MCP",
    "description": "A personal finance tracker built for agents: a flat Postgres schema, a hosted MCP server (list_workspaces, get_schema, sql_query, sql_execute) with OAuth scopes, and an API-key SQL endpoint so Claude Code or Codex can parse bank statements and insert transactions. MIT, deployable with Docker Compose or AWS CDK; a free hosted instance exists.",
    "capabilities": [
      "adaptable",
      "operable"
    ],
    "vertical": "invoicing-finance",
    "alternativeTo": [
      "YNAB"
    ],
    "shape": "product",
    "formFactor": "web-app",
    "executionModel": "deterministic",
    "provenance": "mixed",
    "codeStack": {
      "languages": [
        "TypeScript"
      ],
      "frameworks": [
        "Next.js"
      ],
      "packageManager": "npm",
      "database": [
        "PostgreSQL"
      ],
      "hostingTarget": [
        "Docker Compose",
        "AWS (CDK, ECS, RDS, Cognito)"
      ]
    },
    "modelStack": {
      "providers": [
        "OpenAI (optional in-app chat)"
      ],
      "models": [],
      "requiredKeys": [
        "OPENAI_API_KEY",
        "LANGFUSE_PUBLIC_KEY",
        "LANGFUSE_SECRET_KEY"
      ],
      "promptLocations": [],
      "tools": []
    },
    "repos": [
      {
        "url": "https://github.com/kirill-markin/expense-budget-tracker",
        "owner": "kirill-markin",
        "name": "expense-budget-tracker",
        "license": "MIT",
        "stars": 30,
        "lastCommit": "2026-09-02"
      }
    ],
    "interface": {
      "kind": "mcp",
      "url": "https://mcp.expense-budget-tracker.com/mcp",
      "official": true,
      "hosted": "both"
    },
    "operability": "official",
    "recommendedWrapper": null,
    "reach": [
      {
        "job": "Record and query transactions",
        "reachable": true,
        "evidence": "sql_query and sql_execute on ledger_entries (README curl examples)"
      },
      {
        "job": "Balances and transfers across accounts",
        "reachable": true,
        "evidence": "flat table schema exposed by get_schema; README feature list"
      },
      {
        "job": "Budgets by category",
        "reachable": true,
        "evidence": "budget tables reachable through sql_query; UI built on the same schema"
      },
      {
        "job": "Multi-currency reporting",
        "reachable": true,
        "evidence": "exchange_rates table filled by the worker; queries in SQL"
      },
      {
        "job": "Import bank statements, screenshots and PDFs",
        "reachable": true,
        "evidence": "README Agent API step 4: the agent parses files and inserts through the execute endpoint"
      },
      {
        "job": "Workspace management",
        "reachable": null,
        "evidence": "list_workspaces and select exist; creating workspaces over MCP not documented"
      },
      {
        "job": "Sign up and issue credentials",
        "reachable": true,
        "evidence": "GET api.expense-budget-tracker.com/v1/ discovers the email OTP flow for agents"
      }
    ],
    "editions": [
      {
        "name": "Self-hosted",
        "price": null,
        "open": true,
        "distributions": [
          {
            "kind": "source",
            "url": "https://github.com/kirill-markin/expense-budget-tracker",
            "command": "make up"
          }
        ]
      },
      {
        "name": "Hosted",
        "price": null,
        "open": false,
        "distributions": [
          {
            "kind": "hosted",
            "url": "https://app.expense-budget-tracker.com"
          }
        ]
      }
    ],
    "skills": {
      "kind": "none",
      "paths": [],
      "install": null,
      "note": "No SKILL.md, Claude Code plugin, or skills install target in the repo."
    },
    "customization": {
      "summary": "Local run is make up with the .env: three Postgres roles, AUTH_MODE none for local or cognito for anything public, OAuth issuer and MCP resource URLs, optional OpenAI and Langfuse for in-app chat. A public deployment follows the AWS CDK guide; server.json describes the MCP server for the registry.",
      "envVars": [
        "DATABASE_URL",
        "MIGRATION_DATABASE_URL",
        "AUTH_DATABASE_URL",
        "AUTH_MODE",
        "HOST",
        "CORS_ORIGIN",
        "AUTH_DOMAIN",
        "COOKIE_DOMAIN",
        "OAUTH_ISSUER",
        "OAUTH_RESOURCE",
        "COGNITO_USER_POOL_ID",
        "COGNITO_CLIENT_ID",
        "SESSION_ENCRYPTION_KEY",
        "OPENAI_API_KEY",
        "RESEND_API_KEY"
      ],
      "configFiles": [
        ".env",
        "server.json",
        "infra/aws"
      ],
      "promptFiles": [],
      "effort": "config-only",
      "editCount": 18
    },
    "useWhen": [
      "I want my coding agent to file my expenses from bank exports with SQL it can inspect",
      "I want a budget tracker whose MCP works with any remote MCP client over OAuth"
    ],
    "accounts": [
      "AWS account with Cognito for an authenticated self-host",
      "OpenAI (optional chat)",
      "Resend (email OTP on self-host)"
    ],
    "active": true,
    "lastActivity": "2026-09-02",
    "gotchas": [
      "Authenticated mode requires AWS Cognito; AUTH_MODE=none is local-only",
      "The hosted instance sends chat data to OpenAI and Langfuse; the README says so plainly",
      "Real-software signal is thin: 30 stars, all 100 issues filed by the maintainer, no pricing on the hosted edition"
    ],
    "fit": {
      "adaptable": 2,
      "operable": 3
    },
    "evidence": {
      "formFactor": "web UI plus MCP and HTTP SQL API (README)",
      "executionModel": "tracker is deterministic; optional chat feature calls OpenAI",
      "operability": "MCP served on the Builder's domain and implemented in apps/sql-api per server.json; MCP Registry name com.expense-budget-tracker/expense-budget-tracker",
      "effort": ".env.example documents local and AWS variables; server.json in repo",
      "editions": "README and site: open source self-host plus hosted app; no pricing page found",
      "active": "GitHub pushedAt 2026-09-02; Show HN 2026-03-02; 1,052 commits"
    },
    "confidence": {
      "formFactor": 0.9,
      "executionModel": 0.85,
      "operability": 0.9,
      "effort": 0.8,
      "reach": 0.75,
      "editions": 0.7
    },
    "openQuestions": [
      "Gate 3 is borderline: passes on the Show HN thread and hosted product, but there is no external user evidence in issues; Curator to confirm",
      "Whether the hosted edition will stay free"
    ],
    "sources": [
      {
        "url": "https://github.com/kirill-markin/expense-budget-tracker",
        "foundBy": "sourcing:invoicing-finance:community"
      },
      {
        "url": "https://expense-budget-tracker.com/docs/mcp-connector/",
        "foundBy": "analysis:invoicing-finance"
      },
      {
        "url": "https://github.com/kirill-markin/expense-budget-tracker/blob/main/server.json",
        "foundBy": "analysis:invoicing-finance"
      }
    ],
    "research": {
      "stage": "verified",
      "verdict": "unverified",
      "reason": "Official hosted MCP with SQL-level Reach. Adaptable 2 because a public self-host needs AWS Cognito, which is more than config for most Adopters. Real-software gate flagged.",
      "disputed": [
        "gate 3 real-software: triage said pass on hosted pricing; no pricing exists"
      ]
    },
    "url": "apps/kirill-markin--expense-budget-tracker.html",
    "coverage": "partial",
    "paid": false,
    "source": "research/verified/kirill-markin--expense-budget-tracker.json"
  }
}
