What we store, and what we can never touch

Your wallet set is a complete picture of your financial life on-chain. That is exactly why the product is built so that holding it gives us no power over it.

What we hold

Your email, and passkeys if you add them
Wallet addresses you declare — public information you choose to associate
Exchange API keys — read-only, verified withdrawal-disabled at connection, encrypted at rest, revocable in one click
The raw source data behind your computations, so recomputation never re-queries and your evidence never changes under you

What we never hold

Private keys or seed phrases — the product has no field to paste them into
Funds. We custody nothing and can initiate no transaction of any kind
Exchange keys with trading or withdrawal scope — connection is refused, with the reason shown
Your addresses shared with any third party without your explicit consent
Deletion is deletionDeleting your account removes wallets, keys, raw data and computations, completing within 30 days. We offer a full export first.
DeterminismSame inputs, same outputs, byte for byte. Your figures cannot drift between runs, and every figure traces to source rows.

Exchange keys are refused unless they are read-only

We check the key’s actual permissions when you connect it. A key that can withdraw or trade is refused, with the permissions we found named and instructions for creating one that is read-only. That refusal is the feature, not an error.

Keys are sealed with a data key unique to your account, which is itself stored only in wrapped form. They are never written to logs or exception traces, and removing one from Finality is a single action.

Sign-in does not use your wallet

Email link or passkey. Never a wallet signature — it proves control of a key, not who you are, and it is the wrong instrument for a tax product.

The site and the product are separate origins

Marketing runs on one host and the product on another. The product host carries a strict content-security policy, runs no third-party scripts at all, and is closed to crawlers. A compromised vendor script on the marketing site cannot reach product session state, because it is a different origin with a different cookie jar.

How the encryption actually works, and what it is not

Exchange credentials are sealed with a data key unique to your account, which is itself wrapped by a key the database never holds. That is the right shape — but in this build the wrapping key is a file on the same server, not a managed key service, and the cipher is a hand-rolled construction rather than a reviewed one.

Anyone who can read that server’s filesystem can unwrap the credentials. There is no hardware boundary, no audit trail of decrypt calls, and no key rotation. A production deployment must put a managed KMS behind this; the code is written so that is a deployment change rather than a rewrite.

We would rather say this than let “encrypted” do work it has not earned. It is the reason this build is not one you should connect a real exchange key to.

What we do not yet have

No third-party assurance report yet

We do not hold a SOC 2 Type II report or ISO/IEC 27001 certification. When we do, they will be named here with their scope and date. Until then this page is the whole of our security position, and we would rather state that plainly than imply otherwise.