Split-key reverse proxy that makes leaked API keys worthless
Project description
Worthless
Make leaked API keys worthless.
When your .env leaks, the keys inside are placeholders. The real key never sits in your repo, your shell history, or your laptop's memory.
Quickstart
curl -sSL https://worthless.sh | sh # fresh machine, no Python needed
# or, if you already have Python 3.10+:
pipx install worthless
Then cd into your project and run worthless. It detects keys in your .env, splits them, starts a local proxy. No code changes.
The Worker emits an X-Worthless-Script-Sha256 header so you can verify the bytes you ran match the bytes the Worker advertised before piping into sh. The check catches transit/cache tampering, not origin compromise — cosign-signed release manifests for that are tracked in WOR-303.
Full install options (Docker, MCP for Claude Code / Cursor / Windsurf, GitHub Actions, the verified-install flow, kill-switch runbook): docs.wless.io
Scope
Worthless scans for LLM provider API key prefixes only — currently
openai (sk-, sk-proj-), anthropic (sk-ant-), google
(AIza), and xai (xai-). For general secret detection (cloud
tokens, GitHub PATs, AWS access keys, npm tokens, Cloudflare API
tokens, etc.), use
gitleaks or
trufflehog as a
companion tool — worthless will not flag those and is not trying to
replace them.
How it works
worthless locksplits each API key into two shards- Shard A stays on your machine (encrypted). Shard B goes to the proxy database
- Your
.envis rewritten with shard A — format-preserving, but cryptographically useless alone - The proxy reconstructs the key only when the rules engine approves the request
- Spend cap blown? The key never forms. The request never reaches the provider
Platforms
| Platform | Status |
|---|---|
| macOS | Supported |
| Linux | Supported |
| Windows + WSL | Supported |
| Native Windows | Not supported — use WSL or Docker |
Native-Windows support is tracked in WOR-237. See docs.wless.io for the full distro support matrix.
Versioning
PyPI version, signed git tag (vX.Y.Z), and the X-Worthless-Script-Tag header on worthless.sh are kept aligned — CI fails fast if pyproject.toml and the tag disagree. install.sh resolves the latest worthless from PyPI at install time; pin via WORTHLESS_VERSION=x.y.z curl -sSL https://worthless.sh | sh.
Documentation
Everything lives at docs.wless.io — install guides, the security model, wire protocol, recovery runbook, the verified-install flow, and the agent skill file (Claude Code / Cursor / Windsurf).
Development
git clone https://github.com/shacharm2/worthless && cd worthless
uv sync --extra dev --extra test
uv run pytest
Internal developer documentation lives in engineering/. Security invariants are in SECURITY.md.
Contributing
PRs welcome. Read CONTRIBUTING-security.md first.
License
Project details
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 worthless-0.3.4.tar.gz.
File metadata
- Download URL: worthless-0.3.4.tar.gz
- Upload date:
- Size: 373.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dc092b7776dad03550cef3b97d5e4f8a72eab7a27bd4b6cda78fd14a8667d6aa
|
|
| MD5 |
73b124985f227275b14b11e1cdc1aa18
|
|
| BLAKE2b-256 |
6320f6adc5879c978a6d68cd977fd274c86022d01558b4b53e02c2973309e851
|
Provenance
The following attestation bundles were made for worthless-0.3.4.tar.gz:
Publisher:
publish.yml on shacharm2/worthless
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
worthless-0.3.4.tar.gz -
Subject digest:
dc092b7776dad03550cef3b97d5e4f8a72eab7a27bd4b6cda78fd14a8667d6aa - Sigstore transparency entry: 1452409765
- Sigstore integration time:
-
Permalink:
shacharm2/worthless@74a61ee0898492619264f0b736aa4832b829e59c -
Branch / Tag:
refs/tags/v0.3.4 - Owner: https://github.com/shacharm2
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@74a61ee0898492619264f0b736aa4832b829e59c -
Trigger Event:
push
-
Statement type:
File details
Details for the file worthless-0.3.4-py3-none-any.whl.
File metadata
- Download URL: worthless-0.3.4-py3-none-any.whl
- Upload date:
- Size: 156.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5a763f767f184634b646e85eb1804f8da4663cd0b9d62934ddd32a2d59b71a6a
|
|
| MD5 |
a1e56c55c7442bf72ea2f27d51d1bb9c
|
|
| BLAKE2b-256 |
65dd4c12a05ff49e5b30a88958d0c6c7102850891fed7c3c8121d60254b13634
|
Provenance
The following attestation bundles were made for worthless-0.3.4-py3-none-any.whl:
Publisher:
publish.yml on shacharm2/worthless
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
worthless-0.3.4-py3-none-any.whl -
Subject digest:
5a763f767f184634b646e85eb1804f8da4663cd0b9d62934ddd32a2d59b71a6a - Sigstore transparency entry: 1452409976
- Sigstore integration time:
-
Permalink:
shacharm2/worthless@74a61ee0898492619264f0b736aa4832b829e59c -
Branch / Tag:
refs/tags/v0.3.4 - Owner: https://github.com/shacharm2
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@74a61ee0898492619264f0b736aa4832b829e59c -
Trigger Event:
push
-
Statement type: