diff --git a/docs/static/v2_elite.css b/docs/static/v2_elite.css index 16c38824..a57d1df9 100644 --- a/docs/static/v2_elite.css +++ b/docs/static/v2_elite.css @@ -490,3 +490,160 @@ a { text-shadow: 0 0 8px rgba(34, 211, 238, 0.5); } +/* ---------------------------------------------------- */ +/* INTERACTIVE FILTER & SEARCH SYSTEM UI */ +/* ---------------------------------------------------- */ + +.v2-filtered-hidden { + display: none !important; +} + +.v2-filter-container { + margin: 24px 0 20px 0; + padding: 20px; + border-radius: 12px; + border: 1px solid rgba(0, 0, 0, 0.08); + background: rgba(244, 244, 245, 0.5); /* Zinc 100 translucent */ + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); + display: flex; + flex-direction: column; + gap: 16px; + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.05); + transition: all 0.3s ease; +} + +[data-md-color-scheme="slate"] .v2-filter-container { + border-color: rgba(34, 211, 238, 0.15); + background: rgba(24, 24, 27, 0.6); /* Zinc 900 translucent */ + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4); +} + +.v2-search-wrapper { + position: relative; + display: flex; + align-items: center; + width: 100%; +} + +.v2-search-input { + width: 100%; + padding: 12px 40px 12px 16px; + font-size: 0.85rem; + font-family: inherit; + border-radius: 8px; + border: 1px solid rgba(0, 0, 0, 0.15); + background: #ffffff; + color: var(--md-primary-fg-color); + transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1); + outline: none; +} + +[data-md-color-scheme="slate"] .v2-search-input { + border-color: rgba(255, 255, 255, 0.08); + background: rgba(9, 9, 11, 0.7); /* Zinc 950 */ + color: #ffffff; +} + +.v2-search-input:focus { + border-color: var(--md-accent-fg-color); + box-shadow: 0 0 0 3px var(--md-accent-fg-color--transparent); +} + +[data-md-color-scheme="slate"] .v2-search-input:focus { + border-color: var(--md-accent-fg-color); + box-shadow: 0 0 12px rgba(34, 211, 238, 0.25); + background: rgba(9, 9, 11, 0.9); +} + +.v2-search-clear { + position: absolute; + right: 14px; + font-size: 1.4rem; + cursor: pointer; + color: var(--md-primary-fg-color--dark); + transition: color 0.2s ease; + user-select: none; + line-height: 1; +} + +.v2-search-clear:hover { + color: var(--md-accent-fg-color); +} + +.v2-tag-pills { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +.v2-pill { + padding: 6px 12px; + font-size: 0.68rem; + font-weight: 700; + border-radius: 6px; + border: 1px solid rgba(0, 0, 0, 0.08); + background: rgba(0, 0, 0, 0.02); + color: var(--md-primary-fg-color--dark); + cursor: pointer; + transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1); + text-transform: uppercase; + letter-spacing: 0.05em; + font-family: inherit; +} + +[data-md-color-scheme="slate"] .v2-pill { + border-color: rgba(255, 255, 255, 0.08); + background: rgba(255, 255, 255, 0.03); + color: rgba(255, 255, 255, 0.6); +} + +.v2-pill:hover { + border-color: var(--md-accent-fg-color); + color: var(--md-primary-fg-color); + background: var(--md-accent-fg-color--transparent); +} + +[data-md-color-scheme="slate"] .v2-pill:hover { + color: #ffffff; + text-shadow: 0 0 8px rgba(34, 211, 238, 0.3); +} + +.v2-pill.active { + border-color: var(--md-accent-fg-color) !important; + color: #ffffff !important; + background: var(--md-accent-fg-color) !important; + box-shadow: 0 4px 10px rgba(14, 165, 233, 0.3); +} + +[data-md-color-scheme="slate"] .v2-pill.active { + color: #09090b !important; + background: var(--md-accent-fg-color) !important; + box-shadow: 0 0 14px rgba(34, 211, 238, 0.4); +} + +.v2-filter-stats { + display: flex; + justify-content: space-between; + font-size: 0.72rem; + color: var(--md-primary-fg-color--dark); + border-top: 1px solid rgba(0, 0, 0, 0.06); + padding-top: 12px; + margin-top: 4px; +} + +[data-md-color-scheme="slate"] .v2-filter-stats { + border-top-color: rgba(255, 255, 255, 0.06); +} + +.v2-visible-count, .v2-total-count { + color: var(--md-primary-fg-color); + font-weight: 700; +} + +[data-md-color-scheme="slate"] .v2-visible-count, +[data-md-color-scheme="slate"] .v2-total-count { + color: #ffffff; +} + + diff --git a/docs/static/v2_filter.js b/docs/static/v2_filter.js new file mode 100644 index 00000000..3d59bde0 --- /dev/null +++ b/docs/static/v2_filter.js @@ -0,0 +1,185 @@ +document.addEventListener("DOMContentLoaded", function () { + // Initialize the filter only if we are on a page with resource lists + const contentArea = document.querySelector(".md-content__inner"); + if (!contentArea) return; + + // Check if there are any resource items on the page (li or details) + const listItems = Array.from(contentArea.querySelectorAll("ul > li")); + const detailsItems = Array.from(contentArea.querySelectorAll("details.note")); + + // If there are no list items and no details items, do not inject the filter + if (listItems.length === 0 && detailsItems.length === 0) return; + + // Do not show on the homepage or video hub index page + const h1 = contentArea.querySelector("h1"); + if (h1 && (h1.textContent.includes("Nubenetes Elite Portal (V2)") || h1.textContent.includes("Agentic Video Hub"))) { + return; + } + + // Build the filter container element + const filterContainer = document.createElement("div"); + filterContainer.className = "v2-filter-container"; + filterContainer.innerHTML = ` +
+ + +
+
+ + + + + + + + +
+
+ Showing 0 of 0 resources + +
+ `; + + // Insert the filter container right after the main H1 + if (h1 && h1.nextSibling) { + h1.parentNode.insertBefore(filterContainer, h1.nextSibling); + } else { + contentArea.insertBefore(filterContainer, contentArea.firstChild); + } + + const searchInput = filterContainer.querySelector(".v2-search-input"); + const searchClear = filterContainer.querySelector(".v2-search-clear"); + const pills = filterContainer.querySelectorAll(".v2-pill"); + const visibleCountSpan = filterContainer.querySelector(".v2-visible-count"); + const totalCountSpan = filterContainer.querySelector(".v2-total-count"); + + // All target elements we want to filter + const targets = []; + + // Prepare list items + listItems.forEach(item => { + // Make sure it's a resource list item (has a link and some content) + if (item.querySelector("a")) { + targets.push({ + element: item, + type: "li", + text: item.textContent.toLowerCase(), + tags: Array.from(item.querySelectorAll(".md-tag")).map(t => t.textContent.toUpperCase()) + }); + } + }); + + // Prepare details.note items (if any, like in some V2 structures) + detailsItems.forEach(detail => { + const summary = detail.querySelector("summary"); + targets.push({ + element: detail, + type: "details", + text: detail.textContent.toLowerCase(), + tags: summary ? [summary.textContent.toUpperCase()] : [] + }); + }); + + totalCountSpan.textContent = targets.length; + visibleCountSpan.textContent = targets.length; + + let activeFilter = "all"; + let searchText = ""; + + function updateFilters() { + let visibleCount = 0; + + targets.forEach(item => { + let matchesSearch = true; + let matchesPill = true; + + // 1. Search text filter + if (searchText) { + matchesSearch = item.text.includes(searchText); + } + + // 2. Pill/Category filter + if (activeFilter !== "all") { + if (activeFilter === "SPANISH") { + matchesPill = item.tags.some(tag => tag.includes("SPANISH")); + } else { + matchesPill = item.tags.some(tag => tag.includes(activeFilter)); + } + } + + if (matchesSearch && matchesPill) { + item.element.classList.remove("v2-filtered-hidden"); + visibleCount++; + } else { + item.element.classList.add("v2-filtered-hidden"); + } + }); + + visibleCountSpan.textContent = visibleCount; + + // 3. Hide empty headers and subheadings + // If a section (e.g., under h2, h3, h4) has no visible items, hide the section header + const headings = Array.from(contentArea.querySelectorAll("h2, h3, h4")); + headings.forEach(heading => { + let next = heading.nextElementSibling; + let totalItemsInSection = 0; + let hiddenItemsInSection = 0; + + while (next && !["H1", "H2", "H3", "H4"].includes(next.tagName)) { + if (next.tagName === "UL") { + const lis = Array.from(next.querySelectorAll("li")); + lis.forEach(li => { + if (targets.some(t => t.element === li)) { + totalItemsInSection++; + if (li.classList.contains("v2-filtered-hidden")) { + hiddenItemsInSection++; + } + } + }); + } else if (next.tagName === "DETAILS" && next.classList.contains("note")) { + totalItemsInSection++; + if (next.classList.contains("v2-filtered-hidden")) { + hiddenItemsInSection++; + } + } + next = next.nextElementSibling; + } + + if (totalItemsInSection > 0 && totalItemsInSection === hiddenItemsInSection) { + heading.classList.add("v2-filtered-hidden"); + } else { + heading.classList.remove("v2-filtered-hidden"); + } + }); + } + + // Input event listener + searchInput.addEventListener("input", function (e) { + searchText = e.target.value.toLowerCase().trim(); + if (searchText) { + searchClear.style.display = "block"; + } else { + searchClear.style.display = "none"; + } + updateFilters(); + }); + + // Clear search + searchClear.addEventListener("click", function () { + searchInput.value = ""; + searchText = ""; + searchClear.style.display = "none"; + updateFilters(); + searchInput.focus(); + }); + + // Pill click event listener + pills.forEach(pill => { + pill.addEventListener("click", function () { + pills.forEach(p => p.classList.remove("active")); + this.classList.add("active"); + activeFilter = this.getAttribute("data-filter"); + updateFilters(); + }); + }); +}); diff --git a/mkdocs.yml b/mkdocs.yml index 799bbd25..921d930b 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -3,7 +3,7 @@ site_url: https://nubenetes.com/ site_description: A curated list of awesome IT projects and resources. Inspired by the awesome list. site_author: "Nubenetes" docs_dir: docs/ -use_directory_urls: true +use_directory_urls: false #repo_name: 'GitHub' repo_name: nubenetes/awesome-kubernetes repo_url: https://github.com/nubenetes/awesome-kubernetes diff --git a/site/about.html b/site/about.html index f4375c1d..80b54406 100644 --- a/site/about.html +++ b/site/about.html @@ -2801,10 +2801,10 @@

“One of the biggest problems in IT is that we keep reinventing the wheel. We are running the same circles, producing similar technologies to solve the same problems. Reinventing the wheel is a great way to learn how the wheel works, but not an efficient way to build software” (@dmokafa)

“Tech industry thinks throwing more tools to the problem is the solution. More tools = more failure modes” (@rakyll)

-

Instead of reinventing the wheel by rewriting from scratch a new installer or ad-hoc devops tool to manage/monitor kubernetes, please pay attention to the links shared here and learn how to add value on the so called day 2. You will find solutions and knowledge in a practical and efficient way without being totally essential to obtain a certification to successfully complete the task. For example, if there’s money for reinventing the wheel on day 1, then there’s money for investing in these high value added solutions on day 2 where automation can significantly improve our lives and the quality of the delivered service. Automation is also a key element when evaluating the delivery of a service.

+

Instead of reinventing the wheel by rewriting from scratch a new installer or ad-hoc devops tool to manage/monitor kubernetes, please pay attention to the links shared here and learn how to add value on the so called day 2. You will find solutions and knowledge in a practical and efficient way without being totally essential to obtain a certification to successfully complete the task. For example, if there’s money for reinventing the wheel on day 1, then there’s money for investing in these high value added solutions on day 2 where automation can significantly improve our lives and the quality of the delivered service. Automation is also a key element when evaluating the delivery of a service.

Nubenetes shares relevant information that helps spread the new technological and cultural standards, in order to eliminate bottlenecks and silos and promote digital transformation.

Does saying this publicly imply being blacklisted and losing professional opportunities? What kind of society do we live in?

-

Tips: ask the hiring manager what experience they have with Cloud Automation, Cloud Managed Services and K8s in Production, if they deploy OpenShift via IPI1 or UPI, whether they are familiar with Gitops as the correct way of doing DevOps, if they work with modern, easy-to-use automation tools (terraform, ansible modules with YAML/Jinja templates, argocd, helm, an automation server3 to run pipelines, declarative code in Jenkins4 Pipelines or in DevOps Azure Pipelines, IaC boilerplates instead of k8s vanilla, etc) or they are not practical and prefer to develop their own ad-hoc tools with millions of lines of code that need maintenance (by who?). If any doubt, ask them to show you their pipelines and custom solutions, how long it takes them to deploy and setup their k8s infra on day 1 & day 2 (pets vs cattle service model), how long it takes them to deploy a single app and if the process is fully automated or not, what monitoring solutions they have, if security and Role-based Access Control (RBAC) are implemented in their k8s clusters, whether changes and PoCs are tested first in ephemeral and isolated K8s/Cloud infra test environments with IaC & CI/CD pipelines, if solutions can be discussed within the team, etc.

+

Tips: ask the hiring manager what experience they have with Cloud Automation, Cloud Managed Services and K8s in Production, if they deploy OpenShift via IPI1 or UPI, whether they are familiar with Gitops as the correct way of doing DevOps, if they work with modern, easy-to-use automation tools (terraform, ansible modules with YAML/Jinja templates, argocd, helm, an automation server3 to run pipelines, declarative code in Jenkins4 Pipelines or in DevOps Azure Pipelines, IaC boilerplates instead of k8s vanilla, etc) or they are not practical and prefer to develop their own ad-hoc tools with millions of lines of code that need maintenance (by who?). If any doubt, ask them to show you their pipelines and custom solutions, how long it takes them to deploy and setup their k8s infra on day 1 & day 2 (pets vs cattle service model), how long it takes them to deploy a single app and if the process is fully automated or not, what monitoring solutions they have, if security and Role-based Access Control (RBAC) are implemented in their k8s clusters, whether changes and PoCs are tested first in ephemeral and isolated K8s/Cloud infra test environments with IaC & CI/CD pipelines, if solutions can be discussed within the team, etc.

“The absolutely difficult thing is reaching volume production without going bankrupt, that is the actual hard thing” Elon Musk

@@ -2826,8 +2826,7 @@

Let’s improve both the private & public IT sector and the opportunities in large, medium and small companies, and give us a star on GitHub if you like this blog!!

- -

· The Seatbelts - Tank!

+

Cloud Computing job market in 2016

diff --git a/site/ai-agents-mcp.html b/site/ai-agents-mcp.html index b63cc395..2f3c0cbe 100644 --- a/site/ai-agents-mcp.html +++ b/site/ai-agents-mcp.html @@ -2884,6 +2884,8 @@
  • IBM IAM for AI Agents -how IBM Identity and Access Management (IAM) provides native IAM for AI agents, enabling them to have an identity and deliver least privileged access.
  • Level Up Your Agents: Announcing Google’s Official Skills Repository 🌟 - This blog post announces the launch of Google’s official Agent Skills repository on GitHub, designed to equip AI agents with condensed expertise on specific technologies and tasks. Skills are presented in an open Markdown format, including reference files and code snippets, to provide agent-first documentation. This approach aims to reduce ‘context bloat’ often encountered when using Model Context Protocol (MCP) servers, leading to more efficient and cost-effective AI agent interactions with Google Cloud products like Gemini API, BigQuery, and GKE.
  • Claude Code Best Practice - A GitHub repository focused on ‘vibe coding to agentic engineering’, providing practices and examples for interacting with AI models like Claude. It includes sections on agents, commands, skills, development workflows, and implementation details.
  • +
  • youtube: The 6 Levels of Claude Code Explained 🌟 - This video provides a structured architectural roadmap for mastering Claude Code, Anthropic’s agentic CLI tool for software engineering. It details the progression from basic code generation to complex, multi-step agentic workflows, emphasizing the tool’s relevance to the 2026 Kubernetes ecosystem through automated manifest refactoring, contextual codebase analysis, and direct CLI-driven infrastructure orchestration.
  • +
  • Claude Code in Action 🌟 - A course from Anthropic Academy that provides comprehensive training on using Claude Code for software development tasks. It covers the underlying architecture of AI coding assistants, practical implementation techniques, and advanced integration strategies. Key topics include understanding coding assistant architecture, exploring Claude Code’s tool use system, mastering context management techniques, implementing visual communication workflows, creating custom automation, and extending functionality with MCP servers.
  • Kiro: Engineering Rigor for Agentic Development - Kiro is a tool designed to bring engineering discipline to AI agent development. It focuses on managing intent, handling long-running tasks across large codebases, and validating code correctness through a learning agent. Key features include converting natural language prompts into structured requirements (EARS notation), generating architectural designs, creating implementation plans with discrete, sequenced tasks, and enabling terminal-based interaction for building features, automating workflows, and debugging.
  • HolmesGPT (Robusta) - An open-source AI agent for investigating Prometheus alerts and Kubernetes incidents. It uses LLMs to triage issues and provide recommended fixes.
  • Skyvern - Automate browser-based workflows using LLMs and Computer Vision.
  • diff --git a/site/ai.html b/site/ai.html index 46626484..686a14d4 100644 --- a/site/ai.html +++ b/site/ai.html @@ -3043,7 +3043,7 @@
  • Development Environments for Cloud Agents 🌟 -Cursor’s new tools for configuring development environments for cloud agents. It highlights the importance of robust environments for agents to perform end-to-end engineering tasks, including accessing codebases, dependencies, credentials, and build systems. The feature supports multi-repo environments, allowing agents to reason across multiple codebases, which is crucial for microservice architectures.
  • Cursor AI Fundamentals Course - Official tutorials for Cursor, covering AI fundamentals including models, tokens, hallucinations, agents, MCP, skills, and context. The course is in Spanish and consists of 13 modules.
  • Cursor Bugbot Effort Levels Documentation - Documentation for Cursor’s Bugbot, introducing ‘effort levels’ for users on usage-based plans. These levels can be configured via the Bugbot dashboard.
  • -
  • Claude Code in Action - A course from Anthropic Academy that provides comprehensive training on using Claude Code for software development tasks. It covers the underlying architecture of AI coding assistants, practical implementation techniques, and advanced integration strategies. Key topics include understanding coding assistant architecture, exploring Claude Code’s tool use system, mastering context management techniques, implementing visual communication workflows, creating custom automation, and extending functionality with MCP servers.
  • +
  • Claude Code in Action - (Related to ai-agents-mcp topic)
  • LLMs-from-scratch 🌟 - A GitHub repository that provides a step-by-step implementation of a ChatGPT-like Large Language Model (LLM) using PyTorch, covering development, pretraining, and finetuning.
  • Claude Code Best Practice - (Related to ai-agents-mcp topic)
  • Docker for LLMs - (Related to docker topic)
  • diff --git a/site/devops.html b/site/devops.html index 1b4ddecf..6ca7ce47 100644 --- a/site/devops.html +++ b/site/devops.html @@ -3321,8 +3321,8 @@
  • Tweets
  • - -

    Jimmy Sax · Una Matina Jimmy Sax

    + +

    Jimmy Sax · Una Mattina

    Introduction to Digital Business Transformation