DIYgod/RSSHub · error · Error

No articles found.

Error message

No articles found.

What it means

Thrown by the Cline blog route when `extractArticlesFromDOM($)` returns an empty array after loading `${rootUrl}/blog/archive`. This is a defensive guard against a silent empty feed — it signals that the DOM selectors no longer match Cline's archive markup. Plain `Error`.

Source

Thrown at lib/routes/cline/blog.ts:57

                : null;
        })
        .filter(Boolean) as DataItem[];
}

async function handler() {
    // Use the archive page which has all articles
    const archiveUrl = `${rootUrl}/blog/archive`;

    const response = await got({
        method: 'get',
        url: archiveUrl,
    });

    const $ = load(response.data);
    const articles = extractArticlesFromDOM($);

    if (articles.length === 0) {
        throw new Error('No articles found.');
    }

    return {
        title: 'Cline Official Blog',
        link: blogUrl,
        item: articles,
        description: 'Cline Official Blog - AI Coding Assistant',
        language: 'en' as const,
    };
}

export const route: Route = {
    path: '/blog',
    categories: ['blog'],
    example: '/cline/blog',
    parameters: {},
    features: {
        requireConfig: false,

View on GitHub (pinned to bed535e087)

Solutions

  1. Open `https://cline.com/blog/archive` (or whatever rootUrl resolves to) and inspect the article card markup.
  2. Update the selectors inside `extractArticlesFromDOM` to match the new class names / structure.
  3. Check the HTTP status and body returned by `got` — if it is a challenge page, add headers (User-Agent via `config.trueUA`) or switch to Puppeteer.
Defensive patterns

Strategy: retry

Type guard

function hasArticlesExtracted(arr: unknown[]): boolean {
    return arr.length > 0;
}

Try / catch

let articles: unknown[] = [];
for (let attempt = 0; attempt < 2; attempt++) {
    const resp = await got({ method: 'get', url: archiveUrl });
    articles = extractArticlesFromDOM(load(resp.data));
    if (articles.length) break;
}
if (!articles.length) throw new Error('No articles found.');

Prevention

When it happens

Trigger: Cline ships a new blog layout and the archive card selectors change; the archive URL moves or returns a SPA shell with no server-rendered articles; a CDN/Cloudflare interstitial page replaces the real HTML.

Common situations: Site redesign, anti-bot challenge page, or the route's `extractArticlesFromDOM` selectors drifting from the live DOM.

Related errors


AI-assisted analysis of DIYgod/RSSHub@bed535e087 (2026-08-12). Data as JSON: /api/errors/232e8ab56a61abd4. Report an issue: GitHub.