Start here
What would you like to do?
Choose one path. Each path is ordered from first command to first successful use, so you do not have to decide which credential, integration, or setup step comes next.
For MCP-only account tools
How should Codex sign in?
Use a browser callback when this terminal can receive it. Use a device code for SSH, containers, VS Code remote, or any terminal without that callback.
Codex project sharing
Set up once, then share from Codex chat
This path creates one local project profile and one project-scoped service identity. It does not create or require a separate Service API client, Service key passphrase, or .env file.
- Install or update the ZipPigeon CLI.
installer="${TMPDIR:-/tmp}/install-zippigeon.sh" curl --proto '=https' --tlsv1.2 -fsSLo "$installer" \ https://www.zippigeon.com/downloads/install-zippigeon.sh sh "$installer" export PATH="$HOME/.zippigeon/bin:$PATH" hash -r 2>/dev/null || true command -v zippigeon zippigeon version - Install the ZipPigeon Developer plugin.
codex plugin marketplace add git@github.com:KasraRassouli/zippigeon.git \ --ref qa \ --sparse .agents/plugins \ --sparse plugins/zippigeon-developer codex plugin add zippigeon-developer@zippigeon - Connect ZipPigeon, then start Codex. Keep this terminal open while you approve the displayed device code in any browser. The same flow works for a local computer, SSH, VS Code remote, or a container.
zippigeon mcp login --device --server https://www.zippigeon.com zippigeon mcp codex \ --server https://www.zippigeon.com \ --name zippigeon \ -- --sandbox danger-full-access - In the new Codex session, create the project profile. Codex will ask for a new project-profile passphrase in the terminal; save it in a password manager. Never paste it into chat, an .env file, or a command line.
Set up ZipPigeon for this project. - Exit that Codex session and relaunch with the completed profile. Replace
PROFILE_NAMEwith the name reported by setup.zippigeon mcp codex \ --server https://www.zippigeon.com \ --name zippigeon \ --profile PROFILE_NAME \ -- --sandbox danger-full-access - Share from the new Codex session. Ask for a named workspace file and recipient. Choose verified email delivery for someone who does not have a ZipPigeon account.If Codex asks for a passphrase in regular chat, stop rather than sending it: exit and run the named-profile doctor check in the terminal, then use the recovery guidance below if it cannot unlock.
Send test.txt securely to recipient@example.com with ZipPigeon. Use verified email delivery if the recipient does not have a ZipPigeon account.
Codex MCP only
Connect account tools without workspace-file sharing
Choose this when you want ZipPigeon available in Codex but do not need it to encrypt and share files from this workspace.
- Connect the ZipPigeon MCP, sign in, and verify it.
Approve the browser sign-in when prompted.
codex mcp add zippigeon \ --url https://www.zippigeon.com/mcp \ --oauth-resource https://www.zippigeon.com/mcp codex mcp login zippigeon codex mcp get zippigeon --jsonKeep the terminal open while you approve the displayed code in any browser.zippigeon mcp login --device --server https://www.zippigeon.com zippigeon mcp codex \ --server https://www.zippigeon.com \ --name zippigeon \ -- --sandbox danger-full-access - Open a new Codex conversation and use the ZipPigeon tools. No Service API client, CLI install, passphrase, or project profile is needed for this path.
Direct CLI
Upload from a terminal
This path creates one direct Service API client for terminal uploads. It does not install the Codex plugin, connect the MCP, or create a Codex project profile.
- Install or update the ZipPigeon CLI.
installer="${TMPDIR:-/tmp}/install-zippigeon.sh" curl --proto '=https' --tlsv1.2 -fsSLo "$installer" \ https://www.zippigeon.com/downloads/install-zippigeon.sh sh "$installer" export PATH="$HOME/.zippigeon/bin:$PATH" hash -r 2>/dev/null || true command -v zippigeon zippigeon version - Create a direct CLI Service API client. In ZipPigeon, open Account → Service API, create a service integration, choose and save its Key passphrase in a password manager, then leave the one-time credentials panel open.
- Import the one-time configuration in this terminal. Run the command, paste the encrypted configuration from the open ZipPigeon panel, press Ctrl+D, and enter the saved Key passphrase only at the concealed terminal prompt.
zippigeon configure --paste - Make your first terminal upload. For a guest recipient, verified email delivery sends them an email with a one-time verification code; they do not need a ZipPigeon account. This requires CLI 0.1.5 or later: CLI 0.1.4 accepts
--email-sharebut still attempts an account-bound share.zippigeon doctor zippigeon upload ./report.pdf \ --recipient recipient@example.com \ --email-share - Clear the direct CLI passphrase when you are finished. This only clears the terminal-upload credential; it does not change the project profile.
unset ZIPPIGEON_KEY_PASSPHRASE
Need both terminal uploads and Codex chat sharing?
Complete the Codex chat path and the terminal path separately. This intentionally creates two scoped service credentials: the project profile for Codex and the direct Service API client for terminal uploads. Do not repeat MCP authorization just to add terminal uploads.
Troubleshooting, reset, and other integrations
Choose how to connect
Free, Personal, and Pro accounts can connect ZipPigeon to inspect plan usage, work with eligible encrypted transfers, and open the browser-protected upload flow within their plan limits. Pro also includes CLI and Service API automation.
- ChatGPT: add ZipPigeon as a developer-mode MCP connection.
- Codex with a browser callback: connect directly with the Codex CLI.
- Remote Codex, SSH, or browser containers: use the ZipPigeon CLI device-code flow.
- Claude Code: add ZipPigeon as a remote HTTP MCP server and authorize with Claude Code OAuth.
Before installing Codex: choose the credential path
Installing the Codex plugin adds the ZipPigeon tools and setup skill; it does not create a local upload credential or a project profile. Choose the path that matches how you intend to send files.
- Account connection only: install the plugin and authorize the remote MCP connection. No Service API client or key passphrase is required.
- Share files from Codex chat: after installing and authorizing the plugin, ask Codex to set up ZipPigeon for the project. With Pro access, Codex creates one sealed project profile, prompts for a local passphrase, and provisions one scoped project service identity. Do not create a separate Service API client first.
- Run zippigeon upload directly in a terminal: create one Service API client first under Account → Service API, save its key passphrase, and import its one-time configuration. This does not create a Codex project profile.
- Need both terminal uploads and Codex chat sharing: complete those two paths separately. They intentionally use two scoped service credentials; do not repeat MCP authorization just to add terminal uploads.
Connect ChatGPT
Add ZipPigeon as a developer-mode MCP connection, authorize your account, then enable it in a new conversation.
- Open Settings → Security and login, then turn on Developer mode.
- Open ChatGPT Plugins, select the plus button, and create a connection named ZipPigeon Developer.
- Enter the MCP URL below, review the discovered tools, and continue to ZipPigeon sign-in.
- Approve only the permissions you expect, then start a new conversation with ZipPigeon enabled. Workspace policy may restrict Developer mode.
https://www.zippigeon.com/mcp
Send a file already attached in ChatGPT
Enable ZipPigeon in the conversation and ask to send the attached file to an exact recipient. The ZipPigeon secure-upload panel lets you select that ChatGPT file, encrypts it inside the embedded browser component, and uploads only ciphertext to ZipPigeon. Continue to the signed-in ZipPigeon page, where your unlocked account key authorizes the encrypted manifest. Review the prefilled recipient and select Share by email to send it.
- Example: “Send the attached report securely to recipient@example.com with ZipPigeon.”
- Selecting a ChatGPT attachment does not undo its existing presence in ChatGPT; use ZipPigeon direct upload when the file must never enter a ChatGPT conversation.
- The account private key never enters the connector, ChatGPT, or MCP tool output.
- The recipient is never emailed automatically: the first-party ZipPigeon confirmation remains required.
Install the packaged Codex plugin on QA
QA testers with repository access can add the QA branch as a sparse Codex marketplace, install ZipPigeon Developer, and then choose the browser-callback or remote-terminal authorization flow below. Installation alone does not configure a project profile; complete the project-profile step below before asking Codex to share a workspace file. The sparse paths avoid cloning the full application into the Codex marketplace cache.
- Run the marketplace command once per Codex installation.
- Rerun codex plugin marketplace upgrade zippigeon and codex plugin add zippigeon-developer@zippigeon after a QA plugin update.
- Restart Codex and open a new thread after installing or updating the plugin.
codex plugin marketplace add git@github.com:KasraRassouli/zippigeon.git \
--ref qa \
--sparse .agents/plugins \
--sparse plugins/zippigeon-developer
codex plugin add zippigeon-developer@zippigeon
Update the ZipPigeon CLI before setting up a project
The Codex plugin does not install the ZipPigeon CLI. Project profiles require CLI 0.1.4 or later. Verified-email guest delivery requires CLI 0.1.5 or later; older binaries do not support that guest-email flow and can show a misleading account-only recipient error.
- Run command -v zippigeon and zippigeon version first. The current executable must be $HOME/.zippigeon/bin/zippigeon, not an older /usr/local/bin copy.
- After the update, confirm the installed command and version before asking Codex to set up the project.
- The installer only updates the local CLI. It does not create a Service API client, project profile, passphrase, or account connection.
installer="${TMPDIR:-/tmp}/install-zippigeon.sh"
curl --proto '=https' --tlsv1.2 -fsSLo "$installer" \
https://www.zippigeon.com/downloads/install-zippigeon.sh
sh "$installer"
export PATH="$HOME/.zippigeon/bin:$PATH"
hash -r 2>/dev/null || true
command -v zippigeon
zippigeon version
Set up a Codex project profile step by step
Use this Pro-only sequence after installing the plugin, updating the CLI, and completing the device-code connection above. Start Codex without --profile. In the new Codex session, use the exact request below; the installed setup skill performs the local and connector steps in order.
- First complete the CLI update checks immediately above. Do not run project setup through a 0.1.0 CLI or when project prepare is unavailable.
- Use the device-code command above to launch Codex without --profile. Do not use zippigeon doctor, zippigeon configure, a Service API client, or ZIPPIGEON_KEY_PASSPHRASE for this flow.
- Codex creates local keys, then shows Project profile passphrase: in the terminal. Type a new passphrase there; nothing is echoed. Save it in a password manager and use the same value at the later completion prompt. Never set ZIPPIGEON_KEY_PASSPHRASE or add it to an .env file for this flow. The project passphrase is not your ZipPigeon account password and never belongs in chat.
- Codex then creates the project-scoped service identity, completes the local profile, and runs the named profile doctor check. Note the reported profile name.
- Exit Codex after the successful doctor check and follow the relaunch command in the next step. That enables the local zippigeon-project server used for approved workspace-file shares.
- Do not use zippigeon upload ./file --recipient ... as the project setup command. Without --profile it attempts to unlock a separate default service configuration and can prompt for an unrelated passphrase.
Set up ZipPigeon for this project.
Relaunch Codex with the completed project profile
Run this only after the prior setup reports a successful named profile and doctor check. Replace PROFILE_NAME with that reported name, then use the new Codex session to request an approved workspace-file share.
- This is still the Codex project-sharing path. It does not require a Service API client or a Service key passphrase.
- The local server shares only an explicitly named workspace-relative file after Codex shows its normal tool approval.
zippigeon mcp codex \
--server https://www.zippigeon.com \
--name zippigeon \
--profile PROFILE_NAME \
-- --sandbox danger-full-access
If you forget the project profile passphrase
The passphrase cannot be recovered, reset, or changed because it encrypts the local private-key bundle. Do not try a Service API reset, zippigeon doctor without the profile, ZIPPIGEON_KEY_PASSPHRASE, or a generic cleanup command.
- Create a replacement through the normal Codex project setup flow with a new, distinct profile name. Do not overwrite or delete the old local profile first.
- After the replacement completes, relaunch Codex with its new profile name and verify that its named-profile doctor check works.
- Only after the replacement works, revoke the old scoped service identity in Account → Service API. Delete a local profile only when you explicitly intend to discard that exact named profile.
Set up ZipPigeon for this project with profile NEW_PROFILE_NAME.
Start a project profile over
To deliberately recreate one named project profile, use the reset command. It removes only that profile’s local encrypted pending or completed file; it does not remove the CLI, device login, or a separate direct Service API configuration.
- The --yes flag is required because this permanently removes the local encrypted keys for the named profile. Replace PROJECT_PROFILE with the actual profile name.
- If the profile had completed previously, revoke its old service identity in Account → Service API before recreating the same profile name.
- After reset, reconnect through device login and ask Codex to set up the profile again. No Service API passphrase or ZIPPIGEON_KEY_PASSPHRASE is involved.
zippigeon project reset --profile PROJECT_PROFILE --yes
zippigeon mcp login --device --server https://www.zippigeon.com
Reconnect if project setup says recent verification expired
Recent verification applies only while ZipPigeon creates the Pro project identity. The error means the connected account credential is no longer fresh enough for that action; it does not mean the project passphrase is wrong, does not expose a secret, and does not create an identity.
- Do not rerun zippigeon project prepare, generate new keys, or choose a new passphrase. The original public setup request can be reused.
- For a browser-capable Codex terminal, run codex mcp login zippigeon, approve the same ZipPigeon account in the browser, then return to the same setup conversation.
- For SSH, a container, VS Code remote, or Rancher, use the device-code command below, approve it in any browser, and relaunch Codex with zippigeon mcp codex.
- After reconnecting, say: “Continue ZipPigeon project setup.” If a relaunched remote Codex session asks for the original setupRequest, provide only that public-key object from project prepare; never provide the pending profile, encrypted bundle, or passphrase.
codex mcp login zippigeon
Connect Codex with a browser callback
Run these commands in the Codex terminal. The login command opens ZipPigeon authorization in your browser. Sign in, review the requested permissions, approve access, and return to Codex.
- When replacing an incomplete or outdated ZipPigeon entry, run codex mcp remove zippigeon before the commands below.
- Run codex mcp login zippigeon after adding the server; rerun it if authorization was interrupted.
- Use /mcp inside Codex to confirm that ZipPigeon is connected.
codex mcp add zippigeon \
--url https://www.zippigeon.com/mcp \
--oauth-resource https://www.zippigeon.com/mcp
codex mcp login zippigeon
codex mcp get zippigeon --json
Connect remote Codex with a device code
Use this flow when Codex runs over SSH, in a VS Code remote or Rancher terminal, in a browser container, or on another device that cannot receive the localhost callback. Codex MCP login does not offer a manual callback-paste option. Install the current ZipPigeon CLI, ensure its user-owned path wins over a stale global binary, run device login, and open the displayed verification URL in any browser. First launch Codex without --profile to authorize the connector or create a project profile; add --profile only after that setup succeeds.
- Keep the terminal open while you approve the code; the code expires after ten minutes.
- The terminal displays the one-time code. Enter or confirm that code in the browser; the terminal polls for approval automatically.
- The access token is stored in an owner-only file and is never printed or pasted into the terminal, chat, or a command argument.
- Do not run codex mcp login zippigeon in this fallback; that command starts the localhost callback flow that device authorization replaces.
- Run the device login command again after the short-lived MCP token expires.
- For Rancher environments that reject Bubblewrap namespaces, pass --sandbox danger-full-access after --. Do not use --yolo, because it also disables approvals.
installer="${TMPDIR:-/tmp}/install-zippigeon.sh"
curl --proto '=https' --tlsv1.2 -fsSLo "$installer" \
https://www.zippigeon.com/downloads/install-zippigeon.sh
sh "$installer"
export PATH="$HOME/.zippigeon/bin:$PATH"
hash -r 2>/dev/null || true
command -v zippigeon
zippigeon version
zippigeon mcp login --device --server https://www.zippigeon.com
zippigeon mcp codex \
--server https://www.zippigeon.com \
--name zippigeon \
-- --sandbox danger-full-access
Use the standalone upload command directly
This is a different path from Codex project sharing. Before running zippigeon upload ./file --recipient recipient@example.com, create a Service API client in the signed-in ZipPigeon app.
- Open Account → Service API, choose a service integration, and enter a new Key passphrase. Save it in a password or secret manager before creating the client.
- Keep the one-time credentials panel open. Run zippigeon configure --paste, copy the encrypted configuration into that waiting terminal, press Ctrl+D, and enter the Key passphrase you chose.
- Run zippigeon doctor and enter the same passphrase. Only after it verifies should you run zippigeon upload.
- If the original Key passphrase was not saved, create a new Service API client. The encrypted private-key bundle cannot be unlocked or recovered without it.
Send to an email recipient without a ZipPigeon account
Use verified email delivery when the recipient does not have an account. ZipPigeon sends the recipient an access email, and that mailbox must enter a one-time verification code before the encrypted transfer can open.
- Use account-bound delivery for existing ZipPigeon members. It is tied to their account keys.
- Use --email-share for a guest email address. This is not a bearer secure link and does not require the recipient to create an account.
- This requires CLI 0.1.5 or later. CLI 0.1.4 accepts the flag but still attempts an account-bound share; run zippigeon version, then update with the signed installer above if needed.
- Do not silently change an account-bound delivery into a link: choose the intended delivery type before sending.
zippigeon upload ./report.pdf \
--recipient recipient@example.com \
--email-share
Set ZIPPIGEON_KEY_PASSPHRASE for a direct CLI session
Use this only after you have created and imported a Service API client for the standalone upload command. It is not used for Codex project profiles; those use a concealed local passphrase prompt instead. Never put this value in an .env file, even one ignored by Git: Codex can read it and child processes can inherit it.
- This zsh command stores the passphrase only in the current terminal session, without echoing it to the screen.
- Run zippigeon upload in that same terminal after doctor succeeds.
- When you are finished, run unset ZIPPIGEON_KEY_PASSPHRASE. Also unset it before project prepare or mcp codex. Never put the passphrase in an .env file, shell startup file, source control, or chat.
- If you already put it in an .env file and an AI, tool, or source-control system could read it, remove it and retire that Service API client. Create a replacement with a new Key passphrase.
read -rs "ZIPPIGEON_KEY_PASSPHRASE?Service key passphrase: "
print
export ZIPPIGEON_KEY_PASSPHRASE
zippigeon doctor
Repair one Codex component at a time
Exit Codex before changing its connection state. Do not run a multi-command cleanup: an MCP connection, the packaged plugin, the local CLI, device credentials, and an encrypted project profile are independent components. A profile reset must be a deliberate, separately confirmed action because deleting its local encrypted file permanently removes the ability to unlock it.
- To revoke a device-code credential, close Codex and run zippigeon mcp logout with --yes. It invalidates the OAuth token at ZipPigeon and removes only that local device credential; it does not create or use a Service API client, zippigeon doctor, or ZIPPIGEON_KEY_PASSPHRASE.
- For any developer app authorization, open Account → Developer Connector and choose Revoke access. If Codex reports either zippigeon or zippigeon-device is not logged in, exit Codex, remove those two MCP entries, then rerun device login and relaunch Codex through zippigeon mcp codex. Do not delete project-profile files to reset device authorization.
- For a missing or outdated CLI, reinstall it with the signed installer. Do not delete a CLI binary first, and do not delete a global /usr/local/bin copy unless you know which package manager owns it.
- For a plugin problem, update or reinstall only the ZipPigeon Developer plugin. Removing a plugin does not delete a project profile, and a failed keyring logout does not prove that a profile was removed.
- For a lost project-profile passphrase, create a replacement profile through the project setup flow. Before removing the exact named old profile, revoke its old service identity in Account → Service API. Never use the literal label PROJECT_PROFILE as a profile name: it does not select the intended profile.
codex mcp list
codex mcp remove zippigeon-device
codex mcp remove zippigeon
zippigeon mcp login --device --server https://www.zippigeon.com
zippigeon mcp codex \
--server https://www.zippigeon.com \
--name zippigeon \
-- --sandbox danger-full-access
Connect Claude Code
Add ZipPigeon as a remote HTTP MCP server and let Claude Code complete OAuth directly. Claude Code owns the local OAuth credential storage; do not copy tokens into chat, shell arguments, or project files.
- Use user scope to make the private connection available across your projects, or change it to local or project scope when that boundary is more appropriate.
- Run the login command and approve ZipPigeon in the browser. For an SSH terminal, add --no-browser and paste the resulting callback URL when prompted.
- Use /mcp inside Claude Code, or claude mcp get zippigeon in the terminal, to verify the connection.
claude mcp add --transport http --scope user zippigeon \
https://www.zippigeon.com/mcp
claude mcp login zippigeon
claude mcp get zippigeon
Verify and use the connection safely
Start a new conversation, enable ZipPigeon, and ask it to show your current plan or encrypted-transfer status. Review every write action before approving it. Never paste a private key, API token, encrypted profile, passphrase, or device credential into ChatGPT, Codex, Claude Code, source control, or a project environment file.
- ChatGPT users manage the connection under Plugins.
- Codex users can inspect it with /mcp and remove it with codex mcp remove zippigeon.
- Claude Code users can inspect it with /mcp and remove it with claude mcp remove zippigeon.
- Reconnect after changing accounts or when a short-lived device credential expires.
