How to give secrets to scripts and AI agents
Pass secrets by reference, not by value. gone send --message-file turns a file into a one-time link, and gone get - --message-out turns a link back into a file, so the secret never appears in a script’s output, a CI log or an AI agent’s context.
Why plaintext in output is the problem
Scripts and agents record what they see: terminal output, CI logs, chat transcripts and an agent’s context window. A secret printed once can be copied into all of them, and kept long after it’s used. The gone CLI is built to keep the secret in files you control and pass only links around.
Send a file’s contents
gone send --message-file /root/.restic-password --ttl 1h --json </dev/null | jq -r .linkThe message comes from the file, not from cat, so nothing secret flows through a pipe. Only the link is printed.
Receive into a file
gone get - --message-out ./restic.pw --json < link.txtThe link is read from standard input, so it needs no quoting and stays out of the process list. The secret is written to a new file readable only by you, and never printed. The JSON result says only where it went and how big it is.
Ask a person and wait
A script or agent that needs a credential it doesn’t have can ask for it and wait:
gone request --label "prod DB for migration" --wait --message-out ./db.pw --json </dev/null > events.json &
head -1 events.json | jq -r .link # hand this link to the person who has the secret
wait # returns once they've answeredThe secret lands in ./db.pw and never passes through the output. If the wait is interrupted, gone request open ID --wait --message-out ./db.pw picks it up again.
Guidelines
- Don’t use
gone get --jsonwithout--message-out. Itsmessagefield is the plaintext. - No prompts. With
--message-fileand--passphrase-file,gonenever reads the terminal. Redirect standard input from/dev/nullanyway, so nothing can wait on a terminal. - Mistakes don’t burn the secret. Everything
gone getcan check locally (the link, the passphrase file and the output paths) is checked before the link is opened. - Only your own server by default. A link for another server is refused before anything is sent, unless you pass
--allow-origin. - Delete the file once it’s been used.
Send a secret Free, no account, in your browser at app.getgone.dev.
The full list of flags, exit codes and JSON fields is in the CLI reference.