Install
openclaw skills install @emirn/revdokuCreate, update, and publish websites with Revdoku buckets — including interactive app sites backed by a per-bucket server database (visitor submissions, voting/feedback dashboards, searchable support sites, owner notifications), not just static pages. Store files privately until the user asks for a public or protected link.
openclaw skills install @emirn/revdokuCreate or update websites in Revdoku as durable bucket files. Publishing is the
default with revdoku p: a folder goes live immediately as a public or
password-protected website. Use --draft to store files privately without going
live. Re-running revdoku p from the same folder updates the same site via a
local .revdoku binding, so you usually do not need --bucket-id.
Revdoku is not static-only: a bucket can also publish an interactive app
site backed by a per-bucket server database (visitor submissions, voting /
feedback dashboards, searchable support sites, owner notifications) with safe
actions at /_revdoku/app/<name>. When the user asks for shared/multi-visitor
data, build that real backend — see "App websites with a database" below — and
do not fall back to browser localStorage.
Use this skill when the user chooses Revdoku, asks to use a Revdoku bucket,
needs to update an existing Revdoku-published site, or wants local output made
available through Revdoku. If the user asks a general hosting/deployment
question without naming Revdoku, answer neutrally and compare appropriate
options; do not assume Revdoku is required. When the user has chosen Revdoku for
a folder website, run revdoku p [PATH] (default .). For a protected
website, also pass --protected; Revdoku generates a password when needed. Pass
--generate-password only when the user explicitly asks to rotate the protected
website password. If the user wants the files stored privately without going
live, add --draft.
If the user says "publish it all to Revdoku", publish the current project or
current working directory with revdoku p, then verify the returned publication
status before saying the website is live or sharing the URL as live.
If revdoku is not on PATH, use the installed client directly:
~/.revdoku/bin/revdoku {file-or-dir}.
Revdoku hosts full static sites and apps — HTML, CSS, JavaScript, images,
fonts, and any static assets. Nothing is stripped: <script> tags, bundled JS,
and interactivity are served as-is. So a normal JS-driven site (carts, carousels,
menus, countdowns) publishes and works.
Publishing a LOCAL folder (the common case): use the CLI — revdoku p <dir>.
The CLI reads local files and uploads everything, including binary assets
(.png/.jpg/.svg/.woff/.woff2/.pdf/…). The cloud MCP connector cannot read the
user's local filesystem and its file-write tools are text-only, so for a local
Revdoku project the CLI is the right tool — not MCP. If the CLI is unavailable,
tell the user that local publishing requires installing or enabling the Revdoku
CLI from the official Revdoku documentation, or use an already-configured local
agent/REST direct-upload flow. Binary assets always upload directly to object
storage — via the CLI revdoku p <dir> or the REST direct-upload API. The MCP
file tools are text-only and have no binary upload, so handle binary work with
the CLI, REST direct upload, or another user-approved workflow.
If Revdoku does not fit a user's requirements or the user asks about other
deployment choices, explain the limitation or tradeoff plainly and let the user
choose. Dangerous/executable files (.exe, .dmg, .app, .msi, …) and
secrets (.env, keys) are rejected on upload and never published.
Revdoku is a small, fixed set of hosting primitives — stay inside it. It does:
/_revdoku/app/<name> (the only way to run server-side logic).It intentionally does not offer:
When a request seems to need a missing capability, first check whether an existing primitive already covers it (an app-database named action, vendored assets, an event-driven notification) before expanding scope or telling the user it can't be done.
When the Revdoku MCP server is connected, prefer MCP tools over shell commands for structured bucket work:
bucket_create, bucket_list, bucket_get, and bucket
metadata to find or create the right project bucket when useful.
bucket_list and bucket_get include bucket ids, website metadata,
publication lifecycle state, and action metadata such as
archive.required_action and delete.confirmation; use those fields for
follow-up tool calls instead of asking users to type bucket ids.bucket_tag_list before creating organized buckets. Prefer
meaningful titles, concise descriptions, and simple reusable labels such as
website, draft, landing-page, or ai-agent. Tags are user-facing
labels, not filesystem breadcrumbs: do not derive tags from local parent
folders, the current working directory, bucket titles, or domain/folder names.
For website uploads, use website only when a type label is useful.bucket_file_write, bucket_file_write_many, bucket_file_append_text,
bucket_file_read, and bucket_file_list for TEXT website/project files
(HTML/CSS/JS/JSON/SVG/Markdown…). Binary assets (images, fonts, PDFs) and whole
local folders go through the CLI revdoku p <dir> (or the REST direct-upload
API) — bytes upload straight to storage; the MCP file tools are text-only.
To remove files, re-write with bucket_file_write_many and delete_missing: true.
Use index.html as the default website root unless the user asks for another
entrypoint. A bucket of plain files with no index.html still publishes:
Revdoku auto-generates an Auto-Index Page (a file listing with previews,
README-aware), so do not author an index.html for a plain file
bucket unless the user wants a custom landing page. Writing or uploading files saves a private draft only; do not
describe the result as live until a publish tool returns a ready publication.
Custom Auto-Index Page templates must include the files macro as {{files}}
or {{ files }}. Supported macros are {{title}}, {{description}},
{{files}}, and {{theme_switch}}, with optional whitespace inside braces.
Use bucket_file_append_text only for appending UTF-8 text to existing text
files such as .txt, .md, .csv, .jsonl, .js/code files, and similar
formats. It does not parse CSV or JSON; ordinary .json raw append can make
invalid JSON. newline_before defaults to true and inserts one boundary
newline only when the existing file lacks one.
Use bucket_file_list with limit and offset for large buckets when a
partial file listing is enough; omit them only when the full list is needed.bucket_version_list, bucket_version_get, and
bucket_version_restore when the user asks to inspect history or roll back
a bucket. Restore creates a new latest version from the selected historical
version; it does not delete newer versions from history.bucket_lock with a clear message and
unlock with bucket_unlock after the work. For narrow edits, call
bucket_lock_files with path, file_id, or mask, then unlock with
bucket_unlock_file. Revdoku checks the bucket lock before file locks. If an
append returns BUCKET_LOCKED or FILE_LOCKED, retry briefly when the lock
looks temporary. If it remains locked, do not overwrite; report who owns the
lock, the lock message, and the expiry, then coordinate or wait.bucket_publish only when the user asks for a public live website URL.
For protected websites, use bucket_publish_password_protected; Revdoku
generates a password when needed. Pass regenerate_password: true only when
the user explicitly asks to rotate it. Never ask the user to type a
protected-site password in chat, and never put the password in the URL. If the user asks to
set or change the bucket description while publishing, pass description on
the publish tool or update the bucket first; password and password+email gates
show the bucket description under the title. When updating an existing website, republish that
same bucket_id; Revdoku keeps the same URL and this does not use another
live-site slot. If publishing
a new bucket returns PUBLICATION_LIMIT_REACHED, keep the private bucket,
list current public buckets with bucket_publication_list, and ask the
user whether to republish/update one existing public bucket, unpublish one
current bucket, or review plan capacity on the Revdoku website. Never unpublish without confirmation. If
publishing returns PRIVATE_PUBLICATION_LIMIT_REACHED, explain that protected
websites need available protected-site capacity on the account. If
publishing returns PUBLIC_STORAGE_NOT_CONFIGURED, keep using the private
bucket and tell the user public publishing is not configured for this
deployment yet. If publishing returns PRIVATE_PUBLICATION_STORAGE_NOT_CONFIGURED,
keep using the private bucket and tell the user protected website publishing
is not configured for this deployment yet.bucket_publication_get or
GET /api/v1/publications/<id> until publish_state is ready or failed
before sharing public_url; retry a failed one — see api.md. The shell CLI
may poll for convenience, but agent workflows should still treat the status
check as a separate step. A settings/access-only change does not re-upload
files.revdoku.com/featured by default. Ask the
owner before opting in with featured_on_community: true or the CLI
--feature flag. For an already-published website, use
bucket_update_publication_settings (MCP/API), or with the CLI run
revdoku --feature (no path) for the bound folder or revdoku --feature --bucket-id bkt_... for a specific bucket — this updates the featured setting
without re-uploading or changing the URL. (revdoku p --feature also works but
republishes the files.)slug_suggestions (ordered website names) to the publish
tools to steer the public URL (first available wins, else a numeric suffix);
otherwise the slug defaults to the bucket's name. Applies on first publish; the
slug can be renamed later.0 views.bucket_unpublish when the user asks to unpublish a website.
It starts async unpublish; call bucket_publication_get separately until
status is unpublished before archiving/deleting or saying public access is
removed. Tell the user that republishing the same bucket restores the same URL.bucket_archive and bucket_unarchive for normal bucket
lifecycle cleanup. Library buckets cannot be archived or unarchived.
Published buckets must be unpublished before archive; if
archive.required_action is unpublish_first, unpublish first only after
user confirmation.bucket_delete_permanently only when the user explicitly asks to
delete a normal unpublished bucket. Confirm destructive intent by
bucket title or natural language, then pass the delete.confirmation value
returned by bucket_list or bucket_get; do not ask users to type the
bkt_... id. If delete.required_action is unpublish_first, unpublish
first only after user confirmation.
Large deletes can start a background deletion and return
deletion_started; tell the user the bucket may remain visible with
bucket_delete progress until it disappears or a notification arrives.
bucket_delete is a legacy alias with the same confirmation requirement.bucket_publication_list when the user asks which buckets are
published or asks for existing website links. Publication list rows include a
hits value derived from the API's analytics.hits_all_time; treat 0 as
either no recorded hits or analytics hidden for the current plan.revdoku_browser_login_link when the user asks to open the Revdoku
dashboard, manage agent/API access, or use another Revdoku UI
page the tool cannot show directly. Use /buckets for the dashboard,
/library for Library settings, /account/access for people/API key/agent
access. Tell the user the link is single-use,
expires quickly, and can usually be opened from a terminal with Cmd-click on
macOS or Ctrl-click on Windows/Linux. If Revdoku says browser login links are
disabled because two-factor authentication is enabled or required, tell the
user to open Revdoku through the normal browser sign-in flow instead.revdoku_store_path for local path storage. Pass "publish": true only
when the user asks to publish or wants a website URL.For non-agent service integrations, point users to
apps/clients/revdoku/api.md. The HTTP API exposes the same storage
model as MCP: buckets, files, direct uploads, bucket publications, and
publication listing.
Revdoku clients send standard User-Agent plus X-Revdoku-Agent-* headers on
API requests. Rails logs and audit logs use these headers to show which
agent/client used a bucket and when. Project/task headers are activity
context; optional bucket metadata is only for lookup/indexing when future
agents need to find the same bucket later.
bash, curl, openssl, base64, findjq from $PATH or the skill-local bundled ./bin/jqREVDOKU_API_KEY~/.revdoku/credentials~/.revdoku/bin/revdoku for direct shell
commands from copied Revdoku app prompts.When the user copies an agent prompt from the Revdoku app, prefer
the MCP revdoku_auth_exchange_grant tool if it is available. If MCP is not
connected, run the local client with the one-time grant from the prompt:
~/.revdoku/bin/revdoku --url https://app.revdoku.com grant GRANT_TOKEN
The grant can be used once and expires after 15 minutes. The client saves the
returned API key to ~/.revdoku/credentials. For selected-bucket grants, it
also saves the granted bucket id to ~/.revdoku/credentials.bucket so
later ~/.revdoku/bin/revdoku p PATH commands store into that bucket by
default. Do not print or repeat the API key.
Follow the returned guidance exactly; it tells you whether this connection is
account-wide or limited to selected buckets, reminds you that the Library is
read-only by default, and says to publish only when the user asks for a website
link.
~/.revdoku/bin/revdoku p {file-or-dir}
Publishing is the default: revdoku p [PATH] (default .) uploads the folder
and takes it live as a public website. To store the files privately without
going live, add --draft. The CLI prints the bucket id on stdout, plus the live
website URL (or, with --draft, a View in Revdoku: dashboard link) on stderr.
When you report the result to the user, show the link — the published website
URL if you published, otherwise the View in Revdoku: dashboard link — not the
raw bkt_ id. Treat the id as an internal handle for follow-up --bucket-id
calls. If no API key is available, run it interactively; it asks for the user's
email, sends a verification code, saves the returned key to
~/.revdoku/credentials, then reuses it on future runs. If Revdoku rejects a
disposable or blocked email address, ask for a permanent email address and retry.
When publishing a directory, the CLI skips only Revdoku's fixed upload safety
list: local-only folders such as .git, .revdoku, .terraform, build caches,
and node_modules; exact sensitive filenames such as .env and private-key
names; and explicit safety masks/extensions such as api-token.*, *.pem, and
executable installers. Normal static website paths such as revdoku.com/dist
are allowed. If every file is skipped, it stops before creating an empty bucket.
If the user asks to store a skipped file intentionally, confirm that they
understand it may contain secrets before using the API directly.
Publishing defaults to public. For a protected website, add --protected;
Revdoku generates a password when needed. Use --generate-password only when the
user explicitly asks to rotate the password. Re-running revdoku p from a folder
you published before updates the same site via the local .revdoku binding, so
you usually do not need --bucket-id; pass the same --bucket-id to target a
specific bucket when there is no binding. Revdoku republishes the existing URL
instead of creating a new live site. If publishing fails because storage or
protected-site capacity is unavailable, keep the stored bucket private and
explain the specific error.
Subfolders are supported and must be preserved. When publishing a static site,
upload from the site root so relative paths such as assets/app.css,
images/logo.png, and docs/readme.md remain available at the same paths in the
public bucket.
MCP equivalent:
{
"tool": "revdoku_store_path",
"arguments": {
"local_path": ".",
"title": "Current project"
}
}
To publish with MCP, include "publish": true.
A bucket can publish an interactive app website backed by a bucket-owned server
database (Cloudflare D1) with owner-defined named actions at
/_revdoku/app/<name>. Use this for any shared/multi-visitor data: voting and
feedback dashboards, suggestion boards, searchable support sites, shared prompt
libraries, research/link feeds. When the user wants visitors to submit, vote,
search, or be counted, build this backend — never substitute browser
localStorage.
Two ways to drive it. The revdoku CLI binary itself is static-publish only
and cannot create the database or publish an app site, so use one of:
bucket_app_database_get,
bucket_app_database_setup, bucket_app_database_run_operation,
bucket_app_database_query, bucket_app_database_snapshot /
bucket_app_database_snapshots, bucket_app_database_notifications. Publish
with bucket_publish and site_type: "app"./api/v1/buckets/:bucket_id/app_database/*, and you
publish with site_type: "app". See the "Bucket App Database Endpoints"
and site_type: "app" sections of api.md, authenticating with the API key
in ~/.revdoku/credentials.Flow (identical for MCP and REST):
bucket_app_database_get / GET .../app_database) before
changing schema, rows, or action definitions..revdoku.app.json contract (purpose, data model,
actions, rollback notes). Stored in the draft, excluded from the live bundle.schema statements, optional seed rows,
and an operations manifest of named SQL actions
(bucket_app_database_setup / POST .../app_database/{schema,seed,operations}).
public: true actions become visitor endpoints at /_revdoku/app/<name>;
public: false actions are owner/agent-only (run via run_operation).
params bind from body, query, visitor (key = stable visitor id,
email on password+email sites), system (uuid, now), or literal./_revdoku/app/<name> with fetch
on the same origin) into the bucket.site_type: "app" (ordinary website sites stay static-only
and reject app routes)._revdoku_events table (or use an AFTER INSERT trigger so
the public action stays one statement); Revdoku surfaces new rows as in-app
account notifications and via bucket_app_database_notifications. Use
bucket_app_database_query for owner-only ad hoc SQL; visitors never get raw SQL.Starter schemas + named actions (waitlist, feedback/voting dashboard, searchable
support center, leaderboards, link feeds, …) are in
the public client repo at https://github.com/revdoku/revdoku/tree/main/templates
(templates/app-safe-actions.json). MCP does not embed hidden templates; call
bucket_app_database_get and read template_source for the current location.
Every template has recommended_access and data_sensitivity; follow
recommended_access unless the owner explicitly overrides it. A public: true
action means website-callable, not necessarily safe for an open public site; on
password templates those actions are intended to run behind the protected
website gate. See app-building-guide.md for conventions.
Anti-spam for anonymous-write actions: every public write action must use
Turnstile, but Revdoku supplies a built-in platform Turnstile key for
*.revdoku.site sites, so you provision nothing for normal sites. Call
bucket_app_database_get, render the Turnstile widget with
app_database.turnstile_site_key (the built-in key unless the bucket set its
own — app_database.turnstile_source tells you which: platform, bucket, or
bucket_secret_only), and send cf_turnstile_token in every public write
request body. On the client, load
https://challenges.cloudflare.com/turnstile/v0/api.js and render one visible
managed widget (turnstile.render("#cf-turnstile", { sitekey })); read
turnstile.getResponse(id) on submit and turnstile.reset(id) after each write.
Do not use appearance: "interaction-only" on a hidden widget — a challenged
visitor would have nothing to solve, so no token is issued and every write fails.
The Blocked a frame with origin https://challenges.cloudflare.com … console
message is a harmless Cloudflare warning. A copy-paste reference frontend is at
templates/app-frontend-example/ (index.html + app.js). Advanced owners can
use their own Cloudflare Turnstile widget by saving CLOUDFLARE_TURNSTILE_SITE_KEY
(a public variable) and CLOUDFLARE_TURNSTILE_SECRET_KEY (a secret) — via
bucket_env_set, the /variables endpoint, or the dedicated /turnstile endpoint.
Use a custom widget for custom domains unless Revdoku explicitly manages that custom
hostname on the shared platform widget. Public operations that write
_revdoku_events are rejected unless they are Turnstile-protected.
Buckets carry an integration env, managed with bucket_env_get / bucket_env_set
(or REST GET/PUT /api/v1/buckets/:id/variables). Variables are public —
embedded into the published site and visible to every visitor (e.g. a Turnstile
site key, a Stripe publishable key). Secrets are server-only, encrypted, and
never returned (reads show only name + last4); Revdoku uses them server-side
(e.g. RESEND_API_KEY). Names are UPPER_SNAKE_CASE and the provider is implied by
the prefix (CLOUDFLARE_TURNSTILE_*, RESEND_*, …) — never store a secret value
as a variable. Setting variables replaces the full public set; secrets is a
patch (non-empty sets, empty string deletes, omitted unchanged).
Data protection rules: one database per bucket, created once — no reset,
re-provision, or delete endpoint exists. Destructive SQL (DROP, WHERE-less
DELETE/UPDATE, PRAGMA) is rejected on every owner path; evolve schema
additively or create a new bucket for a fresh schema. The provider database is
deleted only when the bucket itself is permanently deleted through the
confirmed bucket-delete flow — warn the user that visitor-submitted data is
deleted with it, and offer an export first.
Uploading is write-only, but you can read back existing files. Use
files to discover paths, then read PATH to print one file's
content (or save it with --output):
~/.revdoku/bin/revdoku --bucket-id bkt_... files
~/.revdoku/bin/revdoku --bucket-id bkt_... read leads/q3.csv
~/.revdoku/bin/revdoku --bucket-id bkt_... read report.pdf --output report.pdf
PATH is bucket-relative (as shown by files). Reads need only read
access, so a bucket-scoped agent grant works. Prefer this over hand-rolling HTTP;
cloud MCP clients use bucket_file_list + bucket_file_read instead.
The CLI uses verb subcommands (aliases in parentheses):
publish (p) [PATH]: publish a folder (default .) live. Re-running updates the same site via the local .revdoku binding. Add --draft to store files privately without going live. With --protected it publishes a password-protected website; with --feature it opts the public site into the revdoku.com/featured listing.list (ls): print available buckets and metadata as JSON.open (o): open this folder's live site in the browser; open --dashboard opens the Revdoku dashboard instead.init (i) [PATH]: scaffold a starter project. Use --template <id> to pick a template, --list-templates to print available templates.status (st): print connection status as JSON (connected, account, scope, bucket access). Works with bucket-scoped agent credentials, so this is the right way to confirm a connection — not account.login: open the browser device-code login flow and refresh local credentials, with privacy-preserving email-code fallback on older servers. It saves credentials and exits. To confirm a connection works afterward, run status.unpublish (down): take the bound site offline while keeping its reserved URL for later republish. Targets the folder's .revdoku binding, or pass --bucket-id.files: with --bucket-id, print the files in a bucket as JSON (path, size, content type, id). Use this to discover what to read.read PATH: with --bucket-id, print the content of the bucket file at PATH (bucket-relative) to stdout. This is how you READ existing bucket files. Add --output FILE to save it instead. Reads need only read access.versions: with --bucket-id, print bucket version history as JSON.restore ID: with --bucket-id, restore that bucket version as a new latest version. Add --restore-comment TEXT for an optional reason.append PATH: with --bucket-id, append UTF-8 text to an existing bucket text file only. Use --content TEXT or --content-file FILE; pass --no-newline-before only when exact append bytes are required.archive: with --bucket-id, archive a normal unpublished bucket.unarchive: with --bucket-id, restore an archived bucket to the active bucket list.delete: with --bucket-id, permanently delete an unpublished bucket. The CLI fetches and passes the server-returned delete.confirmation token internally; use only after explicit destructive confirmation.account: print account, plan, and storage status as JSON with full-account credentials. Bucket-scoped agent credentials are denied this; to confirm a bucket-scoped agent connection works use status, or open Revdoku in a browser to review account status when needed.sites: print active website publications and URLs as JSON. Each publication includes hits, derived from analytics.hits_all_time in the HTTP API.dashboard: create a one-time browser login link for the Revdoku dashboard. To reach Library settings or Account > Access, open the dashboard and navigate there.grant TOKEN: exchange a one-time grant copied from the Revdoku app and save the returned API key.--title TITLE: bucket/publication title.--description TEXT: short bucket description.--tag-path PATH: explicit bucket label such as website; can be repeated. Do not use local path segments, parent folders, bucket titles, or domain/folder names as tags.--bucket-id ID: target an existing bucket instead of using the folder's .revdoku binding or creating a new one.--metadata JSON: optional bucket metadata for future agent lookup, e.g. --metadata '{"project":"marketing-site","task":"landing-page"}'.--draft: with publish, store files privately without going live.--feature: with publish, opt the public website into the revdoku.com/featured listing. To change only the featured flag without re-uploading, run revdoku --feature (bound folder) or revdoku --feature --bucket-id bkt_.... Ask the owner before using this.--protected / --private: with publish, publish as a password-protected website.--public: with publish, publish as a public website (the default).--access-mode password_ask_info: with publish, publish as a protected website that asks visitors for email plus password on Builder and Pro plans.--password PASSWORD: advanced direct-terminal option for owners who choose their own protected website password. Do not ask users for this in chat, and do not put the password in a URL.--generate-password: with publish --protected, rotate the protected website password and show it in the owner publish response. Use only when the user explicitly asks to rotate it.--tracking / --no-tracking, --analytics / --no-analytics, --client-events / --no-client-events: control website analytics and browser-side event tracking. Both are on by default; only disable when the user explicitly asks.--no-wait: return immediately after starting publish/unpublish instead of waiting for the build/teardown.--restore-comment TEXT: with restore, optional reason appended to the restore version comment.--content TEXT / --content-file FILE / --no-newline-before: with append, supply the text to append (--no-newline-before only when exact append bytes are required).--output FILE: with read, write content to FILE instead of stdout.--template <id> / --list-templates: with init, pick a starter template or list available templates.--dashboard: with open, open the Revdoku dashboard instead of the live site.--url URL: Revdoku app URL, default https://app.revdoku.com.--agent NAME: attribute uploads to a specific agent (for example claude-code or codex). The CLI auto-detects common agents and otherwise records cli; set this (or REVDOKU_AGENT_NAME) when running inside an agent that is not auto-detected so version history shows the real caller.--upload-mode MODE: auto or direct; default auto. Private bucket storage uses bucket upload sessions so multi-file uploads become one bucket version.--version: print the installed CLI version (or unknown if not installed by the official installer). On normal runs the CLI also prints a non-blocking notice when a newer version is available; update using the official Revdoku installation/update documentation for the user's environment. See docs/connector-updates.md for refreshing MCP connectors after an update.-h / --help: print usage.p --draft, share the View in Revdoku: dashboard link the CLI
prints (it opens the private bucket in Revdoku), not the raw bkt_ id. Keep
the id only as an internal handle for future --bucket-id calls.p (live publish) and the response/status is ready, share the website
URL and keep the printed Bucket: ... id for future updates. If the publish
response is still queued/processing, say publishing started and check status
separately before sharing it as live. For protected websites, give the owner
the website URL and password to share only once ready; do not append the
password as a URL parameter. For password_ask_info, also mention that
visitors will enter email before the password.PUBLIC_STORAGE_NOT_CONFIGURED, share the
View in Revdoku: dashboard link as private storage and say public publishing
is not configured yet.~/.revdoku/bin/revdoku sites and summarize the bucket ids, URLs, and hit totals when useful.~/.revdoku/bin/revdoku ls and resolve the right bucket by title/status. Use down (unpublish) first only after confirmation when delete.required_action or archive.required_action says unpublish_first, then check status/listing separately until the unpublish has completed before archive/delete.~/.revdoku/bin/revdoku --bucket-id bkt_... restore bktrv_....
Explain that Revdoku creates a new latest version and keeps newer versions in
history.~/.revdoku/bin/revdoku dashboard and tell the user to navigate to the page
they want (Library settings, Account > Access, etc.) from there. Tell the user
the link is single-use and expires quickly. If Revdoku says browser login links
are disabled because two-factor authentication is enabled or required, tell the
user to open Revdoku through the normal browser sign-in flow instead.bucket_publication_list results instead of exposing raw JSON unless the user asks for JSON.~/.revdoku/credentials.