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.