Skip to main content

murk-secrets

PyPI

Python bindings for murk — an encrypted secrets manager for developers.

murk stores encrypted secrets in a single .murk file safe to commit to git. This package lets Python apps read those secrets at runtime.

Prerequisites

You need the murk CLI to create and manage vaults. This package only reads them.

# Install the CLI first
brew install interrupted-sh/tap/murk

# Initialize a vault and add secrets
murk init
murk add DATABASE_URL
murk add API_KEY

Then add the Python package to your project:

pip install murk-secrets

Quick start

# Optional on the machine that ran murk init (see "Key lookup").
# POSIX shell syntax.
source .env
import murk

# Load the vault (finds your key; see "Key lookup")
vault = murk.load()

# Get a single secret
db_url = vault.get("DATABASE_URL")

# Get all secrets as a dict
secrets = vault.export()

# Dict-style access
api_key = vault["API_KEY"]

API

murk.load(vault_path=".murk") -> Vault

Load and decrypt a murk vault. Finds your key as described in Key lookup.

murk.get(key, vault_path=".murk") -> str | None

One-liner: load the vault and get a single value.

murk.export_all(vault_path=".murk") -> dict[str, str]

One-liner: load the vault and export all secrets as a dict.

murk.has_identity() -> bool

Returns True if murk can find a key for ./.murk: MURK_KEY, MURK_KEY_FILE or the key file murk init stored. Returns False if no key is found, if both variables are set, or if the key file cannot be read. It does not read the vault, so True does not guarantee that load() succeeds. It does not check whether a secret exists. Use key in vault or vault.keys() for that.

Vault

Method Returns Description
vault.get(key) str | None Decrypted value, or None if no value is readable for the key
vault.export() dict[str, str] Every secret you can read
vault.keys() list[str] Key names in the vault schema, including keys you cannot read
vault[key] str Like get, but raises RuntimeError (not KeyError) if no value is readable
key in vault bool True if the key is in the schema, even if you cannot read its value
len(vault) int Number of keys in the schema
vault.warnings list[str] Warnings about an accepted vault, the ones the CLI prints as warn … (empty for a clean load)

Scoped (per-user) overrides are applied automatically — if you have a scoped value for a key, it takes priority over the shared value.

Trust

load(), get() and export_all() apply the same trust check as the CLI. A vault this machine does not trust — unsigned when your key could have signed it, signed by a key this machine hasn't accepted, rolled back, or tampered with — raises murk.TrustError (a subclass of RuntimeError) with the CLI's message. Nothing in the binding skips the check. Run murk trust once from a shell to accept a vault, or set MURK_TRUSTED_SIGNERS in CI. An agent grant key reads only through the trusted signers in its key file or MURK_TRUSTED_SIGNERS.

Memory hygiene

Every decrypted value murk returns is a plain Python string. murk zeroes plaintext from its own memory when a value is dropped, but that guarantee ends at the FFI boundary: once a value crosses into Python the interpreter owns it, and its garbage collector — not murk — controls its lifetime. This is inherent to reading secrets into a process (see the threat model); avoid holding decrypted values longer than you need them.

Agent policy

If the loaded key is an agent grant (from murk agent grant), the bindings enforce the vault's agent policy on every read, as murk agent exec does. get() and export() raise RuntimeError when the policy forbids a key they can read. Once the grant's TTL has passed, export() and get() of a readable key raise too. keys(), len() and in read only the schema and never check the policy. A plain operator key skips the check unless MURK_SELF_SCOPE or MURK_AGENT is set. A grant also cannot decrypt out-of-scope secrets, because its key is not a recipient of them, so the policy check is a second guard.

A loaded Vault keeps the values and policy from its last load. Policy changes and revocations apply only after you call load() again. Grant expiry is checked again on each value read.

Key lookup

load() finds your key the same way the CLI does:

  1. MURK_KEY (your age secret key) or MURK_KEY_FILE (the path to a key file). Set one, not both. murk refuses to load when both are set.
  2. The key file that murk init stored under ~/.config/murk/keys/.

murk init also writes a .env that points MURK_KEY_FILE at that file. On the machine where you ran murk init, you do not need to source it. Set the variable yourself in CI, in containers and whenever MURK_STRICT or MURK_AGENT is set, because both turn off step 2.

Requirements

Python 3.9 or later, the murk CLI, a .murk vault in your project and a key (see Key lookup).

License

MIT OR Apache-2.0

Metadata

Release files for murk-secrets 0.14.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for murk-secrets 0.14.0
File Size Uploaded Provenance Actions
murk_secrets-0.14.0.tar.gz 10.0 MB With provenance Details for murk_secrets-0.14.0.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for murk-secrets 0.14.0
File Actions
murk_secrets-0.14.0-cp39-abi3-win_amd64.whl CPython 3.9 abi3 Windows x86-64 Details for murk_secrets-0.14.0-cp39-abi3-win_amd64.whl
murk_secrets-0.14.0-cp39-abi3-manylinux_2_28_aarch64.whl CPython 3.9 abi3 Linux glibc 2.28+ ARM64 Details for murk_secrets-0.14.0-cp39-abi3-manylinux_2_28_aarch64.whl
murk_secrets-0.14.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.9 abi3 Linux glibc 2.17+ x86-64 Details for murk_secrets-0.14.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
murk_secrets-0.14.0-cp39-abi3-macosx_11_0_arm64.whl CPython 3.9 abi3 macOS 11.0+ ARM64 Details for murk_secrets-0.14.0-cp39-abi3-macosx_11_0_arm64.whl
murk_secrets-0.14.0-cp39-abi3-macosx_10_12_x86_64.whl CPython 3.9 abi3 macOS 10.12+ x86-64 Details for murk_secrets-0.14.0-cp39-abi3-macosx_10_12_x86_64.whl

Total release size: 16.7 MB

Release files / murk_secrets-0.14.0.tar.gz

Download URL murk_secrets-0.14.0.tar.gz
Size 10.0 MB
Tags Source
SHA-256 checksum
How to use checksums
f7dff0d8a819ea5d123bdfb0287cec0c27b7ac054dfb0653b0cf3e6643ddfe7c
BLAKE2b-256 checksum
How to use checksums
a9e99b83b8a4e1dd80317ab7546832aef9e768409ed6343874a36406fd104c1c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Release files / murk_secrets-0.14.0-cp39-abi3-win_amd64.whl

Download URL murk_secrets-0.14.0-cp39-abi3-win_amd64.whl
Size 1.2 MB
Tags CPython 3.9 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
fa76f932b77a55d6ac454b84b242041182549a1af76a2a3e0c3b9af27c7b9916
BLAKE2b-256 checksum
How to use checksums
f65e94dd18c61483c1334806907ab455088d6487496ea281ac65082ad00965ea
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Release files / murk_secrets-0.14.0-cp39-abi3-manylinux_2_28_aarch64.whl

Download URL murk_secrets-0.14.0-cp39-abi3-manylinux_2_28_aarch64.whl
Size 1.4 MB
Tags CPython 3.9 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
1504b8e8e26e5c4da35f1defd5638857102a8b83aba410417a2493c56dff3571
BLAKE2b-256 checksum
How to use checksums
7fcb1f112b1d3f2c4998768b625ed9b84611696718e58de500d6269df1a9fb47
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Release files / murk_secrets-0.14.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL murk_secrets-0.14.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 1.5 MB
Tags CPython 3.9 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
6eb5953a9aa1b58c42453121d4e0b9ed3dac0eec2d7ac0c99786bc9fcc1748a7
BLAKE2b-256 checksum
How to use checksums
d240fd96bd7f2ea050af12ad340641b36e5dd8164e269b2a0f486e67baa928dd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Release files / murk_secrets-0.14.0-cp39-abi3-macosx_11_0_arm64.whl

Download URL murk_secrets-0.14.0-cp39-abi3-macosx_11_0_arm64.whl
Size 1.3 MB
Tags CPython 3.9 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
771a4a1f9f8928d9d3344f528518ef3342cdb125060fde3b8625510317fedad7
BLAKE2b-256 checksum
How to use checksums
e9580c447c4cb8db7ce8312e769fcbd52cf2fef613831b996759729ddb9cf4c9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Release files / murk_secrets-0.14.0-cp39-abi3-macosx_10_12_x86_64.whl

Download URL murk_secrets-0.14.0-cp39-abi3-macosx_10_12_x86_64.whl
Size 1.4 MB
Tags CPython 3.9 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
d678f3ee744918f299c44e4d9682c2e072b8a1f00f15a6008f1ae2eebd29be10
BLAKE2b-256 checksum
How to use checksums
2d6f26dc62d2bf520bb8ce448e03fd52974383ad3066c42ce102554b1968037c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Security for murk-secrets 0.14.0

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.

Full provenance

All 6 files in this release have been uploaded with provenance metadata.

Select from 6 files

Attestation for murk_secrets-0.14.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

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.

Release history Release notifications | RSS feed

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page