How Sourcerer protects your data — and what it doesn't protect against.
All Sourcerer data is stored in a single SQLite database encrypted with SQLCipher, an open-source extension that provides transparent, full-database AES-256-CBC encryption.
The encryption key is never stored anywhere — it is derived from your master password each time you unlock the app using Argon2id, a memory-hard key derivation function designed to be expensive to brute-force.
| Parameter | Value |
|---|---|
| Algorithm | Argon2id |
| Memory cost | 64 MB (65536 KiB) |
| Time cost | 3 iterations |
| Parallelism | 1 thread |
| Output key length | 32 bytes (256 bits) |
| Salt length | 32 bytes, randomly generated at setup |
The salt is stored in a separate file (sourcerer.salt) alongside the database. The salt is not secret — its purpose is to ensure that the same password cannot produce the same key on a different machine — but it must not be deleted. Without the salt, the database cannot be opened even with the correct password.
The master password is never stored, hashed for storage, or transmitted anywhere. It exists only in memory during the unlock process, long enough to derive the key. After that it is gone.
There is no password reset, recovery code, or backdoor. If you forget your password, your data is permanently inaccessible. This is by design — any recovery mechanism would be a potential attack surface.
A passphrase — four or more random, unrelated words — provides excellent security and is significantly easier to remember than a complex string of characters. The memory cost of Argon2id means that even a moderately long passphrase is extremely difficult to attack offline.
Avoid passwords derived from personal information (birthdays, names, addresses) that an adversary who knows you could guess.
The following are encrypted at rest:
Encryption is full-database: SQLCipher encrypts every page of the SQLite file, including table structure, indexes, and all data.
Sourcerer does not protect against every threat. Being honest about its limitations is important.
If someone has physical or remote access to your unlocked computer, they can read the Sourcerer database while it is open in memory. Encryption at rest protects the files on disk, not data in a running process.
Auto-lock reduces this window — set a short timeout if you work in shared spaces. The panic wipe is available for extreme situations.
The file sourcerer.salt is stored unencrypted alongside the database. It is not secret (the salt is not a key), but it must not be deleted. Consider backing it up with the same care as the database file.
The operating system can see that the database file exists, its size, and its modification timestamps — even though it cannot read the contents. If the existence of the file itself is sensitive, consider full-disk encryption at the OS level (FileVault on macOS, BitLocker on Windows).
While the app is unlocked, decrypted data is held in memory. This is unavoidable for any application. Modern OS memory management means sensitive data may remain in swap or memory dumps after the app is closed. Auto-lock clears the key from memory on idle.
Backup files exported from Sourcerer are encrypted with the same password as the original database. However, if you copy a backup to an unencrypted cloud drive, USB stick, or email attachment, the encrypted file could be exfiltrated and subjected to offline password attacks. Store backups carefully.
Sourcerer is not a communications tool. It does not provide secure messaging, end-to-end encrypted email, or any kind of anonymity network. It protects data at rest on your local machine — nothing more.
Sourcerer makes no telemetry or analytics requests of any kind. There are no analytics libraries, no crash reporting, and no usage tracking.
The only outbound network connections the app initiates are:
There are no other outbound connections. The app does not phone home, check for updates automatically, or communicate with any Sourcerer-operated server.
When Sourcerer is running and unlocked, it starts a small HTTP server bound to 127.0.0.1:27371. This server powers two features:
webcal://localhost URL, accessible only on this machineThe server is bound exclusively to the loopback interface (127.0.0.1). It is not accessible from any other machine on the network, and cannot be reached from the internet.
Before the Chrome extension can connect, you must explicitly approve it in the app. Sourcerer then issues a session token to the extension. Every request the extension makes must include this token. The token is regenerated each time the extension reconnects.
The calendar feed URL includes a persistent token. Anyone with this URL can read your upcoming reminders (but not your contacts, notes, or any other data). If you believe the URL has been compromised, regenerate the token from Settings — the old URL will immediately stop working.
Cross-Origin Resource Sharing headers are set to allow requests only from the extension's own origin. Web pages cannot make requests to the local server.
The panic wipe is a two-step, irreversible destruction of all Sourcerer data on the machine. Clicking the button reveals a confirmation step that requires you to type WIPE before anything is deleted. It then deletes:
sourcerer.salt)Files are overwritten before deletion where possible, making forensic recovery harder (though not impossible on SSDs, which manage writes at the firmware level).
Backup files produced by Sourcerer are AES-256-GCM encrypted bundles. They contain the database and its salt, compressed and encrypted with a key derived from your password using Argon2id. Anyone who obtains the file still needs the correct password to open it.
A few things to keep in mind:
sourcerer.salt to restore from a backup.For maximum safety, store backups on encrypted media separate from the main machine.
Sourcerer is open source under the AGPL-3.0 licence. The full source code is available at github.com/tomcardoso/sourcerer.
Security claims in this document can be verified by reading the code. The key derivation and encryption logic lives in src/main/ipc/setup.ts, src/main/ipc/unlock.ts, and src/main/database/index.ts. The panic wipe is in src/main/ipc/settings.ts.
If you find a security vulnerability, please report it responsibly via GitHub rather than disclosing it publicly.