[{"authors":[],"categories":[{"title":"Technology","url":"/en/categories/technology/"},{"title":"Digital-Radar","url":"/en/categories/digital-radar/"}],"content":" Digital Radar Executive Summary Today’s technology landscape is defined by structural shifts across infrastructure, software licensing, and artificial intelligence architectures. In artificial intelligence, the industry is transitioning from brute-force scaling of parameters to optimizing inference-time compute and deploying agentic workflows. This shift is mirrored in cloud computing, where hyperscalers are aggressively deploying custom silicon to mitigate the high capital expenditure of AI workloads while simultaneously building out sovereign cloud architectures to meet stringent regional compliance mandates.\nIn cybersecurity, the focus remains on the vulnerability of edge devices and legacy network infrastructure, which state-sponsored actors continue to exploit to bypass traditional endpoint security. Meanwhile, the DevOps ecosystem is consolidating around Platform Engineering to reduce developer cognitive load, utilizing standardized APIs like the Kubernetes Gateway API to simplify complex networking. Finally, the open-source community is navigating a period of licensing volatility, forcing enterprises to re-evaluate their dependency on single-vendor open-source projects and accelerate the adoption of community-governed forks.\nArtificial Intelligence The Shift to Inference-Time Compute and Agentic Frameworks The paradigm of artificial intelligence development is undergoing a fundamental shift. For the past several years, the industry has focused on pre-training scaling laws—the principle that larger datasets and more parameters yield predictably better models. However, as high-quality human data becomes scarce and the cost of training runs approaches hundreds of millions of dollars, leading AI labs are pivoting toward optimizing inference-time compute.\nThis transition is exemplified by the introduction of reasoning-focused models, such as OpenAI’s \u0026ldquo;o1\u0026rdquo; series. Rather than generating an immediate next-token response, these models utilize internal chain-of-thought processing before responding. By allocating more computational power during the generation phase, the model can self-correct, evaluate multiple reasoning paths, and solve complex mathematical, scientific, and programming problems with significantly higher accuracy.\nConcurrently, the industry is moving away from isolated chatbot interfaces toward agentic workflows. Frameworks such as Microsoft’s AutoGen, LangGraph, and CrewAI are enabling developers to build multi-agent systems where specialized AI agents collaborate, call external APIs, and execute code to complete complex, multi-step tasks.\nThe Rise of High-Performance Small Language Models (SLMs) While frontier models push the boundaries of reasoning, there is a parallel surge in highly capable Small Language Models (SLMs) designed to run locally or on resource-constrained hardware. Meta’s Llama 3.2 (1B and 3B parameters) and Microsoft’s Phi-3.5 family demonstrate that through advanced dataset filtering and knowledge distillation, models with fewer than 4 billion parameters can outperform older models ten times their size.\nWhy It Matters The shift to inference-time compute changes the economics of AI. It allows enterprises to achieve higher accuracy without waiting for the next generation of massive foundation models. However, it also shifts the computational bottleneck from offline training to real-time inference, requiring cloud providers to optimize their infrastructure for sustained, high-density reasoning workloads.\nMeanwhile, the rise of agentic frameworks and SLMs enables practical, cost-effective enterprise automation. By running SLMs locally on edge devices or corporate laptops, organizations can drastically reduce latency, eliminate API egress costs, and mitigate data privacy risks associated with sending sensitive corporate data to external cloud APIs.\nCybersecurity Edge Infrastructure Under Siege Enterprise edge devices—specifically Virtual Private Networks (VPNs), firewalls, and load balancers from vendors such as Palo Alto Networks, Fortinet, and Ivanti—have become the primary targets for advanced persistent threats (APTs) and state-sponsored cyber espionage groups.\nRecent investigations reveal that threat actors, including the China-linked group designated as Volt Typhoon, are actively exploiting zero-day vulnerabilities in these edge devices. Because these appliances sit outside the corporate network perimeter to inspect incoming traffic, they often cannot run traditional Endpoint Detection and Response (EDR) agents. This makes them ideal blind spots for attackers to establish persistent footholds, harvest credentials, and lateralize into internal corporate networks.\nThe attacks frequently employ living-off-the-land (LotL) techniques, utilizing built-in administrative tools already present on the target systems rather than writing malicious binaries to disk. This approach allows attackers to blend in with legitimate administrative traffic, making detection highly difficult for traditional Security Operations Centers (SOCs).\nPreparing for Post-Quantum Cryptography (PQC) The National Institute of Standards and Technology (NIST) has finalized its first set of authorized post-quantum cryptographic standards, including ML-KEM (for general encryption) and ML-DSA (for digital signatures). This has prompted cybersecurity agencies worldwide to urge organizations to begin inventorying their cryptographic assets.\nWhy It Matters The targeting of edge infrastructure highlights a critical flaw in traditional perimeter-based security models. Organizations can no longer assume that hardware appliances are inherently secure. This trend accelerates the necessity of adopting Zero Trust Network Access (ZTNA) architectures, where access is continuously verified based on identity and device posture, rather than network location.\nRegarding post-quantum cryptography, while cryptographically relevant quantum computers (CRQCs) may be years away, the threat of \u0026ldquo;harvest now, decrypt later\u0026rdquo; attacks is immediate. Adversaries are actively intercepting and storing encrypted high-value enterprise and government data today, intending to decrypt it once quantum computing technology matures. Organizations must begin migrating legacy systems to quantum-resistant algorithms immediately to protect long-term data confidentiality.\nCloud Computing Custom Silicon and the Economics of Hyperscale Infrastructure To combat the soaring costs of NVIDIA’s H100 and Blackwell GPUs, major cloud service providers (CSPs) are accelerating the deployment of their proprietary custom silicon. Amazon Web Services (AWS) is expanding the availability of its Trainium2 and Graviton4 chips; Google Cloud Platform (GCP) is scaling its Tensor Processing Units (TPUs), specifically the TPU v5p; and Microsoft Azure is integrating its custom Maia 100 AI accelerator alongside its Cobalt 100 CPU.\nThese custom processors are designed to handle specific workloads—such as deep learning training, inference, and general-purpose microservices—at a fraction of the power consumption and cost of general-purpose GPUs and x86 CPUs. By designing their own silicon, hyperscalers can optimize the entire hardware-software stack, from the physical transistor layout to the compiler level.\nThe Expansion of Sovereign Cloud Architectures In response to strict data sovereignty regulations, such as the European Union’s NIS2 Directive and the general tightening of global data privacy laws, hyperscalers are shifting away from centralized data center models toward highly localized, sovereign cloud regions.\nThese sovereign clouds are physically and logically isolated environments managed by local entities, ensuring that all data storage, processing, and operational support remain within specific national or regional boundaries. AWS, Microsoft, and Oracle have all launched dedicated European Sovereign Cloud initiatives designed to guarantee that non-EU entities cannot access or control European citizen data, even under foreign legal subpoenas.\nWhy It Matters The proliferation of custom cloud silicon democratizes access to high-performance computing. It allows enterprises to train and run specialized machine learning models without being priced out by the global GPU shortage. For general-purpose workloads, chips like Graviton4 offer up to 30% better price-performance than traditional x86 processors, directly lowering the baseline operational costs of cloud-native applications.\nSovereign clouds are critical for highly regulated industries such as finance, healthcare, and government. They allow these sectors to leverage the agility, scalability, and advanced services of public cloud providers while maintaining absolute compliance with local data residency and national security laws.\nDevOps The Consolidation of Platform Engineering and Internal Developer Platforms (IDPs) The DevOps landscape is undergoing a structural evolution from traditional \u0026ldquo;you build it, you run it\u0026rdquo; methodologies toward Platform Engineering. As cloud-native architectures have grown increasingly complex—encompassing Kubernetes, service meshes, serverless functions, and multi-cloud databases—software developers have faced severe cognitive overload.\nTo address this, organizations are building Internal Developer Platforms (IDPs) powered by open-source tools like Backstage (originally developed by Spotify). Platform engineering teams curate \u0026ldquo;paved paths\u0026rdquo;—standardized, automated workflows that abstract away the underlying infrastructure complexity. Instead of writing complex Kubernetes YAML manifests or Terraform configurations, developers can self-service environments, databases, and CI/CD pipelines through a unified developer portal.\nKubernetes Gateway API Reaches Maturity Within the Kubernetes ecosystem, the Gateway API has achieved widespread adoption, gradually replacing the legacy Ingress resource. The Gateway API is a collection of resources (GatewayClass, Gateway, HTTPRoute) designed to provide expressive, extensible, and role-oriented routing APIs for Kubernetes service networking.\n1+-----------------------------------------------------------------+ 2| GatewayClass | 3| (Managed by Infrastructure Provider) | 4+-----------------------------------------------------------------+ 5 | 6 v 7+-----------------------------------------------------------------+ 8| Gateway | 9| (Managed by Platform/Cluster Admin) | 10+-----------------------------------------------------------------+ 11 | 12 v 13+-----------------------------------------------------------------+ 14| HTTPRoute / GRPCRoute | 15| (Managed by Application Developer) | 16+-----------------------------------------------------------------+ Why It Matters Platform Engineering directly addresses developer burnout and operational inefficiency. By providing standardized, self-service infrastructure, organizations can significantly decrease time-to-market for new features while ensuring that security, compliance, and cost-control policies are baked into the infrastructure by default.\nThe transition to the Kubernetes Gateway API matters because it solves the fragmentation and vendor lock-in associated with legacy Ingress controllers. It provides a standardized, highly customizable way to manage traffic routing, service mesh integration, and security policies, separating the concerns of cluster administrators, platform engineers, and application developers.\nOpen Source The Post-Open Source License Era and Community Forks The open-source ecosystem is experiencing significant friction as venture-backed open-source companies transition away from permissive open-source licenses to restrictive, source-available licenses. Following HashiCorp’s transition of Terraform to the Business Source License (BSL) and Redis’s shift to the Redis Source Available License (RSALv2) and Server Side Public License (SSPL), the industry has witnessed a rapid mobilization of community-led forks.\nIn response to the Redis licensing change, the Linux Foundation launched Valkey, an open-source, high-performance key-value store backed by industry giants including AWS, Google, Oracle, and Ericsson. Similarly, OpenTofu, a fork of Terraform managed by the Linux Foundation, has achieved feature parity and is rapidly gaining enterprise adoption.\nLinux Kernel 6.12 and the Integration of Real-Time (PREEMPT_RT) Patches A historic milestone has been reached in the open-source operating system ecosystem: the formal merging of the real-time kernel patchset (PREEMPT_RT) into the mainline Linux 6.12 kernel. For over two decades, the real-time patchset existed as an out-of-tree set of modifications maintained by a dedicated group of developers.\nThe integration of PREEMPT_RT allows the standard Linux kernel to support deterministic execution, ensuring that critical system tasks are prioritized and executed within strict, predictable time limits.\nWhy It Matters The shift in open-source licensing forces enterprises to re-evaluate their software procurement and governance strategies. Relying on single-vendor open-source projects now carries the risk of sudden licensing changes that can restrict commercial use or impose unexpected costs. The rapid rise of Valkey and OpenTofu demonstrates that the industry is willing to rally behind neutral foundations (like the Linux Foundation and CNCF) to preserve truly open, collaborative software ecosystems.\nThe integration of PREEMPT_RT into the mainline Linux kernel is a game-changer for industrial automation, robotics, automotive systems, and telecommunications. It eliminates the need for organizations to maintain custom, complex real-time kernel builds, allowing them to run standard Linux distributions in environments that require absolute microsecond-level determinism.\nRecommended Reading The Economics of Inference-Time Compute: An in-depth analysis of how scaling test-time compute impacts hardware utilization and cloud spending. Living off the Land (LotL) Detection Strategies: A technical guide on how modern Security Operations Centers can identify malicious activity that uses legitimate administrative tools. Evaluating Custom Cloud Silicon vs. Commodity GPUs: A comparative study of AWS Trainium2, Google TPU v5p, and NVIDIA H100 performance across various deep learning workloads. Implementing Platform Engineering with Backstage: A step-by-step architectural blueprint for building an Internal Developer Platform to reduce developer cognitive load. Navigating the Open-Source Licensing Landscape: A legal and operational framework for enterprises to assess the compliance risks of source-available software licenses. Conclusion Today\u0026rsquo;s technological advancements demonstrate a clear trend toward optimization, specialization, and structural maturity. In artificial intelligence, the focus is shifting from raw model size to sophisticated reasoning capabilities and localized execution. In cybersecurity, the vulnerability of edge devices highlights the urgent need for Zero Trust architectures, while the standardization of post-quantum cryptography signals a long-term shift in data protection strategies.\nIn infrastructure, hyperscalers are leveraging custom silicon to optimize costs, while sovereign clouds address complex global regulatory environments. Finally, the DevOps and open-source communities are maturing—DevOps through the adoption of Platform Engineering to manage complexity, and open source through the defense of collaborative development models under neutral foundations. Collectively, these developments represent a transition from rapid, unconstrained experimentation to sustainable, secure, and highly optimized enterprise technology operations.\n","date":"July 20, 2026","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/posts/2026-07-20-digital-radar/","series":[{"title":"Digital-Radar","url":"/en/series/digital-radar/"}],"smallImg":"","tags":[{"title":"Ai","url":"/en/tags/ai/"},{"title":"Cybersecurity","url":"/en/tags/cybersecurity/"},{"title":"Cloud","url":"/en/tags/cloud/"},{"title":"Devops","url":"/en/tags/devops/"},{"title":"Open-Source","url":"/en/tags/open-source/"}],"timestamp":1784521815,"title":"Digital Radar 2026-07-20"},{"authors":[],"categories":[{"title":"Technology","url":"/en/categories/technology/"},{"title":"Quantum-Computing","url":"/en/categories/quantum-computing/"}],"content":" Quantum Computing Status Summary Quantum computing is a cloud and research discipline today, not a consumer product. IBM says its systems run in data centers with cryogenic infrastructure and access through the IBM Quantum Platform, and its public roadmap still runs toward fault-tolerant systems by 2029 (IBM hardware, IBM roadmap). Microsoft also positions Azure Quantum as a cloud service for quantum plus HPC/AI workloads, not as home hardware (Azure Quantum).\nWhere the field stands now The current state is: quantum processors exist, but they are still constrained by noise, error correction, and infrastructure. IBM says its systems already operate in production-style data-center environments and that the next step is scalable cryogenic infrastructure and logical qubits (IBM hardware). Its public roadmap targets near-term quantum advantage by the end of 2026 and the first large-scale fault-tolerant quantum computer by 2029 (IBM roadmap).\nWhen will quantum computers reach consumers at home? Short answer: not soon. Current machines require cryogenic systems, specialized data centers, and hybrid classical control layers (IBM hardware). That makes a laptop- or desktop-style consumer quantum computer unrealistic right now. The likely path is more cloud access and specialized enterprise installations first, not a quantum computer in the living room (IBM Quantum Platform, Azure Quantum).\nMy view is that home use is not a 2020s reality and probably only becomes plausible once fault tolerance, cooling, cost, and reliability improve dramatically. No major vendor is publishing a consumer roadmap today.\nLatest breakthroughs The most important recent breakthroughs are mostly engineering and scaling milestones, not consumer hardware. IBM is emphasizing larger processor families, cryogenic scalability, and the path to fault tolerance (IBM hardware). Microsoft highlights Majorana 1 on Azure Quantum and a topoconductor-based approach to quantum chips (Azure Quantum). Quantinuum says it has already commercially deployed multiple generations of quantum systems and is now linking quantum, HPC, and AI for enterprise workloads (Quantinuum HPE collaboration).\nAre quantum computers already used in production environments? Yes, but in niche use cases and mostly as hybrid cloud services. D-Wave explicitly describes \u0026ldquo;quantum in production\u0026rdquo; for customers such as Pattison Food Group and NTT DOCOMO, and it also describes a production path from problem discovery to deployment (D-Wave customer success stories, D-Wave production scheduling). Quantinuum also says it has commercially deployed quantum systems and is working with customers across pharmaceuticals, materials science, financial services, government, and industry (Quantinuum HPE collaboration).\nThe important nuance is that this production usage is mostly optimization, simulation, and hybrid workflows. It is not yet a general replacement for classical servers.\nWill they be used for cloud mainframe computing? Probably yes as an accelerator, not as a replacement. The most likely role for quantum is alongside mainframes, HPC clusters, and cloud platforms for specific workloads such as optimization and simulation. IBM talks about quantum-centric supercomputing and systems that connect multiple QPUs in a data-center environment (IBM hardware). Quantinuum says the same thing with explicit quantum-HPC integration for enterprise and industrial use cases (Quantinuum HPE collaboration).\nMy expectation: quantum will be a cloud-attached co-processor for very specific problems, not a stand-alone “quantum mainframe.”\nWill they be used for AI mainframe computing? Also yes, but as an add-on rather than a replacement. Microsoft links quantum directly to cloud supercomputing and AI solutions on Azure Quantum (Azure Quantum). That suggests a future where quantum can speed up some AI-related optimization, simulation, and research problems, but not a direct replacement for GPUs, TPUs, or classical AI mainframes.\nFor broad AI training, classical hardware remains dominant for now. Quantum may eventually offer niche acceleration, but the public sources do not yet point to a wide production role.\nConclusion Quantum computing is real, useful, and already in use, but it is not mature enough for home use. The current status is cloud access, enterprise pilots, niche production, and a clear road toward fault tolerance over the next few years (IBM roadmap, D-Wave production scheduling, Quantinuum news).\nIn one sentence: quantum computers are currently specialized data-center and cloud machines, not consumer electronics, and their biggest value for now is in hybrid workflows with HPC and AI.\n","date":"July 14, 2026","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/posts/2026-07-14-quantum-computing-status/","series":[],"smallImg":"","tags":[{"title":"Quantum-Computing","url":"/en/tags/quantum-computing/"},{"title":"Cloud","url":"/en/tags/cloud/"},{"title":"Ai","url":"/en/tags/ai/"},{"title":"Hpc","url":"/en/tags/hpc/"},{"title":"Research","url":"/en/tags/research/"}],"timestamp":1784012400,"title":"Quantum Computing Status"},{"authors":[],"categories":[{"title":"Technology","url":"/en/categories/technology/"},{"title":"Digital-Radar","url":"/en/categories/digital-radar/"}],"content":" Digital Radar Executive Summary Today’s technology landscape is defined by a transition from experimental implementations to structural, architectural shifts. In artificial intelligence, the industry is moving rapidly beyond passive chat interfaces toward \u0026ldquo;agentic\u0026rdquo; systems capable of autonomous execution and reasoning. This shift is placing new demands on cloud infrastructure, driving cloud providers to expand custom silicon deployments and establish localized, sovereign cloud environments to meet stringent global compliance standards.\nSimultaneously, the cybersecurity landscape faces systemic threats targeting edge network infrastructure, prompting federal agencies to push for a fundamental transition toward memory-safe programming languages. In the infrastructure domain, DevOps is maturing into highly structured platform engineering frameworks, supported by advanced observability standards like OpenTelemetry. Finally, the open-source ecosystem is demonstrating its resilience, as community-driven projects like Valkey consolidate industry backing in the wake of corporate licensing shifts. This report analyzes these critical developments, exploring their technical foundations and long-term enterprise implications.\nArtificial Intelligence The Shift to Agentic AI and Reasoning Models The paradigm of generative artificial intelligence is undergoing a fundamental evolution. While the initial wave of enterprise AI adoption focused on retrieval-augmented generation (RAG) and conversational assistants, the current frontier has shifted toward \u0026ldquo;agentic\u0026rdquo; workflows and reasoning-centric models. This transition is highlighted by two major technical developments: the release of reasoning models that utilize reinforcement learning to perform chain-of-thought processing before responding, and the introduction of developer APIs that allow models to interact directly with computer operating systems.\nTraditional large language models (LLMs) operate on next-token prediction, generating responses almost instantaneously but struggling with complex, multi-step logic. Newer reasoning models, such as OpenAI\u0026rsquo;s o1 series, allocate compute time at the point of inference to run internal chain-of-thought processes. This allows the model to self-correct, test hypotheses, and break down complex mathematical, scientific, or programming problems before presenting an answer.\nConcurrently, providers like Anthropic have introduced \u0026ldquo;computer use\u0026rdquo; capabilities to their models (such as Claude 3.5 Sonnet). This technology allows an AI agent to perceive a standard desktop environment, move a cursor, click buttons, and input text, effectively mimicking human interaction with software interfaces.\n1[User Goal] 2 │ 3 ▼ 4[Reasoning Engine] ──(Internal Chain-of-Thought / Self-Correction) 5 │ 6 ▼ 7[Agentic Executor] ──(Interacts with APIs, Databases, \u0026amp; UI Elements) 8 │ 9 ▼ 10[Completed Workflow] Why It Matters This shift from passive information retrieval to active task execution fundamentally changes the economic and operational calculations of enterprise automation.\nFirst, reasoning models drastically reduce the error rates in highly complex domains such as software engineering, financial modeling, and legal analysis. By thinking through problems systematically, these models can generate code and analyze documents with a level of precision previously unattainable by standard LLMs.\nSecond, agentic capabilities allow organizations to automate end-to-end workflows rather than isolated tasks. An AI agent can now be tasked with retrieving data from a legacy database, formatting it in a spreadsheet, cross-referencing it with an external API, and emailing a summary to a stakeholder—all without human intervention.\nHowever, this autonomy introduces significant security and reliability challenges. Enterprises must now design robust guardrails to prevent autonomous agents from executing unauthorized actions, falling victim to prompt injection attacks, or generating cascading errors in production environments.\nCybersecurity Edge Infrastructure Targeting and the Memory Safety Mandate Enterprise perimeter security is under sustained pressure. Sophisticated threat actors, including state-sponsored advanced persistent threats (APTs), are increasingly bypassing traditional endpoint detection and response (EDR) systems by targeting edge network devices. Vulnerabilities in virtual private networks (VPNs), firewalls, and application delivery controllers from major vendors have been actively exploited to gain initial access to corporate networks.\nIn response to these persistent vulnerabilities, the Cybersecurity and Infrastructure Security Agency (CISA), alongside international partners, has intensified its \u0026ldquo;Secure by Design\u0026rdquo; campaign. A central pillar of this initiative is the elimination of memory-safety vulnerabilities—such as buffer overflows, use-after-free errors, and memory leaks—which historically account for over 70% of zero-day exploits in low-level software. CISA is urging software manufacturers to transition their codebases from memory-unsafe languages like C and C++ to memory-safe alternatives such as Rust, Go, and Java.\nWhy It Matters The targeting of edge devices represents a strategic shift in cyber espionage and cybercrime. Because firewalls and VPN gateways sit at the perimeter of the network, they often cannot run third-party security agents or endpoint monitoring tools. This makes them ideal blind spots for attackers to establish persistence. When a vulnerability in an edge device is exploited, attackers can lateralize across the internal network undetected.\nCISA’s aggressive push for memory safety matters because it addresses the root cause of these vulnerabilities rather than treating the symptoms. For decades, the software industry has relied on a reactive cycle of patching and vulnerability disclosure. By transitioning critical infrastructure codebases to memory-safe languages like Rust, entire classes of vulnerabilities are eliminated at compile time.\nFor enterprise buyers, this shift will increasingly influence procurement strategies. Organizations will begin demanding software bills of materials (SBOMs) that detail not just open-source dependencies, but also the programming languages used to construct critical network appliances, prioritizing vendors that demonstrate a commitment to memory-safe architectures.\nCloud Computing Sovereign Clouds and the Proliferation of Custom Silicon The cloud computing landscape is fragmenting along geopolitical and architectural lines. Hyperscalers—specifically Amazon Web Services (AWS), Microsoft Azure, and Google Cloud Platform (GCP)—are navigating two simultaneous pressures: the demand for localized data sovereignty and the soaring costs of artificial intelligence infrastructure.\nTo address regulatory demands, particularly within the European Union under the NIS2 Directive and GDPR, cloud providers are rapidly expanding their \u0026ldquo;Sovereign Cloud\u0026rdquo; offerings. These environments are physically, operationally, and logically isolated from global cloud regions. They are operated exclusively by local citizens who undergo rigorous security clearances, ensuring that foreign jurisdictions cannot access or compel the disclosure of sovereign data.\nAt the same time, the hardware layer of the cloud is undergoing a revolution. To mitigate the high costs and supply constraints associated with Nvidia\u0026rsquo;s dominant GPU architecture, hyperscalers are investing heavily in custom silicon. AWS is deploying its Trainium2 and Graviton4 processors, Google is expanding its Tensor Processing Unit (TPU) v5p clusters, and Microsoft is scaling its Maia 100 AI accelerators.\n1┌───────────────────────────────────────────────────────────┐ 2│ Enterprise Cloud Strategy │ 3└─────────────────────────────┬─────────────────────────────┘ 4 │ 5 ┌───────────────┴───────────────┐ 6 ▼ ▼ 7┌───────────────────────────┐ ┌───────────────────────────┐ 8│ Sovereign Cloud │ │ Custom Silicon │ 9├───────────────────────────┤ ├───────────────────────────┤ 10│ • Localized Operations │ │ • Lower Compute TCO │ 11│ • NIS2 \u0026amp; GDPR Compliance │ │ • Reduced GPU Dependency │ 12│ • Data Residency Isolation│ │ • Optimized AI Workloads │ 13└───────────────────────────┘ └───────────────────────────┘ Why It Matters The rise of sovereign clouds represents the end of the borderless internet ideal. For multinational corporations, managing data is no longer a purely technical challenge but a complex geopolitical one. Organizations must design multi-region architectures that dynamically route and store data based on local residency laws, or risk severe regulatory penalties.\nMeanwhile, the deployment of custom silicon is democratizing access to high-performance computing. By designing their own chips, hyperscalers can optimize hardware for specific cloud workloads, offering enterprises better price-to-performance ratios.\nFor AI workloads, custom silicon provides a critical alternative to Nvidia\u0026rsquo;s hardware monopoly, lowering the total cost of ownership (TCO) for training and deploying large-scale models. Enterprises that adapt their software stacks to run on alternative architectures (such as AWS Trainium or Google TPUs) stand to gain a significant competitive advantage in infrastructure cost management.\nDevOps Platform Engineering Maturity and OpenTelemetry Standardization The DevOps movement is undergoing a structural refinement. The traditional philosophy of \u0026ldquo;you build it, you run it\u0026rdquo; often overwhelmed software developers with infrastructure complexity, leading to cognitive overload and deployment bottlenecks. To resolve this, organizations are transitioning to Platform Engineering, establishing dedicated teams to build Internal Developer Platforms (IDPs).\nThese IDPs provide self-service capabilities, allowing developers to provision infrastructure, deploy code, and manage databases through standardized templates and APIs. This trend is closely aligned with the maturity of Kubernetes, which has transitioned from a complex orchestration tool into the invisible control plane of modern enterprise infrastructure.\nIn parallel, OpenTelemetry (OTel) has emerged as the undisputed industry standard for cloud-native observability. The project, hosted by the Cloud Native Computing Foundation (CNCF), has expanded beyond distributed tracing and metrics to include standardized profiling. This allows organizations to collect deep runtime performance data across heterogeneous environments without modifying application source code.\nWhy It Matters Platform engineering matters because it directly addresses developer velocity and operational risk. By abstracting the complexities of Kubernetes, cloud APIs, and security configurations into a centralized IDP, organizations can dramatically reduce onboarding times and accelerate software delivery. Crucially, this abstraction does not bypass security; instead, security, compliance, and cost-control guardrails are baked directly into the platform templates, ensuring that developers default to secure configurations.\nThe standardization of OpenTelemetry is equally transformative. Historically, enterprises were locked into proprietary monitoring agents that made switching observability vendors prohibitively expensive.\nWith OpenTelemetry, data collection is decoupled from data analysis. Organizations can instrument their applications once and route telemetry data to any analytical backend. The addition of profiling to the OTel standard allows engineering teams to identify precise CPU and memory bottlenecks in production, directly translating to optimized cloud spend and improved application performance.\nOpen Source The Valkey Consolidation and the Evolution of Rust in Linux The open-source ecosystem is navigating a period of licensing volatility and architectural modernization. The most significant recent development is the rapid consolidation of Valkey, an open-source, high-performance key-value datastore. Valkey was created under the auspices of the Linux Foundation as a direct response to Redis transitioning its core software from the open-source BSD license to restrictive, non-open-source licenses (RSALv2 and SSPLv1).\nBacked by industry giants including AWS, Google, Oracle, Ericsson, and Heroku, Valkey has quickly achieved feature parity with Redis and released major performance enhancements in its 8.0 release. This rapid mobilization demonstrates the collective power of the cloud ecosystem to maintain open-source alternatives when proprietary shifts threaten downstream projects.\nSimultaneously, the integration of Rust into the Linux kernel continues to progress, albeit amidst cultural and technical debates. Kernel version 6.12 and upcoming releases feature expanded support for Rust-based device drivers and core subsystems. This initiative aims to bring memory safety to the lowest levels of the operating system, reducing the risk of kernel-level exploits.\n1[Redis License Shift (RSALv2/SSPLv1)] 2 │ 3 ▼ 4[Linux Foundation Intervenes] 5 │ 6 ▼ 7[Valkey Project Established] ──(Backed by AWS, GCP, Oracle, etc.) 8 │ 9 ▼ 10[Valkey 8.0 Released] ──(Production-Ready, Open-Source BSD License) Why It Matters The Valkey phenomenon is a watershed moment for open-source governance. It proves that when a critical piece of infrastructure software changes its license to restrict commercial use, the industry can rapidly coordinate to fork, maintain, and optimize an open-source alternative. For enterprise IT leaders, Valkey provides a seamless migration path that avoids vendor lock-in and unexpected licensing fees, reinforcing the viability of community-governed software.\nThe ongoing integration of Rust into the Linux kernel is a long-term play for operating system stability and security. While the transition faces resistance from traditional C developers concerned about toolchain complexity and compilation speeds, the security benefits are undeniable.\nAs Rust drivers become more prevalent, the frequency of critical kernel panics and privilege escalation vulnerabilities will decrease. This ensures that the foundational operating system powering the world\u0026rsquo;s cloud infrastructure, edge devices, and supercomputers becomes inherently more resilient.\nRecommended Reading Agentic AI Safety and Governance Frameworks: An exploration of the emerging security standards required to manage autonomous AI agents in enterprise networks. CISA\u0026rsquo;s Memory-Safe Roadmap Progress Report: An in-depth look at how federal agencies and software vendors are tracking their transition away from C/C++ codebases. The Impact of the NIS2 Directive on Cloud Architectures: A comprehensive guide to compliance requirements for organizations operating critical infrastructure within the European Union. Decoupling Observability with OpenTelemetry: A technical deep dive into implementing OTel collector pipelines to avoid vendor lock-in and optimize data storage costs. Migrating from Redis to Valkey: A practical migration guide detailing performance benchmarks, API compatibility, and deployment strategies for enterprise environments. Conclusion The developments analyzed in this report highlight a clear trend: the technology industry is prioritizing stability, security, and structural maturity over raw, unconstrained growth. The transition to agentic AI requires robust governance frameworks to manage autonomous workflows safely. Cybersecurity is shifting from reactive patching to proactive architectural design through memory-safe programming.\nIn the cloud, geopolitical realities are forcing a shift toward localized, sovereign infrastructure, while economic pressures drive the adoption of custom silicon. Finally, platform engineering and open-source initiatives like Valkey demonstrate that the industry is actively building sustainable, scalable systems designed to withstand both technical complexity and market volatility. Organizations that align their strategies with these foundational shifts will be well-positioned to navigate the complexities of the modern digital landscape.\n","date":"July 14, 2026","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/posts/2026-07-14-digital-radar/","series":[{"title":"Digital-Radar","url":"/en/series/digital-radar/"}],"smallImg":"","tags":[{"title":"Ai","url":"/en/tags/ai/"},{"title":"Cybersecurity","url":"/en/tags/cybersecurity/"},{"title":"Cloud","url":"/en/tags/cloud/"},{"title":"Devops","url":"/en/tags/devops/"},{"title":"Open-Source","url":"/en/tags/open-source/"}],"timestamp":1784005042,"title":"Digital Radar 2026-07-14"},{"authors":[],"categories":[{"title":"Technology","url":"/en/categories/technology/"},{"title":"Digital-Radar","url":"/en/categories/digital-radar/"}],"content":" Digital Radar Executive Summary Today’s technology landscape is defined by a transition from experimental implementation to structural optimization. In artificial intelligence, the industry is shifting away from simple, prompt-based interactions toward autonomous, multi-agent workflows and highly efficient Small Language Models (SLMs) designed for edge deployment. This architectural evolution is mirrored in the cloud and DevOps sectors, where custom silicon and platform engineering are reducing the cognitive load on developers while optimizing spiraling infrastructure costs.\nConcurrently, the cybersecurity landscape faces a dual challenge: preparing for the long-term threat of quantum computing by adopting newly finalized cryptographic standards, while defending against immediate, highly targeted ransomware campaigns aimed at virtualization infrastructure. Meanwhile, the open-source community is undergoing a structural realignment, marked by a corporate backlash against licensing changes and a concerted effort to bring memory-safe languages into the core of modern operating systems. This report analyzes these pivotal developments, explaining their technical foundations and broader business implications.\nArtificial Intelligence The Shift Toward Agentic AI Workflows The paradigm of generative artificial intelligence is undergoing a fundamental shift. While the initial wave of enterprise AI adoption focused on single-prompt interactions with Large Language Models (LLMs)—such as chatbots and basic document summarizers—the industry is rapidly moving toward \u0026ldquo;agentic\u0026rdquo; workflows. These systems leverage multiple specialized AI agents that collaborate, use external tools, execute multi-step reasoning chains, and self-correct without continuous human intervention.\nUnlike static prompt-and-response models, agentic frameworks (such as LangGraph, CrewAI, and Microsoft AutoGen) allow models to break down complex objectives into discrete tasks. For example, an agentic system tasked with market research can autonomously write a search query, analyze the retrieved documents, identify gaps in the information, execute follow-up queries, synthesize the findings into a report, and format the output according to a specific template.\nWhy It Matters Agentic AI represents the transition from AI as an assistant to AI as an autonomous collaborator. For enterprises, this dramatically increases the ROI of AI investments. Instead of merely drafting text, agentic systems can automate complex, end-to-end business processes, such as automated software debugging, customer support escalation handling, and financial auditing. However, this shift introduces new challenges in observability, predictability, and safety, as autonomous agents can exhibit emergent behaviors or enter infinite loops if not properly constrained by strict guardrails.\nThe Rise of High-Performance Small Language Models (SLMs) While frontier models like GPT-4 and Claude 3.5 Sonnet continue to push the boundaries of capability, a parallel revolution is occurring at the opposite end of the spectrum. Highly optimized Small Language Models (SLMs), typically ranging from 1 billion to 9 billion parameters, are achieving performance levels that rival much larger models from just a year ago. Recent releases, such as Microsoft’s Phi-3, Mistral’s NeMo, and Meta’s Llama 3 8B, demonstrate that architectural refinements and high-quality training data are more critical than sheer parameter count.\nThese models are designed to run efficiently on consumer-grade hardware, mobile devices, and edge servers. By utilizing techniques like quantization (reducing the precision of model weights) and speculative decoding, developers can deploy these models with minimal memory footprints and ultra-low latency.\nWhy It Matters The proliferation of capable SLMs democratizes AI by lowering the financial and infrastructural barriers to entry. Enterprises can run these models locally, eliminating the high API costs and latency associated with cloud-hosted LLMs. Furthermore, local deployment addresses critical data privacy and compliance concerns, as sensitive customer or proprietary data never leaves the local network. This makes SLMs highly attractive for industries like healthcare, finance, and defense, where data sovereignty is paramount.\nCybersecurity NIST Finalizes Post-Quantum Cryptography Standards The National Institute of Standards and Technology (NIST) has officially finalized its first set of encryption algorithms designed to withstand attacks from future quantum computers. The released standards include ML-KEM (formerly Kyber) for general encryption, and ML-DSA (formerly Dilithium) and FN-DSA (formerly Falcon) for digital signatures.\nQuantum computers leverage the principles of superposition and entanglement to solve complex mathematical problems—such as integer factorization and discrete logarithms—exponentially faster than classical supercomputers. This capability threatens to render widely used cryptographic systems, including RSA and Elliptic Curve Cryptography (ECC), entirely obsolete.\n1+-----------------------------------------------------------------+ 2| NIST Post-Quantum Cryptography Standards | 3+---------------------------------+-------------------------------+ 4| Algorithm Name | Primary Use Case | 5+---------------------------------+-------------------------------+ 6| ML-KEM (formerly Kyber) | General Encryption / Key Exch.| 7| ML-DSA (formerly Dilithium) | Digital Signatures | 8| FN-DSA (formerly Falcon) | Digital Signatures (Compact) | 9+---------------------------------+-------------------------------+ Why It Matters While a cryptographically relevant quantum computer (CRQC) may still be years away, the threat is immediate due to \u0026ldquo;harvest now, decrypt later\u0026rdquo; strategies. Adversaries are actively intercepting and storing encrypted high-value data today, intending to decrypt it once quantum technology matures. Organizations must immediately begin auditing their cryptographic assets and planning their migration to post-quantum cryptography (PQC). Transitioning legacy systems to these new algorithms will be a multi-year effort requiring significant changes to software architectures, network protocols, and hardware security modules (HSMs).\nHypervisor-Targeted Ransomware Campaigns Cybercriminals are increasingly bypassing individual endpoint defenses to target virtualization infrastructure directly. Ransomware groups, such as those deploying LockBit, Akira, and BlackBasta variants, are specifically targeting VMware ESXi and other Linux-based hypervisors.\nBy exploiting vulnerabilities in hypervisor management interfaces or using compromised administrative credentials, attackers gain access to the underlying bare-metal servers. Once inside, they deploy specialized ransomware payloads designed to encrypt the virtual machine disk files (VMDKs) directly, effectively disabling dozens or hundreds of virtualized servers in a single action.\nWhy It Matters Targeting the hypervisor maximizes the leverage of ransomware operators. Instead of taking the time to compromise and encrypt individual operating systems one by one, attackers can paralyze an entire enterprise infrastructure in minutes. This approach also bypasses traditional endpoint detection and response (EDR) agents, which typically run inside the guest operating systems rather than on the hypervisor itself. Organizations must secure their virtualization management planes, enforce strict network segmentation, implement multi-factor authentication (MFA) for hypervisor access, and ensure that backups are stored in immutable, air-gapped environments.\nCloud Computing The Custom Silicon Arms Race The major hyperscale cloud providers—Amazon Web Services (AWS), Microsoft Azure, and Google Cloud Platform (GCP)—are rapidly expanding their custom silicon portfolios. AWS has rolled out its Graviton4 processors, Google is expanding availability of its Arm-based Axion processors, and Microsoft is deploying its Cobalt 100 CPUs.\nHistorically, cloud providers relied almost exclusively on x86 processors from Intel and AMD. By designing their own custom chips based on the Arm architecture, hyperscalers can optimize silicon for specific cloud workloads, such as microservices, databases, and machine learning inference.\n1+-----------------------------------------------------------------+ 2| Hyperscaler Custom Arm-Based Silicon | 3+-------------------+---------------------------------------------+ 4| Cloud Provider | Custom Silicon Family | 5+-------------------+---------------------------------------------+ 6| AWS | Graviton4 | 7| Google Cloud | Axion | 8| Microsoft Azure | Cobalt 100 | 9+-------------------+---------------------------------------------+ Why It Matters Custom silicon allows cloud providers to break their dependence on traditional chipmakers, giving them greater control over their supply chains and profit margins. For customers, these custom chips offer significantly better price-performance ratios—often delivering up to 30% to 40% better performance per watt compared to equivalent x86 instances. Furthermore, the superior energy efficiency of Arm-based processors is critical for cloud providers striving to meet ambitious sustainability and carbon-reduction goals amid the power-hungry AI boom.\nSovereign Cloud Infrastructure Gains Momentum Driven by geopolitical tensions, strict data protection regulations (such as GDPR and Schrems II), and national security concerns, the demand for sovereign cloud infrastructure is surging. Governments and highly regulated industries are increasingly rejecting standard public cloud deployments in favor of localized, sovereign cloud solutions.\nIn response, hyperscalers are partnering with local telecommunications companies and domestic IT providers to build isolated cloud regions. These \u0026ldquo;sovereign clouds\u0026rdquo; guarantee that all data, metadata, and operational systems remain within a specific national boundary, managed exclusively by local personnel who hold the appropriate security clearances.\nWhy It Matters Sovereign clouds resolve the tension between the operational benefits of public cloud computing and the legal requirements of national data sovereignty. They prevent foreign governments from accessing sensitive data through extraterritorial legal mechanisms (such as the US CLOUD Act). As digital sovereignty laws tighten globally, enterprises operating across multiple jurisdictions must adopt multi-region, sovereign-compliant cloud architectures to avoid severe legal penalties and operational disruptions.\nDevOps Platform Engineering and the Rise of Internal Developer Platforms (IDPs) The traditional DevOps model of \u0026ldquo;you build it, you run it\u0026rdquo; is evolving. While intended to empower developers, it has often resulted in cognitive overload, requiring software engineers to master complex infrastructure concepts, Kubernetes configurations, and CI/CD pipelines alongside their core coding responsibilities. To address this, organizations are embracing Platform Engineering.\nPlatform Engineering teams build and maintain Internal Developer Platforms (IDPs). These platforms provide self-service capabilities, allowing developers to provision databases, configure environments, and deploy applications through standardized, golden-path templates. The goal is to abstract away the underlying infrastructure complexity while enforcing security, compliance, and operational best practices by default.\n1+-----------------------------------------------------------------+ 2| Traditional DevOps vs. Platform Engineering | 3+-----------------------------------------------------------------+ 4| Traditional DevOps: | 5| [Developer] ---\u0026gt; [Kubernetes, Terraform, CI/CD, Security] | 6| (High cognitive overload, fragmented workflows) | 7| | 8| Platform Engineering: | 9| [Developer] ---\u0026gt; [Internal Developer Platform (IDP)] | 10| |---\u0026gt; [Standardized Infrastructure] | 11| |---\u0026gt; [Automated Compliance] | 12| (Reduced friction, consistent guardrails) | 13+-----------------------------------------------------------------+ Why It Matters By reducing developer friction, Platform Engineering directly accelerates software delivery speed and improves developer experience (DevEx). It allows developers to focus on writing business logic rather than wrestling with infrastructure configurations. For the enterprise, IDPs ensure that security guardrails and cost-control measures are baked directly into the development lifecycle, reducing the risk of misconfigured cloud resources and shadow IT.\nStandardizing Observability with OpenTelemetry for LLMs As generative AI applications move into production, traditional Application Performance Monitoring (APM) tools are proving insufficient. To address this gap, the OpenTelemetry (OTel) project—a CNCF incubating standard—is expanding its specification to include semantic conventions for Large Language Models and generative AI workflows.\nThis expansion standardizes how telemetry data (metrics, logs, and traces) is collected from AI applications. It allows developers to track LLM-specific metrics, such as token consumption, prompt and response latency, model accuracy, and semantic caching efficiency, alongside traditional system metrics like CPU and memory utilization.\nWhy It Matters Without standardized observability, debugging complex, multi-step AI applications is incredibly difficult. When an agentic system fails or experiences high latency, developers need to trace the request across multiple microservices, vector databases, and external LLM APIs. By integrating LLM observability into the open-source OpenTelemetry standard, organizations can avoid vendor lock-in with proprietary monitoring tools and gain unified, end-to-end visibility into their modern, AI-powered application stacks.\nOpen Source The Valkey Initiative and the Open-Source Licensing Backlash The open-source ecosystem is experiencing a significant realignment following licensing shifts by prominent commercial entities. A prime example is Redis, which recently transitioned from the permissive BSD license to dual proprietary licenses (RSALv2 and SSPL). In response, the Linux Foundation, backed by industry giants including AWS, Google, Oracle, and Ericsson, launched Valkey—an open-source, fully compatible fork of the Redis in-memory database.\nThis incident is part of a broader trend where companies built on open-source software (such as HashiCorp with Terraform and Elastic with Elasticsearch) shift to restrictive licenses to protect their business models from cloud providers who package and resell their software as managed services.\nWhy It Matters The rapid industry mobilization around Valkey demonstrates the resilience of the open-source community when backed by major cloud providers. It signals to other commercial open-source companies that shifting to proprietary licenses may result in immediate, well-funded forks that dilute their market share. For enterprise consumers, this trend highlights the importance of licensing audits and the need to establish contingency plans for critical open-source dependencies.\nRust’s Continued Integration into the Linux Kernel The integration of the Rust programming language into the Linux kernel continues to progress, marking a historic shift away from exclusive reliance on C. Led by the Rust for Linux project, developers are steadily introducing Rust support for writing device drivers, file systems, and network protocols.\nThe primary driver behind this transition is Rust\u0026rsquo;s strict compile-time guarantees regarding memory safety. Unlike C, which requires developers to manually manage memory—often leading to vulnerabilities like buffer overflows, use-after-free errors, and data races—Rust prevents these bugs at the compilation stage without sacrificing runtime performance.\nWhy It Matters Memory-safety vulnerabilities account for approximately 70% of all severe security bugs in large software systems, including the Linux kernel. By rewriting critical kernel subsystems and drivers in Rust, the open-source community is systematically eliminating entire classes of security vulnerabilities at the operating system level. This transition will ultimately result in more secure, stable, and resilient infrastructure powering everything from cloud servers to embedded IoT devices.\nRecommended Reading The Transition to Post-Quantum Cryptography: A detailed guide by NIST on implementing the newly finalized ML-KEM and ML-DSA standards within legacy enterprise architectures. The Valkey Project Roadmap: An overview of the Linux Foundation\u0026rsquo;s plans for the Valkey database, focusing on performance improvements and cloud-native integrations. Platform Engineering Maturity Model: A framework by the Cloud Native Computing Foundation (CNCF) for assessing and scaling Internal Developer Platforms. The Rise of Agentic AI Frameworks: A technical deep dive into the architecture of multi-agent systems and their implications for enterprise automation. Securing the Hypervisor Plane: A comprehensive security guide by CISA on defending VMware ESXi and virtualized environments against modern ransomware tactics. Conclusion Today’s technological developments highlight a clear theme: the industry is moving past the initial hype cycles of new technologies and focusing on the hard work of stabilization, optimization, and security.\nIn AI, this is evident in the shift toward autonomous, multi-agent workflows and highly efficient edge models that deliver practical business value. In infrastructure, the rise of custom cloud silicon and platform engineering demonstrates a commitment to reducing costs and developer friction. Meanwhile, the cybersecurity and open-source sectors are proactively addressing systemic risks—whether by preparing for the quantum future, securing virtualization layers, or defending the integrity of open-source licensing and codebases. Organizations that successfully navigate these structural shifts will be well-positioned to build resilient, scalable, and secure digital architectures for the future.\n","date":"July 13, 2026","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/posts/2026-07-13-digital-radar/","series":[{"title":"Digital-Radar","url":"/en/series/digital-radar/"}],"smallImg":"","tags":[{"title":"Ai","url":"/en/tags/ai/"},{"title":"Cybersecurity","url":"/en/tags/cybersecurity/"},{"title":"Cloud","url":"/en/tags/cloud/"},{"title":"Devops","url":"/en/tags/devops/"},{"title":"Open-Source","url":"/en/tags/open-source/"}],"timestamp":1783921532,"title":"Digital Radar 2026-07-13"},{"authors":[],"categories":[{"title":"Technology","url":"/en/categories/technology/"},{"title":"Digital-Radar","url":"/en/categories/digital-radar/"}],"content":" Digital Radar Executive Summary Today’s technology landscape is defined by a critical transition from experimental implementation to operational maturity. In artificial intelligence, the industry is shifting away from monolithic, brute-force models toward highly optimized, agentic workflows and localized Small Language Models (SLMs). This transition promises to democratize AI capabilities while addressing pressing concerns regarding operational costs and data privacy.\nSimultaneously, the cybersecurity domain is grappling with systemic vulnerabilities within the software supply chain, forcing organizations to re-evaluate trust boundaries and accelerate the adoption of memory-safe programming languages.\nIn infrastructure, Cloud Computing and DevOps are converging on two fronts: the rise of sovereign cloud architectures to satisfy stringent geopolitical regulations, and the institutionalization of Platform Engineering to manage the cognitive load of cloud-native development.\nFinally, the open-source ecosystem is navigating a profound identity crisis as foundational projects transition to restrictive licensing models, triggering community-led forks that redefine industry standards. This report analyzes these pivotal developments, offering technical depth and strategic context for technology leaders.\nArtificial Intelligence The Shift to Agentic Workflows and Small Language Models The paradigm of generative artificial intelligence is undergoing a fundamental structural shift. For the past two years, the industry focus has been dominated by the pursuit of larger parameter counts in frontier Large Language Models (LLMs). However, the economic reality of running massive models, coupled with the latency constraints of real-time applications, has catalyzed a dual movement: the rise of \u0026ldquo;Agentic AI\u0026rdquo; and the rapid optimization of Small Language Models (SLMs).\nAgentic AI represents a transition from passive, prompt-and-response interactions to autonomous, goal-oriented systems. Instead of relying on a single, massive model to generate a complete solution, agentic architectures employ networks of specialized, smaller models that collaborate to solve complex tasks. These agents utilize iterative reasoning, tool execution (such as querying databases or executing code), and self-correction loops. Frameworks like LangGraph, AutoGen, and CrewAI are transitioning from experimental developer tools to enterprise-grade orchestration layers.\nConcurrently, SLMs—typically defined as models with fewer than 10 billion parameters, such as Microsoft’s Phi-3, Meta’s Llama 3.1 8B, and Mistral’s latest edge offerings—are demonstrating capabilities that rival closed-source models from previous generations. Through advanced quantization techniques, distilled training datasets, and hardware-specific optimizations, these models can now run efficiently on consumer-grade hardware, edge devices, and localized enterprise servers.\n1[User Query] ──\u0026gt; [Orchestrator Agent] ──┬──\u0026gt; [Retrieval Agent] ──\u0026gt; [Vector DB] 2 ├──\u0026gt; [Execution Agent] ──\u0026gt; [Secure Sandbox] 3 └──\u0026gt; [Critic Agent] ────\u0026gt; [Output Validation] Why It Matters This shift is critical for three primary reasons: cost, privacy, and reliability.\nFirst, the financial sustainability of enterprise AI initiatives depends on reducing inference costs. Running specialized SLMs for targeted tasks is orders of magnitude cheaper than routing every query to a proprietary, multi-billion-parameter API.\nSecond, data privacy and regulatory compliance (such as GDPR and HIPAA) make the transmission of proprietary data to external cloud-hosted models a significant legal liability. Localized SLMs allow enterprises to keep sensitive data entirely within their secure perimeters.\nFinally, agentic workflows address the inherent unreliability of LLMs. By breaking down complex tasks into discrete, verifiable steps executed by specialized agents, organizations can implement rigorous guardrails, drastically reducing hallucinations and improving the deterministic output required for production environments.\nCybersecurity Software Supply Chain Vulnerabilities and the Push for Memory Safety The cybersecurity landscape is increasingly defined by systemic threats targeting the software supply chain. Rather than attempting to breach well-defended enterprise perimeters directly, sophisticated threat actors are focusing their efforts upstream, compromising the open-source libraries, third-party dependencies, and edge devices that organizations implicitly trust.\nThe long-term implications of the XZ Utils backdoor attempt continue to reverberate through the security community. This incident highlighted a critical vulnerability in the open-source ecosystem: the reliance of foundational internet infrastructure on underfunded, volunteer-maintained projects. Attackers are leveraging social engineering and multi-year grooming campaigns to gain maintainer status on critical repositories, intending to inject sophisticated, obfuscated backdoors.\nIn parallel, enterprise edge devices—such as virtual private network (VPN) gateways and firewalls from vendors like Ivanti, Palo Alto Networks, and Fortinet—have become primary targets for zero-day exploitation. These devices, often running legacy codebases without modern exploit mitigations, serve as initial access points for state-sponsored espionage groups and ransomware affiliates alike.\nIn response to these persistent vulnerabilities, the Cybersecurity and Infrastructure Security Agency (CISA), alongside international partners, has intensified its advocacy for \u0026ldquo;Secure by Design\u0026rdquo; principles. A central pillar of this initiative is the transition away from memory-unsafe programming languages like C and C++ toward memory-safe alternatives, primarily Rust and Go.\nWhy It Matters The centralization of software distribution means that a single upstream compromise can have cascading, catastrophic effects across thousands of downstream organizations. Traditional reactive security measures, such as signature-based antivirus and perimeter firewalls, are ineffective against compromised software that possesses legitimate cryptographic signatures and administrative privileges.\nOrganizations must shift from a reactive posture to a proactive, zero-trust architecture. This requires the implementation of continuous Software Bill of Materials (SBOM) ingestion and analysis to gain visibility into transitive dependencies. Furthermore, CISA’s push for memory safety is not merely academic; memory corruption vulnerabilities account for approximately 70% of all severe security flaws. By transitioning critical infrastructure and core software components to memory-safe languages, the industry can systematically eliminate entire classes of vulnerabilities, fundamentally altering the economics of cyber defense.\nCloud Computing Sovereign Clouds and Custom Silicon Redefine Infrastructure The cloud computing sector is experiencing a dual transformation driven by geopolitical pressures and the physical limits of semiconductor scaling. As data sovereignty laws tighten globally and the computational demands of artificial intelligence escalate, cloud hyperscalers are forced to innovate beyond traditional commodity hardware and centralized data center models.\nSovereign cloud initiatives have transitioned from niche compliance offerings to mainstream architectural requirements. Driven by the European Union’s stringent data protection frameworks and similar legislative movements in Asia-Pacific countries, AWS, Microsoft Azure, and Google Cloud Platform (GCP) are establishing physically and logically isolated cloud zones. These \u0026ldquo;sovereign regions\u0026rdquo; are operated entirely by local citizens, utilize localized supply chains, and guarantee that data, metadata, and identity systems remain strictly within national borders, immune to foreign surveillance or legal reach (such as the US CLOUD Act).\nSimultaneously, the economic and thermal realities of running massive workloads have accelerated the adoption of custom silicon. Hyperscalers are increasingly bypassing traditional chipmakers to design their own Application-Specific Integrated Circuits (ASICs) and ARM-based CPUs. Examples include AWS’s Graviton4 and Trainium2, Google’s Axion CPU and TPU v5p, and Microsoft’s Cobalt 100 and Maia 100.\nProvider Custom CPU AI Training/Inference ASIC Primary Value Proposition AWS Graviton4 Trainium2 / Inferentia2 High price-performance, deep ecosystem integration Google Cloud Axion (ARM) TPU v5p Optimized for massive scale AI training \u0026amp; Kubernetes Microsoft Azure Cobalt 100 Maia 100 Tailored for Azure workloads and OpenAI services Why It Matters For enterprise architects, the rise of sovereign clouds means that multi-cloud and hybrid-cloud strategies must now incorporate geopolitical boundaries. Compliance is no longer just about encryption keys; it is about physical geography, operational jurisdiction, and the legal status of the cloud operator. Failing to align cloud architecture with these realities risks severe regulatory penalties and operational disruption.\nOn the hardware front, the adoption of custom silicon is critical for managing the escalating Total Cost of Ownership (TCO) of cloud infrastructure. ARM-based custom CPUs deliver up to 50% better price-performance and significantly lower power consumption compared to traditional x86 architectures. For organizations running large-scale microservices or training proprietary machine learning models, migrating to custom silicon instances is the single most effective lever for optimizing cloud spend and meeting corporate sustainability mandates.\nDevOps Platform Engineering and OpenTelemetry Standardization The DevOps movement is undergoing a structural evolution as organizations seek to mitigate the complexity of modern, cloud-native environments. The historical ideal of \u0026ldquo;you build it, you run it\u0026rdquo; has, in many cases, devolved into developer burnout and operational fragmentation. To counter this, the industry is rapidly consolidating around Platform Engineering and the standardization of OpenTelemetry.\nPlatform Engineering focuses on designing and delivering Internal Developer Platforms (IDPs). Rather than requiring every software engineer to master Kubernetes manifests, Terraform configurations, and complex CI/CD pipelines, Platform Engineering teams build \u0026ldquo;golden paths\u0026rdquo;—curated, self-service portals and APIs that abstract away infrastructure complexity. Tools like Backstage (originally open-sourced by Spotify) have become the industry standard for creating these developer portals, enabling engineers to provision secure, compliant environments with a single click.\n1[Developer] ──\u0026gt; [Internal Developer Platform (e.g., Backstage)] 2 │ 3 ├──\u0026gt; [Golden Path: Provision Microservice] 4 │ │ 5 │ ├──\u0026gt; Kubernetes Namespace 6 │ ├──\u0026gt; CI/CD Pipeline (GitHub Actions) 7 │ └──\u0026gt; IAM Roles \u0026amp; Secrets (Vault) 8 │ 9 └──\u0026gt; [Golden Path: Provision Database] In parallel, the challenge of monitoring these highly distributed, ephemeral microservice architectures has led to the near-universal adoption of OpenTelemetry (OTel) as the standard for cloud-native observability. OpenTelemetry, a Cloud Native Computing Foundation (CNCF) project, provides a vendor-neutral specification and tooling for collecting metrics, logs, and traces. The industry is moving away from proprietary monitoring agents, which lock organizations into specific SaaS platforms, toward OTel-native architectures.\nWhy It Matters Platform Engineering directly addresses the cognitive overload plaguing modern software development teams. By centralizing infrastructure management and security guardrails within an IDP, organizations can dramatically accelerate developer velocity while ensuring consistent compliance, security, and cost controls. It transforms DevOps from a decentralized, often chaotic set of practices into a structured, scalable internal product.\nThe standardization of OpenTelemetry is equally transformative. It decouples the telemetry data collection layer from the analysis layer. This prevents vendor lock-in, allowing organizations to route their observability data to multiple backends (such as Datadog, Dynatrace, Honeycomb, or self-hosted Prometheus/Grafana instances) without instrumenting their codebases multiple times. In an era where data egress and observability costs are skyrocketing, OTel provides the architectural flexibility required to optimize monitoring strategies.\nOpen Source The Licensing Schism and the Rise of Community Forks The open-source software (OSS) ecosystem is experiencing a profound philosophical and economic crisis. A growing number of venture-backed open-source companies are abandoning permissive open-source licenses in favor of restrictive \u0026ldquo;source-available\u0026rdquo; or business-oriented licenses. This trend has fractured long-standing communities and forced a re-evaluation of the relationship between commercial entities and open-source contributors.\nThe most prominent recent example is Redis, which transitioned from the permissive BSD license to a dual-licensing scheme under the Redis Source Available License (RSALv2) and the Server Side Public License (SSPLv1). This follows similar moves by HashiCorp (Terraform transitioning to the Business Source License), Elastic, and MongoDB in previous years. These companies argue that cloud hyperscalers exploit their open-source code to offer managed services without contributing back to the upstream projects, making the traditional open-source model commercially non-viable.\nThe community and industry response to these licensing shifts has been swift and decisive. In the wake of the Redis announcement, the Linux Foundation, with backing from major technology companies including AWS, Google, and Oracle, launched Valkey—a high-performance, fully open-source fork of Redis based on the last BSD-licensed version. Similarly, HashiCorp’s transition of Terraform led to the creation of OpenTofu, a successful community-driven fork under the auspices of the Linux Foundation.\nWhy It Matters This licensing schism introduces significant legal and operational risks for enterprises. Software that was once freely usable under permissive licenses may now carry restrictions that prohibit its use in competitive environments or require complex, costly commercial licensing agreements.\nOrganizations must implement strict open-source governance policies to continuously audit their software dependencies. The rapid emergence and industry backing of forks like Valkey and OpenTofu demonstrate that the tech industry is willing to mobilize massive resources to maintain open, vendor-neutral alternatives to critical infrastructure components. For technology leaders, the lesson is clear: dependency on single-vendor open-source projects carries inherent risk, and active participation in neutral foundations (like the CNCF or Linux Foundation) is essential for long-term architectural stability.\nRecommended Reading The Pragmatics of Agentic AI: An in-depth exploration of multi-agent orchestration frameworks, focusing on state management, tool integration, and cost-optimization strategies in production environments. Transitioning to Memory-Safe Systems: A practical guide for engineering leaders on migrating legacy C/C++ codebases to Rust, detailing interoperability patterns and compiler-enforced safety benefits. Architecting for Data Sovereignty: A comprehensive analysis of the technical requirements, encryption key management strategies, and legal frameworks necessary to deploy compliant multi-region cloud architectures. Implementing Internal Developer Platforms (IDPs): A step-by-step blueprint for building developer portals using Backstage, focusing on reducing cognitive load and establishing secure \u0026ldquo;golden paths.\u0026rdquo; The Economics of Open Source Licensing: An analytical look at the commercial pressures driving the shift to source-available licenses, and the long-term viability of community-driven forks like Valkey and OpenTofu. Conclusion Today\u0026rsquo;s technological landscape demands a sophisticated balance between rapid innovation and rigorous risk management. The transition to Agentic AI and Small Language Models offers a path toward sustainable, private, and highly functional artificial intelligence. However, these advancements must be supported by robust security practices that address the realities of a compromised software supply chain.\nIn the infrastructure domain, the rise of sovereign clouds and custom silicon highlights the necessity of aligning technical architecture with both geopolitical realities and hardware efficiencies. Meanwhile, Platform Engineering and OpenTelemetry provide the operational frameworks required to manage this growing complexity without burning out engineering teams.\nFinally, the licensing battles in the open-source community serve as a stark reminder that the foundational software of the modern web is subject to economic and legal shifts, requiring vigilant governance and strategic adaptability from technology leaders worldwide.\n","date":"July 12, 2026","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/posts/2026-07-12-digital-radar/","series":[{"title":"Digital-Radar","url":"/en/series/digital-radar/"}],"smallImg":"","tags":[{"title":"Ai","url":"/en/tags/ai/"},{"title":"Cybersecurity","url":"/en/tags/cybersecurity/"},{"title":"Cloud","url":"/en/tags/cloud/"},{"title":"Devops","url":"/en/tags/devops/"},{"title":"Open-Source","url":"/en/tags/open-source/"}],"timestamp":1783843594,"title":"Digital Radar 2026-07-12"},{"authors":[],"categories":[{"title":"Devops","url":"/en/categories/devops/"},{"title":"Azure","url":"/en/categories/azure/"}],"content":"In part 1 the azure-pipelines.yml was merged into the main branch via a Pull Request. In this second part we attach that YAML to a pipeline and run it on a Microsoft-hosted Windows agent in the cloud.\nThe Pipelines section The Pipelines section in the sidebar contains more items than Repos:\nPipelines — the CI pipelines (build) Environments — deployment targets such as acceptance and production Releases — the classic visual release pipelines (older system, being replaced by multi-stage YAML) Library — variable groups and secure files Task groups — reusable task blocks that can be shared across multiple pipelines Deployment groups — self-hosted agents grouped per environment On a new project the Pipelines list is empty.\nCreating a pipeline: the wizard Via Create Pipeline the four-step wizard starts: Connect → Select → Configure → Review.\nStep 1 — Connect: where is the code? ADO supports Azure Repos Git, GitHub, Bitbucket Cloud, other Git servers and Subversion. At the bottom there is also a link to the classic editor — the old visual pipeline builder without YAML. This is no longer actively developed.\nStep 2 — Select: which repository? Since there is only one repo in the project, dev-ops-lab01 is the only option.\nStep 3 — Configure is automatically skipped. ADO detects that an azure-pipelines.yml already exists in the root of the repo and jumps straight to Review.\nStep 4 — Review: the existing YAML is shown. ADO reads the file directly from the repo — nothing is copied or stored separately. The pipeline is the YAML in the repo.\nThe YAML created in part 1:\n1trigger: 2 - main 3 4pool: 5 vmImage: \u0026#39;windows-latest\u0026#39; 6 7steps: 8 - task: PowerShell@2 9 displayName: \u0026#39;System information\u0026#39; 10 inputs: 11 targetType: \u0026#39;inline\u0026#39; 12 script: | 13 Write-Host \u0026#34;Hostname: $env:COMPUTERNAME\u0026#34; 14 Write-Host \u0026#34;OS: $env:OS\u0026#34; 15 Write-Host \u0026#34;Build number: $(Build.BuildNumber)\u0026#34; 16 Write-Host \u0026#34;Branch: $(Build.SourceBranchName)\u0026#34; The key components:\nKeyword Meaning trigger A push to main starts the pipeline automatically pool.vmImage Microsoft-hosted agent — windows-latest is the most recent Windows Server image steps The list of steps to execute task: PowerShell@2 A built-in ADO task, version 2 $(Build.BuildNumber) Built-in ADO variable, automatically populated $(Build.SourceBranchName) Built-in ADO variable with the branch name Via Run the pipeline is started for the first time.\nThe first run After starting, ADO shows the run summary. The pipeline completed successfully.\nWhat is visible:\n#20260414.1 — build number, constructed from date and sequence number Merged PR 1: Added azure-pipelines.yml — the commit this ran against branch main, commit aaedef9f — the exact merge commit from the PR in part 1 Stage: 1 job completed in 15s — total execution time including agent provisioning The job log Clicking Job opens the detailed log view. The left sidebar shows all the steps ADO automatically executes around the custom YAML steps:\nInitialize job — agent is configured Checkout dev-ops-lab01@main — the repo is cloned on the agent System information — the custom PowerShell task Post-job: Checkout — cleanup after checkout Finalize Job — agent signs off Report build status — status is reported back to the repo The main log shows the agent metadata: Pool: Azure Pipelines, Image: windows-latest, Agent: Azure Pipelines 1. This is a disposable VM in a Microsoft data centre that was provisioned on demand for this job and destroyed after completion.\nPowerShell output The output of the System information step:\n1Hostname: runnervm67wqg 2OS: Windows_NT 3Build number: 20260414.1 4Branch: main The agent is named runnervm67wqg — a randomly assigned Microsoft-hosted Windows VM. The ADO variables $(Build.BuildNumber) and $(Build.SourceBranchName) were automatically populated by the platform with the correct values.\nWhat has been achieved After this second part it is clear how a YAML pipeline works in Azure DevOps:\nThe pipeline wizard links a YAML file in the repo to a pipeline definition ADO automatically detects an existing azure-pipelines.yml A Microsoft-hosted agent is provisioned on demand, executes the job and is discarded afterwards Built-in ADO variables are available in every step without any configuration The job log shows all steps including the automatic steps added by ADO itself In part 3 we will extend the pipeline with stages and jobs — the building blocks for real CI/CD pipelines with multiple environments.\n","date":"April 14, 2026","img":"/posts/2026-azure-devops-pipelines-eerste-pipeline/cover.png","lang":"en","langName":"English","largeImg":"/posts/2026-azure-devops-pipelines-eerste-pipeline/cover_hu_ce8b2a8b791d2d56.png","permalink":"/en/posts/2026-azure-devops-pipelines-eerste-pipeline/","series":[{"title":"Azure DevOps Lab","url":"/en/series/azure-devops-lab/"}],"smallImg":"/posts/2026-azure-devops-pipelines-eerste-pipeline/cover_hu_7a21eef3dae21511.png","tags":[{"title":"Azure-Devops","url":"/en/tags/azure-devops/"},{"title":"Pipelines","url":"/en/tags/pipelines/"},{"title":"YAML","url":"/en/tags/yaml/"},{"title":"Ci-Cd","url":"/en/tags/ci-cd/"},{"title":"PowerShell","url":"/en/tags/powershell/"},{"title":"Windows","url":"/en/tags/windows/"},{"title":"Lab","url":"/en/tags/lab/"}],"timestamp":1776186060,"title":"Azure DevOps — Part 2: Your First YAML Pipeline"},{"authors":[],"categories":[{"title":"Devops","url":"/en/categories/devops/"},{"title":"Azure","url":"/en/categories/azure/"}],"content":"Azure DevOps is Microsoft\u0026rsquo;s platform for managing the complete software delivery chain: version control, CI/CD pipelines, project planning, package feeds and documentation. In this first part of the series we build the foundation: a Git repository, branch protection and the Pull Request workflow.\nSetup: organisation and project After logging in to dev.azure.com the mvdboom organisation is visible with one existing project.\nOpening that project revealed it was a TFVC project — Microsoft\u0026rsquo;s older centralised version control system. TFVC projects use $/projectname paths instead of Git branches and work with changesets and shelvesets. For modern DevOps workflows, Git is the standard.\nTFVC projects cannot be converted to Git. A new project dev-ops-lab01 was therefore created as a Private project with Git as the version control system.\nAzure DevOps Repos Opening Repos shows an empty repository with three options to get started: clone locally, push an existing repo, or initialise directly in the browser with a README. The sidebar shows the Git-specific sections: Files, Commits, Pushes, Branches, Tags, Pull requests and Advanced Security.\nUsing Initialize (with README checked) creates the main branch. The first commit — 924f2a1b: Added README.md — is immediately visible including author and timestamp.\nBranch policies on main A production environment never allows direct pushes to main. Via Branches → ⋯ → Branch policies on the main branch the policies screen opens.\nThe four available policies:\nRequire a minimum number of reviewers — blocks merge without approval Check for linked work items — requires a link to a Board item for traceability Check for comment resolution — all review comments must be resolved Limit merge types — enforces a specific merge strategy (squash, rebase, etc.) Below those are Build Validation (a pipeline must pass before merge), Status Checks (external tools such as SonarQube) and Automatically included reviewers.\nEnabling the first policy reveals its configuration options.\nFor the lab environment the policy is set to minimum 1 reviewer with \u0026ldquo;Allow requestors to approve their own changes\u0026rdquo; checked — so the full workflow can be completed without a second account.\nOnce a required policy is active, the rule applies automatically: direct push to main is blocked, everything goes through a Pull Request.\nFeature branch and first commit From the Files view a new branch feature/add-pipeline was created using the branch selector. The name follows the common convention: feature/ as a prefix followed by a descriptive name.\nVia + New → File the file azure-pipelines.yml was created and typed directly in the browser.\n1trigger: 2 - main 3 4pool: 5 vmImage: \u0026#39;windows-latest\u0026#39; 6 7steps: 8 - task: PowerShell@2 9 displayName: \u0026#39;System information\u0026#39; 10 inputs: 11 targetType: \u0026#39;inline\u0026#39; 12 script: | 13 Write-Host \u0026#34;Hostname: $env:COMPUTERNAME\u0026#34; 14 Write-Host \u0026#34;OS: $env:OS\u0026#34; 15 Write-Host \u0026#34;Build number: $(Build.BuildNumber)\u0026#34; 16 Write-Host \u0026#34;Branch: $(Build.SourceBranchName)\u0026#34; After saving via Commit the change is on the feature branch. ADO immediately suggests at the top: \u0026ldquo;Create a pull request\u0026rdquo;.\nPull Request workflow When creating the Pull Request, ADO automatically shows the correct direction: feature/add-pipeline → main. The tabs Files 1 and Commits 1 confirm the scope of the change.\nAfter creation the PR is in Active status. The branch policy is immediately visible as a blocking check:\n🔵 At least 1 reviewer must approve — merge blocked ✅ No merge conflicts — branch is clean Using Approve the PR is approved. Both checks turn green and the Complete button becomes active.\nClicking Complete shows the merge dialog with a choice of four merge types:\nType Behaviour Merge (no fast forward) Always creates a merge commit; branch history remains visible in the graph Squash commit All commits from the feature branch compressed into one commit on main Rebase and fast forward Commits replayed linearly on top of main; no merge commit Semi-linear merge Rebase first, then merge commit The default Merge (no fast forward) is the right choice in most environments. Delete feature/add-pipeline after merging is checked by default — good practice to keep the repository tidy.\nAfter Complete merge the PR shows Completed status with the full audit trail: created → joined as reviewer → approved → completed.\nWhat has been achieved After this first part the following foundation is in place:\nA Git repository in Azure DevOps (not TFVC) Branch policy on main: direct push blocked, everything via PR Feature branch workflow: feature/add-pipeline created, file committed Full Pull Request completed: create → review → approve → merge The file azure-pipelines.yml is now in main. In part 2 we will attach a pipeline to it and run the YAML on a Microsoft-hosted agent.\n","date":"April 14, 2026","img":"/posts/2026-azure-devops-repos-branches-policies-pull-requests/screenshot-11-feature-branch.png","lang":"en","langName":"English","largeImg":"/posts/2026-azure-devops-repos-branches-policies-pull-requests/screenshot-11-feature-branch_hu_d980affb1eb962a9.png","permalink":"/en/posts/2026-azure-devops-repos-branches-policies-pull-requests/","series":[{"title":"Azure DevOps Lab","url":"/en/series/azure-devops-lab/"}],"smallImg":"/posts/2026-azure-devops-repos-branches-policies-pull-requests/screenshot-11-feature-branch_hu_9ffcb8558117715e.png","tags":[{"title":"Azure-Devops","url":"/en/tags/azure-devops/"},{"title":"Git","url":"/en/tags/git/"},{"title":"Repos","url":"/en/tags/repos/"},{"title":"Pull-Request","url":"/en/tags/pull-request/"},{"title":"Branch-Policy","url":"/en/tags/branch-policy/"},{"title":"YAML","url":"/en/tags/yaml/"},{"title":"Windows","url":"/en/tags/windows/"},{"title":"Lab","url":"/en/tags/lab/"}],"timestamp":1776186000,"title":"Azure DevOps — Part 1: Repos, Branches, Policies and Pull Requests"},{"authors":[{"title":"ing. M.A.C.M. (Martijn) van den Boom","url":"/en/authors/martijnvandenboom/"}],"categories":[{"title":"Windows","url":"/en/categories/windows/"}],"content":" Download as Word document\nThis article describes the full build of a two-server Windows Server 2022 home lab in Proxmox VE. Together, the two virtual machines provide Active Directory Domain Services, DNS, Group Policy and a Certificate Authority (ADCS). RDP connections are secured with PKI certificates so the Mac Mini M1 management workstation connects without certificate warnings.\nThis is part 3 of the series on building a Windows DevOps lab in Proxmox. In part 1 I described how to create a VM, and in part 2 how to prepare the template.\nLab Environment Component Value Proxmox host macpro2013.local Proxmox console https://macpro2013.local:8006 Management workstation Mac Mini M1 VM 1 - AD + DNS WS2022-AD-DNS - 192.168.178.210 VM 2 - CA WS2022-CA01 - 192.168.178.211 Default gateway 192.168.178.1 Subnet prefix /24 Domain LAB01.local Resources (both VMs) 2 vCPU / 4 GB RAM Template WS2022-TEMPLATE-BASE Build Order The CA has a hard dependency on a working AD and DNS. Build everything in this order:\nClone WS2022-TEMPLATE-BASE to WS2022-AD-DNS and configure hostname and static IP Install AD DS + DNS and promote to Domain Controller Configure DNS zones, the SYSVOL scripts folder and Group Policy Clone WS2022-TEMPLATE-BASE to WS2022-CA01 and join the domain Install ADCS (Enterprise Root CA), Web Enrollment and IIS Configure certificate templates and CRL distribution points Deploy Set-RDPCert.ps1 through SYSVOL and a Scheduled Task on both servers Trust the Root CA certificate on the Mac Mini M1 Step 1 - Clone and Prepare WS2022-AD-DNS Clone WS2022-TEMPLATE-BASE to WS2022-AD-DNS through the Proxmox console. Set 2 vCPU and 4 GB RAM and attach the VM to the lab bridge.\nAfter booting, sign in as local Administrator and run the following in an elevated PowerShell session:\n1# RUN ON: WS2022-AD-DNS (192.168.178.210) - Elevated PowerShell 2 3# Rename the computer 4Rename-Computer -NewName \u0026#34;WS2022-AD-DNS\u0026#34; -Force 5 6# Identify the active network adapter 7$adapter = Get-NetAdapter | Where-Object { $_.Status -eq \u0026#39;Up\u0026#39; } | Select-Object -First 1 8 9# Remove any existing DHCP configuration 10Remove-NetIPAddress -InterfaceIndex $adapter.ifIndex -Confirm:$false -ErrorAction SilentlyContinue 11Remove-NetRoute -InterfaceIndex $adapter.ifIndex -Confirm:$false -ErrorAction SilentlyContinue 12 13# Assign a static IP address 14New-NetIPAddress ` 15 -InterfaceIndex $adapter.ifIndex ` 16 -IPAddress 192.168.178.210 ` 17 -PrefixLength 24 ` 18 -DefaultGateway 192.168.178.1 19 20# Point DNS to loopback - after AD DS installation point to own IP 21Set-DnsClientServerAddress ` 22 -InterfaceIndex $adapter.ifIndex ` 23 -ServerAddresses 127.0.0.1 24 25# Restart to apply the hostname 26Restart-Computer -Force Step 2 - Install AD DS and DNS After the restart, sign in again as local Administrator and run:\n1# RUN ON: WS2022-AD-DNS (192.168.178.210) - Elevated PowerShell 2 3# Install AD DS and DNS with all management tools 4Install-WindowsFeature ` 5 -Name AD-Domain-Services, DNS ` 6 -IncludeManagementTools ` 7 -IncludeAllSubFeature 8 9# Promote to Domain Controller and create the new forest 10Import-Module ADDSDeployment 11 12Install-ADDSForest ` 13 -DomainName \u0026#34;LAB01.local\u0026#34; ` 14 -DomainNetBiosName \u0026#34;LAB01\u0026#34; ` 15 -ForestMode \u0026#34;WinThreshold\u0026#34; ` 16 -DomainMode \u0026#34;WinThreshold\u0026#34; ` 17 -InstallDns $true ` 18 -DatabasePath \u0026#34;C:\\Windows\\NTDS\u0026#34; ` 19 -LogPath \u0026#34;C:\\Windows\\NTDS\u0026#34; ` 20 -SysvolPath \u0026#34;C:\\Windows\\SYSVOL\u0026#34; ` 21 -SafeModeAdministratorPassword (ConvertTo-SecureString \u0026#34;P@ssw0rd!DSRM2026\u0026#34; -AsPlainText -Force) ` 22 -Force The server restarts automatically. Afterwards, sign in as LAB01\\Administrator.\nThen update the DNS pointer and create the reverse lookup zone:\n1# RUN ON: WS2022-AD-DNS (192.168.178.210) - Elevated PowerShell 2 3# Update DNS pointer to own IP 4$adapter = Get-NetAdapter | Where-Object { $_.Status -eq \u0026#39;Up\u0026#39; } | Select-Object -First 1 5Set-DnsClientServerAddress ` 6 -InterfaceIndex $adapter.ifIndex ` 7 -ServerAddresses 192.168.178.210, 8.8.8.8 8 9# Create reverse lookup zone 10Add-DnsServerPrimaryZone ` 11 -NetworkID \u0026#34;192.168.178.0/24\u0026#34; ` 12 -ReplicationScope \u0026#34;Forest\u0026#34; 13 14# Add PTR record for the AD server 15Add-DnsServerResourceRecordPtr ` 16 -ZoneName \u0026#34;178.168.192.in-addr.arpa\u0026#34; ` 17 -Name \u0026#34;210\u0026#34; ` 18 -PtrDomainName \u0026#34;WS2022-AD-DNS.LAB01.local.\u0026#34; 19 20# Create the SYSVOL scripts folder 21$scriptShare = \u0026#34;\\\\LAB01.local\\SYSVOL\\LAB01.local\\scripts\u0026#34; 22If (-Not (Test-Path $scriptShare)) { 23 New-Item -ItemType Directory -Path $scriptShare -Force 24} Step 3 - Configure Group Policy 1# RUN ON: WS2022-AD-DNS (192.168.178.210) - Elevated PowerShell 2 3Import-Module GroupPolicy 4 5# Create the GPO and link to the domain root 6$gpo = New-GPO -Name \u0026#34;LAB01-Core-Settings\u0026#34; 7New-GPLink -Name \u0026#34;LAB01-Core-Settings\u0026#34; -Target \u0026#34;DC=LAB01,DC=local\u0026#34; -LinkEnabled Yes 8 9# Require NLA for RDP 10Set-GPRegistryValue ` 11 -Name \u0026#34;LAB01-Core-Settings\u0026#34; ` 12 -Key \u0026#34;HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows NT\\Terminal Services\u0026#34; ` 13 -ValueName \u0026#34;UserAuthentication\u0026#34; -Type DWord -Value 1 14 15# Set TLS security layer 16Set-GPRegistryValue ` 17 -Name \u0026#34;LAB01-Core-Settings\u0026#34; ` 18 -Key \u0026#34;HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows NT\\Terminal Services\u0026#34; ` 19 -ValueName \u0026#34;SecurityLayer\u0026#34; -Type DWord -Value 2 20 21# High encryption level 22Set-GPRegistryValue ` 23 -Name \u0026#34;LAB01-Core-Settings\u0026#34; ` 24 -Key \u0026#34;HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows NT\\Terminal Services\u0026#34; ` 25 -ValueName \u0026#34;MinEncryptionLevel\u0026#34; -Type DWord -Value 3 26 27# Automatic certificate enrollment (computers and users) 28Set-GPRegistryValue ` 29 -Name \u0026#34;LAB01-Core-Settings\u0026#34; ` 30 -Key \u0026#34;HKLM\\SOFTWARE\\Policies\\Microsoft\\Cryptography\\AutoEnrollment\u0026#34; ` 31 -ValueName \u0026#34;AEPolicy\u0026#34; -Type DWord -Value 7 32 33Set-GPRegistryValue ` 34 -Name \u0026#34;LAB01-Core-Settings\u0026#34; ` 35 -Key \u0026#34;HKCU\\SOFTWARE\\Policies\\Microsoft\\Cryptography\\AutoEnrollment\u0026#34; ` 36 -ValueName \u0026#34;AEPolicy\u0026#34; -Type DWord -Value 7 Step 4 - Clone WS2022-CA01 and Join the Domain Clone WS2022-TEMPLATE-BASE to WS2022-CA01 with 2 vCPU and 4 GB RAM on the same lab bridge. Configure the hostname and static IP on first boot:\n1# RUN ON: WS2022-CA01 (192.168.178.211) - Local VM console / Elevated PowerShell 2 3Rename-Computer -NewName \u0026#34;WS2022-CA01\u0026#34; -Force 4 5$adapter = Get-NetAdapter | Where-Object { $_.Status -eq \u0026#39;Up\u0026#39; } | Select-Object -First 1 6Remove-NetIPAddress -InterfaceIndex $adapter.ifIndex -Confirm:$false -ErrorAction SilentlyContinue 7Remove-NetRoute -InterfaceIndex $adapter.ifIndex -Confirm:$false -ErrorAction SilentlyContinue 8 9New-NetIPAddress ` 10 -InterfaceIndex $adapter.ifIndex ` 11 -IPAddress 192.168.178.211 ` 12 -PrefixLength 24 ` 13 -DefaultGateway 192.168.178.1 14 15# REQUIRED: point DNS to the AD server 16Set-DnsClientServerAddress ` 17 -InterfaceIndex $adapter.ifIndex ` 18 -ServerAddresses 192.168.178.210 19 20Restart-Computer -Force After the restart, join the domain:\n1# RUN ON: WS2022-CA01 (192.168.178.211) - Elevated PowerShell 2 3# Verify DNS resolution before joining the domain 4Resolve-DnsName LAB01.local 5 6# Join the domain 7Add-Computer ` 8 -DomainName \u0026#34;LAB01.local\u0026#34; ` 9 -Credential (Get-Credential -Message \u0026#34;Enter LAB01\\Administrator credentials\u0026#34;) ` 10 -Restart -Force Step 5 - Install ADCS and Configure the Certificate Authority Sign in as LAB01\\Administrator on WS2022-CA01:\n1# RUN ON: WS2022-CA01 (192.168.178.211) - Elevated PowerShell 2 3# Check and install IIS 4Get-WindowsFeature Web-Server 5Install-WindowsFeature Web-Server -IncludeManagementTools 6 7# Install the CA role and Web Enrollment 8Install-WindowsFeature ` 9 -Name ADCS-Cert-Authority ` 10 -IncludeManagementTools ` 11 -IncludeAllSubFeature 12 13Install-WindowsFeature ADCS-Web-Enrollment -IncludeManagementTools 14 15# Verify installation 16Get-WindowsFeature ADCS-Cert-Authority, ADCS-Web-Enrollment, Web-Server | ` 17 Select-Object Name, Installed, DisplayName 18 19# Configure the Enterprise Root CA 20Install-AdcsCertificationAuthority ` 21 -CAType EnterpriseRootCA ` 22 -CACommonName \u0026#34;LAB01-Root-CA\u0026#34; ` 23 -CADistinguishedNameSuffix \u0026#34;DC=LAB01,DC=local\u0026#34; ` 24 -CryptoProviderName \u0026#34;RSA#Microsoft Software Key Storage Provider\u0026#34; ` 25 -KeyLength 4096 ` 26 -HashAlgorithmName SHA256 ` 27 -ValidityPeriod Years ` 28 -ValidityPeriodUnits 10 ` 29 -DatabaseDirectory \u0026#34;C:\\Windows\\system32\\CertLog\u0026#34; ` 30 -LogDirectory \u0026#34;C:\\Windows\\system32\\CertLog\u0026#34; ` 31 -Force 32 33# Configure Web Enrollment 34Install-AdcsWebEnrollment -Force 35 36# Verify 37Get-WindowsFeature ADCS-Web-Enrollment 38Get-Service W3SVC 39netstat -an | findstr :80 40 41# Test the Web Enrollment page 42Invoke-WebRequest ` 43 -Uri \u0026#34;http://localhost/certsrv\u0026#34; ` 44 -UseDefaultCredentials ` 45 | Select-Object StatusCode, StatusDescription The Web Enrollment page is available at http://WS2022-CA01.LAB01.local/certsrv.\nStep 6 - Secure RDP with Set-RDPCert.ps1 Create the script in SYSVOL on WS2022-AD-DNS:\n1# RUN ON: WS2022-AD-DNS (192.168.178.210) - Elevated PowerShell 2 3notepad \\\\LAB01.local\\SYSVOL\\LAB01.local\\scripts\\Set-RDPCert.ps1 Paste the following content into Notepad, save and close it:\n1#Requires -RunAsAdministrator 2\u0026lt;# 3.SYNOPSIS 4 Binds a CA-issued certificate to the RDP listener on every startup. 5.DESCRIPTION 6 Finds the most recent valid certificate in Cert:\\LocalMachine\\My issued by 7 LAB01-Root-CA for the local computer\u0026#39;s FQDN. If none is found, certificate 8 auto-enrollment is triggered. The selected certificate thumbprint is written 9 to the RDP-Tcp registry key and the Remote Desktop service is restarted. 10.NOTES 11 Deploy via SYSVOL and run as SYSTEM via Scheduled Task at startup. 12 Lab: LAB01.local - WS2022-AD-DNS / WS2022-CA01 13#\u0026gt; 14 15Set-StrictMode -Version Latest 16$ErrorActionPreference = \u0026#39;Stop\u0026#39; 17 18$LogFile = \u0026#34;C:\\Scripts\\Set-RDPCert.log\u0026#34; 19 20function Write-Log { 21 param([string]$Message) 22 $timestamp = Get-Date -Format \u0026#34;yyyy-MM-dd HH:mm:ss\u0026#34; 23 \u0026#34;$timestamp $Message\u0026#34; | Tee-Object -FilePath $LogFile -Append | Write-Host 24} 25 26Write-Log \u0026#34;=== Set-RDPCert.ps1 started ===\u0026#34; 27 28# 1. Determine the computer\u0026#39;s FQDN 29$fqdn = [System.Net.Dns]::GetHostEntry(\u0026#39;\u0026#39;).HostName 30Write-Log \u0026#34;FQDN: $fqdn\u0026#34; 31 32# 2. Find a valid certificate issued by LAB01-Root-CA 33$rdpCert = Get-ChildItem Cert:\\LocalMachine\\My | 34 Where-Object { 35 $_.Issuer -like \u0026#34;*LAB01-Root-CA*\u0026#34; -and 36 $_.Subject -like \u0026#34;*$fqdn*\u0026#34; -and 37 $_.NotAfter -gt (Get-Date) -and 38 $_.HasPrivateKey 39 } | 40 Sort-Object NotAfter -Descending | 41 Select-Object -First 1 42 43# 3. If no certificate is found, trigger auto-enrollment and retry 44if (-not $rdpCert) { 45 Write-Log \u0026#34;No valid certificate found - triggering auto-enrollment...\u0026#34; 46 \u0026amp; certutil -pulse | Out-Null 47 Start-Sleep -Seconds 30 48 49 $rdpCert = Get-ChildItem Cert:\\LocalMachine\\My | 50 Where-Object { 51 $_.Issuer -like \u0026#34;*LAB01-Root-CA*\u0026#34; -and 52 $_.Subject -like \u0026#34;*$fqdn*\u0026#34; -and 53 $_.NotAfter -gt (Get-Date) -and 54 $_.HasPrivateKey 55 } | 56 Sort-Object NotAfter -Descending | 57 Select-Object -First 1 58} 59 60if (-not $rdpCert) { 61 Write-Log \u0026#34;ERROR: No certificate available after auto-enrollment. Aborting.\u0026#34; 62 exit 1 63} 64 65Write-Log \u0026#34;Certificate selected: $($rdpCert.Subject)\u0026#34; 66Write-Log \u0026#34;Thumbprint : $($rdpCert.Thumbprint)\u0026#34; 67Write-Log \u0026#34;Valid until: $($rdpCert.NotAfter)\u0026#34; 68 69# 4. Grant Network Service read access to the private key 70$keyPath = $rdpCert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName 71if ($keyPath) { 72 $keyFile = Get-ChildItem \u0026#34;$env:ProgramData\\Microsoft\\Crypto\\RSA\\MachineKeys\\$keyPath\u0026#34; ` 73 -ErrorAction SilentlyContinue 74 if ($keyFile) { 75 $acl = Get-Acl $keyFile.FullName 76 $rule = New-Object System.Security.AccessControl.FileSystemAccessRule( 77 \u0026#34;NT AUTHORITY\\NETWORK SERVICE\u0026#34;, \u0026#34;Read\u0026#34;, \u0026#34;Allow\u0026#34;) 78 $acl.AddAccessRule($rule) 79 Set-Acl -Path $keyFile.FullName -AclObject $acl 80 Write-Log \u0026#34;Private key ACL updated for NETWORK SERVICE.\u0026#34; 81 } 82} 83 84# 5. Bind the certificate to the RDP listener 85$rdpReg = \u0026#34;HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp\u0026#34; 86Set-ItemProperty -Path $rdpReg -Name SSLCertificateSHA1Hash -Value $rdpCert.Thumbprint 87Write-Log \u0026#34;Registry updated with new thumbprint.\u0026#34; 88 89# 6. Restart Remote Desktop Services to apply the new certificate 90Write-Log \u0026#34;Restarting TermService...\u0026#34; 91Restart-Service -Name TermService -Force 92Write-Log \u0026#34;TermService restarted.\u0026#34; 93 94Write-Log \u0026#34;=== Set-RDPCert.ps1 completed successfully ===\u0026#34; Then copy the script locally and register the Scheduled Task on both servers:\n1# RUN ON: BOTH SERVERS - WS2022-AD-DNS + WS2022-CA01 - Elevated PowerShell 2 3# Create local copy 4If (-Not (Test-Path \u0026#34;C:\\Scripts\u0026#34;)) { New-Item -ItemType Directory -Path \u0026#34;C:\\Scripts\u0026#34; -Force } 5Copy-Item ` 6 -Path \u0026#34;\\\\LAB01.local\\SYSVOL\\LAB01.local\\scripts\\Set-RDPCert.ps1\u0026#34; ` 7 -Destination \u0026#34;C:\\Scripts\\Set-RDPCert.ps1\u0026#34; ` 8 -Force 9 10Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine -Force 11 12# Register the Scheduled Task 13$action = New-ScheduledTaskAction ` 14 -Execute \u0026#34;powershell.exe\u0026#34; ` 15 -Argument \u0026#34;-NonInteractive -ExecutionPolicy Bypass -File C:\\Scripts\\Set-RDPCert.ps1\u0026#34; 16$trigger = New-ScheduledTaskTrigger -AtStartup 17$principal = New-ScheduledTaskPrincipal -UserId \u0026#34;SYSTEM\u0026#34; -LogonType ServiceAccount -RunLevel Highest 18$settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Hours 1) ` 19 -RestartCount 3 -RestartInterval (New-TimeSpan -Minutes 5) -StartWhenAvailable $true 20 21Register-ScheduledTask ` 22 -TaskName \u0026#34;Set-RDPCertificate\u0026#34; -TaskPath \u0026#34;\\LAB01\\\u0026#34; ` 23 -Action $action -Trigger $trigger -Principal $principal -Settings $settings ` 24 -Description \u0026#34;Binds CA certificate to RDP on every startup\u0026#34; -Force 25 26# Run immediately for first-time installation 27Start-ScheduledTask -TaskPath \u0026#34;\\LAB01\\\u0026#34; -TaskName \u0026#34;Set-RDPCertificate\u0026#34; Step 7 - Trust the Root CA Certificate on Mac Mini M1 1# RUN ON: Mac Mini M1 - Terminal (macOS) 2 3# Download the Root CA certificate 4curl -o ~/Downloads/LAB01-Root-CA.cer http://192.168.178.211/LAB01-Root-CA.cer 5 6# Install in the System Keychain as a trusted root 7sudo security add-trusted-cert \\ 8 -d \\ 9 -r trustRoot \\ 10 -k /Library/Keychains/System.keychain \\ 11 ~/Downloads/LAB01-Root-CA.cer Add both VMs in Microsoft Remote Desktop:\n192.168.178.210 - LAB01\\Administrator - WS2022-AD-DNS 192.168.178.211 - LAB01\\Administrator - WS2022-CA01 RDP connections will no longer display certificate warnings.\nVerification 1# WS2022-AD-DNS - full DC diagnostics 2dcdiag /test:Replications /test:DNS /test:KnowsOfRoleHolders /v 3 4# WS2022-CA01 - CA and Web Enrollment 5Get-Service certsvc | Select-Object Name, Status 6Get-WindowsFeature ADCS-Web-Enrollment 7Get-Service W3SVC 8netstat -an | findstr :80 9certutil -CRL 10certutil -verifystore Root \u0026#34;LAB01-Root-CA\u0026#34; 11 12# Both servers - verify the RDP certificate 13$rdpReg = \u0026#34;HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp\u0026#34; 14$thumb = (Get-ItemProperty $rdpReg -Name SSLCertificateSHA1Hash).SSLCertificateSHA1Hash 15Get-ChildItem Cert:\\LocalMachine\\My | Where-Object { $_.Thumbprint -eq $thumb } | 16 Select-Object Subject, Thumbprint, NotAfter, Issuer Download The complete manual, including all commands, the full Set-RDPCert.ps1 script, troubleshooting and reference material, is also available as a Word document:\nWS2022-Lab-Manual-EN.docx\n","date":"April 2, 2026","img":"https://1552afcb.notes-6if.pages.dev/images/ws2022-home-lab-ad-dns-ca-rdp.svg","lang":"en","langName":"English","largeImg":"","permalink":"/en/posts/ws2022-home-lab-ad-dns-ca-rdp/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Windows Server 2022","url":"/en/tags/windows-server-2022/"},{"title":"Proxmox","url":"/en/tags/proxmox/"},{"title":"Active Directory","url":"/en/tags/active-directory/"},{"title":"DNS","url":"/en/tags/dns/"},{"title":"Certificate Authority","url":"/en/tags/certificate-authority/"},{"title":"PKI","url":"/en/tags/pki/"},{"title":"Group Policy","url":"/en/tags/group-policy/"},{"title":"RDP","url":"/en/tags/rdp/"},{"title":"PowerShell","url":"/en/tags/powershell/"},{"title":"Lab","url":"/en/tags/lab/"},{"title":"Devops","url":"/en/tags/devops/"},{"title":"Security","url":"/en/tags/security/"}],"timestamp":1775116800,"title":"Windows Server 2022 Home Lab — AD DS, DNS, CA and Secured RDP"},{"authors":[{"title":"ing. M.A.C.M. (Martijn) van den Boom","url":"/en/authors/martijnvandenboom/"}],"categories":[{"title":"Windows","url":"/en/categories/windows/"}],"content":" Download as Word document\nThis is part 2 of the series on building a Windows DevOps lab in Proxmox. In part 1 I described how to create the VM. In this article I prepare the VM as a reusable Proxmox template. All future VMs — the CA server, member servers and other roles — will be cloned from this template.\nImportant: After Sysprep, never start the VM again. If you do, the generalization is consumed and the template must be rebuilt from scratch.\nOverview of steps Install VirtIO guest drivers Windows Update — fully patch the OS Apply performance optimizations Basic settings — timezone, RDP, IE Enhanced Security Sysprep — generalize and shut down Convert to template in Proxmox Step 1 — Install VirtIO guest drivers Windows Server 2022 requires VirtIO drivers to function correctly on Proxmox. They cover the storage controller, network adapter, memory ballooning, display and other paravirtualized devices.\nOpen File Explorer in the VM and navigate to the VirtIO CD drive (D: or E:). Scroll down in the file list:\nVirtIO CD drive contents — virtio-win-guest-tools.exe is at the bottom of the list (30MB Application)\nDouble-click virtio-win-guest-tools.exe (the Application, approximately 30MB). This installs all required drivers in one go. Accept the default settings and wait for the installation to complete.\nTip: Always use virtio-win-guest-tools.exe instead of individual drivers from the subfolders. It is faster and ensures nothing is missed.\nStep 2 — Windows Update Fully patching the OS before Sysprep ensures that every cloned VM starts already up to date without having to run updates individually.\n2.1 Starting Windows Update Open Settings → Update \u0026amp; Security → Windows Update and click Check for updates. Available updates will begin to download and install:\nWindows Update downloading and installing multiple updates — let this run undisturbed\n2.2 Known issue — Windows Update GUI freezes The Windows Update GUI in Server 2022 VMs is unreliable. Buttons regularly stop responding and downloads appear to hang. This is a known issue in VM environments.\nWindows Update GUI with Install Now button not responding — switch to PowerShell\nNote: When the Windows Update GUI freezes, do not try to resolve this via the GUI. Use the PowerShell method below instead.\n2.3 Recommended method — PSWindowsUpdate via PowerShell Open PowerShell as Administrator (right-click Start → Windows PowerShell (Admin)):\nPowerShell (Admin) open and ready\nStep 1 — Install the PSWindowsUpdate module:\n1Install-Module PSWindowsUpdate -Force -Confirm:$false PSWindowsUpdate module installing — type Y when prompted to install the NuGet provider or trust PSGallery\nType Y and press Enter when prompted to install the NuGet provider or trust PSGallery.\nStep 2 — Import the module and install all updates:\n1Import-Module PSWindowsUpdate 2Get-WindowsUpdate -Install -AcceptAll -AutoReboot PSWindowsUpdate running — shows status per KB article\nThe VM will restart automatically if required. Updates are applied during the restart:\nWindows applying updates during restart — do not interrupt this\nAfter the restart, log back in and run the command again until there are no more updates:\n1Get-WindowsUpdate -Install -AcceptAll -AutoReboot Windows Update showing \u0026ldquo;You\u0026rsquo;re up to date\u0026rdquo; after the first round\nRun Windows Update a second time to confirm nothing was missed. Some updates only become available after others have been installed:\nWindows Update confirmed up to date after second check — OS is fully patched\nNote: Some updates (such as KB890830 — Windows Malicious Software Removal Tool) sometimes fail persistently in VM environments. This is known and harmless — it has no impact on server functionality and can safely be skipped.\nStep 3 — Performance optimizations Apply these adjustments in PowerShell (Admin) before Sysprep so that every cloned VM automatically benefits from them:\n1# Set high performance power plan 2powercfg /setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c 3 4# Disable Windows Search indexing — not needed on servers 5Set-Service WSearch -StartupType Disabled 6Stop-Service WSearch -Force 7 8# Disable SysMain / Superfetch — not useful in VMs 9Set-Service SysMain -StartupType Disabled 10Stop-Service SysMain -Force Tip: Also change the VM Display from Default to VirtIO-GPU in the Proxmox Hardware tab. This significantly improves console responsiveness.\nStep 4 — Basic settings Run these commands in PowerShell (Admin):\n1# Set timezone to Amsterdam 2Set-TimeZone -Name \u0026#34;W. Europe Standard Time\u0026#34; 3 4# Enable RDP 5Set-ItemProperty -Path \u0026#39;HKLM:\\System\\CurrentControlSet\\Control\\Terminal Server\u0026#39; ` 6 -Name \u0026#34;fDenyTSConnections\u0026#34; -Value 0 7Enable-NetFirewallRule -DisplayGroup \u0026#34;Remote Desktop\u0026#34; 8 9# Disable NLA for easier lab access 10Set-ItemProperty -Path \u0026#39;HKLM:\\System\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp\u0026#39; ` 11 -Name \u0026#34;UserAuthentication\u0026#34; -Value 0 12 13# Disable IE Enhanced Security Configuration 14$AdminKey = \u0026#34;HKLM:\\SOFTWARE\\Microsoft\\Active Setup\\Installed Components\\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}\u0026#34; 15$UserKey = \u0026#34;HKLM:\\SOFTWARE\\Microsoft\\Active Setup\\Installed Components\\{A509B1A8-37EF-4b3f-8CFC-4F3A74704073}\u0026#34; 16Set-ItemProperty -Path $AdminKey -Name \u0026#34;IsInstalled\u0026#34; -Value 0 17Set-ItemProperty -Path $UserKey -Name \u0026#34;IsInstalled\u0026#34; -Value 0 Note: After enabling RDP via the registry, a restart is required before port 3389 starts listening. Run Restart-Computer and wait for the VM to come back.\nVerify RDP connection After the restart, verify RDP from the Proxmox host shell:\nPing successful and nc -zv confirms port 3389 open — RDP is working correctly. Get-NetFirewallRule shows all Remote Desktop rules as Enabled: True\nThe screenshot shows:\nping 192.168.178.11 — responds with 0% packet loss, network is working nc -zv 192.168.178.11 3389 — port open, RDP is listening Get-NetFirewallRule — all Remote Desktop firewall rules show Enabled: True Tip: If nc shows \u0026ldquo;Connection refused\u0026rdquo; after enabling RDP, a restart is required. RDP only starts listening after a restart.\nStep 5 — Sysprep Sysprep generalizes the installation by removing all machine-specific identifiers, including the Security Identifier (SID), computer name and hardware references. This is essential — without Sysprep every cloned VM would share the same SID, causing Active Directory conflicts.\nThis is the point of no return. After Sysprep the VM shuts itself down. Never start the VM again after this. Go directly to Proxmox and convert it to a template.\nRun in PowerShell (Admin) or the Command Prompt:\n1C:\\Windows\\System32\\Sysprep\\sysprep.exe /oobe /generalize /shutdown Flag Purpose /generalize Removes unique system identifiers — SID, computer name, hardware IDs /oobe Configures Windows to run first-time setup on next boot /shutdown Automatically shuts down the VM after completion Sysprep takes approximately 2–5 minutes. The VM shuts itself down when done.\nStep 6 — Convert to template in Proxmox Once the VM has shut itself down after Sysprep, in the Proxmox left panel:\nRight-click the VM (e.g. 900 WS2022-TEMPLATE-BASE) Select Convert to template Confirm the action The VM icon changes to a template icon (stacked pages). The VM can no longer be started directly — only cloned.\nCloning the template for new VMs To create a new VM from the template:\nRight-click the template in the Proxmox left panel Select Clone Set Mode to Full Clone — not Linked Clone Enter the new VM name according to the naming convention (e.g. WS2022-LAB02-CA) Set the VM ID Click Clone Note: Always use Full Clone. Linked clones depend on the template disk and cannot function independently. Full clones are completely independent VMs.\nAfter cloning, the new VM boots into Windows OOBE (first-time setup) where you configure the Administrator password, computer name and network settings before joining the domain.\nSummary checklist # Task Done 1 Install virtio-win-guest-tools.exe from VirtIO CD drive ☐ 2 Run PSWindowsUpdate until fully patched — repeat after each restart ☐ 3 Set high performance power plan via powercfg ☐ 3 Disable WSearch and SysMain services ☐ 3 Change Proxmox Display to VirtIO-GPU in Hardware tab ☐ 4 Set timezone to W. Europe Standard Time ☐ 4 Enable RDP and disable NLA ☐ 4 Disable IE Enhanced Security Configuration ☐ 4 Restart and verify RDP on port 3389 via nc ☐ 5 Run Sysprep: /oobe /generalize /shutdown ☐ 6 Convert VM to template in Proxmox immediately after shutdown ☐ ","date":"March 31, 2026","img":"https://1552afcb.notes-6if.pages.dev/images/ws2022-proxmox-template-preparation.svg","lang":"en","langName":"English","largeImg":"","permalink":"/en/posts/ws2022-proxmox-template-preparation/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Windows Server 2022","url":"/en/tags/windows-server-2022/"},{"title":"Proxmox","url":"/en/tags/proxmox/"},{"title":"Virtualization","url":"/en/tags/virtualization/"},{"title":"Lab","url":"/en/tags/lab/"},{"title":"Devops","url":"/en/tags/devops/"},{"title":"VirtIO","url":"/en/tags/virtio/"},{"title":"Sysprep","url":"/en/tags/sysprep/"},{"title":"Template","url":"/en/tags/template/"},{"title":"PowerShell","url":"/en/tags/powershell/"}],"timestamp":1774944000,"title":"Windows Server 2022 in Proxmox — Template Preparation"},{"authors":[{"title":"ing. M.A.C.M. (Martijn) van den Boom","url":"/en/authors/martijnvandenboom/"}],"categories":[{"title":"Windows","url":"/en/categories/windows/"}],"content":" Download as Word document\nIn this article I describe step by step how I create a Windows Server 2022 VM in Proxmox VE 9.1.6. The guide is based on real-world experience and includes all corrections and lessons learned along the way. This is part 1 of a series on building a fully functional Windows DevOps lab in Proxmox.\nLab Environment Component Value Proxmox host macpro2013.local — Mac Pro 2013 Trashcan Proxmox version 9.1.6 RAM 128 GB Storage 3.6 TB NVMe (local-lvm pool) Network bridge vmbr0 — internal lab network (192.168.178.x) Proxmox WebUI https://192.168.178.205:8006 Why a CA Is Needed — the SSL Warning Anyone who opens the Proxmox WebUI via macpro2013.local in Safari will immediately see a certificate warning. Proxmox uses a self-signed certificate by default.\nSafari displays an SSL warning for macpro2013.local — this will be resolved once the Certificate Authority is set up\nThis is exactly the motivation to set up an internal Certificate Authority (CA) later. Once that is running, Proxmox can be issued a trusted certificate and the warning will disappear.\nPrerequisites Make sure the following ISO files are available in Proxmox local storage (Proxmox WebUI → local → ISO Images):\nWindows Server 2022 Evaluation: Windows_2022_SERVER_EVAL_x64FRE_en-us.iso VirtIO drivers: virtio-win-0.1.285.iso or newer Note: Both ISOs are required. Without the VirtIO ISO, Windows Setup cannot detect the disk or network adapter.\nVM Naming Use consistent names that include the OS version and all active roles. This lets you see at a glance what each VM does in the Proxmox panel.\nPattern Example Description WS2022-LAB{nn}-{ROLES} WS2022-LAB01-AD-DNS Lab VM with all active roles in the name WS2022-LAB{nn}-CA WS2022-LAB02-CA Certificate Authority VM WS2022-TEMPLATE-{NAME} WS2022-TEMPLATE-BASE Template VM — use VM ID 900+ Renaming a VM is done via the Proxmox host shell (the WebUI has no rename option):\n1ssh root@macpro2013.local 2qm set \u0026lt;VMID\u0026gt; --name \u0026lt;NIEUWE-NAAM\u0026gt; 3 4# Voorbeeld: 5qm set 100 --name WS2022-LAB01-AD-DNS Below you can see how the Proxmox panel looks after both VMs have been correctly created and renamed:\nProxmox panel with WS2022-LAB01-AD-DNS (VM 100) and WS2022-TEMPLATE-BASE (VM 900) correctly created\nCreating a VM — the Proxmox Wizard Click Create VM (blue button at the top right) and work through all tabs as described below.\nGeneral Tab Setting Value Notes Name WS2022-TEMPLATE-BASE Descriptive name including OS and role VM ID 900 Use 900+ for templates, 100+ for lab VMs Node macpro2013 Your Proxmox host OS Tab Setting Value Notes ISO Image Windows_2022_SERVER_EVAL_x64FRE_en-us.iso Select from local storage Type Microsoft Windows Must be set explicitly Version 11/2022/2025 Must be set explicitly Add VirtIO drivers ISO Enabled (checkbox) Adds a second CD drive for the VirtIO ISO VirtIO ISO virtio-win-0.1.285.iso Select from local storage Note: Type and Version must both be set manually. The checkbox for the VirtIO ISO adds a second CD drive — this is essential for loading storage and network drivers during Windows Setup.\nSystem Tab Setting Value Notes BIOS OVMF (UEFI) Required for Windows Server 2022 Machine pc-q35 Modern chipset required for TPM 2.0 SCSI Controller VirtIO SCSI single Best storage performance EFI Storage local-lvm Must be explicitly selected — no default TPM Storage local-lvm Must be explicitly selected — no default TPM Version v2.0 Required for Windows Server 2022 Note: EFI Storage and TPM Storage have no default value — both must be explicitly selected. Without these settings the VM will not boot correctly.\nDisks Tab Setting Value Notes Bus/Device SCSI Use together with VirtIO SCSI controller Storage local-lvm NVMe-backed pool Disk Size 60 GB Sufficient for OS, roles and tools Cache Write back Best performance on NVMe Discard Enabled Enables TRIM for SSD/NVMe storage IO Thread Enabled Improves disk throughput CPU Tab Setting Value Notes Sockets 1 Single socket Cores 2 Sufficient for all lab VM roles Type host Passes through the real host CPU — better performance than the default kvm64 Note: CPU Type must be set to host. The default kvm64 limits the available CPU instruction set features and reduces performance.\nMemory Tab Setting Value Notes Memory 4096 MB 4 GB per VM Minimum Memory 4096 MB Set equal to Memory to disable ballooning Ballooning Device Disabled Not well supported on Windows Note: Ballooning must be disabled for Windows VMs. Set Minimum Memory equal to Memory. In the hardware overview this is reflected as [balloon=0].\nNetwork Tab Setting Value Notes Bridge vmbr0 Internal lab network Model VirtIO (paravirtualized) Best performance — requires VirtIO drivers Firewall Enabled (leave as default) Leave enabled — mirrors production and builds troubleshooting skills Note: Leave the Proxmox firewall enabled on the network adapter. Disabling it may seem convenient but removes an important layer that mirrors real production environments. Troubleshooting through the firewall is a valuable skill.\nHardware Verification Before First Boot After clicking Finish, do not start the VM yet. First click the VM in the left panel and select Hardware. Verify that all settings match the tables above.\nVM 900 (WS2022-TEMPLATE-BASE) — Hardware tab with correct configuration. Note balloon=0, host CPU type, both ISOs present, 60G disk with writeback/discard/iothread, EFI and TPM present.\nCheck specifically:\nMemory: 4.00 GiB [balloon=0] — balloon=0 confirms that ballooning is off Processors: 2 (1 socket, 2 cores) [host] — confirms host CPU type BIOS: OVMF (UEFI) Machine: pc-q35 SCSI Controller: VirtIO SCSI single CD/DVD ide0: virtio-win ISO present CD/DVD ide2: Windows 2022 ISO present Hard Disk: 60G, cache=writeback, discard=on, iothread=1 Network: vmbr0, firewall=1 EFI Disk and TPM State present on local-lvm Starting the VM and Windows Boot Click Start and immediately open the Console. As soon as you see the following, click inside the console window first (to capture keyboard input) and press any key:\n1Press any key to boot from CD or DVD...... Note: If you are too late, the VM will fall through to PXE boot as shown below. Simply reset the VM and try again — be ready at the console before you click Start.\nPXE boot fallback when the CD boot prompt was missed — reset the VM and try again\nIf you catch the prompt in time, the Windows Boot Manager appears:\nWindows Boot Manager — select Windows Setup [EMS Enabled] and press Enter\nSelect Windows Setup [EMS Enabled] (already highlighted) and press Enter.\nEdition Selection At the edition selection screen, choose:\nWindows Server 2022 Datacenter (Desktop Experience)\nNote: Select Datacenter, not Standard. And Desktop Experience, not Core. Core has no GUI and is therefore unsuitable for this lab template.\nLoading the VirtIO Storage Driver On the \u0026ldquo;Where do you want to install the operating system?\u0026rdquo; screen, the disk list is empty. This is normal — Windows cannot see the VirtIO SCSI disk without the driver.\nWindows Setup shows no disk — the VirtIO SCSI driver must be loaded first\nSteps to load the driver:\nClick Load driver Click Browse Navigate to the VirtIO CD drive (D: or E:) Open the folder: vioscsi \\ w2k22 \\ amd64 Click OK Select Red Hat VirtIO SCSI pass-through controller Click Next The 60 GB disk now appears in the list. Select it and continue. The Windows installation begins:\nWindows Server 2022 installation in progress — 23% complete\nAfter Installation — Server Manager After installation and restart you land on the Server Manager Dashboard. Dismiss the Windows Admin Center notification (check \u0026ldquo;Don\u0026rsquo;t show this message again\u0026rdquo;):\nServer Manager Dashboard — Windows Server 2022 Datacenter successfully installed\nThe VM is now ready for the next step: template preparation as described in part 2.\nSummary Checklist # Task Done 1 Upload Windows Server 2022 ISO to Proxmox local storage ☐ 2 Upload VirtIO drivers ISO to Proxmox local storage ☐ 3 Create VM with correct settings in all wizard tabs ☐ 4 Verify hardware configuration in Proxmox Hardware tab before starting ☐ 5 Start VM — catch the CD boot prompt immediately in the Console ☐ 6 Select Windows Server 2022 Datacenter (Desktop Experience) ☐ 7 Load VirtIO SCSI driver (vioscsi/w2k22/amd64) before disk selection ☐ 8 Complete Windows installation ☐ 9 Continue to part 2 — Template Preparation ☐ ","date":"March 30, 2026","img":"https://1552afcb.notes-6if.pages.dev/images/ws2022-proxmox-vm-creation.svg","lang":"en","langName":"English","largeImg":"","permalink":"/en/posts/ws2022-proxmox-vm-creation/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Windows Server 2022","url":"/en/tags/windows-server-2022/"},{"title":"Proxmox","url":"/en/tags/proxmox/"},{"title":"Virtualization","url":"/en/tags/virtualization/"},{"title":"Lab","url":"/en/tags/lab/"},{"title":"Devops","url":"/en/tags/devops/"},{"title":"VirtIO","url":"/en/tags/virtio/"},{"title":"VM","url":"/en/tags/vm/"}],"timestamp":1774857600,"title":"Windows Server 2022 in Proxmox — Creating a VM"},{"authors":[{"title":"ing. M.A.C.M. (Martijn) van den Boom","url":"/en/authors/martijnvandenboom/"}],"categories":[{"title":"Windows","url":"/en/categories/windows/"}],"content":"This article describes step by step how I installed Active Directory Domain Services (AD DS) and DNS on a Windows Server 2022 Datacenter VM in a VMware Fusion lab environment. The result is a fully functional domain controller for the domain lab.local, serving as the foundation for a Windows DevOps lab.\nEnvironment Component Value Virtualization VMware Fusion (macOS) Guest OS Windows Server 2022 Datacenter (Desktop Experience) Hostname DC01 Domain name lab.local NetBIOS name LAB Lab network adapter Ethernet1 — 172.16.37.10 (static IP) Internet adapter Ethernet0 — DHCP via VMware NAT Step 1 — Configure Networking Before installing Active Directory, the domain controller needs a static IP address. AD DS and DNS depend on a stable address.\nThe VM has two network adapters: one for internet access (NAT, DHCP) and one for the lab network (Private to my Mac, static IP).\n1.1 Add a Second Network Card in VMware Fusion The VM must be powered off to add a second network adapter. Go to VM \u0026gt; Settings and add a new Network Adapter. Set it to Private to my Mac.\nVMware Fusion network settings: Private to my Mac creates an isolated internal lab network\n1.2 Set a Static IP on Ethernet1 Open Control Panel \u0026gt; Network Connections. Right-click Ethernet1 \u0026gt; Properties \u0026gt; Internet Protocol Version 4 (TCP/IPv4) \u0026gt; Properties.\nFill in the following values:\nIP address: 172.16.37.10 Subnet mask: 255.255.255.0 Default gateway: leave empty Preferred DNS server: 172.16.37.10 (DC01 points to itself) IPv4 Properties: static IP 172.16.37.10 for the lab network. Leave gateway empty — internet runs through Ethernet0.\nNote: Ethernet0 (internet) stays on DHCP. Only Ethernet1 gets a static IP. This way the VM works anywhere — at home, at work, at a relative\u0026rsquo;s place — because the internal lab network is completely isolated.\n1.3 Verification Open PowerShell and verify:\n1Get-NetIPAddress -AddressFamily IPv4 | Select-Object InterfaceAlias, IPAddress Expected output:\n1Ethernet1 172.16.37.10 2Ethernet0 192.168.x.x (varies via DHCP) Step 2 — Install the AD DS Role via Server Manager 2.1 Open Server Manager Server Manager opens automatically after login. Dismiss the Windows Admin Center notification.\nCheck \u0026ldquo;Don\u0026rsquo;t show this message again\u0026rdquo; and close\nServer Manager Dashboard — the starting point for all server management\n2.2 Add a Role Click Add roles and features in the Dashboard.\nChoose Role-based or feature-based installation. DC01 is already shown as the destination server.\nDC01 is already selected in the server pool. Click Next.\n2.3 Select Active Directory Domain Services Check Active Directory Domain Services. A popup will appear asking to add required features — click Add Features.\nCheck Active Directory Domain Services in the list\nNo additional features needed. Everything required is already selected.\n2.4 AD DS Information Page Information page about AD DS. Important: DNS will be installed automatically.\n2.5 Confirm Installation Check Restart the destination server automatically if required and click Install.\nOverview of all components that will be installed\n2.6 Installation Successful Installation succeeded on DC01. Now click the blue link \u0026ldquo;Promote this server to a domain controller\u0026rdquo;.\nImportant: The AD DS role is now installed but DC01 is not yet a domain controller. The link \u0026ldquo;Promote this server to a domain controller\u0026rdquo; is the next step.\nStep 3 — Configure the Domain Controller 3.1 Deployment Configuration Choose Add a new forest and enter as Root domain name: lab.local\nChoose Add a new forest for a completely new domain. Domain name: lab.local\n3.2 Domain Controller Options Functional levels are set to Windows Server 2016 — fine for a modern lab. DNS server and Global Catalog are checked.\nSet the DSRM password. This is an emergency password for Active Directory recovery — store it safely.\nFunctional level 2016, DNS Server and Global Catalog checked. Fill in the DSRM password.\n3.3 DNS Options A warning appears that a DNS delegation cannot be created. This is normal for an internal lab domain like lab.local that doesn\u0026rsquo;t exist on the public internet. Leave Create DNS delegation unchecked.\nThe DNS delegation warning is normal for a private lab domain. No action required.\n3.4 NetBIOS Name Windows automatically sets the NetBIOS name to LAB. Wait for the field to populate.\nWait for the NetBIOS name to appear automatically\nNetBIOS name is LAB — without .local extension. You\u0026rsquo;ll log in later as LAB\\Administrator.\n3.5 File Locations The default locations are fine for a lab.\nDefault locations for AD DS database (NTDS) and SYSVOL. Leave as is.\n3.6 Review Options Verify the summary:\nDomain: lab.local NetBIOS: LAB DNS Server: Yes Global Catalog: Yes Create DNS Delegation: No Summary of the configuration. Everything looks correct — click Next.\n3.7 Prerequisites Check The green checkmark confirms all checks have passed. Yellow warnings are normal for a lab.\nGreen checkmark: All prerequisite checks passed. Click Install.\n3.8 Installation The server configures DNS and restarts automatically.\nDNS Server service is being configured. DC01 will restart automatically when done.\nAfter the reboot: Log in as LAB\\Administrator instead of the local Administrator.\nStep 4 — Verification After Installation Open PowerShell as Administrator and verify:\n1# Domain information 2Get-ADDomain 3 4# Domain controller information 5Get-ADDomainController 6 7# Check DNS zones 8Get-DnsServerZone 9 10# Test name resolution 11Resolve-DnsName dc01.lab.local If Resolve-DnsName dc01.lab.local returns IP address 172.16.37.10, DNS is working correctly.\nNext Steps Now that DC01 is functioning as a domain controller for lab.local, the next steps are:\nCA01 — Certificate Authority for internal TLS certificates (Jenkins, Harbor, Nexus) Join other VMs to lab.local — point DNS to 172.16.37.10 on each new VM Create Organisational Units and service accounts for Jenkins, Ansible and Nexus ","date":"March 27, 2026","img":"https://1552afcb.notes-6if.pages.dev/images/windows-server-2022-ad-dns.svg","lang":"en","langName":"English","largeImg":"","permalink":"/en/posts/windows_server_2022_ad_dns/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Windows","url":"/en/tags/windows/"},{"title":"Active Directory","url":"/en/tags/active-directory/"},{"title":"DNS","url":"/en/tags/dns/"},{"title":"Windows Server 2022","url":"/en/tags/windows-server-2022/"},{"title":"VMware","url":"/en/tags/vmware/"},{"title":"Lab","url":"/en/tags/lab/"},{"title":"Devops","url":"/en/tags/devops/"},{"title":"Domain Controller","url":"/en/tags/domain-controller/"}],"timestamp":1774566000,"title":"Windows Server 2022 — Active Directory and DNS Installation"},{"authors":[{"title":"ing. M.A.C.M. (Martijn) van den Boom","url":"/en/authors/martijnvandenboom/"}],"categories":[],"content":"Troubleshooting LDAPS Connectivity: Using Built-in Windows Tools to Audit Firewall Compliance As organizations move toward more secure infrastructure, migrating from standard LDAP (Port 389) to LDAPS (Port 636) is a critical step. However, this transition often reveals \u0026ldquo;silent\u0026rdquo; failures where a network firewall might allow the initial connection but block the subsequent SSL/TLS handshake.\nAt Van den Boom Online, we understand that a smooth user experience starts with a robust backend. In this guide, we’ll show you how to perform packet capturing using only built-in Windows tools to verify if your traffic is reaching its destination or being dropped by security appliances.\nWhy Packet Capture for LDAPS? When a connection fails, the error message is often a generic \u0026ldquo;Server Unavailable.\u0026rdquo; By capturing the packets, you can see the exact stage of failure:\nTCP Three-Way Handshake: Is the server even responding to the initial SYN request?\nTLS Client Hello: Is the client sending its encryption requirements?\nTLS Server Hello: Is the server responding with its certificate, or is the connection being reset (RST) by a firewall?\nStep 1: Capturing Traffic with Pktmon Since Windows 10 (Version 2004) and Windows Server 2019, Microsoft has included a powerful tool called Packet Monitor (Pktmon). You don\u0026rsquo;t need to install third-party software like Wireshark on a sensitive server to get the data you need.\nOpen an Elevated Command Prompt Right-click your Command Prompt or PowerShell and select Run as Administrator.\nSet a Filter for LDAPS To avoid \u0026ldquo;noise\u0026rdquo; from other background traffic, filter specifically for Port 636:\n1pktmon filter add -p 636 Start the Capture Run the following command to begin logging. The \u0026ndash;etw flag ensures it captures events in a format Windows can process: 1pktmon start --etw Now, attempt your LDAPS login or connection. Once the failure occurs, move to the next step.\nStop the Capture 1pktmon stop Step 2: Converting the Data for Analysis The resulting file (PktMon.etl) is a binary format. To make it readable for an AI tool or for manual inspection, you can convert it to a text format or a Wireshark-compatible file.\nTo convert to a text file for quick analysis:\n1pktmon format PktMon.etl \u0026gt; ldaps_analysis.txt Now let an AI tool analyse the text file.\nStep 3: What to Look For Once you open your log, look for the following sequence to determine if the firewall is the culprit:\nSYN -\u0026gt; SYN-ACK -\u0026gt; ACK: If you see this, the TCP layer is open. Your firewall allows basic connectivity.\nClient Hello: The client sends this to start the TLS process.\nMissing Server Hello: If you see a \u0026ldquo;Client Hello\u0026rdquo; followed by a TCP RST (Reset) or no response at all, your firewall is likely performing \u0026ldquo;Deep Packet Inspection\u0026rdquo; (DPI) and blocking the encrypted traffic because it doesn\u0026rsquo;t recognize the certificate or the TLS version.\nConclusion Connectivity issues shouldn\u0026rsquo;t be a guessing game. By using pktmon, you can prove exactly where the chain breaks. If you see a successful TCP handshake but a failed TLS \u0026ldquo;Hello\u0026rdquo; exchange, you have the evidence needed to request a firewall policy change from your network team.\nAre you looking to secure your online platforms or optimize your server communication? Van den Boom Online provides the technical expertise to ensure your digital infrastructure is both fast and secure. Contact us today to learn more.\n","date":"January 18, 2026","img":"https://1552afcb.notes-6if.pages.dev/images/windows-packet-capturing-ldaps.svg","lang":"en","langName":"English","largeImg":"","permalink":"/en/posts/windows_packet_capturing/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Windows","url":"/en/tags/windows/"},{"title":"LDAPS","url":"/en/tags/ldaps/"},{"title":"TLS","url":"/en/tags/tls/"},{"title":"Networking","url":"/en/tags/networking/"},{"title":"Security","url":"/en/tags/security/"},{"title":"Pktmon","url":"/en/tags/pktmon/"}],"timestamp":1768763941,"title":"Windows Packet Capturing for LDAPS Analysis"},{"authors":[{"title":"ing. M.A.C.M. (Martijn) van den Boom","url":"/en/authors/martijnvandenboom/"}],"categories":[],"content":"Create a Ubuntu Virtual Machine with: 32 GB RAM 8 cores 120 GB HD\nStep-by-step: Install AWX 24.6.1 on Minikube (Ubuntu)\n🔧 1. System Preparation\n1$ sudo apt update \u0026amp;\u0026amp; sudo apt upgrade -y 2$ sudo apt install -y curl wget apt-transport-https ca-certificates gnupg lsb-release software-properties-common 3$ sudo timedatectl set-timezone Europe/Amsterdam 📦 2. Install Docker (Minikube backend)\n1$ curl -fsSL https://get.docker.com | sudo bash 2$ sudo usermod -aG docker $USER 3$ newgrp docker # Activate group without reboot 4 5Enable and start Docker: 6$ sudo systemctl enable docker 7$ sudo systemctl start docker 8 9Test: 10$ docker run hello-world 🧱 3. Install Minikube\n1$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 2$ sudo install minikube-linux-amd64 /usr/local/bin/minikube 3 4Test: 5$ minikube version ⚙️ 4. Install kubectl (Kubernetes CLI)\n1$ curl -LO \u0026#34;https://dl.k8s.io/release/$(curl -Ls https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl\u0026#34; 2$ sudo install kubectl /usr/local/bin/kubectl 3 4Test: 5$ kubectl version --client 🚀 5. Start Minikube\n1$ minikube start --cpus=4 --memory=8192 --driver=docker 2 3Optional: Set as default 4$ minikube config set memory 8192 5$ minikube config set cpus 4 6$ minikube config set driver docker 📁 6. Install AWX Operator (matching 24.6.1)\n1$ git clone https://github.com/ansible/awx-operator.git 2$ cd awx-operator 3$ git checkout 2.14.0 # Matches AWX 24.6.1 4 5Install required tools: 6$ sudo apt install -y make 7 8Install the operator: 9$ make deploy 10 11Verify: 12$ kubectl get pods -n awx 📄 7. Create AWX Instance (CR)\nCreate a file awx.yaml:\n1apiVersion: awx.ansible.com/v1beta1 2kind: AWX 3metadata: 4 name: awx 5spec: 6 service_type: nodeport 7 ingress_type: none 8 image: quay.io/ansible/awx 9 image_version: 24.6.1 10 postgres_storage_class: standard 11 postgres_resource_requirements: 12 requests: 13 memory: 512Mi 14 cpu: 250m 15 limits: 16 memory: 1Gi 17 cpu: 500m 18 web_resource_requirements: 19 requests: 20 memory: 512Mi 21 cpu: 250m 22 limits: 23 memory: 2Gi 24 cpu: 1 25 26Then apply it: 27$ kubectl apply -f awx.yaml -n awe 28 29Watch deployment: 30$ kubectl get awx -n awx 31$ kubectl get pods -n awx -w 32 33$ kubectl get svc -n awx 🌐 8. Access AWX Web UI\n1Get the NodePort: 2$ kubectl get svc -n awx | grep awx-service 3 4Example output: 5awx-service NodePort 10.0.0.94 \u0026lt;none\u0026gt; 8052:30437/TCP 5m 6awx-service NodePort 10.98.159.10 \u0026lt;none\u0026gt; 80:30153/TCP 5m29s 7 8Then: 9$ minikube ip 10 11Get NodePort: 12$ kubectl get svc awx-service -n awx -o yaml 13 14$ minikube service awx-service -n awx 15 16Or open in browser: 17http://\u0026lt;your-server-ip\u0026gt;:\u0026lt;NodePort\u0026gt; 18http://192.168.49.2:30153/ 🔐 9. Login credentials Get admin password:\n1$ kubectl get secret awx-admin-password -n awx -o jsonpath=\u0026#34;{.data.password}\u0026#34; | base64 --decode \u0026amp;\u0026amp; echo 2* Username: admin 3* Password: output from above 🧼 10. (Optional) Enable Minikube dashboard Kubernetes Dashboard\n1$ minikube dashboard Step-by-Step: Auto-start AWX on Minikube after Reboot\n🔁 1. Enable Docker to start at boot\n1$ sudo systemctl enable docker 🚀 2. Create a systemd service to auto-start Minikube Create a new systemd unit:\n1$ sudo vim /etc/systemd/system/minikube.service 2Paste this: 3 4[Unit] 5Description=Minikube K8s Cluster 6After=docker.service 7Requires=docker.service 8 9[Service] 10Type=oneshot 11ExecStart=/usr/local/bin/minikube start --driver=docker 12RemainAfterExit=yes 13User=your-username 14Environment=HOME=/home/your-username 15WorkingDirectory=/home/your-username 16 17[Install] 18WantedBy=multi-user.target 19 20🔧 Replace your-username with your actual Linux username. 21 22Save and run: 23$ sudo systemctl daemon-reexec 24$ sudo systemctl daemon-reload 25$ sudo systemctl enable minikube.service 26 27Test it manually: 28$ sudo systemctl start minikube.service 29 30$ kubectl get pods -n awx -w 31NAME READY STATUS RESTARTS AGE 32awx-migration-24.6.1-pn969\t0/1 Completed 0 21m 33awx-operator-controller-manager-68699bb54-pscct 2/2 Running 2 (64s ago) 68m 34awx-postgres-15-0 1/1 Running 1 (58s ago) 26m 35awx-task-86d87f596c-xm8wx 4/4 Running 4 (62s ago) 25m 36awx-web-7c76dcb5b8-ctmrf 3/3 Running 3 (54s ago) 25m 🛠️ 3. Ensure AWX Operator and AWX pods auto-recover Kubernetes handles pod recovery automatically. As long as Minikube starts correctly and the AWX Operator was deployed with: make deploy …it will recreate your AWX custom resource and pods on reboot. You can confirm with:\n1$ kubectl get pods -n awx 🌐 4. Make NodePort consistent (optional) Kubernetes assigns a random NodePort unless you explicitly set it. To make access reliable:\n1$ kubectl patch svc awx-service -n awx --type=\u0026#39;json\u0026#39; -p=\u0026#39;[ 2 {\u0026#34;op\u0026#34;: \u0026#34;replace\u0026#34;, \u0026#34;path\u0026#34;: \u0026#34;/spec/type\u0026#34;, \u0026#34;value\u0026#34;:\u0026#34;NodePort\u0026#34;}, 3 {\u0026#34;op\u0026#34;: \u0026#34;replace\u0026#34;, \u0026#34;path\u0026#34;: \u0026#34;/spec/selector\u0026#34;, \u0026#34;value\u0026#34;:{ 4 \u0026#34;app.kubernetes.io/component\u0026#34;: \u0026#34;awx\u0026#34;, 5 \u0026#34;app.kubernetes.io/managed-by\u0026#34;: \u0026#34;awx-operator\u0026#34;, 6 \u0026#34;app.kubernetes.io/name\u0026#34;: \u0026#34;awx-web\u0026#34; 7 }}, 8 {\u0026#34;op\u0026#34;: \u0026#34;replace\u0026#34;, \u0026#34;path\u0026#34;: \u0026#34;/spec/ports/0/nodePort\u0026#34;, \u0026#34;value\u0026#34;:31082} 9]\u0026#39; 10 11 12$ vim awx-nodeport-service.yaml 13 14apiVersion: v1 15kind: Service 16metadata: 17 name: awx-service 18 namespace: awx 19spec: 20 type: NodePort 21 selector: 22 app: awx # Make sure this matches your pod labels 23 ports: 24 - protocol: TCP 25 port: 80 # Service port inside the cluster 26 targetPort: 8052 # Port your pod/container listens on 27 nodePort: 31082 # The static NodePort you want to assign 28 29Re-apply: 30$ kubectl apply -f awx-nodeport-service.yaml 31 32Then your UI is always at: 33http://\u0026lt;server-ip\u0026gt;:31082 🧪 5. Verify after reboot Reboot the server:\n1$ sudo reboot 2 3After boot: 4$ minikube status 5$ kubectl get pods -n awx Check UI:\n1$ minikube ip 2http://\u0026lt;your-server-ip\u0026gt;:31082 ","date":"July 2, 2025","img":"https://1552afcb.notes-6if.pages.dev/images/ansible-awx-minikube.svg","lang":"en","langName":"English","largeImg":"","permalink":"/en/posts/ansible_awx/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Install","url":"/en/tags/install/"},{"title":"Ansible","url":"/en/tags/ansible/"},{"title":"Minikube","url":"/en/tags/minikube/"},{"title":"Ubuntu","url":"/en/tags/ubuntu/"},{"title":"AWX","url":"/en/tags/awx/"}],"timestamp":1751456125,"title":"Install Ansible AWX 24.6.1 in Minikube on Ubuntu 24.04.2 LTS in a Single VM"},{"authors":[{"title":"ing. M.A.C.M. (Martijn) van den Boom","url":"/en/authors/martijnvandenboom/"}],"categories":[],"content":"Attention: I have not been able to make it restart automatically after a reboot! Perhaps it is better to look into making it run in Minikube? Create a Red Hat 9 Virtual Machine with: 32 GB RAM 8 cores 120 GB HD\n1$ sudo hostnamectl hostname aap.vandenboom.local Download the Ansible Automation Platform 2.5 Containerized Setup Bundle from: https://access.redhat.com/downloads/content/480/ver=2.5/rhel---9/2.5/x86_64/product-software\n1$ tar zxvf ansible*.tar.gz 2 3$ sudo vim /etc/hosts 4localhost aap.vandenboom.local 5 6$ ping aap.vandenboom.local 7 8$ sudo dnf install -y podman git python3-pip rsync tar jq unzip 9 10$ podman login registry.redhat.io 11 12$ sudo dnf install ansible-core wget 13 14$ python3 -m pip install virtualenv 15$ pip3 install ansible 16 17$ vim inventory 18Edit the settings as seen below 19 20$ time ansible-playbook -i inventory ansible.containerized_installer.install -K This is the contents of the file: ./inventory\n1# This is the AAP enterprise installer inventory file 2# Please consult the docs if you\u0026#39;re unsure what to add 3# For all optional variables please consult the included README.md 4# or the Red Hat documentation: 5# https://docs.redhat.com/en/documentation/red_hat_ansible_automation_platform/2.5/html/containerized_installation 6 7# This section is for your AAP Gateway host(s) 8# ----------------------------------------------------- 9[automationgateway] 10#gateway1.example.org 11#gateway2.example.org 12aap.vandenboom.local ansible_connection=local 13 14# This section is for your AAP Controller host(s) 15# ----------------------------------------------------- 16[automationcontroller] 17#controller1.example.org 18#controller2.example.org 19aap.vandenboom.local ansible_connection=local 20 21# This section is for your AAP Execution host(s) 22# ----------------------------------------------------- 23[execution_nodes] 24#hop1.example.org receptor_type=\u0026#39;hop\u0026#39; 25#exec1.example.org 26#exec2.example.org 27 28# This section is for your AAP Automation Hub host(s) 29# ----------------------------------------------------- 30[automationhub] 31#hub1.example.org 32#hub2.example.org 33aap.vandenboom.local ansible_connection=local 34 35# This section is for your AAP EDA Controller host(s) 36# ----------------------------------------------------- 37[automationeda] 38#eda1.example.org 39#eda2.example.org 40aap.vandenboom.local ansible_connection=local 41 42#[redis] 43#gateway1.example.org 44#gateway2.example.org 45#hub1.example.org 46#hub2.example.org 47#eda1.example.org 48#eda2.example.org 49 50[database] 51aap.vandenboom.local ansible_connection=local 52 53[all:vars] 54 55# Ansible 56ansible_connection=local 57 58# Common variables 59# https://docs.redhat.com/en/documentation/red_hat_ansible_automation_platform/2.5/html/containerized_installation/appendix-inventory-files-vars#ref-general-inventory-variables 60# ----------------------------------------------------- 61postgresql_admin_username=postgres 62postgresql_admin_password=ansible 63bundle_install=true 64# The bundle directory must include /bundle in the path 65bundle_dir=\u0026#39;{{ lookup(\u0026#34;ansible.builtin.env\u0026#34;, \u0026#34;PWD\u0026#34;) }}/bundle\u0026#39; 66 67registry_username=\u0026lt;your_account\u0026gt; 68registry_password=\u0026lt;your_password\u0026gt; 69 70redis_mode=standalone 71 72# AAP Gateway 73# https://docs.redhat.com/en/documentation/red_hat_ansible_automation_platform/2.5/html/containerized_installation/appendix-inventory-files-vars#ref-gateway-variables 74# ----------------------------------------------------- 75gateway_admin_password=ansible 76gateway_pg_host=aap.vandenboom.local 77gateway_pg_database=gateway 78gateway_pg_username=gateway 79gateway_pg_password=ansible 80 81# AAP Controller 82# https://docs.redhat.com/en/documentation/red_hat_ansible_automation_platform/2.5/html/containerized_installation/appendix-inventory-files-vars#ref-controller-variables 83# ----------------------------------------------------- 84controller_admin_password=ansible 85controller_pg_host=aap.vandenboom.local 86#controller_pg_host= 87controller_pg_database=controller 88controller_pg_username=controller 89controller_pg_password=ansible 90 91# AAP Automation Hub 92# https://docs.redhat.com/en/documentation/red_hat_ansible_automation_platform/2.5/html/containerized_installation/appendix-inventory-files-vars#ref-hub-variables 93# ----------------------------------------------------- 94hub_admin_password=ansible 95hub_pg_host=aap.vandenboom.local 96hub_pg_database=hub 97hub_pg_username=hub 98hub_pg_password=ansible 99 100# AAP EDA Controller 101# https://docs.redhat.com/en/documentation/red_hat_ansible_automation_platform/2.5/html/containerized_installation/appendix-inventory-files-vars#event-driven-ansible-controller 102# ----------------------------------------------------- 103eda_admin_password=ansible 104eda_pg_host=aap.vandenboom.local 105eda_pg_database=eda 106eda_pg_username=eda 107eda_pg_password=ansible I ran the playbook command with timing it. The total time it took is shown by the real time: ⏱ Total time: 108 minutes and 35.856 seconds = 1 hour, 48 minutes, 36 seconds\n","date":"June 29, 2025","img":"https://1552afcb.notes-6if.pages.dev/images/ansible-automation-platform.svg","lang":"en","langName":"English","largeImg":"","permalink":"/en/posts/ansible_automation_platform/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"RedHat","url":"/en/tags/redhat/"},{"title":"RHEL","url":"/en/tags/rhel/"},{"title":"Ansible","url":"/en/tags/ansible/"},{"title":"Automation","url":"/en/tags/automation/"},{"title":"Platform","url":"/en/tags/platform/"}],"timestamp":1751231408,"title":"Install Red Hat Ansible Automation Platform 2.5 in a Single VM"},{"authors":[{"title":"ing. M.A.C.M. (Martijn) van den Boom","url":"/en/authors/martijnvandenboom/"}],"categories":[],"content":"When comparing Kubernetes with OpenShift (Red Hat\u0026rsquo;s Kubernetes-based platform), there are several key differences that affect how they handle resource consumption and system resources. While OpenShift is built on top of Kubernetes, there are additional functionalities and differences that impact the resource requirements:\nAdditional Functionalities in OpenShift OpenShift offers more out-of-the-box functionality than Kubernetes. This can lead to higher overhead, but also to more ease of use and integration: Security: OpenShift adds extra security layers, such as Security Context Constraints (SCC) and SELinux restrictions, which may require additional resources for securing containers and applications.\nIntegrated CI/CD: OpenShift provides built-in Continuous Integration/Continuous Deployment (CI/CD) tools, like OpenShift Pipelines, which require more resources to manage pipelines and execute builds.\nRegistry: OpenShift includes an integrated container registry, which can lead to additional storage and network consumption if you store and manage many images.\nThese extra functionalities may increase resource usage compared to a standard Kubernetes cluster that you might configure yourself with external tools.\nCluster Management Kubernetes gives you full control over how your cluster and resources are managed. If you set up a Kubernetes cluster yourself, you can optimize the configuration and choice of components for your specific needs. This can result in a more streamlined, resource-efficient implementation, as long as you know what you\u0026rsquo;re doing.\nOpenShift comes with a pre-configured cluster environment that is more structured. The default configurations in OpenShift focus on easier management and security, but this also means that there is more overhead due to the pre-enabled features. Since OpenShift includes many things by default (such as security, logging, monitoring, and networking), it often consumes more resources than a barebones Kubernetes cluster.\nResource Usage in Scaling Kubernetes has a very dynamic and flexible scaling mechanism. For example, if you have applications running on Kubernetes, you can define your own scaling strategies, such as scaling based on CPU or memory usage (with the Horizontal Pod Autoscaler, HPA). This offers a high degree of control over resource usage, but you must be careful not to request unnecessary extra resources.\nOpenShift also offers autoscaling functionality, but it may be more focused on \u0026ldquo;best practices.\u0026rdquo; This means that OpenShift may sometimes scale more aggressively, depending on the pre-configured policies. This can lead to higher resource consumption, especially in larger environments.\nNetworking and Storage Kubernetes gives you the freedom to choose your own networking and storage solutions, which means you might choose an optimized solution with less overhead. For example, if you use a lightweight networking solution, your resource consumption could be lower.\nOpenShift has its own network stack and storage integration. This means you\u0026rsquo;re using Red Hat\u0026rsquo;s solutions for networking and storage, which simplifies integration and management, but may require more resources for managing these built-in services.\nUpdates and Maintenance Kubernetes does not have built-in methods for updating and maintaining the cluster. This can lead to a lighter load on system resources, but requires manual actions and knowledge to manage effectively.\nOpenShift provides a robust way to automatically update and maintain the cluster, which reduces the administrative burden but also uses additional resources to manage these processes. Since OpenShift offers more features, such as logging, monitoring, and native support for updating the entire platform, it can be more resource-intensive than standard Kubernetes.\nResource Optimization Kubernetes offers a higher degree of control over resource usage. You can set resource limits for each pod and container, giving you a good view of how efficiently your cluster is running. However, these adjustments need to be made manually.\nOpenShift also provides resource management, but because it has more automated processes, it may sometimes be less flexible in how it allocates resources. On the other hand, this is also useful for businesses that don’t want to micromanage, as the platform handles many things automatically.\nConclusion:\nKubernetes is generally \u0026ldquo;lighter\u0026rdquo; when it comes to resource usage because you have full control over what runs in the cluster and how it is managed. If you want a minimalist approach, you can have a very optimized Kubernetes cluster, depending on your configuration.\nOpenShift, on the other hand, adds many additional features and configurations (such as CI/CD integration, built-in security, and logging), which results in higher resource consumption. However, it also offers benefits in terms of ease of management, security, and out-of-the-box functionality, making it especially attractive for companies that want to spend less time on cluster management and focus more on their applications.\nSo, if you\u0026rsquo;ve seen the warning about Kubernetes burning resources before, this might actually apply even more to OpenShift. When looking purely at resource consumption, Kubernetes is often more efficient, but OpenShift offers a more comprehensive and user-friendly experience, although that comes with a higher resource burden.\n","date":"March 29, 2025","img":"https://1552afcb.notes-6if.pages.dev/images/openshift-kubernetes-vergelijking.svg","lang":"en","langName":"English","largeImg":"","permalink":"/en/posts/pas_op_met_openshift/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Kubernetes","url":"/en/tags/kubernetes/"},{"title":"Resources","url":"/en/tags/resources/"}],"timestamp":1743257743,"title":"A Comparison of the Resource Usage of Kubernetes and OpenShift"},{"authors":[{"title":"ing. M.A.C.M. (Martijn) van den Boom","url":"/en/authors/martijnvandenboom/"}],"categories":[],"content":"The statement \u0026ldquo;beware of Kubernetes, it burns through your resources\u0026rdquo; refers to the fact that Kubernetes, although a powerful and flexible solution for orchestrating containerized applications, can consume a relatively large amount of system resources (such as CPU, memory, and storage).\nThis is due to several factors:\nKubernetes has overhead: Kubernetes itself runs as a cluster of various components, such as the API server, scheduler, controller manager, and more. These components run on the control plane and need to be managed. This adds extra overhead to your system, meaning that the resources Kubernetes itself uses are added on top of the applications you are actually running.\nComplexity of cluster management: In larger Kubernetes clusters, the amount of computing power required can increase due to the management of multiple nodes, workloads, and the associated control mechanisms. This can lead to increased resource consumption, especially if the cluster is not well-configured.\nScaling applications: Kubernetes is designed to automatically scale your applications based on load. However, depending on your configuration, Kubernetes might start additional pods or reserve resources, even if they are not actually being used, which can waste resources.\nComplex networks and services: Kubernetes uses complex networking layers for managing communication between pods and services. This can impact performance and consume additional network resources. The network connections between the various Kubernetes components can also contribute to higher resource costs in some cases.\nUse of on-demand services: Kubernetes makes use of cloud-based infrastructures for auto-scaling, meaning the cluster may sometimes request more resources than necessary. For example, if you don\u0026rsquo;t properly configure when certain resources should be scaled up, it could require unnecessary capacity.\nIn short, Kubernetes is extremely powerful and offers many benefits for large and complex applications, but it consumes significant amounts of resources, especially if it\u0026rsquo;s not properly tuned to your needs. It\u0026rsquo;s important to configure and optimize it well so that you don’t waste resources unnecessarily.\n","date":"March 29, 2025","img":"https://1552afcb.notes-6if.pages.dev/images/kubernetes-resources-warning.svg","lang":"en","langName":"English","largeImg":"","permalink":"/en/posts/pas_op_met_kubernetes/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Kubernetes","url":"/en/tags/kubernetes/"},{"title":"Resources","url":"/en/tags/resources/"}],"timestamp":1743256843,"title":"The Statement 'Beware of Kubernetes, It Burns Through Your Resources'"},{"authors":[{"title":"ing. M.A.C.M. (Martijn) van den Boom","url":"/en/authors/martijnvandenboom/"}],"categories":[],"content":"Concurrency might sound like a technical term, but it boils down to a program performing multiple tasks at once, as if it’s multitasking. Imagine you’re cooking: while the pasta is on the stove, you start the washing machine and charge your phone. Although you’re not doing everything at the exact same moment, it all happens smoothly side by side. Software that supports concurrency works the same way: a program can, for instance, download files, perform calculations, and send data to a server all at once. This multitasking makes the use of computing power more efficient and ensures faster, smoother performance.\nGolang / Go excels at making concurrency simple and intuitive. Using so-called goroutines, Go offers a lightweight and efficient solution for multitasking, unlike traditional threads in, say, Java. Java threads often consume significant amounts of memory (typically megabytes per thread), whereas goroutines are much lighter and demand fewer system resources. This makes Go particularly well-suited for modern applications like microservices, where scalability plays a key role.\nClassic mistakes are avoided\nWith Go, common multitasking issues are effectively sidestepped. This makes it more reliable than traditional solutions. It helps you avoid classic errors such as:\nRace conditions: Issues caused by simultaneous data access. Deadlocks: Situations where processes block each other. Resource leaks: Inefficient use of system resources. These advantages make Go not only powerful but also a stable choice for companies looking to develop efficient, error-free software.\nReal-time systems and alternatives\nWhile Go is exceptional in its simplicity and strength, it’s less suited for real-time systems. That’s because Go has a garbage collector, a feature that automatically frees up unused memory space. While this is handy for most applications, it can occur at unexpected moments and cause delays. The same applies to Java, which also relies on garbage collection. For real-time systems, where every millisecond counts, languages like C, C++, and Rust are better options. These languages provide direct control over memory management and are designed with performance and predictability in mind.\nAn interesting approach is to combine the best of both worlds. For real-time requirements, you can write modules in C, C++, or Rust and integrate them with Go, for example. This way, you benefit from Go’s simplicity and scalability while leveraging the reliability and speed of languages like C or Rust.\nGo offers a modern, efficient solution for concurrent software and helps prevent classic mistakes. For situations where real-time performance is critical, languages like C or Rust provide a robust foundation. With the right combinations, you can tackle almost any challenge! Feel free to reach out if you’d like to know more or need advice. 😊\nP.S. The information I’ve found here sparks my imagination and has made me curious to dig deeper and see what I can prove myself. However, in an attempt to demonstrate and compare actual memory statistics, some things aren’t as straightforward as they seem. The memory usage of goroutines heavily depends on how much memory is allocated through them rather than having a clear initial memory footprint. So, I’m testing the information I’ve found and the claims made within it.\n","date":"March 22, 2025","img":"https://1552afcb.notes-6if.pages.dev/images/golang-go-concurrency.svg","lang":"en","langName":"English","largeImg":"","permalink":"/en/posts/golang_go_concurrency/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Golang","url":"/en/tags/golang/"},{"title":"Go","url":"/en/tags/go/"},{"title":"Multitasking","url":"/en/tags/multitasking/"},{"title":"Concurrency","url":"/en/tags/concurrency/"}],"timestamp":1742673643,"title":"Golang / Go: The Smart Programming Language for Efficient Software and Concurrency"},{"authors":[],"categories":[],"content":"","date":"February 23, 2025","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/contact/","series":[],"smallImg":"","tags":[],"timestamp":1740268800,"title":"Contact"},{"authors":[],"categories":[],"content":"Thank you for your message!\nWe appreciate you reaching out to us. Our team is on it and will get back to you as soon as possible.\nIf you have any questions in the meantime, feel free to send us another message!\n","date":"February 14, 2025","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/thank-you/","series":[],"smallImg":"","tags":[],"timestamp":1739491200,"title":"Thank You"},{"authors":[],"categories":[],"content":" BIOGRAPHY Martijn is an experienced IT professional with more than 26 years of experience in information technology, infrastructure management, and automation. Throughout his career, he has worked in complex enterprise and government environments, contributing to projects for organizations such as CGI, Rijkswaterstaat, ProRail, and the Municipality of ’s-Hertogenbosch.\nHis work has focused on system administration, automation, monitoring, networking, and the design of reliable and scalable IT infrastructures.\nBACKGROUND\nMartijn’s fascination with computers started during his Constructional Engineering studies (HBO Bouwkunde) in Tilburg in the late 1990s, when he was introduced to Microsoft Visual Basic programming. Building small applications and seeing how software could automate repetitive work sparked a lasting passion for computing and software development.\nThat curiosity gradually evolved into a long-term professional career in IT and automation.\nCORE EXPERTISE\nPython development Ansible automation Bash and PowerShell scripting Linux systems administration Network management and monitoring platforms CI/CD practices Improving reliability and efficiency through automation has remained a central theme throughout his work.\nMENTORING AND EDUCATION\nAlongside his professional career, Martijn has also been active in mentoring and education. Volunteer work has included teaching computer skills, mentoring secondary school students, and introducing programming concepts using C# (Visual Studio) and Python (Spyder/Anaconda).\nSUSTAINABILITY AND INTERNATIONAL INITIATIVES\nMartijn is also involved in sustainability and international development initiatives. One example is a Black Soldier Fly (BSF) farming project in Uganda, developed in collaboration with Foundation Foods Ltd. The project focuses on producing sustainable insect protein for animal feed while recycling organic waste.\nIn addition, Martijn has worked on the concept and design of the Planet Protection Polyethylene Waste Collection Payment System. This concept aims to improve plastic waste collection by allowing collectors to bring polyethylene waste to local collection points and receive digital payments based on weight, supporting both environmental protection and local economic opportunity.\nPERSONAL\nMartijn currently lives in Utrecht, the Netherlands, together with his wife. Technology, automation, and sustainable innovation continue to be central motivations in both his professional work and personal initiatives.\nSPONSORSHIP\nWould you like to support my work?\nko-fi.com/martijnvandenboom paypal.me/ingmacmvandenboom buymeacoffee.com/ingvdboom ","date":"February 13, 2025","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/about/","series":[],"smallImg":"","tags":[],"timestamp":1739404800,"title":"About"},{"authors":[],"categories":[],"content":"Creating animations service Creating animations service\nBring Your Ideas to Life with Stunning Animations\nAt \u0026ldquo;van den Boom Animations\u0026rdquo;, we specialize in crafting custom animations that captivate and engage your audience. Whether you\u0026rsquo;re looking to enhance your website, advertise your brand, or add an eye-catching effect to your project, our team is here to transform your vision into motion. From smooth transitions and dynamic visuals to attractive animations, we offer tailored solutions to make your content stand out. Let us help you tell your story through the magic of animation!\nWhat We Offer:\nWe offer a wide range of animation services to suit every need. Whether you\u0026rsquo;re looking for dynamic website animations, engaging social media visuals, or motion graphics for your next video project, we’ve got you covered. Our expertise includes everything from logo animations to 2D/3D motion graphics. We work closely with you to create custom animations that align with your brand, style, and goals, ensuring your message is delivered in the most captivating way possible.\nHow It Works:\nGetting started with us is simple and hassle-free. First, we’ll have a conversation to understand your vision, project goals, and the animation style you\u0026rsquo;re looking for. Then, our creative team will craft a concept tailored to your needs and share initial designs or storyboards. Once you’re happy with the direction, we move into production, where we bring the animation to life with attention to detail and quality. Throughout the process, we keep you involved with regular updates, ensuring the final result exceeds your expectations. From start to finish, we’re here to make your animation experience smooth and enjoyable. Best regards,\nMartijn P.S. Please note: This service is based on the contributions agreed upon by both parties. If we successfully provide you with excellent service and you are satisfied with the outcome, we would greatly appreciate positive feedback that we can showcase publicly and include in our portfolio. Creating animations service\nExamples:\n1. The rotating letter: \"van den Boom Animations\" this rotating letter \"B\" is one of the first ideas that came to me when I started exploring the world of web design and animations. A website can become much more entertaining and lively through these small yet powerful details – the animations that surprise the user and enrich the experience. Adding subtle movements, such as rotating an element or making an image glow, creates a more dynamic and engaging website. My goal is to bring that magic, so every website we create has that little extra touch, something that visitors not only notice but also appreciate. 2. The burning flame: Our flame animation symbolizes the burning creativity that we put into every project. Just like a flame that constantly dances and changes, we give your ideas energy and movement. Whether you're looking for a dynamic element for your website or a visual effect that captures attention, our flames elevate your project to the next level. Watch how the flame lights up and moves, just like our creative processes! 3. The company logo: Our company logo is itself a living animation. The text \u0026lt;VDB/\u0026gt; is typed out character by character — like a developer writing code — followed by a gently blinking cursor. After a brief pause, the sequence starts over, a constant reminder that we are always building something new. The combination of programming-language syntax and monospace typography reflects exactly who we are: a technical company that brings creativity and craftsmanship together in every solution we deliver. _ Digital Services ","date":"February 11, 2025","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/animations/","series":[],"smallImg":"","tags":[],"timestamp":1739232000,"title":"Animations"},{"authors":[],"categories":[{"title":"Deployment","url":"/en/categories/deployment/"}],"content":" Requirements DigitalOcean Account Create Dockerfile Create the Dockerfile on your site root.\nOur starter template already includes the Dockerfile.\n1############### 2# Build Stage # 3############### 4FROM hugomods/hugo:exts as builder 5 6COPY . /src 7 8ENV HUGO_ENV=production 9 10# Base URL 11ARG HUGO_BASEURL= 12ENV HUGO_BASEURL=${HUGO_BASEURL} 13 14# Module Proxy 15ARG HUGO_MODULE_PROXY= 16ENV HUGO_MODULE_PROXY=${HUGO_MODULE_PROXY} 17 18# NPM mirrors, such as https://registry.npmmirror.com 19ARG NPM_CONFIG_REGISTRY= 20ENV NPM_CONFIG_REGISTRY=${NPM_CONFIG_REGISTRY} 21 22# Install dependencies 23RUN npm ci 24 25# Build site 26RUN hugo --minify --gc --enableGitInfo 27 28# Set the fallback 404 page if defaultContentLanguageInSubdir is enabled, please replace the `en` with your default language code. 29# RUN cp ./public/en/404.html ./public/404.html 30 31############### 32# Final Stage # 33############### 34FROM hugomods/hugo:nginx 35COPY --from=builder /src/public /site The /site is the output directory of static files, which will be used later. Create App Navigate to DigitalOcean Dashboard -\u0026gt; Left Panel -\u0026gt; Apps -\u0026gt; Create App, and then fill up the form as follows.\nTweak Resources In this step, we\u0026rsquo;ll need to tweak the resources, since currently DigitalOcean app platform Buildpack unable to detect Hugo sites those configured via configuration directory.\nYou may see multiple resources as image above shown, you\u0026rsquo;ll need to remove unnecessary resources except the one in type Dockerfile.\nEdit Dockerfile Resources Since the web service isn\u0026rsquo;t non free, so we need to edit the Dockerfile resource to be a static site.\nClick the Edit button on the right of the Dockerfile resource, then you\u0026rsquo;ll be navigated to the resource setting panel. Edit the Resource Type and change it to Static Site. Edit the Output Directory and set it as /site. Once done, you will get the above similar settings, now let\u0026rsquo;s click the Back button to check the resources.\nIf everything goes fine, you should got only one resource, which is in type Static Site | Dockerfile.\nReview Please reviewing the billing section, you won\u0026rsquo;t be charged if you deploy not more than 3 static sites.\nPlease note that exceeded transfer usage will be charged, read more on pricing.\nDeploy It\u0026rsquo;s time to deploy site by clicking the Create Resources button if everything is OK.\nWhat’s Next? Once the app was created, it will deploy automatically, you can check the build logs if something go wrong.\nYou\u0026rsquo;ll able to customize domain after deploying successfully.\n","date":"January 21, 2024","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/deployment/digitalocean-app-platform/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"DigitalOcean","url":"/en/tags/digitalocean/"},{"title":"Docker","url":"/en/tags/docker/"},{"title":"Dockerfile","url":"/en/tags/dockerfile/"},{"title":"Buildpack","url":"/en/tags/buildpack/"}],"timestamp":1705820419,"title":"Deploy on DigitalOcean App Platform"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Widget","url":"/en/categories/widget/"}],"content":"The funding widget, AKA buy me a coffee widget, gives the readers a way to support a creator.\nSite Parameters The funding is a key value pair that mapping from platform to their QR Code image, username or URL.\nName Type Default Description funding Object - funding.alipay String - Alipay QR Code Image. funding.wechat String - Wechat QR Code Image. funding.paypal String - Paypal username. funding.ko_fi String - Ko-fi username. funding.patreon String - Patreon username. funding.open_collective String - Open Collective username. funding.buymeacoffee String - Buy Me a Coffee username. Page Parameter Name Type Default Description funding Object - Override the global funding settings, empty to disable. ","date":"January 29, 2023","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/widgets/funding/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Buy Me a Coffee","url":"/en/tags/buy-me-a-coffee/"},{"title":"Funding","url":"/en/tags/funding/"}],"timestamp":1674992659,"title":"Funding Widget"},{"authors":[],"categories":[{"title":"Shortcode","url":"/en/categories/shortcode/"}],"content":"The toggle shortcode is similar to the code-toggle, but it\u0026rsquo;s more generic.\nUsage 1{{\u0026lt; toggle myToggleName \u0026gt;}} 2 3 {{\u0026lt; toggle-item myToggleItemName \u0026gt;}} 4 CONTENT HERE, MARKDOWN and SHORTCODE are support. 5 {{\u0026lt; /toggle-item \u0026gt;}} 6 7 ... 8 9{{\u0026lt; /toggle \u0026gt;}} The myToggleName MUST be unique per page. The myToggleItemName MUST be unique per toggle. Example Foo Bar Foo Bar PHP JS SQL 1echo \u0026#34;hello world\u0026#34; 1console.log(\u0026#34;hello world\u0026#34;) 1SELECT \u0026#34;hello world\u0026#34; ","date":"January 21, 2023","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/shortcodes/toggle/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Toggle","url":"/en/tags/toggle/"}],"timestamp":1674314531,"title":"Toggle"},{"authors":[],"categories":[],"content":"The client search will become slower and slower with the content grows, it\u0026rsquo;s reasonable to have a remote search service to handle search requests from a large site.\nAlgolia is a popular search service that provides free plan (10k records, 10k requests per month). After reading this article, you will learn how to configure Algolia and automatically upload index files.\nPreparations Firstly, you need to create an Algolia account, and then create your application.\nNavigate to the Overview \u0026gt; API Keys, the page shows anything you may need in the rest steps, such as application ID, search API key and the admin API key.\nConfiguration Name Type Default Description algolia Object - Algolia algolia.appId String - App ID algolia.apiKey String - Search only API key algolia.indexName String - Index name algolia.paginate Number 5 algolia.stallThreshold Number 300 How many milliseconds must elapse before considering the autocomplete experience stalled. Index Create Index Navigate to the Data sources \u0026gt; Indices \u0026gt; Create Index, and then create your index, let\u0026rsquo;s name it prod.\nAdd Searchable Attributes Once the index was created, we\u0026rsquo;re in the index page.\nNavigate to the Configuration \u0026gt; Searchable attributes, we\u0026rsquo;ll need add the title and content attributes.\nUpload Index After site built, the Algolia index file will be generated and saved as /algolia/index.json, i.e. http://localhost:1313/algolia/index.json.\nUpload Manually You can upload the index file manually via the Algolia dashboard for testing.\nCLI Tool I wrote a CLI tool for uploading the index file, it can be integrated with your CI \u0026amp; CD tools easilly.\nGitHub Action I also wrote a GitHub actions if you\u0026rsquo;re using GitHub to host your repository.\nCreate the .github/workflows/algolia.yml under your site root with the following content.\n1name: Algolia Index 2 3on: 4 workflow_dispatch: 5 push: 6 branches: 7 - \u0026#34;main\u0026#34; 8 9jobs: 10 index: 11 runs-on: ubuntu-latest 12 steps: 13 - name: Checkout 14 uses: actions/checkout@v3 15 - name: Build \u0026amp; upload Algolia index 16 uses: razonyang/hugo-theme-bootstrap-algolia-action@v0.1.0 17 with: 18 algolia-app-id: ${{ secrets.ALGOLIA_APP_ID }} 19 algolia-api-key: ${{ secrets.ALGOLIA_API_KEY }} 20 algolia-index-name: prod And then create the ALGOLIA_APP_ID and ALGOLIA_API_KEY secrets for your repository.\nALGOLIA_API_KEY is the admin API key, not search only API key.\nOnce the GitHub action was created, the index file will be uploaded automatically on git push.\n","date":"November 27, 2022","img":"/docs/topics/algolia/featured.png","lang":"en","langName":"English","largeImg":"/docs/topics/algolia/featured_hu_fdffb880f893b4ae.png","permalink":"/en/docs/topics/algolia/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"/docs/topics/algolia/featured_hu_24633db3233eed98.png","tags":[{"title":"Algolia","url":"/en/tags/algolia/"}],"timestamp":1669549992,"title":"Algolia"},{"authors":[],"categories":[{"title":"Shortcode","url":"/en/categories/shortcode/"}],"content":"A detailed description of iframe shortcode.\nUsage 1{{\u0026lt; iframe \u0026#34;URL\u0026#34; \u0026gt;}} or via named parameters\n1{{\u0026lt; iframe 2 src=\u0026#34;URL\u0026#34; 3 trigger=manual 4 loadButtonText=\u0026#34;load_video\u0026#34; 5\u0026gt;}} Parameter Default Description src - The iframe URL. Required. trigger auto Set it as manual if you want to load the iframe manually. lazyLoading true loadButtonText load The text of load button, i18n is supported. loadInfo - The information shown below the load button. Markdown is supported. fullscreen true Show/Hide the fullscreen button. Examples OpenStreetMap Game Run game Please note that the iframe will load the game from other sites. ","date":"November 19, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/shortcodes/iframe/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"IFrame","url":"/en/tags/iframe/"}],"timestamp":1668834048,"title":"IFrame Shortcode"},{"authors":[],"categories":[{"title":"Shortcode","url":"/en/categories/shortcode/"}],"content":"A detailed description of game shortcode.\nUsage 1{{\u0026lt; game \u0026#34;GAME_URL\u0026#34; \u0026gt;}} or via named parameters\nParameter Default Description src - The game URL. Required. trigger auto Set it as manual if you want to load the game manually. loadInfo - The information shown below the load button. Markdown is supported. 1{{\u0026lt; game 2 src=\u0026#34;GAME_URL\u0026#34; 3 trigger=manual 4 loadInfo=\u0026#34;The Game Information.\u0026#34; 5\u0026gt;}} Examples Auto Load Manual Load Run game The Game Information. ","date":"November 15, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/shortcodes/game/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Game","url":"/en/tags/game/"}],"timestamp":1668518208,"title":"Game Shortcode"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[],"content":"In this article, we\u0026rsquo;ll talk about the landing page layout, you may be interested in it if you\u0026rsquo;re going to customizing the pages in Markdown way.\nWhat is it? The landing page layout is just a skeleton container, the body is consists by three parts: top app bar, page content and footer.\nAdvantages Writing content in Markdown. Reusable shortcodes. How to use it? It\u0026rsquo;s quite simple to use it, just specify the type as landing and sidebar as false in the page front matter, the rest is all about your content.\n1+++ 2type = \u0026#34;landing\u0026#34; 3sidebar = false 4+++ Let\u0026rsquo;s take home page as an example, create the content/_index.md with the following content.\nThe home page MUST be content/_index.md, not content/index.md.\n1--- 2title: Home 3type: landing 4--- 5 6{{\u0026lt; text/align-center \u0026gt;}} 7\u0026lt;h1\u0026gt;Hello world.\u0026lt;/h1\u0026gt; 8{{\u0026lt; /text/align-center \u0026gt;}} 9 10\u0026lt;br\u0026gt; 11 12{{\u0026lt; text/align-center \u0026gt;}} 13\u0026lt;h2\u0026gt;The subtitle landing page example.\u0026lt;/h2\u0026gt; 14{{\u0026lt;/* /text/align-center \u0026gt;}} ","date":"September 15, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/layouts/landing/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Landing Page","url":"/en/tags/landing-page/"}],"timestamp":1663209983,"title":"Landing Page Layout"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Widget","url":"/en/categories/widget/"}],"content":"The repository widget shows the commit information about current page, it\u0026rsquo;s useful for users to view or edit the source code.\nRequirements This widget relies on the .GitInfo, so you\u0026rsquo;ll need to either enable it via the --enableGitInfo flag or setting the enableGitInfo as true in config.toml.\n1$ hugo --enableGitInfo 1enableGitInfo = true Site Parameters Name Type Default Description repo Object - repo.url String - Required. The URL of your public repository. GitHub and GitLab are supported. repo.branch String master The branch name. repo.subPath String - The sub path of content. repo.dateFormat String 02/01/2006, 15:04:05 PM The format of commit date. Usage The repository widget is disabled by default, you\u0026rsquo;ll need to include widget via Hooks.\nFor posts layout.\n1{{- partial \u0026#34;docs/repo\u0026#34; . }} For docs layout.\n1{{- partial \u0026#34;docs/repo\u0026#34; . }} ","date":"September 9, 2022","img":"/docs/widgets/repository/featured.png","lang":"en","langName":"English","largeImg":"/docs/widgets/repository/featured_hu_8e5e187c0d9a3e55.png","permalink":"/en/docs/widgets/repository/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"/docs/widgets/repository/featured_hu_b0ece6c3195c9919.png","tags":[{"title":"Repository","url":"/en/tags/repository/"},{"title":"GitHub","url":"/en/tags/github/"}],"timestamp":1662728779,"title":"Repository Widget"},{"authors":[{"title":"Wilson E. Alvarez","url":"/en/authors/rubonnek/"}],"categories":[{"title":"Deployment","url":"/en/categories/deployment/"}],"content":"This article explains how to deploy sites to GitLab Pages using GitLab CI.\nWorkflow Create .gitlab-ci.yml at the root of your site with the following contents:\n1image: registry.gitlab.com/pages/hugo/hugo_extended:latest 2 3variables: 4 HUGO_ENV: production 5 6default: 7 before_script: 8 - apk add --update --no-cache git go npm 9 - npm install 10 11test: 12 script: 13 - hugo --gc --minify 14 rules: 15 - if: $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH 16 17pages: 18 script: 19 - hugo --gc --minify 20 artifacts: 21 paths: 22 - public 23 rules: 24 - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH The example above will only deploy the default branch to GitLab Pages and run a test on the rest of the branches.\nSee also:\nStarter Template GitLab Pages Configuration。 Upstream GitLab Hugo Example GitLab CI/CD Variables Documentation ","date":"August 27, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/deployment/gitlab-pages/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"GitLab Pages","url":"/en/tags/gitlab-pages/"},{"title":"GitLab CI","url":"/en/tags/gitlab-ci/"}],"timestamp":1661567423,"title":"Deploy to GitLab Pages"},{"authors":[],"categories":[{"title":"Deployment","url":"/en/categories/deployment/"}],"content":"In this section, we are going to talk about the key points of deployments to avoid most problems during deployment.\nBuild Tools As Prerequisites mentioned, you\u0026rsquo;ll need to set up those tools on your deployment environment.\nInstalling Dependencies We use NPM for managing the theme\u0026rsquo;s dependencies, it\u0026rsquo;s necessary to install the dependencies on deployment environment, since we SHOULD NOT commit the node_modules folder.\n1$ npm i npm i is the shortcut of npm install.\nThe package.json and package-lock.json MUST be committed, npm relies on the former, the later will save the installation time.\nBuilding Site It\u0026rsquo;s time to build the site after installing the dependencies.\n1$ hugo --gc --minify --minify minify the final HTML. You can change the baseURL via the -b flag.\nThe command generated the site and save it under the public directory by default.\nDeploying Site This step depends on the which deployment methods you use.\nDeployment Methods Docker GitHub Pages Netlify Cloudflare Pages GitLab Pages Find more on Hosting \u0026amp; Deployment Further Reading Performance ","date":"July 27, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/deployment/overview/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[],"timestamp":1658916025,"title":"Deployment Overview"},{"authors":[],"categories":[{"title":"Layouts","url":"/en/categories/layouts/"},{"title":"Partials","url":"/en/categories/partials/"}],"content":"According to the Hugo Layouts Lookup Order, it\u0026rsquo;s easy to override Hugo and theme\u0026rsquo;s layouts and partials. It\u0026rsquo;s useful for users who want to custom some stuff of particular layouts or partials.\nUsage Just create a layout or partial file with the same filename that you want to override under site root.\nThis is how our Hooks work.\nFor example, we can override the homepage parital layouts/index.html via creating our own under site root.\n1$ echo \u0026#34;MY CUSTOM HOMEPAGE\u0026#34; \u0026gt; layouts/index.html ","date":"July 27, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/advanced/layouts-overriding/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[],"timestamp":1658909137,"title":"Layouts Overriding"},{"authors":[],"categories":[{"title":"Widgets","url":"/en/categories/widgets/"}],"content":"When the page is too long, the sidebar will disappear with scrolling and the page will not look as neat and beautiful. So this article will introduce how to use sticky widgets to avoid this problem.\nCreate a New Sticky Widget First of all, create a partial under the layouts/parials folder, let\u0026rsquo;s take layouts/partials/custom/sticky-info.html as example.\n1\u0026lt;div class=\u0026#34;row card component position-sticky\u0026#34; style=\u0026#34;top: 84px;\u0026#34;\u0026gt; 2 \u0026lt;div class=\u0026#34;text-center py-3 px-1\u0026#34;\u0026gt; 3 MY STICKY WIDGET 4 \u0026lt;/div\u0026gt; 5\u0026lt;/div\u0026gt; The filename custom/sticky-info can be changed at will, but we recommend using some more specific names to avoid overriding the theme\u0026rsquo;s partials later. Such as custom, mywidgets.\nThen use the layouts/partials/hooks/sidebar-end.html hook to include the sticky partial.\n1{{- partial \u0026#34;custom/sticky-info\u0026#34; . }} The sticky widget should be the last widget of the sidebar, otherwise, strange problems can occur.\nMake an Existing Widget Sticky Each widget will have a unique class name, so that we can apply CSS on a desired widget, here we take the profile widget as an example.\n1.sidebar { 2 .profile { 3 position: sticky !important; 4 top: 84px; 5 order: 5; 6 } 7} We need to specify the order property to make the profile widget become the last widget of sidebar.\n","date":"July 27, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/topics/sticky-widgets/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Sticky","url":"/en/tags/sticky/"},{"title":"SCSS","url":"/en/tags/scss/"}],"timestamp":1658883283,"title":"Sticky Widgets"},{"authors":[],"categories":[{"title":"Multilingual","url":"/en/categories/multilingual/"}],"content":"HBS supports multiple languages out of box, such as English, Simplified Chinese, Traditional Chinese, French, Russian, etc.\nYou can add your own translations on: hugo-theme-bootstrap/i18n\nSupported Languages Language Code English en Simplified Chinese zh-hans(Recommended), zh-cn Traditional Chinese zh-hant(Recommended), zh-tw, zh-hk Spanish es Arabic ar German de French fr Indonesian id Japanese ja Polish pl Portuguese pt Russian ru Ukrainian uk Uzbek uz Configuration TOML YAML JSON config/_default/language.toml\n1[ar] 2 languageDirection = \u0026#39;rtl\u0026#39; 3 title = \u0026#39;مدونتي\u0026#39; 4 weight = 3 5[en] 6 languageName = \u0026#39;English\u0026#39; 7 weight = 1 8[zh-hans] 9 languageName = \u0026#39;简体中文\u0026#39; 10 weight = 2 11 [zh-hans.params] 12 description = \u0026#39;一个快速、响应式和功能丰富的 Hugo 博客主题\u0026#39; 13 keywords = \u0026#39;Hugo, Bootstrap, 博客主题\u0026#39; config/_default/language.yaml\n1ar: 2 languageDirection: rtl 3 title: مدونتي 4 weight: 3 5en: 6 languageName: English 7 weight: 1 8zh-hans: 9 languageName: 简体中文 10 params: 11 description: 一个快速、响应式和功能丰富的 Hugo 博客主题 12 keywords: Hugo, Bootstrap, 博客主题 13 weight: 2 config/_default/language.json\n1{ 2 \u0026#34;ar\u0026#34;: { 3 \u0026#34;languageDirection\u0026#34;: \u0026#34;rtl\u0026#34;, 4 \u0026#34;title\u0026#34;: \u0026#34;مدونتي\u0026#34;, 5 \u0026#34;weight\u0026#34;: 3 6 }, 7 \u0026#34;en\u0026#34;: { 8 \u0026#34;languageName\u0026#34;: \u0026#34;English\u0026#34;, 9 \u0026#34;weight\u0026#34;: 1 10 }, 11 \u0026#34;zh-hans\u0026#34;: { 12 \u0026#34;languageName\u0026#34;: \u0026#34;简体中文\u0026#34;, 13 \u0026#34;params\u0026#34;: { 14 \u0026#34;description\u0026#34;: \u0026#34;一个快速、响应式和功能丰富的 Hugo 博客主题\u0026#34;, 15 \u0026#34;keywords\u0026#34;: \u0026#34;Hugo, Bootstrap, 博客主题\u0026#34; 16 }, 17 \u0026#34;weight\u0026#34;: 2 18 } 19} You\u0026rsquo;ll need to specify the languageDirection as rtl for Right-to-left writing languages.\nSee also Hugo Multilingual.*\nThe parameter that controls the default language of the site must be located in the site configuration file. See defaultContentLanguage on Site Configuration.\nLocalization The dateFormat supports localization, you can change it as :date_full, you can find more layouts in Date/time formatting layouts.\nPlease note that the zh-cn, zh-tw and zh-hk are not supported, since the language code could not match the locales defined in Hugo Locales.\nFurther Reading Translate Your Content ","date":"July 27, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/configuration/multilangual/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Translation","url":"/en/tags/translation/"},{"title":"Localization","url":"/en/tags/localization/"}],"timestamp":1658880366,"title":"Multilingual Mode"},{"authors":[],"categories":[{"title":"PurgeCSS","url":"/en/categories/purgecss/"}],"content":"The PurgeCSS is an awesome tool that remove unused CSS from your site. In this section, we will dive into how the PurgeCSS work, and what should we pay attention to.\nHow it Works? The PurgeCSS requires the following configuration to be set.\nTOML YAML JSON config.toml\n1[build] 2 writeStats = true 3[taxonomies] 4 author = \u0026#39;authors\u0026#39; 5 category = \u0026#39;categories\u0026#39; 6 series = \u0026#39;series\u0026#39; 7 tag = \u0026#39;tags\u0026#39; config.yaml\n1build: 2 writeStats: true 3taxonomies: 4 author: authors 5 category: categories 6 series: series 7 tag: tags config.json\n1{ 2 \u0026#34;build\u0026#34;: { 3 \u0026#34;writeStats\u0026#34;: true 4 }, 5 \u0026#34;taxonomies\u0026#34;: { 6 \u0026#34;author\u0026#34;: \u0026#34;authors\u0026#34;, 7 \u0026#34;category\u0026#34;: \u0026#34;categories\u0026#34;, 8 \u0026#34;series\u0026#34;: \u0026#34;series\u0026#34;, 9 \u0026#34;tag\u0026#34;: \u0026#34;tags\u0026#34; 10 } 11} It tells Hugo to calculate used tags, classes and ids, and then generates the hugo_stats.json.\n1{ 2 \u0026#34;htmlElements\u0026#34;: { 3 \u0026#34;tags\u0026#34;: [], 4 \u0026#34;classes\u0026#34;: [], 5 \u0026#34;ids\u0026#34;: [] 6} Finally PurgeCSS relies on this file to purge unused CSS.\nThe PurgeCSS works only under production environment.\nWe DO NOT recommend overriding postcss.config.js and assets/main/config/rtl/postcss.config.js, otherwise unexpected problems will occur during version updates.\nLimitations The hugo_stats.json only works in *.html templates, that is, any CSS classes, tags and ids used on JavaScript files will still be purged.\nBut don\u0026rsquo;t worry, there are two ways to solve this problem.\nExtra Stats Just create a file called extra_stats.json with the same form of hugo_stats.json on your site root, and put the extra CSS into it manually.\nextra_stats.json MUST be committed to your repo.\nPut HTML Block into *.html Files A common scenario is rendering HTML blocks using JavaScript, if you\u0026rsquo;re using JavaScript to generate DOM element, any used CSS will be ignored by hugo_stats.json. Of course you can add it to extra_stats.json manually, but there is a better way to do that via template engine.\nFirstly, we\u0026rsquo;ll need to define a template block in *.html partials. 1\u0026lt;div class=\u0026#34;d-none\u0026#34; id=\u0026#34;template-custom-widget-foo\u0026#34;\u0026gt; 2 \u0026lt;div class=\u0026#34;custom-widget-foo\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; 3\u0026lt;/div\u0026gt; 4 5\u0026lt;script type=\u0026#34;text/html\u0026#34; id=\u0026#34;template-custom-widget-bar\u0026#34;\u0026gt; 6 \u0026lt;div class=\u0026#34;custom-widget-bar\u0026#34;\u0026gt; 7 NOTE THAT: ANY CSS INSIDE THE SCRIPT TAG WONT BE INCLUDED INTO THE STATS FILE. 8 \u0026lt;/div\u0026gt; 9\u0026lt;/script\u0026gt; Hugo will calculate used CSS into hugo_stats.json.\n1$ cat hugo_stats.json | grep custom-widget- 2 \u0026#34;custom-widget-foo\u0026#34;, 3 \u0026#34;template-custom-widget-foo\u0026#34;, 4 \u0026#34;template-custom-widget-bar\u0026#34;, As you can see, the CSS(custom-widget-bar) used inside \u0026lt;script\u0026gt; tag won\u0026rsquo;t be included into hugo_stats.json, so we should use other HTML tags with the d-none class to wrap your template.\nd-none is a Bootstrap CSS utility, equals to display: none.\nAnd then render the template via any template engines. 1const tmpl = document.getElementById(\u0026#39;template-custom-widget-bar\u0026#39;).innerHTML; 2render(tmpl, data); Testing You\u0026rsquo;ll need to specify the production environment for local testing via hugo server -e production -b http://localhost:1313, since the PurgeCSS only works on production environment.\nSometimes PurgeCSS and PostProcess don\u0026rsquo;t work very well, so you may need to restart Hugo Server occasionally.\n","date":"July 25, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/advanced/purgecss/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[],"timestamp":1658721960,"title":"PurgeCSS"},{"authors":[],"categories":[{"title":"Performance","url":"/en/categories/performance/"}],"content":"In this article we are going to talk about how to improve the performance of your sites.\nThe easiest way to improve performance is to reduce the file size for transferring faster.\nEnvironment The theme relies on the production environment to minify the JavaScript and CSS assets, and purge unused CSS.\nDefault environment Value hugo production hugo server development In general, you don\u0026rsquo;t need to make any changes unless you plan to use the hugo server in a production environment. You can change the default environment with -e flag.\nHTML Minification You should use hugo --minify to minify the final HTML in production environment.\nCompression Compression is not the same thing of minification, it compresses files with some algorithm (such as gzip), and then transfer to clients, the clients then decompress before parsing those files. This is the configuration of the web server. Please refer to the relevant documents according to your own situation.\nImages Resources Please place the featured, cover or thumbnail images under the page folder whenever possible, so that the images would be treated as page resources that can be processed by the theme. HBS will crop it into multiple smaller sizes to suit different devices, in order to save users bandwidth and improve the performance and user experience.\n1├── featured-sample.webp 2├── index.md 3├── index.zh-hans.md 4└── index.zh-hant.md SCSS Variables Use SCSS variables when possible, see also SCSS Variables.\n","date":"July 23, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/advanced/performance/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Minify","url":"/en/tags/minify/"},{"title":"Gzip","url":"/en/tags/gzip/"}],"timestamp":1658572248,"title":"Performance"},{"authors":[],"categories":[{"title":"Events","url":"/en/categories/events/"}],"content":"This articles listed some custom events emitted by the theme, you can catch those events via event listeners.\nColor Mode Event HBS will emit a custom event called hbs:mode on color mode changed, it\u0026rsquo;s useful to adjust your widget\u0026rsquo;s style to theme color mode. The built-in Utterances and Giscus comments engines are relying on this event for adjusting their theme to light or dark.\n1document.addEventListener(\u0026#39;hbs:mode\u0026#39;, (e: CustomEvent) =\u0026gt; { 2 console.log(\u0026#39;mode changed: \u0026#39;, e.detail.mode); 3}); ","date":"July 23, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/advanced/events/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[],"timestamp":1658568839,"title":"Events"},{"authors":[],"categories":[{"title":"SCSS","url":"/en/categories/scss/"}],"content":"Thanks to assets/main/scss/_variables.scss, we have the ability to change the default SCSS variables of theme and Bootstrap.\nWhy SCSS Variables? Although we can override the CSS via assets/main/scss/_custom.scss, this will eventually increase the size of CSS bundle, however the SCSS variable does not in most cases.\nFor example, there is a default animation for logo on hover.\n1.top-app-bar .logo:hover { 2 transform: rotate(-5deg) scale(1.1); 3} It\u0026rsquo;s able to disable it via custom SCSS.\n1.top-app-bar { 2 .logo { 3 \u0026amp;:hover { 4 transform: none; 5 } 6 } 7} But the previous style which we don\u0026rsquo;t need is still present in CSS bundle, since we just overrode it by the custom SCSS.\n1.top-app-bar .logo:hover { 2 transform: none; 3} 4 5.top-app-bar .logo:hover { 6 transform: rotate(-5deg) scale(1.1); 7} And the SCSS variables will not generate unused style into CSS bundle.\n1$logo-animation: false; Smaller CSS bundle size means better performance, so we recommend using SCSS variables when possible.\nBootstrap SCSS Variables You can find the Bootstrap built-in SCSS variables from source code and official documentations.\nTheme SCSS Variables Palettes Palette Variable Blue $palette-blue Blue Gray $palette-blue-gray Brown $palette-brown Cyan $palette-cyan Green $palette-green Indigo $palette-indigo Orange $palette-orange Pink $palette-pink Purple $palette-purple Red $palette-red Teal $palette-teal Yello $palette-yellow Options Variable Default Value Description $code-select true Select \u0026lt;code\u0026gt; content on click, except code block. $logo-animation true Enable/Disable the default animation for logo. $table-hover true Table hoverable. $table-bordered true Bordered table. ","date":"July 23, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/advanced/scss-variables/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"SCSS Variables","url":"/en/tags/scss-variables/"}],"timestamp":1658568208,"title":"SCSS Variables"},{"authors":[],"categories":[{"title":"Shortcode","url":"/en/categories/shortcode/"}],"content":"In this article, we will explore some shortcodes for text, such as alignment, transform and selection.\nText Transform lowercased text. UPPERCASED TEXT. CapiTaliZed text. Text Alignment Align text to the start. Align text to the center. Align text to the end. Text Selection This paragraph will be entirely selected when clicked by the user. This paragraph will not be selectable when clicked by the user. ","date":"July 15, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/shortcodes/text/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Text","url":"/en/tags/text/"},{"title":"Text Alignment","url":"/en/tags/text-alignment/"},{"title":"Text Transform","url":"/en/tags/text-transform/"},{"title":"Text Selection","url":"/en/tags/text-selection/"}],"timestamp":1657818043,"title":"Text Shortcodes"},{"authors":[],"categories":[{"title":"Deployment","url":"/en/categories/deployment/"}],"content":"This article will detail how to build a Docker image.\nPrinciple Use Hugo to build the site and generate static files. Use Nginx as the server to handle requests. Dockerfile Create a Dockerfile in the site root.\n1############### 2# Build Stage # 3############### 4FROM razonyang/hugo as builder 5 6WORKDIR /src 7COPY . /src 8 9ARG HUGO_ENV=production 10ENV HUGO_ENV=${HUGO_ENV} 11 12# Base URL 13ARG HUGO_BASEURL=/ 14ENV HUGO_BASEURL=${HUGO_BASEURL} 15 16# Module Proxy 17ARG HUGO_MODULE_PROXY= 18ENV HUGO_MODULE_PROXY=${HUGO_MODULE_PROXY} 19 20# NPM mirrors, such as https://registry.npmmirror.com 21ARG NPM_CONFIG_REGISTRY= 22ENV NPM_CONFIG_REGISTRY=${NPM_CONFIG_REGISTRY} 23 24# Install dependencies 25RUN npm install 26RUN npm install -g @fullhuman/postcss-purgecss rtlcss 27 28# Build site 29RUN hugo --minify --gc --enableGitInfo 30 31# Set the fallback 404 page if defaultContentLanguageInSubdir is enabled, please replace the `en` with your default language code. 32# RUN cp ./public/en/404.html ./public/404.html 33 34############### 35# Final Stage # 36############### 37FROM nginx 38COPY --from=builder /src/public /app 39COPY deploy/nginx/default.conf /etc/nginx/conf.d/default.conf There are two stages to the build, a build stage and a release stage. The release stage contains only the generated static files, keeping the size of the Docker image as small as possible. If you have defaultContentLanguageInSubdir enabled, please uncomment and modify it on demand. The HUGO_BASEURL parameter is used to specify the baseURL of the site during the build, and is generally used when the baseURL is different from the configuration, so you can remove it yourself if you don\u0026rsquo;t need it. HUGO_MODULE_PROXY and NPM_CONFIG_REGISTRY are optional build parameters that can be removed if not needed. Nginx Create a deploy/nginx/default.conf in the site root:\n1server { 2 listen 80; 3 listen [::]:80; 4 server_name localhost; 5 6 root /app; 7 8 location / { 9 index index.html index.htm; 10 } 11 12 location ~* ^/([^/]+) { 13 index index.html index.htm; 14 error_page 404 = @error; 15 } 16 17 error_page 404 /404.html; 18 location @error { 19 try_files /$1/404.html /404.html =404; 20 } 21} Build 1$ docker build -t mysite \\ 2 --build-arg HUGO_BASEURL=https://example.com \\ 3 . mysite: the image name. HUGO_BASEURL：the baseURL. For users located in China mainland, you need to specify HUGO_MODULE_PROXY and NPM_CONFIG_REGISTRY to build the image successfully and quickly:\n1$ docker build -t mysite \\ 2 --build-arg HUGO_BASEURL=https://example.com \\ 3 --build-arg HUGO_MODULE_PROXY=https://goproxy.cn \\ 4 --build-arg NPM_CONFIG_REGISTRY=https://registry.npmmirror.com \\ 5 . Deployment There are many ways to deploy Docker image, such as docker run, k8s, etc. This article will only explain docker run.\nRun 1$ docker run \\ 2 -p 2333:80 \\ 3 --name mysite \\ 4 --restart=always \\ 5 mysite For local testing, you need to change the baseURL parameter or the HUGO_BASEURL build parameter, e.g. http://localhost:2333.\nStop 1$ docker stop mysite Start 1$ docker start mysite Remove 1$ docker rm mysite ","date":"July 13, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/deployment/docker/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Docker","url":"/en/tags/docker/"},{"title":"Nginx","url":"/en/tags/nginx/"}],"timestamp":1657679429,"title":"Building a Docker Image"},{"authors":[],"categories":[{"title":"Deployment","url":"/en/categories/deployment/"}],"content":"This article explains how to deploy sites to GitHub Pages using GitHub Actions.\nWorkflow Create .github/workflows/gh-pages.yml in the site root.\n1name: GitHub Pages 2on: 3 push: 4 branches: 5 - main 6permissions: 7 contents: write 8jobs: 9 build-and-deploy: 10 concurrency: ci-${{ github.ref }} 11 runs-on: ubuntu-latest 12 steps: 13 - name: Checkout 🛎️ 14 uses: actions/checkout@v3 15 with: 16 submodules: true 17 fetch-depth: 0 18 19 - name: Setup Node 20 uses: actions/setup-node@v3 21 with: 22 node-version: \u0026#39;16\u0026#39; 23 24 - name: Cache dependencies 25 uses: actions/cache@v2 26 with: 27 path: ~/.npm 28 key: ${{ runner.os }}-node-${{ hashFiles(\u0026#39;**/package-lock.json\u0026#39;) }} 29 restore-keys: | 30 ${{ runner.os }}-node- 31 32 - name: Install dependencies 33 run: npm install 34 35 - name: Setup Hugo 36 uses: peaceiris/actions-hugo@v2 37 with: 38 hugo-version: \u0026#39;latest\u0026#39; 39 extended: true 40 41 - name: Build 42 run: hugo --minify --gc --enableGitInfo 43 44 - name: Deploy 🚀 45 uses: peaceiris/actions-gh-pages@v3 46 with: 47 github_token: ${{ secrets.GITHUB_TOKEN }} 48 publish_dir: ./public See also Starter Template GitHub Pages Workflow。\n","date":"July 13, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/deployment/github-pages/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"GitHub Pages","url":"/en/tags/github-pages/"},{"title":"GitHub Actions","url":"/en/tags/github-actions/"}],"timestamp":1657679423,"title":"Deploy to GitHub Pages"},{"authors":[],"categories":[{"title":"Deployment","url":"/en/categories/deployment/"}],"content":"This article show you how to deploy your site to Cloudflare Pages.\nCreating a Project We\u0026rsquo;ll start by creating a Git project and filling in the appropriate information.\nBuild Command 1npm i \u0026amp;\u0026amp; hugo --gc --minify --enableGitInfo -b https://hbs-skeleton.pages.dev npm i is a shortcut to npm install, which installs the dependencies used during the site build. -b https://hbs-skeleton.pages.dev specifies baseURL, please replace it yourself. You can also save it to a configuration file instead of specifying it in the build command. Environment Variables Name Value HUGO_VERSION 0.147.9 NODE_VERSION 16 404 Page Cloudflare is smart enough to use the best matching 404 pages, even for multilingual sites, and works without additional configurations.\n","date":"July 12, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/deployment/cloudflare-pages/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Cloudflare Pages","url":"/en/tags/cloudflare-pages/"}],"timestamp":1657627584,"title":"Deploy on Cloudflare Pages"},{"authors":[],"categories":[{"title":"Deployment","url":"/en/categories/deployment/"}],"content":"This article shows how to deploy your site to Netlify.\nNetlify Configuration Create a netlify.toml in the site root：\n1[build] 2 publish = \u0026#34;public\u0026#34; 3 4[build.environment] 5 NODE_VERSION = \u0026#34;17.6.0\u0026#34; 6 HUGO_VERSION = \u0026#34;0.147.9\u0026#34; 7 HUGO_ENABLEGITINFO = \u0026#34;true\u0026#34; 8 GO_VERSION = \u0026#34;1.17.7\u0026#34; 9 10[context.production] 11 command = \u0026#34;npm install \u0026amp;\u0026amp; hugo --minify\u0026#34; 12 13[context.production.environment] 14 HUGO_ENV = \u0026#34;production\u0026#34; 15 16[[headers]] 17 for = \u0026#34;/*\u0026#34; 18 [headers.values] 19 Referrer-Policy = \u0026#34;strict-origin-when-cross-origin\u0026#34; 20 X-Content-Type-Options = \u0026#34;nosniff\u0026#34; 21 X-Frame-Options = \u0026#34;deny\u0026#34; 22 X-XSS-Protection = \u0026#34;1; mode=block\u0026#34; 23 24[[redirects]] 25 from = \u0026#34;/:lang/*\u0026#34; 26 to = \u0026#34;/:lang/404.html\u0026#34; 27 status = 404 28 29[[redirects]] 30 from = \u0026#34;/*\u0026#34; 31 to = \u0026#34;/en/404.html\u0026#34; # Replace the \u0026#34;en\u0026#34; to your default language code if \u0026#34;defaultContentLanguageInSubdir\u0026#34; is enabled, otherwise use \u0026#34;/404.html\u0026#34; instead. 32 status = 404 See also Starter Template Netlify Configuration.\n","date":"July 12, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/deployment/netlify/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Netlify","url":"/en/tags/netlify/"}],"timestamp":1657606849,"title":"Deploy to Netlify"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[],"content":"Users who have used the block copy button are no stranger to the Snackbar, which informs the user of the results of the application\u0026rsquo;s execution. This article will give an example of how to use Snackbar to meet the user\u0026rsquo;s need for custom interaction.\nAPI Function Description show(body: String, duration: number = 2000) body: the body of the message, duration: the duration of the message, in milliseconds. Export Thanks to assets/main/js/custom.ts, we can customize the JavaScript, here we export the whole Snackbar as a global variable:\n1import Snackbar from \u0026#39;js/snackbar\u0026#39;; 2 3// Show a message via JavaScript. 4Snackbar.show(\u0026#39;a message with 3s duration from pure JavaScript\u0026#39;, 3000) 5 6// Export the Snackbar as a global variable, so that you can send a message from a HTML. 7// Such as: \u0026lt;button onclick=\u0026#34;Snackbar.show(\u0026#39;message from a button\u0026#39;)\u0026#34;\u0026gt;Snackbar\u0026lt;/button\u0026gt;. 8const _global = (window || global ) as any 9_global.Snackbar = Snackbar Usage Then we can call it up in HTML or JavaScript:\n1\u0026lt;button onclick=\u0026#34;Snackbar.show(\u0026#39;message from a button\u0026#39;)\u0026#34;\u0026gt;Snackbar\u0026lt;/button\u0026gt; See Hooks for how to inject custom HTML.\n","date":"July 2, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/advanced/snackbar/","series":[{"title":"Documentation","url":"/en/series/documentation/"}],"smallImg":"","tags":[{"title":"Snackbar","url":"/en/tags/snackbar/"},{"title":"HTML","url":"/en/tags/html/"},{"title":"JavaScript","url":"/en/tags/javascript/"}],"timestamp":1656767677,"title":"Snackbar"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[],"content":"This article explains how to upgrade the theme correctly.\nVersions Before upgrading, it is necessary to introduce what a version is. In addition to the relative stable versions listed in Releases, you can use a branch such as master, develop, or even choose a certain commit.\nThis article will use the [version] placeholder to represent the version, just replace it with the version you want to upgrade to.\nUpgrade Please choose the upgrade step depending on the installation method: Git Submodule and Hugo Module.\nNote that no matter which install method you use, you will always end up needing to pull and update dependencies via hugo mod npm pack and npm update.\nAdditional Dependencies If you intend to add additional dependencies, you need to define it in package.hugo.json instead of package.json. That\u0026rsquo;s because the hugo mod npm pack will always override the package.json, which merges theme\u0026rsquo;s package.hugo.json and your site\u0026rsquo;s package.hugo.json.\nGit Submodule 1$ cd themes/hugo-theme-bootstrap 2$ git fetch 3$ git checkout [version] 4$ cd ../../ 5$ hugo mod npm pack 6$ npm update 7$ git add themes/hugo-theme-bootstrap package.hugo.json package.json package-lock.json 8$ git commit -m \u0026#39;Bump theme to [version]\u0026#39; git fetch pull the latest branch and tag information form the theme repository. git checkout [version] switch to the [version] version. hugo mod npm pack and npm update to pull and update the latest dependencies form the theme. Hugo Module 1$ hugo mod get github.com/razonyang/hugo-theme-bootstrap@[version] 2$ hugo mod tidy 3$ hugo mod npm pack 4$ npm update 5$ git add go.mod go.sum package.hugo.json package.json package-lock.json 6$ git commit -m \u0026#39;Bump theme to [version]\u0026#39; hugo mod tidy clean up any redundant dependencies. hugo mod npm pack and npm update pull and update the latest dependencies form the theme. ","date":"June 25, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/getting-started/upgradation/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[],"timestamp":1656166502,"title":"Upgradation"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Migration","url":"/en/categories/migration/"}],"content":"Track and review changes to the theme source files and documentation to help you migrate from v0.* to v1.\nIf you\u0026rsquo;re not sure how to upgrade, see the Upgradation guide.\nv1.0 The older UI design are freezen on v0 branch that only accepts bug fixes. You can keep using the older UI design with that branch.\nDependencies Bumped Bootstrap from v5.1 to v5.2. UI Removed the setting panel from top app bar. Added the social links on top app bar. Placed Docs navigation toggle on top app bar on small screen. Layouts Removed layouts/_default/archive.html, please replace the layout = archive with layout = archives in front matter. Renamed layouts/partials/docs/catalog.html to layouts/partials/docs/nav.html. SCSS Deprecated $variable-prefix, please use $prefix instead. Use Bootstrap built-in CSS variables instead of theme-defined CSS variables. Docs BREAKING CHANGE use the navWeight instead of weight for sorting pages on docs nav. Shortcodes Alert Shortcode BREAKING CHANGE change alert syntax, see also Alert Shortcode Syntax. ","date":"June 20, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/migration/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[],"timestamp":1655718391,"title":"Migrating to V1"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Shortcode","url":"/en/categories/shortcode/"}],"content":"The code-toggle shortcode generates code blocks of various formats according to the configuration code of any supported format.\nFormats JSON, TOML and YAML are supported.\nUsage 1{{\u0026lt; code-toggle \u0026gt;}} 2CODE IN ANY SUPPORTED FORMAT 3{{\u0026lt;/ code-toggle \u0026gt;}} With a filename:\n1{{\u0026lt; filename=\u0026#34;config\u0026#34; code-toggle \u0026gt;}} 2CODE IN ANY SUPPORTED FORMAT 3{{\u0026lt;/ code-toggle \u0026gt;}} Example 1{{\u0026lt; code-toggle filename=\u0026#34;params\u0026#34; \u0026gt;}} 2{ 3 \u0026#34;logo\u0026#34;: \u0026#34;/images/logo.png\u0026#34;, 4 \u0026#34;customCSS\u0026#34;: [\u0026#34;foo.css\u0026#34;, \u0026#34;bar.css\u0026#34;], 5 \u0026#34;codeBlock\u0026#34;: { 6 \u0026#34;maxLines\u0026#34;: 10 7 } 8} 9{{\u0026lt;/ code-toggle \u0026gt;}} TOML YAML JSON params.toml\n1customCSS = [\u0026#39;foo.css\u0026#39;, \u0026#39;bar.css\u0026#39;] 2logo = \u0026#39;/images/logo.png\u0026#39; 3[codeBlock] 4 maxLines = 10 params.yaml\n1codeBlock: 2 maxLines: 10 3customCSS: 4- foo.css 5- bar.css 6logo: /images/logo.png params.json\n1{ 2 \u0026#34;codeBlock\u0026#34;: { 3 \u0026#34;maxLines\u0026#34;: 10 4 }, 5 \u0026#34;customCSS\u0026#34;: [ 6 \u0026#34;foo.css\u0026#34;, 7 \u0026#34;bar.css\u0026#34; 8 ], 9 \u0026#34;logo\u0026#34;: \u0026#34;/images/logo.png\u0026#34; 10} ","date":"June 13, 2022","img":"/docs/shortcodes/code-toggle/featured.png","lang":"en","langName":"English","largeImg":"/docs/shortcodes/code-toggle/featured_hu_6ff21a143d433045.png","permalink":"/en/docs/shortcodes/code-toggle/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"/docs/shortcodes/code-toggle/featured_hu_e04768398376e8c4.png","tags":[{"title":"JSON","url":"/en/tags/json/"},{"title":"YAML","url":"/en/tags/yaml/"},{"title":"TOML","url":"/en/tags/toml/"}],"timestamp":1655110468,"title":"Code Toggle"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Introduction","url":"/en/categories/introduction/"}],"content":" Goals Performance Friendly User Experience SEO Features Hugo Pipes: used to generate CSS and JS assets. PurgeCSS: remove unused CSS. Flexible and Configurable. Fast and Good User Experience: Google PageSpeed Insights\u0026rsquo;s score is over 95. RTL support: Arabic demo site. Built on top of Bootstrap 5. FontAwesome icons. Responsive. PWA, AKA progressive web apps. Various Palettes: blue, blue-gray, brown, cyan, green, indigo, orange, pink, purple, red, teal, yellow. A Docs Layout for publishing project documentation, notes, digital gardens, zettelkastens etc. Light/Dark Mode. Font Size Switcher. Multilingual(I18N). Local Search. DocSearch. Pinning Posts. Footer Menu. Code Block Panel: copy code, line number, line wrap and expand. Code Toggle Breadcrumb. Archive. Image Viewer. Image Processing: resize and align images. Resources Lazy Loading: image and iframe. Syntax Highlighting. Reward Widget, AKA Buy Me a Coffee: any platform that supports QR code is supported. Table of Contents. Comments: Disqus, Utterances, Giscus and Staticman can be used out of box, you can also integrate with other comments services. Custom Assets: custom CSS and JS. Hooks: provides ability to add custom code on page. Social Links. Various Shortcodes. Twitter Cards and Open Graph. Creative Commons License. Contact Form. Numberify Headings Automatically. ","date":"June 13, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/getting-started/introduction/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Features","url":"/en/tags/features/"}],"timestamp":1655109129,"title":"Introduction"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[],"content":"Please make sure you meet the prerequisites prior to installing the theme.\nConfiguration HBS requires the following configurations are be set.\nTOML YAML JSON config.toml\n1[build] 2 writeStats = true 3[taxonomies] 4 author = \u0026#39;authors\u0026#39; 5 category = \u0026#39;categories\u0026#39; 6 series = \u0026#39;series\u0026#39; 7 tag = \u0026#39;tags\u0026#39; config.yaml\n1build: 2 writeStats: true 3taxonomies: 4 author: authors 5 category: categories 6 series: series 7 tag: tags config.json\n1{ 2 \u0026#34;build\u0026#34;: { 3 \u0026#34;writeStats\u0026#34;: true 4 }, 5 \u0026#34;taxonomies\u0026#34;: { 6 \u0026#34;author\u0026#34;: \u0026#34;authors\u0026#34;, 7 \u0026#34;category\u0026#34;: \u0026#34;categories\u0026#34;, 8 \u0026#34;series\u0026#34;: \u0026#34;series\u0026#34;, 9 \u0026#34;tag\u0026#34;: \u0026#34;tags\u0026#34; 10 } 11} Build Tools Tool Version Description Git Version Control Systems Hugo extended version 0.97.0 or above. Node.js and NPM NodeJS 16 or above used for installing CSS and JS dependencies, and building the assets. Go 1.12 or above required only when installed as a Hugo Module. We recommend using the latest version of those tools.\n","date":"June 13, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/getting-started/prerequisites/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Prerequisites","url":"/en/tags/prerequisites/"}],"timestamp":1655109129,"title":"Prerequisites"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Shortcode","url":"/en/categories/shortcode/"}],"content":"This article shows how to use the gallery shortcode.\nUsage 1{{\u0026lt; gallery images=\u0026#34;images/foo.png,images/bar.png\u0026#34; \u0026gt;}} ","date":"March 25, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/shortcodes/gallery/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Gallery","url":"/en/tags/gallery/"}],"timestamp":1648166400,"title":"Gallery Shortcode"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Troubleshooting","url":"/en/categories/troubleshooting/"}],"content":"This article lists some common problems so that you can easily solve them.\nCSS rendering incorrectly The problem probably due to the postcss, HBS need the following configuration to be set up, postcss rely on the file hugo_stats.json for purging unused CSS.\n1[build] 2 writeStats = true js.Build: Could not resolve dependencies 1Start building sites … 2hugo v0.94.0-63B23660+extended linux/amd64 BuildDate=2022-03-10T09:46:36Z VendorInfo=gohugoio 3ERROR 2022/03/19 14:03:50 js.Build failed: Could not resolve \u0026#34;bootstrap/js/src/offcanvas\u0026#34; 4ERROR 2022/03/19 14:03:50 js.Build failed: Could not resolve \u0026#34;bootstrap/js/src/modal\u0026#34; 5ERROR 2022/03/19 14:03:50 js.Build failed: Could not resolve \u0026#34;bootstrap/js/src/tab\u0026#34; 6ERROR 2022/03/19 14:03:50 js.Build failed: \u0026#34;/home/razonyang/Projects/razonyang/hugo-theme-bootstrap/assets/js/collapse/collapse.ts:1:38\u0026#34;: Could not resolve \u0026#34;bootstrap/js/src/collapse\u0026#34; 7ERROR 2022/03/19 14:03:50 js.Build failed: \u0026#34;/home/razonyang/Projects/razonyang/hugo-theme-bootstrap/assets/js/toc/index.ts:1:27\u0026#34;: Could not resolve \u0026#34;bootstrap/js/dist/offcanvas\u0026#34; 8ERROR 2022/03/19 14:03:50 js.Build failed: Could not resolve \u0026#34;@fortawesome/free-solid-svg-icons\u0026#34; 9ERROR 2022/03/19 14:03:50 js.Build failed: Could not resolve \u0026#34;@fortawesome/free-regular-svg-icons\u0026#34; 10ERROR 2022/03/19 14:03:50 js.Build failed: Could not resolve \u0026#34;@fortawesome/free-brands-svg-icons\u0026#34; 11ERROR 2022/03/19 14:03:50 js.Build failed: Could not resolve \u0026#34;workbox-routing\u0026#34; 12ERROR 2022/03/19 14:03:50 js.Build failed: Could not resolve \u0026#34;workbox-strategies\u0026#34; 13ERROR 2022/03/19 14:03:50 js.Build failed: Could not resolve \u0026#34;workbox-cacheable-response\u0026#34; 14ERROR 2022/03/19 14:03:50 js.Build failed: Could not resolve \u0026#34;workbox-expiration\u0026#34; 15ERROR 2022/03/19 14:03:50 js.Build failed: Could not resolve \u0026#34;workbox-precaching\u0026#34; 16ERROR 2022/03/19 14:03:50 js.Build failed: \u0026#34;/home/razonyang/Projects/razonyang/hugo-theme-bootstrap/assets/search/search.ts:1:21\u0026#34;: Could not resolve \u0026#34;mustache\u0026#34; 17ERROR 2022/03/19 14:03:50 js.Build failed: \u0026#34;/home/razonyang/Projects/razonyang/hugo-theme-bootstrap/assets/search/search.ts:1:17\u0026#34;: Could not resolve \u0026#34;mark.js/dist/mark.js\u0026#34; 18ERROR 2022/03/19 14:03:50 js.Build failed: Could not resolve \u0026#34;bootstrap/js/src/offcanvas\u0026#34; 19ERROR 2022/03/19 14:03:50 js.Build failed: Could not resolve \u0026#34;bootstrap/js/src/modal\u0026#34; 20ERROR 2022/03/19 14:03:50 js.Build failed: Could not resolve \u0026#34;bootstrap/js/src/tab\u0026#34; 21ERROR 2022/03/19 14:03:50 js.Build failed: \u0026#34;/home/razonyang/Projects/razonyang/hugo-theme-bootstrap/assets/js/collapse/collapse.ts:1:38\u0026#34;: Could not resolve \u0026#34;bootstrap/js/src/collapse\u0026#34; 22ERROR 2022/03/19 14:03:50 js.Build failed: \u0026#34;/home/razonyang/Projects/razonyang/hugo-theme-bootstrap/assets/js/toc/index.ts:1:27\u0026#34;: Could not resolve \u0026#34;bootstrap/js/dist/offcanvas\u0026#34; 23ERROR 2022/03/19 14:03:50 js.Build failed: Could not resolve \u0026#34;bootstrap/js/src/offcanvas\u0026#34; 24ERROR 2022/03/19 14:03:50 js.Build failed: Could not resolve \u0026#34;bootstrap/js/src/modal\u0026#34; 25ERROR 2022/03/19 14:03:50 js.Build failed: Could not resolve \u0026#34;bootstrap/js/src/tab\u0026#34; 26ERROR 2022/03/19 14:03:50 js.Build failed: \u0026#34;/home/razonyang/Projects/razonyang/hugo-theme-bootstrap/assets/js/collapse/collapse.ts:1:38\u0026#34;: Could not resolve \u0026#34;bootstrap/js/src/collapse\u0026#34; 27ERROR 2022/03/19 14:03:50 js.Build failed: \u0026#34;/home/razonyang/Projects/razonyang/hugo-theme-bootstrap/assets/js/toc/index.ts:1:27\u0026#34;: Could not resolve \u0026#34;bootstrap/js/dist/offcanvas\u0026#34; 28ERROR 2022/03/19 14:03:51 js.Build failed: Could not resolve \u0026#34;bootstrap/js/src/offcanvas\u0026#34; 29ERROR 2022/03/19 14:03:51 js.Build failed: Could not resolve \u0026#34;bootstrap/js/src/modal\u0026#34; 30ERROR 2022/03/19 14:03:51 js.Build failed: Could not resolve \u0026#34;bootstrap/js/src/tab\u0026#34; 31ERROR 2022/03/19 14:03:51 js.Build failed: \u0026#34;/home/razonyang/Projects/razonyang/hugo-theme-bootstrap/assets/js/collapse/collapse.ts:1:38\u0026#34;: Could not resolve \u0026#34;bootstrap/js/src/collapse\u0026#34; 32ERROR 2022/03/19 14:03:51 js.Build failed: \u0026#34;/home/razonyang/Projects/razonyang/hugo-theme-bootstrap/assets/js/toc/index.ts:1:27\u0026#34;: Could not resolve \u0026#34;bootstrap/js/dist/offcanvas\u0026#34; 33ERROR 2022/03/19 14:03:51 TOCSS: failed to transform \u0026#34;viewer/scss/index.scss\u0026#34; (text/x-scss): SCSS processing failed: file \u0026#34;stdin\u0026#34;, line 1, col 1: File to import not found or unreadable: viewerjs/dist/viewer. 34ERROR 2022/03/19 14:03:51 JSBUILD: failed to transform \u0026#34;main/js/bundle.ts\u0026#34; (application/typescript): Could not resolve \u0026#34;bootstrap/js/src/dropdown\u0026#34; 35ERROR 2022/03/19 14:03:51 JSBUILD: failed to transform \u0026#34;icons/index.js\u0026#34; (application/javascript): Could not resolve \u0026#34;@fortawesome/fontawesome-svg-core\u0026#34; 36ERROR 2022/03/19 14:03:51 JSBUILD: failed to transform \u0026#34;service-worker/bundle.ts\u0026#34; (application/typescript): Could not resolve \u0026#34;workbox-core\u0026#34; 37ERROR 2022/03/19 14:03:51 JSBUILD: failed to transform \u0026#34;viewer/js/index.ts\u0026#34; (application/typescript): Could not resolve \u0026#34;viewerjs\u0026#34; 38Error: Error building site: JSBUILD: failed to transform \u0026#34;search/index.ts\u0026#34; (application/typescript): \u0026#34;/home/razonyang/Projects/razonyang/hugo-theme-bootstrap/assets/search/search.ts:1:17\u0026#34;: Could not resolve \u0026#34;fuse.js\u0026#34; It is due to the lack of CSS and JS dependencies:\n1$ hugo mod npm pack 2$ npm install 3$ hugo server ","date":"March 19, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/troubleshooting/","series":[],"smallImg":"","tags":[],"timestamp":1647668801,"title":"Troubleshooting"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[],"content":"This article refers to the modern, up-to-date installation method of installing the theme locally as Hugo module.\nProxy (Optional) If you\u0026rsquo;re located at China mainland without VPN, the Hugo module download may fail.\nThere are two proxies for this: GOPROXY.CN and GOPROXY.IO.\n1$ export HUGO_MODULE_PROXY=https://goproxy.cn Please note that, Hugo doesn\u0026rsquo;t respect the GOPROXY env var, please use HUGO_MODULE_PROXY instead.\nYou can also set the module.proxy instead of using env var.\nTOML YAML JSON config.toml\n1[module] 2 proxy = \u0026#39;https://goproxy.cn\u0026#39; config.yaml\n1module: 2 proxy: https://goproxy.cn config.json\n1{ 2 \u0026#34;module\u0026#34;: { 3 \u0026#34;proxy\u0026#34;: \u0026#34;https://goproxy.cn\u0026#34; 4 } 5} Install a new site from scratch Please use the starter template for your new site.\nInstall on an existing site Turn your existing site into a Hugo module 1$ cd my-blog 2$ hugo mod init github.com/me/my-blog Declare hugo-theme-bootstrap module as a site dependency 1$ hugo mod get github.com/razonyang/hugo-theme-bootstrap@[version] The [version] can be one of Releases, branches or even commits.\nReplace [version] with master for getting latest changes.\nCopy example site content into your site Clone the hugo-theme-bootstrap-skeleton repo into a temporary directory: 1$ git clone https://github.com/razonyang/hugo-theme-bootstrap-skeleton /tmp/hbs-skeleton Copy example site configuration and content into your site: 1$ mkdir config 2$ cp -a /tmp/hbs-skeleton/config/* ./config 3$ cp -r /tmp/hbs-skeleton/content/* ./content 4$ cp -r /tmp/hbs-skeleton/archetypes/* ./archetypes 5$ cp -r /tmp/hbs-skeleton/static/* ./static 6$ cp -r /tmp/hbs-skeleton/assets/* ./assets Delete the repo from your temporary directory again: 1$ rm -rf /tmp/hbs-skeleton/ Pull in dependencies via npm Use node package manager npm to pull in dependencies for this theme: 1$ hugo mod npm pack 2$ npm install Preview your site Start hugo\u0026rsquo;s built-in webserver, and then navigate to http://localhost:1313/.\n1$ hugo server ","date":"February 26, 2022","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/getting-started/installation/hugo-module/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Installation","url":"/en/tags/installation/"},{"title":"Upgrade","url":"/en/tags/upgrade/"},{"title":"Hugo Module","url":"/en/tags/hugo-module/"}],"timestamp":1645888239,"title":"Install via Hugo Module"},{"authors":[{"title":"Andreas Deininger","url":"/en/authors/andreas-deininger/"},{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Layouts","url":"/en/categories/layouts/"}],"content":"In this article, we\u0026rsquo;ll explore the docs layout, which can be used to write project documentation, personal notes, and more.\nIf you\u0026rsquo;re going to use docs layout on other sections(notes), please take a look at Content page.\nLayout The docs layout consists of three sections, from start to end: document navigation bar, document content and sidebar.\nContent Structure 1$ tree content/docs 2├── _index.md 3├── installation 4│ ├── _index.md 5│ ├── linux 6│ │ ├── _index.md 7│ │ ├── archlinux 8│ │ │ └── index.md 9│ │ └── ubuntu 10│ │ └── index.md 11│ └── windows 12│ └── index.md 13└── introduction 14 └── index.md As shown in the figure, this example shows how to organize a multi-level document navigation.\nContaining _index.md will become a Section. Containing index.md will become a page. Navigation Title Generally, title will be used to display on the navigation bar, but sometimes the title is too long to make things worse. At this time, we can modify the link text displayed in the navigation via linkTitle.\nTOML YAML JSON 1linkTitle = \u0026#39;Windows\u0026#39; 2title = \u0026#39;Install on Windows\u0026#39; 1linkTitle: Windows 2title: Install on Windows 1{ 2 \u0026#34;linkTitle\u0026#34;: \u0026#34;Windows\u0026#34;, 3 \u0026#34;title\u0026#34;: \u0026#34;Install on Windows\u0026#34; 4} Icon In addition, we provide a parameter called linkTitleIcon to set the icon on the left side of the title.\nTOML YAML JSON 1linkTitleIcon = \u0026#39;\u0026lt;i class=\u0026#34;fas fa-columns fa-fw\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026#39; 1linkTitleIcon: \u0026lt;i class=\u0026#34;fas fa-columns fa-fw\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; 1{ 2 \u0026#34;linkTitleIcon\u0026#34;: \u0026#34;\\u003ci class=\\\u0026#34;fas fa-columns fa-fw\\\u0026#34;\\u003e\\u003c/i\\u003e\u0026#34; 3} Weight We sort documents according to the navWeight parameter, upper weight gets higher precedence. For documents without \u0026rsquo;navWeight\u0026rsquo; specified, they are sorted alphabetically by title.\nTOML YAML JSON 1navWeight = 1000 1navWeight: 1000 1{ 2 \u0026#34;navWeight\u0026#34;: 1000 3} External Links Sometimes we need to link the article to an external site. At this time, redirect can be used, and then it will redirect to the specified external link automatically.\nTOML YAML JSON 1redirect = \u0026#39;https://github.com/razonyang/hugo-theme-bootstrap-skeleton\u0026#39; 1redirect: https://github.com/razonyang/hugo-theme-bootstrap-skeleton 1{ 2 \u0026#34;redirect\u0026#34;: \u0026#34;https://github.com/razonyang/hugo-theme-bootstrap-skeleton\u0026#34; 3} Sidebar Widgets By default, the sidebar only contains the table of content, but you can add widgets via hook.\n1{{- partial \u0026#34;docs/repo\u0026#34; . }} 2{{- partial \u0026#34;sidebar/recent-posts\u0026#34; . }} ","date":"January 12, 2022","img":"/docs/layouts/docs/featured.png","lang":"en","langName":"English","largeImg":"/docs/layouts/docs/featured_hu_ec4c91b03483f271.png","permalink":"/en/docs/layouts/docs/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"/docs/layouts/docs/featured_hu_947b7abb991171d8.png","tags":[],"timestamp":1642013794,"title":"Docs Layout"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Menu","url":"/en/categories/menu/"}],"content":"We predefined two types of menus: main and footer, represents the top app bar menus and the footer menus, respectively. This article will briefly introduce how to use the menus.\nMenu Entry Properties Property Type Description name String The name of menu. identifier String The ID of menu. weight Number The weight of menu that used for sorting in ascending order. parent String The identifier of parent menu entry. url String The URL of menu. pre String The leading string before menu name. post String The trailing string after menu name. params Object Menu parameters. params.divider Boolean true means divider. params.icon String The icon HTML. params.description String The description for top app bar\u0026rsquo;s dropdown menus only. See also Menu Entry Properties.\nUsage Configuration The menu configuration file is located in config/_default/menu.toml by default.\nLet\u0026rsquo;s take main menu as an example:\n1[[main]] 2 identifier = \u0026#34;home\u0026#34; 3 name = \u0026#34;Home\u0026#34; 4 weight = 1 5 url = \u0026#34;https://vandenboom.online/\u0026#34; 6 [main.params] 7 icon = \u0026#39;\u0026lt;i class=\u0026#34;fas fa-home\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026#39; 8[[main]] 9 identifier = \u0026#34;blog\u0026#34; 10 name = \u0026#34;Blog\u0026#34; 11 weight = 2 12 [main.params] 13 icon = \u0026#39;\u0026lt;i class=\u0026#34;fas fa-fw fa-blog\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026#39; 14[[main]] 15 name = \u0026#34;Support\u0026#34; 16 identifier = \u0026#34;support\u0026#34; 17 weight = 40 18 [main.params] 19 description = \u0026#39;The HBS Support Community\u0026#39; 20 icon = \u0026#39;\u0026lt;i class=\u0026#34;fas fa-fw fa-info-circle\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026#39; 21[[main]] 22 name = \u0026#34;Repository\u0026#34; 23 identifier = \u0026#34;repository\u0026#34; 24 parent = \u0026#34;support\u0026#34; 25 url = \u0026#34;https://github.com/razonyang/hugo-theme-bootstrap\u0026#34; 26 weight = 1 27 [main.params] 28 icon = \u0026#39;\u0026lt;i class=\u0026#34;fab fa-fw fa-github text-primary\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026#39; 29[[main]] 30 name = \u0026#34;Discussions\u0026#34; 31 identifier = \u0026#34;discussions\u0026#34; 32 parent = \u0026#34;support\u0026#34; 33 url = \u0026#34;https://github.com/razonyang/hugo-theme-bootstrap/discussions/new\u0026#34; 34 weight = 2 35 [main.params] 36 description = \u0026#34;Ask and discuss questions with others.\u0026#34; 37 icon = \u0026#39;\u0026lt;i class=\u0026#34;fas fa-fw fa-comments text-success\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026#39; 38[[main]] 39 name = \u0026#34;Features Request\u0026#34; 40 identifier = \u0026#34;feature-request\u0026#34; 41 parent = \u0026#34;support\u0026#34; 42 url = \u0026#34;https://github.com/razonyang/hugo-theme-bootstrap/issues/new?template=feature_request.yml\u0026#34; 43 weight = 3 44 [main.params] 45 description = \u0026#34;Suggest new or updated features.\u0026#34; 46 icon = \u0026#39;\u0026lt;i class=\u0026#34;fas fa-fw fa-lightbulb text-warning\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026#39; 47[[main]] 48 name = \u0026#34;Bug Report\u0026#34; 49 identifier = \u0026#34;bug-report\u0026#34; 50 parent = \u0026#34;support\u0026#34; 51 url = \u0026#34;https://github.com/razonyang/hugo-theme-bootstrap/issues/new?template=bug_report.yml\u0026#34; 52 weight = 3 53 [main.params] 54 description = \u0026#34;Tell us about a bug or issue.\u0026#34; 55 icon = \u0026#39;\u0026lt;i class=\u0026#34;fas fa-fw fa-bug text-danger\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026#39; 56[[main]] 57 parent = \u0026#34;support\u0026#34; 58 weight = 4 59 [main.params] 60 divider = true See Icons for importing icons and setting the icon\u0026rsquo;s color.\nFront Matter We can also configure menu via page front matter.\n1[menu.main] 2 parent = \u0026#34;support\u0026#34; 3 weight = 6 4[menu.footer] 5 parent = \u0026#34;support\u0026#34; 6 weight = 6 7 [menu.footer.params] 8 icon = \u0026#39;\u0026lt;i class=\u0026#34;fas fa-fw fa-question-circle\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026#39; The code snippet appends the page to the main and footer menu.\nIt\u0026rsquo;s no need to specify the url and name parameters.\n","date":"December 16, 2021","img":"/docs/configuration/menu/featured.png","lang":"en","langName":"English","largeImg":"/docs/configuration/menu/featured_hu_b8ce76cf729f474.png","permalink":"/en/docs/configuration/menu/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"/docs/configuration/menu/featured_hu_f77029d9e49e0c3a.png","tags":[{"title":"Main Menu","url":"/en/tags/main-menu/"},{"title":"Footer Menu","url":"/en/tags/footer-menu/"}],"timestamp":1639646720,"title":"Menu"},{"authors":[],"categories":[],"content":"The starter template for newbie.\n","date":"December 16, 2021","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/getting-started/installation/starter-template/","series":[],"smallImg":"","tags":[],"timestamp":1639646720,"title":"Starter Template"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"FAQ","url":"/en/categories/faq/"}],"content":"The FAQ page is a collection of frequently asked questions.\nPrerequisites We need to create a page called faq/index.md in the content directory.\n1+++ 2title = \u0026#34;Frequently Asked Questions\u0026#34; 3layout = \u0026#34;faq\u0026#34; 4+++ Data The data are stored in data directory, the directory structure is as follows:\n1data 2 /en 3 /faq 4 foo.json 5 bar.json 6 /zh-cn 7 /faq 8 foo.json 9 bar.json As you can see, we classify the questions according to their language. And each file represents a group of questions, that has the same format as follows:\n1{ 2 \u0026#34;title\u0026#34;: \u0026#34;The group title\u0026#34;, 3 \u0026#34;weight\u0026#34;: 1, 4 \u0026#34;questions\u0026#34;: [ 5 { 6 \u0026#34;question\u0026#34;: \u0026#34;The question\u0026#34;, 7 \u0026#34;answer\u0026#34;: \u0026#34;The answer\u0026#34; 8 } 9 ] 10} The weight parameter is used for sorting group in ascending order. ","date":"December 7, 2021","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/layouts/faq/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[],"timestamp":1638884803,"title":"FAQ Layout"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[],"content":" Main Sections The mainSections parameter is used to filter pages, default to [\u0026quot;posts\u0026quot;, \u0026quot;docs\u0026quot;].\n1mainSections = [\u0026#34;blog\u0026#34;, \u0026#34;posts\u0026#34;, \u0026#34;docs\u0026#34;, \u0026#34;notes\u0026#34;] Front Matter Front Matter is the place where we put page metadata and parameters, such as title, date and so on.\nFormats Hugo supports three formats of front matter: YAML, TOML and JSON.\nTOML: identified by opening and closing +++. YAML: identified by opening and closing ---. JSON: a single JSON object surrounded by { and }, followed by a new line. Let\u0026rsquo;s take TOML as an example:\n1+++ 2title = \u0026#39;Hello world!\u0026#39; 3+++ See also Page Parameters and Hugo Front Matter.\nContent Types You may want to use docs layout in other sections instead of /docs, such as /notes. It\u0026rsquo;s easy to do that by setting type = \u0026quot;docs\u0026quot; on the front matter.\nArchetypes We can also create a archetype for notes, let\u0026rsquo;s Hugo take care of the type.\n1$ cp themes/hugo-theme-bootstrap/archetypes/default.md archetypes/notes.md And the append type = \u0026quot;docs\u0026quot; on the front matter of archetypes/notes.md. Now, hugo new notes/blah-blah-blah will copy the content of archetypes/notes.md to your new notes.\nSimilarly, you can also custom the archetypes for posts, docs and so on.\nWrite New Articles Suppose the default language is en.\n1$ hugo new posts/new-post/index.md The command above create a new post written in English. Similarly, we can create a post written in Simplified Chinese:\n1$ hugo new posts/new-post/index.zh-cn.md Please remind that, the created posts are generally in draft state. You\u0026rsquo;ll need to specify the -D parameter of the command hugo server for previewing. Similarly, you need to change the draft to false or remove draft parameter if you want to publish the article.\nSummaries Selection Order If the description is not empty, then it\u0026rsquo;ll be used, to use summaries all the time, you should set the post.excerpt as empty string explicitly. Manual splitting via \u0026lt;!\u0026ndash;more\u0026ndash;\u0026gt;. If summary on front matter isn\u0026rsquo;t empty, then summary will be selected. The text of content will be cut off by post.excerptMaxLength and formatted in plain text or HTML when post.plainifyExcerpt = true. 1[post] 2 # excerptMaxLength = 120 3 # copyright = false # Whether to display copyright section on each post. 4 # plainifyExcerpt = false # Format excerpt in HTML if false. Featured Images Selection Order The images on front matter are preferred. Page images resources that match the *feature* pattern. Such as posts/my-page/feature.png, posts/my-page/featured-sample.jpg. The featured image doesn\u0026rsquo;t show up above content by default, you\u0026rsquo;ll need to turn on this feature by following parameter.\nTOML YAML JSON config/_default/params.toml\n1[post] 2 featuredImage = true config/_default/params.yaml\n1post: 2 featuredImage: true config/_default/params.json\n1{ 2 \u0026#34;post\u0026#34;: { 3 \u0026#34;featuredImage\u0026#34;: true 4 } 5} Thumbnail Selection Order The images on front matter are preferred. Page images resources that match the filename\u0026rsquo;s patterns: *feature*, *cover* and *thumbnail*. Such as posts/my-page/feature.png, posts/my-page/thumnail.jpg. The page images resources will be resized to several smaller versions to suit the users devices for saving the bandwidth.\nPinning Posts You can pin posts on the home page by setting pinned to true on the front matter.\n1+++ 2title = \u0026#34;Pinned Post\u0026#34; 3pinned = true 4pinnedWeight = 100 5+++ If there is multiple pinned posts, they are sorted by pinnedWeight in descending order.\n1pinnedPost = false # Disable pinned posts globally. 2pinnedPostCount = 2 # The number of pinned posts shown on home page. Carousel Showing posts on carousel.\n1+++ 2carousel = true 3+++ Authors HBS supports the authors taxonomy. Firstly, you\u0026rsquo;ll need to enable it by setting the following configuration.\nTOML YAML JSON config.toml\n1[taxonomies] 2 author = \u0026#39;authors\u0026#39; config.yaml\n1taxonomies: 2 author: authors config.json\n1{ 2 \u0026#34;taxonomies\u0026#34;: { 3 \u0026#34;author\u0026#34;: \u0026#34;authors\u0026#34; 4 } 5} And then define the authors on your posts.\n1+++ 2authors = [ 3 \u0026#34;Foo\u0026#34;, 4 \u0026#34;Bar\u0026#34; 5] 6+++ Now, the authors will be present on the post meta and sidebar taxonomies.\nFinally, we may need to introduce the author in more detail. Take the Foo as an example, just create a page with the following content and save it as /content/authors/foo/index.md.\n1--- 2title: Razon Yang 3description: Gopher, PHPer, Full Stack Engineer. 4social: 5 github: razonyang 6 twitter: razonyang 7--- title: The author display name. description: The introduction. social: Social links. The author image should be placed at the same folder with pattern avatar*, such as /content/authors/foo/avatar.png. If there is no avatar, the social.email will be used to generate Gravatar avatar.\nUp Next Tweak Configuration Menu Look and Feel ","date":"December 4, 2021","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/content/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Authoring","url":"/en/tags/authoring/"},{"title":"Articles","url":"/en/tags/articles/"}],"timestamp":1638585819,"title":"Adding Content"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[],"content":"This article refers to the traditional installation method of cloning the theme locally as Git submodule. While this installation method is still widely used, we recommend to install the theme as Hugo module.\nCreate a New Site from Scratch 1$ git clone https://github.com/razonyang/hugo-theme-bootstrap-skeleton myblog 2$ cd myblog 3$ git submodule add https://github.com/razonyang/hugo-theme-bootstrap themes/hugo-theme-bootstrap 4$ sed -i \u0026#34;s/theme:.*/theme: hugo-theme-bootstrap/g\u0026#34; config/_default/config.yaml 5$ rm go.mod go.sum 6$ hugo mod npm pack 7$ npm install 8$ hugo server If you\u0026rsquo;re using Windows, use xcopy .\\themes\\hugo-theme-bootstrap\\exampleSite /E instead.\nsed replaces the theme: github.com/razonyang/hugo-theme-bootstrap with theme: hugo-theme-bootstrap.\nInstall on an existing site 1$ cd myblog 2$ git submodule add https://github.com/razonyang/hugo-theme-bootstrap themes/hugo-theme-bootstrap 3$ git clone https://github.com/razonyang/hugo-theme-bootstrap-skeleton /tmp/hbs-skeleton 4$ mkdir config 5$ cp -a /tmp/hbs-skeleton/config/* ./config 6$ cp -r /tmp/hbs-skeleton/content/* ./content 7$ cp -r /tmp/hbs-skeleton/archetypes/* ./archetypes 8$ cp -r /tmp/hbs-skeleton/static/* ./static 9$ cp -r /tmp/hbs-skeleton/assets/* ./assets 10$ sed -i \u0026#34;s/theme:.*/theme: hugo-theme-bootstrap/g\u0026#34; config/_default/config.yaml 11$ hugo mod npm pack 12$ npm install 13$ hugo server If you\u0026rsquo;re making a fresh clone, you will be need to update your submodule via git submodule update --init --recursive or clone with submodule git clone --recursive \u0026lt;repo\u0026gt;.\n","date":"December 4, 2021","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/getting-started/installation/git-submodule/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Installation","url":"/en/tags/installation/"},{"title":"Upgrade","url":"/en/tags/upgrade/"},{"title":"Git Submodule","url":"/en/tags/git-submodule/"}],"timestamp":1638585819,"title":"Install via Git Submodule"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Image Viewer","url":"/en/categories/image-viewer/"}],"content":"Image viewer is an image gallery, it will be shown up when you click a non-linkable image.\nIt also provides many tools, such as zoom in, zoom out and rotate.\nThe author avatar was filtered by default.\nSite Parameters Image Viewer was turned on by default, you can turn it off by setting the parameter viewer as false.\nOptions You can tweak the options by creating assets/viewer/js/options.ts.\n1const options = { 2 className: \u0026#34;image-viewer\u0026#34;, 3 // ... 4}; 5export default options; Available options are listed on Viewer.js Options.\n","date":"December 3, 2021","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/image-viewer/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[],"timestamp":1638535610,"title":"Image Viewer"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[],"content":"By default, a site using this theme has the default fonts, colors, and general look and feel. However, the default scheme cannot satisfy everyone, but don\u0026rsquo;t worry, you can easily override the theme defaults, such as palette colors, fonts, syntax highlighting.\nFavicons HBS generates icons in multiple sizes base on the file assets/favicon.webp (higher priority) or assets/favicon.png. Just save your own favicon image as the same path to override the defaults.\nYou\u0026rsquo;ll need to override the mask icon assets/safari-pinned-tab.svg as well.\nThe static icons static/images/icons/icon-{size}.png have higher priority for backwards compatibility.\nCustom Sizes You\u0026rsquo;re able to change the sizes you want via params file.\nTOML YAML JSON 1[favicon] 2 [[favicon.sizes]] 3 size = \u0026#39;16x16\u0026#39; 4 [[favicon.sizes]] 5 size = \u0026#39;32x32\u0026#39; 6 [[favicon.sizes]] 7 size = \u0026#39;150x150\u0026#39; 8 [[favicon.sizes]] 9 rel = \u0026#39;apple-touch-icon\u0026#39; 10 size = \u0026#39;180x180\u0026#39; 11 [[favicon.sizes]] 12 size = \u0026#39;192x192\u0026#39; 1favicon: 2 sizes: 3 - size: 16x16 4 - size: 32x32 5 - size: 150x150 6 - rel: apple-touch-icon 7 size: 180x180 8 - size: 192x192 1{ 2 \u0026#34;favicon\u0026#34;: { 3 \u0026#34;sizes\u0026#34;: [ 4 { 5 \u0026#34;size\u0026#34;: \u0026#34;16x16\u0026#34; 6 }, 7 { 8 \u0026#34;size\u0026#34;: \u0026#34;32x32\u0026#34; 9 }, 10 { 11 \u0026#34;size\u0026#34;: \u0026#34;150x150\u0026#34; 12 }, 13 { 14 \u0026#34;rel\u0026#34;: \u0026#34;apple-touch-icon\u0026#34;, 15 \u0026#34;size\u0026#34;: \u0026#34;180x180\u0026#34; 16 }, 17 { 18 \u0026#34;size\u0026#34;: \u0026#34;192x192\u0026#34; 19 } 20 ] 21 } 22} Background Image 1# Use the same image on light and dark modes. 2backgroundImage = [\u0026#39;/images/bg.png\u0026#39;] 3 4# Use different images on light and dark modes. 5backgroundImage = [\u0026#39;/images/bg-light.png\u0026#39;, \u0026#39;/images/bg-dark.png\u0026#39;] Palettes HBS provides a plenty of palettes: blue, blue-gray, brown, cyan, green, indigo, orange, pink, purple, red, teal, yellow.\nAvailable Palettes The palette picker on the setting panel is based on the palettes parameter.\n1palettes = [\u0026#34;blue\u0026#34;, \u0026#34;blue-gray\u0026#34;, \u0026#34;indigo\u0026#34;] You can also disable the palette picker by setting the palettes parameter to an empty array [].\nDefault Palette 1palette = \u0026#34;indigo\u0026#34; You\u0026rsquo;ll need to clear the browser cache after modifying the default palette.\nOverride Palette Color 1$palette-blue: darkblue; After modifying the SCSS variables on assets/main/scss/_variables.scss, the color of blue palette will be changed to darkblue. Please checkout the SCSS Variables for details.\nFonts Font Family We don\u0026rsquo;t specify any font, so that system-ui will be used in most browsers.\nYou can use other web fonts easily, such as Google Fonts. Lets take the Roboto font as an example.\nFirst of all, we import the font, and then override the body-font-family variable in assets/main/scss/_custom.scss:\n1@import url(\u0026#39;https://fonts.googleapis.com/css2?family=Roboto\u0026amp;display=swap\u0026#39;); 2:root { 3 --#{$prefix}body-font-family: \u0026#39;Roboto\u0026#39;, sans-serif; 4} Syntax Highlighting The theme requires the following markup parameters to be set to specific values.\nlineNos: true lineNumbersInTable: false noClasses: false See also Configure Highlight.\nStyle 1$ hugo gen chromastyles --style=solarized-dark \u0026gt; assets/main/scss/_highlight.scss See also All Supported Styles.\nIcons HBS uses a custom FontAwesome v5 icon set that contains only the icons used by the theme to reduce the icon file size.\nAdd Icons Considering the need for user-defined icons, HBS provides a custom icon feature, just create assets/icons/custom.js file in the site root and import the desired icons.\n1// import { faClock } from \u0026#39;@fortawesome/free-solid-svg-icons\u0026#39;; 2// import { faAddressBook } from \u0026#39;@fortawesome/free-regular-svg-icons\u0026#39;; 3// import { faAmazon, faGoogle } from \u0026#39;@fortawesome/free-brands-svg-icons\u0026#39;; 4 5const icons = [ 6 // faClock, 7 // faAddressBook, 8 // faAmazon, faGoogle, 9]; 10export default icons; To make this work, you need to uncomment, that is, remove the prefix //.\nLiterally, @fortawesome/free-solid-svg-icons, @fortawesome/free-regular-svg-icons and @fortawesome/free-brands-svg-icons represent Solid, Regular and Brand icons respectively.\nJS Variables JS variables are named using camelCase, and their corresponding class names are lowercase and separated from each other by a horizontal line.\nClass JS Variable fa-clock faClock fa-address-book faAddressBook fa-amazon faAmazon fa-google faGoogle Usage Depending on the type of icon, their class prefixs are ​​also different, the corresponding relationship is as follows:\nKind Class Prefix Solid fas Regular far Brand fab Takes the previously imported icons as an example:\nHTML \u0026lt;i class=\u0026quot;fas fa-clock\u0026quot;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;i class=\u0026quot;far fa-address-book\u0026quot;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;i class=\u0026quot;fab fa-amazon\u0026quot;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;i class=\u0026quot;fab fa-google\u0026quot;\u0026gt;\u0026lt;/i\u0026gt; If the icon is not displayed properly, please check that the prefix is ​​correct.\nIcon Color You can either specify the color CSS utilities or the style attribute for setting the icon color.\nHTML \u0026lt;i class=\u0026quot;fas fa-clock text-success\u0026quot;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;i class=\u0026quot;fas fa-clock text-danger\u0026quot;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;i class=\u0026quot;far fa-clock\u0026quot; style=\u0026quot;color: blue\u0026quot;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;i class=\u0026quot;far fa-clock\u0026quot; style=\u0026quot;color: pink\u0026quot;\u0026gt;\u0026lt;/i\u0026gt; When using it in configurations, front matter and so on, you should need to quote/escape the code, otherwise YAML/TOML/JSON parsing may fail. For example,\n1--- 2menu: 3 main: 4 params: 5 icon: \u0026#39;\u0026lt;i class=\u0026#34;far fa-clock\u0026#34; style=\u0026#34;color: blue\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026#39; 6--- ","date":"December 3, 2021","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/look-and-feel/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Color","url":"/en/tags/color/"},{"title":"Palette","url":"/en/tags/palette/"},{"title":"Fonts","url":"/en/tags/fonts/"},{"title":"Syntax Highlighting","url":"/en/tags/syntax-highlighting/"},{"title":"Icons","url":"/en/tags/icons/"}],"timestamp":1638531777,"title":"Look and Feel"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"PWA","url":"/en/categories/pwa/"}],"content":"PWAs(Progressive web apps) are web apps developed using a number of specific technologies and standard patterns to allow them to take advantage of both web and native app features.\nHBS provides some basic features, such as install site to home screen, precache files and available offline.\nSite Parameters Firstly, we need to specify the pwa parameter, even it is empty.\nName Type Default Description pwa Object - pwa.manifest Object - Web app manifest pwa.manifest.name String - Default to site title pwa.manifest.short_name String - Short name of your site. pwa.manifest.display String standalone pwa.manifest.description String - Default to site description. pwa.manifest.theme_color String - pwa.manifest.background_color String - pwa.manifest.icons Array - pwa.manifest.icons.sizes String - Icons\u0026rsquo; sizes, i.e. \u0026ldquo;96x96\u0026rdquo; pwa.manifest.icons.src String - Icon\u0026rsquo;s URL pwa.precache Object - Precache assets pwa.precache.fonts Array - Precache fonts pwa.precache.images Array - Precache images pwa.precache.pages Array - Precache pages pwa.precache.scripts Array - Precache scripts pwa.precache.styles Array - Precache styles Manifest The manifest.json will be generated automatically.\nOffline Offline Page The offline page will be shown in the case of requesting a new page without network.\nWe need to create an offline page called offline/_index.md in the content directory with the following front matter.\n1+++ 2title = \u0026#39;Offline\u0026#39; 3+++ Offline Image Same as offline page, there is an offline image for requesting images without network. HBS provides a built-in offline image with the filename assets/images/offline.png. You can override it by creating your own offline image with the same filename under your site root.\nPrecache TOML YAML JSON params.toml\n1[pwa] 2 [pwa.precache] 3 fonts = [\u0026#39;/assets/katex/fonts/KaTeX_Math-Italic.woff2\u0026#39;] 4 images = [\u0026#39;/images/logo.webp\u0026#39;, \u0026#39;/images/Martijn_001.jpeg\u0026#39;] 5 pages = [\u0026#39;/\u0026#39;] 6 scripts = [\u0026#39;/assets/js/foo.js\u0026#39;] 7 styles = [\u0026#39;https://fonts.googleapis.com/css2?family=Roboto\u0026amp;display=swap\u0026#39;] params.yaml\n1pwa: 2 precache: 3 fonts: 4 - /assets/katex/fonts/KaTeX_Math-Italic.woff2 5 images: 6 - /images/logo.webp 7 - /images/Martijn_001.jpeg 8 pages: 9 - / 10 scripts: 11 - /assets/js/foo.js 12 styles: 13 - https://fonts.googleapis.com/css2?family=Roboto\u0026amp;display=swap params.json\n1{ 2 \u0026#34;pwa\u0026#34;: { 3 \u0026#34;precache\u0026#34;: { 4 \u0026#34;fonts\u0026#34;: [ 5 \u0026#34;/assets/katex/fonts/KaTeX_Math-Italic.woff2\u0026#34; 6 ], 7 \u0026#34;images\u0026#34;: [ 8 \u0026#34;/images/logo.webp\u0026#34;, 9 \u0026#34;/images/Martijn_001.jpeg\u0026#34; 10 ], 11 \u0026#34;pages\u0026#34;: [ 12 \u0026#34;/\u0026#34; 13 ], 14 \u0026#34;scripts\u0026#34;: [ 15 \u0026#34;/assets/js/foo.js\u0026#34; 16 ], 17 \u0026#34;styles\u0026#34;: [ 18 \u0026#34;https://fonts.googleapis.com/css2?family=Roboto\\u0026display=swap\u0026#34; 19 ] 20 } 21 } 22} ","date":"December 3, 2021","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/pwa/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Manifest","url":"/en/tags/manifest/"},{"title":"Offline","url":"/en/tags/offline/"},{"title":"Precache","url":"/en/tags/precache/"}],"timestamp":1638531541,"title":"Progressive Web App"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Archive","url":"/en/categories/archive/"}],"content":"The archive page is a collection of posts grouped by year.\nPrerequisites The pages aren\u0026rsquo;t not created automatically, we need to create archives sections first:\n1$ tree content/archives 2├── 2021 3│ ├── _index.md 4├── 2022 5│ ├── _index.md 6├── _index.md The content of those files just contain a title parameter.\nSite Parameters Name Type Default Description archive Object - Archive. archive.dateFormat String Jan 2 Archive date format. archive.monthFormat String January Archive month format, e.g. 1, 01, Jan and January. archive.basePath String /archives ","date":"December 3, 2021","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/layouts/archives/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[],"timestamp":1638501411,"title":"Archive Layout"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Search","url":"/en/categories/search/"}],"content":"It may be difficult for readers to retrieve an article in the case if there are many articles in your site, therefore, we added the search feature.\nPrerequisites All you need to do is create a page called search/_index.md in the content directory.\n1+++ 2title = \u0026#34;Search\u0026#34; 3+++ Site Parameters Name Type Default Description search Object - Search configuration. search.paginate Integer 10 Pagination. search.indexPaginate Integer 1000 Index file pagination. search.indexPreload Boolean true Whether to preload the search indices. search.maxResults Number 100 The max number of search results. search.resultContentCharactersCount Integer 240 The maximum characters count of result content for displaying. search.shortcut Array [\u0026quot;/\u0026quot;] The search shortcut, i.e. [\u0026quot;Control\u0026quot;, \u0026quot;/\u0026quot;], disable it by a empty array []. search.fuse Object - Fuse.js options. search.fuse.ignoreLocation Boolean true search.fuse.location Integer - search.fuse.isCaseSensitive Boolean - search.fuse.minMatchCharLength Integer - search.fuse.threshold Double - search.fuse.distance Integer - search.fuse.useExtendedSearch Boolean - ","date":"December 3, 2021","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/layouts/search/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[],"timestamp":1638501411,"title":"Search Layout"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Widget","url":"/en/categories/widget/"}],"content":"The author widget is located in the sidebar, in order to introduce yourself briefly.\nSite Parameters config/_default/author.toml is deprecated, please use params.author instead.\n1// params.toml 2[author] 3name = \u0026#34;Foobar\u0026#34; 4[author.params] 5[author.social] Name Type Default Description author Object - Author profile shown in sidebar. author.name String - Name. author.avatar String /images/Martijn_001.jpeg Avatar. author.bio Object - Bio. author.company String - Company. author.location String - Location. author.about String - The external about page. The internal about page will be used if not set. author.params Object - author.params.layout String - Optional values: compact. author.social Object - Social Links. ","date":"December 3, 2021","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/widgets/author/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[],"timestamp":1638501019,"title":"Author Widget"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Widget","url":"/en/categories/widget/"}],"content":"The reward widget, AKA buy me a coffee widget, gives the readers a way to support a creator through the use of donations or tips.\nHowever, it limited to the QR code image, please take a look at the funding widget.\nSite Parameters The reward is a key value pair that mapping from platform to their QR Code image, therefore, any platform that supports QR code is supported.\nName Type Default Description reward Object - reward.alipay String - Alipay QR Code Image. reward.wechat String - Wechat QR Code Image. Page Parameter Name Type Default Description reward Boolean true Turn on/off reward widget. ","date":"December 3, 2021","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/widgets/reward/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Buy Me a Coffee","url":"/en/tags/buy-me-a-coffee/"}],"timestamp":1638501019,"title":"Reward Widget"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Social Links","url":"/en/categories/social-links/"}],"content":"The social parameter is a set of key value pairs of social links that mapping from platform to their user identifier. It supports many popular social platforms, such as Twitter, Facebook, Reddit, GitHub. This article lists all supported platforms and how to use them.\nUsage There are three places you can put social links to: top app bar, Author Widget and footer.\nTop App Bar TOML YAML JSON params.toml\n1[topAppBar] 2 [topAppBar.social] 3 github = \u0026#39;foobar\u0026#39; params.yaml\n1topAppBar: 2 social: 3 github: foobar params.json\n1{ 2 \u0026#34;topAppBar\u0026#34;: { 3 \u0026#34;social\u0026#34;: { 4 \u0026#34;github\u0026#34;: \u0026#34;foobar\u0026#34; 5 } 6 } 7} Author Widget Set up social links by editing a file config/_default/params.toml with the following content:\n1[author.social] 2 email = \u0026#34;user@domain.tld\u0026#34; 3 github = \u0026#34;githubusername\u0026#34; Footer Set up social links by putting the following content in config/_default/params.toml.\n1[social] 2email = \u0026#34;user@domain.tld\u0026#34; 3github = \u0026#34;githubusername\u0026#34; Platforms The value can be changed to a full URL if necessary.\nPlatform User Identifier email Email Address facebook Facebook Username facebookgroup Facebook Group Name github GitHub Username gitlab GitLab Username instagram Instagram Username itchio itch.io Username linkedin LinkedIn Username quora Quora Username stackoverflow Stack Overflow User ID tumblr Tumblr Username twitter Twitter Username weibo Weibo Username zhihu Zhihu Username reddit Reddit Username telegram Telegram Username qq QQ Number dockerhub Docker Hub Username bitbucket Bitbucket Workspace ID kaggle Kaggle Username medium Medium Username or custom domain(e.g. https://razonyang.com) lastfm Last.fm Username bibibili BiliBili User ID youtube Youtube Channel ID discord Discord Invite Code discourse Forum URL tiktok TikTok Username pinterest Pinterest Username mastodon Mastodon Username liberapay Liberapay Username paypal Paypal Username patreon Patreon Username tipeee Tipeee Username rss Empty string for disabling the RSS link website Website URL ","date":"December 2, 2021","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/widgets/social-links/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[],"timestamp":1638433665,"title":"Social Links"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Contact Form","url":"/en/categories/contact-form/"}],"content":"We can put our email address on social links so that readers can contact us. Unfortunately, emails will be more or less treated as spam and even filtered. Therefore, we bring a feature called contact form.\nPrerequisites We need to create a contact page called contact/index.md in the content directory, so that we can access the contact form.\n1+++ 2title = \u0026#34;Contact Us\u0026#34; 3layout = \u0026#34;contact\u0026#34; 4+++ Once created, the link will appear in the profile widget.\nParameters Name Type Default Description contact Object - contact.endpoint String - See also Backends. contact.file Boolean false Enable/Disable file upload. contact.fileField String - The name of file field. contact.reCaptcha Object - Google reCAPTCHA contact.reCaptcha.siteKey String - Backends It is designed to be compatible with most backends, such as Netlify form, Getform, Formspree and Fabform.io. Also works with self-hosted alternative Formailer.\nNetlify Netlify form are supported out of box, therefore, you don\u0026rsquo;t need to specify the contact.endpoint parameter.\nThe demo site uses Getform instead of Netlify form, because the Netlify will upgrade your form level automatically if you exceed the limit of current plan, which will lead to additional expenses.\nPlease make sure the contact.endpoint parameter is empty if you intend to use Netlify form.\nFormailer Formailer is supported with a contact form hook to inject a missing input to the form.\nSee also Google Cloud Functions example upstream.\nOthers Let\u0026rsquo;s take Getform as an example:\n1[contact] 2 endpoint = \u0026#34;YOUR_ENDPOINT\u0026#34; reCAPTCHA In addition to set the contact.reCaptcha.siteKey parameter, you need to perform additional steps according to the backend:\nNetlify GetForm ","date":"November 30, 2021","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/layouts/contact/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Netlify","url":"/en/tags/netlify/"},{"title":"Getform","url":"/en/tags/getform/"}],"timestamp":1638287760,"title":"Contact Form"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Assets","url":"/en/categories/assets/"}],"content":"As a customizable theme, it provides the ability to customize assets, whether it is customizing CSS and JS or introducing third-party CSS and JS.\nInternal Assets Just create and edit the files assets/main/scss/_variables.scss, assets/main/scss/_custom.scss and assets/main/js/custom.ts.\nThese files will be bundled into one for reducing HTTP requests.\nExternal Assets Any external CSS and JS resources can be imported by the customCSS and customJS parameters.\n1customCSS = [ 2 \u0026#34;external-foo.css\u0026#34;, 3 \u0026#34;external-bar.css\u0026#34; 4] 5 6customJS = [ 7 \u0026#34;external-foo.js\u0026#34;, 8 \u0026#34;external-bar.js\u0026#34; 9] ","date":"November 28, 2021","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/advanced/custom-assets/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"CSS","url":"/en/tags/css/"},{"title":"JS","url":"/en/tags/js/"}],"timestamp":1638086449,"title":"Custom Assets"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Comments","url":"/en/categories/comments/"},{"title":"Widget","url":"/en/categories/widget/"}],"content":"Disqus, Utterances and Giscus comments widgets are supported out of box. This article shows how to configure them and even customize your own comment widgets.\nDisqus Disqus comments widget is supported by Hugo.\n1disqusShortname = \u0026#34;yourdiscussshortname\u0026#34; Please keep in mind that disqusShortname is a site\u0026rsquo;s configuration, not a parameter. Put it in the params won\u0026rsquo;t work.\nUtterances Utterances is a lightweight comments widget built on GitHub issues.\n1[utterances] 2 repo = \u0026#34;user/repo\u0026#34; 3 #issueTerm = \u0026#34;pathname\u0026#34; # pathname, url, title, og:title. 4 #label = \u0026#34;comment\u0026#34; # Optional. 5 #theme = \u0026#34;\u0026#34; Unlike Disqus, Utterances is a parameter. You should put it in the params.\nParameters Name Type Default Description utterances.repo String - GitHub repository. utterances.issueTerm String pathname The mapping between blog posts and GitHub issues: pathname utterances.label String - The label that will be assigned to issues created by Utterances. utterances.theme String - github-light and github-dark will be used in light and dark mode respectively if not set. Optional values: github-light, github-dark, preferred-color-scheme, github-dark-orange, icy-dark, dark-blue and photon-dark. Troubleshooting Make sure the repo is public, otherwise your readers will not be able to view the issues/comments. Make sure the utterances app is installed on the repo, otherwise users will not be able to post comments. If your repo is a fork, navigate to its settings tab and confirm the issues feature is turned on. Giscus Giscus is a lightweight comments widget built on GitHub discussions.\n1[giscus] 2 repo = \u0026#34;user/repo\u0026#34; 3 repoId = \u0026#34;\u0026#34; 4 category = \u0026#34;\u0026#34; 5 categoryId = \u0026#34;\u0026#34; Parameters Name Type Default Description giscus.repo String - GitHub repository. Required. giscus.repoId String - GitHub repository ID. Required. giscus.category String - Discussions category. Required. giscus.categoryId String - Discussions category ID. Required. giscus.theme String - Left it empty if you want to follow the theme mode. giscus.mapping String pathname The mapping between blog posts and GitHub discussions: pathname, url, title and og:title. giscus.inputPosition String top The input position: top or bottom. giscus.reactions Boolean true Turn on/off the reactions. giscus.metadata Boolean false Emit discussion metadata. giscus.lang String - Specify language, default to site language. giscus.lazyLoading Boolean true Enable lazy loading. Staticman Staticman is also supported out of box, but it may be too complex to set it up.\nAdvantages The comments files are stored inside your repository, that is, the comments are rendered during the site build. It maybe useful for SEO, since it doesn\u0026rsquo;t rely JS to load data dynamically, it\u0026rsquo;s truly static. Handling spam: approve or reject comment via Git provider pull request, Google reCaptcha. Native theme style. Disadvantages The user information are untrusted, such as email. User unable to delete their comments directly, it\u0026rsquo;s able to do that via Pull Request. Preparations Staticman instance Firstly, we should set up a Staticman instance for handling comments requests.\nSelf-Hosted Staticman instance Please see https://staticman.net/docs/getting-started.html#step-2-deploy-staticman for details.\nPublic Staticman instance I set up a public staticman instance for testing, it should works with GitHub repositories only.\nYou\u0026rsquo;ll need to install the GitHub App for your repo, so that the instance has access to write comments files to your repo.\nEndpoint: https://hbs-staticman.herokuapp.com Staticman Configuration Secondary, we need to create the staticman.yml under your site/repository root, so that Staticman instance can read the configuration and process comments requests.\nThe filename, path are fixed, please DO NOT modify those parameters.\nThe allowedFields MUST include name, email, message, reply_to, root_id fields.\n1# Name of the property. You can have multiple properties with completely 2# different config blocks for different sections of your site. 3# For example, you can have one property to handle comment submission and 4# another one to handle posts. 5comments: 6 # (*) REQUIRED 7 # 8 # Names of the fields the form is allowed to submit. If a field that is 9 # not here is part of the request, an error will be thrown. 10 allowedFields: [\u0026#34;name\u0026#34;, \u0026#34;email\u0026#34;, \u0026#34;url\u0026#34;, \u0026#34;message\u0026#34;, \u0026#34;reply_to\u0026#34;, \u0026#34;root_id\u0026#34;] 11 12 # (*) REQUIRED 13 # 14 # Name of the branch being used. Must match the one sent in the URL of the 15 # request. 16 branch: \u0026#34;main\u0026#34; 17 18 # Text to use as the commit message or pull request title. Accepts placeholders. 19 commitMessage: \u0026#34;Add Staticman comment\u0026#34; 20 21 # (*) REQUIRED 22 # 23 # Destination path (filename) for the data files. Accepts placeholders. 24 filename: \u0026#34;{@id}\u0026#34; # DO NOT MODIFY 25 26 # The format of the generated data files. Accepted values are \u0026#34;json\u0026#34;, \u0026#34;yaml\u0026#34; 27 # or \u0026#34;frontmatter\u0026#34; 28 format: \u0026#34;yaml\u0026#34; 29 30 # List of fields to be populated automatically by Staticman and included in 31 # the data file. Keys are the name of the field. The value can be an object 32 # with a `type` property, which configures the generated field, or any value 33 # to be used directly (e.g. a string, number or array) 34 generatedFields: 35 date: 36 type: date 37 options: 38 format: \u0026#34;timestamp-seconds\u0026#34; 39 40 # Whether entries need to be appproved before they are published to the main 41 # branch. If set to `true`, a pull request will be created for your approval. 42 # Otherwise, entries will be published to the main branch automatically. 43 moderation: false 44 45 # Name of the site. Used in notification emails. 46 name: \u0026#34;vandenboom.online\u0026#34; 47 48 # Notification settings. When enabled, users can choose to receive notifications 49 # via email when someone adds a reply or a new comment. This requires an account 50 # with Mailgun, which you can get for free at http://mailgun.com. 51 #notifications: 52 # Enable notifications 53 #enabled: true 54 55 # (!) ENCRYPTED 56 # 57 # Mailgun API key 58 #apiKey: \u0026#34;1q2w3e4r\u0026#34; 59 60 # (!) ENCRYPTED 61 # 62 # Mailgun domain (encrypted) 63 #domain: \u0026#34;4r3e2w1q\u0026#34; 64 65 # (*) REQUIRED 66 # 67 # Destination path (directory) for the data files. Accepts placeholders. 68 path: \u0026#34;data/{options.slug}\u0026#34; # DO NOT MODIFY 69 70 # Names of required fields. If any of these isn\u0026#39;t in the request or is empty, 71 # an error will be thrown. 72 requiredFields: [\u0026#34;name\u0026#34;, \u0026#34;message\u0026#34;] 73 74 # List of transformations to apply to any of the fields supplied. Keys are 75 # the name of the field and values are possible transformation types. 76 transforms: 77 email: md5 # DO NOT MODIFY, REQUIRED BY AVATAR. 78 79 reCaptcha: 80 enabled: false 81 siteKey: \u0026#34;\u0026#34; 82 secret: Site Parameters Finally, tweak the following staticman parameters in params.toml.\nName Type Default Description staticman Object staticman.endpoint String - THe Staticman instance endpoint. Required. staticman.repo String - Repository that with form user/repo. Required. staticman.service String github staticman.branch String master Repository branch. staticman.property String comments staticman.sorting String asc Sorting comments, available options: desc. staticman.reCaptchaKey String - The reCaptcha site key. staticman.reCaptchaSecret String - The reCaptcha encrypted secret. You\u0026rsquo;ll need to encrypt plain secret via https://yourstaticmaninstance/v3/encrypt/plainsecret. staticman.extraFields Array - Extra fields. Available fields: url. staticman.requiredFields Array - Extra required fields. Available fields: email and the extra fields. name and message are always required. staticman.paginate Integer 10 The number of comments per page. staticman.moderation Boolean true Same as Staticman\u0026rsquo;s moderation. reCaptcha The reCaptcha secret is not the plain text version, you\u0026rsquo;ll need to encrypt it via your Staticman instance https://yourstaticmaninstance/v3/encrypt/PLAINSECRET.\nCustom Comments Widget We don\u0026rsquo;t intend to support all comments widgets, but don\u0026rsquo;t worry, you can customize your own comments widget.\nYou will need to disable the others before creating your own comments widget.\n1mkdir -p layouts/partials/post/comments 2echo \u0026#34;MY COMMENTS WIDGET\u0026#34; \u0026gt; layouts/partials/post/comments/custom.html In the meantime, you may need to introduce third-party assets, which can be solved by customizing assets or Hooks easily.\n","date":"November 27, 2021","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/widgets/comments/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Disqus","url":"/en/tags/disqus/"},{"title":"Utterances","url":"/en/tags/utterances/"},{"title":"Giscus","url":"/en/tags/giscus/"},{"title":"Staticman","url":"/en/tags/staticman/"}],"timestamp":1638014069,"title":"Comments Widget"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[],"content":"We are happy to listen to your opinions and feedback, and welcome you to get involved.\nCommunity Feature Request Bug Report Discussions: ask questions, share ideas etc. Contribute Any contributions are welcome, such as docs, bug fix and new feature.\nRules In view of ease of maintenance, we draw up some rules.\nConventional Commits Specification Please follow the Conventional Commits Specification.\nFor example:\nbug fix: fix: correct typos new feature: feat: add the foobar parameter docs: docs: document the foobar parameter style: style: change the background color to blue rebuild assets: chore: rebuild assets Develop The theme relies on npm and Hugo Pipes for building assets: JS, CSS, fonts etc.\nThe source code were placed in assets directory.\nInstall dependencies 1$ cd exampleSite 2$ npm install Preview 1$ npm run serve ","date":"November 27, 2021","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/get-involved/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[],"timestamp":1638014069,"title":"Get Involved"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Hook","url":"/en/categories/hook/"}],"content":"As a flexible theme, it should have the ability to customize code and integrate third-party services. Therefore, we brought a feature called hook.\nIn this article, we will introduce all hooks and provide some use cases.\nOverview Hook Description head-end Before the \u0026lt;head\u0026gt; end body-begin Follow the \u0026lt;body\u0026gt; body-end Before the \u0026lt;body\u0026gt; end main-begin Above of the \u0026lt;main\u0026gt; main-end Follow the \u0026lt;main\u0026gt; list-begin Above of the posts list list-end Follow the posts list sidebar-begin At very top of the sidebar sidebar-end Before the sidebar end content-begin Above of the post content content-end Follow the post content comments-begin Above of the comments comments-end Follow the comments footer-begin At very top of the footer footer-end Before the footer end post-panel-begin At very top of the post panel post-panel-end Before the post panel end docs/sidebar-begin At very top of the docs sidebar docs/sidebar-end Before the docs sidebar end docs/nav-begin At very top of the navigation docs/nav-end Before the navigation end contact/form-field-begin At very top of the contact form field contact/form-field-end Before the contact form field end search/sidebar-begin At very top of the search sidebar search/sidebar-end Before the search sidebar end Usages It\u0026rsquo;s easy to use a hook, what you need to do is that create an HTML file with the same name as hook in the layouts/partials/hooks directory.\nLet\u0026rsquo;s take sidebar-begin as an example:\n1echo \u0026#39;\u0026lt;section class=\u0026#34;row card component text-center\u0026#34;\u0026gt;\u0026lt;div class=\u0026#34;card-body\u0026#34;\u0026gt;SIDEBAR BEGIN\u0026lt;/div\u0026gt;\u0026lt;/section\u0026gt;\u0026#39; \\ 2 \u0026gt; layouts/partials/hooks/sidebar-begin.html ","date":"November 27, 2021","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/advanced/hooks/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[],"timestamp":1638014069,"title":"Hooks"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Configuration","url":"/en/categories/configuration/"}],"content":"Page parameters are located in page\u0026rsquo;s Front Matter.\nName Type Default Description Page title String - Page title. description String - Page description. keywords Array - Page keywords. comment Boolean true Whether to enable comments. It won\u0026rsquo;t work if comment has been disabled globally. toc Boolean true Whether to enable TOC. It won\u0026rsquo;t work if toc has been disabled globally. math Boolean false Whether to enable math. diagram Boolean false Whether to enable diagram. reward Boolean true Whether to enable reward. breadcrumb Boolean true Whether to enable breadcrumb. breadcrumbDivider String / Breadcrumb divider. readingTime Boolean true Whether to display the reading time. postDate Boolean true Whether to display the post date in the post meta section. copyright Boolean true Whether to display copyright section. carousel Boolean false Show on carousel. nav Boolean true Turn on/off the navigations. sidebar Boolean true Show/Hide the sidebar. index Boolean true Index this page in client search engine or not. Creative Commons License creativeCommons Object - creativeCommons.by Boolean true Credit must be given to you, the creator. creativeCommons.nc Boolean true Only noncommercial use of your work is permitted. creativeCommons.nd Boolean true No derivatives or adaptations of your work are permitted. creativeCommons.sa Boolean true Adaptations must be shared under the same terms. Meta Tag metaRobots String - Empty means that turn it off. pinned Boolean false Pinning posts. pinnedWeight Number - Lower weight gets higher precedence. featuredPostCount Integer/Boolean 5 The number of featured posts shown in sidebar. Turn off by setting it to false. recentPostCount Integer/Boolean 5 The number of recent posts shown in sidebar. Turn off by setting it to false. relatedPostCount Integer/Boolean 5 The number of related posts. Turn off by setting it to false. featuredImageAlt String - The alternative text for featured images, fallback to page title if not present. numberifyHeadings Boolean true When false, headings won\u0026rsquo;t be numebrified. ","date":"November 27, 2021","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/configuration/page-params/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[],"timestamp":1638014004,"title":"Page Parameters"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Configuration","url":"/en/categories/configuration/"}],"content":"The site configuration is located in config/_default/config.toml by default.\nName Type Default Description title String - Site title. baseURL String - Site base URL. copyright String - Site copyright. The {year} placeholder will be replaced with the current year. defaultContentLanguage String en Default site\u0026rsquo;s language. defaultContentLanguageInSubdir Boolean false paginate Integer 10 paginatePath String page enableRobotsTXT Boolean true disqusShortname String - Disqus shortname. services Object - services.googleAnalytics Object - Google Analytics, supports GA4 only. services.googleAnalytics.ID String - Measurement ID. author Object - Author Widget. See also All Configuration Settings.\n","date":"November 27, 2021","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/configuration/site/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[],"timestamp":1638014004,"title":"Site Configuration"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Configuration","url":"/en/categories/configuration/"}],"content":"The site parameters are located in config/_default/params.toml by default.\nName Type Default Description sass_transpiler string libsass dartsass is recommended, since libsass is deprecated. Page mainSections Array [\u0026quot;posts\u0026quot;] Main sections titleCase Boolean false Capitalized title or not titleSeparator String - Title separator backgroundImage Array [] Background image, such as ['/images/bg.png'], ['/images/bg-light.png', '/images/bg-dark.png']. comment Boolean true Whether to enable comments toc Boolean true Whether to enable TOC tocWordCount Integer 280 TOC is displayed only if the post\u0026rsquo;s word count is greater than this value. tocPosition String sidebar Available values: sidebar and content, only the posts layout is affected. breadcrumb Boolean true Whether to enable breadcrumb dateFormat String Jan 2, 2006 Date format. Checkout the Hugo Date and Time Templating Reference for details. poweredBy Boolean true Whether to show powered by. readingTime Boolean true Whether to display the reading time. postDate Boolean true Whether to display the post date in the post meta section. math Boolean false Whether to enable math globally. diagram Boolean false Whether to enable diagram globally. logo String/Boolean images/logo.webp Logo image. Disable logo by setting it to false. brand String - Brand text. description String - Site description. keywords String - Site keywords. color String - Color mode, light, dark or auto. Default to auto. palette String - Default palette. This will take effect after clearing the Cookie. palettes Array ALL Available palettes. You can disable it by setting it to empty []. carouselPostCount Integer 5 The number of posts shown on the homepage carousel. featuredPostCount Integer/Boolean 5 The number of featured posts shown in sidebar. Turn off by setting it to false. recentPostCount Integer/Boolean 5 The number of recent posts shown in sidebar. Turn off by setting it to false. relatedPostCount Integer/Boolean 5 The number of related posts. Turn off by setting it to false. categoryCount Integer/Boolean 10 The number of categories shown in sidebar. Turn off by setting it to false. tagCount Integer/Boolean 10 The number of tags shown in sidebar. Turn off by setting it to false. seriesCount Integer 10 The number of series shown in sidebar. taxonomyPaginate Integer 10 taxonomyPostCount Integer 3 The number of taxonomy\u0026rsquo;s posts. Turn off by setting it to false. taxonomySortingMethod String - Sorting taxonomies by popularity, sort alphabetically by default. countTaxonomyPosts Boolean false Count posts of taxonomy. sidebarTaxonomies Array [\u0026quot;series\u0026quot;, \u0026quot;categories\u0026quot;, \u0026quot;tags\u0026quot;] The taxonomies on the sidebar. fullWidth Boolean false Full width. fullWidthInSections Object - Specify the full width for particular sections, such as posts, docs. fixedHeader Boolean true Turn on/off fixed header. reward Object - Reward Widget, AKA Buy Me a Coffee Widget. externalLinkIcon Boolean true Whether to show the icons after the external links. share Object - Share buttons share.addThis String - AddThis\u0026rsquo;s pubid. fontSize Object Font Sizes Comment or remove this parameter to disable font size switcher. fontSize.small String .9rem Small font size. fontSize.extraSmall String .8rem Extra small font size. fontSize.large String 1.1rem Large font size. fontSize.extraLarge String 1.2rem Extra large font size. social Object - Social Links. socialAnimation Boolean true Remove animation from social links if false. socialColor Boolean true Remove color from social links if false. socialShare Boolean true Turn on/off built-on social share button. searchBar Boolean true Turn on/off built-on search bar. archive Object - Archive. search Object - Search. docsearch Object - DocSearch docsearch.container String .search-button docsearch.appId String - docsearch.indexName String - docsearch.apiKey String - docsearch.debug Boolean false docsearch.* Boolean/String/Number - https://docsearch.algolia.com/docs/api/ algolia Object - See Algolia Top App Bar topAppBar Object - topAppBar.social Object - Social Links. topAppBar.colorToggle Boolean true Turn on/off the color/mode toggle. topAppBar.coloredInDark Boolean false Colored in dark mode. topAppBar.dropdownMenuToggle Boolean true Hide the dropdown menu toggle. topAppBar.expandBreakpoint string xxl Expand content above this breakpoint, e.g. lg, xl, xxl. Webmaster Site Verification siteVerification Object - siteVerification.google String - Google siteVerification.bing String - Bing siteVerification.baidu String - Baidu siteVerification.baiduUnion String - Baidu Union siteVerification.so String - Qihoo 360 siteVerification.sogou String - Sogou siteVerification.shenma String - Shenma Analytics analytics Object - Analytics configuration. analytics.baidu String - Baidu Analytics. analytics.plausible String - Plausible Analytics Domains. Multiple domains separate by comma. analytics.plausibleScript String https://plausible.io/js/script.js Specify the self-hosted Plausible Analytics script or extended script. googleAdsense String - Google Adsense. customCSS Array - See also custom assets. customJS Array - See also custom assets. utterances Object - Utterances configuration. giscus Object - Giscus configuration. Creative Commons License creativeCommons Object - creativeCommons.by Boolean true Credit must be given to you, the creator. creativeCommons.nc Boolean true Only noncommercial use of your work is permitted. creativeCommons.nd Boolean true No derivatives or adaptations of your work are permitted. creativeCommons.sa Boolean true Adaptations must be shared under the same terms. Code Block codeBlock Object - codeBlock.maxLines Integer 7 codeBlock.lineNos Boolean true true/false represents that show/hide the line numbers by default. Post post Object - post.excerpt String Description The description will be used as the excerpt if not empty, to use summaries as excerpt, you\u0026rsquo;ll need to set it as empty string explicitly. post.excerptMaxLength Integer 320 post.copyright Boolean true Whether to display copyright section on each post. post.plainifyExcerpt Boolean true Format excerpt in HTML if false. post.featuredImage Boolean false Show the featured image above the content. post.numberifyHeadings Boolean false Count headings automatically. post.numberifyHeadingsEndLevel Number 6 The depth of headings to count. post.numberifyHeadingsSeparator String - The separator between of number and headings. post.tocStyleType String none The TOC\u0026rsquo;s CSS list-style-type property. post.imageTitleAsCaption Boolean false Use image title as caption. post.panel Boolean true Turn on/off the post panel. post.nav Boolean true Turn on/off the navigations. post.readMoreFromContent Boolean false The page position after clicking the read more button, read more from content if true. Default to the beginning of page. It supports only of the manual summaries splitting via \u0026lt;!--more--\u0026gt;. viewer Boolean true Image Viewer pwa Object - Progressive Web Apps Sidebar sidebar Object - sidebar.fixed Boolean false Fix default sidebar. sidebar.taxonomiesToggle Boolean true Show the taxonomies toggle widget on the sidebar. sidebar.taxonomiesToggleArchives Boolean true Show/Hide the archives from the taxonomies toggle. sidebar.series Boolean false Show the series widget on the sidebar. sidebar.categories Boolean false Show the categories widget on the sidebar. sidebar.tags Boolean false Show the tags widget on the sidebar. sidebar.archives Boolean false Show the archive widget on the sidebar. sidebar.authors Boolean false Show the authors widget on the sidebar. sidebar.postsToggle Boolean true Show the posts toggle on the sidebar. sidebar.featuredPosts Boolean false Show the featured posts widget on the sidebar. sidebar.recentPosts Boolean false Show the recent posts widget on the sidebar. sidebar.collapsed Boolean flase Collapse sidebar widgets by default on small screens. Meta Tag metaRobots String - Empty means that turn it off. contact Object - Contact Form pinnedPost Boolean true Turn on/off pinned posts. pinnedPostCount Integer 1 The number of pinned posts. rss String/Boolean true Display the RSS button on the social links. Turn it off by false, link it to homepage all the times by setting it to home. feeds Object - RSS feeds feeds.content Boolean false Display the full content if ebabled. actionsPanel Object - actionsPanel.disabled Boolean false Disable actions panel. repo Object - See Repository widget. docs.nav Object - Docs layout navigation. docs.nav.reduceFontSize Boolean true When false, don\u0026rsquo;t reduce the font size of children navigation. Except the Google webmaster tool, the other webmaster tools cannot work with hugo --minify, because they cannot recognize the minified meta tag.\n","date":"November 27, 2021","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/configuration/site-params/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[],"timestamp":1638014004,"title":"Site Parameters"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Configuration","url":"/en/categories/configuration/"}],"content":"As the example site shown, we use Configuration Directory to maintain easier organization and environment specific settings, it is especially useful on multilingual sites.\n1├── _default 2│ ├── config.toml 3│ ├── config.zh-hans.toml 4│ ├── config.zh-hant.toml 5│ ├── languages.toml 6│ ├── markup.toml 7│ ├── menu.toml 8│ ├── menu.zh-hans.toml 9│ ├── menu.zh-hant.toml 10│ ├── params.toml 11│ ├── params.zh-hans.toml 12│ ├── params.zh-hant.toml 13│ ├── server.toml 14└── production 15 ├── config.toml 16 └── params.toml Hugo supports multiple configuration formats: TOML, YAML and JSON, change it at will.\n_default contains the default configurations. production configurations will override the default configurations on production environment. You can also define more environment configurations, such as development(the default environment of hugo server), testing, staging. And then specify the environment via -e flag. The configurations filename with language code affected take effect only on that language site, such as config.zh-hans.toml, it\u0026rsquo;s useful to separate configurations and parameters from different languages. The multilingual configurations doesn\u0026rsquo;t work on author configurations, that is, author.zh-hans.toml will not take effect. The config, params, menu and menus are known that supported multilingual configuring.\n","date":"November 27, 2021","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/configuration/structure/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[],"timestamp":1638014004,"title":"Configuration Structure"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Markdown","url":"/en/categories/markdown/"}],"content":"This article offers a sample of basic diagram usage that can be used in Hugo content files.\nPlease see also Mermaid.\nUsage Via Shortcode 1{{\u0026lt; mermaid \u0026gt;}} 2YOUR DIAGRAM INSTRUCTIONS 3{{\u0026lt; /mermaid \u0026gt;}} You can also wrap the shortcode with other shortcodes, such as text/align-center.\n1{{% text/align-center %}} 2{{\u0026lt; mermaid \u0026gt;}} 3YOUR DIAGRAM INSTRUCTIONS 4{{\u0026lt; /mermaid \u0026gt;}} 5{{% /text/align-center %}} Mermaid code block 1```mermaid 2YOUR DIAGRAM INSTRUCTIONS 3``` Examples Flow Chart 1{{\u0026lt; mermaid \u0026gt;}} 2graph TD 3 A[Christmas] --\u0026gt;|Get money| B(Go shopping) 4 B --\u0026gt; C{Let me think} 5 C --\u0026gt;|One| D[Laptop] 6 C --\u0026gt;|Two| E[iPhone] 7 C --\u0026gt;|Three| F[fas:fa-car Car] 8{{\u0026lt; /mermaid \u0026gt;}} graph TD A[Christmas] --\u003e|Get money| B(Go shopping) B --\u003e C{Let me think} C --\u003e|One| D[Laptop] C --\u003e|Two| E[iPhone] C --\u003e|Three| F[fas:fa-car Car] We need to import the faCar solid icon first, in order to use the fas:fa-car FontAwesome icon.\nSequence Diagram 1{{\u0026lt; mermaid \u0026gt;}} 2sequenceDiagram 3 Alice-\u0026gt;\u0026gt;+John: Hello John, how are you? 4 Alice-\u0026gt;\u0026gt;+John: John, can you hear me? 5 John--\u0026gt;\u0026gt;-Alice: Hi Alice, I can hear you! 6 John--\u0026gt;\u0026gt;-Alice: I feel great! 7{{\u0026lt; /mermaid \u0026gt;}} sequenceDiagram Alice-\u003e\u003e+John: Hello John, how are you? Alice-\u003e\u003e+John: John, can you hear me? John--\u003e\u003e-Alice: Hi Alice, I can hear you! John--\u003e\u003e-Alice: I feel great! Class Diagram 1```mermaid 2classDiagram 3 Animal \u0026lt;|-- Duck 4 Animal \u0026lt;|-- Fish 5 Animal \u0026lt;|-- Zebra 6 Animal : +int age 7 Animal : +String gender 8 Animal: +isMammal() 9 Animal: +mate() 10 class Duck{ 11 +String beakColor 12 +swim() 13 +quack() 14 } 15 class Fish{ 16 -int sizeInFeet 17 -canEat() 18 } 19 class Zebra{ 20 +bool is_wild 21 +run() 22 } 23``` classDiagram Animal \u0026lt;|-- Duck Animal \u0026lt;|-- Fish Animal \u0026lt;|-- Zebra Animal : \u0026#43;int age Animal : \u0026#43;String gender Animal: \u0026#43;isMammal() Animal: \u0026#43;mate() class Duck{ \u0026#43;String beakColor \u0026#43;swim() \u0026#43;quack() } class Fish{ -int sizeInFeet -canEat() } class Zebra{ \u0026#43;bool is_wild \u0026#43;run() }","date":"September 1, 2021","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/posts/diagram/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Diagram","url":"/en/tags/diagram/"}],"timestamp":1630467410,"title":"Diagram Guide"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Markdown","url":"/en/categories/markdown/"}],"content":"This article offers some use cases for showing how to resize, crop, fit, fill and align images.\nResizing Images We use the URL query of image for resizing images. For example:\nSpecify the width and preserve ratio 1![Resize](featured-sample.webp?width=300px) Specify the height and preserve ratio 1![Resize](featured-sample.webp?height=200px) Specify the width and height 1![Resize](featured-sample.webp?width=300px\u0026amp;height=200px) It can be used not only for page resources, but also for the static images and external images. However, in addition to page resources, others are resized by inline style, that is, their original size will not change.\nAligning Images We can easily align images by adding URL fragments. Such as #center, #float-start and #float-end represents align center, float start and float end respectively.\nCenter Adding the #center fragment for aligning images to the center.\nFor example: ![Center](/featured-sample.webp#center).\nFloat Start Adding the #float-start fragment for floating images to the start, we have to wrap it inside clearfix shortcode to avoid breaking the layout.\nPlease note that use %% instead of \u0026lt;\u0026gt; to render content as Markdown fully.\nFor example.\n1{{/% clearfix %/}} 2![Float Start](/featured-sample.webp#float-start) TEXTS AROUNDS THE IMAGE. 3{{/% /clearfix %/}} Float End Similarly, we can also float images to the end by adding the #float-end fragment.\nFor example.\n1{{/% clearfix %/}} 2![Float End](/featured-sample.webp#float-end) TEXTS AROUNDS THE IMAGE. 3{{/% /clearfix %/}} Caption HBS allows using image title as caption, this feature is disabled by default, you need to enable the post.imageTitleAsCaption parameter:\nTOML YAML JSON params.toml\n1[post] 2 imageTitleAsCaption = true params.yaml\n1post: 2 imageTitleAsCaption: true params.json\n1{ 2 \u0026#34;post\u0026#34;: { 3 \u0026#34;imageTitleAsCaption\u0026#34;: true 4 } 5} 1![Image Caption](/featured-sample.webp \u0026#34;Use Image Title as Caption\u0026#34;) Use Image Title as Caption Crop Images Crop an image to match the given dimensions without resizing. You must provide both width and height. Use the anchor1 option to change the crop box anchor point.\n1![Crop Image](/featured-sample.webp?crop=[width]x[height],[anchor]) The size [width]x[height] is required. [anchor] is optional, the , is used to separate the size and anchor. Examples crop=200x200,TopLeft crop=200x200,Top crop=200x200,TopRight crop=200x200,Left crop=200x200,Center crop=200x200,Right crop=200x200,BottomLeft crop=200x200,Bottom crop=200x200,BottomRight Fill Images Crop and resize an image to match the given dimensions. You must provide both width and height. Use the anchor1 option to change the crop box anchor point.\n1![Fill Image](/featured-sample.webp?fill=[width]x[height],[anchor]) The size [width]x[height] is required. [anchor] is optional, the , is used to separate the size and anchor. Examples fill=150x200,TopLeft fill=150x200,Top fill=150x200,TopRight fill=150x200,Left fill=150x200,Center fill=150x200,Right fill=150x200,BottomLeft fill=150x200,Bottom fill=150x200,BottomRight Fit Images Downscale an image to fit the given dimensions while maintaining aspect ratio. You must provide both width and height.\n1![Fit Image](/featured-sample.webp?fit=[width]x[height]) Filters Brightness The brightness must be in range (-100, 100).\n1![Image Brightness](/featured-sample.webp?brightness=-30) ColorBalance ColorBalance creates a filter that changes the color balance of an image. The percentage parameters for each color channel (red, green, blue) must be in range (-100, 500).\n1![Image ColorBalance](/featured-sample.webp?colorBalance=-50,50,150) Colorize Colorize creates a filter that produces a colorized version of an image. The hue parameter is the angle on the color wheel, typically in range (0, 360). The saturation parameter must be in range (0, 100). The percentage parameter specifies the strength of the effect, it must be in range (0, 100).\n1![Image Colorize](/featured-sample.webp?colorize=-100,50,150) Contrast The contrast must be in range (-100, 100).\n1![Image Contrast](/featured-sample.webp?contrast=50) Gamma Gamma creates a filter that performs a gamma correction on an image. The gamma parameter must be positive. Gamma = 1 gives the original image. Gamma less than 1 darkens the image and gamma greater than 1 lightens it.\n1![Image Gamma](/featured-sample.webp?gamma=2) GaussianBlur Applies a gaussian blur to an image.\n1![Image GaussianBlur](/featured-sample.webp?gaussianBlur=2) Grayscale Grayscale creates a filter that produces a grayscale version of an image.\n1![Image Grayscale](/featured-sample.webp?grayscale) Hue Hue creates a filter that rotates the hue of an image. The hue angle shift is typically in range -180 to 180.\n1![Image Hue](/featured-sample.webp?hue=90) Invert Invert creates a filter that negates the colors of an image.\n1![Image Invert](/featured-sample.webp?invert) Pixelate Pixelate creates a filter that applies a pixelation effect to an image.\n1![Image Pixelate](/featured-sample.webp?pixelate=8) Saturation Saturation creates a filter that changes the saturation of an image.\n1![Image Saturation](/featured-sample.webp?saturation=100) Sepia Sepia creates a filter that produces a sepia-toned version of an image.\n1![Image Sepia](/featured-sample.webp?sepia=200) Sigmoid Sigmoid creates a filter that changes the contrast of an image using a sigmoidal function and returns the adjusted image. It’s a non-linear contrast change useful for photo adjustments as it preserves highlight and shadow detail.\n1![Image Sigmoid](/featured-sample.webp?sigmoid=2,5) UnsharpMask UnsharpMask creates a filter that sharpens an image. The sigma parameter is used in a gaussian function and affects the radius of effect. Sigma must be positive. Sharpen radius roughly equals 3 * sigma. The amount parameter controls how much darker and how much lighter the edge borders become. Typically between 0.5 and 1.5. The threshold parameter controls the minimum brightness change that will be sharpened. Typically between 0 and 0.05.\n1![Image UnsharpMask](/featured-sample.webp?unsharpMask=10,1,0.05) When using the Crop or Fill method, the anchor determines the placement of the crop box. You may specify TopLeft, Top, TopRight, Left, Center, Right, BottomLeft, Bottom, BottomRight, or Smart. The default value is Smart.\u0026#160;\u0026#x21a9;\u0026#xfe0e;\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"August 15, 2021","img":"/docs/image-processing/featured-sample.webp","lang":"en","langName":"English","largeImg":"/docs/image-processing/featured-sample_hu_1fde8481ba13bdfe.webp","permalink":"/en/docs/image-processing/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"/docs/image-processing/featured-sample_hu_83bcf2b9437c7b6a.webp","tags":[{"title":"Image","url":"/en/tags/image/"},{"title":"Caption","url":"/en/tags/caption/"},{"title":"Resize","url":"/en/tags/resize/"},{"title":"Crop","url":"/en/tags/crop/"},{"title":"Fill","url":"/en/tags/fill/"},{"title":"Fit","url":"/en/tags/fit/"},{"title":"Brightness","url":"/en/tags/brightness/"},{"title":"ColorBalance","url":"/en/tags/colorbalance/"},{"title":"Colorize","url":"/en/tags/colorize/"},{"title":"Contrast","url":"/en/tags/contrast/"},{"title":"Gamma","url":"/en/tags/gamma/"},{"title":"GaussianBlur","url":"/en/tags/gaussianblur/"},{"title":"Grayscale","url":"/en/tags/grayscale/"},{"title":"Hue","url":"/en/tags/hue/"},{"title":"Invert","url":"/en/tags/invert/"},{"title":"Pixelate","url":"/en/tags/pixelate/"},{"title":"Saturation","url":"/en/tags/saturation/"},{"title":"Sepia","url":"/en/tags/sepia/"},{"title":"Sigmoid","url":"/en/tags/sigmoid/"},{"title":"UnsharpMask","url":"/en/tags/unsharpmask/"}],"timestamp":1629008346,"title":"Image Processing"},{"authors":[{"title":"Hugo Authors","url":"/en/authors/hugo/"}],"categories":[],"content":" Headings The following HTML \u0026lt;h1\u0026gt;—\u0026lt;h6\u0026gt; elements represent six levels of section headings. \u0026lt;h1\u0026gt; is the highest section level while \u0026lt;h6\u0026gt; is the lowest.\nH1 H2 H3 H4 H5 H6 Paragraph Xerum, quo qui aut unt expliquam qui dolut labo. Aque venitatiusda cum, voluptionse latur sitiae dolessi aut parist aut dollo enim qui voluptate ma dolestendit peritin re plis aut quas inctum laceat est volestemque commosa as cus endigna tectur, offic to cor sequas etum rerum idem sintibus eiur? Quianimin porecus evelectur, cum que nis nust voloribus ratem aut omnimi, sitatur? Quiatem. Nam, omnis sum am facea corem alique molestrunt et eos evelece arcillit ut aut eos eos nus, sin conecerem erum fuga. Ri oditatquam, ad quibus unda veliamenimin cusam et facea ipsamus es exerum sitate dolores editium rerore eost, temped molorro ratiae volorro te reribus dolorer sperchicium faceata tiustia prat.\nItatur? Quiatae cullecum rem ent aut odis in re eossequodi nonsequ idebis ne sapicia is sinveli squiatum, core et que aut hariosam ex eat.\nBlockquotes The blockquote element represents content that is quoted from another source, optionally with a citation which must be within a footer or cite element, and optionally with in-line changes such as annotations and abbreviations.\nBlockquote without attribution Tiam, ad mint andaepu dandae nostion secatur sequo quae.\nNote that you can use Markdown syntax within a blockquote.\nBlockquote with attribution Don\u0026rsquo;t communicate by sharing memory, share memory by communicating.\n— Rob Pike1\nBlockquote Alerts 1\u0026gt; [!NOTE] 2\u0026gt; Useful information that users should know, even when skimming content. 3 4\u0026gt; [!TIP] 5\u0026gt; Helpful advice for doing things better or more easily. 6 7\u0026gt; [!IMPORTANT] 8\u0026gt; Key information users need to know to achieve their goal. 9 10\u0026gt; [!WARNING] 11\u0026gt; Urgent info that needs immediate user attention to avoid problems. 12 13\u0026gt; [!CAUTION] 14\u0026gt; Advises about risks or negative outcomes of certain actions. 15 16\u0026gt; [!QUESTION]+ Can alerts be foldable? 17\u0026gt; Yes, they can, you just need to append the `+` or `-` sign to the type. 18\u0026gt; 19\u0026gt; Click the heading to preview. Note Useful information that users should know, even when skimming content.\nTip Helpful advice for doing things better or more easily.\nImportant Key information users need to know to achieve their goal.\nWarning Urgent info that needs immediate user attention to avoid problems.\nCaution Advises about risks or negative outcomes of certain actions.\nCan alerts be foldable? Yes, they can, you just need to append the + or - sign to the type.\nClick the heading to preview.\nTables Tables aren\u0026rsquo;t part of the core Markdown spec, but Hugo supports supports them out-of-the-box.\nName Age Bob 27 Alice 23 Inline Markdown within tables Italics Bold Code italics bold code Code Blocks Code block with backticks 1\u0026lt;!doctype html\u0026gt; 2\u0026lt;html lang=\u0026#34;en\u0026#34;\u0026gt; 3\u0026lt;head\u0026gt; 4 \u0026lt;meta charset=\u0026#34;utf-8\u0026#34;\u0026gt; 5 \u0026lt;title\u0026gt;Example HTML5 Document\u0026lt;/title\u0026gt; 6\u0026lt;/head\u0026gt; 7\u0026lt;body\u0026gt; 8 \u0026lt;p\u0026gt;Test\u0026lt;/p\u0026gt; 9\u0026lt;/body\u0026gt; 10\u0026lt;/html\u0026gt; Code block with Hugo’s internal highlight shortcode 1\u0026lt;!doctype html\u0026gt; 2\u0026lt;html lang=\u0026#34;en\u0026#34;\u0026gt; 3\u0026lt;head\u0026gt; 4 \u0026lt;meta charset=\u0026#34;utf-8\u0026#34;\u0026gt; 5 \u0026lt;title\u0026gt;Another Example HTML5 Document\u0026lt;/title\u0026gt; 6\u0026lt;/head\u0026gt; 7\u0026lt;body\u0026gt; 8 \u0026lt;p\u0026gt;A looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong text\u0026lt;/p\u0026gt; 9\u0026lt;/body\u0026gt; 10\u0026lt;/html\u0026gt; List Types Ordered List First item Second item Third item Unordered List List item Another item And another item Nested List Fruit Apple Orange Banana Dairy Milk Cheese TODO List Done WIP Other Elements — abbr, sub, sup, kbd, mark GIF is a bitmap image format.\nH2O\nXn + Yn = Zn\nPress CTRL+ALT+Delete to end the session.\nMost salamanders are nocturnal, and hunt for insects, worms, and other small creatures.\nThe above quote is excerpted from Rob Pike\u0026rsquo;s talk during Gopherfest, November 18, 2015.\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"November 9, 2020","img":"https://1552afcb.notes-6if.pages.dev/images/markdown.png","lang":"en","langName":"English","largeImg":"","permalink":"/en/posts/markdown-syntax/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Markdown","url":"/en/tags/markdown/"},{"title":"CSS","url":"/en/tags/css/"},{"title":"HTML","url":"/en/tags/html/"}],"timestamp":1604880000,"title":"Markdown Syntax Guide"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Shortcode","url":"/en/categories/shortcode/"}],"content":"This article shows how to use the alert shortcode.\nImportant Since v1.8.0, you can create alerts without shortcode, see blockquote alerts.\nSyntax Inline 1{{\u0026lt; alert [type] \u0026gt;}}INLINE ALERT{{\u0026lt; /alert \u0026gt;}} Block 1{{\u0026lt; alert [type] \u0026gt;}} 2BLOCK ALERT 3{{\u0026lt; /alert \u0026gt;}} The parameter type is optional. Default to info, available values: info, success, warning and danger.\nWith Heading 1{{\u0026lt; alert [type] \u0026gt;}} 2{{\u0026lt; alert-heading \u0026gt;}}Well Done!{{\u0026lt; /alert-heading \u0026gt;}} 3ALERT MESSAGE 4{{\u0026lt; /alert \u0026gt;}} With Markdown Syntax 1{{% alert warning %}} 2Alert Shortcode with Markdown Syntax: 3```bash 4$ echo \u0026#39;An example of alert shortcode with the Markdown syntax\u0026#39; 5``` 6{{% /alert %}} Alert Shortcode with Markdown Syntax:\n1$ echo \u0026#39;An example of alert shortcode with the Markdown syntax\u0026#39; Please note that you\u0026rsquo;ll need to enable the markup.goldmark.renderer.unsafe configuration.\nTOML YAML JSON config.toml\n1[markup] 2 [markup.goldmark] 3 [markup.goldmark.renderer] 4 unsafe = true config.yaml\n1markup: 2 goldmark: 3 renderer: 4 unsafe: true config.json\n1{ 2 \u0026#34;markup\u0026#34;: { 3 \u0026#34;goldmark\u0026#34;: { 4 \u0026#34;renderer\u0026#34;: { 5 \u0026#34;unsafe\u0026#34;: true 6 } 7 } 8 } 9} Examples Primary Info Aww yeah, you successfully read this important alert message. This example text is going to run a bit longer so that you can see how spacing within an alert works with this kind of content. Warning Danger Well Done! Aww yeah, you successfully read this important alert message. This example text is going to run a bit longer so that you can see how spacing within an alert works with this kind of content. ","date":"October 22, 2020","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/shortcodes/alert/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Alert","url":"/en/tags/alert/"}],"timestamp":1603324800,"title":"Alert Shortcode"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Shortcode","url":"/en/categories/shortcode/"}],"content":"A detailed description of media shortcodes, such as Bilibili, Tencent, Youku, iQiyi and Netease Music.\nBilibili 1{{\u0026lt; bilibili \u0026#34;video id\u0026#34; \u0026gt;}} Tencent 1{{\u0026lt; tencentvideo \u0026#34;vid\u0026#34; \u0026gt;}} Youku 1{{\u0026lt; youku \u0026#34;XNTQwMTgxMTE2\u0026#34; \u0026gt;}} iQiyi 1{{\u0026lt; iqiyi \u0026#34;vid\u0026#34; \u0026#34;tvid\u0026#34; \u0026gt;}} Netease Music 1{{\u0026lt; neteasemusic \u0026#34;id\u0026#34; [auto [type]] \u0026gt;}} Parameter Description auto The auto controls whether to autoplay. Boolean and optional, default to false. type The type parameter is optional. Default to 2. asciinema 1{{\u0026lt; asciinema id \u0026gt;}} ","date":"October 22, 2020","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/shortcodes/media/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"Bilibili","url":"/en/tags/bilibili/"},{"title":"Tencent","url":"/en/tags/tencent/"},{"title":"Youku","url":"/en/tags/youku/"},{"title":"IQiyi","url":"/en/tags/iqiyi/"},{"title":"Netease Music","url":"/en/tags/netease-music/"},{"title":"Asciinema","url":"/en/tags/asciinema/"}],"timestamp":1603324800,"title":"Media Shortcodes"},{"authors":[{"title":"Razon Yang","url":"/en/authors/razonyang/"}],"categories":[{"title":"Shortcode","url":"/en/categories/shortcode/"}],"content":"A detailed description of online IDE shortcodes, such as JSFiddle, CodePen, JSRun.\nJSFiddle 1{{\u0026lt; jsfiddle \u0026#34;user/id\u0026#34; \u0026gt;}} CodePen 1{{\u0026lt; codepen \u0026#34;id\u0026#34; \u0026gt;}} JSRun 1{{\u0026lt; jsrun \u0026#34;id\u0026#34; \u0026gt;}} Gist 1{{\u0026lt; gist razonyang f82a9399c2f682df36432f0ef828c451 \u0026gt;}} ","date":"October 22, 2020","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/docs/shortcodes/online-ide/","series":[{"title":"Docs","url":"/en/series/docs/"}],"smallImg":"","tags":[{"title":"JSFiddle","url":"/en/tags/jsfiddle/"},{"title":"CodePen","url":"/en/tags/codepen/"},{"title":"JSRun","url":"/en/tags/jsrun/"}],"timestamp":1603324800,"title":"Online IDE Shortcodes"},{"authors":[{"title":"Hugo Authors","url":"/en/authors/hugo/"}],"categories":[],"content":"Hugo ships with several Built-in Shortcodes for rich content, along with a Privacy Config and a set of Simple Shortcodes that enable static and no-JS versions of various social media embeds.\nInstagram Simple Shortcode 1{{\u0026lt; instagram_simple BGvuInzyFAe hidecaption \u0026gt;}} YouTube Privacy Enhanced Shortcode 1{{\u0026lt; youtube ZJthWmvUzzc \u0026gt;}} Twitter Simple Shortcode 1{{\u0026lt; twitter_simple 1085870671291310081 \u0026gt;}} Vimeo Simple Shortcode 1{{\u0026lt; vimeo_simple 48912912 \u0026gt;}} ","date":"March 10, 2019","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/posts/rich-content/","series":[],"smallImg":"","tags":[{"title":"Instagram","url":"/en/tags/instagram/"},{"title":"YouTube","url":"/en/tags/youtube/"},{"title":"Twitter","url":"/en/tags/twitter/"},{"title":"Vimeo","url":"/en/tags/vimeo/"},{"title":"Privacy","url":"/en/tags/privacy/"}],"timestamp":1552176000,"title":"Rich Content"},{"authors":[{"title":"Hugo Authors","url":"/en/authors/hugo/"}],"categories":[],"content":"Lorem est tota propiore conpellat pectoribus de pectora summo.\nRedit teque digerit hominumque toris verebor lumina non cervice subde tollit usus habet Arctonque, furores quas nec ferunt. Quoque montibus nunc caluere tempus inhospita parcite confusaque translucet patri vestro qui optatis lumine cognoscere flos nubis! Fronde ipsamque patulos Dryopen deorum.\nExierant elisi ambit vivere dedere Duce pollice Eris modo Spargitque ferrea quos palude Rursus nulli murmur; hastile inridet ut ab gravi sententia! Nomine potitus silentia flumen, sustinet placuit petis in dilapsa erat sunt. Atria tractus malis.\nComas hunc haec pietate fetum procerum dixit Post torum vates letum Tiresia Flumen querellas Arcanaque montibus omnes Quidem et Vagus elidunt The Van de Graaf Canon\nMane refeci capiebant unda mulcebat Victa caducifer, malo vulnere contra dicere aurato, ludit regale, voca! Retorsit colit est profanae esse virescere furit nec; iaculi matertera et visa est, viribus. Divesque creatis, tecta novat collumque vulnus est, parvas. Faces illo pepulere tempus adest. Tendit flamma, ab opes virum sustinet, sidus sequendo urbis.\nIubar proles corpore raptos vero auctor imperium; sed et huic: manus caeli Lelegas tu lux. Verbis obstitit intus oblectamina fixis linguisque ausus sperare Echionides cornuaque tenent clausit possit. Omnia putatur. Praeteritae refert ausus; ferebant e primus lora nutat, vici quae mea ipse. Et iter nil spectatae vulnus haerentia iuste et exercebat, sui et.\nEurytus Hector, materna ipsumque ut Politen, nec, nate, ignari, vernum cohaesit sequitur. Vel mitis temploque vocatus, inque alis, oculos nomen non silvis corpore coniunx ne displicet illa. Crescunt non unus, vidit visa quantum inmiti flumina mortis facto sic: undique a alios vincula sunt iactata abdita! Suspenderat ego fuit tendit: luna, ante urbem Propoetides parte.\n","date":"March 9, 2019","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/posts/placeholder-text/","series":[],"smallImg":"","tags":[{"title":"Markdown","url":"/en/tags/markdown/"},{"title":"Text","url":"/en/tags/text/"}],"timestamp":1552089600,"title":"Placeholder Text"},{"authors":[{"title":"Hugo Authors","url":"/en/authors/hugo/"}],"categories":[],"content":"Mathematical notation in a Hugo project can be enabled by using third party JavaScript libraries.\nThis theme supports KaTeX.\nWhen using a math code block or katex shortcode, KaTeX is activated automatically. To manually enable KaTeX globally set the parameter math to true in a project\u0026rsquo;s configuration file. To enable KaTeX on a per page basis include the parameter math: true in the frontmatter of the content files. Note: Use the online reference of Supported TeX Functions\nExamples Inline Such as \\\\(\\KaTeX\\\\)(\\(\\KaTeX\\)) and $\\LaTeX$($\\LaTeX$).\nBlock 1$$ 2FORMULA 3$$ $$ (\\varphi = \\dfrac{1+\\sqrt5}{2}= 1.6180339887…) $$\n\\[ \\varphi = 1+\\frac{1} {1+\\frac{1} {1+\\frac{1} {1+\\cdots} } } \\]\nMath code block(recommended) See GitLab Flavored Markdown.\n1```math 2FORMULA 3``` The probability of getting \\(k\\) heads when flipping \\(n\\) coins is:\n$$ \\tag*{(1)} P(E) = {n \\choose k} p^k (1-p)^{n-k} $$ Multiple lines via shortcode(recommended) 1{{\u0026lt; katex \u0026gt;}} 2FORMULA 3{{\u0026lt; /katex \u0026gt;}} $$ \\begin{array}{l} E_{o 1}=\\frac{1}{2}\\left( { target }_{o 1}- { out }_{o 1}\\right)^{2}=\\frac{1}{2}(0.01-0.75136507)^{2}=0.274811083 \\\\ E_{o 2}=0.023560026 \\\\ E_{ {total }}=E_{o 1}+E_{o 2}=0.274811083+0.023560026=0.298371109 \\end{array} $$ ","date":"March 8, 2019","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/posts/math-typesetting/","series":[],"smallImg":"","tags":[{"title":"Math","url":"/en/tags/math/"}],"timestamp":1552003200,"title":"Math Typesetting"},{"authors":[{"title":"Hugo Authors","url":"/en/authors/hugo/"}],"categories":[],"content":"Emoji can be enabled in a Hugo project in a number of ways.\nThe emojify function can be called directly in templates or Inline Shortcodes.\nTo enable emoji globally, set enableEmoji to true in your site\u0026rsquo;s configuration and then you can type emoji shorthand codes directly in content files; e.g.\n🙈 :see_no_evil: 🙉 :hear_no_evil: 🙊 :speak_no_evil:\nThe Emoji cheat sheet is a useful reference for emoji shorthand codes.\nN.B. The above steps enable Unicode Standard emoji characters and sequences in Hugo, however the rendering of these glyphs depends on the browser and the platform. To style the emoji you can either use a third party emoji font or a font stack; e.g.\n1.emoji { 2 font-family: Apple Color Emoji, Segoe UI Emoji, NotoColorEmoji, Segoe UI Symbol, Android Emoji, EmojiSymbols; 3}","date":"March 5, 2019","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/posts/emoji-support/","series":[],"smallImg":"","tags":[{"title":"Emoji","url":"/en/tags/emoji/"}],"timestamp":1551744000,"title":"Emoji Support"},{"authors":[],"categories":[],"content":"","date":"January 1, 1","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/faq/","series":[],"smallImg":"","tags":[],"timestamp":-62135596800,"title":"FAQs"},{"authors":[],"categories":[],"content":"","date":"January 1, 1","img":"","lang":"en","langName":"English","largeImg":"","permalink":"/en/archive/","series":[],"smallImg":"","tags":[],"timestamp":-62135596800,"title":"Posts Archive"}]
