Security
What Dotvault actually does
Dotvault is closed source, and I am asking you to point it at your API keys and database passwords. That is a lot to ask on trust alone, and "we take security seriously" is worth nothing. So this page is the specifics: what is encrypted and with what, every request the app makes and when, what happens when it cannot reach the internet, and the things it deliberately does not protect you from.
If anything here turns out to be wrong, I would rather hear about it than not. hello@dotvault.dev.
Your .env files are not encrypted, and that is on purpose
Start here, because it is the thing most likely to be misunderstood. A normal .env file in your project stays exactly where it is, as plain text, readable by anything that can read the folder. Dotvault does not encrypt it, and it should not: your framework, your test runner and your Docker build all need to read that file. An editor that silently encrypted it would break every one of them.
What Dotvault encrypts is its own snapshot history, and any Laravel encrypted env files you ask it to open. Those two are below.
Snapshot history
Every time you save, Dotvault keeps a snapshot so you can roll back. Those snapshots hold the full contents of your file, so they are encrypted at rest.
- Cipher: AES-256-GCM, which is authenticated, so tampering with stored ciphertext is detected rather than silently decrypted into nonsense.
- IV: 12 random bytes, generated fresh for every single snapshot and stored alongside it. Never reused.
- Where the ciphertext lives: a SQLite database in the app's own support directory, not in your project folder and not in your repo.
- Where the key lives: 32 random bytes, generated on first run, written to a file in that same directory and encrypted with Electron's
safeStorage. On macOSsafeStoragekeeps its master key in the Keychain, so the Keychain protects the key that protects your key.
I have said elsewhere that "the key is in your Keychain". That is close enough to be defensible and not quite accurate, so the sentence above is what you will actually find on disk if you go looking. Decrypted snapshot contents exist only in memory, and only for as long as it takes to show them to you.
Laravel encrypted env files
Dotvault opens and edits Laravel's encrypted env files natively, without shelling out to PHP or artisan. It implements Laravel's own format rather than inventing one, so a file Dotvault writes is a file php artisan env:decrypt can read.
- Ciphers: AES-256-CBC and AES-128-CBC, selected from your key length, matching Laravel.
- Integrity: HMAC-SHA256, compared in constant time.
- Keys: stored per file, scoped by absolute path, in the app's database and encrypted with
safeStoragelike the snapshot key. Path scoping means renaming a project or re-adding it does not lose the key.
Everything that leaves your machine
Dotvault is not an offline app, and I should stop implying it is. It makes five kinds of request. None of them carry the contents of your env files, your key names, your values, your file paths or your project names. Here is all of it.
Update check
Goes to releases.dotvault.dev, a few seconds after launch and whenever you pick Check for Updates yourself. It asks for a small file listing the newest version and compares it with yours. Updates download only when you say so. If your update window has closed, opening Settings asks the same host for the list of releases, so it can tell you how many you are behind.
Licence activation and revalidation
Goes to Lemon Squeezy, who handle the payments. Once when you activate, then again every time the app starts, and roughly once a week on top of that if you leave it running. It is the same request every time, and all it asks is whether the licence is still valid. It sends your licence key, and a machine name the first time so you can tell your own installs apart. After that it sends the id activation handed back rather than the name again. I never see your card details, and the licence key itself stays in the part of the app that talks to the network. It is not handed to the interface after activation.
Update window lookup
Goes to this site to find out how long your updates run for. It rides on the back of the licence check rather than keeping its own schedule: every time one of those comes back good, this one follows it. It also runs when you pick Check for Updates yourself, so a renewal you have just bought counts straight away instead of next week. It does not send your licence key. What it sends is a SHA-256 digest of it, and what comes back is a single date. Nothing else about you is stored against that digest and there is nothing to log into.
If you buy a renewal, the payment notification from Lemon Squeezy is what moves that date, and it sends you one email confirming the new one. Your address is used to send that message and to match the payment to a licence. It is not kept in the record behind the date, which holds a digest and nothing else. If the lookup fails, for any reason and for any length of time, Dotvault falls back to working the date out on its own. It never shortens your window because a request did not come back.
Anonymous usage telemetry (off unless you turn it on)
Goes to Aptabase. Off by default, and dismissing the prompt leaves it off. Events are a fixed list of names with fixed options, so there is no mechanism by which a key name, a value, a file name or a path could be sent even by accident. I have published the full event list, so you can check rather than take my word for it.
Crash reports (same switch)
Goes to Sentry, gated by the same toggle as telemetry. File paths and user data are stripped before anything is sent, native crash dumps are disabled entirely, and performance tracing is off. If you turn telemetry off, crash reporting goes with it.
This website
Worth saying out loud, since the rest of this page is about being straight with you. This website uses Google Analytics, and it only loads if you accept the cookie banner. Decline and no analytics script is loaded at all. That is the website, not the app. The app has never sent anything to Google.
What happens when you are offline
Day to day, nothing. Every feature that touches your files works with no network at all: editing, snapshots, diffs, git integration, encryption and decryption. Go on a plane and the app does not care.
Licensing is the one thing that reaches the network, and it fails open. Dotvault revalidates every time it starts, and roughly weekly after that. If it cannot reach the licence server, for an hour or for a year, it carries on working on the last good check and keeps your licence on disk, so there is nothing to reactivate when you reconnect.
Two things can lock a licensed copy, and a failed request is not one of them. The first is the licence server positively saying the licence is no longer valid, after a refund or a deactivation. The second is your Mac's clock going backwards by more than an hour, which Dotvault reads as someone winding a date back rather than as a normal day. That one clears itself the moment the clock is right again. A network failure never locks anything, because being offline is not evidence of anything and I am not willing to lock you out of your own secrets over an outage on my side.
Checking that what you downloaded is what I built
Dotvault is signed with my Apple Developer ID and notarised by Apple. That is the check worth doing, because Apple verifies the signature against a certificate I had to prove my identity to obtain. Run this against the installed app:
spctl -a -vvv -t install /Applications/Dotvault.appWord for word, that should give you:
/Applications/Dotvault.app: accepted
source=Notarized Developer ID
origin=Developer ID Application: Will Wilson (RR6BMR5766)My Apple Team ID is RR6BMR5766, and it is baked into the binary rather than something I can just assert here. If that last line names anyone else, you did not get the app from me. If you would rather read it straight from the signature,codesign -dv /Applications/Dotvault.app prints the same team identifier.
Every release also publishes a SHA-256 of the disk image next to it, so you can confirm the download completed intact:
shasum -a 256 ~/Downloads/Dotvault-latest.dmg
curl -s https://releases.dotvault.dev/Dotvault-latest.dmg.sha256Be clear about what that proves, though. The checksum and the download come from the same server, so it catches a truncated or corrupted file, not someone who has taken over that server. The signature check is the one that would catch that, because I cannot forge Apple's notarisation and neither can anyone else. Use the checksum for integrity and spctl for trust.
What Dotvault does not protect you from
Every tool has a boundary, and pretending otherwise is how people get caught out. Dotvault's job is to stop your secrets sitting on someone else's server and to give you history and visibility over files you were previously editing blind. It is not a defence against these:
- A compromised Mac. Anything running as you can read your
.envfiles directly, because they are plain text and they have to be. Malware does not need to go through Dotvault, and encrypting snapshots does not help once an attacker is already inside your session. - Someone with your unlocked machine. App lock and Touch ID raise the bar on a borrowed laptop. They are not a serious obstacle to anyone with time and your logged-in account.
- Losing your encryption key. If you lose the key to a Laravel encrypted file and have no copy anywhere else, that file is gone. There is no recovery, no backdoor and no reset link. That is encryption working, not failing.
- Committing a secret to git. Dotvault warns you and helps you clean up, but it cannot reach into a repository you have already pushed. Rotate the key.
- A leak somewhere else entirely. A key pasted into a chat, sitting in your shell history, or printed by a CI log is not something a local editor can see.
The bit I cannot prove
Dotvault is closed source. You cannot read the code and verify any of this yourself, and I am not going to pretend a page written by me is the same thing as source you can audit. Some of the tools I compare against are open source, and if reading the crypto yourself is your bar, that is a completely reasonable bar and you should use one of those instead. I have written about them fairly.
What I can give you is specifics precise enough to be checked, a signature Apple vouches for, a network profile you can watch with Little Snitch or tcpdump, and a name and a face on the about page. If you catch this page being wrong about something, that is a bug and I will fix it.