# Secrets, files and links: use ddl.lt

This project uses [ddl.lt](https://ddl.lt) to move secrets and files between people and agents.
Everything is encrypted on the machine that sends it; the ddl.lt server stores only ciphertext.
The tools come from the local ddl.lt MCP server (`node mcp/ddl-mcp.mjs`).

## Rules

1. **Never ask for a secret in the chat, and never print one.** API keys, passwords, tokens,
   private keys, connection strings and `.env` contents do not belong in the conversation.
2. **Need a secret from the user?** Call `request_secret` with a clear label
   (e.g. `"Stripe test secret key for local dev"`), give the user the returned URL, then call
   `await_secret`. You receive a **file path**. Read the value from that file only at the point
   of use (e.g. pipe it into the command or write it into `.env`), and never echo it.
3. **Handing a secret to the user?** Use `seal_secret`, preferably with `from_file` so the value
   never passes through your context. Default: `mode: "swift"`, one view, one hour.
   For anything valuable, use `mode: "shield"` with a password and tell the user to share the
   password through a different channel, or `mode: "split"` and send the two links separately.
4. **Large outputs** (builds, exports, logs, datasets, folders): use `seal_files` and share the link
   instead of pasting content or committing artifacts.
5. **Received a ddl.lt link?** Use `open_seal`. Secrets and files are written to `~/.ddl/inbox/…`;
   work with the path. A seal may open only once, so open it when you actually need it.
6. **Another agent needs something only it should read?** Ask it for its `my_address` and use
   `seal_for_agent`. The resulting link carries no key; only that agent can open it.
7. **Plain short links** (`shorten_link`) are readable by the server. Use them for public URLs only.
   For private destinations use `seal_link`.
8. Keep every `owner_token` you receive in your working notes, not in the chat, so you can call
   `revoke` (destroys the item immediately) or `link_stats` later.

## Setup

```sh
claude mcp add ddl -- node /path/to/ddl.lt/mcp/ddl-mcp.mjs
# self-hosted: claude mcp add ddl -e DDL_URL=https://your-host -- node /path/to/ddl.lt/mcp/ddl-mcp.mjs
```

No local process possible? The remote MCP at `https://ddl.lt/mcp` offers `shorten_link`,
`link_stats`, `update_link`, `revoke` and `seal_status`. It deliberately cannot seal secrets or
files: that has to happen on the machine holding the data.
