jackwener/OpenCLI · error · CommandExecutionError
NotebookLM home-link probe returned malformed Browser…
Error message
NotebookLM home-link probe returned malformed Browser Bridge data
What it means
The home-link probe asks Browser Bridge for the list of notebook links on the NotebookLM home page. The result must be an array; anything else (null, object, string) means the injected script did not produce the expected rows payload, so the CLI throws this CommandExecutionError rather than iterating over bad data.
Solutions
- Open the NotebookLM home page (https://notebooklm.google.com/) in the active Chrome tab and retry.
- Reload the page so the notebook list has rendered before probing.
- Check the Browser Bridge extension is installed, enabled, and connected.
- Update the CLI if NotebookLM recently changed its home-page markup.
Example fix
// before: assuming an array
const rows = await probeHomeLinks();
rows.forEach(render);
// after: guard
let rows = [];
try {
rows = await probeHomeLinks();
} catch (e) {
if (!String(e.message).includes('malformed Browser Bridge data')) throw e;
console.error('Navigate to the NotebookLM home page and retry.');
} Defensive patterns
Strategy: try-catch
Validate before calling
if (!currentTabUrl || !currentTabUrl.startsWith('https://notebooklm.google.com/')) {
throw new Error('Open the NotebookLM home page before listing notebooks.');
} Type guard
const isRowArray = (v) => Array.isArray(v);
Try / catch
let notebooks = [];
try {
notebooks = await probeHomeLinks();
} catch (e) {
if (String(e.message).includes('malformed Browser Bridge data')) {
console.error('Open https://notebooklm.google.com/ in Chrome and retry.');
} else { throw e; }
} Prevention
- Run list commands only while the NotebookLM home page is open and rendered.
- Keep the Browser Bridge extension healthy; re-check after Chrome restarts.
- Update the CLI when NotebookLM ships UI changes.
- Add a small retry with backoff around probes.
When it happens
Trigger: The evaluated home-link script returns a non-array — typically because the page is not the NotebookLM home page, the link-collection query matched nothing and the wrapper returned a non-array value, or the bridge evaluation failed and returned an error object.
Common situations: Running the list command while the browser shows a notebook detail page instead of home, a NotebookLM redesign changing the home link markup, or the bridge returning undefined when no tabs match.
Understand the failure class
- Parsing and encoding errors: unexpected token, malformed input — why parsers reject input and how to find the real culprit.
Related errors
- NotebookLM current-page probe returned malformed Browser…
- NotebookLM home-link probe returned a malformed row
- Failed to open NotebookLM home
- NotebookLM current-page probe returned an untrusted or…
- NotebookLM home-link probe returned an untrusted or…
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/107526a8609a8dc0.
Report an issue: GitHub.
Appendix: source
Thrown at clis/notebooklm/utils.js:794
subtitleTitleNode?.getAttribute?.('title') ||
subtitleTextNode?.textContent ||
''
).trim();
rows.push({
id,
title,
url: href,
source: 'home-links',
is_owner: true,
created_at: createdAtHint || null,
});
}
return rows;
})()`, 'home-link probe');
if (!Array.isArray(raw))
throw new CommandExecutionError('NotebookLM home-link probe returned malformed Browser Bridge data');
return raw.map((row) => {
if (!isPlainObject(row) || typeof row.id !== 'string' || typeof row.title !== 'string' || typeof row.url !== 'string' || (row.created_at !== null && row.created_at !== undefined && typeof row.created_at !== 'string') || (row.is_owner !== undefined && typeof row.is_owner !== 'boolean')) {
throw new CommandExecutionError('NotebookLM home-link probe returned a malformed row');
}
const url = normalizeNotebooklmNotebookUrl(row.url, row.id);
if (!url) {
throw new CommandExecutionError('NotebookLM home-link probe returned an untrusted or mismatched notebook URL');
}
return {
id: row.id,
title: normalizeNotebooklmTitle(row.title, 'Untitled Notebook'),
url,
source: 'home-links',
is_owner: row.is_owner === false ? false : true,
created_at: normalizeNotebooklmCreatedAt(row.created_at),
};
});
}View on GitHub (pinned to 49907e53dc)