Skip to main content

Cross-post your content to dev.to, Hashnode, Medium, and more

Project description

Crier

Cross-post your content to dev.to, Ghost, WordPress, Hashnode, Medium, Bluesky, Mastodon, Threads, Telegram, Discord, and more.

Like a town crier announcing your content to the world.

Installation

pip install crier

Quick Start

# Configure your API keys
crier config set devto.api_key YOUR_API_KEY
crier config set bluesky.api_key "handle.bsky.social:app-password"
crier config set mastodon.api_key "mastodon.social:access-token"

# Publish a markdown file
crier publish post.md --to devto

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

# List your articles
crier list devto

# Update an existing article
crier update devto 12345 --file updated-post.md

Supported Platforms

Platform API Key Format Notes
dev.to api_key Full article support
Hashnode token or token:publication_id Full article support
Medium integration_token Publish only (no edit/list)
Ghost https://site.com:key_id:key_secret Full article support
WordPress site.wordpress.com:token or https://site.com:user:app_pass Full article support
Buttondown api_key Newsletter publishing
Bluesky handle:app_password Short posts with link cards
Mastodon instance:access_token Toots with hashtags
Threads user_id:access_token Short posts (no edit support)
Telegram bot_token:chat_id Channel/group posts
Discord webhook_url Server announcements
LinkedIn access_token Requires API access
Twitter/X any (copy-paste mode) Generates tweet for manual posting

Platform Notes

Blog Platforms (dev.to, Hashnode, Medium, Ghost, WordPress):

  • Full markdown article publishing
  • Preserves front matter (title, description, tags, canonical_url)
  • Best for long-form content

Newsletter Platforms (Buttondown):

  • Publishes to email subscribers
  • Full markdown support
  • Great for content repurposing

Social Platforms (Bluesky, Mastodon, LinkedIn, Twitter, Threads):

  • Creates short posts with link to canonical URL
  • Uses title + description + hashtags from tags
  • Best for announcing new content

Announcement Channels (Telegram, Discord):

  • Posts to channels/servers
  • Good for community announcements
  • Discord uses webhook embeds

Configuration

API keys can be set via:

  1. Config file (~/.config/crier/config.yaml):

    platforms:
      devto:
        api_key: your_key_here
      bluesky:
        api_key: "handle.bsky.social:app-password"
      mastodon:
        api_key: "mastodon.social:access-token"
    
  2. Environment variables:

    export CRIER_DEVTO_API_KEY=your_key_here
    export CRIER_BLUESKY_API_KEY="handle.bsky.social:app-password"
    

Markdown Format

Crier reads standard markdown with YAML front matter:

---
title: "My Amazing Post"
description: "A brief description"
tags: [python, programming]
canonical_url: https://myblog.com/my-post
published: true
---

Your content here...

Commands

crier publish FILE [--to PLATFORM]...  # Publish to platform(s)
crier update PLATFORM ID --file FILE   # Update existing article
crier list PLATFORM                     # List your articles
crier config set KEY VALUE              # Set configuration
crier config show                       # Show configuration
crier platforms                         # List available platforms

Getting API Keys

dev.to

  1. Go to https://dev.to/settings/extensions
  2. Generate API key

Hashnode

  1. Go to https://hashnode.com/settings/developer
  2. Generate Personal Access Token

Medium

  1. Go to https://medium.com/me/settings/security
  2. Generate Integration Token

Bluesky

  1. Go to Settings → App Passwords
  2. Create an app password
  3. Use format: yourhandle.bsky.social:xxxx-xxxx-xxxx-xxxx

Mastodon

  1. Go to Settings → Development → New Application
  2. Create app with write:statuses scope
  3. Use format: instance.social:your-access-token

Twitter/X

Uses copy-paste mode - generates formatted tweet text for manual posting. No API setup required. Just set any placeholder value:

crier config set twitter.api_key manual

Ghost

  1. Go to Settings → Integrations → Add custom integration
  2. Copy the Admin API Key (format: key_id:key_secret)
  3. Use format: https://yourblog.com:key_id:key_secret

WordPress

WordPress.com:

  1. Go to https://developer.wordpress.com/apps/
  2. Create an app and get OAuth token
  3. Use format: yoursite.wordpress.com:access_token

Self-hosted WordPress:

  1. Go to Users → Profile → Application Passwords
  2. Create a new application password
  3. Use format: https://yoursite.com:username:app_password

Buttondown

  1. Go to https://buttondown.email/settings/programming
  2. Copy your API key
  3. Use format: api_key

Threads

  1. Create a Meta Developer account at https://developers.facebook.com/
  2. Create an app with Threads API access
  3. Get your user_id and access_token
  4. Use format: user_id:access_token

Telegram

  1. Message @BotFather to create a bot and get the bot token
  2. Add your bot as admin to your channel
  3. Get your channel's chat_id (e.g., @yourchannel or numeric ID)
  4. Use format: bot_token:chat_id

Discord

  1. Go to Server Settings → Integrations → Webhooks
  2. Create a new webhook for your announcement channel
  3. Copy the webhook URL
  4. Use the full URL as the API key

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

crier-0.3.2.tar.gz (38.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

crier-0.3.2-py3-none-any.whl (40.1 kB view details)

Uploaded Python 3

File details

Details for the file crier-0.3.2.tar.gz.

File metadata

  • Download URL: crier-0.3.2.tar.gz
  • Upload date:
  • Size: 38.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for crier-0.3.2.tar.gz
Algorithm Hash digest
SHA256 6440a2a1b47f85513fdb55a1bbfc47b8e525358dd1d15c49a84c21bf643a6ccc
MD5 54bcdd21273c16222973062733ff7253
BLAKE2b-256 5b47649c0b11da98ef8e6097646449d753329f7cb5b05e9dec0351dbdf2188b7

See more details on using hashes here.

File details

Details for the file crier-0.3.2-py3-none-any.whl.

File metadata

  • Download URL: crier-0.3.2-py3-none-any.whl
  • Upload date:
  • Size: 40.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for crier-0.3.2-py3-none-any.whl
Algorithm Hash digest
SHA256 479f80d95e20343cc03dce84b74a50874a89a05bcfc22f7a0cf00f2f9ce4d6d1
MD5 56f3df59723efeb0157901c7b14581a2
BLAKE2b-256 2ab45baa585622a40c16b738366d82af5698253a6f001e160ceeac4ccf5272d0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page