Skip to content

kasas

A financial ledger that can power all kinds of apps.

kasas is a self-hosted, single-binary Go service that ingests your financial data through pluggable sources — SimpleFIN, Teller, Plaid, Bitcoin, Ethereum, and CSV file import today — into a local SQLite (or Postgres) database and turns it into a programmable substrate: a REST API, a built-in MCP server, a canonical event stream, outbound webhooks, and sandboxed plugins.

It is deliberately not another Mint, budgeting app, or financial planner. It is the ledger those apps are built on — and a lot more. kasas owns the boring, load-bearing parts (connecting to your accounts, deduping and refreshing transactions, a durable history of every change, an extensible metadata model) so that anything you or anyone else builds on top — budgeting, tax, fraud detection, forecasting, notifications, dashboards, AI agents — starts from clean, queryable, event-driven data.

flowchart LR
    SRC([Sources · SimpleFIN · Teller · Plaid · Bitcoin · Ethereum · CSV]):::ext

    subgraph K["kasas — the ledger"]
        direction TB
        SYNC[Ingestion engine]
        DB[(SQLite / Postgres)]
        CORE[["Core primitives<br/>labels · extensions · relationships<br/>search · rules · history"]]
        EV[(Canonical<br/>event stream)]
        SYNC --> DB --> CORE --> EV
    end

    SRC -->|ingest| SYNC

    K --> REST[REST API]
    K --> MCP[MCP server]
    K --> DASH[Web dashboard]
    EV --> WH[Webhooks]
    EV --> PL[Plugins]

    REST --> APPS
    MCP --> APPS
    DASH --> USER([You])
    WH --> APPS
    PL --> APPS

    APPS([Budgeting · Tax · Fraud · Forecasting · Notifiers · Agents]):::apps

    classDef ext stroke:#5b7fa6,stroke-width:1px;
    classDef apps stroke:#29a8cc,stroke-width:2px;

What you get

  • Pluggable sources


    A source SDK normalizes any provider into one neutral shape; a generic engine persists it. SimpleFIN, Teller, Plaid, Bitcoin, Ethereum, and CSV file import ship today.

    Ingestion & sources

  • Automatic sync


    A background scheduler polls the configured source, inserts new transactions by id, and refreshes source-owned fields — while always preserving your labels.

    Sync pipeline

  • SQLite or Postgres


    Zero-dependency embedded SQLite by default, or point it at Postgres with one config change. Same static binary, no CGO.

    Data model

  • Labels, extensions & relationships


    Strict key:value labels for categorization, arbitrary namespaced JSON extensions any app can attach, and explicit relationships linking a refund to its purchase or one leg of a transfer to the other.

    Labels · Extensions · Relationships

  • Powerful search


    One query language over every field and label/extension combination, with AND/OR/NOT, ranges, and grouping — reused across REST, MCP, and the UI.

    Search

  • Rules engine


    if <query> then apply <labels> — auto-applied to every new transaction and runnable on demand over your history.

    Rules

  • Event stream & history


    An append-only, replayable log of everything that changes, plus an immutable full-snapshot history per transaction.

    Events · History

  • Webhooks & plugins


    Push HMAC-signed events to your services, or run sandboxed plugins in-process (Lua, JS/TS, or Go via WASM) that react to the same events — the integration surface.

    Webhooks · Plugins

  • REST + MCP + dashboard


    Three surfaces over one core. Drive kasas from code, from an AI agent over MCP, or from the built-in WebAssembly dashboard.

    REST · MCP · Dashboard

Start here

  • Quick Start


    Run kasas in under a minute with Docker, claim a SimpleFIN token, and see your accounts sync.

    Get started

  • Architecture


    The platform thesis, the system design, the event-driven core, and the data model — with diagrams.

    How it works

  • Build on it


    The event stream, webhooks, plugins, and MCP are the seams you extend kasas through. Start from the philosophy.

    Philosophy