jackwener/OpenCLI · error · CommandExecutionError
Nothing was posted. Open the tweet in the browser and retry.
Error message
Nothing was posted. Open the tweet in the browser and retry.
What it means
After the submit poll, if the result is neither unconfirmed nor ok, the command throws this CommandExecutionError using the poller's message as the primary error text and this sentence as the hint: nothing was posted, so the user should open the tweet in the browser and retry. Unlike the timeout case, the flow definitively failed rather than merely failing to confirm.
Source
Thrown at clis/twitter/reply.js:294
}
// Dedicated composer is normally more reliable than the inline
// tweet page reply box, but X occasionally leaves that route on the
// Home timeline behind a loading dialog. openReplyComposer falls
// back to the target tweet's visible Reply action.
const composer = await openReplyComposer(page, kwargs.url);
if (!composer?.ok) {
throw new CommandExecutionError(composer?.message ?? 'Could not open the reply composer.', 'Open the tweet in the browser and check whether the reply box is available.');
}
if (localImagePath) {
await page.wait({ selector: COMPOSER_FILE_INPUT_SELECTOR, timeout: 20 });
await attachComposerImage(page, localImagePath);
}
const result = await submitReply(page, kwargs.text);
if (result.unconfirmed) {
throw new TimeoutError('twitter reply', SUBMIT_TIMEOUT_MS / 1000, `${result.message} Check the tweet before retrying; the reply may already be live.`);
}
if (!result.ok) {
throw new CommandExecutionError(result.message, 'Nothing was posted. Open the tweet in the browser and retry.');
}
return [{
status: 'success',
message: result.message,
text: kwargs.text,
...(result.url ? { url: result.url } : {}),
...(kwargs.image ? { image: kwargs.image } : {}),
...(kwargs['image-url'] ? { 'image-url': kwargs['image-url'] } : {}),
}];
} finally {
if (cleanupDir) {
fs.rmSync(cleanupDir, { recursive: true, force: true });
}
}
}
});
export const __test__ = {
buildReplyComposerUrl,View on GitHub (pinned to 49907e53dc)
Solutions
- Read result.message (the primary error) — it names the specific failure (empty text, disabled button, error dialog).
- Open the tweet manually in the automation browser and try replying by hand to identify the restriction.
- Check --text is non-empty and within X's length limit (account for URLs/media counting rules).
- Confirm the account is allowed to reply to this tweet (not blocked or restricted) and retry.
Example fix
// before opencli twitter reply --url <tweet> --text "" // after opencli twitter reply --url <tweet> --text "Thanks for sharing!"
Defensive patterns
Strategy: try-catch
Validate before calling
// Validate inputs the poller rejects:
if (!text?.trim()) throw new Error('Reply text is empty');
if (text.length > 280) throw new Error('Reply exceeds character limit'); Type guard
null
Try / catch
try {
await cli('twitter', 'reply', { url, text });
} catch (e) {
if (String(e.message).includes('Nothing was posted')) {
// definitive failure: read e.message for the cause, fix input/permissions, then retry
} else throw e;
} Prevention
- Keep reply text non-empty and within X's limit (URLs/media count toward it).
- Verify the account can reply to the target tweet (not blocked/restricted).
- Open the tweet manually to reproduce the error dialog the automation hit.
- Warm up the session with a manual action if X's anti-bot heuristics interfere.
When it happens
Trigger: submitReply returns { ok: false, message } — e.g. the reply button was disabled, the composer detected empty/over-length text, X rendered an error dialog, or the text insertion verification failed downstream.
Common situations: Empty reply text passed via --text; exceeding the character limit; the account cannot reply (blocked, limited, or the tweet author restricts replies); X's anti-bot heuristics refusing the automated click.
Related errors
- Unexpected 12306 probe: ${JSON.stringify(probe)}
- Waiting for 12306 tk auth cookie
- x.com
- Nothing changed. Open the tweet in the browser and retry.
- Nothing changed. Open the tweet in the browser and retry.
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/a19f94966697824e.
Report an issue: GitHub.