Stories
Tech & AI
Understanding how leadership's view of AI can undermine its adoption and impact your organization's human capital is crucial for sustainable growth. Consider how your company's AI strategy truly values human expertise.
6 months ago
Tech & AI
Discover how NetApp's AI Data Engine streamlines the complex process of preparing unstructured data for AI, while simultaneously solving the critical problem of data bloat caused by vectorization.
8 months ago
Tech & AI
Discover how to use natural language to command your storage infrastructure. Learn the specific prompts and integrations that empower AI agents like GitHub Copilot Chat to automate tasks such as creating volumes, cloning data sets, and provisioning Jupyter Lab workspaces on your NetApp systems.
10 months ago
/**
* Streamed.News -- Section Hub Grid (v6 -- paginated tag fetch, fixes Ghost include=tags bug)
*
* Level 1 /sports/ Section page -> family cards (static config)
* Level 2 /tag/category-rugby/ Family page -> auto-discovered channel cards
* Level 3 /tag/{channel-slug}/ Channel page -> Ghost default (individual posts)
*
* Channel discovery: fetch 100 most recent category-* posts, extract tag co-occurrence,
* filter out topic tags, render as channel cards (>=3 posts per channel).
* A new channel appears automatically once it has >=3 posts.
*
* All emoji use JS Unicode escapes (pure ASCII) -- no encoding issues.
*/
(function () {
"use strict";
var CONTENT_KEY = "938d65fbaad8924b65ba337290";
var GHOST_URL = "https://streamed-news.ghost.io";
var API_BASE = GHOST_URL + "/ghost/api/content";
var MIN_POSTS = 3;
// -- Level 1 config: Section -> Families (STATIC) --
var SECTIONS = {
sports: { label: "Sports", families: [
{ slug: "windsurfing", emoji: "\u{1F3C4}", name: "Windsurfing",
fallback: ["windsurfing","cookie","ride-along-sessions-with-cookie",
"graham-ezzy-coaching","exocet-windsurfing","goya-windsurfing",
"nils-bach-windsurfing","loftsails","windsurfingpodcast",
"tws-windsurfing","tomb-brendt-coach"] },
{ slug: "rugby", emoji: "\u{1F3C9}", name: "Rugby",
fallback: ["rugby","squidge-rugby-press","six-nations",
"the-good-the-bad-and-the-rugby","eggchasers-rugby-press",
"men-s-six-nations-2026","bbc-sport"] },
{ slug: "motorsport", emoji: "\u{1F3CE}", name: "Motorsport",
fallback: ["formula-1","motogp","david-perogil","duralavita",
"chequered-flag","david-perogil-formula-1"] },
{ slug: "tennis", emoji: "\u{1F3BE}", name: "Tennis",
fallback: ["meike-babel-tennis","intuitive-tennis"] },
{ slug: "triathlon", emoji: "\u{1F3CA}", name: "Triathlon & Endurance",
fallback: ["matias-marquez-team","triatlon","atletismo",
"entrenamiento-deportivo","ben-greenfield-press",
"performance-longevity"] },
{ slug: "sports-psychology", emoji: "\u{1F9E0}", name: "Psychology",
fallback: ["sports-psychology","coaching","sports-performance"] },
]},
business: { label: "Business", families: [
{ slug: "sales", emoji: "\u{1F4C8}", name: "Sales & Strategy",
fallback: ["b2b-sales","sales-strategy","mike-weinberg","carson-heady",
"sales-management","sales-leadership","ian-koniak",
"outbound-squad-press","mastering-modern-selling"] },
{ slug: "marketing", emoji: "\u{1F4E3}", name: "Marketing",
fallback: ["b2b-marketing","content-marketing","content-strategy",
"ashley-faus","mark-stouse","fullfunnel-io"] },
{ slug: "leadership",emoji: "\u{1F465}", name: "Leadership",
fallback: ["leadership-development","closed-circuit-selling",
"adem-manderovic-closed-circuit-selling-ccs",
"paul-mcdonagh-smith","growth-leaders-network"] },
]},
science: { label: "Science", families: [
{ slug: "energy", emoji: "\u{26A1}", name: "Energy & Resources",
fallback: ["nate-hagens","antonio-turiel","energy-transition",
"energy-live-news","crisis-energetica","energy-crisis",
"biogas","tgs-nate-hagens","iea"] },
{ slug: "climate", emoji: "\u{1F30D}", name: "Climate & Environment",
fallback: ["climate-change","clean-technology","renewable-energy",
"environmental-science"] },
{ slug: "medicine", emoji: "\u{1F3E5}", name: "Medicine & Health",
fallback: ["world-medical-innovation-forum","medical-physics",
"mgb","health-innovation"] },
]},
world: { label: "World", families: [
{ slug: "geopolitics",emoji: "\u{1F310}", name: "Geopolitics",
fallback: ["geopolitics","fabian-calle-geopolitica","iran",
"fabi-n-calle-news","la-base"] },
{ slug: "argentina", emoji: "\u{1F1E6}\u{1F1F7}", name: "Argentina",
fallback: ["argentina","javier-milei","economia-argentina",
"ahora-play","radio-con-vos-899","decode-con-daninovarama",
"marcelo-longobardi","ernesto-tenembaum","dani-novarama",
"historia-argentina-eduardo-sartelli","programa-412"] },
{ slug: "latam", emoji: "\u{1F30E}", name: "Latin America",
fallback: ["diego-ruzzarin","mundo-maldini","yaqpa"] },
{ slug: "china", emoji: "\u{1F1E8}\u{1F1F3}", name: "China & Asia",
fallback: ["china","buenas-tardes-china"] },
{ slug: "us-politics",emoji: "\u{1F30F}", name: "US & Global",
fallback: ["donald-trump","english","prdictive-history-press"] },
]},
technology: { label: "Technology", families: [
{ slug: "cybersecurity",emoji: "\u{1F510}", name: "Cybersecurity",
fallback: ["cybersecurity","ransomware","data-protection",
"cybersecurity-insights","check-point-software-press",
"gigamon-press"] },
{ slug: "cloud", emoji: "\u{2601}\u{FE0F}", name: "Cloud & Enterprise",
fallback: ["aws","cloud-computing","netapp","cohesity","cohesity-news",
"netapp-insights-news","netapp-insights-press",
"connectwise","cloud-deployment-management",
"outshift-by-cisco","ciscolivenews"] },
{ slug: "ai", emoji: "\u{1F916}", name: "AI & Data",
fallback: ["agentic-ai","large-language-models","artificial-intelligence",
"data-analysis-for-social-scientists"] },
{ slug: "aviation", emoji: "\u{2708}\u{FE0F}", name: "Aviation",
fallback: ["aviation","mentour-pilot","mentourpilot"] },
]},
culture: { label: "Culture", families: [
{ slug: "design", emoji: "\u{1F3A8}", name: "Design & Branding",
fallback: ["norberto-chaves","graphic-design","design-criticism",
"branding","visual-identity"] },
{ slug: "personal-growth",emoji: "\u{1F331}", name: "Personal Growth",
fallback: ["finding-mastery","personal-growth","resilience",
"work-life-balance","finding-mastery-newspaper",
"rich-roll-newspaper","remarkable-people"] },
{ slug: "society", emoji: "\u{1F5E3}\u{FE0F}", name: "Society & Ideas",
fallback: ["el-gato-y-el-zorro","cultural-identity","tengo-un-plan",
"cultura","jordi-wild","joe-rogan-press"] },
{ slug: "music", emoji: "\u{1F3B5}", name: "Music & Arts",
fallback: ["rick-beato","music-theory","rick-beato-2"] },
{ slug: "economics", emoji: "\u{1F4B0}", name: "Economics",
fallback: ["garys-economics","gary-stevenson","harvard-econ",
"ray-dalio-news","barry-s-economics-press",
"bloomberg-balance-of-power-press"] },
{ slug: "food", emoji: "\u{1F373}", name: "Food & Recipes",
fallback: ["el-comidista-en-el-pa-s"] },
]},
};
// -- Family topic exclusions (tags that are NOT channels) --
var FAMILY_EXCLUSIONS = {
"windsurfing": ["windsurfing","water-sports","windsurfing-techniques","extreme-sports"],
"rugby": ["rugby","bbc-sport","six-nations","tactical-analysis","england-rugby","scotland-rugby","united-rugby-championship"],
"motorsport": ["formula-1","motogp","rider-journeys","gran-premio-de-miami","aprilia"],
"tennis": ["tennis","tournament-coverage","roland-garros","coaching","tactical-analysis"],
"triathlon": ["triatlon","atletismo","entrenamiento-deportivo","rendimiento-deportivo","nutricion-deportiva"],
"sports-psychology": ["sports-psychology","coaching","tactical-analysis","psychologie-du-sport","analyse-tactique","planche-a-voile"],
"sales": ["b2b-sales","sales-strategy","sales-management","sales-leadership","consultative-selling","sales-training"],
"marketing": ["b2b-marketing","content-marketing","content-strategy","marketing-b2b","marketing-de-contenidos","marketing-strategy"],
"leadership": ["leadership-development","leadership","management-accountability","predictable-revenue"],
"energy": ["energy-transition","energy-live-news","crisis-energetica","energy-crisis","energy-throughput","biophysical-economics"],
"climate": ["climate-change","clean-technology","renewable-energy","environmental-science"],
"medicine": ["world-medical-innovation-forum","medical-physics","health-innovation","medikamentenentwicklung"],
"geopolitics": ["geopolitics","us-foreign-policy","estados-unidos","israel"],
"argentina": ["argentina","economia-argentina","javier-milei","inflacion"],
"latam": ["capitalism","capitalismo"],
"china": ["politica-argentina"],
"us-politics": [],
"cybersecurity": ["cybersecurity","cybersecurity-insights"],
"cloud": ["cloud-computing","cloud-deployment-management","hybrid-cloud"],
"ai": ["agentic-ai","large-language-models","artificial-intelligence","psychology","education","productivity"],
"aviation": ["aviation","mentour-pilot"],
"design": ["graphic-design","design-criticism","corporate-identity","identidad-corporativa","logos"],
"personal-growth": ["personal-transformation","mental-health","creativity","personal-development"],
"society": ["cultura","cultural-identity","salud-mental"],
"music": ["music-theory","music-education","music-production"],
"economics": ["wealth-inequality"]
};
function esc(s) {
return (s||"").replace(/&/g,"&").replace(//g,">").replace(/"/g,""");
}
function timeAgo(dateStr) {
var diff = Date.now() - new Date(dateStr).getTime();
var days = Math.floor(diff / 86400000);
if (days === 0) return "Today";
if (days === 1) return "Yesterday";
if (days < 7) return days + " days ago";
if (days < 30) return Math.floor(days/7) + " wk ago";
if (days < 365) return Math.floor(days/30) + " mo ago";
return Math.floor(days/365) + "y ago";
}
function fetchPosts(filterStr, limit, includeTags) {
var fields = "title,url,feature_image,published_at";
var url = API_BASE + "/posts/?key=" + CONTENT_KEY
+ "&filter=" + encodeURIComponent(filterStr)
+ "&limit=" + (limit || 4)
+ "&fields=" + fields
+ (includeTags ? "&include=tags" : "")
+ "&order=published_at%20desc";
return fetch(url)
.then(function(r){ return r.ok ? r.json() : {posts:[]}; })
.then(function(d){ return d.posts||[]; })
.catch(function(){ return []; });
}
function mountGrid(main, html) {
var container = document.createElement("div");
container.id = "sn-hub-grid";
container.style.cssText = "max-width:1100px;margin:0 auto;padding:0 24px 48px;";
container.innerHTML = 'Loading...
';
var existing = main.firstElementChild;
main.insertBefore(container, existing);
if (existing) existing.style.display = "none";
return { container: container, existing: existing,
render: function(h){ container.innerHTML = h; },
restore: function(){ container.remove(); if(existing) existing.style.display=""; } };
}
function cardHtml(headerHtml, posts, seeAllUrl, seeAllLabel) {
var featured = posts[0];
var rest = posts.slice(1,3);
var img = featured.feature_image
? ''
+ '
'
: "";
var links = rest.map(function(p){
return ''
+ ''+esc(p.title)+''
+ ''+timeAgo(p.published_at)+'';
}).join("");
return '';
}
function pillsHtml(items) {
return '';
}
function gridWrap(cards) {
return ''+cards+'
';
}
function detectSection() {
var path = window.location.pathname.replace(/\/$/,"");
for (var s in SECTIONS) {
if (path === "/"+s || path.indexOf("/"+s+"/page/") === 0) return s;
}
return null;
}
function renderSectionGrid(sectionSlug) {
var section = SECTIONS[sectionSlug];
if (!section) return;
var main = document.querySelector(".site-main,main,#ghost-main,.gh-main")
|| document.querySelector("[class*='main']");
if (!main) return;
var m = mountGrid(main);
var promises = section.families.map(function(f){
var tags = ["category-"+f.slug].concat(f.fallback);
return fetchPosts("tag:["+tags.join(",")+"]", 4);
});
Promise.all(promises).then(function(results){
var active = section.families
.map(function(f,i){ return {f:f, posts:results[i]}; })
.filter(function(a){ return a.posts.length >= MIN_POSTS; });
if (!active.length) { m.restore(); return; }
var navItems = active.map(function(a){
return { url:"/tag/category-"+a.f.slug+"/", label:a.f.name, emoji:a.f.emoji };
});
var cards = active.map(function(a){
var hdr = ''
+ ''+a.f.emoji+''
+ ''+esc(a.f.name)+'
';
return cardHtml(hdr, a.posts, "/tag/category-"+a.f.slug+"/", a.f.name);
}).join("");
m.render(pillsHtml(navItems) + gridWrap(cards));
});
}
function detectFamily() {
var m = window.location.pathname.replace(/\/$/,"").match(/^\/tag\/category-([^/]+)$/);
return m ? m[1] : null;
}
function getFamily(familySlug) {
for (var s in SECTIONS) {
for (var i = 0; i < SECTIONS[s].families.length; i++) {
if (SECTIONS[s].families[i].slug === familySlug) {
return { section: s, family: SECTIONS[s].families[i] };
}
}
}
return null;
}
function prettyName(slug) {
return slug.replace(/-/g, " ").replace(/\b\w/g, function(c){ return c.toUpperCase(); });
}
function renderFamilyGrid(familySlug) {
var main = document.querySelector(".site-main,main,#ghost-main,.gh-main")
|| document.querySelector("[class*='main']");
if (!main) return;
var m = mountGrid(main);
var info = getFamily(familySlug);
// Ghost's include=tags breaks on large fetches \u2014 tags bleed between posts.
// Paginate in batches of 15 so each page reliably returns full tag lists.
var PAGE_SIZE = 15;
var MAX_PAGES = 7; // up to 105 posts scanned for channel discovery
var chSeen = {};
var page = 1;
function fetchNextPage() {
var url = API_BASE + "/posts/?key=" + CONTENT_KEY
+ "&filter=" + encodeURIComponent("tag:[category-"+familySlug+"]")
+ "&limit=" + PAGE_SIZE
+ "&page=" + page
+ "&fields=title"
+ "&include=tags"
+ "&order=published_at%20desc";
fetch(url)
.then(function(r){ return r.ok ? r.json() : {posts:[],meta:{}}; })
.then(function(d){
var posts = d.posts || [];
for (var i = 0; i < posts.length; i++) {
var tags = posts[i].tags || [];
for (var j = 0; j < tags.length; j++) {
if (tags[j].slug.indexOf("ch-") === 0) chSeen[tags[j].slug] = true;
}
}
var totalPages = (d.meta && d.meta.pagination) ? d.meta.pagination.pages : 1;
if (posts.length === PAGE_SIZE && page < totalPages && page < MAX_PAGES) {
page++;
fetchNextPage();
} else {
buildCards();
}
})
.catch(function(){ buildCards(); });
}
function buildCards() {
var chSlugs = Object.keys(chSeen);
if (!chSlugs.length) { m.restore(); return; }
// Fetch posts using the real channel slug (strip "ch-" prefix)
var promises = chSlugs.map(function(ch) {
return fetchPosts("tag:["+ch.slice(3)+"]", 4);
});
Promise.all(promises).then(function(results) {
var active = chSlugs
.map(function(ch, i) { return { slug: ch.slice(3), posts: results[i] }; })
.filter(function(a) { return a.posts.length >= 1; })
.sort(function(a, b) { return b.posts.length - a.posts.length; });
if (!active.length) { m.restore(); return; }
var sectionLabel = info ? info.section.charAt(0).toUpperCase() + info.section.slice(1) : "Content";
var familyLabel = info ? info.family.emoji + " " + info.family.name : prettyName(familySlug);
var breadcrumb = '';
var cards = active.map(function(a) {
var hdr = ''
+ esc(prettyName(a.slug))+'
';
return cardHtml(hdr, a.posts, "/tag/"+a.slug+"/", prettyName(a.slug));
}).join("");
m.render(breadcrumb + gridWrap(cards));
});
} // end buildCards
fetchNextPage();
}
function boot() {
var section = detectSection();
var family = !section && detectFamily();
var fn = section ? function(){ renderSectionGrid(section); }
: family ? function(){ renderFamilyGrid(family); }
: null;
if (!fn) return;
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", fn);
} else {
fn();
}
}
boot();
})();