<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Kowa's Blog]]></title><description><![CDATA[Cheerful, tech-savvy dragon who loves programming and often shares his passion through teaching. Also cherishes cozy naps!]]></description><link>https://kowalski7cc.xyz</link><generator>GatsbyJS</generator><lastBuildDate>Sat, 30 May 2026 23:43:04 GMT</lastBuildDate><item><title><![CDATA[Short-lived certificates: a nuisance or an automation opportunity?]]></title><description><![CDATA[The advent of the World Wide Web, based on the HTTP (HyperText Transfer Protocol) protocol, introduced an incredible ability to connect…]]></description><link>https://kowalski7cc.xyz/blog/short-lived-certificates</link><guid isPermaLink="false">https://kowalski7cc.xyz/blog/short-lived-certificates</guid><pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 936px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/ee45f7ed2beb28ab85997e29a0a8c97c/cb136/cover.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 54.49999999999999%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACPklEQVR42nXQ209SARzA8R9bb22tp9zaii5rPbcuc1KEqODhcJHD4XATkYuSoJzD9ZwjNxVwnUKXARKxoStNp0AgaLPxYDbX+APa6r/pONeqzbbPvvu9/B5+P8iwe2l2j2OaWabxX3QjwzbTTOMMP5+BeGB33r/jYRr6xCdT/MB4HlNsPxqqpSPNFN1K0c25UG0+/JEvsNPvaXKzJ3kIZE3gqwJZBep3qaqAqglmdiDZkYa3LYopDJ3SK73URMltfUm58sA63yrp+unmSA6IImAFGMn/KVYQqF+Ba+uSr3JHKLxx7fpN4e2nj/oDdpMV84LHWboaOwBz+fF8625oV7l0GNjoOstfg5vdseKRq3xsXj26aCn22mYQLTGuRUpcxGnEswyJo5Oge1a5wLZB/Tr0obv25ad3/cS/8e1hvOFZO9GvdIqd74XPP/DYojM4Lu2TTpqIRcqBoyg27Bw10mAjsj2zLTCVh7mDJ6m2eKE1kG5fcb8TJZv3mCpeOL5l5ewzDpILq9QqRIxo1IRYJJY8MLqmQzCOJEXuCvjrAiwP+uLp2TzDG74CA/+C4n3NhErSjxsMNpfd7HFEloMOo1ouxkmOBlwW0yHJy2wLAg3+t0DV/1XVZVIaxSAilntZ3+J+zp8m3YTGoNGbxyyglcXwAWZI+7zXttpnzfVZ83/rteTtiQWjFhu1WRNb3Nz2C2plVqlACZVOIZEDNhTl6aWMQRI5D6MdJAkU98aphepSdD2Tqi/bKBcm1yhl6C+GeBcyo2WUqwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/ee45f7ed2beb28ab85997e29a0a8c97c/b01ca/cover.avif 200w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/f6dc2/cover.avif 296w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/320c3/cover.avif 351w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/b1e59/cover.avif 401w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/41fb2/cover.avif 520w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/6ad16/cover.avif 696w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/184cd/cover.avif 890w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/a1472/cover.avif 936w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/cbb88/cover.avif 1400w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/3616b/cover.avif 3298w&quot;
              sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/ee45f7ed2beb28ab85997e29a0a8c97c/f1512/cover.webp 200w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/a3b27/cover.webp 296w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/935a0/cover.webp 351w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/3caab/cover.webp 401w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/44983/cover.webp 520w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/657d2/cover.webp 696w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/a870e/cover.webp 890w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/d4696/cover.webp 936w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/aa619/cover.webp 1400w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/4bc52/cover.webp 3298w&quot;
              sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/ee45f7ed2beb28ab85997e29a0a8c97c/f8f3a/cover.png 200w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/4a902/cover.png 296w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/8daf7/cover.png 351w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/766a7/cover.png 401w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/8b301/cover.png 520w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/871fd/cover.png 696w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/dcb99/cover.png 890w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/14e2f/cover.png 936w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/4af54/cover.png 1400w,
/static/ee45f7ed2beb28ab85997e29a0a8c97c/cb136/cover.png 3298w&quot;
            sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/ee45f7ed2beb28ab85997e29a0a8c97c/14e2f/cover.png&quot;
            alt=&quot;(Sticker by Puzzoz)&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;(Sticker by Puzzoz)&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The advent of the World Wide Web, based on the HTTP (HyperText Transfer Protocol) protocol, introduced an incredible ability to connect information, but it did so by leaving a fundamental vulnerability: the lack of intrinsic security.&lt;/p&gt;
&lt;p&gt;The traffic exchanged between a user and a server traveled in plaintext, a flaw that opened the door to a multitude of attacks. Malicious actors, using relatively simple tools, could intercept and read the entire conversation. Some will shudder recalling tools like Firesheep, which exploited this insecurity to make side-jacking trivial. This allowed the theft of active sessions from PCs connected to the same Wi-Fi network, granting access to social profiles or services as if the attacker were the legitimate user.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;But the risks went far beyond simple interception:&lt;/strong&gt; the lack of identity verification allowed attackers to impersonate a legitimate server (man-in-the-middle attacks) with the goal of stealing sensitive credentials, distributing malware, or committing fraud.&lt;/p&gt;
&lt;p&gt;Faced with such a scenario, the need to protect communications and guarantee the authenticity of the parties involved strongly emerged. It was essential to ensure that the website the user was interacting with was actually the declared one and that the communication was incomprehensible to prying eyes. The solution to this dual problem was the evolution of HTTP into the HTTPS (HTTP Secure) protocol, achieved through the adoption and extension of the X.509 digital certificate system. These certificates, issued by trusted third-party organizations called Certification Authorities (CAs), play a crucial role.&lt;/p&gt;
&lt;p&gt;Digital certificates fulfill two central and complementary functions for the security of web communications. The first function consists of enabling communication encryption, typically through protocols like SSL/TLS, which is an essential step to ensure the confidentiality and integrity of the data exchanged between parties.&lt;/p&gt;
&lt;p&gt;In parallel, certificates are fundamental for validation and the fight against impersonation. This occurs because the issuance of a certificate by a Certification Authority (CA) is subject to the verification of domain ownership by the applicant. This mechanism ensures that the user&apos;s browser, by trusting the CA, obtains the necessary proof to validate that the server it is interacting with is actually who it claims to be, thereby preventing fraud attempts or man-in-the-middle attacks.&lt;/p&gt;
&lt;h2&gt;The introduction of this mechanism marked a turning point for web security.&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;However, the mass adoption of HTTPS was not immediate.&lt;/strong&gt; For years, many websites(particularly personal blogs, small artisan sites, or less &quot;critical&quot; portals) continued to operate on insecure HTTP.&lt;/p&gt;
&lt;p&gt;The reasons were often economic and logistical: certificates, although not prohibitively expensive (around ten euros a year or slightly more), still represented a fixed expense that was not always perceived as indispensable. Consequently, unprotected connections were frequently used, or, in an attempt to save money, self-signed certificates were employed. The latter, while guaranteeing encryption, were not issued by a recognized CA. As a result, browsers considered them untrusted, forcing users to manually confirm a security exception. This created a sub-optimal user experience and, above all, sent an ambiguous signal regarding security.&lt;/p&gt;
&lt;p&gt;In the realm of home banking and e-commerce, however, maximum reliability is required. For a period of time, Extended Validation (EV) certificates were used in an attempt to further improve the certainty of being connected to the right site. This type of certificate could only be obtained through the verification of company documentation and involved a high cost, limiting its use to entities with specific needs. In return, users with this certificate saw the company name on a green background in the browser bar alongside the URL. We say &quot;saw&quot; in the past tense because this option was removed. It proved largely ineffective in protecting users, as certification authorities often failed to conduct truly in-depth checks.&lt;/p&gt;
&lt;p&gt;The epochal turning point in the landscape of web security and certificate management arrived in 2016 with the public launch of &lt;strong&gt;Let&apos;s Encrypt&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This initiative, promoted by prominent organizations such as the Electronic Frontier Foundation (EFF), the Mozilla Foundation, and Cisco Systems, introduced a revolutionary concept: a fully automated certification authority (CA) that offers free X.509 certificates.&lt;/p&gt;
&lt;h2&gt;The impact of Let&apos;s Encrypt was immediately perceived as extremely positive, particularly by system engineers and server administrators.&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 936px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/72fb4ee1f8d25cdab9a68a10e0916eef/cb136/letsencrypt.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 54.49999999999999%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACIklEQVR42mNgAIL/9Qws/1dJyv1fLqX2f748B0isvr6eiQGE//9nBKpgZIAARgaoeGhoKDNcDQgjg8+LxMXezJYvfD1LsenzAnFtsCUgzUCgopLLDjLI3r6eRd6+noOBGBAd7cHn4pm+z8kz/W5AQLyxpk2Ws65tlp2OdUaSjk1mrq5NprGObXqOrk1WobZVWriuVYaftk2Gj7Z1toO2ZbYPSI2mTZo53MDQ0Ho2NcucFlWL7LkqZiky2pYZ7tq2WaUaVtkpOtbprnq2GcEalpneKmZpoZrWOcm6VumFQDF3bZv0al3b7B5tm6wqIG2E28n/GRhdXV25fVw9fL3srKepKans19fS2hbk6tzq4+Hhm5ZmzAoKQw3bNEkVm1xRBuM0VmzGgMKMMXRVKDOIk1aROSO/s/Sdn6fnMjszq/8O5jb/AwL8F+Z3lv9KKc/ohvgMohaqF4fj/kNitGZZx6aWlT3/C+wdVoX5BzwN9vF7VuDsvK59bf//6sVta+ApAZECsIP6/5AkULKyZ+2cuqz/p5WUv6+2t/q13Mn67yl5xZ/TS5L/F67oWotsOV4AVAQ2sGbrlHXTStP/H1dU/n1MU/M/GAPZHQmR/yvX9m0mxUCwoqKZtRXJFVn3l2lpfzytqvb/BBCv09b5nd+Qe7lgak1zPQMDEwPRoJ6BycJChtPi0SrOTB+vurWOtv83uNj9LypL+2KeHK4JSvRIEYICALVrz3T7QPgNAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/72fb4ee1f8d25cdab9a68a10e0916eef/b01ca/letsencrypt.avif 200w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/f6dc2/letsencrypt.avif 296w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/320c3/letsencrypt.avif 351w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/b1e59/letsencrypt.avif 401w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/41fb2/letsencrypt.avif 520w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/6ad16/letsencrypt.avif 696w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/184cd/letsencrypt.avif 890w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/a1472/letsencrypt.avif 936w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/cbb88/letsencrypt.avif 1400w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/3616b/letsencrypt.avif 3298w&quot;
              sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/72fb4ee1f8d25cdab9a68a10e0916eef/f1512/letsencrypt.webp 200w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/a3b27/letsencrypt.webp 296w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/935a0/letsencrypt.webp 351w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/3caab/letsencrypt.webp 401w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/44983/letsencrypt.webp 520w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/657d2/letsencrypt.webp 696w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/a870e/letsencrypt.webp 890w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/d4696/letsencrypt.webp 936w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/aa619/letsencrypt.webp 1400w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/4bc52/letsencrypt.webp 3298w&quot;
              sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/72fb4ee1f8d25cdab9a68a10e0916eef/f8f3a/letsencrypt.png 200w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/4a902/letsencrypt.png 296w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/8daf7/letsencrypt.png 351w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/766a7/letsencrypt.png 401w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/8b301/letsencrypt.png 520w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/871fd/letsencrypt.png 696w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/dcb99/letsencrypt.png 890w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/14e2f/letsencrypt.png 936w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/4af54/letsencrypt.png 1400w,
/static/72fb4ee1f8d25cdab9a68a10e0916eef/cb136/letsencrypt.png 3298w&quot;
            sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/72fb4ee1f8d25cdab9a68a10e0916eef/14e2f/letsencrypt.png&quot;
            alt=&quot;Let&amp;#39;s Encrypt my beloved! (Sticker by Puzzoz)&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Let&amp;#39;s Encrypt my beloved! (Sticker by Puzzoz)&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The keystone was the introduction of tools like certbot, a software client that automates the entire lifecycle of the certificate. After a single initial configuration on their web servers, which could include setting up domain challenges like HTTP-01 or DNS-01 for domain ownership verification, administrators could finally eliminate the worry associated with renewals.&lt;/p&gt;
&lt;p&gt;This change not only drastically reduced operational costs and the probability of service interruptions due to expired certificates, but it also contributed significantly to the global increase in HTTPS adoption, pushing the web towards a higher baseline level of security.
The automation provided by Let&apos;s Encrypt and certbot transformed a manual, repetitive, and error-prone task into a process managed in the background, allowing system engineers to focus on higher value-added activities. The adoption of certificates on the web was further accelerated by the introduction of the same mechanism on the Cloudflare CDN. The latter made it possible to add encryption between the edge and the user&apos;s device via the &quot;Flexible&quot; configuration. Although not the most secure option, it offers security benefits for the end user without requiring server-side configurations, making it particularly useful for hosting providers that had not yet integrated Let&apos;s Encrypt.&lt;/p&gt;
&lt;p&gt;With this absolute proliferation of certificates, especially those distributed through automated systems, a radical change arrived from the most popular browsers regarding how they communicate a website&apos;s reliability to the user. A website using a certificate is no longer merely considered &quot;secure&quot;; rather, sites without HTTPS are now deemed downright &quot;dangerous&quot;, displaying risk warnings and banners to the user before connection.&lt;/p&gt;
&lt;p&gt;Another disruptive novelty brought about by this new paradigm is the drastic reduction in the maximum lifespan of an issuable certificate. It began in 2015 by fixing the duration at three years, dropping to two in 2018, and finally to just one in 2020 to stimulate a more frequent rotation of keys.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The widespread diffusion of certificates&lt;/strong&gt;, particularly those issued automatically, triggered an epochal shift in how browsers communicate a website&apos;s reliability to users. Today, the use of a certificate is no longer the distinguishing feature of a &quot;secure&quot; site; conversely, the lack of HTTPS makes sites &quot;dangerous&quot;, pushing browsers to display warnings and banners about risks before establishing a connection.&lt;/p&gt;
&lt;p&gt;Today, we are in a phase of further change. Authorities and browsers are pushing for even shorter durations to force the adoption of automation; in the future, the maximum duration of certificates will shrink even further. Here is what is expected for the coming years: the limit will drop to 200 days by March 15, 2026, to 100 days by March 15, 2027, and the maximum duration will be only 47 days by March 15, 2029. The goal is to make certificates &quot;disposable&quot;. If a certificate lasts only a few weeks, a hacker who steals its key has very little time to exploit it. Furthermore, if a vulnerability is discovered in an encryption algorithm, the entire web can migrate to a new one in less than two months simply by waiting for the natural renewal of certificates.&lt;/p&gt;
&lt;figure class=&quot;mb-3&quot;&gt;
&lt;table class=&quot;table table-striped table-sm table-borderless&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Maximum Certificate Lifespan&lt;/th&gt;
&lt;th&gt;Technical Verification&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2015&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3 years&lt;/td&gt;
&lt;td&gt;Capped at 39 months&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2018&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2 years&lt;/td&gt;
&lt;td&gt;Capped at 825 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2020&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1 year&lt;/td&gt;
&lt;td&gt;Capped at 398 days by Apple/Google&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;March 15, 2026&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;200 days&lt;/td&gt;
&lt;td&gt;Phase 1 of the new CA/B mandate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;March 15, 2027&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100 days&lt;/td&gt;
&lt;td&gt;Phase 2 of the new CA/B mandate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;March 15, 2029&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;47 days&lt;/td&gt;
&lt;td&gt;Phase 3 of the new CA/B mandate&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Certificate lifespan roadmap&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The adoption of an automated system for the renewal and management of digital certificates is no longer a simple &apos;commodity&apos; or a choice of convenience, but a mandatory operational and security constraint for any organization. In the current cybersecurity landscape, where certificate expiration is increasingly brief (short-term certificates, or short-lived certificates), manually installing a certificate or relying on manual processes for its renewal now constitutes a significant technical debt.&lt;/p&gt;
&lt;p&gt;The transition to a short-lived certificates policy should not be seen as a bureaucratic burden for IT, but as a catalyst for indispensable infrastructural modernization. &lt;strong&gt;The goal of the Certification Authorities is clear:&lt;/strong&gt; they want to reduce the risk in the event that security keys are compromised, and they also want to accelerate the adoption of more robust cryptographic standards. This, however, makes it impossible to manage the entire process manually.&lt;/p&gt;
&lt;p&gt;In modern container-based architectures, where services are dynamically created, deleted, and scaled, automating the certificate lifecycle (i.e., issuance, renewal, distribution, and revocation) is not just a best practice, but a fundamental requirement to ensure compliance and service continuity. Platforms that manage large-scale workloads, such as Kubernetes, need integrated tools to manage identity and cryptography. In this context, solutions like Cert Manager become essential. Integrated on Kubernetes, Cert Manager automates communication with Certification Authorities (such as Let&apos;s Encrypt or internal CAs), ensuring that each service (Pod, Ingress, or Route) has a valid certificate that is automatically renewed. This eliminates the possibility of service interruptions due to unexpected expirations.&lt;/p&gt;
&lt;p&gt;For traditional systems or hybrid infrastructures that do not use Kubernetes-native platforms, automation can be managed through Configuration Management tools like Ansible. In this scenario, Ansible acts as an orchestrator, deploying and configuring the Certbot utility on individual operating systems (web servers, load balancers, etc.). Using configuration files called playbooks, Ansible can ensure that Certbot is installed and configured correctly, execute Certbot to obtain and renew certificates from CAs like Let&apos;s Encrypt, distribute the obtained certificates to the correct services (for example, by configuring Nginx or Apache), and, finally, restart or reload the services to apply the new certificates. This method ensures that even older or non-containerized servers can benefit from the security offered by short-term certificates without requiring human intervention for each renewal.&lt;/p&gt;
&lt;p&gt;The adoption of short-term certificates forces organizations to definitively abandon the era of manual renewals. Investing in automation tools, whether it is Cert Manager on Kubernetes or orchestrating Certbot via Ansible, is not an expense, but a net gain in terms of security, operational efficiency, and the reduction of so-called technical debt. In this way, what seemed like a &quot;nuisance&quot; turns into a real opportunity to improve the digital infrastructure.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Static web hosting on Kubernetes with OCI images as volumes]]></title><description><![CDATA[Introduced in Kubernetes 1.31, promoted to beta in 1.33 and entered in stable with Kubernetes 1.36, we can use OCI images as volumes for…]]></description><link>https://kowalski7cc.xyz/blog/kubernetes-web-hosting</link><guid isPermaLink="false">https://kowalski7cc.xyz/blog/kubernetes-web-hosting</guid><pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 936px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/760bc585dbeaf0165c8d4d01e6232568/cb136/cover.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 52.5%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACzElEQVR42j2Sy29TVxDG/R9UoEKhRSQQx9f3ce7DLxy/EwdjHCwSBwgyhRBISXiooXGpCjQBWl6iqtixgpaHQBAQXZRF1SKEqFh0URaIbdXskQIxAVQ2P8ZO2sXomzNz5jvfnBmfchyU7WK7Ho5j4aig+PNnZUvOEV/M8ULNWMNvxJ2FvLMQcyVvWAqfcoTINlGmHzfZh5PbJcQKW2nNAnuB8D8i07KxBC1l0xCjm9b/9xq+z/XklWQFo+8y3r5p0oeeow/8it050lTlhcLzKpRDyA2RisVwDIXSRYTg2nQad6GDBrFPxcskD05TOjHHiesvuXK/Tu/JF3RNvEEVDovydiGNUh3eQalnA7l4DDMQZMXHK0lF43w7NsyacJRIJDav0CkeJv7lS35+PMvtR3NMif3+1ysGzs1hbJoSFRq5Yjff3fmBrYNVKV7Dpg0lvhgZ4vSx4yQiUTo6EiQzGXRR7dM3XqT/7Guu3Z/l4dO3PJt+x40HdQ79WMcYfIK/3SSWjVO7MMHI0f1kkhmK2Rynanv4pjaOrbtsHtxKtifP8uWfiMLqL2w//5ZbD2e5+3iOe3++4c4frzhytU5o/z9oVork2hTrKiX5K4doNCL/Z0ksz8CnVdYnuhn//mu6KkUWfbBYCBO9+Hf+zbZzM9JynZ9+m+XMzRlWD8+g1h2lrXUl6VKe/tFtWNJSJBLGE+J0d5rdBz6jmCiwd/Ig6XJ+nlAPtGBlR0l99YLckXoTuyb+xe2/hKm3EZABZAo5xiZHCct+RsJhwp7XJO4tb6RarvB5bS+F/vUsXbIMnyavBjU/ZmoHVr6G2TmGkTuAbjkYhk4gaJKIhZgc7ZXiLFtKaSrFJOV8B32FJEN9nYwP9ZCIeyz+8CN8Qd1ojlsPtBJsX4HmFxMMaJqYjmGazbwWNGTPZKmVhWVZTTRMQ4YWoGXVatra2mlpXcV7OeikUzFgQ8AAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/760bc585dbeaf0165c8d4d01e6232568/b01ca/cover.avif 200w,
/static/760bc585dbeaf0165c8d4d01e6232568/f6dc2/cover.avif 296w,
/static/760bc585dbeaf0165c8d4d01e6232568/320c3/cover.avif 351w,
/static/760bc585dbeaf0165c8d4d01e6232568/b1e59/cover.avif 401w,
/static/760bc585dbeaf0165c8d4d01e6232568/41fb2/cover.avif 520w,
/static/760bc585dbeaf0165c8d4d01e6232568/6ad16/cover.avif 696w,
/static/760bc585dbeaf0165c8d4d01e6232568/184cd/cover.avif 890w,
/static/760bc585dbeaf0165c8d4d01e6232568/a1472/cover.avif 936w,
/static/760bc585dbeaf0165c8d4d01e6232568/cbb88/cover.avif 1400w,
/static/760bc585dbeaf0165c8d4d01e6232568/3616b/cover.avif 3298w&quot;
              sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/760bc585dbeaf0165c8d4d01e6232568/f1512/cover.webp 200w,
/static/760bc585dbeaf0165c8d4d01e6232568/a3b27/cover.webp 296w,
/static/760bc585dbeaf0165c8d4d01e6232568/935a0/cover.webp 351w,
/static/760bc585dbeaf0165c8d4d01e6232568/3caab/cover.webp 401w,
/static/760bc585dbeaf0165c8d4d01e6232568/44983/cover.webp 520w,
/static/760bc585dbeaf0165c8d4d01e6232568/657d2/cover.webp 696w,
/static/760bc585dbeaf0165c8d4d01e6232568/a870e/cover.webp 890w,
/static/760bc585dbeaf0165c8d4d01e6232568/d4696/cover.webp 936w,
/static/760bc585dbeaf0165c8d4d01e6232568/aa619/cover.webp 1400w,
/static/760bc585dbeaf0165c8d4d01e6232568/4bc52/cover.webp 3298w&quot;
              sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/760bc585dbeaf0165c8d4d01e6232568/f8f3a/cover.png 200w,
/static/760bc585dbeaf0165c8d4d01e6232568/4a902/cover.png 296w,
/static/760bc585dbeaf0165c8d4d01e6232568/8daf7/cover.png 351w,
/static/760bc585dbeaf0165c8d4d01e6232568/766a7/cover.png 401w,
/static/760bc585dbeaf0165c8d4d01e6232568/8b301/cover.png 520w,
/static/760bc585dbeaf0165c8d4d01e6232568/871fd/cover.png 696w,
/static/760bc585dbeaf0165c8d4d01e6232568/dcb99/cover.png 890w,
/static/760bc585dbeaf0165c8d4d01e6232568/14e2f/cover.png 936w,
/static/760bc585dbeaf0165c8d4d01e6232568/4af54/cover.png 1400w,
/static/760bc585dbeaf0165c8d4d01e6232568/cb136/cover.png 3298w&quot;
            sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/760bc585dbeaf0165c8d4d01e6232568/14e2f/cover.png&quot;
            alt=&quot;Sticker by @puzzoz&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Sticker by @puzzoz&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Introduced in Kubernetes 1.31, promoted to beta in 1.33 and entered in stable with Kubernetes 1.36, we can use OCI images as volumes for containers. They are now a possible storage choice among Persistent Volume Claims, empty directory, pod metadata, Config Maps and Secrets. This option can take advantage of the existing tooling and CI/CD already present to deliver an archive containing any kind of data.&lt;/p&gt;
&lt;p&gt;OCI images, the evolution of Docker images, have become a new way to deliver artifacts, to the point that they are also used by some Linux distributions to build and ship system updates.&lt;/p&gt;
&lt;p&gt;By leveraging OCI images with this new feature we can improve our static website development and deployment by decoupling webserver image and static website build, simplifying application versioning and making quicker web server patching without rebuilding everything.&lt;/p&gt;
&lt;h2&gt;Creating website images, the old way&lt;/h2&gt;
&lt;p&gt;Until now, the standard way to host a website on Kubernetes was, after eventually building the site assets, to extend a web server image (in this case Nginx) with the files of the static website copied in the www root folder.
An example Containerfile for building my website with this approach could be the following:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;dockerfile&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-dockerfile line-numbers&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; registry.access.redhat.com/ubi10/nodejs-24-minimal:10.1 &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; build&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;WORKDIR&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$HOME&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;ADD&lt;/span&gt; package*.json ./&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; &lt;span class=&quot;token options&quot;&gt;&lt;span class=&quot;token property&quot;&gt;--mount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;type=cache,mode=0777,uid=1001,gid=0,target=node_modules&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;\&lt;/span&gt;
    npm ci --only=production&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;ADD&lt;/span&gt; . .&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; &lt;span class=&quot;token options&quot;&gt;&lt;span class=&quot;token property&quot;&gt;--mount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;type=cache,mode=0777,uid=1001,gid=0,target=node_modules&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;--mount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;type=cache,mode=0777,uid=1001,gid=0,target=public&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;--mount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;type=cache,mode=0777,uid=1001,gid=0,target=.cache&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;\&lt;/span&gt;
    npm run build&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; registry.access.redhat.com/ubi10/nginx-126:10.1&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;CMD&lt;/span&gt; nginx -g &lt;span class=&quot;token string&quot;&gt;&quot;daemon off;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;COPY&lt;/span&gt; &lt;span class=&quot;token options&quot;&gt;&lt;span class=&quot;token property&quot;&gt;--from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;build&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$HOME&lt;/span&gt;/public &lt;span class=&quot;token variable&quot;&gt;$HOME&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;With the new approach, we can replace the Nginx base image with &lt;code class=&quot;language-text&quot;&gt;scratch&lt;/code&gt; that is an empty base image, as opposed to a distro or runtime base image developer use in a typical scenario.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;dockerfile&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-dockerfile line-numbers&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; registry.access.redhat.com/ubi10/nodejs-24-minimal:10.1 &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; build&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;WORKDIR&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$HOME&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;ADD&lt;/span&gt; package*.json ./&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; &lt;span class=&quot;token options&quot;&gt;&lt;span class=&quot;token property&quot;&gt;--mount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;type=cache,mode=0777,uid=1001,gid=0,target=node_modules&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;\&lt;/span&gt;
    npm ci --only=production&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;ADD&lt;/span&gt; . .&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; &lt;span class=&quot;token options&quot;&gt;&lt;span class=&quot;token property&quot;&gt;--mount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;type=cache,mode=0777,uid=1001,gid=0,target=node_modules&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;--mount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;type=cache,mode=0777,uid=1001,gid=0,target=.cache&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;\&lt;/span&gt;
    npm run build&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; scratch&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;COPY&lt;/span&gt; &lt;span class=&quot;token options&quot;&gt;&lt;span class=&quot;token property&quot;&gt;--from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;build&lt;/span&gt;&lt;/span&gt; /opt/app-root/src/public /&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let&apos;s see with &lt;code class=&quot;language-text&quot;&gt;podman images&lt;/code&gt; what are the differences between the two images:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;plaintext&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-plaintext line-numbers&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;REPOSITORY                       TAG          IMAGE ID      CREATED         SIZE
ghcr.io/kowalski7cc/website      scratch      f1e26dd79993  13 seconds ago  140 MB
ghcr.io/kowalski7cc/website      nginx        a108d5cebad5  4 minutes ago   428 MB
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can see the image &lt;code class=&quot;language-text&quot;&gt;kowalski7cc/website:scratch&lt;/code&gt; is taking significantly less space than the &lt;code class=&quot;language-text&quot;&gt;kowalski7cc/website:nginx&lt;/code&gt; image without changing anything about the website!&lt;/p&gt;
&lt;p&gt;At this point we can push our smaller image and prepare a Kubernetes deployment to it.&lt;/p&gt;
&lt;p&gt;The basic syntax to use a OCI image as a volume is the following:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-yaml line-numbers&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;volumeMounts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; volume
      &lt;span class=&quot;token key atrule&quot;&gt;mountPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /volume
    &lt;span class=&quot;token punctuation&quot;&gt;...&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; volume
    &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;reference&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $VOLUME_IMAGE
      &lt;span class=&quot;token key atrule&quot;&gt;pullPolicy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; IfNotPresent
&lt;span class=&quot;token punctuation&quot;&gt;...&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So we can create a deployment like this example for an Nginx container, where we mount the &lt;code class=&quot;language-text&quot;&gt;ghcr.io/kowalski7cc/website:scratch&lt;/code&gt; image under the &lt;code class=&quot;language-text&quot;&gt;/opt/app-root/src&lt;/code&gt;, which is the default path used by Red Hat&apos;s Nginx image named &lt;code class=&quot;language-text&quot;&gt;registry.access.redhat.com/ubi10/nginx-126:10.1&lt;/code&gt;. With this image, it is required to override the default image command with &lt;code class=&quot;language-text&quot;&gt;[&quot;nginx&quot;, &quot;-g&quot;, &quot;daemon off;&quot;]&lt;/code&gt;, otherwise Nginx would not start and instead we would find OCP s2i stub script.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-yaml line-numbers&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; apps/v1
&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Deployment
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;labels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; website
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; website
  &lt;span class=&quot;token key atrule&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; website
&lt;span class=&quot;token key atrule&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;selector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;matchLabels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; website
  &lt;span class=&quot;token key atrule&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;labels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; website
      &lt;span class=&quot;token key atrule&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; website
    &lt;span class=&quot;token key atrule&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; registry.access.redhat.com/ubi10/nginx&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;126&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10.1&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;imagePullPolicy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; IfNotPresent
          &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; website
          &lt;span class=&quot;token key atrule&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; nginx
            &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;g
            &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; daemon off;
          &lt;span class=&quot;token key atrule&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;containerPort&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8080&lt;/span&gt;
              &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; http
              &lt;span class=&quot;token key atrule&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; TCP
          &lt;span class=&quot;token key atrule&quot;&gt;volumeMounts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;mountPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /opt/app&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;root/src
              &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; html
      &lt;span class=&quot;token key atrule&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token key atrule&quot;&gt;pullPolicy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Always
            &lt;span class=&quot;token key atrule&quot;&gt;reference&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ghcr.io/kowalski7cc/website&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;scratch
          &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; html&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Automating static site build with Actions&lt;/h2&gt;
&lt;p&gt;Once we have deployed our first image, we can automatize the build with any kind of pipeline. If you are using a forge compatible with GitHub Actions, such as Gitea or Forgejo, you can use the Action. In this example I&apos;m using Gatsbyjs framework for my website, but you can use your preferred one. After static site build, I use Red Hat buildah step to copy in a scratch image the static assets and publish them on my registry.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-yaml line-numbers&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Build and push

&lt;span class=&quot;token key atrule&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;branches&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;master&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;token key atrule&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;REGISTRY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; my&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;private&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;registry
  &lt;span class=&quot;token key atrule&quot;&gt;IMAGE_NAME&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; github.repository &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;NODE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt;

&lt;span class=&quot;token key atrule&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;runs-on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ubuntu&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;latest

    &lt;span class=&quot;token key atrule&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/checkout@v6

      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Use Node.js $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; env.NODE &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/setup&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;node@v6
        &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;node-version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; env.NODE &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;cache&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; npm

      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Get npm cache directory
        &lt;span class=&quot;token key atrule&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; npm&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;cache&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;dir
        &lt;span class=&quot;token key atrule&quot;&gt;shell&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; bash
        &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; echo &quot;dir=$(npm config get cache)&quot; &lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;GITHUB_OUTPUT&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/cache@v5
        &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; steps.npm&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;cache&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;dir.outputs.dir &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; runner.os &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;node$&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; env.NODE &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;$&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; hashFiles(&apos;&lt;span class=&quot;token important&quot;&gt;**/package-lock.json&apos;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;restore-keys&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token scalar string&quot;&gt;
            ${{ runner.os }}-node${{ env.NODE }}-&lt;/span&gt;

      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Install dependencies
        &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; npm ci

      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Caching Gatsby
        &lt;span class=&quot;token key atrule&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; gatsby&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;cache&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;build
        &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/cache@v5
        &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token scalar string&quot;&gt;
            public
            .cache&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; runner.os &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;gatsby&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;build&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;$&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; github.run_id &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;restore-keys&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token scalar string&quot;&gt;
            ${{ runner.os }}-gatsby-build-&lt;/span&gt;

      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Build
        &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; npm run build

      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Upload public assets for job $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; github.run_id &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/upload&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;artifact@v7
        &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;if-no-files-found&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; error
          &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; public
          &lt;span class=&quot;token key atrule&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; public/

  &lt;span class=&quot;token key atrule&quot;&gt;push-raw&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;needs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; build
    &lt;span class=&quot;token key atrule&quot;&gt;runs-on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ubuntu&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;latest

    &lt;span class=&quot;token key atrule&quot;&gt;permissions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;packages&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; write

    &lt;span class=&quot;token key atrule&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Download public assets for job $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; github.run_id &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/download&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;artifact@v8
        &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; public
          &lt;span class=&quot;token key atrule&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; public

      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Build Image
        &lt;span class=&quot;token key atrule&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; build&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;image
        &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; redhat&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;actions/buildah&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;build@v2
        &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;base-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; scratch
          &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; env.REGISTRY &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;/$&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; env.IMAGE_NAME &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;tags&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;latest ${{ github.run_id }}&quot;&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; public
          &lt;span class=&quot;token key atrule&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; public
          &lt;span class=&quot;token key atrule&quot;&gt;oci&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;

      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Push To Registry
        &lt;span class=&quot;token key atrule&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; push&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;to&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;quay
        &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; redhat&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;actions/push&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;to&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;registry@v2
        &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; steps.build&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;image.outputs.image &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;tags&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; steps.build&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;image.outputs.tags &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;registry&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; env.REGISTRY &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; github.actor &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; secrets.GITHUB_TOKEN &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Print image url
        &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; echo &quot;Image pushed to $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; steps.push&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;to&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;quay.outputs.registry&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;paths &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&quot;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Web hosting is not the limit&lt;/h2&gt;
&lt;p&gt;With this approach, we can apply the same paradigm with other types of application. For example we can have a OpenJDK Runtime for running our Java application, and have a pipeline build only the JAR artifact inside a OCI image and just push that on a registry.
Or a more complex application runtime such as JBoss, where we can have our WARs inside a image and configurations stored inside Config Maps and just mount them in the container using a flexible deployment!&lt;/p&gt;
&lt;p&gt;Every application which needs a runtime image, already provided by a vendor, can potentially use this approach. We could even build standard applications and just mount them on a distro base image, almost like how systemd&apos;s sysextensions work!&lt;/p&gt;
&lt;h2&gt;Kubernetes reference&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://kubernetes.io/docs/tasks/configure-pod-container/image-volumes/&quot;&gt;Use an Image Volume With a Pod&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Systemd-boot install on Fedora 32 (Updated for Fedora 40)]]></title><description><![CDATA[Since many years, GRUB has been the default manager of every Linux distribution.
This until systemd-boot has born, allowing easier…]]></description><link>https://kowalski7cc.xyz/blog/systemd-boot-fedora-32</link><guid isPermaLink="false">https://kowalski7cc.xyz/blog/systemd-boot-fedora-32</guid><pubDate>Wed, 03 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 577px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f7d90adeb38f45c3f4b7664c3e927e7e/1d708/systemd-logo.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 57.50000000000001%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAABhklEQVR42q2Ty0tCQRTGx4g21aUgNA2iEMNI0+yBPZXcZC2KCCIhKIkWgq8etCjo/dikia37I6pNVPQgivYFFfb4C2rpvUr3a2aSkpZ2B37zzZlhPs45wxBJkmTKp1KQdDoNukAymcwZdj+VSnG4IeM/g93/MWQbj89vCK/FEFqNUt35IUjjENXQWhTTG7HvmOJf3ubnM5txTK3HcP/0wo1FUfo2PL64AVGbINR3o8jYgeKadgi1nSisc6DE5ISm2Q1VZSOK6LnA4pZeFOjtqOoagGBoxf7RGTdk5XPDk6tbFFtcmJzfgqnHA9eoH7b+MXjCi2ik6hjxoWlgHN65dbi9YQwHFuD0+NA3MY1q5yAOTi8zhmLG8PwapNSIvAobVDorKu19yFebQXQNIGV1VK0g5RYQrQUqrZVXU2hog941BKIx4/Bvhg+JV/iXthFYiWT1L8Jj1jOmwSwCtIezW3Gs7u7RdQR3j4nfHir+ymwSRVGm6eZM5nNweMmyLCsGy/CD8q4UX1JkFgmuCCZvAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/f7d90adeb38f45c3f4b7664c3e927e7e/b01ca/systemd-logo.avif 200w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/f6dc2/systemd-logo.avif 296w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/320c3/systemd-logo.avif 351w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/b1e59/systemd-logo.avif 401w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/41fb2/systemd-logo.avif 520w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/57726/systemd-logo.avif 577w&quot;
              sizes=&quot;(max-width: 577px) 100vw, 577px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/f7d90adeb38f45c3f4b7664c3e927e7e/f1512/systemd-logo.webp 200w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/a3b27/systemd-logo.webp 296w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/935a0/systemd-logo.webp 351w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/3caab/systemd-logo.webp 401w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/44983/systemd-logo.webp 520w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/e47c1/systemd-logo.webp 577w&quot;
              sizes=&quot;(max-width: 577px) 100vw, 577px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/f7d90adeb38f45c3f4b7664c3e927e7e/f8f3a/systemd-logo.png 200w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/4a902/systemd-logo.png 296w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/8daf7/systemd-logo.png 351w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/766a7/systemd-logo.png 401w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/8b301/systemd-logo.png 520w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/1d708/systemd-logo.png 577w&quot;
            sizes=&quot;(max-width: 577px) 100vw, 577px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/f7d90adeb38f45c3f4b7664c3e927e7e/1d708/systemd-logo.png&quot;
            alt=&quot;Systemd logo&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Systemd logo&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Since many years, GRUB has been the default manager of every Linux distribution.
This until systemd-boot has born, allowing easier configuration and promising enhanced security for our devices.&lt;/p&gt;
&lt;p&gt;Let&apos;s see how to install it on Fedora 32 or Fedora 40&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you&apos;re planning to install Fedora 39 or more recent, you can directly configure anaconda to use systemd-boot as bootloader, adding the following argument in the boot command line:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;inst.sdboot&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;you can check the details on the &lt;a href=&quot;https://anaconda-installer.readthedocs.io/en/latest/boot-options.html#inst-sdboot&quot;&gt;Fedora 39 documentation&lt;/a&gt; and the &lt;a href=&quot;https://fedoraproject.org/wiki/Changes/cleanup_systemd_install&quot;&gt;Change on the Fedora Wiki&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This still not covers booting with secure boot enabled, you will need to enroll your own keys. You can use a tool like &lt;a href=&quot;https://github.com/Foxboron/sbctl&quot;&gt;sbctl&lt;/a&gt; to do that.&lt;/p&gt;
&lt;h2&gt;Take you responsabilities first&lt;/h2&gt;
&lt;p&gt;I am not responsible for bricked computers, system instabilities, dead cats, thermonuclear war or you getting fired because you lost important work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Please make a backup of your device or of the data, and make a boot drive in case of necessity.&lt;/strong&gt;
Do some research if you have any concerns about steps documented in this guide.&lt;/p&gt;
&lt;p&gt;YOU are choosing to make these modifications, and if you point the finger at me for messing up your device, I will laugh at you.&lt;/p&gt;
&lt;h2&gt;Check if you are running EFI&lt;/h2&gt;
&lt;p&gt;Before doing anything, you should check that you are running using EFI, and if you have Secure Boot enabled, &lt;strong&gt;you may want to turn it off now&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;To do that, you can use the following one-liner:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; /sys/firmware/efi &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; EFI &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; Legacy&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If the result of the command will be &quot;EFI&quot;, you&apos;re good to go with this guide.&lt;/p&gt;
&lt;h2&gt;Move ESP mount to /efi&lt;/h2&gt;
&lt;p&gt;First of all, we need to move the ESP partition from &lt;code class=&quot;language-text&quot;&gt;/boot/efi&lt;/code&gt; to &lt;code class=&quot;language-text&quot;&gt;/efi&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s start by creating the folder for EFI mount point&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; /efi&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can use Vim (or any other text editor you like) to edit the &lt;code class=&quot;language-text&quot;&gt;fstab&lt;/code&gt; file using this command:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cp&lt;/span&gt; /etc/fstab /etc/fstab.bak &lt;span class=&quot;token comment&quot;&gt;# (Make a backup first if you are unsure)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;vi&lt;/span&gt; /etc/fstab&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Edit the line by entering in &quot;insert mode&quot; by pressing the &quot;&lt;code class=&quot;language-text&quot;&gt;i&lt;/code&gt;&quot; button&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;UUID&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;xxxx-xxxx    /boot/efi    vfat    &lt;span class=&quot;token assign-left variable&quot;&gt;umask&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;0077,shortname&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;winnt &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;to:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;UUID&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;xxxx-xxxx    /efi    vfat    &lt;span class=&quot;token assign-left variable&quot;&gt;umask&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;0077,shortname&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;winnt &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Press the &lt;code class=&quot;language-text&quot;&gt;esc&lt;/code&gt; button to return to normal mode, followed by &quot;&lt;code class=&quot;language-text&quot;&gt;:wq&lt;/code&gt;&quot; to save the modified file and quit.&lt;/p&gt;
&lt;p&gt;If you edited correctly you should be able to run successfully the following commands to unmount the efi partition and mount it to the new path:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl daemon-reload
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;umount&lt;/span&gt; /boot/efi
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;umount&lt;/span&gt; /boot
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;mount&lt;/span&gt; /efi&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After this you will be able to cleanup the boot partition as well.&lt;/p&gt;
&lt;h2&gt;Install systemd-boot&lt;/h2&gt;
&lt;p&gt;The firts step is to create a folder in the ESP directory with the machine-id in the name&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; /efi/&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; /etc/machine-id&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you have Fedora 34+, you need to remove GRUB from DNF&apos;s protected packages&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; /etc/dnf/protected.d/&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;grub,shim&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;*&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;install systemd-boot and then uninstall GRUB related packages.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; dnf remove &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt; grubby grub2&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;* memtest86&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;* &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-rf&lt;/span&gt; /boot/*
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; dnf &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt; systemd-boot-unsigned sdubby&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Do not reboot after this, or you will not be able to boot!&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Edit the file &lt;code class=&quot;language-text&quot;&gt;/etc/kernel/install.conf&lt;/code&gt; to have tge following content:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;BOOT_ROOT=/efi
layout=bls&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can delete the boot partition using &lt;code class=&quot;language-text&quot;&gt;parted&lt;/code&gt; and resize the esp partition. Pay attention to this step, as deleted partitions are (usually) unrecoverable. By default Fedora should create the first partition arount 500-600MB in VFAT for EFI/ESP and the second partition around 1-1.5GB for boot. With this layout you can safely delete the second one and grow the first. &lt;strong&gt;Your partition table may differ&lt;/strong&gt;, you can check this with &lt;code class=&quot;language-text&quot;&gt;parted /dev/YOUR_DISK print&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In my case the system disk is &lt;code class=&quot;language-text&quot;&gt;/dev/vda&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parted&lt;/span&gt; /dev/vda &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;umount&lt;/span&gt; /dev/vda1
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; growpart /dev/vda &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;mount&lt;/span&gt; /efi&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you have used a custom partition layout, you will know how to proceed, good luck!&lt;/p&gt;
&lt;p&gt;Now we can install the bootloader and the kernel entries:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; /proc/cmdline &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos; &apos;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;- &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tee&lt;/span&gt; /etc/kernel/cmdline
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; bootctl &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; kernel-install &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;uname&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt; /lib/modules/&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;uname&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;/vmlinuz
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; dnf reinstall kernel-core&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If everyting installs correcry, &lt;strong&gt;now&lt;/strong&gt; you can reboot, and you should boot normally using systemd-boot&lt;/p&gt;
&lt;p&gt;You can verify everything working correctly with&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; bootctl&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can use &lt;a href=&quot;https://github.com/Foxboron/sbctl&quot;&gt;sbctl&lt;/a&gt; to setup Secure Boot signature with sistemd boot and enroll your keys.&lt;/p&gt;
&lt;p&gt;Enjoy systemd-boot!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 936px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f1af29bd0e7e476ccf10b600b093300b/384bf/systemd-boot.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 64.99999999999999%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAABDElEQVR42q2S2WqDUBCGXUBwQ8ElPoErqKC4vEjv80Cll0nNXYu3pW/XlAjTmcMRWmsIkQgfvzPH+ZnDr1AUxT5N088oit7iOB6XhGE4VlXFoPflWZZlY9/373mef6DPXtB1/YSApmkXBNYwDIOxdkazpmlOpKqqDgI+RwSQMzJt5Jt7kJcw8OLCdQsT19d/hqIo/vmY6t+9uV70rxuuDc1IknTfhrIsQ5Ik0DQNo+s6aNsW6rqGsiwBkwZMEjBR1sOUQVGU64a0geu6EAQB7HY7poTv+2DbNliWxdRxHPA8jyktcfPKDw/lHtYM5//wi5tu4cw9DmR4euCVBwGDeMLVj8gz8rIRmj2Q1w999v/NHEW8XgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/f1af29bd0e7e476ccf10b600b093300b/b01ca/systemd-boot.avif 200w,
/static/f1af29bd0e7e476ccf10b600b093300b/f6dc2/systemd-boot.avif 296w,
/static/f1af29bd0e7e476ccf10b600b093300b/320c3/systemd-boot.avif 351w,
/static/f1af29bd0e7e476ccf10b600b093300b/b1e59/systemd-boot.avif 401w,
/static/f1af29bd0e7e476ccf10b600b093300b/41fb2/systemd-boot.avif 520w,
/static/f1af29bd0e7e476ccf10b600b093300b/6ad16/systemd-boot.avif 696w,
/static/f1af29bd0e7e476ccf10b600b093300b/184cd/systemd-boot.avif 890w,
/static/f1af29bd0e7e476ccf10b600b093300b/a1472/systemd-boot.avif 936w,
/static/f1af29bd0e7e476ccf10b600b093300b/8f9c1/systemd-boot.avif 1175w&quot;
              sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/f1af29bd0e7e476ccf10b600b093300b/f1512/systemd-boot.webp 200w,
/static/f1af29bd0e7e476ccf10b600b093300b/a3b27/systemd-boot.webp 296w,
/static/f1af29bd0e7e476ccf10b600b093300b/935a0/systemd-boot.webp 351w,
/static/f1af29bd0e7e476ccf10b600b093300b/3caab/systemd-boot.webp 401w,
/static/f1af29bd0e7e476ccf10b600b093300b/44983/systemd-boot.webp 520w,
/static/f1af29bd0e7e476ccf10b600b093300b/657d2/systemd-boot.webp 696w,
/static/f1af29bd0e7e476ccf10b600b093300b/a870e/systemd-boot.webp 890w,
/static/f1af29bd0e7e476ccf10b600b093300b/d4696/systemd-boot.webp 936w,
/static/f1af29bd0e7e476ccf10b600b093300b/e957e/systemd-boot.webp 1175w&quot;
              sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/f1af29bd0e7e476ccf10b600b093300b/f8f3a/systemd-boot.png 200w,
/static/f1af29bd0e7e476ccf10b600b093300b/4a902/systemd-boot.png 296w,
/static/f1af29bd0e7e476ccf10b600b093300b/8daf7/systemd-boot.png 351w,
/static/f1af29bd0e7e476ccf10b600b093300b/766a7/systemd-boot.png 401w,
/static/f1af29bd0e7e476ccf10b600b093300b/8b301/systemd-boot.png 520w,
/static/f1af29bd0e7e476ccf10b600b093300b/871fd/systemd-boot.png 696w,
/static/f1af29bd0e7e476ccf10b600b093300b/dcb99/systemd-boot.png 890w,
/static/f1af29bd0e7e476ccf10b600b093300b/14e2f/systemd-boot.png 936w,
/static/f1af29bd0e7e476ccf10b600b093300b/384bf/systemd-boot.png 1175w&quot;
            sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/f1af29bd0e7e476ccf10b600b093300b/14e2f/systemd-boot.png&quot;
            alt=&quot;systemd-boot running inside GNOME Boxes&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;systemd-boot running inside GNOME Boxes&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2&gt;Sources&lt;/h2&gt;
&lt;p&gt;Thanks to all these people for their guides and tips:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/hboetes/wiki/wiki/systemd%E2%80%90boot-on-fedora-40&quot;&gt;hboetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/Fedora/comments/ecjarj/is_there_any_way_to_update_nvidia_drivers_without/fbd86rv/&quot;&gt;ComplexConcentrate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/Fedora/comments/ecjarj/is_there_any_way_to_update_nvidia_drivers_without/fbh30yv/&quot;&gt;XunSuslo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/Fedora/comments/c0f3z5/systemdboot/er4n5b6/&quot;&gt;gasinvein&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Automatic LUKS 2 disk decryption with TPM 2 on Fedora]]></title><description><![CDATA[You just switched to Linux after years of Windows, and after setting up full disk encryption with LUKS2, you already miss one handy Windows…]]></description><link>https://kowalski7cc.xyz/blog/luks2-tpm2-clevis-fedora31</link><guid isPermaLink="false">https://kowalski7cc.xyz/blog/luks2-tpm2-clevis-fedora31</guid><pubDate>Wed, 03 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 936px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/ad60af09dfbdce3c889f1ec4cacc2840/8aa6d/close-up-of-keys-333837.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.5%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQFBgf/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAABwF95ZawSIf/EABoQAAIDAQEAAAAAAAAAAAAAAAMEAQIFABP/2gAIAQEAAQUCVSYaIfINUUinqNXiR6ZFWCM+xP/EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EACUQAAIBAgMJAQAAAAAAAAAAAAECAwAhERJhBCIjMUFCQ8Hw8f/aAAgBAQAGPwJY4oyzGpGTimC04HjPsa1yrdOXE5LfXptpUWOK5NP29M6oIwe0dK//xAAeEAEAAQQDAQEAAAAAAAAAAAABABEhMVFBYXGx8P/aAAgBAQABPyHEVcwHa8BuEtUb+WnpTC0qY4sYGAOV/DqAgUeuygPjhvcFB6zKeJ//2gAMAwEAAgADAAAAEMM//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQIBAT8QR//EABsQAQEAAwEBAQAAAAAAAAAAAAERACFBMVFx/9oACAEBAAE/EEuXAgOs0DakAFcXEACUUvdag2mL4tmsfzGa9aYQQ9UUF4qkdBI1pAWIwJ0qICxRZ36xidy1Dgzmf//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/ad60af09dfbdce3c889f1ec4cacc2840/b01ca/close-up-of-keys-333837.avif 200w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/f6dc2/close-up-of-keys-333837.avif 296w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/320c3/close-up-of-keys-333837.avif 351w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/b1e59/close-up-of-keys-333837.avif 401w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/41fb2/close-up-of-keys-333837.avif 520w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/6ad16/close-up-of-keys-333837.avif 696w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/184cd/close-up-of-keys-333837.avif 890w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/a1472/close-up-of-keys-333837.avif 936w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/cbb88/close-up-of-keys-333837.avif 1400w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/f2ba6/close-up-of-keys-333837.avif 6000w&quot;
              sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/ad60af09dfbdce3c889f1ec4cacc2840/f1512/close-up-of-keys-333837.webp 200w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/a3b27/close-up-of-keys-333837.webp 296w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/935a0/close-up-of-keys-333837.webp 351w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/3caab/close-up-of-keys-333837.webp 401w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/44983/close-up-of-keys-333837.webp 520w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/657d2/close-up-of-keys-333837.webp 696w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/a870e/close-up-of-keys-333837.webp 890w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/d4696/close-up-of-keys-333837.webp 936w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/aa619/close-up-of-keys-333837.webp 1400w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/ff8e1/close-up-of-keys-333837.webp 6000w&quot;
              sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/ad60af09dfbdce3c889f1ec4cacc2840/16d62/close-up-of-keys-333837.jpg 200w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/e58b0/close-up-of-keys-333837.jpg 296w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/32fcf/close-up-of-keys-333837.jpg 351w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/f4e9b/close-up-of-keys-333837.jpg 401w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/48cd8/close-up-of-keys-333837.jpg 520w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/a4476/close-up-of-keys-333837.jpg 696w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/25b46/close-up-of-keys-333837.jpg 890w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/cfcb0/close-up-of-keys-333837.jpg 936w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/da6ee/close-up-of-keys-333837.jpg 1400w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/8aa6d/close-up-of-keys-333837.jpg 6000w&quot;
            sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/ad60af09dfbdce3c889f1ec4cacc2840/cfcb0/close-up-of-keys-333837.jpg&quot;
            alt=&quot;Photo courtesy of George Becker&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Photo courtesy of George Becker&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;You just switched to Linux after years of Windows, and after setting up full disk encryption with LUKS2, you already miss one handy Windows feature: &lt;strong&gt;BitLocker and its automatic disk unlock&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Today we will learn how to approximate its behavior under the popular Linux distribution Fedora&lt;/p&gt;
&lt;p&gt;If you are using an old version of Fedora, you must use clevis to bind the TPM2 (TPM 1.0 is not supported and never will be) key to the LUKS volume, but if you are using Fedora 35 or later, you can use the new &lt;code class=&quot;language-text&quot;&gt;systemd-cryptenroll&lt;/code&gt; command.&lt;/p&gt;
&lt;p&gt;First chech for available TPM2 devices:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;systemd-cryptenroll --tpm2-device&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;list&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And check for Secure Boot status, you need to enable it in order to prevent tampering with the boot process:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;mokutil --sb-state&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you have a TPM2 device, you can use the following command to bind the TPM2 key to the LUKS volume:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemd-cryptenroll --wipe-slot tpm2 --tpm2-device auto --tpm2-pcrs &lt;span class=&quot;token string&quot;&gt;&quot;0+1+2+3+4+5+7+9&quot;&lt;/span&gt; /dev/nvme0n1p3&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;where &lt;code class=&quot;language-text&quot;&gt;--tpm2-pcrs&lt;/code&gt; is the list of PCRs to use for the binding, you can find more information about PCRs &lt;a href=&quot;#pcr-ids&quot;&gt;later in this article&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You need to update the &lt;code class=&quot;language-text&quot;&gt;/etc/crypttab&lt;/code&gt; file to unlock the volume at boot:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;luks-7a02e564-b7fa-4837-a3ec-3b83752c3a20 UUID=1f7f5ba4-01f8-419e-ae48-5daaa69bd1e6 none discard,tpm2-device=auto&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On earlier versions of &lt;a href=&quot;https://koji.fedoraproject.org/koji/buildinfo?buildID=1929112&quot;&gt;Fedora (before 36)&lt;/a&gt;, you may update dracut to include libtss2 in the initramfs:&lt;/p&gt;
&lt;p&gt;Create a file &lt;code class=&quot;language-text&quot;&gt;/etc/dracut.conf.d/tss2.conf&lt;/code&gt; with the following content:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;install_optional_items+=&quot; /usr/lib64/libtss2* &quot;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;and then regenerate the initramfs:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;dracut &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can also add a recovery key to the LUKS volume. It&apos;s the same as the normal key, but it&apos;s generated with higher entropy.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;systemd-cryptenroll --recovery-key /dev/nvme0n1p3&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Clevis installation and configuration&lt;/h2&gt;
&lt;p&gt;The things we need (besides the LUKS2 installation we already did) to accomplish this task are the &lt;a href=&quot;https://en.wikipedia.org/wiki/Trusted_Platform_Module&quot;&gt;Trusted Platform Module&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;First things first, we need to install the Clevis framework and the needed plugins with Fedora&apos;s DNF package manager with this simple command:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;sudo dnf install clevis clevis-luks clevis-dracut clevis-udisks2 clevis-systemd&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Then we need to find the LUKS volume to bind, we can use the tool &lt;code class=&quot;language-text&quot;&gt;lsblk&lt;/code&gt; to find the volume (In my case it was &lt;code class=&quot;language-text&quot;&gt;nvme0n1p3&lt;/code&gt;).&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;kowalski7cc@Kaos ~&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ lsblk
NAME                                          MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
nvme0n1                                       &lt;span class=&quot;token number&quot;&gt;259&lt;/span&gt;:0    &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;   477G  &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; disk
├─nvme0n1p1                                   &lt;span class=&quot;token number&quot;&gt;259&lt;/span&gt;:1    &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;   600M  &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; part  /boot/efi
├─nvme0n1p2                                   &lt;span class=&quot;token number&quot;&gt;259&lt;/span&gt;:2    &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;     1G  &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; part  /boot
└─nvme0n1p3                                   &lt;span class=&quot;token number&quot;&gt;259&lt;/span&gt;:3    &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;475&lt;/span&gt;,4G  &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; part
  └─luks-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx &lt;span class=&quot;token number&quot;&gt;253&lt;/span&gt;:0    &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;475&lt;/span&gt;,3G  &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; crypt
    ├─fedora_localhost--live-root             &lt;span class=&quot;token number&quot;&gt;253&lt;/span&gt;:1    &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;    70G  &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; lvm   /
    ├─fedora_localhost--live-swap             &lt;span class=&quot;token number&quot;&gt;253&lt;/span&gt;:2    &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;   &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;,8G  &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; lvm   &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;SWAP&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    └─fedora_localhost--live-home             &lt;span class=&quot;token number&quot;&gt;253&lt;/span&gt;:3    &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;397&lt;/span&gt;,6G  &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; lvm   /home&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If we are right we should have an output like this using the tool &lt;code class=&quot;language-text&quot;&gt;cryptsetup&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;kowalski7cc@Kaos ~&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; cryptsetup luksDump /dev/nvme0n1p3
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;sudo&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; password di kowalski7cc:
LUKS header information
Version:        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
Epoch:          &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
Metadata area:  &lt;span class=&quot;token number&quot;&gt;16384&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;bytes&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
Keyslots area:  &lt;span class=&quot;token number&quot;&gt;16744448&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;bytes&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
UUID:           xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Label:          &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;no label&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
Subsystem:      &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;no subsystem&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
Flags:          &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;no flags&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;PCR IDS&lt;/h2&gt;
&lt;p&gt;To make sure our boot has not tampered, we must choose some PCRs to validate against the boot.&lt;/p&gt;
&lt;p&gt;Here is a table with the IDs and a small description of its usage:&lt;/p&gt;
&lt;table class=&quot;table table-striped table-sm table-borderless&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PCR ID&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Firmware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Firmware configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Option ROMs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Option ROMs configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;MBR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;MBR Configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;State transition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Platform-specific&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8 - 15&lt;/td&gt;
&lt;td&gt;Operating System reserved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;Debug&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;Applications&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;p&gt;Finally we can use the following command to set up the decryption key usin the TPM PCRs:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;sudo clevis luks bind -d /dev/nvme0n1p3 tpm2 &apos;{&quot;pcr_ids&quot;:&quot;0,1,2,3,4,5,6,7&quot;}&apos;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;If it&apos;s correct, it will ask for your LUKS encryption password and add the Clevis key to the LUKS header.&lt;/p&gt;
&lt;h2&gt;Key upgrade procedure&lt;/h2&gt;
&lt;p&gt;When we do a kernel upgrade, probably our saved key will be invalidated. At this point, we need first to locate the Clevis key slot in the LUKS header.&lt;/p&gt;
&lt;p&gt;We can use the command &lt;code class=&quot;language-text&quot;&gt;cryptsetup luksDump&lt;/code&gt; like before to locate it.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;kowalski7cc@Kaos ~&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$  &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; cryptsetup luksDump /dev/nvme0n1p3
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;sudo&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; password di kowalski7cc:
LUKS header information
Version:        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
Epoch:          &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
Tokens:
  &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;: clevis
  Keyslot:  &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can see that clevis is using Keyslot 1, so we can proceed with&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;sudo clevis luks unbind -d /dev/nvme0n1p3 -s 1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Then we can use &lt;code class=&quot;language-text&quot;&gt;sudo clevis luks bind...&lt;/code&gt; again to set up the new key.&lt;/p&gt;
&lt;h2&gt;Some notes and small thoughts about security&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;At the moment I&apos;ve tested successfully Clevis only with GRUB&lt;/li&gt;
&lt;li&gt;GRUB doesn&apos;t support measured boot, so it could be possible to tamper&lt;/li&gt;
&lt;li&gt;You need a full trusted chain of boot, e.g. using secureboot
&lt;ul&gt;
&lt;li&gt;You need to allow only your keys&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thehackernews.com/2016/08/uefi-secure-boot-hack.html&quot;&gt;Oops! Microsoft Accidentally Leaks Backdoor Keys to Bypass UEFI Secure Boot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://habr.com/en/post/446238/&quot;&gt;Exploiting signed bootloaders to circumvent UEFI Secure Boot
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TPM 2 has been proved to be unsafe when used alone
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.f-secure.com/cold-boot-attacks/&quot;&gt;The Chilling Reality of Cold Boot Attacks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.zdnet.com/article/new-bitlocker-attack-puts-laptops-storing-sensitive-data-at-risk/&quot;&gt;New BitLocker attack puts laptops storing sensitive data at risk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/windows/security/information-protection/bitlocker/bitlocker-countermeasures&quot;&gt;BitLocker Countermeasures&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;More things about secureboot, trustedboot, measuredboot
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://forums.juniper.net/t5/Security/What-s-the-Difference-between-Secure-Boot-and-Measured-Boot/ba-p/281251&quot;&gt;What’s the Difference between Secure Boot and Measured Boot?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://i.blackhat.com/asia-19/Fri-March-29/bh-asia-Matrosov-Modern-Secure-Boot-Attacks.pdf&quot;&gt;Modern Secure Boot attacks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.c7zero.info/stuff/BIOSandSecureBootAttacksUncovered_eko10.pdf&quot;&gt;BIOS and Secure Boot Attacks Uncovered&lt;/a&gt;
Additional resources&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gist.github.com/jdoss/777e8b52c8d88eb87467935769c98a95&quot;&gt;Decrypt LUKS volumes with a TPM on Fedora 35+&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Top userful JavaScript shorthands]]></title><description><![CDATA[The if-else shorthand shorthand: react: Spread Operator Shorthand react: becomes Destructuring Or Short-circuit Evaluation shorthand: Object…]]></description><link>https://kowalski7cc.xyz/blog/javascript-shorthands</link><guid isPermaLink="false">https://kowalski7cc.xyz/blog/javascript-shorthands</guid><pubDate>Mon, 23 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;The if-else shorthand&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;age &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;You cannot drive in some states&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;You can drive in some states&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;shorthand:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  age &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;18&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Non You cannot drive in some states&quot;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;You can drive in some states&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;react:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-jsx line-numbers&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;age &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;18&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Button&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;disabled&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;You cannot drive&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Button&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Button&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;Book your exam&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Button&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Spread Operator Shorthand&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; numbers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; fullNumbers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;numbers&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;react:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;GreetingFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Greeting firstName&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Kowalski&apos;&lt;/span&gt; lastName&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Dragon&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;becomes&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;GreetingFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; props &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;firstName&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Kowalski&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;lastName&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Dragon&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Greeting &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;props&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Destructuring&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; people &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Max&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Anna&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Tom&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;firstBoy&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; secondBoy&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; people&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
firstBoy&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Max&lt;/span&gt;
secondBoy&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Tom&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Or Short-circuit Evaluation&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;variable1 &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; variable1 &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; variable1 &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; variable2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; variable1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; variable2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;new&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;shorthand:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; variable2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; variable1 &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;new&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Object Property Shorthand&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1920&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  y &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1080&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; obj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; y &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;shorthand:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; obj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Arrow Functions Shorthand&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sayHello&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Hello&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;setTimeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Loaded&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

list&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;shorthand:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token function-variable function&quot;&gt;sayHello&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Hello&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;setTimeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Loaded&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

list&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Implicit Return Shorthand&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;calcCircumference&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;diameter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; Math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;PI&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; diameter&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;shorthand:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token function-variable function&quot;&gt;calcCircumference&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;diameter&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  Math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;PI&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; diameter&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Default Parameter Values&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;volume&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;l&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; w&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; h&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;w &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; w &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;h &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; h &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; l &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; w &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; h&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;shorthand:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token function-variable function&quot;&gt;volume&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;l&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; w &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; h &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; l &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; w &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; h&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;volume&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//output: 24&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;And shorthand with implicit return and arrow function&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isNotEmpty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Array&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isArray&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;arr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; arr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;shorthand:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;isNotEmpty&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; Array&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isArray&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;arr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; arr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;react:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-jsx line-numbers&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;articles &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Template Literals&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; welcome &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;You have logged in as &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; first &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; last &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; db &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;http://&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; host &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;:&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; port &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; database&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; welcome &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;You have logged in as &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;first&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;last&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; db &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;http://&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;host&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;port&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;database&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Sources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://codingcheats.io/javascript#shorthands&quot;&gt;https://codingcheats.io/javascript#shorthands&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://javascript.plainenglish.io/4-useful-javascript-shorthands-you-can-use-in-react-js-ca9d2600bf3f&quot;&gt;https://javascript.plainenglish.io/4-useful-javascript-shorthands-you-can-use-in-react-js-ca9d2600bf3f&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.sitepoint.com/shorthand-javascript-techniques&quot;&gt;https://www.sitepoint.com/shorthand-javascript-techniques&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Gain back the control of your browser]]></title><description><![CDATA[Some sites decided that, for security or whatever any other reasons, you should not use certain browser functionalities. We can change that…]]></description><link>https://kowalski7cc.xyz/blog/gain-back-your-browser</link><guid isPermaLink="false">https://kowalski7cc.xyz/blog/gain-back-your-browser</guid><pubDate>Thu, 17 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 936px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/3a9635bdb6113604376c270ebb3f99d9/7b24f/browser-1666982.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 57.00000000000001%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA3XAAAN1wFCKJt4AAABVklEQVR42p1SS0vDQBDu//co6MGLHixqfYBgC7YXLcUHelDwpKWPiDXVvGyTNNnH50yyaQuWVl34lm93Zr6dmZ0SaIVSYf/1A9tdG9Whj4Y7Rt0Z4eTNwU7PRoVsu/1hhl6UwBcSTirhGjBPlWYpXeK9HwtsWQ72Bi5OhwGqnyOcEY7fPVQIR4RDg6YXouGM0fJD3AQR7r4i1MiXNaaCsQTyB/63JMVOFGaCfOBL1lyGPwnOZ1jwsqVw8OQD1j2s0MFDuw3df86NWv9eMM37i80esFan7WId5e4jNmq3wNU5uFtKqWnWSwUTIqHMIYlzWEi2mHhMfhFzsnlCYSRzFbFMUFApwpST9Y65VvlJz0qdUEBiglaWHNDrHZq3lwVoEzpxirHJbqEgj03xy7wiUh8kAi2auUtC04D5tR/BTmTWgqKKHyVL/og5iBVjoo1P4Z/wJxnbN7TQU9lEjgC/AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/3a9635bdb6113604376c270ebb3f99d9/b01ca/browser-1666982.avif 200w,
/static/3a9635bdb6113604376c270ebb3f99d9/f6dc2/browser-1666982.avif 296w,
/static/3a9635bdb6113604376c270ebb3f99d9/320c3/browser-1666982.avif 351w,
/static/3a9635bdb6113604376c270ebb3f99d9/b1e59/browser-1666982.avif 401w,
/static/3a9635bdb6113604376c270ebb3f99d9/41fb2/browser-1666982.avif 520w,
/static/3a9635bdb6113604376c270ebb3f99d9/6ad16/browser-1666982.avif 696w,
/static/3a9635bdb6113604376c270ebb3f99d9/184cd/browser-1666982.avif 890w,
/static/3a9635bdb6113604376c270ebb3f99d9/a1472/browser-1666982.avif 936w,
/static/3a9635bdb6113604376c270ebb3f99d9/cbb88/browser-1666982.avif 1400w,
/static/3a9635bdb6113604376c270ebb3f99d9/113ff/browser-1666982.avif 2048w&quot;
              sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/3a9635bdb6113604376c270ebb3f99d9/f1512/browser-1666982.webp 200w,
/static/3a9635bdb6113604376c270ebb3f99d9/a3b27/browser-1666982.webp 296w,
/static/3a9635bdb6113604376c270ebb3f99d9/935a0/browser-1666982.webp 351w,
/static/3a9635bdb6113604376c270ebb3f99d9/3caab/browser-1666982.webp 401w,
/static/3a9635bdb6113604376c270ebb3f99d9/44983/browser-1666982.webp 520w,
/static/3a9635bdb6113604376c270ebb3f99d9/657d2/browser-1666982.webp 696w,
/static/3a9635bdb6113604376c270ebb3f99d9/a870e/browser-1666982.webp 890w,
/static/3a9635bdb6113604376c270ebb3f99d9/d4696/browser-1666982.webp 936w,
/static/3a9635bdb6113604376c270ebb3f99d9/aa619/browser-1666982.webp 1400w,
/static/3a9635bdb6113604376c270ebb3f99d9/705b1/browser-1666982.webp 2048w&quot;
              sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/3a9635bdb6113604376c270ebb3f99d9/f8f3a/browser-1666982.png 200w,
/static/3a9635bdb6113604376c270ebb3f99d9/4a902/browser-1666982.png 296w,
/static/3a9635bdb6113604376c270ebb3f99d9/8daf7/browser-1666982.png 351w,
/static/3a9635bdb6113604376c270ebb3f99d9/766a7/browser-1666982.png 401w,
/static/3a9635bdb6113604376c270ebb3f99d9/8b301/browser-1666982.png 520w,
/static/3a9635bdb6113604376c270ebb3f99d9/871fd/browser-1666982.png 696w,
/static/3a9635bdb6113604376c270ebb3f99d9/dcb99/browser-1666982.png 890w,
/static/3a9635bdb6113604376c270ebb3f99d9/14e2f/browser-1666982.png 936w,
/static/3a9635bdb6113604376c270ebb3f99d9/4af54/browser-1666982.png 1400w,
/static/3a9635bdb6113604376c270ebb3f99d9/7b24f/browser-1666982.png 2048w&quot;
            sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/3a9635bdb6113604376c270ebb3f99d9/14e2f/browser-1666982.png&quot;
            alt=&quot;Image by 200 Degrees from Pixabay&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Image by 200 Degrees from Pixabay&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Some sites decided that, for security or whatever any other reasons, you should not use certain browser functionalities. We can change that behaveaur using bookmarklets, bookmarks you can store in your web browser that contains some JavaScript that add new features to it.&lt;/p&gt;
&lt;p&gt;Just add them to your favorites, and &quot;press&quot; on them when you need them!&lt;/p&gt;
&lt;h2&gt;Some userful bookmarklets&lt;/h2&gt;
&lt;p&gt;To add a bookmarklets to your browser, drag and drop the link in your favourites bar or add a new bookmark using the &quot;minified bookmarklet version&quot; as the url of the bookmark.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;javascript:void(document.addEventListener(%22paste%22,function(t)%7Breturn%20t.stopImmediatePropagation(),!0%7D,!0))&quot;&gt;Allow Paste&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Source:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;allowPaste&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stopImmediatePropagation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;paste&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; allowPaste&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Minified bookmarklet version:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;javascript&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;paste&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stopImmediatePropagation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;&lt;a href=&quot;javascript:void(document.oncontextmenu=null)&quot;&gt;Right Click&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Code:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;javascript&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;oncontextmenu &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;&lt;a href=&quot;javascript:(function()%7Bfunction%20R(n)%7Bona=%22on%22+n,window.addEventListener&amp;#x26;&amp;#x26;window.addEventListener(n,function(n)%7Bfor(var%20o=n.originalTarget;o;o=o.parentNode)o%5Bona%5D=null%7D,!0),window%5Bona%5D=null,document%5Bona%5D=null,document.body&amp;#x26;&amp;#x26;(document.body%5Bona%5D=null)%7DR(%22click%22),R(%22mousedown%22),R(%22mouseup%22),R(%22selectstart%22);%7D)()&quot;&gt;Text Selection&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Source:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ona &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;on&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;addEventListener&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
      a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;originalTarget&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parentNode&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;ona&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  window&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;ona&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  document&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;ona&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;ona&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token constant&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;click&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token constant&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;mousedown&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token constant&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;mouseup&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token constant&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;selectstart&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Minified bookmarklet version:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;javascript&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ona &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;on&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;addEventListener &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
        window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
          n&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; o &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;originalTarget&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; o&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; o &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; o&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parentNode&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; o&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;ona&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;ona&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;ona&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;body &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;ona&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;click&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;mousedown&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;mouseup&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;selectstart&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Sources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Bookmarklet&quot;&gt;https://en.wikipedia.org/wiki/Bookmarklet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.howtogeek.com/251807/how-to-enable-pasting-text-on-sites-that-block-it/&quot;&gt;https://www.howtogeek.com/251807/how-to-enable-pasting-text-on-sites-that-block-it/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://javascript-minifier.com/&quot;&gt;https://javascript-minifier.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[My homelab]]></title><description><![CDATA[What is packed inside my rack Ubiquiti USG 4 Pro Patch Panel Cable organizer Ubiquiti UniFi Switch 16 PoE Tim Hub Tado° Smart Thermostat…]]></description><link>https://kowalski7cc.xyz/blog/homelab</link><guid isPermaLink="false">https://kowalski7cc.xyz/blog/homelab</guid><pubDate>Thu, 19 Sep 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 936px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/924ed691b82ac9d3cd2e6ffa23809afd/018d2/rack.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 133%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wgARCAAbABQDASIAAhEBAxEB/8QAGgAAAQUBAAAAAAAAAAAAAAAAAAQFBgcIA//EABcBAAMBAAAAAAAAAAAAAAAAAAECAwT/2gAMAwEAAhADEAAAAasfGCYCsJFQVZuul1GHZm0sAov/xAAdEAACAgIDAQAAAAAAAAAAAAACBAEDAAUTFBUi/9oACAEBAAEFAkqxOLKKSzuMCSOxNXG9gErc/wBxTNkEsZVrLzZFWuWkPMVnNujRS3//xAAZEQACAwEAAAAAAAAAAAAAAAAAAgEDEwT/2gAIAQMBAT8BssZWNmJ5mMYP/8QAGREAAwEBAQAAAAAAAAAAAAAAAAECAwQT/9oACAECAQE/AYzmkeMC6pFqz//EACYQAAICAQEGBwAAAAAAAAAAAAECABEDBBIhMTNSsRMiMkJDgcH/2gAIAQEABj8CttVqkN/FjLDvNp9bnBHC9PR7xgNVmoHqMVUzZseM7/K5EVhqn8bqGQ3Hq/VvlhiuyPszmnh7o7KLF/kBOFbM5KykTYBF7jP/xAAeEAEBAQEAAgIDAAAAAAAAAAABESEAMVFxkUGhwf/aAAgBAQABPyFTQ8IP5joEbWjT8k/bitigwp789hrBxfkE3lBcz7db2kVKUPldvZxAGPDe0pkm+s5+CfXHMgaLPPaBnxDWIYrU/h3/2gAMAwEAAgADAAAAEJQKs//EABwRAAICAgMAAAAAAAAAAAAAAAABESExkUFh0f/aAAgBAwEBPxCFLnsaXF7GMRt+E1tn/8QAHREAAgICAwEAAAAAAAAAAAAAAREAITGRQcHR8P/aAAgBAgEBPxByIFLj7qMutCB5eh7CAFif/8QAHxABAQADAAICAwAAAAAAAAAAAREAITFBUWFxgdHw/9oACAEBAAE/ECJ4DhrEElbr6wjqDomvNHdrergrtBLVEcPxhw67UKijKAr3WNITVhBi9UVYfV24krI7O5x5pgdCBRS7jJo9vcLFIhRDoI2p7mBk3ytAo6/rhPMqVStXeLkSNkf3hogR3syD2B+DP//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/924ed691b82ac9d3cd2e6ffa23809afd/b01ca/rack.avif 200w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/f6dc2/rack.avif 296w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/320c3/rack.avif 351w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/b1e59/rack.avif 401w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/41fb2/rack.avif 520w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/6ad16/rack.avif 696w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/184cd/rack.avif 890w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/a1472/rack.avif 936w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/cbb88/rack.avif 1400w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/2f6bd/rack.avif 3771w&quot;
              sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/924ed691b82ac9d3cd2e6ffa23809afd/f1512/rack.webp 200w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/a3b27/rack.webp 296w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/935a0/rack.webp 351w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/3caab/rack.webp 401w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/44983/rack.webp 520w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/657d2/rack.webp 696w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/a870e/rack.webp 890w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/d4696/rack.webp 936w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/aa619/rack.webp 1400w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/7f4a7/rack.webp 3771w&quot;
              sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/924ed691b82ac9d3cd2e6ffa23809afd/16d62/rack.jpg 200w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/e58b0/rack.jpg 296w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/32fcf/rack.jpg 351w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/f4e9b/rack.jpg 401w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/48cd8/rack.jpg 520w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/a4476/rack.jpg 696w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/25b46/rack.jpg 890w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/cfcb0/rack.jpg 936w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/da6ee/rack.jpg 1400w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/018d2/rack.jpg 3771w&quot;
            sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/924ed691b82ac9d3cd2e6ffa23809afd/cfcb0/rack.jpg&quot;
            alt=&quot;&amp;quot;The Rack&amp;quot;&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;&amp;quot;The Rack&amp;quot;&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2&gt;What is packed inside my rack&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ubiquiti USG 4 Pro&lt;/li&gt;
&lt;li&gt;Patch Panel&lt;/li&gt;
&lt;li&gt;Cable organizer&lt;/li&gt;
&lt;li&gt;Ubiquiti UniFi Switch 16 PoE&lt;/li&gt;
&lt;li&gt;Tim Hub&lt;/li&gt;
&lt;li&gt;Tado° Smart Thermostat&lt;/li&gt;
&lt;li&gt;Dell R210 II
&lt;ul&gt;
&lt;li&gt;Intel Xeon E3 1265l V2&lt;/li&gt;
&lt;li&gt;16GB ECC Buffered&lt;/li&gt;
&lt;li&gt;2x 3TB WD Red&lt;/li&gt;
&lt;li&gt;Samsung 860 Evo 250GB SSD&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;UPS CyberPower 900VA&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Total power usage: Less than 120 Watts!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 936px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/2e0f611304d47b4312a8ef90d6c2dc76/8018f/server.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAYEBQf/xAAVAQEBAAAAAAAAAAAAAAAAAAACBv/aAAwDAQACEAMQAAABpV5olztBnYxBf//EABkQAAMBAQEAAAAAAAAAAAAAAAEDBAUCEv/aAAgBAQABBQLKzvfaUtNLoej3HgynhmNKTRgxhv8A/8QAGREAAgMBAAAAAAAAAAAAAAAAAQQAAhEh/9oACAEDAQE/AbqM3Oi2QLMjmif/xAAbEQABBAMAAAAAAAAAAAAAAAABAAIEERIUIf/aAAgBAgEBPwFs+MwY0tuMe0V//8QAIxAAAgECBAcAAAAAAAAAAAAAAQIAAxESISOTEzEzUWFjkf/aAAgBAQAGPwJtKm91I1TyPfzESoyimxILYLS+D5nB1dwyxFTCPYZlxdwz/8QAGxABAAMBAQEBAAAAAAAAAAAAAQARITFBUfD/2gAIAQEAAT8hWhslAqwB1AHSinGuzHDfiKbH5VR3efGQBjGmB+/Z/9oADAMBAAIAAwAAABB//wD/xAAbEQEAAQUBAAAAAAAAAAAAAAABABEhQZGh0f/aAAgBAwEBPxBQQOBbcgBUb8n/xAAcEQEAAQQDAAAAAAAAAAAAAAABABEhQWFxodH/2gAIAQIBAT8QMJqaL9zENePZ/8QAHRABAQACAwADAAAAAAAAAAAAAREAITFBYVFxgf/aAAgBAQABPxCQ3Uh4DaFNcacpfZ6y2ZOYwbOZcUAFoCFQt+I/SZJrCOz133t/ctEcCEDNR0+94MiHRXH/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/2e0f611304d47b4312a8ef90d6c2dc76/b01ca/server.avif 200w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/f6dc2/server.avif 296w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/320c3/server.avif 351w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/b1e59/server.avif 401w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/41fb2/server.avif 520w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/6ad16/server.avif 696w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/184cd/server.avif 890w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/a1472/server.avif 936w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/cbb88/server.avif 1400w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/511ee/server.avif 3593w&quot;
              sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/2e0f611304d47b4312a8ef90d6c2dc76/f1512/server.webp 200w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/a3b27/server.webp 296w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/935a0/server.webp 351w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/3caab/server.webp 401w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/44983/server.webp 520w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/657d2/server.webp 696w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/a870e/server.webp 890w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/d4696/server.webp 936w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/aa619/server.webp 1400w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/d2d9f/server.webp 3593w&quot;
              sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/2e0f611304d47b4312a8ef90d6c2dc76/16d62/server.jpg 200w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/e58b0/server.jpg 296w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/32fcf/server.jpg 351w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/f4e9b/server.jpg 401w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/48cd8/server.jpg 520w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/a4476/server.jpg 696w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/25b46/server.jpg 890w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/cfcb0/server.jpg 936w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/da6ee/server.jpg 1400w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/8018f/server.jpg 3593w&quot;
            sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/2e0f611304d47b4312a8ef90d6c2dc76/cfcb0/server.jpg&quot;
            alt=&quot;Server Dell R210 II&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Server Dell R210 II&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Happy homelabbing everyone!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[My battlestation]]></title><description><![CDATA[What is on my desk Dell XPS 13 9350 Intel Core i7 6560U Samsung 500GB SSD NVMe 16GB DDR3l 4K touch display Edifier Luna Eclipse Dell WD1…]]></description><link>https://kowalski7cc.xyz/blog/battlestation</link><guid isPermaLink="false">https://kowalski7cc.xyz/blog/battlestation</guid><pubDate>Tue, 17 Sep 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 936px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/10f6ee57496c4e24a8d20255e82dad06/e1ade/battlestation.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 67%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wgARCAANABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAQFBv/EABYBAQEBAAAAAAAAAAAAAAAAAAQAAf/aAAwDAQACEAMQAAABjW8YsVzhDLf/xAAaEAACAwEBAAAAAAAAAAAAAAADBAECBREA/9oACAEBAAEFAllVmxMchXVy6vOVoGBBIEvnuGP/AP/EABkRAAIDAQAAAAAAAAAAAAAAAAABExRBYf/aAAgBAwEBPwGv0ia0/8QAGhEAAgIDAAAAAAAAAAAAAAAAAAECIQQRE//aAAgBAgEBPwF5G7OsXbR//8QAIBAAAgIBBAMBAAAAAAAAAAAAAQIAEQMEEiExEyJRcv/aAAgBAQAGPwLCh1KqX91JHQhC6lsAWy+StwqNkGqUCgKac4t3H2FfEQP3ctwWNV3P/8QAHhABAAEEAgMAAAAAAAAAAAAAAQARITFBUXGBscH/2gAIAQEAAT8hCC7SFwEXWZSSAK0cPNobNhupbxETqNPkQ7cfsRU2BK4hgn//2gAMAwEAAgADAAAAEAMf/8QAGhEAAgIDAAAAAAAAAAAAAAAAAAERkTFB8P/aAAgBAwEBPxBT0owl2j//xAAbEQACAQUAAAAAAAAAAAAAAAAAAREhMVFhcf/aAAgBAgEBPxCQoOm79M8n/8QAGxABAAMBAQEBAAAAAAAAAAAAAREhMQBBUWH/2gAIAQEAAT8QfUvr0yICKEUuOiudClReJRjc48R+AYAGmaMznrb0BYOhcNoMkw4TrqoA+Q6H596XX1cijDAo7//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/10f6ee57496c4e24a8d20255e82dad06/b01ca/battlestation.avif 200w,
/static/10f6ee57496c4e24a8d20255e82dad06/f6dc2/battlestation.avif 296w,
/static/10f6ee57496c4e24a8d20255e82dad06/320c3/battlestation.avif 351w,
/static/10f6ee57496c4e24a8d20255e82dad06/b1e59/battlestation.avif 401w,
/static/10f6ee57496c4e24a8d20255e82dad06/41fb2/battlestation.avif 520w,
/static/10f6ee57496c4e24a8d20255e82dad06/6ad16/battlestation.avif 696w,
/static/10f6ee57496c4e24a8d20255e82dad06/184cd/battlestation.avif 890w,
/static/10f6ee57496c4e24a8d20255e82dad06/a1472/battlestation.avif 936w,
/static/10f6ee57496c4e24a8d20255e82dad06/cbb88/battlestation.avif 1400w,
/static/10f6ee57496c4e24a8d20255e82dad06/d5b12/battlestation.avif 6016w&quot;
              sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/10f6ee57496c4e24a8d20255e82dad06/f1512/battlestation.webp 200w,
/static/10f6ee57496c4e24a8d20255e82dad06/a3b27/battlestation.webp 296w,
/static/10f6ee57496c4e24a8d20255e82dad06/935a0/battlestation.webp 351w,
/static/10f6ee57496c4e24a8d20255e82dad06/3caab/battlestation.webp 401w,
/static/10f6ee57496c4e24a8d20255e82dad06/44983/battlestation.webp 520w,
/static/10f6ee57496c4e24a8d20255e82dad06/657d2/battlestation.webp 696w,
/static/10f6ee57496c4e24a8d20255e82dad06/a870e/battlestation.webp 890w,
/static/10f6ee57496c4e24a8d20255e82dad06/d4696/battlestation.webp 936w,
/static/10f6ee57496c4e24a8d20255e82dad06/aa619/battlestation.webp 1400w,
/static/10f6ee57496c4e24a8d20255e82dad06/d05a5/battlestation.webp 6016w&quot;
              sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/10f6ee57496c4e24a8d20255e82dad06/16d62/battlestation.jpg 200w,
/static/10f6ee57496c4e24a8d20255e82dad06/e58b0/battlestation.jpg 296w,
/static/10f6ee57496c4e24a8d20255e82dad06/32fcf/battlestation.jpg 351w,
/static/10f6ee57496c4e24a8d20255e82dad06/f4e9b/battlestation.jpg 401w,
/static/10f6ee57496c4e24a8d20255e82dad06/48cd8/battlestation.jpg 520w,
/static/10f6ee57496c4e24a8d20255e82dad06/a4476/battlestation.jpg 696w,
/static/10f6ee57496c4e24a8d20255e82dad06/25b46/battlestation.jpg 890w,
/static/10f6ee57496c4e24a8d20255e82dad06/cfcb0/battlestation.jpg 936w,
/static/10f6ee57496c4e24a8d20255e82dad06/da6ee/battlestation.jpg 1400w,
/static/10f6ee57496c4e24a8d20255e82dad06/e1ade/battlestation.jpg 6016w&quot;
            sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/10f6ee57496c4e24a8d20255e82dad06/cfcb0/battlestation.jpg&quot;
            alt=&quot;My battlestation&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;My battlestation&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2&gt;What is on my desk&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Dell XPS 13 9350
&lt;ul&gt;
&lt;li&gt;Intel Core i7 6560U&lt;/li&gt;
&lt;li&gt;Samsung 500GB SSD NVMe&lt;/li&gt;
&lt;li&gt;16GB DDR3l&lt;/li&gt;
&lt;li&gt;4K touch display&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Edifier Luna Eclipse&lt;/li&gt;
&lt;li&gt;Dell WD15 Dock&lt;/li&gt;
&lt;li&gt;AOC 23&quot; FHD 3D monitor&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Google&lt;/del&gt; Nest Home Mini&lt;/li&gt;
&lt;li&gt;Logitech Keyboard K810&lt;/li&gt;
&lt;li&gt;Logitech MX Master mouse&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tux-droid&quot; title=&quot;My TuxDroid GitHub repository&quot;&gt;Kysoh TuxDroid&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 936px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/8a2bad80132392064a5b65571d9e58f0/e1ade/tuxdroid.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 67%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAQGBQf/xAAVAQEBAAAAAAAAAAAAAAAAAAADBf/aAAwDAQACEAMQAAABmNxV2PW5CUop/wD/xAAaEAADAQEBAQAAAAAAAAAAAAACBAUBAwYU/9oACAEBAAEFArLePyayffygtGxR7KF82uVu9URVJPf/xAAbEQACAQUAAAAAAAAAAAAAAAAAAgEEERQxQf/aAAgBAwEBPwFaSzQy6MZen//EABoRAAICAwAAAAAAAAAAAAAAAAABAgQRFEH/2gAIAQIBAT8Bldbymjalw//EAB8QAAIBBAIDAAAAAAAAAAAAAAECAwAREjEEIRMyQf/aAAgBAQAGPwJYIYipyW1238ArjccSMY5luTuzAdijM15L6IpZFALLrKvHycXsbg46pkSXonL1r//EABwQAQACAgMBAAAAAAAAAAAAAAEAESExQVFh0f/aAAgBAQABPyE/wq7v0EEyfx4r40wntDAKITat0CX3DFGFANOpk0eiMXxP/9oADAMBAAIAAwAAABDoP//EABwRAAICAgMAAAAAAAAAAAAAAAERADEhQWHR8P/aAAgBAwEBPxDFCzBDrvzg0S+Ep//EABsRAQEAAgMBAAAAAAAAAAAAABEBIUEAMVFh/9oACAECAQE/EJFS3BZTtcGiHrrdTOH15//EABwQAQADAQADAQAAAAAAAAAAAAERITEAQVFhcf/aAAgBAQABPxC8pOiEwAJVg/OVwEKng8WiNBjL8a02VQR78v1eLjiNQIom+nRzviSkxpBTOpbwYkvbViHK7//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/8a2bad80132392064a5b65571d9e58f0/b01ca/tuxdroid.avif 200w,
/static/8a2bad80132392064a5b65571d9e58f0/f6dc2/tuxdroid.avif 296w,
/static/8a2bad80132392064a5b65571d9e58f0/320c3/tuxdroid.avif 351w,
/static/8a2bad80132392064a5b65571d9e58f0/b1e59/tuxdroid.avif 401w,
/static/8a2bad80132392064a5b65571d9e58f0/41fb2/tuxdroid.avif 520w,
/static/8a2bad80132392064a5b65571d9e58f0/6ad16/tuxdroid.avif 696w,
/static/8a2bad80132392064a5b65571d9e58f0/184cd/tuxdroid.avif 890w,
/static/8a2bad80132392064a5b65571d9e58f0/a1472/tuxdroid.avif 936w,
/static/8a2bad80132392064a5b65571d9e58f0/cbb88/tuxdroid.avif 1400w,
/static/8a2bad80132392064a5b65571d9e58f0/d5b12/tuxdroid.avif 6016w&quot;
              sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/8a2bad80132392064a5b65571d9e58f0/f1512/tuxdroid.webp 200w,
/static/8a2bad80132392064a5b65571d9e58f0/a3b27/tuxdroid.webp 296w,
/static/8a2bad80132392064a5b65571d9e58f0/935a0/tuxdroid.webp 351w,
/static/8a2bad80132392064a5b65571d9e58f0/3caab/tuxdroid.webp 401w,
/static/8a2bad80132392064a5b65571d9e58f0/44983/tuxdroid.webp 520w,
/static/8a2bad80132392064a5b65571d9e58f0/657d2/tuxdroid.webp 696w,
/static/8a2bad80132392064a5b65571d9e58f0/a870e/tuxdroid.webp 890w,
/static/8a2bad80132392064a5b65571d9e58f0/d4696/tuxdroid.webp 936w,
/static/8a2bad80132392064a5b65571d9e58f0/aa619/tuxdroid.webp 1400w,
/static/8a2bad80132392064a5b65571d9e58f0/d05a5/tuxdroid.webp 6016w&quot;
              sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/8a2bad80132392064a5b65571d9e58f0/16d62/tuxdroid.jpg 200w,
/static/8a2bad80132392064a5b65571d9e58f0/e58b0/tuxdroid.jpg 296w,
/static/8a2bad80132392064a5b65571d9e58f0/32fcf/tuxdroid.jpg 351w,
/static/8a2bad80132392064a5b65571d9e58f0/f4e9b/tuxdroid.jpg 401w,
/static/8a2bad80132392064a5b65571d9e58f0/48cd8/tuxdroid.jpg 520w,
/static/8a2bad80132392064a5b65571d9e58f0/a4476/tuxdroid.jpg 696w,
/static/8a2bad80132392064a5b65571d9e58f0/25b46/tuxdroid.jpg 890w,
/static/8a2bad80132392064a5b65571d9e58f0/cfcb0/tuxdroid.jpg 936w,
/static/8a2bad80132392064a5b65571d9e58f0/da6ee/tuxdroid.jpg 1400w,
/static/8a2bad80132392064a5b65571d9e58f0/e1ade/tuxdroid.jpg 6016w&quot;
            sizes=&quot;(max-width: 936px) 100vw, 936px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/8a2bad80132392064a5b65571d9e58f0/cfcb0/tuxdroid.jpg&quot;
            alt=&quot;My penguin robot, TuxDroid&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;My penguin robot, TuxDroid&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;That&apos;s it :)&lt;/p&gt;</content:encoded></item></channel></rss>