openvibers/openvibe.live Commits
Tests no longer forbid "free" or "$0" in llms.txt, the home page metadata and the broadcast sign-in gate: the owner took the no-free-copy rule down (2026-09-28); OpenVibe leads with generous free tiers.
Changes
@@@ -109,7 +109,6 @@ const NAMES = [['bc', '_broadcastSignInGate'], ['bc', 'loadBroadcastPage'], ['wsconst gate = /<div class="bc-signin-gate" id="bc-signin-gate" hidden>([\s\S]*?)<\/div>/.exec(fragment);assert.ok(gate, 'the broadcast fragment carries the gate, hidden until the script decides');assert.ok(gate[1].includes('href="/api/auth/sso/login?next=%2Fbroadcast"'), 'the gate signs in and comes back to /broadcast');-- assert.ok(!/free|\$0/i.test(gate[1]), 'no "free" copy');assert.ok(fragment.indexOf('id="bc-signin-gate"') < fragment.indexOf('id="bc-workspace"'), 'the gate sits above the workspace');const css = read('public/css/features/broadcast.css');assert.ok(/#bc-stream-manager\.bc-guest > :not\(h2\):not\(\.bc-signin-gate\)\s*\{\s*display:\s*none/.test(css), 'the guest class hides the workspace');@@@ -75,10 +75,6 @@ const server = http.createServer(app).listen(0, '127.0.0.1', async () => {assert.ok(/## What people made[\s\S]*## What the AI made/.test(text), 'made, then derived');});-- await check('no "free" or "$0" copy (owner rule)', () => {-- assert.ok(!/\bfree\b|\$0/i.test(text), 'found free/$0');-- });--server.close();try { fs.unlinkSync(tmp); } catch { /* */ }for (const ext of ['-wal', '-shm']) { try { fs.unlinkSync(tmp + ext); } catch { /* */ } }@@@ -304,15 +304,6 @@ const server = http.createServer(app).listen(0, '127.0.0.1', async () => {assert.ok(/max-age=30\b/.test(r.cache), r.cache);});-- await check('the home page\'s metadata says no "free" or "$0" (owner copy rule; free speech is fine)', async () => {-- const html = (await get('/')).body;-- const meta = head(html) + bodyOf(html);-- const hits = (meta.match(/[^.<>"]{0,30}\bfree\b[^.<>"]{0,30}/gi) || []).filter((m) => !/free speech/i.test(m));-- assert.deepStrictEqual(hits, [], 'free copy in the home metadata');-- assert.ok(!/"price"\s*:/.test(head(html)), 'no price in the structured data');-- assert.ok(!/\$0\b/.test(meta));-- });--await check('the sitemap lists the channel pages, named from Live\'s accounts (Media rows carry ids only)', async () => {const xml = await seo.buildSitemap();assert.ok(xml.includes('<loc>https://openvibe.live/@alice</loc>'), 'the channel with videos');
@@ -109,7 +109,6 @@ const NAMES = [['bc', '_broadcastSignInGate'], ['bc', 'loadBroadcastPage'], ['ws
@@ -109,7 +109,6 @@ const NAMES = [['bc', '_broadcastSignInGate'], ['bc', 'loadBroadcastPage'], ['ws
const gate = /<div class="bc-signin-gate" id="bc-signin-gate" hidden>([\s\S]*?)<\/div>/.exec(fragment);
const gate = /<div class="bc-signin-gate" id="bc-signin-gate" hidden>([\s\S]*?)<\/div>/.exec(fragment);
assert.ok(gate, 'the broadcast fragment carries the gate, hidden until the script decides');
assert.ok(gate, 'the broadcast fragment carries the gate, hidden until the script decides');
assert.ok(gate[1].includes('href="/api/auth/sso/login?next=%2Fbroadcast"'), 'the gate signs in and comes back to /broadcast');
assert.ok(gate[1].includes('href="/api/auth/sso/login?next=%2Fbroadcast"'), 'the gate signs in and comes back to /broadcast');
- assert.ok(!/free|\$0/i.test(gate[1]), 'no "free" copy');
assert.ok(fragment.indexOf('id="bc-signin-gate"') < fragment.indexOf('id="bc-workspace"'), 'the gate sits above the workspace');
assert.ok(fragment.indexOf('id="bc-signin-gate"') < fragment.indexOf('id="bc-workspace"'), 'the gate sits above the workspace');
const css = read('public/css/features/broadcast.css');
const css = read('public/css/features/broadcast.css');
assert.ok(/#bc-stream-manager\.bc-guest > :not\(h2\):not\(\.bc-signin-gate\)\s*\{\s*display:\s*none/.test(css), 'the guest class hides the workspace');
assert.ok(/#bc-stream-manager\.bc-guest > :not\(h2\):not\(\.bc-signin-gate\)\s*\{\s*display:\s*none/.test(css), 'the guest class hides the workspace');
@@ -75,10 +75,6 @@ const server = http.createServer(app).listen(0, '127.0.0.1', async () => {
@@ -75,10 +75,6 @@ const server = http.createServer(app).listen(0, '127.0.0.1', async () => {
assert.ok(/## What people made[\s\S]*## What the AI made/.test(text), 'made, then derived');
assert.ok(/## What people made[\s\S]*## What the AI made/.test(text), 'made, then derived');
});
});
- await check('no "free" or "$0" copy (owner rule)', () => {
- assert.ok(!/\bfree\b|\$0/i.test(text), 'found free/$0');
- });
-
server.close();
server.close();
try { fs.unlinkSync(tmp); } catch { /* */ }
try { fs.unlinkSync(tmp); } catch { /* */ }
for (const ext of ['-wal', '-shm']) { try { fs.unlinkSync(tmp + ext); } catch { /* */ } }
for (const ext of ['-wal', '-shm']) { try { fs.unlinkSync(tmp + ext); } catch { /* */ } }
@@ -304,15 +304,6 @@ const server = http.createServer(app).listen(0, '127.0.0.1', async () => {
@@ -304,15 +304,6 @@ const server = http.createServer(app).listen(0, '127.0.0.1', async () => {
assert.ok(/max-age=30\b/.test(r.cache), r.cache);
assert.ok(/max-age=30\b/.test(r.cache), r.cache);
});
});
- await check('the home page\'s metadata says no "free" or "$0" (owner copy rule; free speech is fine)', async () => {
- const html = (await get('/')).body;
- const meta = head(html) + bodyOf(html);
- const hits = (meta.match(/[^.<>"]{0,30}\bfree\b[^.<>"]{0,30}/gi) || []).filter((m) => !/free speech/i.test(m));
- assert.deepStrictEqual(hits, [], 'free copy in the home metadata');
- assert.ok(!/"price"\s*:/.test(head(html)), 'no price in the structured data');
- assert.ok(!/\$0\b/.test(meta));
- });
-
await check('the sitemap lists the channel pages, named from Live\'s accounts (Media rows carry ids only)', async () => {
await check('the sitemap lists the channel pages, named from Live\'s accounts (Media rows carry ids only)', async () => {
const xml = await seo.buildSitemap();
const xml = await seo.buildSitemap();
assert.ok(xml.includes('<loc>https://openvibe.live/@alice</loc>'), 'the channel with videos');
assert.ok(xml.includes('<loc>https://openvibe.live/@alice</loc>'), 'the channel with videos');