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.
-
Automatic sync
A background scheduler polls the configured source, inserts new transactions by id, and refreshes source-owned fields — while always preserving your labels.
-
SQLite or Postgres
Zero-dependency embedded SQLite by default, or point it at Postgres with one config change. Same static binary, no CGO.
-
Labels, extensions & relationships
Strict
key:valuelabels 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. -
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. -
Rules engine
if <query> then apply <labels>— auto-applied to every new transaction and runnable on demand over your history. -
Event stream & history
An append-only, replayable log of everything that changes, plus an immutable full-snapshot history per transaction.
-
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.
-
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.
Start here¶
-
Quick Start
Run kasas in under a minute with Docker, claim a SimpleFIN token, and see your accounts sync.
-
Architecture
The platform thesis, the system design, the event-driven core, and the data model — with diagrams.
-
Build on it
The event stream, webhooks, plugins, and MCP are the seams you extend kasas through. Start from the philosophy.
