Skip to main content

Crier: Cross-Post Your Content Everywhere

I published crier to PyPI. It’s a command-line tool for cross-posting content to multiple platforms at once.

The problem is simple: I write blog posts in Markdown with YAML front matter. I want them on dev.to, Hashnode, Bluesky, Mastodon, and wherever else, without manually copy-pasting into a dozen different editors. Crier handles this from the terminal.

Quick Start

pip install crier
cd your-blog
crier init

The init command walks you through setup: detecting content directories, configuring platforms with API keys.

The Workflow

  1. Your markdown posts with YAML front matter are the source of truth
  2. .crier/registry.yaml tracks what’s published where
  3. crier audit shows what’s missing or changed
  4. crier publish pushes content out
# See what needs publishing
crier audit

# Publish to multiple platforms
crier publish post.md --to devto --to bluesky --to mastodon

# Bulk publish everything missing
crier audit --publish --yes

LLM-Powered Auto-Rewrite

This is the feature I’m most pleased with. Short-form platforms like Bluesky (300 chars) and Mastodon (500 chars) need summaries, not full articles. Crier generates these automatically using any OpenAI-compatible LLM:

# Auto-generate short-form content
crier publish post.md --to bluesky --to mastodon --auto-rewrite

# Bulk publish with auto-rewrite
crier audit --publish --auto-rewrite --yes

Simplest setup: If you have OPENAI_API_KEY set, it just works (defaults to gpt-4o-mini).

Or use local models:

# ~/.config/crier/config.yaml
llm:
  base_url: http://localhost:11434/v1  # Ollama
  model: llama3

The LLM generates platform-appropriate summaries that fit within character limits, with automatic retry if the output is too long.

Supported Platforms

PlatformTypeNotes
dev.toBlogFull article support
HashnodeBlogFull article support
MediumBlogPublish/import mode
GhostBlogFull article support
WordPressBlogSelf-hosted or .com
ButtondownNewsletterEmail subscribers
BlueskySocialPosts with link cards
MastodonSocialToots with hashtags
ThreadsSocialShort posts
LinkedInSocialProfessional network
Twitter/XSocialCopy-paste mode
TelegramChannelBot posts
DiscordChannelWebhook embeds

Bulk Operations with Filters

The audit command supports filtering for targeted bulk operations:

# API platforms only (skip manual/import)
crier audit --publish --yes --only-api

# Long-form only (skip short-form social)
crier audit --publish --yes --long-form

# Random sample of 5 articles
crier audit --publish --yes --sample 5

# Filter by path and date
crier audit content/post --since 1m --only-api --publish --yes

# Combine filters
crier audit content/post --since 1w --only-api --long-form --sample 10 --publish --yes
FilterDescription
[PATH]Only scan specific directory
--sinceOnly content from this date (1d, 1w, 1m, or YYYY-MM-DD)
--only-apiSkip manual/import platforms
--long-formSkip short-form social platforms
--sample NRandom sample of N items
--auto-rewriteGenerate short-form content with LLM

Profiles

Group platforms into reusable profiles:

# ~/.config/crier/config.yaml
profiles:
  blogs: [devto, hashnode, medium]
  social: [bluesky, mastodon]
  everything: [blogs, social]  # Profiles can reference other profiles

Then: crier publish post.md --profile everything

Claude Code Integration

Crier works with Claude Code. Install the skill:

crier skill install

Then ask naturally:

  • “Cross-post my latest article to all platforms”
  • “What articles haven’t been published to Bluesky?”
  • “Publish this post to Mastodon with a good announcement”

Claude follows the workflow automatically: audit, select, publish (with rewrites for short-form platforms).

Configuration

Global config (~/.config/crier/config.yaml): API keys, profiles, LLM settings

platforms:
  devto:
    api_key: your_key_here
  bluesky:
    api_key: "handle.bsky.social:app-password"
  twitter:
    api_key: manual  # Copy-paste mode

llm:
  api_key: sk-...  # Or set OPENAI_API_KEY env var

Local config (.crier/config.yaml): Project settings

content_paths:
  - content
site_base_url: https://yoursite.com
default_profile: everything

CLI Reference

# Setup
crier init                              # Interactive setup
crier config show                       # View configuration
crier doctor                            # Verify API keys

# Publishing
crier publish FILE --to PLATFORM        # Publish to platform(s)
crier publish FILE --auto-rewrite       # With LLM-generated short-form
crier audit                             # See what needs publishing
crier audit --publish --yes             # Bulk publish all missing
crier audit --publish --auto-rewrite    # Bulk publish with LLM rewrites

# Management
crier list PLATFORM                     # List your articles
crier status [FILE]                     # Show publication status

# Claude Code
crier skill install                     # Install the skill

Discussion