Outsider Stage 0.5
실제 봉인된 Outsider Stage 0.5 개입 체인을 재생하고 검증합니다
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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 |