jkey
Cross-platform command-line password manager and TOTP verifier.
All data is encrypted with AES-256-CBC + HMAC-SHA256 and stored per data type under ~/.config/jkey/. Pure Python — no OpenSSL or libsodium required.
Install
pipx install jkey
Or with plain pip:
pip install --user jkey
Or run without installing:
pipx run jkey --help
Quick Start
# Initialize vault (set master password)
jkey pv init
# Add a 2FA account from QR code image
jkey 2fa add ./github.jpg
# List TOTP codes (optional keyword filter)
jkey 2fa ls
jkey 2fa ls github
# Generate a random password
jkey pm get -L 24
# Store a password
jkey pm add my-site
# List all stored passwords
jkey pm ls
# Encrypt/decrypt any file
jkey pv encrypt secret.pdf
jkey pv decrypt secret.pdf.jkey -o secret.pdf
Commands
| Command | Description |
|---|---|
jkey 2fa ls [keyword] |
List TOTP accounts and codes |
jkey 2fa add <image> |
Import from QR code image |
jkey 2fa rm <account> |
Remove a TOTP account |
jkey rc add <file> |
Import recovery codes from file |
jkey rc ls [keyword] |
List recovery codes |
jkey rc rm <account> |
Remove recovery codes |
jkey pm ls [keyword] |
List stored passwords |
jkey pm get [-L N] |
Generate a random password |
jkey pm add <name> |
Store a password (prompts for input) |
jkey pm edit <name> |
Update an existing password |
jkey pm rm <name> |
Delete a stored password |
jkey pm import <file.csv> |
Import passwords from a browser CSV export |
jkey pv init |
Initialize the encrypted vault |
jkey pv unlock |
Unlock the vault |
jkey pv lock |
Lock the vault |
jkey pv status |
Show vault status |
jkey pv set-pw |
Change master password |
jkey pv encrypt <file> |
Encrypt a file |
jkey pv decrypt <file> |
Decrypt a .jkey file |
jkey pv export totp |
Export TOTP secrets (re-enters master password) |
jkey pv export passwords |
Export passwords as CSV |
jkey pv export recovery |
Export recovery codes |
jkey pv export qr -o <dir> |
Export QR code images |
jkey pv export all -o <dir> |
Export everything |
Set JKEY_PASS environment variable to skip the password prompt. Set JKEY_SESSION_TIMEOUT to change the session cache lifetime (default: 300 seconds).
How It Works
Data is encrypted with AES-256-CBC + HMAC-SHA256 and stored in ~/.config/jkey/:
~/.config/jkey/
├── .session # Session cache (5 min timeout)
├── totp.jkey # Encrypted TOTP secrets
├── passwords.jkey # Encrypted passwords
├── recovery.jkey # Encrypted recovery codes
└── qr/ # Encrypted QR images
Back up ~/.config/jkey/ (excluding .session) to migrate to another machine.
Dependencies
Runtime dependencies:
portalocker— cross-platform vault file lockingopencv-python-headless— optional, needed only forjkey 2fa addQR scanning. Install withpip install jkey[qr].
Pure Python, no OpenSSL or libsodium required.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file jkey-0.4.1.tar.gz.
File metadata
- Download URL: jkey-0.4.1.tar.gz
- Upload date:
- Size: 34.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5ba3dc8b44982dad07fbbd16c71531026071377ba807fee3bd60e22123868565
|
|
| MD5 |
540465788954b2e6adf40777b57bc197
|
|
| BLAKE2b-256 |
d029f9ed7830fc2974ff23b3331b12d15d649e3e9c495031ab87bd0039da4dbe
|
Provenance
The following attestation bundles were made for jkey-0.4.1.tar.gz:
Publisher:
publish.yml on imjiaoyuan/jkey
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jkey-0.4.1.tar.gz -
Subject digest:
5ba3dc8b44982dad07fbbd16c71531026071377ba807fee3bd60e22123868565 - Sigstore transparency entry: 2782670696
- Sigstore integration time:
-
Permalink:
imjiaoyuan/jkey@a86c0beca37cf014c774fe9779c14d910ad9bc9d -
Branch / Tag:
refs/tags/v0.4.1 - Owner: https://github.com/imjiaoyuan
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a86c0beca37cf014c774fe9779c14d910ad9bc9d -
Trigger Event:
push
-
Statement type:
File details
Details for the file jkey-0.4.1-py3-none-any.whl.
File metadata
- Download URL: jkey-0.4.1-py3-none-any.whl
- Upload date:
- Size: 27.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9367553efd920a95cf5c3135d49b11003ce3597e4a86668d7df54511f8804748
|
|
| MD5 |
b82bb84ab7cbf15f86c37d1d9498857d
|
|
| BLAKE2b-256 |
971bfa6263a3073a241c0e1670cce4d18a60dac898b2ecec264bdc81bf86477b
|
Provenance
The following attestation bundles were made for jkey-0.4.1-py3-none-any.whl:
Publisher:
publish.yml on imjiaoyuan/jkey
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jkey-0.4.1-py3-none-any.whl -
Subject digest:
9367553efd920a95cf5c3135d49b11003ce3597e4a86668d7df54511f8804748 - Sigstore transparency entry: 2782670813
- Sigstore integration time:
-
Permalink:
imjiaoyuan/jkey@a86c0beca37cf014c774fe9779c14d910ad9bc9d -
Branch / Tag:
refs/tags/v0.4.1 - Owner: https://github.com/imjiaoyuan
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a86c0beca37cf014c774fe9779c14d910ad9bc9d -
Trigger Event:
push
-
Statement type: