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

  1. Read result.message (the primary error) — it names the specific failure (empty text, disabled button, error dialog).
  2. Open the tweet manually in the automation browser and try replying by hand to identify the restriction.
  3. Check --text is non-empty and within X's length limit (account for URLs/media counting rules).
  4. 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

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


AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29). Data as JSON: /api/errors/a19f94966697824e. Report an issue: GitHub.