gitroomhq/postiz-app · warning · BadBody
Bluesky may have already published this post, please check y
Error message
Bluesky may have already published this post, please check your account before posting again to avoid duplicates
What it means
Thrown by Bluesky's checkPostStatus when pendingData shows a confirmed create attempt (attempting && confirmed) whose result was never reported. Because the post may already exist on Bluesky, the provider refuses to retry the create to avoid duplicates and stops with an explicit warning. This is a safety stop, not a transient failure.
Source
Thrown at libraries/nestjs-libraries/src/integrations/social/bluesky.provider.ts:481
message: firstPost.message,
media: (firstPost.media || []).map((m) => ({
path: m.path,
alt: m.alt || '',
})),
} as BlueskyPendingData,
},
];
}
override async checkPostStatus(
accessToken: string,
pendingData: BlueskyPendingData,
integration: Integration
): Promise<PendingCheckResponse> {
// A confirmed create attempt died without reporting its result: never run
// the create again - stop with an explicit warning instead.
if (pendingData.attempting && pendingData.confirmed) {
throw new BadBody(
'bluesky',
JSON.stringify({}),
{} as any,
'Bluesky may have already published this post, please check your account before posting again to avoid duplicates'
);
}
// witness the armed create so finalizePost knows the attempt is uniquely
// accounted for before it mutates anything
const witness = (): PendingCheckResponse =>
pendingData.attempting && !pendingData.confirmed
? {
status: 'ready',
pendingData: { ...pendingData, confirmed: true },
}
: { status: 'ready', pendingData };
// Image-only posts have no asynchronous processing step.View on GitHub (pinned to 0f1647f749)
Solutions
- Log into Bluesky (or query the app.bsky.feed.post search/resolver) and check whether the post exists
- If it exists, mark the post as published in Postiz and delete the duplicate if unwanted
- If it does not exist, reset pendingData (attempting/confirmed) and re-run the post
- Investigate why the workflow died between confirm and result to prevent recurrence
Defensive patterns
Strategy: fallback
Try / catch
try {
const res = await provider.checkPostStatus(entry, pendingData, integration);
} catch (err) {
if (err instanceof BadBody && /already published/.test(err.message)) {
// surface to the user for manual confirmation, never auto-retry
await markNeedsUserReview(entry);
return;
}
throw err;
} Prevention
- Alert on workflows that die after the confirm step
- Monitor pendingData.attempting+confirmed state and quarantine those posts
- Keep publish and result recording in the same activity where possible
When it happens
Trigger: The post workflow crashed/timed out after marking pendingData.confirmed=true but before recording the created post URI (e.g. worker restart, activity timeout, network drop after the app.bsky.feed.post create call succeeded).
Common situations: Temporal worker restarts mid-publish, activity timeouts after the create RPC, network failure right after Bluesky accepted the post.
AI-assisted analysis of gitroomhq/postiz-app@0f1647f749 (2026-08-27).
Data as JSON: /api/errors/54deceff21bcfe84.
Report an issue: GitHub.