Troubleshooting·6 min read·

My post won't publish — how do I fix it?

Status stuck on Draft, Scheduled posts not going live, autosave conflicts, post body validation errors — practical fixes for every publish failure scenario.

You hit Publish, the button spinner runs for a moment, and then... nothing. The post is still sitting in Draft, or it says Scheduled but never actually appeared. It's one of those small failures that feels disproportionately frustrating, especially if you have a timed announcement to make. Here are the exact things to check, in order, to get your post live.

First — check the post status in admin

Go to Admin → Posts and look at the Status column next to your post. There are four states: Draft, Scheduled, Publishing, and Published. If the status says Publishing for more than 30 seconds, something got stuck mid-flight. If it says Scheduled with a future date, the post is fine — it's just not live yet by design.

Scheduled posts go live within 60 seconds of their scheduled time, not exactly on the dot. VeloCMS uses a server-side cron that runs every minute. If your post is 2 minutes late, wait another 60 seconds and hard-refresh the public URL before diagnosing further.

Stuck in Draft after clicking Publish

The most common cause is a required field left empty. VeloCMS requires a title and at least one paragraph of body content before publishing. If either is missing the save action fails silently in some browser versions. Open the post in the editor and look for a red outline around the title field or a warning banner at the top of the editor panel. Fill in the missing content and try again.

  • Title field empty or contains only whitespace — VeloCMS strips leading/trailing spaces before validating.
  • Post body contains only whitespace nodes — type a real paragraph, even a placeholder, then publish.
  • Feature image URL is malformed — if you pasted an external image URL manually, remove it and re-upload via the media picker.
  • Slug conflict — two posts with the same slug cannot coexist. VeloCMS appends a number automatically, but if you manually edited the slug to match an existing one, change it.

Autosave conflicts blocking publish

VeloCMS autosaves every 30 seconds while you type. If your browser tab went offline mid-edit and came back, the local autosave state and the server state can diverge. The editor will show a yellow 'Unsaved changes' badge in the top-right corner. Before hitting Publish in this state, click the badge — it opens a diff view showing local vs server content. Choose which version to keep, then publish from the resolved state.

If you have multiple browser tabs open with the same post, close all but one before publishing. Two tabs writing simultaneously will produce a last-write-wins conflict and one set of changes will be silently dropped.

Scheduled post not going live at the right time

Scheduled publishing uses the timezone set in Admin → Settings → General → Timezone. If your blog timezone is set to UTC but you entered 9:00 AM thinking it was your local time (say, EST which is UTC-5), the post will go live 5 hours later than you expected. Always check the timezone banner in the post editor's Schedule picker — it shows the time in both your local browser timezone and the blog's configured timezone side by side.

  • Verify Admin → Settings → General → Timezone matches your intended timezone.
  • If you changed timezone after scheduling posts, those posts still use the time as originally stored in UTC. Reschedule them explicitly.
  • Daylight saving time transitions can shift scheduled times by one hour if you scheduled across a DST boundary.
  • Railway (the hosting platform) runs on UTC. The scheduler is server-side, so it respects UTC regardless of your local browser timezone.

Publish works locally but fails in production

If you're self-hosting VeloCMS and publish works fine locally but fails on your production Railway deployment, the usual culprit is an environment variable mismatch. Open the Railway dashboard, go to your VeloCMS service, and check the Variables tab. Confirm POCKETBASE_URL points to your production PocketBase instance — not localhost:8090. Also verify POCKETBASE_ADMIN_EMAIL and POCKETBASE_ADMIN_PASSWORD are set correctly. A PocketBase connection failure will cause the publish server action to return a 500 and leave the post in Draft.

Still stuck? Go to Admin → Settings → Logs and look for a red error line timestamped around when you tried to publish. Copy the error message and send it to [email protected] — that's the fastest path to a fix.