Add code FIRST10 at checkout to get 50% off the lifetime deal.

Table of contents

Documentation / Setup

XPosts setup guide

End-to-end: deploy to Vercel, connect X + Grok, and enable auto-posting with cron-job.org.

What you're setting up

PiecePurpose
VercelHosts the site
Vercel BlobSaves persona, history, scheduled posts (survives redeploys)
X Bearer TokenReads tweets to build your persona
X OAuth keysPosts scheduled tweets to your account
xAI API keyGrok generates posts and ideas
cron-job.orgHits your app every 15 min to publish due posts

Get the code

After paying on Stripe, log in at the customer dashboard and download the latest zip. Unzip it, then push to a new GitHub repo (or fork if you have repo access).

Part 1

Accounts & repo

1

Create accounts (if needed)

2

Push the repo to GitHub

  1. Download and unzip from your dashboard, or fork/clone the repo.
  2. Create a new GitHub repository and push the code to your account.

Part 2

Deploy on Vercel

3

Import the project

  1. Go to vercel.com/new.
  2. Import your GitHub repo.
  3. Framework: Next.js (auto-detected).
  4. Deploy once — it may fail until env vars exist; that's fine.
4

Add Vercel Blob storage

  1. Vercel project → Storage → Create → Blob.
  2. Name it (e.g. xgrowth-data) and connect it to the project.
  3. Vercel adds BLOB_STORE_ID automatically (OIDC). You usually don't copy it manually.
Why Blob?

Without Blob on Vercel, data won't persist reliably. Locally the app uses a data/ folder instead.

5

Set environment variables

Vercel → Settings → Environment Variables. Add all of these for Production, Preview, and Development:

VariableRequiredWhat it does
DASHBOARD_PASSWORDYesLogin password for the app
SESSION_SECRETYesRandom string, 32+ characters (session signing)
X_BEARER_TOKENYesRead tweets for persona
XAI_API_KEYYesGrok generation
X_CONSUMER_KEYAuto posterOAuth Consumer Key
X_CONSUMER_SECRETAuto posterOAuth Consumer Secret
X_ACCESS_TOKENAuto posterYour user Access Token
X_ACCESS_TOKEN_SECRETAuto posterYour user Access Token Secret
CRON_SECRETAuto posterRandom secret for cron-job.org auth
BLOB_STORE_IDVercelUsually auto-added by Blob store
BLOB_READ_WRITE_TOKENLegacy onlyOnly if you use an old Blob store

Generate secrets

  • SESSION_SECRET — long random string (password generator, 32+ chars)
  • CRON_SECRET — different long random string
  • DASHBOARD_PASSWORD — whatever you want to log in with

Optional (notes only)

CRON_PUBLISH_URL — e.g. https://your-app.vercel.app/api/cron/publish

6

Redeploy

Deployments → latest → Redeploy (or push a commit). Env vars only apply after redeploy.

Part 3

X Developer Portal

Follow the screenshots below in order. You'll create an app, enable Read and write permissions, then copy your Bearer Token and OAuth keys into Vercel.

7

Create an X app

  1. Go to developer.x.com and open your project (or create one).
  2. Click to add a new app — use a name like xposts-auto.
X Developer Portal — create a new client app
1. Create a new app in the Developer Portal.
X Developer Portal — app created successfully
2. App created — open it to configure keys and permissions.
7b

App info & permissions

From your new app, open Settings and set permissions to Read and write before generating Access Token + Secret.

Click Settings tab in X Developer Portal
4. Open the Settings tab.
Set app permissions to Read and write
5. Set App permissions to Read and write, then save.
X app info overview page
3. Return to Keys and tokens on your app.
X app Keys and tokens — Bearer Token and OAuth keys
6. Copy your Bearer Token and OAuth keys. Generate Access Token + Secret here (after Read and write is saved).
8

All X tokens — add to Vercel

You now have every key xposts.co needs for X. Paste them into Vercel → Settings → Environment Variables (Production, Preview, and Development):

Vercel variableFrom X Developer Portal
X_BEARER_TOKENBearer Token — reads tweets for personas
X_CONSUMER_KEYOAuth 1.0 Consumer Key
X_CONSUMER_SECRETOAuth 1.0 Consumer Secret
X_ACCESS_TOKENAccess Token — posts as your X account
X_ACCESS_TOKEN_SECRETAccess Token Secret

Redeploy after saving. Access tokens post as whichever X account generated them — use the account you want to auto-post from.

X API access tiers change over time. If persona build fails with auth/rate errors, check your X developer plan allows user tweet lookup.

Part 4

xAI (Grok)

After X keys are set, add your Grok API key for post generation.

9

Get your Grok API key

  1. Go to console.x.ai.
  2. Create an API key.
  3. Add to Vercel as XAI_API_KEY.
  4. Redeploy.

Generation costs about $0.01 per text post — you pay xAI directly, not xposts.co.

Part 5

cron-job.org (auto poster)

After X + Grok keys are in Vercel, set up cron so scheduled posts publish automatically.

The app exposes a public endpoint (no dashboard login):

GET or POST  https://YOUR-APP.vercel.app/api/cron/publish

Auth (either works):

  • Authorization: Bearer YOUR_CRON_SECRET
  • or header: x-cron-secret: YOUR_CRON_SECRET

YOUR_CRON_SECRET must match CRON_SECRET in Vercel.

Built-in 15-minute spacing

xposts.co won't let you queue posts less than 15 minutes apart. Cron also runs every 15 minutes — so you can't accidentally spam X. Schedule at least 15 minutes ahead and you're safe.

10

Create the cron job

  1. Sign up / log in at cron-job.org.
  2. Click Create cronjob → choose URL type.
  3. Title: e.g. XPosts publish
  4. URL: https://YOUR-APP.vercel.app/api/cron/publish
  5. Schedule: every 15 minutes
  6. Request method: GET (or POST — both work)
cron-job.org — create a new cron job
1. Create a new cron job and enter your Vercel publish URL.
cron-job.org — schedule every 15 minutes
2. Set the schedule to every 15 minutes.
cron-job.org — Authorization Bearer header
3. Add header Authorization = Bearer YOUR_CRON_SECRET (must match Vercel exactly).

Enable the job and you're done. cron-job.org hits your app every 15 minutes to publish due posts — xposts.co's queue already enforces 15-minute gaps, so posts won't pile up or spam your account.

11

Test the cron job manually

In cron-job.org, use Test run / Execute now.

Success response (example):

{
  "ok": true,
  "processed": 1,
  "results": [{ "id": "...", "status": "posted", "tweetId": "..." }]
}
ResponseFix
401 UnauthorizedWrong CRON_SECRET or missing Authorization: Bearer ... header
503 + X credentials missingSet all 4 OAuth vars and redeploy
processed: 0Normal if nothing is due yet
status: "failed"Check error in response; often X API limits, bad token, or tweet too long
12

Verify a real post

  1. In Auto poster, schedule a post 20+ minutes ahead.
  2. Wait for the next cron run (within 15 min of scheduled time).
  3. Refresh Auto poster — status should change to posted.
  4. Confirm on X.

Part 6

First use in the dashboard

With X keys, Grok, and cron configured, log in and start generating.

13

Log in

Open https://YOUR-APP.vercel.app and enter your DASHBOARD_PASSWORD.

14

Personas tab

  1. Enter your X username (no @).
  2. Enter 3 influencer usernames (all unique, no duplicates).
  3. Roles: similar niche, aspirational, skill-based (shown in UI).
  4. Click Save accounts.
  5. Click Build persona — fetches tweets via Bearer Token.
  6. Wait until it completes (can take a minute).
15

Content hub tab

  • Set up your Growth plan (targets, talking points).
  • Pick post format (short / standard / longform).
  • Generate posts or run Post ideas (trends + Grok).
  • Use Copy or Schedule on any post card.
16

Auto poster tab — queue posts

Rules (built into the app):

  • Posts must be scheduled at least 15 minutes apart — the queue won't accept closer intervals.
  • Cron checks every 15 minutes, so you won't spam X.
  • Max 7 days ahead · max 7 posts/day · max 49 pending in queue.

Ways to schedule

  • Schedule on a generated post card (Content hub), or
  • Paste text in Auto poster → Add to queue.
17

Compare & Storage tabs (optional)

  • Compare — graph + table vs other tools (local post math).
  • Storage — Blob usage; clear history/queue if needed.

Part 7

Local development (optional)

Copy env file:

copy .env.example .env.local

Fill at minimum: DASHBOARD_PASSWORD, SESSION_SECRET, X_BEARER_TOKEN, XAI_API_KEY.

Leave Blob vars empty — data saves to data/ locally.

Run:

npm install
npm run dev

Open http://localhost:3000.

Auto poster locally: OAuth keys work, but cron must hit a public URL. For local testing, use a tunnel (ngrok, etc.) or test against your Vercel URL.

Cache errors (Cannot find module './611.js')

npm run dev:clean

Keep the project outside OneDrive if this keeps happening (e.g. C:\dev\xgrowth).

Part 8

Customize in the app (optional)

No GitHub edits needed — add sources and personas directly in your dashboard so generations match the vibe you want.

Add more websites, personas, and content sources in the xposts.co dashboard
Use Add more to plug in websites, RSS feeds, subreddits, or extra personas — whatever you want your posts to feel like.
  • Websites & products — point generation at your sites or niches you cover.
  • Personas — add influencers or voices beyond the default three.
  • Content sources — Reddit, Hacker News, RSS — tune what ideas get pulled in.

Everything saves to your Blob storage automatically. No redeploy required.

Part 9

Checklist

Deploy

  • Repo on GitHub
  • Vercel project imported
  • Blob store connected
  • All env vars set
  • Redeployed

X API

  • X_BEARER_TOKEN — persona build works
  • App permission Read and write
  • 4 OAuth vars set — auto poster warning gone

Cron

  • CRON_SECRET in Vercel
  • cron-job.org job every 15 min
  • Authorization: Bearer ... header set
  • Test run returns ok: true
  • Scheduled post goes posted on X

App

  • Login works
  • Persona built (you + 3 influencers)
  • Generated and scheduled at least one post

Part 10

Troubleshooting

ProblemWhat to try
Login failsCheck DASHBOARD_PASSWORD, redeploy
Persona build failsCheck X_BEARER_TOKEN, X API access, usernames valid
Grok errorsCheck XAI_API_KEY, billing/credits on x.ai
Queue saves but nothing postsOAuth keys + cron job + CRON_SECRET header
401 on cronBearer token in header must match CRON_SECRET exactly
Data lost on redeployConnect Vercel Blob; check Storage tab
Dashboard 500 / missing chunknpm run dev:clean; move off OneDrive
Two dev serversKill old node on port 3000; one clean npm run dev

Quick reference — env vars

From .env.example:

DASHBOARD_PASSWORD=
SESSION_SECRET=
X_BEARER_TOKEN=
X_CONSUMER_KEY=
X_CONSUMER_SECRET=
X_ACCESS_TOKEN=
X_ACCESS_TOKEN_SECRET=
XAI_API_KEY=
BLOB_STORE_ID=          # Vercel auto
CRON_SECRET=
CRON_PUBLISH_URL=       # optional, for your notes

Need the codebase?

Pay once, download the zip, and follow this guide.

Buy now — $39