jackwener/OpenCLI · error · EmptyResultError
No Claude conversation history was visible on /recents.
Error message
No Claude conversation history was visible on /recents.
What it means
This EmptyResultError is thrown by the `claude history` command when the /recents page loads and the user is logged in, but getConversationList extracts zero conversations. Since any active account has recent conversations, the library treats an empty list as a failure — most likely a scraping/DOM mismatch or a genuinely empty account.
Source
Thrown at clis/claude/history.js:29
strategy: Strategy.COOKIE,
browser: true,
siteSession: 'persistent',
navigateBefore: false,
args: [
{ name: 'limit', type: 'int', default: 20, help: 'Max conversations to show' },
],
columns: ['Index', 'Id', 'Title', 'Url'],
func: async (page, kwargs) => {
const limit = requirePositiveInt(
Number(kwargs.limit ?? 20),
'claude history --limit',
'Example: opencli claude history --limit 20',
);
const conversations = await getConversationList(page);
await ensureClaudeLogin(page, 'Claude history requires a logged-in Claude session.');
if (conversations.length === 0) {
throw new EmptyResultError('claude history', 'No Claude conversation history was visible on /recents.');
}
return conversations.slice(0, limit);
},
});
View on GitHub (pinned to 49907e53dc)
Solutions
- Open https://claude.ai/recents in the browser and confirm conversations actually appear there
- Re-run the command — lazy-loaded lists often appear a moment later; a retry after full page load usually succeeds
- Send at least one message on claude.ai so the account has conversation history, then retry
- Update the library if Claude changed its recents DOM — newer selectors may be required
- Re-run `opencli claude auth` to ensure you're in the intended account/workspace
Example fix
// before // brand-new account, /recents empty -> EmptyResultError // after // send one chat on claude.ai, then: opencli claude history --limit 20
Defensive patterns
Strategy: retry
Validate before calling
// confirm the account actually has conversations before scraping history
// open https://claude.ai/recents in the browser and check the sidebar is non-empty
const cookies = await page.getCookies({ url: 'https://claude.ai' });
if (!cookies.some(c => c.name === 'sessionKey' && c.value)) {
throw new Error('Run `opencli claude auth` first');
} Type guard
function hasConversations(list) {
return Array.isArray(list) && list.length > 0;
} Try / catch
try {
const conversations = await opencli.claude.history({ limit: 20 });
} catch (e) {
if (e.message.includes('No Claude conversation history was visible')) {
await sleep(3000); // allow lazy-loaded list to paint
return opencli.claude.history({ limit: 20 });
}
throw e;
} Prevention
- Use an account with existing conversation history
- Wait for /recents to fully load before scraping (retry with delay)
- Update the library when Claude changes its recents/sidebar DOM
- Confirm in a normal browser that the account shows recents
When it happens
Trigger: getConversationList(page) returns [] after ensureClaudeLogin on /recents — a brand-new account with no conversations, Claude's sidebar/recents DOM changed so selectors match nothing, or the list rendered slowly (lazy loading) and wasn't present when scraped.
Common situations: Newly created Claude account with no history; Claude frontend update renaming sidebar elements; slow network so conversation items load after extraction; account region/workspace view where recents are empty; ad-blocker/extension altering the page structure.
Related errors
- No visible Claude messages were found for conversation ${id}
- No visible Claude messages were found in the current convers
- qwen detail
- UISDC news page loaded, but no news rows with title and URL
- 1point3acres thread
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/6de30c57bae8ab41.
Report an issue: GitHub.