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.2.1.tar.gz (662.6 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.2.1-py3-none-any.whl (38.2 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for crier-0.2.1.tar.gz
Algorithm Hash digest
SHA256 e6f7f1c1b4615eb16dd0d4f5100d5f0f773fa4468665188f40723e61ff0f9068
MD5 4204aeacd09b6f280444b67f4fd7b830
BLAKE2b-256 ab3e04df6a392dd6fbf4ca7b69ab619f983dac2a560dc916ea1305e344c7dfa9

See more details on using hashes here.

File details

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

File metadata

  • Download URL: crier-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 38.2 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.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 85881a02e4851eecc51552d031482a752d90bebb0a7bb4c9fb8a35008e74fe0e
MD5 ed3668f4c388a8d4077db6399598ae69
BLAKE2b-256 d1c0662d1b37f6744d16a3b542c8fd6584311a6a491867d9c4bc6f6fc19a38c9

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