<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Richy HBM</title>
    <link>https://www.richyhbm.co.uk/</link>
    <description>Recent content on Richy HBM</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 02 Jun 2025 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://www.richyhbm.co.uk/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Day III Digital</title>
      <link>https://www.richyhbm.co.uk/work/dayiii/</link>
      <pubDate>Mon, 02 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://www.richyhbm.co.uk/work/dayiii/</guid>
      <description>&lt;h2&gt;&#xA;    &lt;picture class=&#34;hidden-small&#34;&gt;&#xA;        &lt;source type=&#34;image/webp&#34; srcset=&#34;https://www.richyhbm.co.uk/img/companies/day_iii_digital.webp&#34;&gt;&#xA;        &lt;source type=&#34;image/png&#34; srcset=&#34;https://www.richyhbm.co.uk/img/companies/day_iii_digital.png&#34;&gt;&#xA;        &lt;img src=&#34;https://www.richyhbm.co.uk/img/companies/day_iii_digital.png&#34; alt=&#34;Day III Digital&#34;&gt;&#xA;    &lt;/picture&gt;&#xA;    Day III Digital&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Mentoring and managing team-members&lt;/li&gt;&#xA;&lt;li&gt;Building &amp;amp; managing internal tools&lt;/li&gt;&#xA;&lt;li&gt;Creating AI workflows for game development&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;br /&gt;&#xA;&lt;h3 id=&#34;2025---infrastructure-lead---current&#34;&gt;2025 - Infrastructure Lead - Current&lt;/h3&gt;&#xA;&lt;ul class=&#34;skills-list&#34;&gt;&#xA;    &lt;li&gt;Azure&lt;/li&gt;&#xA;    &lt;li&gt;C++&lt;/li&gt;&#xA;    &lt;li&gt;Go&lt;/li&gt;&#xA;    &lt;li&gt;Python&lt;/li&gt;&#xA;    &lt;li&gt;Unreal Engine&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;hidden-small&#34;&gt;&#xA;    &lt;picture&gt;&#xA;        &lt;source type=&#34;image/webp&#34; srcset=&#34;https://www.richyhbm.co.uk/img/games/Mafia_The_Old_Country.webp&#34;&gt;&#xA;        &lt;source type=&#34;image/jpeg&#34; srcset=&#34;https://www.richyhbm.co.uk/img/games/Mafia_The_Old_Country.jpg&#34;&gt;&#xA;        &lt;img class=&#34;small-showcase-img&#34; src=&#34;https://www.richyhbm.co.uk/img/games/Mafia_The_Old_Country.jpg&#34; alt=&#34;mafia&#34;&gt;&#xA;    &lt;/picture&gt;&#xA;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Converting HTML to PDF in Continuous Integration using Containers</title>
      <link>https://www.richyhbm.co.uk/posts/2024/converting-html-to-pdf-in-ci-using-containers/</link>
      <pubDate>Wed, 28 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://www.richyhbm.co.uk/posts/2024/converting-html-to-pdf-in-ci-using-containers/</guid>
      <description>&lt;p&gt;Having content displayed as HTML can be very convenient for certain things, rapidly changing content, accessibility tools, and being able to style it more concisely, are some examples. However when creating a print out you are at the whim of the person printing it keeping the correct styling without any browser/printer adding any extra styling of its own, for this reason I wanted to host a PDF version, to allow people to easily print out or save an offline copy with the styling I originally envisioned.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Self Hosting</title>
      <link>https://www.richyhbm.co.uk/project/self-hosting/</link>
      <pubDate>Thu, 01 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://www.richyhbm.co.uk/project/self-hosting/</guid>
      <description>&lt;p&gt;Self hosting a number of docker based services.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using Esp32-Cam Devices for CCTV</title>
      <link>https://www.richyhbm.co.uk/posts/2023/using-esp32cam-devices-for-cctv/</link>
      <pubDate>Thu, 09 Nov 2023 00:00:00 +0000</pubDate>
      <guid>https://www.richyhbm.co.uk/posts/2023/using-esp32cam-devices-for-cctv/</guid>
      <description>&lt;p&gt;I had wanted to get a couple of cameras to watch over my house and make sure everything was as I expected. A couple of requirements I had when looking were being able to use them without any cloud connection, and being compatible with self-hosted solutions, which usually means having RTSP support. Looking at some commercial products, it seemed hit or miss as to whether they would support any custom firmware which would mean needing advanced networking setup to cut them out from the internet but also allowing local networking, for these reasons I decided for now to give making my own a go&amp;hellip;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Simple Email Archival and Indexing</title>
      <link>https://www.richyhbm.co.uk/posts/2023/simple-email-archive/</link>
      <pubDate>Fri, 17 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://www.richyhbm.co.uk/posts/2023/simple-email-archive/</guid>
      <description>&lt;p&gt;One of the main pain points with self-hosting tends to be email, whilst setting up a mail server isn&amp;rsquo;t especially hard, the maintenance is what causes most issues; and in particular keeping your self-hosted mail servers off of spam lists. That&amp;rsquo;s why I generally leave that to third parties, however I still like to keep a local storage of my mail, mostly for backup purposes&amp;hellip;&lt;/p&gt;</description>
    </item>
    <item>
      <title>My Many Iterations for the Perfect Self-Hosted Dashboard</title>
      <link>https://www.richyhbm.co.uk/posts/2023/my-many-iterations-for-the-perfect-self-hosted-dashboard/</link>
      <pubDate>Wed, 11 Jan 2023 00:00:00 +0000</pubDate>
      <guid>https://www.richyhbm.co.uk/posts/2023/my-many-iterations-for-the-perfect-self-hosted-dashboard/</guid>
      <description>&lt;p&gt;Well, It&amp;rsquo;s been quite some time since my last post. So much so in fact that we&amp;rsquo;ve had a global pandemic and various life events between then and now! Since my last post, and with a little spare time we have all had, I have been heavily getting into self-hosting, and by extent sysops/homelabs, one of which services that soon becomes controversial is the choice of what dashboard to use. In this post I will detail some of the options I have tried out.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Beach - Rust Community Server</title>
      <link>https://www.richyhbm.co.uk/project/beach/</link>
      <pubDate>Wed, 10 Mar 2021 00:00:00 +0000</pubDate>
      <guid>https://www.richyhbm.co.uk/project/beach/</guid>
      <description>&lt;p&gt;Moderation and Plugin support for a community Rust server.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Compiling a Kotlin &amp; Netty WebApp with GraalVM</title>
      <link>https://www.richyhbm.co.uk/posts/2018/compiling-kotlin-netty-webapp-with-graalvm/</link>
      <pubDate>Thu, 21 Jun 2018 00:00:00 +0000</pubDate>
      <guid>https://www.richyhbm.co.uk/posts/2018/compiling-kotlin-netty-webapp-with-graalvm/</guid>
      <description>&lt;p&gt;Ever since I started making use of Docker I have always been at a turmoil on whether a JVM language was the best solution for the job. You see JVM has a great level of support with loads of libraries a number of different languages and great performance, however this comes at a cost of a large runtime environment and memory requirements (not to mention warm up times). On the other hand there are languages like Go that include everything you need to build a webapp in the standard library, produce a small single binary and dont have large memory footprint or startup times. Go felt like a much leaner language better prepared for this era of microservices and small docker containers, that is until GraalVM came about.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kotlin Server in Less Than 5MB</title>
      <link>https://www.richyhbm.co.uk/posts/2018/kotlin-server-in-less-than-5mb/</link>
      <pubDate>Sun, 29 Apr 2018 00:00:00 +0000</pubDate>
      <guid>https://www.richyhbm.co.uk/posts/2018/kotlin-server-in-less-than-5mb/</guid>
      <description>&lt;p&gt;One of the things I like most about languages like GoLang is the fact you can create a small executable that holds all the files needed for a server, or any other application. Kotlin, and any other JVM based languages, however always seem to be rather bloated, Kotlin and Spring have often been over 100mb, and even Scala and Play Framework are of a similar size.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Moving to Hugo</title>
      <link>https://www.richyhbm.co.uk/posts/2018/moving-to-hugo/</link>
      <pubDate>Thu, 05 Apr 2018 00:00:00 +0000</pubDate>
      <guid>https://www.richyhbm.co.uk/posts/2018/moving-to-hugo/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been using my old static site generator setup for years now, when I first started using &lt;a href=&#34;https://docpad.org/&#34;&gt;DocPad&lt;/a&gt; it was fast, simple and had the ability to add plugins which made it immensely extensible. However since then development has died down and &lt;a href=&#34;https://github.com/docpad/docpad/issues/1072&#34;&gt;there have been some questions about how long the development will continue&lt;/a&gt;, my site has become more complex requiring a number of additional plugins, and the general performance of DocPad seems to have slowed down (mostly due to the additional plugins ect.)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Success</title>
      <link>https://www.richyhbm.co.uk/contact/success/</link>
      <pubDate>Thu, 05 Apr 2018 00:00:00 +0000</pubDate>
      <guid>https://www.richyhbm.co.uk/contact/success/</guid>
      <description>&lt;h1 id=&#34;message-submitted&#34;&gt;Message submitted!&lt;/h1&gt;&#xA;&lt;p&gt;Thank you for sending me a message, &lt;a href=&#34;https://www.richyhbm.co.uk/&#34;&gt;feel free to continue looking around&lt;/a&gt;!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Bossalien</title>
      <link>https://www.richyhbm.co.uk/work/bossalien/</link>
      <pubDate>Tue, 27 Mar 2018 00:00:00 +0000</pubDate>
      <guid>https://www.richyhbm.co.uk/work/bossalien/</guid>
      <description>&lt;h2&gt;&#xA;    &lt;picture class=&#34;hidden-small&#34;&gt;&#xA;        &lt;source type=&#34;image/webp&#34; srcset=&#34;https://www.richyhbm.co.uk/img/companies/zynga_logo.webp&#34;&gt;&#xA;        &lt;source type=&#34;image/png&#34; srcset=&#34;https://www.richyhbm.co.uk/img/companies/zynga_logo.png&#34;&gt;&#xA;        &lt;img src=&#34;https://www.richyhbm.co.uk/img/companies/zynga_logo.png&#34; alt=&#34;Zynga&#34;&gt;&#xA;    &lt;/picture&gt;&#xA;    Zynga&#39;s NaturalMotion Studio&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Released CSR: Racing, CSR: Classics, Star Wars: Hunters&lt;/li&gt;&#xA;&lt;li&gt;Feature team on CSR: Racing 2&lt;/li&gt;&#xA;&lt;li&gt;Led audio development team on Star Wars: Hunters&lt;/li&gt;&#xA;&lt;li&gt;Built fan-favourite game modes on Star Wars: Hunters&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;br /&gt;&#xA;&lt;h3 id=&#34;2018---senior-software-engineer---6-years-8-months&#34;&gt;2018 - Senior Software Engineer - 6 years, 8 months&lt;/h3&gt;&#xA;&lt;ul class=&#34;skills-list&#34;&gt;&#xA;    &lt;li&gt;AWS&lt;/li&gt;&#xA;    &lt;li&gt;C#&lt;/li&gt;&#xA;    &lt;li&gt;C++&lt;/li&gt;&#xA;    &lt;li&gt;Go&lt;/li&gt;&#xA;    &lt;li&gt;Python&lt;/li&gt;&#xA;    &lt;li&gt;Unreal Engine&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h6 id=&#34;2014---software-engineer---4-years-2-months&#34;&gt;2014 - Software Engineer - 4 years, 2 months&lt;/h6&gt;&#xA;&lt;ul class=&#34;skills-list&#34;&gt;&#xA;    &lt;li&gt;AWS&lt;/li&gt;&#xA;    &lt;li&gt;C#&lt;/li&gt;&#xA;    &lt;li&gt;PHP&lt;/li&gt;&#xA;    &lt;li&gt;Scala&lt;/li&gt;&#xA;    &lt;li&gt;NodeJS&lt;/li&gt;&#xA;    &lt;li&gt;Unity&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h6 id=&#34;2013---intern-software-engineer---4-months&#34;&gt;2013 - Intern Software Engineer - 4 months&lt;/h6&gt;&#xA;&lt;ul class=&#34;skills-list&#34;&gt;&#xA;    &lt;li&gt;C#&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;half-column-section hidden-small&#34;&gt;&#xA;    &lt;picture&gt;&#xA;        &lt;source type=&#34;image/webp&#34; srcset=&#34;https://www.richyhbm.co.uk/img/games/star_wars.webp&#34;&gt;&#xA;        &lt;source type=&#34;image/jpeg&#34; srcset=&#34;https://www.richyhbm.co.uk/img/games/star_wars.jpg&#34;&gt;&#xA;        &lt;img class=&#34;wide-showcase-img&#34; src=&#34;https://www.richyhbm.co.uk/img/games/star_wars.jpg&#34; alt=&#34;Star Wars&#34;&gt;&#xA;    &lt;/picture&gt;&#xA;    &lt;picture&gt;&#xA;        &lt;source type=&#34;image/webp&#34; srcset=&#34;https://www.richyhbm.co.uk/img/games/CSR_Racing_2.webp&#34;&gt;&#xA;        &lt;source type=&#34;image/jpeg&#34; srcset=&#34;https://www.richyhbm.co.uk/img/games/CSR_Racing_2.jpg&#34;&gt;&#xA;        &lt;img class=&#34;wide-showcase-img&#34; src=&#34;https://www.richyhbm.co.uk/img/games/CSR_Racing_2.jpg&#34; alt=&#34;CSR Racing 2&#34;&gt;&#xA;    &lt;/picture&gt;&#xA;    &lt;picture&gt;&#xA;        &lt;source type=&#34;image/webp&#34; srcset=&#34;https://www.richyhbm.co.uk/img/games/CSR_Classics.webp&#34;&gt;&#xA;        &lt;source type=&#34;image/jpeg&#34; srcset=&#34;https://www.richyhbm.co.uk/img/games/CSR_Classics.jpg&#34;&gt;&#xA;        &lt;img class=&#34;wide-showcase-img&#34; src=&#34;https://www.richyhbm.co.uk/img/games/CSR_Classics.jpg&#34; alt=&#34;CSR Classics&#34;&gt;&#xA;    &lt;/picture&gt;&#xA;    &lt;picture&gt;&#xA;        &lt;source type=&#34;image/webp&#34; srcset=&#34;https://www.richyhbm.co.uk/img/games/CSR_Racing.webp&#34;&gt;&#xA;        &lt;source type=&#34;image/jpeg&#34; srcset=&#34;https://www.richyhbm.co.uk/img/games/CSR_Racing.jpg&#34;&gt;&#xA;        &lt;img class=&#34;wide-showcase-img&#34; src=&#34;https://www.richyhbm.co.uk/img/games/CSR_Racing.jpg&#34; alt=&#34;CSR Racing&#34;&gt;&#xA;    &lt;/picture&gt;&#xA;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Using Github Issues as a Comment System for Static Sites</title>
      <link>https://www.richyhbm.co.uk/posts/2018/using-github-issues-as-comments-for-a-static-site/</link>
      <pubDate>Wed, 07 Mar 2018 00:00:00 +0000</pubDate>
      <guid>https://www.richyhbm.co.uk/posts/2018/using-github-issues-as-comments-for-a-static-site/</guid>
      <description>&lt;p&gt;Static sites are great, they allow you to build a website using nothing but client side tech, and let you host them easily in places like AWS S3, Github/Gitlab pages, or even &lt;a href=&#34;https://www.arduino.cc/en/Tutorial/WebServer&#34;&gt;on an arduino&lt;/a&gt; as they dont require any server side code. However they do have one big downside, user interaction.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kotlin and Docker and Spring, Oh my!</title>
      <link>https://www.richyhbm.co.uk/posts/2018/kotlin-docker-spring-oh-my/</link>
      <pubDate>Sat, 03 Mar 2018 00:00:00 +0000</pubDate>
      <guid>https://www.richyhbm.co.uk/posts/2018/kotlin-docker-spring-oh-my/</guid>
      <description>&lt;p&gt;Kotlin is a programming language developed by Jetbrains in 2011 as a JVM alternative to Java, it gained popularity amongst Android developers and in 2017 Google started officially supporting it as a first class language on Android. Until now I had only used it on Android but with the release of Spring 2.0, and the official support of Kotlin, I thought now would be a great time to try it out!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Editing Unity Code at Runtime</title>
      <link>https://www.richyhbm.co.uk/posts/2017/editing-unity-code-at-runtime/</link>
      <pubDate>Sun, 09 Jul 2017 00:00:00 +0000</pubDate>
      <guid>https://www.richyhbm.co.uk/posts/2017/editing-unity-code-at-runtime/</guid>
      <description>&lt;p&gt;In 2014 Double Fine released a game by the name of Hack &amp;rsquo;n&amp;rsquo; Slash, the premise being that you could access the code running the game and modify it to change how the game works, it was a really cool premise though maybe not that interestingly implemented. The way it worked was by using a scripting language to run the logic of the game actors and thus allowing you to modify their code.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Calling Native Code From JVM vs Go</title>
      <link>https://www.richyhbm.co.uk/posts/2017/calling-native-code-from-jvm-vs-go/</link>
      <pubDate>Sat, 06 May 2017 00:00:00 +0000</pubDate>
      <guid>https://www.richyhbm.co.uk/posts/2017/calling-native-code-from-jvm-vs-go/</guid>
      <description>&lt;p&gt;I have been building a couple of prototypes recently and came accross the need to use native code in one of them, specifically on the backend. After debating which tech I should try out for this, I decided to give it a test and figure out if the performance differences could sway my vote between my usual go-to languages, Scala and GoLang.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Setting up Continuous Integration with Jenkins</title>
      <link>https://www.richyhbm.co.uk/posts/2017/ci-with-jenkins/</link>
      <pubDate>Mon, 01 May 2017 00:00:00 +0000</pubDate>
      <guid>https://www.richyhbm.co.uk/posts/2017/ci-with-jenkins/</guid>
      <description>&lt;p&gt;Recently I had to convert a manual jenkins build job into an automated job that will trigger each time a push gets made to the SCM server. For SCM I use git with the help of a git management tool called gitolite which allows you to setup and configure your git management from within a git repository, talk about meta.&lt;/p&gt;</description>
    </item>
    <item>
      <title>My Take on CMake</title>
      <link>https://www.richyhbm.co.uk/posts/2017/my-take-on-cmake/</link>
      <pubDate>Wed, 15 Mar 2017 00:00:00 +0000</pubDate>
      <guid>https://www.richyhbm.co.uk/posts/2017/my-take-on-cmake/</guid>
      <description>&lt;p&gt;As of recently I have been picking up C++ again, and having used Premake in the past, I thought it would be a great time to try out a new build management tool. I chose CMake as it seems the more mature of the build management tools as well as having a large adoption rate meaning a lot, if not most, 3rd party libraries have CMake configs readily available.&lt;/p&gt;</description>
    </item>
    <item>
      <title>&#39;Method Overloading&#39; in Go</title>
      <link>https://www.richyhbm.co.uk/posts/2017/method-overloading-in-go/</link>
      <pubDate>Fri, 20 Jan 2017 00:00:00 +0000</pubDate>
      <guid>https://www.richyhbm.co.uk/posts/2017/method-overloading-in-go/</guid>
      <description>&lt;p&gt;GoLang is an interesting language in that it is an imperative language by all accounts, yet because of how it is build and handles composition, it essentially allows you to write Object-Oriented code with very little difference to how you would in say C++.&lt;/p&gt;</description>
    </item>
    <item>
      <title>From One to a Million - What is it to be Scalable?</title>
      <link>https://www.richyhbm.co.uk/posts/2017/from-one-to-a-million/</link>
      <pubDate>Tue, 17 Jan 2017 00:00:00 +0000</pubDate>
      <guid>https://www.richyhbm.co.uk/posts/2017/from-one-to-a-million/</guid>
      <description>&lt;p&gt;The term scalability often gets thrown about when creating online services. Most people just assume it means having the ability to add additional servers on demand, and to an extent that is mostly what it is, but of course if you are in a situation in which you have the need to add more servers all you are doing is moving the bottleneck further up the line.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building a Standalone Scala Executable</title>
      <link>https://www.richyhbm.co.uk/posts/2016/scala-standalone-executable/</link>
      <pubDate>Thu, 05 May 2016 00:00:00 +0000</pubDate>
      <guid>https://www.richyhbm.co.uk/posts/2016/scala-standalone-executable/</guid>
      <description>&lt;p&gt;A while back whilst researching languages for a new set of tools, it became apparent that ease of deployment was a definite benefit. On one hand there was Go which can be compiled to a single native binary, on the other there was Scala a language I personally preferred due to its compatibility with Java libraries and tools, as well as it forcing me to learn functional programming, but that has a lot of dependencies in the form of the JVM.&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://www.richyhbm.co.uk/resume/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.richyhbm.co.uk/resume/</guid>
      <description></description>
    </item>
    <item>
      <title>Protected content</title>
      <link>https://www.richyhbm.co.uk/staticrypt/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.richyhbm.co.uk/staticrypt/</guid>
      <description>&lt;h1 id=&#34;protected-content&#34;&gt;Protected content!&lt;/h1&gt;&#xA;&lt;form id=&#34;staticrypt-form&#34; action=&#34;#&#34; method=&#34;post&#34;&gt;&#xA;    &lt;input id=&#34;staticrypt-password&#34;&#xA;        type=&#34;password&#34;&#xA;        name=&#34;password&#34;&#xA;        placeholder=&#34;{passphrase_placeholder}&#34;&#xA;        autofocus/&gt;&#xA;    &lt;label id=&#34;staticrypt-remember-label&#34; class=&#34;staticrypt-remember hidden&#34;&gt;&#xA;        &lt;input id=&#34;staticrypt-remember&#34;&#xA;            type=&#34;checkbox&#34;&#xA;            name=&#34;remember&#34;/&gt;&#xA;        {remember_me}&#xA;    &lt;/label&gt;&#xA;    &lt;input type=&#34;submit&#34; class=&#34;staticrypt-decrypt-button&#34; value=&#34;{decrypt_button}&#34;/&gt;&#xA;&lt;/form&gt;&#xA;&lt;p&gt;{crypto_tag}&lt;/p&gt;&#xA;&lt;script&gt;&#xA;    // variables to be filled when generating the file&#xA;    var encryptedMsg = &#39;{encrypted}&#39;,&#xA;        salt = &#39;{salt}&#39;,&#xA;        isRememberEnabled = {is_remember_enabled},&#xA;        rememberDurationInDays = {remember_duration_in_days}; // 0 means forever&#xA;&#xA;    // constants&#xA;    var rememberPassphraseKey = &#39;staticrypt_passphrase&#39;,&#xA;        rememberExpirationKey = &#39;staticrypt_expiration&#39;;&#xA;&#xA;    /**&#xA;     * Decrypt a salted msg using a password.&#xA;     * Inspired by https://github.com/adonespitogo&#xA;     *&#xA;     * @param {string} encryptedMsg&#xA;     * @param {string} hashedPassphrase&#xA;     * @returns {string}&#xA;     */&#xA;    function decryptMsg(encryptedMsg, hashedPassphrase) {&#xA;        var iv = CryptoJS.enc.Hex.parse(encryptedMsg.substr(0, 32))&#xA;        var encrypted = encryptedMsg.substring(32);&#xA;&#xA;        return CryptoJS.AES.decrypt(encrypted, hashedPassphrase, {&#xA;            iv: iv,&#xA;            padding: CryptoJS.pad.Pkcs7,&#xA;            mode: CryptoJS.mode.CBC&#xA;        }).toString(CryptoJS.enc.Utf8);&#xA;    }&#xA;&#xA;    /**&#xA;     * Decrypt our encrypted page, replace the whole HTML.&#xA;     *&#xA;     * @param {string} hashedPassphrase&#xA;     * @returns {boolean}&#xA;     */&#xA;    function decryptAndReplaceHtml(hashedPassphrase) {&#xA;        var encryptedHMAC = encryptedMsg.substring(0, 64),&#xA;            encryptedHTML = encryptedMsg.substring(64),&#xA;            decryptedHMAC = CryptoJS.HmacSHA256(encryptedHTML, CryptoJS.SHA256(hashedPassphrase).toString()).toString();&#xA;&#xA;        if (decryptedHMAC !== encryptedHMAC) {&#xA;            return false;&#xA;        }&#xA;&#xA;        var plainHTML = decryptMsg(encryptedHTML, hashedPassphrase);&#xA;&#xA;        document.write(plainHTML);&#xA;        document.close();&#xA;&#xA;        return true;&#xA;    }&#xA;&#xA;    /**&#xA;     * Salt and hash the passphrase so it can be stored in localStorage without opening a password reuse vulnerability.&#xA;     *&#xA;     * @param {string} passphrase&#xA;     * @returns {string}&#xA;     */&#xA;    function hashPassphrase(passphrase) {&#xA;        return CryptoJS.PBKDF2(passphrase, salt, {&#xA;            keySize: 256 / 32,&#xA;            iterations: 1000&#xA;        }).toString();&#xA;    }&#xA;&#xA;    /**&#xA;     * Clear localstorage from staticrypt related values&#xA;     */&#xA;    function clearLocalStorage() {&#xA;        localStorage.removeItem(rememberPassphraseKey);&#xA;        localStorage.removeItem(rememberExpirationKey);&#xA;    }&#xA;&#xA;    // try to automatically decrypt on load if there is a saved password&#xA;    window.onload = function () {&#xA;        if (isRememberEnabled) {&#xA;            // show the remember me checkbox&#xA;            document.getElementById(&#39;staticrypt-remember-label&#39;).classList.remove(&#39;hidden&#39;);&#xA;&#xA;            // if we are login out, clear the storage and terminate&#xA;            var queryParams = new URLSearchParams(window.location.search);&#xA;&#xA;            if (queryParams.has(&#34;staticrypt_logout&#34;)) {&#xA;                return clearLocalStorage();&#xA;            }&#xA;&#xA;            // if there is expiration configured, check if we&#39;re not beyond the expiration&#xA;            if (rememberDurationInDays &amp;&amp; rememberDurationInDays &gt; 0) {&#xA;                var expiration = localStorage.getItem(rememberExpirationKey),&#xA;                    isExpired = expiration &amp;&amp; new Date().getTime() &gt; parseInt(expiration);&#xA;&#xA;                if (isExpired) {&#xA;                    return clearLocalStorage();&#xA;                }&#xA;            }&#xA;&#xA;            var hashedPassphrase = localStorage.getItem(rememberPassphraseKey);&#xA;&#xA;            if (hashedPassphrase) {&#xA;                // try to decrypt&#xA;                var isDecryptionSuccessful = decryptAndReplaceHtml(hashedPassphrase);&#xA;&#xA;                // if the decryption is unsuccessful the password might be wrong - silently clear the saved data and let&#xA;                // the user fill the password form again&#xA;                if (!isDecryptionSuccessful) {&#xA;                    return clearLocalStorage();&#xA;                }&#xA;            }&#xA;        }&#xA;    }&#xA;&#xA;    // handle password form submission&#xA;    document.getElementById(&#39;staticrypt-form&#39;).addEventListener(&#39;submit&#39;, function (e) {&#xA;        e.preventDefault();&#xA;&#xA;        var passphrase = document.getElementById(&#39;staticrypt-password&#39;).value,&#xA;            shouldRememberPassphrase = document.getElementById(&#39;staticrypt-remember&#39;).checked;&#xA;&#xA;        // decrypt and replace the whole page&#xA;        var hashedPassphrase = hashPassphrase(passphrase);&#xA;        var isDecryptionSuccessful = decryptAndReplaceHtml(hashedPassphrase);&#xA;&#xA;        if (isDecryptionSuccessful) {&#xA;            // remember the hashedPassphrase and set its expiration if necessary&#xA;            if (isRememberEnabled &amp;&amp; shouldRememberPassphrase) {&#xA;                window.localStorage.setItem(rememberPassphraseKey, hashedPassphrase);&#xA;&#xA;                // set the expiration if the duration isn&#39;t 0 (meaning no expiration)&#xA;                if (rememberDurationInDays &gt; 0) {&#xA;                    window.localStorage.setItem(&#xA;                        rememberExpirationKey,&#xA;                        (new Date().getTime() + rememberDurationInDays * 24 * 60 * 60 * 1000).toString()&#xA;                    );&#xA;                }&#xA;            }&#xA;        } else {&#xA;            alert(&#39;Bad passphrase!&#39;);&#xA;        }&#xA;        return false;&#xA;    });&#xA;&lt;/script&gt;</description>
    </item>
  </channel>
</rss>
