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
| Flag | Type | Description |
|---|---|---|
-d, --dry-run | boolean | Validate frontmatter and inspect resolved payload without publishing |
--draft | boolean | Save as draft instead of publishing publicly |
--canonical <url> | string | Custom canonical URL (overrides frontmatter canonical_url) |
--base-url <url> | string | Base URL used to convert relative images (./img.png) into absolute URLs |
--title <title> | string | Override the post title |
--subtitle <subtitle> | string | Post subtitle / summary description |
--tags <tags> | string | Comma-separated list of tags (e.g. "react,nextjs,typescript") |
--category <slug> | string | Category slug (e.g. "engineering", "devops") |
--series <seriesId> | string | Series identifier to attach this article to |
--cover <url> | string | Cover image URL (supports relative path if --base-url provided) |
--toc | boolean | Automatically generate a dynamic Table of Contents |
--local | boolean | Cross-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:
| Flag | Description |
|---|---|
--devto / --no-devto | Force enable or disable cross-posting to DEV.to |
--hashnode / --no-hashnode | Force enable or disable cross-posting to Hashnode |
--medium / --no-medium | Force enable or disable cross-posting to Medium |
--bluesky / --no-bluesky | Force enable or disable announcement to Bluesky |
--wordpress / --no-wordpress | Force enable or disable publishing to WordPress |
Precedence Hierarchy
When determining values for metadata, ZyVOP applies the following strict order of precedence:
- CLI Flags (e.g.
--title "New Title") โ highest priority - YAML Frontmatter (e.g.
title: "Original Title"in file) - 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-runOutput:
๐ [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:
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