diff --git a/MESSAGING.md b/MESSAGING.md index 46e154e..f714e22 100644 --- a/MESSAGING.md +++ b/MESSAGING.md @@ -7,15 +7,27 @@ metadata, and social profiles aligned. Canonical one-liner: -`Xdrop is an open source file transfer app that encrypts files in your browser and keeps plaintext file names, contents, and keys off the server.` +`Xdrop is an open source encrypted file transfer app for browsers and agent-driven terminal workflows, keeping plaintext file names, contents, and keys off the server.` -This is the default introduction for Xdrop. If a surface only gets one sentence, use this one. +This is the default introduction for Xdrop when a surface only gets one sentence. + +Positioning framework: + +- **Category:** Open source encrypted file transfer. +- **Primary promise:** Plaintext file names, contents, and keys stay off the server. +- **Default experience:** Browser-first for normal sharing flows. +- **Extended workflow:** Also usable from agent-driven terminal environments such as Codex, remote + servers, dev containers, and CI-adjacent workflows. + +Short positioning summary: + +`Browser-first encrypted file transfer, with agent-ready terminal workflows.` ## Canonical Copy By Surface README first sentence: -`Xdrop is an open source file transfer app that encrypts files in your browser and keeps plaintext file names, contents, and keys off the server.` +`Xdrop is an open source encrypted file transfer app for browsers and agent-driven terminal workflows, keeping plaintext file names, contents, and keys off the server.` Homepage H1: @@ -23,21 +35,21 @@ Homepage H1: Homepage body: -`Xdrop is an open source file transfer app that encrypts files in your browser and keeps plaintext file names, contents, and keys off the server.` +`Xdrop is an open source encrypted file transfer app for browsers and agent-driven terminal workflows, keeping plaintext file names, contents, and keys off the server.` Homepage and SEO title: -`Open Source Encrypted File Transfer in the Browser | Xdrop` +`Open Source Encrypted File Transfer for Browsers and Agents | Xdrop` Meta description: -`Xdrop is an open source file transfer app that encrypts files in your browser and keeps plaintext file names, contents, and keys off the server.` +`Xdrop is an open source encrypted file transfer app for browsers and agent-driven terminal workflows, keeping plaintext file names, contents, and keys off the server.` OG card headline: `Open source encrypted` -`file transfer in your browser.` +`file transfer for browsers and agents.` OG card support line: @@ -45,35 +57,62 @@ OG card support line: Short social bio: -`Open source file transfer with in-browser encryption. Plaintext file names, contents, and keys stay off the server.` +`Open source encrypted file transfer for browsers and agents. Plaintext file names, contents, and keys stay off the server.` Short technical summary: -`Browser-encrypted file transfer with plaintext kept off the server.` +`Browser-first encrypted file transfer with agent-ready terminal workflows and plaintext kept off the server.` + +Terminal and agent support blurb: + +`Xdrop can also be used from agent-driven terminal workflows to upload files, return encrypted share links, and download full Xdrop links for local decryption.` + +Use-case summary: + +`Use Xdrop in the browser for normal sharing, or through an agent when you need to move files out of a cloud server, remote container, or automated terminal workflow.` + +Chinese reference copy: + +- Canonical one-liner: + `Xdrop 是一个开源加密文件传输应用,以浏览器为主体验,也支持智能体驱动的终端工作流,并确保服务端拿不到明文文件名、文件内容和密钥。` +- Short positioning summary: + `以浏览器为主体验的加密文件传输,也支持智能体终端工作流。` +- Agent support blurb: + `日常分享可直接使用浏览器;如果你需要把文件从云服务器、远程容器或自动化终端流程中传出来,也可以通过智能体使用 Xdrop。` ## Messaging Priorities When space is limited, keep these ideas in this order: 1. Xdrop is open source. -2. Encryption happens in the browser. +2. Xdrop is encrypted file transfer, not generic file sharing. 3. Plaintext file names, contents, and keys stay off the server. -4. `No account required` is a useful supporting point, but not the main definition. +4. The product is browser-first, but not browser-only. +5. `No account required` is a useful supporting point, but not the main definition. ## Preferred Language -- Prefer `encrypts files in your browser` over `browser-side encryption` in user-facing copy. +- Prefer `encrypted file transfer` as the main category label. +- Prefer `browser-first` when you need to signal the main UX without implying the browser is the + only supported way to use Xdrop. +- Prefer `agent-driven terminal workflows` or `use Xdrop via an agent` when describing the skill + and CLI-style experience. +- Prefer `encrypts files in your browser` when the copy is specifically about the web app flow. - Prefer `keeps plaintext ... off the server` over `ciphertext-only storage` unless the audience is technical. -- Prefer `open source file transfer app` when introducing Xdrop for the first time. -- Prefer `in-browser encryption` as the compact form when space is tight. +- Prefer `open source encrypted file transfer app` when introducing Xdrop for the first time. +- Prefer `in-browser encryption` as a compact technical benefit, not as the whole product category. - Use `AES-256-GCM` in technical docs, threat-model explanations, and implementation notes, not as the default marketing hook. ## Avoid - Avoid using `private file transfer` as the only product summary. +- Avoid presenting Xdrop as browser-only now that agent workflows are a supported entry point. - Avoid mixing `private`, `secure`, `browser-side`, and `ciphertext-only` as interchangeable main taglines. - Avoid making `no account required` the primary headline. It is a benefit, not the core definition. -- Avoid shortening the promise to just `secure uploads` because it removes the browser and server model that makes Xdrop distinct. +- Avoid shortening the promise to just `secure uploads` because it removes the architecture and + server-trust model that make Xdrop distinct. +- Avoid making `agents` or `CLI` the only headline unless the surface is explicitly about the skill + or terminal workflow. ## Tone @@ -81,13 +120,17 @@ When space is limited, keep these ideas in this order: - Technical enough to be accurate, but readable for non-specialists. - Calm and factual instead of hype-heavy. - Confident about the architecture, careful about broader security claims. +- Product-language first, with workflow details added only where they help explain real use. ## Copy Review Checklist Before shipping new product-facing copy, check: - Does it describe Xdrop as open source? -- Does it say encryption happens in the browser? +- Does it clearly frame Xdrop as encrypted file transfer? - Does it make clear that plaintext names, contents, and keys stay off the server? +- If it mentions the main UX, does it say browser-first rather than implying browser-only? +- If it mentions agent usage, does it describe it as an additional workflow rather than a separate + product? - Is `no account required` used as support rather than the core identity? - Does it avoid introducing a new summary line that conflicts with the canonical one-liner? diff --git a/README.md b/README.md index 0cfe4d8..56a9c70 100644 --- a/README.md +++ b/README.md @@ -37,8 +37,8 @@ English | 汉语

-Xdrop is an open source file transfer app that encrypts files in your browser and keeps -plaintext file names, contents, and keys off the server. +Xdrop is an open source encrypted file transfer app for browsers and agent-driven terminal +workflows, keeping plaintext file names, contents, and keys off the server. ## Highlights @@ -48,6 +48,35 @@ plaintext file names, contents, and keys off the server. - Expiring links, sender-side management, and optional privacy mode after upload. - S3-compatible object storage support with PostgreSQL and Redis on the backend. +## Use Via Agents + +You can also use Xdrop through an agent by installing the bundled skill: + +```bash +npx skills add https://github.com/xixu-me/xdrop/tree/main/skills/xdrop +``` + +After that, the agent can use Xdrop from the terminal to: + +- Upload local files or directories and return an encrypted share link. +- Download a full Xdrop share link, including `#k=...`, and decrypt it locally. +- Automate repeatable handoff flows without switching to the browser UI. + +Useful cases: + +- On a cloud server, ask the agent to upload build artifacts, logs, or backups to your Xdrop + instance and send back a temporary link. +- In a remote dev container or CI-like environment, ask the agent to package a directory and move + it through Xdrop instead of setting up ad hoc SCP or public object storage access. +- On your local machine, hand the agent a full Xdrop link and ask it to download the files into a + specific directory. + +Example prompts: + +- `Upload ./dist to https://xdrop.example.com and give me a 1-hour Xdrop link.` +- `On this VM, send /var/log/myapp through Xdrop so I can inspect it locally.` +- `Download this Xdrop link into ~/downloads and keep the original folder structure.` + ## How It Works 1. A sender creates a transfer in the browser. Xdrop generates a random transfer root key and a diff --git a/README.zh.md b/README.zh.md index 93c8d5e..25ca046 100644 --- a/README.zh.md +++ b/README.zh.md @@ -37,7 +37,7 @@ English | 汉语

-Xdrop 是一个开源文件传输应用,会在浏览器中先加密文件再上传,确保服务端拿不到明文文件名、文件内容和密钥。 +Xdrop 是一个开源加密文件传输应用,默认适用于浏览器,也支持智能体驱动的终端工作流,并确保服务端拿不到明文文件名、文件内容和密钥。 ## 亮点 @@ -47,6 +47,32 @@ Xdrop 是一个开源文件传输应用,会在浏览器中先加密文件再 - 支持到期失效链接、发送方管理,以及上传后的可选隐私模式。 - 后端支持兼容 S3 的对象存储,并使用 PostgreSQL 和 Redis。 +## 通过智能体使用 + +你也可以把 Xdrop 作为智能体技能来用,安装存储库自带的 skill: + +```bash +npx skills add https://github.com/xixu-me/xdrop/tree/main/skills/xdrop +``` + +安装后,智能体可以直接在终端中使用 Xdrop 来: + +- 上传本地文件或目录,并返回加密分享链接。 +- 接收完整的 Xdrop 分享链接(包含 `#k=...`)后,在本地下载并解密文件。 +- 把文件交接流程自动化,而不用每次都切换到浏览器界面操作。 + +适合的场景包括: + +- 在云服务器上让智能体把构建产物、日志或备份上传到你的 Xdrop 实例,并返回一个临时链接给你。 +- 在远程开发容器或类似 CI 的环境里,让智能体把某个目录打包后通过 Xdrop 传出来,而不是临时配置 SCP 或公开对象存储权限。 +- 在本地机器上直接把完整的 Xdrop 链接交给智能体,让它下载到指定目录并完成解密。 + +示例指令: + +- `把 ./dist 上传到 https://xdrop.example.com,并给我一个 1 小时有效的 Xdrop 链接。` +- `在这台云服务器上把 /var/log/myapp 通过 Xdrop 发出来,我要在本地排查。` +- `把这个 Xdrop 链接下载到 ~/downloads,并保留原始目录结构。` + ## 工作原理 1. 发送方在浏览器中创建一次传输。Xdrop 会生成随机的传输根密钥和独立的链接密钥,可选地移除图片中可删除的元数据,并在上传开始前准备好可恢复的本地状态。 diff --git a/apps/web/index.html b/apps/web/index.html index 6ede3dd..803ff02 100644 --- a/apps/web/index.html +++ b/apps/web/index.html @@ -8,7 +8,7 @@ - Open Source Encrypted File Transfer in the Browser | Xdrop + Open Source Encrypted File Transfer for Browsers and Agents | Xdrop
diff --git a/apps/web/public/manifest.webmanifest b/apps/web/public/manifest.webmanifest index fc66d16..b14a4cf 100644 --- a/apps/web/public/manifest.webmanifest +++ b/apps/web/public/manifest.webmanifest @@ -1,7 +1,7 @@ { "name": "Xdrop", "short_name": "Xdrop", - "description": "Xdrop is an open source file transfer app that encrypts files in your browser and keeps plaintext file names, contents, and keys off the server.", + "description": "Xdrop is an open source encrypted file transfer app for browsers and agent-driven terminal workflows, keeping plaintext file names, contents, and keys off the server.", "theme_color": "#12140f", "background_color": "#f7f2e8", "display": "standalone", diff --git a/apps/web/scripts/generate-seo-assets.mjs b/apps/web/scripts/generate-seo-assets.mjs index a1bb550..394b253 100644 --- a/apps/web/scripts/generate-seo-assets.mjs +++ b/apps/web/scripts/generate-seo-assets.mjs @@ -18,9 +18,21 @@ const DEFAULT_ROBOTS = const PRIVATE_ROBOTS = 'noindex, nofollow, noarchive, nosnippet' const STRUCTURED_DATA_ID = 'xdrop-structured-data-static' -const HOME_TITLE = 'Open Source Encrypted File Transfer in the Browser | Xdrop' +const HOME_TITLE = 'Open Source Encrypted File Transfer for Browsers and Agents | Xdrop' const HOME_DESCRIPTION = - 'Xdrop is an open source file transfer app that encrypts files in your browser and keeps plaintext file names, contents, and keys off the server.' + 'Xdrop is an open source encrypted file transfer app for browsers and agent-driven terminal workflows, keeping plaintext file names, contents, and keys off the server.' +const HISTORY_PAGE_TITLE = 'Manage Transfers on This Device | Xdrop' +const HISTORY_PAGE_DESCRIPTION = + 'Manage encrypted transfers stored in this browser on this device. There is no account or cross-device history.' +const SHARE_PAGE_TITLE = 'Share the Full Link | Xdrop' +const SHARE_PAGE_DESCRIPTION = + 'Review upload status and copy the full share link for a transfer staged in this browser on this device.' +const RECEIVE_PAGE_TITLE = 'Download and Decrypt in the Browser | Xdrop' +const RECEIVE_PAGE_DESCRIPTION = + 'Download files from this transfer and decrypt them in the browser. The decryption key stays in the share link fragment.' +const NOT_FOUND_PAGE_TITLE = 'Page Not Found | Xdrop' +const NOT_FOUND_PAGE_DESCRIPTION = + 'The address does not map to a page in Xdrop. If this came from a shared transfer, ask for the full URL, including the #k=... decryption fragment.' const routeShells = [ { @@ -34,35 +46,31 @@ const routeShells = [ { outputPath: 'transfers/index.html', pagePath: '/transfers', - title: 'Manage Transfers on This Device | Xdrop', - description: - 'Manage encrypted transfers stored in this browser. There is no account or cross-device history.', + title: HISTORY_PAGE_TITLE, + description: HISTORY_PAGE_DESCRIPTION, robots: PRIVATE_ROBOTS, exposeUrl: false, }, { outputPath: 'share/index.html', pagePath: '/share/', - title: 'Share the Full Link | Xdrop', - description: - 'Review upload status and copy the full share link for a browser-encrypted transfer.', + title: SHARE_PAGE_TITLE, + description: SHARE_PAGE_DESCRIPTION, robots: PRIVATE_ROBOTS, exposeUrl: false, }, { outputPath: 't/index.html', pagePath: '/t/', - title: 'Download and Decrypt in the Browser | Xdrop', - description: - 'Download files from this transfer and decrypt them in the browser. The decryption key stays in the share link fragment.', + title: RECEIVE_PAGE_TITLE, + description: RECEIVE_PAGE_DESCRIPTION, robots: PRIVATE_ROBOTS, exposeUrl: false, }, { outputPath: 'not-found/index.html', - title: 'Page Not Found | Xdrop', - description: - 'The address does not map to a page in Xdrop. If this came from a shared transfer, ask for the full URL, including the #k=... decryption fragment.', + title: NOT_FOUND_PAGE_TITLE, + description: NOT_FOUND_PAGE_DESCRIPTION, robots: PRIVATE_ROBOTS, exposeUrl: false, }, diff --git a/apps/web/src/app/Shell.tsx b/apps/web/src/app/Shell.tsx index e303949..0fbcc10 100644 --- a/apps/web/src/app/Shell.tsx +++ b/apps/web/src/app/Shell.tsx @@ -20,7 +20,7 @@ export function Shell() { /> Xdrop - Browser-encrypted transfer + Encrypted file transfer