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.
Targets
Social surfaces already wired in.
Start locally
One terminal, one private publishing console.
npm install
cp .env.example .env
npm run dev:local
Run Crossposter locally.
The publishing dashboard runs at http://localhost:2004.
The static website you are reading lives in web/.
Install dependencies and create the local env file.
Add provider profiles from the app settings UI.
Select ready channels and send or schedule the draft.
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.
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, Peerlist, and Hacker News use local cookies, sessions, tools, or normal submit flows.
Multiple profiles
Provider profiles are saved in poster.config.local.json, with active profile selection managed in Settings.
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 |
| 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 | |
| Peerlist | 120 chars | 2,000 chars | 15 MB image/GIF |
| 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 uses Vercel Web Analytics for aggregate page-view analytics and does not use tracking cookies.
Terms
Use Crossposter only with accounts you control. You are responsible for platform rules, API terms, automation rules, and content policies.