Sandeep Salwan

Easy Posting Guide

Easy Posting Guide

This is the stupid-simple version.

What already works

What still needs keys from you if you want “post everywhere”

If those are not set, the blog still posts to your site, dev.to, and Hashnode. It just skips the missing socials.

The easiest way to use it

Option 1: easiest possible

  1. Make a new post file:
npm run post:new -- --title "My New Post" --description "One line summary" --tags "ai,llm"
  1. Open the file it prints.
  2. Write the post.
  3. Commit and push to main.
  4. Done. GitHub Actions auto-posts it.

Option 1B: start from a .txt or .md draft you already wrote

If you already wrote something in Notes, TextEdit, Cursor, or anywhere else:

npm run post:import -- --source "/full/path/to/your-draft.txt" --tags "ai,llm"

Or for markdown:

npm run post:import -- --source "/full/path/to/your-draft.md" --tags "ai,llm"

That creates the ready-to-publish _posts/...md file automatically.

Option 2: manual button in GitHub

  1. Push your post branch.
  2. Open GitHub Actions.
  3. Open Blog Publish.
  4. Click Run workflow.
  5. Put the exact file path in post_path.

Example:

_posts/2026-04-18-my-post.md
  1. If you want a safe test first, turn on dry_run.
  2. Run it.

The safest test flow

Run these before real publishing if you want to be extra safe:

npm run post:import -- --source "/full/path/to/draft.txt" --tags "ai,llm"
npm run check:setup
npm run verify:automation
DRY_RUN=1 POST_PATH=_posts/2026-04-15-what-i-look-for-in-agentic-products.md npm run publish:devto
DRY_RUN=1 POST_PATH=_posts/2026-04-15-what-i-look-for-in-agentic-products.md npm run publish:hashnode
DRY_RUN=1 POST_PATH=_posts/2026-04-15-what-i-look-for-in-agentic-products.md npm run post:social

Real publish commands

POST_PATH=_posts/2026-04-15-what-i-look-for-in-agentic-products.md npm run publish:devto
POST_PATH=_posts/2026-04-15-what-i-look-for-in-agentic-products.md npm run publish:hashnode
POST_PATH=_posts/2026-04-15-what-i-look-for-in-agentic-products.md npm run post:social

Most of the time you should not need these. Pushing to main is enough.

What I need from you

If you want every network connected, send me the keys below or add them as GitHub repo secrets yourself.

Platform Secret names Where to get it
dev.to DEVTO_TOKEN dev.to Settings → Extensions → API key
Hashnode HASHNODE_TOKEN, HASHNODE_PUBLICATION_ID Hashnode Settings → Developer token, plus your publication id
X X_API_KEY, X_API_SECRET, X_ACCESS_TOKEN, X_ACCESS_TOKEN_SECRET X Developer Console → App → Keys and tokens
Mastodon MASTODON_HOST, MASTODON_ACCESS_TOKEN Your Mastodon server → Preferences/Edit Profile → Development → New application
Bluesky BLUESKY_HOST, BLUESKY_IDENTIFIER, BLUESKY_APP_PASSWORD Bluesky Settings → Advanced → App Passwords
LinkedIn LINKEDIN_ACCESS_TOKEN LinkedIn Developers → your app → add “Share on LinkedIn” → generate token with w_member_social
Discord DISCORD_WEBHOOK_URL or DISCORD_BOT_TOKEN + DISCORD_CHANNEL_ID Discord server/channel Integrations → Webhooks, or Discord Developer Portal for bot
Telegram TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID Create bot with @BotFather, then get channel/chat id

Official links:

Best recommendation

That order is fastest and least annoying.

One-command status check

npm run check:setup

It tells you exactly which secrets are still missing.

Important