The credential broker that other tools wish they were. While some projects (cough, OpenClaw, cough) think "security" means printing your API key to stdout and hoping for the best, we built session-authenticated, PBKDF2-encrypted, HMAC-verified, rate-limited, scoped, logged, and revocable credential management. You know β actual security.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β π Encrypted vault (PBKDF2 Β· 200K iterations Β· HMAC) β
β π€ AI agent broker (scoped Β· logged Β· revocable) β
β π 16-provider audit pipeline (live API validation) β
β π₯οΈ 6 interfaces (CLI Β· TUI Β· Web Β· Desktop Β· API Β· MCP) β
β π‘οΈ Hostile security audit: PASSED β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
git clone https://github.com/Senpai-Sama7/check-please.git
cd check-please
./start.sh --web # opens browser UIThat's it. No config files. No Docker. No 47-step setup guide. No "please install our custom CLI tool first."
π‘ Some tools require you to read a novel before you can validate a single key. We respect your time.
π Step 1: Set permissions (click to expand)
Create .check_please_agent_permissions.json in your project root:
{
"allowed": [
"OPENAI_API_KEY",
"ANTHROPIC_API_KEY",
"GITHUB_TOKEN"
],
"token_ttl": "1h"
}π Step 2: Connect your agent (click to expand)
Claude Code (MCP):
Add to ~/.claude/claude_desktop_config.json:
{
"mcpServers": {
"credentials": {
"command": "python",
"args": ["/absolute/path/to/check_please/agent_api.py", "--mcp"]
}
}
}Any agent (4 options):
./start.sh --agent-env <command> # inject env vars
eval $(./start.sh --agent-export) # export to shell
./start.sh --agent-write-env /tmp/.env # write .env file
./start.sh --agent-api # HTTP API + bearer tokenUnlike certain tools that give agents a skeleton key to your entire
.envand call it a feature...
{
"allowed": [
"OPENAI_API_KEY",
{"name": "ANTHROPIC_API_KEY", "max_uses": 50, "expires": "2h", "rpm_limit": 60},
{"name": "GITHUB_TOKEN", "max_uses": 10, "expires": "30m"}
],
"token_ttl": "1h",
"alerts": {
"token_threshold": 100000,
"webhook": "https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
}
}| Feature | check_please | "Other tools" |
|---|---|---|
| Per-credential max uses | β | β |
| Time-based expiry | β | β |
| RPM rate limiting | β | β |
| Bearer token TTL | β | β |
| Slack/Discord alerts | β | β |
| Per-agent usage tracking | β | β |
| Session-authenticated API | β | π¬ |
| Encrypted vault | β PBKDF2 200K | π€· plaintext? |
Every credential request is counted. Every token is tracked. Every agent is logged.
# Real-time monitoring
curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:8458/usage
# Per-key breakdown
curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:8458/usage/OPENAI_API_KEYAlerts fire automatically:
- π¨ Agent exceeds RPM limit β
429+ terminal warning + webhook - π° Token threshold exceeded β terminal warning + webhook
- π All access logged to
agent_usage.log(append-only JSON)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β CLI ββββ check-please --env .env (table output) β
β TUI ββββ ./start.sh --tui (rich terminal) β
β Web ββββ ./start.sh --web (browser SPA) β
β Desktop ./start.sh --desktop (native GTK app) β
β API ββββ ./start.sh --agent-api (HTTP broker) β
β MCP ββββ ./start.sh --agent-mcp (Claude/Copilot) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
| Lock Screen | Dashboard | Audit Results |
|---|---|---|
![]() |
![]() |
![]() |
| Password Vault | Settings | Build .env |
|---|---|---|
![]() |
![]() |
![]() |
πΈ Screenshots coming soon. Run
./start.sh --webto see the live UI.
| Provider | Key Pattern | Provider | Key Pattern |
|---|---|---|---|
sk-* |
sk-ant-* |
||
AIza* |
ghp_* gho_* |
||
sk_live_* |
xox[bpas]-* |
||
hf_* |
gsk_* |
||
| alphanumeric | nvapi-* |
||
sk-* (hex) |
hex (64) | ||
sk-or-v1-* |
csk-* |
||
SG.*.* |
hex (32) |
Adding a provider? Drop a single file in
credential_auditor/providers/. Auto-discovered. Zero config. No registration. Some frameworks make you write a plugin manifest, register a factory, and sacrifice a goat. We don't.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β SECURITY LAYERS β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β π PBKDF2-HMAC-SHA256 Β· 200,000 iterations β
β π§ 16-byte random salt per account β
β β
HMAC-SHA256 integrity verification β
β πͺ HttpOnly + SameSite=Strict session cookies β
β π« Exponential backoff (1s β 2s β 4s β ... β 30s) β
β π Content-Security-Policy enforced β
β π chmod 600 on all vault/account files β
β π 10MB request body limit (anti-DoS) β
β π localhost-only binding β
β π All access logged (append-only) β
β π Symlink/hardlink attack detection β
β π« No raw keys in any output β ever β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π΄ Hostile security audit: PASSED β 10-part adversarial audit covering crypto, auth, input validation, network security, file system, and dependencies. All critical findings fixed. Read the full report β
Every response includes:
X-Frame-Options: DENYβ clickjacking protectionX-Content-Type-Options: nosniffβ MIME sniffing preventionContent-Security-Policyβ script/style source restrictionsReferrer-Policy: no-referrerβ zero URL leakageX-XSS-Protection: 1; mode=blockβ legacy XSS filter
Attempt 1 β 1s lockout
Attempt 2 β 2s lockout
Attempt 3 β 4s lockout
Attempt 4 β 8s lockout
Attempt 5 β 16s lockout
Attempt 6+ β 30s lockout (capped)
Your vault stores passwords, API keys, and credentials β all encrypted locally.
- β Add/edit/delete entries with site, username, password, notes
- β Password generator with configurable length and complexity
- β Import CSV from Chrome, 1Password, Bitwarden, LastPass, etc.
- β Export CSV for portability
- β Biometric unlock via phone (FIDO2/WebAuthn)
- β
Encrypted backups (
.cpbackupfiles) - β Emergency recovery sheet (printable)
- β Multi-account support
Your data never leaves your machine. No cloud sync. No telemetry. No "anonymous" analytics. Just your secrets, encrypted, on your disk. Revolutionary concept, apparently.
| Method | Path | Description |
|---|---|---|
GET |
/providers |
List providers and env var names (no values) |
GET |
/credentials |
List allowed credential names (no values) |
POST |
/credentials/{VAR} |
Get credential value (if permitted) |
GET |
/health |
Server status |
GET |
/usage |
Usage summary for all credentials |
GET |
/usage/{VAR} |
Per-credential usage stats |
POST |
/usage |
Agent reports token consumption |
All requests require Authorization: Bearer <token>. Token displayed on startup.
πͺ What auto-recovers (click to expand)
| Scenario | What Happens |
|---|---|
| Corrupt vault file | Returns empty vault β no crash |
| Corrupt account file | Returns "not found" β others unaffected |
| Missing data directory | Auto-created on startup |
| Wrong backup password | Clear error β file untouched |
| Invalid JSON in data | Safe default returned |
| Legacy single-account data | Auto-migrated to multi-account |
| WebAuthn not supported | Falls back to browser |
| Downloads folder missing | Auto-created |
π« What doesn't recover (by design) (click to expand)
- Lost password + lost recovery key + no backup = data is gone. No backdoors. That's the point.
- Deleted data files = gone without backup. No shadow copies.
- Corrupted encrypted backup = unrecoverable. Keep multiple backups.
# credential_auditor/providers/myprovider_p.py β that's it. One file.
class MyProvider(Provider):
name: ClassVar[str] = "myprovider"
env_patterns: ClassVar[list[re.Pattern]] = [re.compile(r"^MY_API_KEY$")]
key_format: ClassVar[re.Pattern] = re.compile(r"^mk-[a-z0-9]{32}$")
async def validate(self, key, client):
resp = await client.get("https://api.example.com/me",
headers={"Authorization": f"Bearer {key}"})
if resp.status_code == 200:
return "valid", "account info", None, None, None, None
return "auth_failed", None, None, None, None, "Invalid key"Drop the file. Run the tool. Provider auto-discovered. Zero registration, zero config, zero boilerplate.
pip install . # core (3 deps: httpx, rich, python-dotenv)
pip install ".[tui]" # + Textual TUIOr just run ./start.sh β handles venv, deps, and launch automatically.
| check_please | OpenClaw | "Just use .env" | |
|---|---|---|---|
| Encrypted vault | β PBKDF2 200K | β | β |
| Session authentication | β HttpOnly cookies | β global state | N/A |
| Per-credential scoping | β max_uses + TTL + RPM | β | β |
| Brute force protection | β exponential backoff | β | N/A |
| 16 provider validation | β live API checks | partial | β |
| MCP support | β native | β | β |
| Biometric unlock | β FIDO2/WebAuthn | β | β |
| Security audit | β hostile audit passed | π€· | π€· |
| Request body limits | β 10MB cap | β OOM me | N/A |
| Security headers | β CSP + HSTS + XFO | β | N/A |
| Setup time | ~30 seconds | ??? | instant (insecure) |
| Dependencies | 3 | π€· | 0 |
We're not saying other tools are bad. We're saying we tested ours with a hostile security audit and published the results. Can they say the same? π«





