ZYVOPMulti-Platform Sync
SeriesAI NewsWhy ZyVOPJoin Discord
LoginGet Started
Developer API & Official CLI

Publish from code.
Automate your workflow.

Publish or update Markdown articles from the ZyVOP CLI, a CI/CD workflow, or the REST API, with optional delivery to supported connected platforms.

Get Developer Token
$npx zyvop publish ./my-article.md
npmpackage/zyvopgithub.com/zyvop/zyvop-cli

Official CLI

Publish or update Markdown articles from your local terminal.

Developer-token REST API

Use one authenticated endpoint to create or update an article.

CI/CD workflows

Publish tracked Markdown files through GitHub Actions or other automation.

CLI quickstartCI/CDREST API
Official CLI & Package
npm package: zyvopgithub.com/zyvop/zyvop-cli

ZyVOP CLI: Publish from Terminal

The official command-line interface for ZyVOP. Write in standard Markdown with YAML frontmatter, publish to ZyVOP, and optionally deliver to Dev.to, Hashnode, Medium, WordPress, and Bluesky from your terminal or CI/CD pipeline.

1. Installation & Execution

# Run without a global installation
npx zyvop --help

# Publish and cross-post an article
npx zyvop publish ./my-article.md
Node.js: >= 20.0.0
License: MIT Open Source
Dry run: No token required

2. Authentication & Sessions

Use a personal developer token for REST publishing and CI/CD. Interactive login stores a user-session token for session-backed commands such as back-catalog import:

# Recommended for publishing and CI/CD
zyvop login --token zv_0123456789abcdef0123456789abcdef0123456789abcdef

# Or provide the developer token through the environment
export ZYVOP_TOKEN="zv_0123456789abcdef0123456789abcdef0123456789abcdef"

# Interactive user-session login (required by import)
zyvop login

# Inspect the stored authentication and endpoint
zyvop whoami

# Clear stored credentials on this machine
zyvop logout

3. Publishing Markdown & Dry-Run Preview

Publish to ZyVOP and request delivery to the enabled connected destinations. External delivery runs in the background. Use --dry-run to check local parsing and relative asset resolution first:

# Local dry-run preview: validates markdown without contacting servers or publishing
zyvop publish ./my-article.md --dry-run --base-url https://myblog.com/

# Publish article live and cross-post to all enabled syndication targets
zyvop publish ./my-article.md

# Publish as a private draft with custom overrides
zyvop publish ./my-article.md --draft --tags "nextjs,react,typescript"

4. Markdown Frontmatter Specification

Place standard YAML frontmatter at the top of your .md file to configure syndication targets, canonical URLs, and article metadata:

---
title: Building Scalable Microservices with Go
subtitle: A practical deep-dive into distributed architecture
tags: [golang, backend, docker, microservices]
canonical_url: https://myblog.com/go-microservices
base_url: https://myblog.com/
category: backend
cover_image: /images/go-architecture.webp
generate_toc: true
cross_post:
  devto: true
  hashnode: true
  medium: true
  bluesky: true
  wordpress: true
---

# 1. Introduction

Write your technical article here in Markdown with full support for tables, code snippets, and diagrams...

5. CLI Command & Flag Reference

All options available when executing zyvop publish <file>:

FlagTypeDescriptionDefault
-d, --dry-runbooleanValidate and preview the local payload without authentication, network requests, or publishingfalse
--base-url <url>string (URL)Base URL for resolving root-relative (/img.png) or file-relative (./img.png) cover and body imagescanonical_url origin
--title <title>stringOverride article title specified in YAML frontmatterFrontmatter title
--subtitle <subtitle>stringShort subtitle, subtitle summary, or SEO description (max 200 chars)Frontmatter subtitle
--tags <tags>string (comma-separated)Override discovery tags (e.g. "react,nextjs,typescript")Frontmatter tags
--category <slug>string (slug)Target topic category slug (e.g. "frontend", "backend", "devops", "ai")Frontmatter category
--series <seriesId>string (ID)Attach the article to an existing ZyVOP seriesFrontmatter series ID
--canonical <url>string (URL)Canonical URL used to signal the preferred source to search enginesNot set
--cover <url>string (URL/path)Cover image URL or relative image pathFrontmatter cover
--draftbooleanSave the article as a ZyVOP draft without external deliveryfalse
--tocbooleanAutomatically generate and render a floating Table of ContentsFrontmatter toc
--devto / --no-devtobooleanExplicitly enable or disable syndication to dev.totrue (if connected)
--hashnode / --no-hashnodebooleanExplicitly enable or disable syndication to Hashnodetrue (if connected)
--medium / --no-mediumbooleanExplicitly enable or disable syndication to Mediumfalse
--bluesky / --no-blueskybooleanBroadcast published link and excerpt to Bluesky timelinefalse
--wordpressbooleanEnable cross-posting to connected WordPress sitefalse
-t, --token <token>stringZyVOP token supplied directly for this commandZYVOP_TOKEN, then stored token
--endpoint <url>string (URL)Advanced custom GraphQL endpoint for testing or another deploymenthttps://zyvop.com/graphql

6. Frontmatter Schema Reference

FieldTypeDescriptionDefault
titlestringThe main headline for your articleMarkdown filename
subtitlestringOptional article subtitle-
excerptstringOptional card preview and summary textAuto-generated
tagsstring[] | stringTopics and discovery tags (e.g. [react, nextjs] or comma-separated string)[]
canonical_urlstringOriginal source URL for canonical reference across syndication targetsNot set
base_urlstringBase domain for resolving site-relative cover and content images (e.g. https://myblog.com)Inferred from canonical_url
categorystringCategory slug (e.g. frontend, backend, devops, ai)-
cover_imagestringPublic image URL or relative path (e.g. /blog/cover.webp)-
generate_tocbooleanAutomatically generate floating Table of Contentsfalse
comments_enabledbooleanEnable reader comments and discussion on this posttrue
cross_postobjectDelivery flags: devto, hashnode, medium, wordpress, and blueskyDev.to and Hashnode enabled
zyvop_id / id / slugstringStable ZyVOP identifier used for predictable repeat updates-
series_idstringID of an existing ZyVOP series-
published / draftbooleanSet published: false or draft: true to save as draftpublished: true
statusstringExplicit publication status: DRAFT, PUBLISHED, or SCHEDULEDPUBLISHED
scheduled_atstringISO 8601 timestamp for scheduling publication in the future-
Dual-Use RepositoriesAny extra frontmatter keys needed by Astro, Next.js, Contentlayer, or Hugo (e.g. layout, readingTime, featured) are safely preserved in your repository and ignored by ZyVOP without schema errors.
Relative Image ResolutionRoot-relative (/blog/cover.webp) and file-relative (./cover.webp) cover and body images are automatically resolved into absolute URLs using base_url or canonical_url.
Predictable repeat publishing: Store a stable zyvop_id, id, slug, or canonical_url in frontmatter. The API can then match an article you own and update it instead of creating another post.

7. Back-Catalog Migration & Tools

Import a back catalog from Dev.to, Hashnode, Medium, or an RSS feed. This command uses the session-backed GraphQL flow, so sign in interactively before running it:

# Import all published articles from Dev.to
zyvop import devto your_devto_username

# Import all articles from Hashnode
zyvop import hashnode yourblog.hashnode.dev

# Import a Medium publication
zyvop import medium @your_medium_username

# Import a public RSS feed
zyvop import rss https://example.com/feed.xml

# Verify current authentication session
zyvop whoami

A personal zv_ developer token authenticates REST publishing but does not authenticate this GraphQL-backed import command.

CI / CD Automation

Publish on Git Push (GitHub Actions)

Keep articles in Git and publish changed Markdown files to ZyVOP with a personal developer token. Enabled external destinations are handled after an eligible article is published.

name: Publish to ZyVOP

on:
  push:
    branches: [main]
    paths:
      - 'posts/**/*.md'

permissions:
  contents: read

concurrency:
  group: zyvop-publish-${{ github.ref }}
  cancel-in-progress: false

jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20

      - name: Publish Modified Markdown Posts via ZyVOP CLI
        env:
          ZYVOP_TOKEN: ${{ secrets.ZYVOP_TOKEN }}
        run: |
          set -euo pipefail

          before="${{ github.event.before }}"
          after="${{ github.sha }}"

          if [[ "$before" =~ ^0+$ ]] || ! git cat-file -e "$before^{commit}" 2>/dev/null; then
            mapfile -d '' files < <(git ls-files -z -- ':(glob)posts/**/*.md')
          else
            mapfile -d '' files < <(
              git diff --name-only -z --diff-filter=ACMR                 "$before" "$after" -- ':(glob)posts/**/*.md'
            )
          fi

          if (( ${#files[@]} == 0 )); then
            echo "No Markdown files modified."
            exit 0
          fi

          for file in "${files[@]}"; do
            if [ -f "$file" ]; then
              echo "Deploying $file..."
              npx --yes zyvop@1 publish "$file"
            fi
          done
Add your ZYVOP_TOKEN under your GitHub repository's Settings > Secrets and variables > Actions.
Stable updates: Keep a zyvop_id, slug, or stable canonical_url in each file so repeat runs can match the article you own.
REST Publishing API

Publish or update Markdown

The public developer-token API currently provides one endpoint for creating or updating an article from Markdown with YAML frontmatter.

Authenticate with Authorization: Bearer zv_.... Generate or revoke the token from your ZyVOP settings.
Treat the token like a password. Store it in a secret manager and never commit it to a repository.
POST https://zyvop.com/api/v1/articles
Content-Type: application/json
Authorization: Bearer <your_developer_token>

Request payload

Send the complete Markdown document in the JSON content field. The API also accepts markdown as the field name.

{
  "content": "---
title: My Automated Post
tags: [api, automation]
canonical_url: https://example.com/posts/automated
cross_post:
  devto: true
  hashnode: true
  medium: false
  wordpress: false
  bluesky: false
---

# Hello World

Published with the ZyVOP REST API."
}

Successful response

The response reports whether ZyVOP created or updated the article.

{
  "success": true,
  "action": "created",
  "data": {
    "id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
    "slug": "my-automated-post-72gpx",
    "status": "PUBLISHED",
    "url": "https://zyvop.com/my-automated-post-72gpx"
  }
}
Repeat publishing: include a stable id, slug, or canonical_url so the API can match an existing article owned by the token's user. Otherwise, the server may create a new article.

External delivery

REST frontmatter can request Dev.to, Hashnode, Medium, and WordPress article publishing or Bluesky social promotion. The corresponding integration must be connected, the article must be eligible for promotion, and delivery runs in the background. Mastodon is not currently accepted by this REST endpoint.

Rate limit: the endpoint allows 10 requests per minute for each valid developer token. Requests above the limit receive HTTP 429 Too Many Requests with rate-limit headers.

GraphQL authentication is separate

Personal developer tokens beginning with zv_ authenticate the REST publishing endpoint. ZyVOP's GraphQL endpoint uses a user-session JWT and is not the public developer-token publishing interface.

Need help or custom integrations?

Join the developer Discord to discuss the CLI and REST API, suggest improvements, report issues, and talk with other technical writers.

Join the Developer Discord

Ready to automate your publishing?

Generate a personal developer token, connect the destinations you use, and publish Markdown from your terminal or CI workflow.

Get Developer TokenWhy ZyVOP
ZYVOPMulti-Platform Sync

The Developer Publishing Hub. Write once, publish everywhere, with built-in SEO, AEO, and GEO infrastructure, including canonical URL controls, structured data, and AI-readable article resources. Zero reader paywalls.

Content

  • Categories
  • Tags
  • Badges
  • Leaderboard
  • Write Article
  • Newsletter

Company

  • About Us
  • Why ZyVOP
  • Changelog
  • Compare Platforms
  • Hashnode vs ZyVOP
  • DEV vs ZyVOP
  • Developer API & CLI
  • Author Handbook
  • Contact

Connect

  • Privacy Policy
  • Terms of Service
  • Cookie Policy
  • DMCA Policy
  • Code of Conduct

© 2026 ZyVOP. Developer Publishing Hub.

Zero paywalls · Full content ownership
All systems operational