Command-line client
Use the vibecms CLI for site management, posts, assets, agent skills, and structured output.
Install vibecms-cli from npm to get the vibecms command:
npm i -g vibecms-cli
Or run it without a global install: npx vibecms-cli --help.
From a checkout, build with pnpm --filter vibecms-cli build and run node packages/cli/dist/index.js --help.
Connect
vibecms login --token vc_... [--api-url https://app.vibecms.dev]
vibecms whoami
vibecms site
vibecms activity --limit 20 --offset 0
login saves ~/.vibecms/config.json with restricted permissions. Configuration precedence is flag, environment variable (VIBECMS_API_URL, VIBECMS_TOKEN), config file, then default.
Manage the site
vibecms sites update --expected-updated-at 123 --data '{"name":"Field Notes"}'
vibecms sites theme get
vibecms sites theme update --expected-updated-at 123 --data '{"mode":"dark"}'
vibecms sites theme revert --expected-updated-at 124
vibecms sites voice update --expected-updated-at 0 --data-file voice.json
vibecms sites signup-form update --expected-updated-at 125 --data '{"enabled":true}'
vibecms tags list
vibecms analytics get --range 30
Use --data <json> or --data-file <path> for JSON object requests. Site, theme, and signup form updates require --expected-updated-at from the current settings; voice update requires it too, but the value is voiceProfile.revision from vibecms site — 0 only for a never-configured profile. analytics get accepts 7, 30, 90, 365, or all.
Public location
vibecms sites location get
vibecms sites location set-subpath --data '{"url":"https://example.com/blog"}'
vibecms sites location check
vibecms sites location remove
location get reads the current default host, custom domain, or subpath location. set-subpath accepts exactly one of --data or --data-file with a url field; it does not require a revision flag. It replaces the existing subpath setup and returns the proxy target and ready-to-paste configuration snippets. Save the appropriate snippet on the owner’s host, then run location check: a passing check activates the location, while a failed check records setup errors. location remove removes the subpath location and stops serving the blog at that customer path.
Get the owner’s explicit approval before changing or removing a live location. Location commands support --dry-run to show the request without sending it.
Old-link redirects
vibecms sites redirects list --limit 100 --offset 0
vibecms sites redirects set --data '{"redirects":[{"from":"/old/article","to":"/article"}]}'
vibecms sites redirects delete --data '{"from":["/old/article"]}'
Set and delete accept exactly one of --data or --data-file with a JSON object, without a revision flag; each batch contains 1–100 entries. List accepts an optional --limit (up to 500) and --offset. Get the owner’s explicit approval before adding, changing, or removing live redirects. All three commands support --dry-run. See URLs and redirects for path rules and plan limits.
Posts
vibecms posts list --status draft --search notes --limit 20 --offset 0
vibecms posts search notes --limit 20
vibecms posts get post_...
vibecms posts get-by-slug example-post
vibecms posts format-guide --preset minimal
vibecms posts seo post_...
vibecms posts seo post_... --focus-keyword 'release notes'
vibecms posts preview post_...
vibecms posts preview --content-file post.md --preset minimal --layout essay --toc true
vibecms posts create --title 'Example' --slug example --content-file post.md
vibecms posts update post_... --expected-version 2 --content-file post.md
vibecms posts versions post_...
vibecms posts version post_... 2
vibecms posts restore post_... 1 --expected-version 2
vibecms posts publish post_... --expected-version 3
vibecms posts publish post_... --expected-version 3 --original-published-at 2019-05-04T09:00:00Z
vibecms posts schedule post_... --version-number 4 --at 2027-01-15T09:00:00Z
vibecms posts unschedule post_...
vibecms posts rotate-preview post_...
vibecms posts archive post_...
vibecms posts unarchive post_...
For create, use --content <markdown> or --content-file <path>. update accepts those flags when changing the body. Optional post fields are --excerpt, --tags a,b, --cover <assetId|none>, --layout standard|essay|feature|wide, --toc true|false, --seo-title, --seo-description, and --canonical-url <url|none>. create requires --title and --slug; update can also change them. --expected-version binds update, restore, publish, or archive to a saved version — for restore, the positional version selects the historical snapshot while --expected-version guards the current tip. Only posts schedule also accepts --version-number as an alias for that flag. Schedule --at must be an ISO-8601 UTC time ending in Z and in the future.
For imports, posts publish --original-published-at records the original date on the first publish only; it must be on or after 1990-01-01 and before now. It does not change the real vibecms publication time, and is not available for scheduling. Get the owner’s approval before publishing.
posts seo <postId> checks the saved post’s current tip using deterministic SEO and AI-answer-readiness rules; vibecms does not run an AI model. The response includes versionNumber and findings sorted by severity with stable codes and fix hints. Optional --focus-keyword (1–80 characters) adds keyword checks. There is no AI option. posts preview already includes the same findings in its seo field. Use --dry-run to inspect the SEO request without sending it.
Assets and schemas
vibecms assets list
vibecms assets get asset_...
vibecms assets upload image.png --alt 'A description'
vibecms assets update asset_... --alt 'A better description'
vibecms assets delete asset_...
vibecms schema
vibecms schema publishPost
Uploads accept PNG, JPEG, WebP, and GIF. schema prints operation metadata as JSON.
Agent skills
vibecms skills list
vibecms skills get
vibecms skills get vibecms-core vibecms-writing
vibecms skills get vibecms-core --dir .claude/skills
vibecms skills get --force
skills list shows every vibecms agent skill with its description and digest. skills get [name...] downloads the named skills, or all skills when no names are given, from /.well-known/agent-skills/ on the API host and saves each as <dir>/<name>/SKILL.md. Neither command needs a token. Unknown names exit with code 4 before any skill files are downloaded or written.
The default folder is .agents/skills in the current directory, which Codex, Cursor, Gemini CLI, GitHub Copilot, and OpenCode read. For Claude Code, pass --dir .claude/skills (or ~/.claude/skills for every project). Each download is checked against its published digest before anything is written. Skills already up to date are left alone. A selected skill file that differs from the latest version, because it is older or you edited it, is only replaced with --force; without it the command writes nothing and exits with code 5. To update all skills, run vibecms skills get --force. Add --dry-run to see what would be written.
Global flags and exit codes
| Flag | Effect |
|---|---|
--api-url <url>, --token <tok> |
Override saved connection settings. |
--json |
Print compact JSON. |
--ndjson |
Print newline-delimited JSON for list output. |
--dry-run |
Print the request without sending it for supported reads and mutations. |
-h, --help, --version |
Show help or version. |
Exit codes are 0 success, 1 other error, 2 usage, 3 authentication or permission, 4 not found, 5 conflict, and 6 rate limit.