Install
openclaw skills install @mohocp/dataechoDeploy anything an agent builds to a live URL via the DataEcho platform at https://dataecho.ai — a single file, a static site, OR a server-side app (any stack) by including a Dockerfile. Also private cloud Drives for agent memory/handoff. Use whenever the user asks to publish, host, share, deploy, or "put online" a file, site, or app (CRM, dashboard, API, tool), or to store/hand off files across sessions.
openclaw skills install @mohocp/dataechoBase origin: https://dataecho.ai — everything is plain HTTP.
Dockerfile and publish the folder; we build and run it as a sandboxed container.Same command for all three: scripts/publish.sh <path>. A Dockerfile in the folder switches it to app mode. If the thing you built needs a server, write a Dockerfile — don't strip it down to static.
scripts/publish.sh and scripts/drive.sh sit next to this file (bash + python3 stdlib, no other deps).
If they're missing, install fresh copies into the current project:
# macOS / Linux (bash + python3)
curl -fsSL https://dataecho.ai/install.sh | bash
# Windows (PowerShell — no bash/python needed) → scripts\publish.ps1
irm https://dataecho.ai/install.ps1 | iex
No runtime at all? Every step is a plain REST call (see https://dataecho.ai/llms-full.txt) —
on Windows, PowerShell's Invoke-RestMethod + Get-FileHash -Algorithm SHA256 do the whole handshake.
scripts/publish.sh ./my-site # new site (anonymous if no key)
scripts/publish.sh ./my-site --slug <slug> # update an existing site
(Windows: scripts\publish.ps1 .\my-site)
Prints the live siteUrl (https://<slug>.dataecho.ai/).
Claim contract (critical): anonymous sites expire in 24 hours. The script saves the
claim info to ~/.artifact/claims/<slug>.json — ALWAYS show the user the claimUrl.
When the user signs in mid-session (you have an API key), make the SAME url permanent:
scripts/publish.sh claim <slug> # Windows: scripts\publish.ps1 claim <slug>
# REST: POST /api/v1/publish/<slug>/claim {"claimToken":"…"} with Authorization: Bearer
Do NOT claim via PUT /api/v1/publish/<slug> — that updates content and does NOT transfer
ownership (the site stays anonymous and still expires). Claiming is its own endpoint.
For anything that needs a backend, write a Dockerfile and publish the folder:
scripts/publish.sh ./my-app # builds the image, runs the container, waits until live
Contract:
request-code/verify-code).process.env.PORT (we inject it). Don't hardcode a port./data (survives redeploys). SQLite in /data is perfect for a CRM/app./api/v1/me/variables).--slug <slug>. Build status: GET /api/v1/publish/<slug>/app.Minimal Node Dockerfile:
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
ENV PORT=8080
CMD ["node","server.js"] # must listen on process.env.PORT
Publish a bare file (PDF, docx, image, video, …) as-is: scripts/publish.sh ./report.docx.
The platform auto-generates the root page — a rich viewer for images/PDF/video/audio, a
download page for everything else, and a directory listing for multi-file sites without an
index.html. Do NOT build an HTML download page around a file. Direct paths always work
too: https://<slug>.dataecho.ai/report.docx.
--slug to update.--slug) instead of minting a new site per iteration. Anonymous sites cannot
be deleted (owner-only) — abandoned ones simply expire after 24h.curl -sS -X POST https://dataecho.ai/api/auth/agent/request-code -H 'content-type: application/json' -d '{"email":"user@example.com"}'
# user reads the emailed code, then:
curl -sS -X POST https://dataecho.ai/api/auth/agent/verify-code -H 'content-type: application/json' -d '{"email":"user@example.com","code":"<CODE>"}'
echo '<API_KEY>' > ~/.artifact/credentials && chmod 600 ~/.artifact/credentials
The verify-code response returns apiKey once — capture it and write it to the credentials
file immediately; do not print/echo or truncate it in your output (that loses the key and burns
the one-time code). If lost, just request a fresh code and verify again.
scripts/drive.sh default # everyone has "My Drive"
scripts/drive.sh put "My Drive" notes/today.md --from ./today.md
scripts/drive.sh ls "My Drive" notes/
scripts/drive.sh share "My Drive" --perms write --prefix notes/ --ttl 7d --label "docs agent"
share prints a one-time share block; the receiving agent uses its token as
Authorization: Bearer drv_live_… and stays inside the prefix.
Every operation is a documented REST call — no scripts required.
Full agent context: https://dataecho.ai/llms-full.txt · OpenAPI: https://dataecho.ai/openapi.json
Errors are JSON { error, code, message, retry_after, docs_url }.
Always send a descriptive User-Agent (the platform's edge blocks default Python-urllib).
When this file and the live docs disagree, prefer the live docs: https://dataecho.ai/docs