Last updated September 2026

Security

What Shoshita does with your data, described precisely enough to check. Cipher names, parameters, file paths, and every network call it makes.

Encryption

Every file holding your financial records is encrypted with Fernet, the standard recipe from Python’s cryptography library. Fernet is AES-128 in CBC mode, with a random initialisation vector per file and an HMAC-SHA256 authentication tag over the result.

Being authenticated matters as much as being encrypted: the tag is checked before anything is decrypted, so a file that has been altered on disk is rejected rather than silently decoded into wrong numbers.

Your key is derived from your PIN with PBKDF2-HMAC-SHA256 at 600,000 iterations, against a 16-byte random salt generated when you first set your PIN. OWASP’s current password-storage guidance puts the floor for PBKDF2-HMAC-SHA256 at 600,000, so this meets it.

The key is never written to disk. It is derived from your PIN when you unlock, held in memory for that session, and gone when the app closes. It is not stored, not cached to a file, and not recoverable from anything on your machine. There is no recovery path if you forget your PIN, and that is a consequence of the same design, not an oversight.

Your PIN itself is not stored either — not even as a hash. The app keeps a short fixed phrase encrypted under your key, and checks your PIN by trying to decrypt it. A wrong PIN fails to decrypt; there is nothing to crack offline.

Where files live

Shoshita writes to two places, and they hold different things.

Your data folder — all financial records

A folder you choose, always a dedicated shoshita_data directory the app owns. By default Documents\shoshita_data. It holds your transactions, categorisation rules, budget limits, accounts and savings goals, each as an encrypted .csv. It also holds security.dat, which is the salt and the encrypted check phrase described above.

%LOCALAPPDATA%\Shoshita\ — licensing and config

No financial data is stored here. This folder holds the path to your data folder, a marker recording that you accepted the licence agreement, the trial clock, a locally generated device id, the port number the app is currently serving on, a debug log, and your rolling backups.

It also holds your activation record. That record does not contain your licence key — only the last eight characters, enough to show you which key is installed. It is not encrypted with your key, because it is read at startup before you have entered your PIN.

Network

Shoshita makes an outbound request only when you press Activate. One function in the application does this and nothing else does. Every later launch checks your licence by reading a local file, with no network access at all.

The request goes to Polar over HTTPS, with certificate verification against a bundled CA list. What it sends is listed on the privacy page. Your financial data is not part of it.

The app also opens local connections to itself — it runs a small web server on your own machine and displays it in a browser window. Those connections are to localhost and never leave the computer.

There is no other network code. The interface loads no remote fonts, scripts, images or stylesheets; everything it needs is compiled into the application.

No telemetry, no analytics, no auto-update

There is no usage tracking, no analytics, no crash reporting and no update check. Shoshita does not update itself and never asks a server whether a new version exists — you find out from the changelog and install a new version yourself. Streamlit, the framework underneath, has its own usage statistics; Shoshita explicitly switches them off at launch.

The debug log

Shoshita keeps a plain-text log at %LOCALAPPDATA%\Shoshita\system_debug.log, overwritten each time you launch. It exists so a problem can be diagnosed from a bug report.

It never contains transaction data — no amounts, dates, descriptions, categories or balances, and never your PIN or your key. What it does contain is startup and shutdown messages, the local port number, and errors. Two entries are worth knowing about specifically:

  • If a bank statement import fails, the log records the bank you chose and the account name you typed, along with the technical error. An account name is whatever you called it, so it may identify you.
  • If an activation fails, the log records the last eight characters of the key you entered, never the whole key.

The file is yours. You can read it, and you can delete it — the app recreates it on the next launch.

Backups

Every time you unlock with your PIN, Shoshita zips the contents of your data folder into %LOCALAPPDATA%\Shoshita\Backups\ and keeps the five most recent. The files inside stay encrypted — a backup zip is no more readable than the originals, and needs the same PIN.

Backups run at unlock, and only at unlock. Anything you change during a session is not in a backup until the next time you unlock the app. If you have just done a large import or a lot of edits, the newest backup is from before that work. Use Manual Backup in the sidebar to take one on demand.

The installer is signed

Shoshita 1.2.0 is code-signed through Azure Trusted Signing with a public-trust certificate, and the signature is timestamped so it stays valid after the signing certificate expires. The subject on the certificate is Bruno Leone Cury.

You can check this yourself before running it: right-click the installer, choose Properties, and open the Digital Signatures tab. The download page also publishes the SHA256 of the exact file, so you can confirm a ~100 MB download arrived intact.

Questions

If something here does not match what you observe, that is worth reporting. Email support@shoshita.ca.