Open-source local publisher

Crossposter for your own accounts

Publish everywhere from localhost.

Compose once, attach media, check platform limits, and post to connected socials from a local/self-hosted server you control.

Terminal
npx @apoorvdarshan/crossposter@latest

Crossposter keeps the publishing workflow close to the app itself: one composer, provider readiness cards, local history, scheduled posts, and warnings only when selected socials would reject a draft.

15 targets Local files MIT

Targets

Social surfaces already wired in.

X LinkedIn Bluesky Mastodon Instagram YouTube Dev.to Pinterest Hacker News Nostr Dribbble

Start locally

One terminal, one private publishing console.

Terminal
npx @apoorvdarshan/crossposter@latest
Quickstart

Run Crossposter locally.

The publishing dashboard runs at http://localhost:2004. Run it from any local folder; Crossposter keeps config, uploads, sessions, and drafts in that folder.

01 Run

Start with npx @apoorvdarshan/crossposter@latest and open localhost.

02 Configure

Add provider profiles from the app settings UI.

03 Publish

Select ready channels and send or schedule the draft.

Persistent install
npm install -g @apoorvdarshan/crossposter
crossposter
Auto-start on macOS
crossposter install-service
crossposter uninstall-service
Update anytime
npx @apoorvdarshan/crossposter@latest
Workflow

Built for repeated posting, not marketing bloat.

Compose

One work surface

Title, link, post body, and media stay visible while you choose targets.

Preflight

Warnings when needed

Text and media limits only appear when a selected social would reject the draft.

History

Results stay local

Successful links and provider failures are saved together in local publish history.

Schedule

Queue from localhost

Scheduled posts run from the same self-hosted Crossposter server.

Providers

Current publishing targets.

X / Twitterheadless browser · text/media/video
LinkedInOAuth · profiles/pages
Blueskyapp password · text/images
Mastodonaccess token · text/media
Instagramsigned-in browser · images/video
YouTubeInnerTube · video upload
Dev.toAPI key · markdown articles
Pinterestpy3-pinterest · Pins
Hacker Newsform flow · link/text
Nostrlocal key · relays
DribbbleOAuth · shots

Unofficial provider notice

Crossposter mixes official APIs with local, unofficial integrations. X / Twitter, Instagram, YouTube, Pinterest, and Hacker News may use your own browser sessions, saved cookies, private APIs, third-party tools, or normal web submit flows, all running locally. Instagram signs in to a dedicated, isolated browser once per account and reuses that real session (no stored password, no fake mobile login), but it is still automation, not an official API. Use these only with accounts you own or manage, and keep posting occasional and human-paced.

Setup

Credentials stay local.

Official APIs

LinkedIn and Dribbble use OAuth. Bluesky, Mastodon, Dev.to, and Nostr use app passwords, access tokens, or local keys.

Local sessions

X, Instagram, YouTube, Pinterest, and Hacker News use your own browser sessions, local cookies, tools, or normal submit flows. Instagram signs in to a dedicated, isolated browser once per account.

Multiple profiles

Provider profiles are saved in poster.config.local.json. Pick which accounts to post to per publish on the dashboard.

Limits

Known limits are checked before publishing.

Provider Title Post Media
X / TwitterPost text280 chars5 MB photo, 15 MB GIF, 512 MB or 16 GB video with Premium
LinkedInPost text3,000 charsImages and MP4 up to 500 MB
BlueskyPost text300 charsImages up to 1 MB
MastodonPost text500 chars16 MB image, about 99 MB video
InstagramCaption2,200 chars8 MB image, 300 MB video
YouTube100 chars5,000 char descriptionVideo up to 256 GB or 12 hours
Dev.to128 non-space chars800 KB bodyLocal media ignored
Pinterest100 chars800 char description20 MB image, 100 MB video
Hacker News80 charsOptional textLocal media ignored
DribbbleRequiredDescription400x300 or 800x600, up to 8 MB
Media

Compression and crop tools are built in.

IMG

Image compression

Convert images to JPG with quality, target size, and estimated output size controls.

MP4

Video conversion

Transcode supported video to MP4 when that can satisfy a selected platform.

4:3

Dribbble crop

Crop non-GIF images to Dribbble's required 400x300 or 800x600 shot sizes.

Security

Private by convention.

  • Keep poster.config.local.json private.
  • Never commit API keys, OAuth tokens, cookies, passwords, or session files.
  • Use POSTER_REQUIRE_ADMIN_PASSWORD=true before public hosting.
  • Only connect accounts, pages, boards, channels, and profiles you own or manage.
Privacy & terms

Policy lives here, not in separate Markdown files.

Effective date: June 4, 2026

Privacy

Crossposter stores credentials, titles, links, draft text, media, scheduled posts, and publish history in your local or self-hosted environment.

Third parties

Content is sent only to the social platforms selected during publishing. This website is hosted on Cloudflare Pages and does not use application tracking cookies.

Terms

Use Crossposter only with accounts you control. You are responsible for platform rules, API terms, automation rules, and content policies.

Unofficial flows

Unofficial integrations can break when platforms change and may trigger challenges, rate limits, failed posts, or account restrictions.

FAQ

Frequently asked questions.

Is Crossposter free?

Yes. Crossposter is free and open source under the MIT license. Run it locally with npx @apoorvdarshan/crossposter@latest — there is no account, subscription, or paid tier.

Which social media platforms does it support?

Eleven, from one composer: X / Twitter, LinkedIn, Bluesky, Mastodon, Instagram, YouTube, Dev.to, Pinterest, Hacker News, Nostr, and Dribbble.

Can I schedule posts to multiple social networks at once?

Yes. Compose once, pick the target accounts, then publish now or schedule for later. The scheduler runs from your own local or self-hosted Crossposter server.

Is it a self-hosted, local social media scheduler?

Yes. Crossposter is local-first: it runs on http://localhost:2004 or your own server, with no database and no third-party backend.

Where are my credentials and drafts stored?

On your machine. Tokens, sessions, drafts, media, scheduled posts, and history stay in poster.config.local.json and local folders — nothing is sent to a Crossposter cloud.

How do I cross-post to X and LinkedIn at the same time?

Connect both accounts in Settings, select them as targets on the dashboard, write the post once, and publish. Crossposter sends it to every selected account and shows per-platform results.

Project links

Source, support, and contact.