openvibers/openvibe.network Commits
SEO-8: the network's front door and /stats state they may be indexed (#407)
Changes
@@@ -10,6 +10,7 @@<link rel="apple-touch-icon" href="/assets/logo-192.png"><link rel="manifest" href="/manifest.webmanifest"><meta name="description" content="One free account for every OpenVibe site: go live from your browser, online tools, chat, games, videos, jobs and an open platform to build on.">++<meta name="robots" content="index, follow"><meta name="keywords" content="openvibe, openvibe network, go live from browser, online tools, open source platform, single sign-on, developer platform"><meta property="og:type" content="website"><meta property="og:url" content="https://openvibe.network/">@@@ -316,6 +316,7 @@ ${s.daily ? sparkline(s.daily) : '<span class="os-site-own">counts its own visit<meta name="viewport" content="width=device-width, initial-scale=1"><title>${esc(title)} · OpenVibe.Network</title><meta name="description" content="${esc(desc)}">++<meta name="robots" content="index, follow"><link rel="canonical" href="https://openvibe.network/stats${days === 30 ? '' : `?days=${days}`}"><link rel="alternate" type="application/json" href="/api/v1/stats?days=${days}" title="These numbers as JSON"><meta property="og:title" content="${esc(title)}"><meta property="og:description" content="${esc(desc)}"><meta property="og:type" content="website">@@@ -72,6 +72,14 @@ const cache = require('openvibe-shared/cache-policy');assert.ok(Buffer.byteLength(fullBody) <= render.LLMS_FULL_MAX_BYTES, 'llms-full.txt stays within maxBytes');assert.strictEqual(render.LLMS_FULL_MAX_BYTES, 512 * 1024);++ // ── the front door and /stats state they may be indexed (SEO-8) ──++ for (const p of ['/', '/stats']) {++ const page = await get(p);++ assert.strictEqual(page.status, 200, `${p} answers`);++ const head = page.body.slice(0, page.body.indexOf('</head>'));++ assert.ok(/<meta name="robots" content="index,\s*follow">/.test(head), `${p} says index, follow instead of relying on the crawler's default`);++ }++// ── IndexNow: no INDEXNOW_KEY → no key file ──const KEY = require('crypto').randomBytes(16).toString('hex');assert.strictEqual((await get(`/${KEY}.txt`)).status, 404, 'no key file is served without INDEXNOW_KEY');
@@ -10,6 +10,7 @@
@@ -10,6 +10,7 @@
<link rel="apple-touch-icon" href="/assets/logo-192.png">
<link rel="apple-touch-icon" href="/assets/logo-192.png">
<link rel="manifest" href="/manifest.webmanifest">
<link rel="manifest" href="/manifest.webmanifest">
<meta name="description" content="One free account for every OpenVibe site: go live from your browser, online tools, chat, games, videos, jobs and an open platform to build on.">
<meta name="description" content="One free account for every OpenVibe site: go live from your browser, online tools, chat, games, videos, jobs and an open platform to build on.">
+<meta name="robots" content="index, follow">
<meta name="keywords" content="openvibe, openvibe network, go live from browser, online tools, open source platform, single sign-on, developer platform">
<meta name="keywords" content="openvibe, openvibe network, go live from browser, online tools, open source platform, single sign-on, developer platform">
<meta property="og:type" content="website">
<meta property="og:type" content="website">
<meta property="og:url" content="https://openvibe.network/">
<meta property="og:url" content="https://openvibe.network/">
@@ -316,6 +316,7 @@ ${s.daily ? sparkline(s.daily) : '<span class="os-site-own">counts its own visit
@@ -316,6 +316,7 @@ ${s.daily ? sparkline(s.daily) : '<span class="os-site-own">counts its own visit
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>${esc(title)} · OpenVibe.Network</title>
<title>${esc(title)} · OpenVibe.Network</title>
<meta name="description" content="${esc(desc)}">
<meta name="description" content="${esc(desc)}">
+<meta name="robots" content="index, follow">
<link rel="canonical" href="https://openvibe.network/stats${days === 30 ? '' : `?days=${days}`}">
<link rel="canonical" href="https://openvibe.network/stats${days === 30 ? '' : `?days=${days}`}">
<link rel="alternate" type="application/json" href="/api/v1/stats?days=${days}" title="These numbers as JSON">
<link rel="alternate" type="application/json" href="/api/v1/stats?days=${days}" title="These numbers as JSON">
<meta property="og:title" content="${esc(title)}"><meta property="og:description" content="${esc(desc)}"><meta property="og:type" content="website">
<meta property="og:title" content="${esc(title)}"><meta property="og:description" content="${esc(desc)}"><meta property="og:type" content="website">
@@ -72,6 +72,14 @@ const cache = require('openvibe-shared/cache-policy');
@@ -72,6 +72,14 @@ const cache = require('openvibe-shared/cache-policy');
assert.ok(Buffer.byteLength(fullBody) <= render.LLMS_FULL_MAX_BYTES, 'llms-full.txt stays within maxBytes');
assert.ok(Buffer.byteLength(fullBody) <= render.LLMS_FULL_MAX_BYTES, 'llms-full.txt stays within maxBytes');
assert.strictEqual(render.LLMS_FULL_MAX_BYTES, 512 * 1024);
assert.strictEqual(render.LLMS_FULL_MAX_BYTES, 512 * 1024);
+ // ── the front door and /stats state they may be indexed (SEO-8) ──
+ for (const p of ['/', '/stats']) {
+ const page = await get(p);
+ assert.strictEqual(page.status, 200, `${p} answers`);
+ const head = page.body.slice(0, page.body.indexOf('</head>'));
+ assert.ok(/<meta name="robots" content="index,\s*follow">/.test(head), `${p} says index, follow instead of relying on the crawler's default`);
+ }
+
// ── IndexNow: no INDEXNOW_KEY → no key file ──
// ── IndexNow: no INDEXNOW_KEY → no key file ──
const KEY = require('crypto').randomBytes(16).toString('hex');
const KEY = require('crypto').randomBytes(16).toString('hex');
assert.strictEqual((await get(`/${KEY}.txt`)).status, 404, 'no key file is served without INDEXNOW_KEY');
assert.strictEqual((await get(`/${KEY}.txt`)).status, 404, 'no key file is served without INDEXNOW_KEY');