ynai · for YNAB
What this server
does with your data.
Last updated 2026-09-18.
Short version: it passes your YNAB data to the AI app you connected, when that app asks for it, and keeps none of it.
What it's for, and nothing else
This server exists so an AI assistant you have connected — Claude, ChatGPT, Claude Code or Cursor — can answer your questions about your own YNAB plans, and so Kevin HG's household money page can refresh its own figures. Your data is used for those two purposes and no others. It is never used to train anything, never analysed in aggregate, never sold, and never looked at for any other reason.
Why read-only
The connection is made with YNAB's read-only scope, which YNAB enforces at its own end: a read-only token gets 403 Forbidden on any attempt to add, change or delete anything. So this server cannot alter your plans even if it tried, and neither can the assistant. Read-only is all it asks for because reading is all it needs to do — answering questions.
What is stored, where, and for how long
- The connection. YNAB's access token and refresh token, held inside the OAuth grant and encrypted with a key of their own that is itself locked by that connection's own token — so they can only be unlocked by a request that already carries the connection's credential. They live in Cloudflare Workers KV on Kevin HG's personal Cloudflare account, and expire one year after you connect (sooner if you disconnect). After that the assistant asks you to sign in at YNAB again.
- A little about the connection, not about you. Which app connected, when, and a one-way hash of your YNAB user id. No name, no email address, no plan names.
- Request logs, for seven days. Cloudflare's own Workers logs, kept seven days on this account's plan and then deleted automatically. Two kinds of line land there. The ones this server writes say what happened (a tool ran, a refresh succeeded) with secrets and anything YNAB-id-shaped masked first; they carry the one-way hash of your YNAB account, never your balances, transactions or payees. Cloudflare also records each request by itself: the method, the path with the query string removed, the status, and the calling IP address. That is the level of detail to expect — not "no identifiers at all".
- Your plan data: not stored at all. Accounts, categories, months, transactions and payees are fetched from YNAB for each request and handed straight to the app that asked. Nothing is cached, written to a database, or kept after the request ends.
Who it is shared with: nobody
Your YNAB data is never knowingly passed to any third party. There are exactly two other parties in the picture, and you chose both: YNAB, where the data comes from, and the AI app you connected it to — for example Anthropic's Claude — which receives the answer to the question it asked, on your behalf. That app has its own privacy policy for what it then does. Nobody else is sent anything, ever.
Kevin HG runs this server and can see its logs — masked and limited as described above, which is to say: what happened, when, from which IP, against a one-way hash of your account, and none of your money. The encrypted tokens cannot be read without a live connection's own credential.
Deleting your data, and stopping access
Those are two different things, so here is which is which.
- Deletes the records. Tell your assistant "disconnect from YNAB everywhere" — the
disconnecttool witheverywhere: trueremoves every connection this server holds for your YNAB account and forgets the account. It also marks the account itself, so a connection the list did not manage to surface is refused anyway from that moment, rather than quietly carrying on. Request logs are not reachable from here and age out on their own. - Stops this one app. Plain "disconnect from YNAB" removes the connection the app you are talking to is using. Others keep working.
- Stops access, but may leave records. Removing the connector in your AI app (Claude: Settings → Connectors) stops that app using it. Whether this server is told depends on the app: if it sends a revocation, the connection is deleted here too; if it does not, the connection sits here unused until it expires.
- Stops everything at YNAB's end. Revoke this application at YNAB: Account Settings → Developer Settings → Authorized Applications ↗. From that moment nothing here can read your plans. Each stored connection is then deleted on its own next use — either a tool call, which YNAB refuses, or a background refresh, which YNAB also refuses; the connection that hits it first is the one that goes.
Two timing notes, because they are the kind of thing that is annoying to discover. The store this runs on spreads changes across Cloudflare's network rather than switching them everywhere at once, so a disconnect can take up to about a minute to be refused in every location. And when a connection renews itself, a small encrypted note of that renewal can outlive the disconnect by up to five minutes; it holds no plan data and is unreadable without the credential it belongs to, which is gone.
The honest caveats
This is a personal project with no support promise. It is not made by, endorsed by, or affiliated with YNAB. It runs on Cloudflare Workers; Cloudflare processes the traffic as an infrastructure provider.