What is stored, and where
Everything lives in one directory,%LOCALAPPDATA%\Zeno\qb-mcp by default:
Two things follow from that list. The mirror holds your clients’ ledgers —
names, amounts, memos, customer and vendor emails and phones — in ordinary
SQLite that any tool can read. And the journal holds the full payload of
everything you’ve posted, which is the same data by another route.
The location can be moved with
DataDirectory in appsettings.json or the
QBMCP_DataDirectory environment variable — which is how a
shared journal ends up on a network
share.
How it’s protected
The databases are encrypted. The journal and every mirror are SQLCipher-encrypted under a key minted on this workstation and protected by Windows itself (DPAPI), tied to your Windows account. There’s nothing to type and nothing to lose: signing in as you is what unlocks them. A copied file, a scooped backup, or a lifted disk is ciphertext without your Windows credentials. Databases created before encryption existed are converted automatically the first time the new build touches them — note that backups taken before that date still contain unencrypted copies, and should be treated as containing the books. Because the key is tied to your Windows account, your backups are only readable restored under that same account. Mirrors can always be rebuilt withqb_sync_mirror; the journal is your posting history, so keep
workstation backups and keep the account.
The directory is restricted to your Windows account. On startup, Zeno
cuts permission inheritance on the data directory and narrows access to the
owning user, SYSTEM, and Administrators. Other accounts on the machine can’t
read it, and files created later — including new mirrors — inherit the
restriction. If narrowing fails for any reason, Zeno says so in its log and
carries on: a permissions hiccup shouldn’t stop your bookkeeping.
It stays off the cloud by default. %LOCALAPPDATA% is not synced by
OneDrive or roamed between machines, which is part of why Zeno lives there.
If you point DataDirectory somewhere that is synced — a Dropbox folder, a
OneDrive-redirected path — copies of client data will follow that service’s
rules, not Zeno’s. Don’t do that; use a network share for sharing.
On a share, your licence key is what unlocks the books. A shared journal
can’t use a per-account key — six workstations need the same one — so Zeno
encrypts a shared data directory under a key opened by the firm’s licence.
Every seat that holds the current license.key opens the journal and
mirrors; when the licence changes (a seat named, updates renewed), saving
the new key through any workstation’s console keeps the keyring current,
and a workstation whose key no longer matches is told exactly that at
startup, with the fix. A shared directory with no licence installed stays
unencrypted, protected by the share alone.
Two things follow. Your licence key is now a decryption key — never
email it, and support will never ask for it; the machine id shown on the
console’s Licence tab is what support needs. And the share’s own rules
still matter: give it the same access list you’d give the client files
themselves, because the running workstations hold the books decrypted.
What you should do
- Turn on BitLocker on any workstation that runs Zeno. The permission narrowing protects against other accounts; only disk encryption protects a stolen or resold machine.
- Check what your backup tool scoops up. If workstation backups include
%LOCALAPPDATA%, they include client ledgers. That’s usually what you want — just make sure the backups themselves are encrypted and access controlled. - Removing a client removes their mirror.
qb_forget_companydeletes the company’s registration and its mirror database. Journal history for work already posted is kept — that’s your audit record.
The crash-recovery records
Thewrite-recovery\ folder holds the exact request of any posting that was
mid-flight — it’s how Zeno answers “did that write land?” after a crash.
These records always stay on the workstation that made them, never on the
share, and each one is sealed to that workstation’s Windows account the same
way the local databases are. Records from before sealing existed remain
readable and are re-sealed as they’re touched.