Crosspine – Publish Once, Everywhere
A multi-tenant social publishing workspace. One draft, fitted to each network's rules, approved by your team, and published on schedule to twelve platforms from a single calendar.
Next.js 16TypeScriptPrismaPostgreSQLBullMQStripe

01
Problem Statement
- A dozen tabs: posting the same thing everywhere means logging into every network in turn and pasting the same text by hand.
- Rules you find out about too late: character limits, media counts, aspect ratios, and video lengths differ per network, and most only complain after you publish.
- No room for a team: a scheduling queue on its own has no notion of who drafts, who approves, and what is allowed to go out unreviewed.
- Publishing quietly fails: expired tokens, rate limits, and platform outages turn a scheduled post into silence unless something is watching and retrying.

02
Goals & Objectives
- Put every network behind one adapter interface, so adding a platform never means touching the scheduler.
- Validate a post against each network's real constraints before it can be scheduled, not after it fails.
- Make workspaces, roles, and approval first-class rather than bolted onto a single-user tool.
- Encrypt channel tokens at rest and scope every query to one workspace at a single enforced choke point.

03
The Solution
- A composer with per-channel overrides and live constraint validation, backed by twelve platform adapters.
- A calendar with drag to reschedule, and a media pipeline that probes uploads and builds thumbnails, renditions, and alt text.
- A background worker with idempotent job ids, automatic retries for what is retryable, and normalised platform errors for what is not.
- An approval workflow for team members, analytics gathered on a schedule, and an AI assistant for drafting and rewriting captions.

Results
Crosspine is live at crosspine.io. A post goes out once and lands on every network it was written for, shaped correctly for each. A team member drafts, an admin approves, and the queue publishes on schedule without anyone watching it. Failures retry on their own and surface the platform's real error instead of a generic one. Connected accounts, media, scheduling, and analytics live in one workspace, and supporting another network means writing one adapter against an interface that already exists.