ZYVOPDOCS
MULTI-PLATFORM SYNC
CLI Reference

zyvop publish

Complete reference for publishing Markdown articles from your command line.

zyvop publish

The publish command parses your Markdown or MDX file, extracts frontmatter metadata, resolves image paths, and publishes your content to ZyVOP and connected cross-posting targets.

zyvop publish <file> [options]

Options & Flags

FlagTypeDescription
-d, --dry-runbooleanValidate frontmatter and inspect resolved payload without publishing
--draftbooleanSave as draft instead of publishing publicly
--canonical <url>stringCustom canonical URL (overrides frontmatter canonical_url)
--base-url <url>stringBase URL used to convert relative images (./img.png) into absolute URLs
--title <title>stringOverride the post title
--subtitle <subtitle>stringPost subtitle / summary description
--tags <tags>stringComma-separated list of tags (e.g. "react,nextjs,typescript")
--category <slug>stringCategory slug (e.g. "engineering", "devops")
--series <seriesId>stringSeries identifier to attach this article to
--cover <url>stringCover image URL (supports relative path if --base-url provided)
--tocbooleanAutomatically generate a dynamic Table of Contents
--localbooleanCross-post directly from your local machine using provider env vars

Destination Toggles

You can selectively enable or disable individual platforms on a per-publish basis:

FlagDescription
--devto / --no-devtoForce enable or disable cross-posting to DEV.to
--hashnode / --no-hashnodeForce enable or disable cross-posting to Hashnode
--medium / --no-mediumForce enable or disable cross-posting to Medium
--bluesky / --no-blueskyForce enable or disable announcement to Bluesky
--wordpress / --no-wordpressForce enable or disable publishing to WordPress

Precedence Hierarchy

When determining values for metadata, ZyVOP applies the following strict order of precedence:

  1. CLI Flags (e.g. --title "New Title") โ€” highest priority
  2. YAML Frontmatter (e.g. title: "Original Title" in file)
  3. Fallback Defaults (e.g. filename for title, origin of canonical URL for base URL)

Dry Run Mode (-d, --dry-run)

Always run a dry run when publishing for the first time or validating in CI:

zyvop publish ./content/posts/cqrs-architecture.md --dry-run

Output:

๐Ÿ” [DRY RUN] Previewing publish payload for: "CQRS and Event Sourcing with Node.js"
Local validation only; no network requests or writes were performed.
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  ๐Ÿ“„ File:            ./content/posts/cqrs-architecture.md
  ๐Ÿท๏ธ  Title:           CQRS and Event Sourcing with Node.js
  ๐Ÿšฆ Status:          PUBLISHED
  ๐Ÿ”— Canonical URL:   https://blog.mycompany.io/cqrs-event-sourcing
  ๐Ÿ–ผ๏ธ  Cover Image:     https://blog.mycompany.io/assets/cqrs-hero.png
  ๐Ÿท๏ธ  Tags:            nodejs, microservices, architecture, cqrs
  ๐Ÿงฉ Assets resolved: 3
  โšก Publish action:  Determined by the server during publish
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  ๐Ÿ“ก Syndication Targets:
     ZyVOP (Primary)      โœ“ Requested
     dev.to               โœ“ Requested
     Hashnode              โœ“ Requested
     Medium                โœ— Skipped
     Bluesky               โœ“ Requested
     WordPress             โœ— Skipped
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€

โœจ Local payload validation completed. The server will decide create/update state.

Relative Asset Resolution

If your technical post contains local relative image links, ZyVOP converts them to absolute URLs so external platforms can display them:

post.md
![System Architecture Diagram](./diagrams/architecture.png)

Running with --base-url:

zyvop publish post.md --base-url "https://myblog.dev/posts/distributed-systems"

The image URL will be normalized to: https://myblog.dev/posts/distributed-systems/diagrams/architecture.png.

Automatic Origin Inference

If you do not pass --base-url but your frontmatter specifies canonical_url: "https://myblog.dev/posts/my-post", the CLI automatically uses the origin (https://myblog.dev) to resolve relative root paths like /images/hero.png.


Local Publishing with --local

For users who want to bypass the ZyVOP backend or publish directly from private CI runners, pass the --local flag. In this mode, the CLI performs client-side cross-posting directly to provider endpoints using local environment variables:

# Set provider credentials
export ZYVOP_DEVTO_API_KEY="dev_xxxx..."
export ZYVOP_HASHNODE_API_KEY="hash_xxxx..."
export ZYVOP_MEDIUM_API_TOKEN="med_xxxx..."
export ZYVOP_BLUESKY_IDENTIFIER="yourname.bsky.social"
export ZYVOP_BLUESKY_APP_PASSWORD="xxxx-xxxx-xxxx-xxxx"
export ZYVOP_WORDPRESS_URL="https://yourwordpress.com"
export ZYVOP_WORDPRESS_USERNAME="admin"
export ZYVOP_WORDPRESS_APP_PASSWORD="xxxx xxxx xxxx xxxx"

# Publish directly without cloud credential storage
zyvop publish ./post.md --local

On this page