Last updated: September 2026
Perly's security model starts from what it refuses to hold. There are no exchange API keys, no wallet connections, no seed phrases and no private keys anywhere in the system — not encrypted, not hashed, simply absent. A database that does not contain a thing cannot leak it, and a service that cannot touch funds cannot be made to move them.
Every user-owned table carries PostgreSQL row-level security, and it is forced — the strict mode that applies even to the table's owner. Every policy is keyed to the authenticated account, so a query made from any other account returns nothing at all: not an error, not a permission prompt, an empty result. The database itself refuses to serve rows to anyone but their owner, which means the isolation does not depend on application code remembering to add a WHERE clause.
Everything in transit is TLS. Everything at rest is encrypted disk. Your password is stored only as a hash nobody can reverse, so nobody at Perly can read it or sign in as you. This is strong, and it is also the honest boundary of today's claim: the operator of the database could, in principle, read the stored rows of your portfolios in full if encryption is off for your account. That is why a new account starts with it on.
Your portfolios are encrypted in your own browser, all of them at once, with a key only you hold — on by default for a new account, and Settings can turn it off. An encrypted portfolio's amounts, prices, fees, totals, notes, tags, description and target reach the server only as ciphertext we cannot open. The key itself is never sent to us: what is stored is the key wrapped by each way you open it — a passphrase, a recovery code, a passkey. Every figure Perly shows is computed by a pure accounting engine, so for an encrypted portfolio that computation runs in your browser over the decrypted rows — most products cannot do end-to-end encryption because their server computes; ours does not have to. What stays readable is what lists and sorting need: the portfolio's name and the currency it is kept in, each entry's coin and time, and fingerprints that spot a duplicate import. Alerts, plans and watched addresses you set on it are stored in the clear, because the server has to read them to act on them.
This site sets no cookies until you allow analytics. If you do, Google Analytics loads and sets cookies of its own to count page views; if you decline, it never loads. The site itself keeps no backend: it is static pages, with no database of its own. One database serves the products: the application at app.perly.io and the invoicing site at invoice.perly.io keep your records in it, under the account you sign in with, and Perly Charts at charts.perly.io reads its market data from it and writes its counters and readers' notes to it, with nothing but the public key every visitor's browser is given. Details in the privacy policy.
Found something? We want to know: hi@perly.io.
© 2026 Perly. All rights reserved.