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.
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.
npx @apoorvdarshan/crossposter@latest
Targets
Social surfaces already wired in.
Start locally
One terminal, one private publishing console.
npx @apoorvdarshan/crossposter@latest
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.
Start with npx @apoorvdarshan/crossposter@latest and open localhost.
Add provider profiles from the app settings UI.
Select ready channels and send or schedule the draft.
npm install -g @apoorvdarshan/crossposter
crossposter
crossposter install-service
crossposter uninstall-service
npx @apoorvdarshan/crossposter@latest
Built for repeated posting, not marketing bloat.
One work surface
Title, link, post body, and media stay visible while you choose targets.
Warnings when needed
Text and media limits only appear when a selected social would reject the draft.
Results stay local
Successful links and provider failures are saved together in local publish history.
Queue from localhost
Scheduled posts run from the same self-hosted Crossposter server.
Current publishing targets.
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.
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.
Known limits are checked before publishing.
| Provider | Title | Post | Media |
|---|---|---|---|
| X / Twitter | Post text | 280 chars | 5 MB photo, 15 MB GIF, 512 MB or 16 GB video with Premium |
| Post text | 3,000 chars | Images and MP4 up to 500 MB | |
| Bluesky | Post text | 300 chars | Images up to 1 MB |
| Mastodon | Post text | 500 chars | 16 MB image, about 99 MB video |
| Caption | 2,200 chars | 8 MB image, 300 MB video | |
| YouTube | 100 chars | 5,000 char description | Video up to 256 GB or 12 hours |
| Dev.to | 128 non-space chars | 800 KB body | Local media ignored |
| 100 chars | 800 char description | 20 MB image, 100 MB video | |
| Hacker News | 80 chars | Optional text | Local media ignored |
| Dribbble | Required | Description | 400x300 or 800x600, up to 8 MB |
Compression and crop tools are built in.
Image compression
Convert images to JPG with quality, target size, and estimated output size controls.
Video conversion
Transcode supported video to MP4 when that can satisfy a selected platform.
Dribbble crop
Crop non-GIF images to Dribbble's required 400x300 or 800x600 shot sizes.
Private by convention.
- Keep
poster.config.local.jsonprivate. - Never commit API keys, OAuth tokens, cookies, passwords, or session files.
- Use
POSTER_REQUIRE_ADMIN_PASSWORD=truebefore public hosting. - Only connect accounts, pages, boards, channels, and profiles you own or manage.
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.
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.