Compare commits

...
18 Commits
Author SHA1 Message Date
Nubenetes Bot cc6633dcdd release: v2.8.2 — fix all None-stars sort crashes in v2_optimizer 2026-06-19 12:12:58 +02:00
Inaki 759c10ad2c Merge pull request #365 from nubenetes/feat/fix-stars-none-sort
fix: all negated .get(stars) sort keys crash on null values
2026-06-19 12:12:46 +02:00
Nubenetes BotandClaude Sonnet 4.6 58601de338 fix: guard all negated .get('stars') sort keys against None values
Three sites in v2_optimizer where `-x.get("stars", default)` crashes
with TypeError when stars field is present but null in inventory.
Fixed with `-(x.get("stars") or default)` pattern consistently.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 12:12:39 +02:00
Nubenetes Bot 11ebda6187 docs: automated README metric synchronization [skip ci] 2026-06-19 09:43:30 +00:00
Nubenetes Bot 227dc23933 merge: back-merge v2.8.1 into develop 2026-06-19 11:43:22 +02:00
Nubenetes Bot 56db4d5e53 release: v2.8.1 — fix None resource_type crash in v2_optimizer 2026-06-19 11:43:18 +02:00
Inaki e332af2ea8 Merge pull request #364 from nubenetes/feat/fix-resource-type-none
fix: None resource_type crash in _calculate_tags
2026-06-19 11:43:05 +02:00
Nubenetes BotandClaude Sonnet 4.6 9d3321d0f0 fix: guard against None resource_type in _calculate_tags
item.get("resource_type", "Reference") returns None when the field
exists with a null value in the inventory. Use `or "Reference"` instead.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 11:42:58 +02:00
Nubenetes Bot 9ed1318a9c merge: back-merge v2.8.0 into develop 2026-06-19 11:12:21 +02:00
Nubenetes Bot 91da9c8495 release: v2.8.0 — geo inference, last-updated badge, search boost, RSS feed, weekly cron 2026-06-19 11:12:16 +02:00
Nubenetes Bot c9a7b2a8cb docs: automated README metric synchronization [skip ci] 2026-06-19 09:11:47 +00:00
Inaki ad59cb75f0 Merge pull request #363 from nubenetes/feat/five-improvements
feat: geo inference, last-updated badge, search boost, RSS feed, weekly cron
2026-06-19 11:11:32 +02:00
Nubenetes BotandClaude Sonnet 4.6 88f891fd4e feat: 5 improvements — geo inference, last-updated badge, search boost, RSS feed, weekly cron
1. geo_region inference: _infer_geo_from_url() infers Americas/Europe/España/Asia-Pacific
   from URL TLD (.es .de .fr .uk .jp .cn etc.) as fallback when geo_region field is empty.
   Industry digest now shows real content instead of empty categories.

2. Last-updated badge: trending section header now shows "Updated Jun 19, 2026" pill
   derived from news_digest.json mtime — gives readers confidence in freshness.

3. Search boost: tech-digest and industry-digest pages now have search.boost: 2
   frontmatter so they rank higher in MkDocs Material site search.

4. RSS feed (src/rss_generator.py): generates v2-docs/feed.xml with top-20 curated
   picks from 3-month digest. Runs after news_digest in publisher. Autodiscovery
   <link rel="alternate"> added to v2-mkdocs.yml extra_head.

5. Weekly cron (09.weekly_digest.yml): runs every Monday 06:00 UTC, generates digest
   with Gemini, renders digest pages, commits, then triggers publisher.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 11:11:02 +02:00
Nubenetes Bot 61733937be merge: back-merge v2.7.1 into develop 2026-06-19 11:06:42 +02:00
Nubenetes Bot 10c70025a2 release: v2.7.1 — remove redundant digest-preview list from index 2026-06-19 11:06:38 +02:00
Inaki cff4903166 Merge pull request #362 from nubenetes/feat/remove-digest-preview-from-index
refactor: remove digest-preview list from index
2026-06-19 11:05:54 +02:00
Nubenetes BotandClaude Sonnet 4.6 16ad26f427 refactor: remove digest-preview list from index, keep trending cards only
The 5-item link list was redundant with the 6 trending cards block
that the publisher generates. Cleaner UX: hero card (amber) → trending
cards → /tech-digest/ for full 22-category view.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 11:05:41 +02:00
Nubenetes Bot 3f3a86b62c merge: back-merge master v2.7.0 into develop 2026-06-19 10:59:38 +02:00
9 changed files with 248 additions and 70 deletions
@@ -93,6 +93,7 @@ jobs:
GEMINI_API_KEY_2: ${{ secrets.GEMINI_API_KEY_2 }}
run: |
python -u -m src.news_digest || echo "News digest generation skipped (no API key or error)"
python -u -m src.rss_generator || echo "RSS generation skipped"
- name: Run V2 Publisher (Render-Only)
env:
+70
View File
@@ -0,0 +1,70 @@
name: 09. Weekly Intelligence Digest
on:
schedule:
# Every Monday at 06:00 UTC (08:00 Madrid time)
- cron: '0 6 * * 1'
workflow_dispatch:
permissions:
contents: write
pull-requests: write
concurrency:
group: develop-git-write-lock
cancel-in-progress: false
jobs:
weekly-digest:
runs-on: ubuntu-latest
steps:
- name: Repository Synchronization
uses: actions/checkout@v6
with:
ref: develop
fetch-depth: 0
- name: Python 3.11 Environment Provisioning
uses: actions/setup-python@v6
with:
python-version: '3.11'
cache: 'pip'
- name: Install Dependencies
run: pip install -r requirements.txt
- name: Generate News Digest (Gemini)
env:
PYTHONPATH: ${{ github.workspace }}
GEMINI_API_KEY_1: ${{ secrets.GEMINI_API_KEY_1 }}
GEMINI_API_KEY_2: ${{ secrets.GEMINI_API_KEY_2 }}
run: |
python -u -m src.news_digest
python -u -m src.rss_generator || echo "RSS generation skipped"
- name: Render V2 Portal (Digest Pages Only)
env:
PYTHONPATH: ${{ github.workspace }}
PYTHONUNBUFFERED: "1"
run: |
python -u -m src.v2_optimizer --render-only
- name: Commit and Push Weekly Digest
run: |
git config --global user.name "Nubenetes Bot"
git config --global user.email "bot@nubenetes.com"
git add data/news_digest.json v2-docs/tech-digest.md v2-docs/industry-digest.md v2-docs/feed.xml || true
if git diff --staged --quiet; then
echo "No digest changes to commit."
else
git commit -m "feat: weekly intelligence digest update [skip ci]"
for i in {1..3}; do
git pull origin develop --rebase && git push origin develop && break || sleep 10
done
fi
- name: Trigger V2 Publisher
uses: peter-evans/repository-dispatch@v3
with:
token: ${{ secrets.GITHUB_TOKEN }}
event-type: weekly-digest-ready
+5 -5
View File
@@ -142,7 +142,7 @@ Additionally, as of May 2026, Nubenetes has reached the **Platinum Operational T
| :--- | :--- |
| **Total Technical Resources (Links)** | **18647+** |
| **Specialized MD Pages** | **162** |
| **Total Commits** | **6058+** |
| **Total Commits** | **6077+** |
| **Primary AI Engine** | **Google Gemini (Agentic)** |
<!-- HEART_STATS_END -->
@@ -180,7 +180,7 @@ The growth of Nubenetes reflects the acceleration of the Cloud Native ecosystem.
| 6 | 2023 | 30 | 123 | Maintenance & Refinement |
| 7 | 2024 | 53 | 218 | Curation Strategy Pivot |
| 8 | 2025 | 5 | 20 | Stability & Research Phase |
| 9 | 2026 | 2499 | 10,320 | **Agentic AI Surge** (May 2026 Inception) |
| 9 | 2026 | 2518 | 10,399 | **Agentic AI Surge** (May 2026 Inception) |
<!-- ANNUAL_GROWTH_END -->
<!-- ANNUAL_CHART_START -->
@@ -196,8 +196,8 @@ xychart-beta
title "Nubenetes Annual Growth Metrics (20182026)"
x-axis ["2018", "2019", "2020", "2021", "2022", "2023", "2024", "2025", "2026"]
y-axis "Volume (Commits / Estimated New Refs)" 0 --> 11000
bar [1445, 586, 8449, 2193, 1660, 123, 218, 20, 10320]
bar [350, 142, 2046, 531, 402, 30, 53, 5, 2499]
bar [1445, 586, 8449, 2193, 1660, 123, 218, 20, 10399]
bar [350, 142, 2046, 531, 402, 30, 53, 5, 2518]
```
<!-- ANNUAL_CHART_END -->
@@ -207,7 +207,7 @@ xychart-beta
| :--- | :---: | :---: | :--- |
| 2026-04 | 25 | 103 | Active Curation |
| 2026-05 | 2101 | 8,677 | **Agentic Inception (Gemini Era)** |
| 2026-06 | 373 | 1,540 | Active Curation |
| 2026-06 | 392 | 1,618 | Active Curation |
<!-- MONTHLY_SURGE_END -->
### 2.4. Content Distribution and Semantic Clustering
+12
View File
@@ -1043,6 +1043,18 @@ input[type="text"] {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
}
.trending-section__updated {
font-size: 0.55em;
font-weight: 500;
padding: 2px 10px;
border-radius: 20px;
background: rgba(14, 165, 233, 0.12);
color: var(--md-accent-fg-color);
border: 1px solid rgba(14, 165, 233, 0.25);
letter-spacing: 0.02em;
}
.trending-grid {
+28 -1
View File
@@ -182,11 +182,38 @@ class NewsDigestEngine:
return None
def _get_entry_geo(self, entry: dict) -> str | None:
"""Return the geo digest category if ``geo_region`` matches."""
"""Return the geo digest category using geo_region field, falling back to URL TLD inference."""
region = entry.get("geo_region", "")
for geo_name, geo_val in self.GEO_CATEGORIES.items():
if region == geo_val:
return geo_name
# Fallback: infer from URL TLD
return self._infer_geo_from_url(entry.get("url", ""))
@staticmethod
def _infer_geo_from_url(url: str) -> str | None:
"""Infer geo category from URL TLD. Returns GEO_CATEGORIES key or None."""
try:
from urllib.parse import urlparse
host = urlparse(url).hostname or ""
# Ordered longest-first to avoid .uk matching before .co.uk
tld_to_region = [
(".com.au", "Asia-Pacific"), (".co.uk", "Europe"), (".co.jp", "Asia-Pacific"),
(".co.kr", "Asia-Pacific"), (".com.br", "Americas"), (".com.mx", "Americas"),
(".es", "España"), (".de", "Europe"), (".fr", "Europe"), (".it", "Europe"),
(".pt", "Europe"), (".nl", "Europe"), (".be", "Europe"), (".se", "Europe"),
(".dk", "Europe"), (".fi", "Europe"), (".no", "Europe"), (".ch", "Europe"),
(".at", "Europe"), (".pl", "Europe"), (".cz", "Europe"), (".uk", "Europe"),
(".ie", "Europe"), (".eu", "Europe"), (".cn", "Asia-Pacific"),
(".jp", "Asia-Pacific"), (".kr", "Asia-Pacific"), (".sg", "Asia-Pacific"),
(".in", "Asia-Pacific"), (".au", "Asia-Pacific"), (".nz", "Asia-Pacific"),
(".ca", "Americas"), (".mx", "Americas"), (".br", "Americas"),
]
for tld, region in tld_to_region:
if host.endswith(tld):
return region
except Exception:
pass
return None
@staticmethod
+111
View File
@@ -0,0 +1,111 @@
"""RSS 2.0 feed generator for the Nubenetes Intelligence Digest.
Reads data/news_digest.json and writes v2-docs/feed.xml with the top
items from the 3-month digest window across all tech categories.
"""
from __future__ import annotations
import json
import os
from datetime import datetime
from email.utils import format_datetime
from xml.sax.saxutils import escape
from src.logger import log_event
DIGEST_PATH = "data/news_digest.json"
OUTPUT_PATH = "v2-docs/feed.xml"
FEED_TITLE = "Nubenetes Intelligence Digest"
FEED_LINK = "https://nubenetes.com/"
FEED_DESCRIPTION = "AI-curated top picks from the Cloud Native & Kubernetes ecosystem"
FEED_LANGUAGE = "en"
ITEMS_PER_FEED = 20
TECH_CATS = [
"Kubernetes & Orchestration", "AI & Agents", "Security & Compliance",
"CI/CD & GitOps", "Observability, SRE & Testing", "Infrastructure as Code",
"Containers & Runtime", "Networking & Service Mesh", "Cloud Providers & FinOps",
"MLOps & Data Science", "Data, Messaging & Storage",
]
def _rfc822(dt: datetime) -> str:
return format_datetime(dt)
def generate_rss() -> None:
if not os.path.exists(DIGEST_PATH):
log_event("[WARN] rss_generator: news_digest.json not found, skipping RSS generation")
return
try:
with open(DIGEST_PATH, "r", encoding="utf-8") as f:
digest = json.load(f)
except Exception as e:
log_event(f"[WARN] rss_generator: failed to load digest: {str(e)[:100]}")
return
period_data = digest.get("3_months", {})
items: list[dict] = []
for cat in TECH_CATS:
for entry in period_data.get(cat, []):
items.append({**entry, "_cat": cat})
# Sort by impact then date
impact_rank = {"critical": 3, "high": 2, "medium": 1}
items.sort(
key=lambda x: (impact_rank.get(x.get("impact", "medium"), 0), x.get("date", "")),
reverse=True,
)
items = items[:ITEMS_PER_FEED]
build_date = _rfc822(datetime.utcnow())
lines = [
'<?xml version="1.0" encoding="UTF-8"?>',
'<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">',
" <channel>",
f" <title>{escape(FEED_TITLE)}</title>",
f" <link>{FEED_LINK}</link>",
f" <description>{escape(FEED_DESCRIPTION)}</description>",
f" <language>{FEED_LANGUAGE}</language>",
f" <lastBuildDate>{build_date}</lastBuildDate>",
f' <atom:link href="{FEED_LINK}feed.xml" rel="self" type="application/rss+xml"/>',
]
for item in items:
title = escape(item.get("title", "Unknown"))
url = item.get("url", "#")
why = escape(item.get("why", ""))
cat = escape(item.get("_cat", ""))
impact = item.get("impact", "medium")
date_str = item.get("date", "")
try:
pub_date = _rfc822(datetime.strptime(date_str, "%Y-%m-%d")) if date_str else build_date
except Exception:
pub_date = build_date
lines += [
" <item>",
f" <title>{title}</title>",
f" <link>{url}</link>",
f" <guid isPermaLink=\"true\">{url}</guid>",
f" <pubDate>{pub_date}</pubDate>",
f" <category>{cat}</category>",
f" <description>[{impact.upper()}] {why}</description>",
" </item>",
]
lines += [" </channel>", "</rss>"]
os.makedirs(os.path.dirname(OUTPUT_PATH), exist_ok=True)
with open(OUTPUT_PATH, "w", encoding="utf-8") as f:
f.write("\n".join(lines) + "\n")
log_event(f"[INFO] rss_generator: wrote {len(items)} items to {OUTPUT_PATH}")
if __name__ == "__main__":
generate_rss()
+17 -49
View File
@@ -639,7 +639,7 @@ class V2VisionEngine:
if "[COMMUNITY-TOOL]" in tags: tags.remove("[COMMUNITY-TOOL]")
# 2. Type Mapping (AI based labels)
res_type = item.get("resource_type", "Reference").lower()
res_type = (item.get("resource_type") or "Reference").lower()
if any(x in res_type for x in ["guide", "tutorial", "hands-on", "learning", "course"]):
tags.add("[GUIDE]")
if any(x in res_type for x in ["case study", "report", "whitepaper", "success story", "usage"]):
@@ -753,7 +753,7 @@ class V2VisionEngine:
current["__links__"].append(item)
def sort_rec(node):
if "__links__" in node: node["__links__"].sort(key=lambda x: (-x.get("stars", 1), -(int(x["year"]) if str(x.get("year", "")).isdigit() else 0)))
if "__links__" in node: node["__links__"].sort(key=lambda x: (-(x.get("stars") or 1), -(int(x["year"]) if str(x.get("year", "")).isdigit() else 0)))
for k, v in node.items():
if k != "__links__" and isinstance(v, dict): sort_rec(v)
@@ -953,8 +953,9 @@ class V2VisionEngine:
geo_cats = ["Americas", "Europe", "España", "Asia-Pacific"]
period_labels = {"3_months": "Last 3 Months", "6_months": "Last 6 Months", "12_months": "Last 12 Months"}
def render_digest_page(title, categories, digest_data):
md = f"# {title}\n\n"
def render_digest_page(title, categories, digest_data, search_boost=1):
md = f"---\nsearch:\n boost: {search_boost}\n---\n\n"
md += f"# {title}\n\n"
md += "!!! tip \"Nubenetes Intelligence Digest\"\n"
md += " AI-curated ranking of the most impactful resources, updated monthly.\n\n"
for period_key, period_label in period_labels.items():
@@ -976,11 +977,11 @@ class V2VisionEngine:
md += "\n"
return md
tech_md = render_digest_page("📊 Nubenetes Tech & Cloud Intelligence Digest", tech_cats, digest_data)
tech_md = render_digest_page("📊 Nubenetes Tech & Cloud Intelligence Digest", tech_cats, digest_data, search_boost=2)
with open(os.path.join(V2_DIR, "tech-digest.md"), "w", encoding="utf-8") as f:
f.write(tech_md)
industry_md = render_digest_page("🌍 Nubenetes Industry & Geo Intelligence Digest", geo_cats, digest_data)
industry_md = render_digest_page("🌍 Nubenetes Industry & Geo Intelligence Digest", geo_cats, digest_data, search_boost=2)
with open(os.path.join(V2_DIR, "industry-digest.md"), "w", encoding="utf-8") as f:
f.write(industry_md)
@@ -1006,7 +1007,14 @@ class V2VisionEngine:
top_items = top_items[:6]
impact_icons = {"critical": "🔴", "high": "🟡", "medium": "🔵"}
cards_html = '<div class="trending-section">\n<div class="trending-section__title">🔥 Trending Now — Cloud Native Intelligence</div>\n<div class="trending-grid">\n'
try:
digest_mtime = os.path.getmtime(digest_path)
from datetime import datetime as _dt
digest_updated = _dt.fromtimestamp(digest_mtime).strftime("%b %d, %Y")
except Exception:
digest_updated = ""
updated_badge = f'<span class="trending-section__updated">Updated {digest_updated}</span>' if digest_updated else ""
cards_html = f'<div class="trending-section">\n<div class="trending-section__title">🔥 Trending Now — Cloud Native Intelligence {updated_badge}</div>\n<div class="trending-grid">\n'
for item in top_items:
impact = item.get("impact", "medium")
cards_html += (
@@ -1025,7 +1033,7 @@ class V2VisionEngine:
cards_html += '</div>\n</div>\n'
pulse_md = cards_html
else:
trending_pool = sorted([dict(meta, url=url) for url, meta in self.inventory.items() if isinstance(meta, dict) and meta.get("stars", 0) >= 4], key=lambda x: (str(x.get("year", "0000")) if str(x.get("year", "")).isdigit() else "0000", -x.get("stars", 0)), reverse=True)
trending_pool = sorted([dict(meta, url=url) for url, meta in self.inventory.items() if isinstance(meta, dict) and (meta.get("stars") or 0) >= 4], key=lambda x: (str(x.get("year", "0000")) if str(x.get("year", "")).isdigit() else "0000", -(x.get("stars") or 0)), reverse=True)
pulse_md = "## The Agentic Pulse\n" + "\n".join([f"- **({l.get('year', 'N/A')})** [**=={nuclear_strip(l['title'])}==**]({l['url'].strip()}) {'🌟'*l.get('stars',3)}" for l in trending_pool[:5]])
# Calculate coverage for the index
@@ -1055,45 +1063,6 @@ class V2VisionEngine:
" - **Status**: The system is incrementally processing pending resources to complete the knowledge graph.\n"
)
# Build digest-preview block for index
priority_cats = [
"Kubernetes & Orchestration", "AI & Agents", "Security & Compliance",
"Infrastructure as Code", "Observability, SRE & Testing", "CI/CD & GitOps"
]
cat_short = {
"Kubernetes & Orchestration": "Kubernetes",
"AI & Agents": "AI & Agents",
"Security & Compliance": "Security",
"Infrastructure as Code": "IaC",
"Observability, SRE & Testing": "Observability",
"CI/CD & GitOps": "CI/CD",
}
digest_preview_md = ""
if digest_data and "3_months" in digest_data:
preview_items = []
for cat in priority_cats:
entries = digest_data["3_months"].get(cat, [])
if entries:
e = entries[0]
title = nuclear_strip(e.get("title", ""))[:65]
preview_items.append((cat_short.get(cat, cat), title, e.get("url", "#")))
if preview_items:
rows = "\n".join(
f' <li><span class="digest-preview-cat">{c}</span> <a href="{u}">{t}</a></li>'
for c, t, u in preview_items[:5]
)
digest_preview_md = (
'<div class="digest-preview">\n'
' <div class="digest-preview-header">\n'
' <span class="digest-preview-title">📊 Intelligence Digest — Top Picks (Last 3 Months)</span>\n'
' <a href="./tech-digest/" class="digest-preview-link">View all 22 categories →</a>\n'
' </div>\n'
' <ul class="digest-preview-list">\n'
f'{rows}\n'
' </ul>\n'
'</div>\n\n'
)
index_md = (
"# Nubenetes Elite Portal (V2) | Awesome Kubernetes & Cloud [![Awesome](https://cdn.jsdelivr.net/gh/sindresorhus/awesome@d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](https://github.com/sindresorhus/awesome)\n\n"
"!!! tip \"Nubenetes V2 Elite Portal: AI-Curated & High-Density\"\n"
@@ -1159,7 +1128,6 @@ class V2VisionEngine:
"the system selects only the most relevant, stable, and impactful resources for the modern Cloud Native ecosystem (2026 and beyond).\n\n"
f"{coverage_info}\n\n"
f"<center markdown=\"1\">\n{mosaic_html}\n</center>\n\n"
f"{digest_preview_md}"
f"{pulse_md}\n\n"
"## Strategic Dimensions\n"
"- **[🎥 Agentic Video Hub (Architectural Summary)](./videos/index.md)**\n\n"
@@ -1485,7 +1453,7 @@ class V2VisionEngine:
md += f"<summary>{summary_text}</summary>\n\n"
# Sort links under this tag by impact stars and then by year
sorted_links = sorted(by_tag[tag], key=lambda x: (-x.get("stars", 1), -(int(x["year"]) if str(x.get("year", "")).isdigit() else 0)))
sorted_links = sorted(by_tag[tag], key=lambda x: (-(x.get("stars") or 1), -(int(x["year"]) if str(x.get("year", "")).isdigit() else 0)))
rendered_links = sorted_links[:100]
for l in rendered_links:
-14
View File
@@ -123,20 +123,6 @@
</div>
</center>
<div class="digest-preview">
<div class="digest-preview-header">
<span class="digest-preview-title">📊 Intelligence Digest — Top Picks (Last 3 Months)</span>
<a href="./tech-digest/" class="digest-preview-link">View all 22 categories →</a>
</div>
<ul class="digest-preview-list">
<li><span class="digest-preview-cat">Kubernetes</span> <a href="https://www.apptio.com/products/kubecost/?src=kc-com">Kubecost — real-time cost allocation for multi-cluster K8s</a></li>
<li><span class="digest-preview-cat">AI & Agents</span> <a href="https://docs.anthropic.com/en/docs/agents-and-tools/claude-code/overview">Claude Code CLI — agentic AI coding assistant</a></li>
<li><span class="digest-preview-cat">Security</span> <a href="https://github.com/policy-hub/policy-hub-cli">PolicyHub CLI — searchable Rego policy library</a></li>
<li><span class="digest-preview-cat">IaC</span> <a href="https://github.com/shuaibiyy/awesome-tf">Awesome Terraform — curated Terraform resources</a></li>
<li><span class="digest-preview-cat">Observability</span> <a href="https://grafana.com/blog/how-to-manage-high-cardinality-metrics-in-prometheus-and-kubernetes">Grafana: High cardinality metrics in Prometheus & K8s</a></li>
</ul>
</div>
## The Agentic Pulse
- **(2026)** [**==abarrak.gitbook.io: Linux SysOps Handbook 🌟==**](https://abarrak.gitbook.io/linux-sysops-handbook) 🌟🌟🌟🌟
- **(2026)** [**==Google I/O 2026 Official NotebookLM Document==**](https://accounts.google.com/v3/signin/identifier?continue=https%3A%2F%2Fnotebooklm.google.com%2Flogin%3Fcontinue%3Dhttps%3A%2F%2Fnotebooklm.google.com%2Fnotebook%2F87ae4230-9dda-445a-9775-df61ad7044dc%3Fauthuser%253D0%2526pageId%253Dnone&dsh=S-651079724%3A1780398802084305&followup=https%3A%2F%2Fnotebooklm.google.com%2Flogin%3Fcontinue%3Dhttps%3A%2F%2Fnotebooklm.google.com%2Fnotebook%2F87ae4230-9dda-445a-9775-df61ad7044dc%3Fauthuser%253D0%2526pageId%253Dnone&osid=1&passive=1209600&flowName=WebLiteSignIn&flowEntry=ServiceLogin&ifkv=AWa2PavtOIva2wcDqJnQlJq3nohbB8kL26HoI0qLEI-ErQFf9Roi9aGt-ViI1YzZGxXTHSAzER9n) 🌟🌟🌟🌟
+4 -1
View File
@@ -96,10 +96,13 @@ extra:
version:
provider: mike # Ready for version switching
extra_head:
- '<link rel="alternate" type="application/rss+xml" title="Nubenetes Intelligence Digest" href="/feed.xml"/>'
extra_css:
- https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700&display=swap
- static/extra.css
- static/v2_elite.css?v=2.4.0
- static/v2_elite.css?v=2.7.0
extra_javascript:
- static/v2_filter.js