Mimir
A minimal, self-contained CLI vault for your account secrets. Everything lives in a single encrypted file you can store anywhere — recover it on any machine with just your master password.
Published on PyPI as mimir-vault.
- Doomsday recovery — lose every device and still get all your accounts back from the vault file and your password.
- Daily driver — one unlock per session, short commands, readable output.
- Portable — Python 3.9+, a single
pip install, any Linux/macOS box. No daemon, no account, no cloud lock-in. - Simple & auditable — small codebase, one dependency (
cryptography). The whole vault is one AES-256-GCM blob; nothing is stored in plaintext.
How it works
The vault is a single file encrypted with AES-256-GCM. Your master password is stretched with scrypt to derive the key — namespace names, keys, and values are all inside the encrypted blob, so the file is safe to keep anywhere public (a Git repo, cloud storage, a USB stick).
Secrets are organized into namespaces (one per account/service), each holding key–value pairs. Values can be marked sensitive, in which case they are masked as *** unless you pass --reveal.
Setup
Requires Python 3.9+ on Linux or macOS. git is optional and only needed for push/pull.
pip install mimir-vault
Or run from a checkout with uv:
uv sync
uv run mimir --help
Create your vault and set the master password (asked once, no recovery if lost):
mimir init
By default the vault lives at ~/.config/mimir/vault.mimir. Point it elsewhere if you like:
mimir config set vault ~/Dropbox/secrets/vault.mimir
Sync to a Git remote (recommended for recovery)
So you can recover from scratch, sync the vault to a Git remote — a public GitHub repo is fine, since the file is fully encrypted. Create an empty repo, then:
mimir config set remote git@github.com:you/my-vault.git
mimir config set branch main # optional, defaults to main
mimir push
Mimir uses your existing Git credentials and only ever tracks the vault file. To recover on a fresh machine, install mimir, set the same remote, and pull:
mimir config set remote git@github.com:you/my-vault.git
mimir pull
mimir show gmail --reveal
Usage
The master password is asked once per session (default idle timeout: 15 minutes), then cached so subsequent commands don't prompt. Run mimir lock to end the session immediately.
Namespaces
mimir add gmail # create a namespace
mimir list # list all namespaces
mimir show gmail # show its entries (sensitive values masked)
mimir show gmail --reveal # ...with sensitive values unmasked
mimir delete gmail # delete the namespace and all its keys
Keys
mimir set gmail email alex@example.com # non-sensitive value
mimir set gmail password 'hunter2' --sensitive # masked by default
mimir get gmail email # -> alex@example.com
mimir get gmail password # -> ***
mimir get gmail password --reveal # -> hunter2
mimir delete gmail password # delete a single key
-r / -s are short forms of --reveal / --sensitive.
Sync
mimir push # commit the vault and push to the configured remote
mimir pull # fetch the vault; refuses to overwrite a newer local copy
mimir pull --force # overwrite the local vault regardless
Session & config
mimir lock # end the session now
mimir config list # show all config values
mimir config get session-timeout
mimir config set session-timeout 0 # 0 = never time out
| Config key | Default | Description |
|---|---|---|
vault |
~/.config/mimir/vault.mimir |
Path to the vault file |
session-timeout |
900 |
Session idle timeout in seconds (0 = no timeout) |
remote |
(unset) | Git remote URL for push/pull |
branch |
main |
Branch to push to and pull from |
Config is a plain-text file at ~/.config/mimir/config and is never encrypted.
Releasing
Build and publish instructions live in publish.md.
Security notes
- The master password is set once at
mimir init. There is no recovery — lose it and the vault is unreadable. - The derived key is cached for the session in
/tmp/mimir-<uid>(mode0600), never the password itself. It is removed bymimir lock, on reboot, or after the idle timeout. - AES-GCM authenticates the file: any tampering causes decryption to fail with an explicit error.
Metadata
Release files for mimir-vault 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| mimir_vault-0.1.2.tar.gz | 44.5 kB | Without provenance | Details for mimir_vault-0.1.2.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| mimir_vault-0.1.2-py3-none-any.whl | Python 3 | none | any | Details for mimir_vault-0.1.2-py3-none-any.whl |
Total release size: 59.8 kB
Release files / mimir_vault-0.1.2.tar.gz
| Download URL | mimir_vault-0.1.2.tar.gz |
|---|---|
| Size | 44.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a878cb276f1ee3f938b105d8a0dcf338364f62fed34d1195818fd814533db85c
|
|
BLAKE2b-256 checksum How to use checksums |
f474e91c67a77828dc96187dcf7370d68efeecf36c5a7f604b11d91576a2ee7f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / mimir_vault-0.1.2-py3-none-any.whl
| Download URL | mimir_vault-0.1.2-py3-none-any.whl |
|---|---|
| Size | 15.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
91aa8a065a020602e18da8ba6804acfdb2a68169b8c277de5ee6c03ed7375afd
|
|
BLAKE2b-256 checksum How to use checksums |
317c1cf062a9b6a7a7950d17e34f2ea694d5ad288341714a250d084c62bc58d6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for mimir-vault 0.1.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.