Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@ red PR job against.
navigation, auto-rotate and every pause condition, hero height measurement (clones,
resize debounce), and projects scroll-sync (debounced scroll, `scrollend`,
IntersectionObserver). Zero dependencies.
- `node --test scripts/featured-video.test.mjs` — checks the Bluefin talk's placement,
speaker attribution, privacy-enhanced lazy-loaded player, 6:09 start without autoplay,
direct links to the highlighted and full talk, and the adopter link. Zero dependencies.
- `node --test scripts/page-scripts.test.mjs` — static gate over every committed HTML
page: each inline `<script>` parses, each JSON-LD block is valid schema.org JSON, no
external `<script src>` is introduced, every inline behaviour script (other than the
Expand Down
30 changes: 28 additions & 2 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'sha256-e2g5HkZP+fghbsY1m7moq4GopOo7zRRaAHNyQ2Q7oSI=' 'sha256-rq0n65OzxYcm03aTh5k2DL2wKS1HW6w9jAApNmKLPtg=' 'sha256-QSGzxNSepdjMBRwnovEOJlbbTDp+rqYlcPfhcB+fgnQ=' 'sha256-rrFBsqTHVoUIsbIMbJ9438/R1TuU4x9Aw7xFQONRI9U='; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; base-uri 'none'; form-action 'none'">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'sha256-e2g5HkZP+fghbsY1m7moq4GopOo7zRRaAHNyQ2Q7oSI=' 'sha256-rq0n65OzxYcm03aTh5k2DL2wKS1HW6w9jAApNmKLPtg=' 'sha256-QSGzxNSepdjMBRwnovEOJlbbTDp+rqYlcPfhcB+fgnQ=' 'sha256-rrFBsqTHVoUIsbIMbJ9438/R1TuU4x9Aw7xFQONRI9U='; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; frame-src https://www.youtube-nocookie.com; base-uri 'none'; form-action 'none'">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>Hive Commons</title>
<meta name="description" content="Hive Commons supports Hive: governed AI-agent fleets with Jira Data Center work sources, The Commons, swarms, Claude Code, GitHub Copilot, vLLM, llm-d and more.">
Expand Down Expand Up @@ -273,7 +273,7 @@ <h3 id="adopters-title" class="adopters-title">Adopted by</h3>
<ul class="logo-strip">
<li><a href="https://github.com/kubestellar/console"><img src="/assets/adopters/kubestellar.png" width="48" height="48" alt="KubeStellar Console"><span>KubeStellar Console</span></a></li>
<li><a href="https://tunaos.org"><img src="/assets/adopters/tuna-os.png" width="48" height="48" alt="tunaos.org"><span>tunaos.org</span></a></li>
<li><a href="https://github.com/projectbluefin"><img src="/assets/adopters/projectbluefin.png" width="48" height="48" alt="Project Bluefin"><span>Project Bluefin</span></a></li>
<li><a href="#hive-in-practice"><img src="/assets/adopters/projectbluefin.png" width="48" height="48" alt="Project Bluefin"><span>Project Bluefin<span class="sr-only">: watch the Hive talk</span></span></a></li>
<li><a href="https://github.com/frostyard"><img src="/assets/adopters/frostyard.png" width="48" height="48" alt="Frostyard"><span>Frostyard</span></a></li>
<li><a href="https://github.com/open-horizon"><img src="/assets/adopters/open-horizon.png" width="48" height="48" alt="Open Horizon"><span>Open Horizon</span></a></li>
<li><a href="https://github.com/open-horizon-services"><img src="/assets/adopters/open-horizon-services.png" width="48" height="48" alt="Open Horizon Services"><span>Open Horizon Services</span></a></li>
Expand Down Expand Up @@ -396,6 +396,32 @@ <h4>L6 Autonomous</h4>
</div>
</section>

<section class="band hive-talk" id="hive-in-practice" aria-labelledby="hive-in-practice-title">
<div class="wrap">
<div class="band-head">
<p class="kicker">GitHub Universe 2026</p>
<h2 id="hive-in-practice-title">Hive in practice</h2>
</div>
<div class="talk-grid">
<iframe class="talk-player" width="560" height="315"
src="https://www.youtube-nocookie.com/embed/bUhCBYi4dys?start=369"
title="Jorge Castro: What open source can teach us about agents in CI/CD"
loading="lazy" referrerpolicy="strict-origin-when-cross-origin"
allow="encrypted-media; picture-in-picture; fullscreen" allowfullscreen></iframe>
<div class="talk-copy">
<h3>How Project Bluefin uses Hive</h3>
<p><a href="https://github.com/projectbluefin">Project Bluefin</a> maintainer Jorge Castro shares how his project uses Hive to coordinate contributors' agents, organize reviews, and keep maintainers in control.</p>
<p class="talk-meta">Jorge Castro &middot; GitHub Universe 2026 &middot; 15 minutes</p>
<div class="cta-row">
<a class="btn btn-primary" href="https://www.youtube.com/watch?v=bUhCBYi4dys&amp;t=369s">Watch the Hive discussion</a>
<a class="btn btn-quiet" href="https://www.youtube.com/watch?v=bUhCBYi4dys">Watch the full talk</a>
</div>
<p class="talk-note">The player starts at 6:09, where Jorge introduces Hive. Published by GitHub.</p>
</div>
</div>
</div>
</section>

<!-- ============ PROJECT FAMILY (carousel) ============ -->
<section class="band band-alt" id="projects">
<div class="wrap">
Expand Down
67 changes: 67 additions & 0 deletions scripts/featured-video.test.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#!/usr/bin/env node
import { test } from "node:test";
import assert from "node:assert/strict";
import { readFileSync } from "node:fs";

const html = readFileSync(new URL("../index.html", import.meta.url), "utf8");
const section = /<section\b[^>]*\bid="hive-in-practice"[^>]*>[\s\S]*?<\/section>/.exec(html)?.[0];
const VIDEO_ID = "bUhCBYi4dys";
const START_SECONDS = 369;

function attribute(tag, name) {
const value = new RegExp(`\\b${name}="([^"]*)"`).exec(tag);
assert.ok(value, `missing ${name} attribute`);
return value[1].replaceAll("&amp;", "&");
}

test("Bluefin's talk follows the Hive overview and precedes the project family", () => {
assert.ok(section, "missing Hive in practice section");
assert.ok(html.indexOf('id="hive"') < html.indexOf(section));
assert.ok(html.indexOf(section) < html.indexOf('id="projects"'));
assert.match(section, /<h2 id="hive-in-practice-title">Hive in practice<\/h2>/);
assert.match(section, /aria-labelledby="hive-in-practice-title"/);
assert.match(section, /How Project Bluefin uses Hive/);
assert.match(section, /Jorge Castro/);
assert.match(section, /GitHub Universe 2026/);
assert.match(section, /Published by GitHub/);
});

test("the privacy-enhanced player starts at the Hive discussion without autoplay", () => {
const frames = [...section.matchAll(/<iframe\b[^>]*>/g)];
assert.equal(frames.length, 1);
const frame = frames[0][0];
const url = new URL(attribute(frame, "src"));
assert.equal(url.origin, "https://www.youtube-nocookie.com");
assert.equal(url.pathname, `/embed/${VIDEO_ID}`);
assert.equal(url.searchParams.get("start"), String(START_SECONDS));
assert.equal(url.searchParams.get("autoplay"), null);
assert.doesNotMatch(attribute(frame, "allow"), /\bautoplay\b/);
assert.equal(attribute(frame, "loading"), "lazy");
assert.equal(attribute(frame, "referrerpolicy"), "strict-origin-when-cross-origin");
assert.match(attribute(frame, "title"), /Jorge Castro.*CI\/CD/);
assert.equal(Number(attribute(frame, "width")) / Number(attribute(frame, "height")), 16 / 9);
assert.match(frame, /\sallowfullscreen(?:\s|>)/);
assert.match(html, /frame-src https:\/\/www\.youtube-nocookie\.com;/);
});

test("direct YouTube links offer the highlighted discussion and full talk", () => {
const links = [...section.matchAll(/<a\b[^>]*>[\s\S]*?<\/a>/g)];
const discussion = links.find(([tag]) => tag.includes("Watch the Hive discussion"));
const full = links.find(([tag]) => tag.includes("Watch the full talk"));
assert.ok(discussion);
assert.ok(full);
const discussionUrl = new URL(attribute(discussion[0], "href"));
const fullUrl = new URL(attribute(full[0], "href"));
for (const url of [discussionUrl, fullUrl]) {
assert.equal(url.origin, "https://www.youtube.com");
assert.equal(url.pathname, "/watch");
assert.equal(url.searchParams.get("v"), VIDEO_ID);
}
assert.equal(discussionUrl.searchParams.get("t"), `${START_SECONDS}s`);
assert.equal(fullUrl.searchParams.get("t"), null);
});

test("the Bluefin adopter links to the talk and its original GitHub link remains available", () => {
assert.match(html, /<a href="#hive-in-practice"><img src="\/assets\/adopters\/projectbluefin\.png"/);
assert.match(section, /<a href="https:\/\/github\.com\/projectbluefin">Project Bluefin<\/a>/);
});
13 changes: 12 additions & 1 deletion style.css
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,16 @@ h1 {
.adopters-note a { color: var(--ink-2); text-decoration-color: var(--honey-deep); text-underline-offset: 3px; }
.adopters-note a:hover { color: var(--honey); }

/* ---------- Hive in practice ---------- */
.hive-talk { padding-top: 0; scroll-margin-top: 5rem; }
.talk-grid { display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); align-items: center; gap: clamp(1.5rem, 4vw, 3rem); }
.talk-player { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; border: 1px solid var(--line); border-radius: var(--radius); background: var(--bg-2); }
.talk-copy p { margin-top: 1rem; color: var(--ink-2); }
.talk-copy a:not(.btn) { text-decoration-color: var(--honey-deep); text-underline-offset: 3px; }
.talk-copy a:not(.btn):hover { color: var(--honey); }
.talk-copy .talk-meta, .talk-copy .talk-note { font-size: .9rem; }
.talk-copy .cta-row { margin-top: 1.5rem; }

/* ACMM ladder */
.acmm {
--acmm-interval: 5s;
Expand Down Expand Up @@ -691,7 +701,8 @@ h1 {
.hero-slide { grid-template-columns: 1fr; align-content: center; }
.hero-art { order: -1; }
.hero-visual { max-width: 20rem; }
.pitch-grid, .community-grid, .integration-groups { grid-template-columns: 1fr; }
.pitch-grid, .community-grid, .integration-groups, .talk-grid { grid-template-columns: 1fr; }
.hive-talk { scroll-margin-top: 10rem; }
.pitch-lead { max-width: none; }
.pillars { grid-template-columns: 1fr; }
.fit { grid-template-columns: 1fr; }
Expand Down
Loading