个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Secrets management for AI agents: approve API keys and credentials on your phone with biometrics, delivered end-to-end encrypted into the target process. Plaintext never enters the chat, logs, or relay.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Secrets management for AI agents, approved on your phone.
When an agent needs an API key or credential, the plaintext never enters the conversation.
One fingerprint on a separate device, and the value arrives sealed to that one process.
Every agent eventually reaches for a secret: an API key, an SSH private key, a credential you'd rather not hand over.查看完整 README ↗Every agent eventually reaches for a secret: an API key, an SSH private key, a credential you'd rather not hand over.
The fast move is pasting it into ChatGPT or Claude. Fast, and now the plaintext lives in the model context, the transcript, and whatever logs sit downstream. The careful move is opening a password manager, copying, pasting, then double-checking the field. Nine times out of ten the chat wins, because lazy is real.
easy-unlocker makes the safe path lazier than the paste:
easyGet env OPENAI_API_KEY --exec 'python run.py' --for "calling the openai api"
# → phone pops: who (user@laptop) · what (OPENAI_API_KEY) · why
# → fingerprint → the value lands in the python process env, never on disk
Each easyGet run mints a one-time keypair. The public key rides the request to your phone, the phone seals the value with it, and only the private key held by that one command can open it. The relay in between sees ciphertext and nothing else. And because the approval lives on a second device, not in a window on the machine that asked, it still works when the agent runs on a server or a CI runner with no screen at all.
sequenceDiagram
participant C as easyGet (CLI)
participant B as Broker (relay)
participant P as Phone (approver)
C->>B: ① request + one-time public key
B->>P: ② push / poll
P->>P: fingerprint, seal value with that key
P->>B: ③ sealed value
B->>C: ④ sealed value
Note over B: sees ciphertext only
Note over C: only ①'s private key opens ④
Not a password manager and not a Bitwarden or 1Password replacement, no browser autofill, no subscription to buy. The vault lives on your phone and holds only the few secrets you're willing to hand to an agent.
Four pieces:
| Component | What it does |
|---|---|
Phone app (android/ ios/) | Stores items, approves with biometrics or password, signs SSH login certs on-device |
easyGet CLI (cli/) | The entry point agents call: sends requests, receives sealed values, writes files or injects into processes |
Broker (broker/ worker/) | Pairing, per-vault routing, ciphertext relay. You run one yourself: a Cloudflare Worker by default (one wrangler deploy), or the Go binary on a VPS |
Desktop app (desktop/, optional) | A second approver on Windows or macOS: approve requests, browse and copy items from a synced vault, manage devices |
1. Install easyGet (prebuilt for macOS / Linux / Windows):
os=$(uname -s | tr 'A-Z' 'a-z'); arch=$(uname -m | sed 's/x86_64/amd64/; s/aarch64/arm64/')
curl -L -o /tmp/easyGet "https://github.com/cyancity/easy-unlocker/releases/latest/download/easyGet-${os}-${arch}"
install -m 755 /tmp/easyGet ~/.local/bin/easyGet
On Windows, run scripts/install.ps1 from a clone (it downloads easyGet-windows-amd64.exe, adds it to your user PATH, and can pair in the same step with -Broker <url> -Code <code>), or grab the exe from Releases.
2. Install the app: on Android, install easy-unlocker-debug.apk from Releases. On iOS, the source is in ios/; open it in Xcode and install with your own signing. Then create a vault (the recovery code lands in a file on the device) and point Settings at a broker.
3. Pair: in the app, Settings → Devices → generate a pairing code (8 characters, valid 10 minutes), then on the computer:
easyGet pair --broker https://broker.example.com --code <8-char code>
easyGet ping # reachable, and it tells you if a newer release exists
Tip: if pushes don't reach your Android device, check notification permission, battery policy (set to "unrestricted"), and auto-start. Many Android ROMs restrict background work by default.
Using it comes down to a few requests:
# most common: the value goes into a child process env, nothing touches disk
easyGet env OPENAI_API_KEY --exec 'python run.py' --for "calling the openai api"
# want a file? say so (mode 0600)
easyGet env OCI_KEY --write-to ~/.oci/key.pem --for "oci cli reads key_file"
# don't know the item names? print the names this machine has cached (no network, no prompt)
easyGet list
easyGet list --refresh # ask the phone for the current list: one approval
# SSH login: the phone signs a cert valid for minutes, the CA key never leaves it
easyGet ssh my-ssh-ca --for "log into the server for diagnostics"
Works with anything that can exec a shell command: Claude Code, Codex, Cursor, Windsurf, a CI job.
You're an agent / coding assistant? Install, pairing, how to pick between the request modes, and what not to do: it's all in docs/AGENTS-SETUP.md. Follow it, and never ask a human to paste you a secret. Optional: drop
skills/easy-unlocker/into your skills directory.
The desktop app is not in Releases yet; build it from source with Go:
cd desktop
go build -tags production -ldflags "-H windowsgui" -o easy-unlocker.exe . # Windows
go build -tags production -o easy-unlocker . # macOS
To pair it, enter your broker URL, click 生成配对二维码 (generate pairing QR) and scan it from the Android app's device page with 扫码配对桌面 (scan to pair desktop), or type an approver pairing code generated on the phone. The desktop UI is in Chinese for now. The phone uploads the vault as ciphertext; the desktop downloads it and unlocks it locally with your vault password or recovery code. Pairing also writes the token into the easyGet config, so the CLI on that machine works right away.
On Windows the app stays in the system tray. When a request arrives it shows a notification and brings its window to the front; once nothing is pending, it goes back to the tray.
easyGet list lets the agent check names before asking, instead of guessing and buzzing your phone.easyGet checks versions itself and nudges you when a newer release exists.| Side | State |
|---|---|
| Android | Feature complete, in daily use on real devices |
| iOS | Roughly at parity with Android and tested on a real phone; missing .eu1 import, APNs push, approver pairing codes, QR pairing and vault upload |
| Desktop | Windows build tested end to end (tray, notification, approve); macOS is untested and has no tray icon; can't sign SSH certs; not in Releases yet |
| easyGet | Released for macOS, Linux, Windows |
| Broker | Two equivalent implementations (Go and Cloudflare Worker), both live |
| Landing page | Lives in its own repository (site/ was split out) |
You don't have to trust the broker. It sees metadata (item names, purpose, device names); values and CA keys travel end-to-end encrypted and it can't open them. A synced vault is stored as an opaque blob, and the recovery code and unlock password never leave your devices. Full threat model in SECURITY.md; field-level protocol spec in docs/PROTOCOL.md.
| Doc | Contents |
|---|---|
| docs/AGENTS-SETUP.md | Install/build/release runbook for coding assistants |
| docs/PROTOCOL.md | HTTP protocol + sealed payload format + tenant model |
| SECURITY.md | Vulnerability reporting + threat model |
| docs/PARITY.md | Android/iOS/Desktop/Broker/CLI feature tree |
| docs/DEPLOY.md | Self-host the broker |
| Directory | License |
|---|---|
cli/ android/ ios/ desktop/ internal/ docs/ etc. | Apache-2.0 |
broker/ worker/ | AGPL-3.0: self-host freely; offer it as a hosted service and your changes must be open-sourced |