<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Paul&#x27;s Site of Stuff</title>
    <link rel="self" type="application/atom+xml" href="https://paulwilde.uk/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://paulwilde.uk"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-01-16T15:57:13+00:00</updated>
    <id>https://paulwilde.uk/atom.xml</id>
    <entry xml:lang="en">
        <title>What&#x27;s the Deal with Calendar Categories?</title>
        <published>2026-01-16T15:57:13+00:00</published>
        <updated>2026-01-16T15:57:13+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/whats-the-deal-with-calendar-categories/"/>
        <id>https://paulwilde.uk/ponderings/whats-the-deal-with-calendar-categories/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/whats-the-deal-with-calendar-categories/">&lt;p&gt;What&#x27;s the deal with Calendar Categories?&lt;br &#x2F;&gt;
Why do all services and applications seem to handle them differently?&lt;br &#x2F;&gt;
This is a general vent of me, working through all these things and trying to find a reasonable solution!&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;situation&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#situation&quot; aria-label=&quot;Anchor link for: situation&quot;&gt;Situation&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;A bit of set up: I run my own B2B IT business. It&#x27;s a small business, with just me as a full-time employee, but I have a business administrator (who just so happens to be my amazing wife) who handles some of the more admin-heavy workload i.e. Invoicing, general organisation, and some business communications.&lt;&#x2F;p&gt;
&lt;p&gt;Since the start of business operations back in 2015 (it&#x27;s been nearly 11 years?! WOW) we&#x27;ve always been Open Source First, but due to the requirements of reliable email deliverability we [reluctantly] have been using Microsoft 365 as our primary Email and Calendar service.&lt;&#x2F;p&gt;
&lt;p&gt;Naturally, recent events with the dawn of &quot;AI&quot; and Microsoft&#x27;s Copilot being shoehorned into absolutely everything that Microsoft have their hands on, we&#x27;ve made the very exciting decision to remove Microsoft 365 products from our business (Yay!).&lt;&#x2F;p&gt;
&lt;p&gt;The story of moving to another provider is one for another time, but suffice to say we are in the process of moving to a Open Source platform that utilises CalDAV for calendars.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;calendar-categories&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#calendar-categories&quot; aria-label=&quot;Anchor link for: calendar-categories&quot;&gt;Calendar Categories&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;We use categories to highlight different workloads... (well, my lovely administrator wife does anyway)...  and previously, this was managed in Outlook (I&#x27;d like to make it clear I do not use Outlook myself).&lt;br &#x2F;&gt;
For those that don&#x27;t know, Outlook displays categorised calendar events by changing the colour of the entire event block in the calendar display, instead of placing a coloured strip&#x2F;dot&#x2F;line onto or alongside the event block like other products do.&lt;br &#x2F;&gt;
And, of course Outlook does not work with CalDAV calendars so it&#x27;s out. Fine, brilliant in fact. We&#x27;ll use one of the birds (Thunder or Better).&lt;&#x2F;p&gt;
&lt;p&gt;&quot;No big deal, right? It just looks diffent.&quot;&lt;br &#x2F;&gt;
Sure, and we can use &lt;code&gt;userChrome.css&lt;&#x2F;code&gt; to make Thunderbird or Betterbird fill in the entire calendar entry with the category colour.&lt;&#x2F;p&gt;
&lt;p&gt;Anyway, it got me thinking...&lt;&#x2F;p&gt;
&lt;h3 id=&quot;how-do-other-people-actually-use-categories-in-their-calendars&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#how-do-other-people-actually-use-categories-in-their-calendars&quot; aria-label=&quot;Anchor link for: how-do-other-people-actually-use-categories-in-their-calendars&quot;&gt;How do other people actually use categories in their calendars?&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;You only need to look up a screenshot of any calendar application and you will see pictures of calendars with multiple coloured events spotted all over it, but, trust me, I&#x27;ve tried A LOT of these apps, and none of them get the colours from the categories. In most cases, the colours from the colour the calendar itself is set to.&lt;&#x2F;p&gt;
&lt;p&gt;So...&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Are people using different calendars for different types of event?!&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;In which case...&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;What&#x27;s the point in the categories?! Are categories just relegated to a life of being a barely visible line or dot on an event?&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;They&#x27;re serious questions - I&#x27;d love answers! Please, let me know. Honestly.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;android&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#android&quot; aria-label=&quot;Anchor link for: android&quot;&gt;Android&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Thunderbird&#x2F;Betterbird works well enough for our use on PCs, and that&#x27;s fine, but don&#x27;t even get me started on Android calendars... I have not found any (except Outlook, but no CalDAV in Outlook) that can colour an event based on its category. Some allow you to colour a specific event a different colour, but this isn&#x27;t category based, it&#x27;s single-event only.&lt;br &#x2F;&gt;
I&#x27;ve not even seen a category field in an Android Calendar event, even though I know it&#x27;s synchronised with &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.davx5.com&#x2F;&quot;&gt;DAVx⁵&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;questions&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#questions&quot; aria-label=&quot;Anchor link for: questions&quot;&gt;Questions&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;So, to offer this up to the world for responses to help me understand and plan a reasonable replacement system:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;How do you set up and manage your calendars where multiple colours for different event types are required? Categories or different calendars?&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Please add comments to &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;notnull.space&#x2F;@paul&#x2F;statuses&#x2F;01KF3VTM60GR1E0Y14RA2F0DEN&quot;&gt;this post on the Fediverse&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Thanks,&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Don&#x27;t Connect Contact Forms to Email Accounts!</title>
        <published>2025-09-19T14:40:00+00:00</published>
        <updated>2025-09-19T14:40:00+00:00</updated>
        
        <author>
          <name>
            Paul Wilde
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/website-contact-forms-email-accounts/"/>
        <id>https://paulwilde.uk/ponderings/website-contact-forms-email-accounts/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/website-contact-forms-email-accounts/">&lt;p&gt;Often, when I&#x27;m consulting with a client and a third-party service provider, I may have the need to bring up a security concern which should be considered, or eliminated, surrounding what the third-party service provider aims to implement. This can be met with a defense of &quot;We have always done it this way and not had a problem yet.&quot; which drives me insane!&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h3 id=&quot;example&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#example&quot; aria-label=&quot;Anchor link for: example&quot;&gt;Example&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;This particular example is one I have fought a LOT over the last couple of decades but for some reason I&#x27;m still having to fight it - Contact Forms on Websites.&lt;br &#x2F;&gt;
I&#x27;m a System Administrator (&quot;SysAdmin&quot;), and even though I do a little website work here and there I am not a web designer nor developer. However, I do deal with web servers, email servers, networks and all devices and security in between, so when I&#x27;m asked by a third-party web company to set up an email account and provide them the credentials for it to handle the emails sent from a contact form on a website I get very, VERY, angry.&lt;&#x2F;p&gt;
&lt;p&gt;I may get an email like the this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Hello,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Could you please set up the email account `submissions@$(client_domain_name)` and send us the SMTP username and password so the contact form on the website can send emails to $(client) please?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Thanks,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Looks fairly harmless. Right?&lt;br &#x2F;&gt;
Wrong.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;why-is-this-bad&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#why-is-this-bad&quot; aria-label=&quot;Anchor link for: why-is-this-bad&quot;&gt;Why is this bad?&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;Why do we want to use an internal email address to send emails from an external service (the website) to internal staff members... Why!? Why does it need to be an internal address?&lt;&#x2F;li&gt;
&lt;li&gt;If, for some reason, we do want the email to go to the public then I appreciate it would be good to come from the business address but... why is the website doing this?&lt;&#x2F;li&gt;
&lt;li&gt;Why are we giving a web server - possibly the most front-facing and vulnerable server a business can have - knowledge of sensitive business credentials.&lt;&#x2F;li&gt;
&lt;li&gt;Basic SMTP authentication is mostly considered insecure in general these days. Large email operators such as Google and Microsoft have, or are, removing it as an option because of this.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h4 id=&quot;what-do-we-do&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-do-we-do&quot; aria-label=&quot;Anchor link for: what-do-we-do&quot;&gt;What do we do?&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;To tackle point &lt;em&gt;[1.]&lt;&#x2F;em&gt; above, as a website operator you could set up a reasonable email service, or use a paid service, which you can configure to use SMTP as you desire. Just send the emails from a domain you set up appropriately (SPF, DKIM, DMARC, etc.) to the client, like &quot;$(clientname)-website@contactforms.ourwebcompany.com&quot;. Assuming you&#x27;ve set email security up appropriately, the emails will be delivered to the client successfully and deal with as you need.&lt;&#x2F;p&gt;
&lt;p&gt;Tackling point &lt;em&gt;[2.]&lt;&#x2F;em&gt;, if we want to send the contact form to the business and send a confirmation of receipt to the customer, this is not a job for the web server. The web server has zero knowledge of if the email to the business arrived, so sending a &quot;Thanks for your email, we have it&quot; email to the customer at this point is stupid. This whole concept is a task for a CRM system - it receives the email, logs it into the appropriate queue, then confirms to the customer itself that it has been received.&lt;&#x2F;p&gt;
&lt;p&gt;Point &lt;em&gt;[3.]&lt;&#x2F;em&gt;: Please, please, please don&#x27;t put sensitive business credentials on your front-facing web server. If that server is compromised you&#x27;ve just given the attacker access to that email account (and potentially access to internal systems too). With that email account an attacker can send spam messages, or worse, to whomever they want and because they&#x27;re authenticated, the emails are coming from a legitimate server, as your brand. Just don&#x27;t do it. that&#x27;s how you solve this one.&lt;&#x2F;p&gt;
&lt;p&gt;Point &lt;em&gt;[4.]&lt;&#x2F;em&gt;: If the email service doesn&#x27;t support it, then you can&#x27;t do it anyway. In my most recent experience of this the web company involved said they had 350 clients set up with SMTP authentication and it&#x27;s normally easy. Which may well be true - but Microsoft are removing support for SMTP by April 2026 as far as I understand. Imagine if those 350 clients all used 365 and in April suddenly all their contact forms stopped working. Bit of an issue, right? Fix it now, problem solved.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;other-options&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#other-options&quot; aria-label=&quot;Anchor link for: other-options&quot;&gt;Other Options&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Personally, I have no idea why businesses are so adament they want their contact forms to arrive via email. It&#x27;s silly. Website services don&#x27;t help as they just say &quot;what email account do you want this form to go to?&quot; and be done with it. Typically a web site platform (such as WordPress) when sending these emails just uses an SMTP tool to fire the email off and have nothing else to do with it, it&#x27;s gone. So how do we ensure an email has been received? Who wants to trawel back though their mailbox to find previous contact forms? Nobody, that&#x27;s who.&lt;&#x2F;p&gt;
&lt;p&gt;A form on a website is not linked to email, it just sends data to an endpoint which itself can handle the data as it is built to do so. This could be an email, sure, but also it could save a file, or send an API request to a service. Or to put it a simpler way:&lt;&#x2F;p&gt;
&lt;p&gt;WE DO NOT NEED TO CONNECT CONTACT FORMS TO EMAIL ACCOUNTS!!!&lt;&#x2F;p&gt;
&lt;p&gt;With this tiny bit of knowledge comes great power. We can make our contact form interface directly with another system i.e. a basic form handling service or CRM system. I&#x27;ll leave the use of a CRM system as an exercise for those that need it, but a form handling service is a great option for those who just need contact forms.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;form-handling-solutions&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#form-handling-solutions&quot; aria-label=&quot;Anchor link for: form-handling-solutions&quot;&gt;Form Handling Solutions&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I try not to make recommendations so I&#x27;m not going to link right here but two options I have used in the past are Formspree ([dot]io) and Basin (usebasin[dot]com).&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m sure there&#x27;s some open source and self-hostable solutions too - if you know of one, let me know and I&#x27;ll list them here! (Ability to adequately secure self-run email services required - why don&#x27;t you &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.tiltedwindmillpress.com&#x2F;product&#x2F;ryoms&#x2F;&quot;&gt;Run Your Own Mail Server&lt;&#x2F;a&gt;?)&lt;&#x2F;p&gt;
&lt;p&gt;A brief overview is with these services you just change the &lt;code&gt;action&lt;&#x2F;code&gt; url in your form to a &quot;Form Endpoint&quot; url they will provide to you and you&#x27;re done! Your contact form, when submitted, simply sends the data to this endpoint where it is stored (for 30 days on the free tier) and it notifies you of the submission receipt.&lt;&#x2F;p&gt;
&lt;p&gt;No messing around setting up email accounts and securing them appropriately, just plumb that url in and that&#x27;s it.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;minor-issues&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#minor-issues&quot; aria-label=&quot;Anchor link for: minor-issues&quot;&gt;Minor issues&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;The only potential issue with these services is with the free tiers they just accept forms from anywhere, so a submission to it doesn&#x27;t have to come from your website. If somebody knows the endpoint url, they can submit to it.&lt;br &#x2F;&gt;
To counter this you would need to use the paid tier and middleware to accept the form submission then authenticate and send the form to the handling service.&lt;br &#x2F;&gt;
Regardless, I think the payoff of not risking your entire business email service is worth it, so this problem is minimal.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;wrap-up&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#wrap-up&quot; aria-label=&quot;Anchor link for: wrap-up&quot;&gt;Wrap Up&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;So that&#x27;s my rant about contact forms on websites. A problem that still exists in 2025 even though numerous options are available to eliminate it completely.&lt;br &#x2F;&gt;
Far be it from me to compliment Microsoft, but I am very much looking forward to April 2026 when I suspect quite a large chunk of contact forms are just going to stop working. I bet I&#x27;ll get some panicked calls, and I&#x27;ll be happily wearing my &quot;I told you so&quot; hat.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>XMPP &lt;-&gt; WhatsApp with eJabberD and Slidge</title>
        <published>2025-06-16T13:00:00+00:00</published>
        <updated>2025-06-16T13:00:00+00:00</updated>
        
        <author>
          <name>
            Paul Wilde
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/integrating-xmpp-with-wa/"/>
        <id>https://paulwilde.uk/ponderings/integrating-xmpp-with-wa/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/integrating-xmpp-with-wa/">&lt;p&gt;How I learned to stop worrying and love WhatsApp... not really. This is how I&#x27;ve set up my own XMPP service to be able to talk to WhatsApp using the
&lt;code&gt;slidge-whatsapp&lt;&#x2F;code&gt; transport module.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h3 id=&quot;whatsapp-pain&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#whatsapp-pain&quot; aria-label=&quot;Anchor link for: whatsapp-pain&quot;&gt;WhatsApp Pain&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I wish I didn&#x27;t have to use WhatsApp, I really do, I wish people would switch to
more freedom giving services.&lt;br &#x2F;&gt;
But that isn&#x27;t the case... &quot;everyone uses WhatsApp&quot;, so, long story short,
if I want to stay in touch with people, I need some way of communicating with
WhatsApp, at least for now.&lt;&#x2F;p&gt;
&lt;p&gt;Luckily, there are ways...&lt;&#x2F;p&gt;
&lt;h3 id=&quot;history&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#history&quot; aria-label=&quot;Anchor link for: history&quot;&gt;History&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;For a long time I&#x27;ve had a Matrix (&lt;code&gt;synapse&lt;&#x2F;code&gt;) server that it set up to use
the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mautrix&#x2F;whatsapp&quot;&gt;&lt;code&gt;mautrix-whatsApp&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; bridge.
This has worked well for many years, and I don&#x27;t really have any complaints
with it specifically. However, Matrix are making some...
&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;matrix.org&#x2F;blog&#x2F;2025&#x2F;06&#x2F;funding-homeserver-premium&#x2F;&quot;&gt;questionable choices&lt;&#x2F;a&gt;,
and honestly, I only use Matrix for the WhatsApp bridge -
running an entire server just for this purpose feels a little... wasteful.&lt;&#x2F;p&gt;
&lt;p&gt;However, I do also run my own XMPP service, and I use this service for
communicating with a handful of people. So, if I could get a WhatsApp &quot;bridge&quot;
working with XMPP, I will have one app to communicate with almost everyone I know!&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hosting-an-xmpp-server&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#hosting-an-xmpp-server&quot; aria-label=&quot;Anchor link for: hosting-an-xmpp-server&quot;&gt;Hosting an XMPP server&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I run my own &lt;code&gt;ejabberd&lt;&#x2F;code&gt; server, and I&#x27;ll have another article about how I do this at
some point. But for the purposes of this article the choice of XMPP service is not
massively important. The WhatsApp transport module is known to work with
both &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;prosody.im&quot;&gt;Prosody&lt;&#x2F;a&gt; and &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;ejabberd.im&quot;&gt;eJabberD&lt;&#x2F;a&gt;, so chosing one of those will be best.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;installing-a-whatsapp-transport-module&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#installing-a-whatsapp-transport-module&quot; aria-label=&quot;Anchor link for: installing-a-whatsapp-transport-module&quot;&gt;Installing a WhatsApp Transport Module&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;There&#x27;s a handful of WhatsApp transport modules available for XMPP, but some have
seen little maintenance over the last few years. One that still appears to be in
active development is &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;slidge.im&#x2F;docs&#x2F;slidge-whatsapp&#x2F;&quot;&gt;slidge-whatsapp&lt;&#x2F;a&gt;,
part of a suite of modules based upon the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;slidge.im&quot;&gt;slidge gateway library&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Typically, we should just need to install &lt;code&gt;slidge-whatapp&lt;&#x2F;code&gt; via the command&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;pipx install slidge-whatsapp&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;However, at the time of writing, this does not build on FreeBSD.&lt;&#x2F;p&gt;
&lt;p&gt;If you&#x27;re using Linux, or have otherwise managed to install &lt;code&gt;slidge-whatsapp&lt;&#x2F;code&gt;
with &lt;code&gt;pipx&lt;&#x2F;code&gt;, then you can probably skip on to &lt;a href=&quot;https:&#x2F;&#x2F;paulwilde.uk&#x2F;ponderings&#x2F;integrating-xmpp-with-wa&#x2F;#finally-configuration&quot;&gt;the Configuration&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h4 id=&quot;first-error-puccinialin&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#first-error-puccinialin&quot; aria-label=&quot;Anchor link for: first-error-puccinialin&quot;&gt;First Error - puccinialin&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;We&#x27;ll first be given the error:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; pipx install slidge-whatsapp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;Fatal&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; error from pip prevented installation. Full pip output in file:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;    &#x2F;path&#x2F;to&#x2F;pipx&#x2F;logs&#x2F;cmd_2025-06-16_10.02.59_pip_errors.log&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;pip&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; seemed to fail to build package:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;    slixmpp&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;2,&amp;gt;=1.10.0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;Some&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; possibly relevant errors from pip install:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;    error:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; subprocess-exited-with-error&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;    ModuleNotFoundError:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; No module named&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;puccinialin&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You may think installing &lt;code&gt;puccinialin&lt;&#x2F;code&gt; will solve this, but unfortunately it&#x27;s
not really that causing the issue. Puccinialin is a Rust bootstrapper, so the problem is we don&#x27;t have &lt;code&gt;rust&lt;&#x2F;code&gt; installed. We do a &lt;code&gt;pkg install rust&lt;&#x2F;code&gt; and try again.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;second-error-go&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#second-error-go&quot; aria-label=&quot;Anchor link for: second-error-go&quot;&gt;Second Error - Go&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;We also have some GoLang dependencies, so if &lt;code&gt;go&lt;&#x2F;code&gt; isn&#x27;t installed we&#x27;ll hit this error:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; pipx install slidge-whatsapp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;pip&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; failed to build package:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;    slidge-whatsapp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;Some&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; possibly relevant errors from pip install:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;    error:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; subprocess-exited-with-error&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;    RuntimeError:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; Cannot find the go executable in&lt;&#x2F;span&gt;&lt;span&gt; $PATH&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;. Make you sure install golang, via your package manager or https:&#x2F;&#x2F;go.dev&#x2F;dl&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;    subprocess.CalledProcessError:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; Command&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;&#x2F;root&#x2F;.local&#x2F;pipx&#x2F;venvs&#x2F;slidge-whatsapp&#x2F;bin&#x2F;python&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;build.py&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; returned non-zero exit status 1.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;    ERROR:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; Failed to build installable wheels for some pyproject.toml based projects&lt;&#x2F;span&gt;&lt;span&gt; (slidge-whatsapp)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We &lt;code&gt;pkg install go&lt;&#x2F;code&gt; and carry on...&lt;&#x2F;p&gt;
&lt;h4 id=&quot;third-error-gopy-fails-to-build&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#third-error-gopy-fails-to-build&quot; aria-label=&quot;Anchor link for: third-error-gopy-fails-to-build&quot;&gt;Third Error - GoPy fails to build&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;div class=&quot;notice blue&quot;&gt;
&lt;p&gt;The pull request mentioned below has now been accepted, meaning you can probably
now just run &lt;code&gt;pipx install slidge-whatsapp&lt;&#x2F;code&gt; and move on to &lt;a href=&quot;&#x2F;ponderings&#x2F;integrating-xmpp-with-wa&#x2F;#running-slidge-whatapp&quot;&gt;Running Slidge-WhatsApp&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
`slidge-whatsapp` has a dependency on go-python&#x27;s gopy module. At the time of writing, 
gopy will not build on FreeBSD, so `pipx install slidge-whatsapp` will fail.  
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; pipx install slidge-whatsapp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;pip&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; failed to build package:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;    slidge-whatsapp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;Some&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; possibly relevant errors from pip install:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;    error:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; subprocess-exited-with-error&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;    subprocess.CalledProcessError:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; Command&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;go&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;install&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;github.com&#x2F;go-python&#x2F;gopy@master&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; returned non-zero exit status 1.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;    subprocess.CalledProcessError:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; Command&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;&#x2F;root&#x2F;.local&#x2F;pipx&#x2F;venvs&#x2F;slidge-whatsapp&#x2F;bin&#x2F;python&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;build.py&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; returned non-zero exit status 1.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;    ERROR:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; Failed to build installable wheels for some pyproject.toml based projects&lt;&#x2F;span&gt;&lt;span&gt; (slidge-whatsapp)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;However, the reason it doesn&#x27;t build is quite simple - there&#x27;s no defined process
for in GoPy&#x27;s &lt;code&gt;main*.go&lt;&#x2F;code&gt; files for FreeBSD that sets some basic variables up.&lt;br &#x2F;&gt;
We can fix this by editing one file in the &lt;code&gt;gopy&lt;&#x2F;code&gt; repo, then build and install it
manually.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; git clone https:&#x2F;&#x2F;github.com&#x2F;go-python&#x2F;gopy&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; cd gopy&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Find and edit 2 lines in &lt;code&gt;.&#x2F;main_unix.go&lt;&#x2F;code&gt; so they change from this&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;go&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;&#x2F;&#x2F;go:build (linux &amp;amp;&amp;amp; !android) || dragonfly || openbsd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;&#x2F;&#x2F; +build linux,!android dragonfly openbsd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;to this&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;go&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;&#x2F;&#x2F;go:build (linux &amp;amp;&amp;amp; !android) || dragonfly || openbsd || freebsd &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;&#x2F;&#x2F; +build linux,!android dragonfly openbsd freebsd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;notice yellow&quot;&gt;
&lt;p&gt;I have made a &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;go-python&#x2F;gopy&#x2F;pull&#x2F;374&quot;&gt;pull request&lt;&#x2F;a&gt; on the &lt;code&gt;gopy&lt;&#x2F;code&gt; repo which will change this upstream.
In time, this step should no longer be necessary.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;You can then build and install gopy with the following command (you will of course need the go language installed too)&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; go install .&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h4 id=&quot;installing-slidge-whatsapp-from-source&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#installing-slidge-whatsapp-from-source&quot; aria-label=&quot;Anchor link for: installing-slidge-whatsapp-from-source&quot;&gt;Installing Slidge-WhatsApp from Source&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;We now have gopy installed as a go library, but we cannot use &lt;code&gt;pipx&lt;&#x2F;code&gt; any more as
the &lt;code&gt;slidge-whatsapp&lt;&#x2F;code&gt; build script has a hard link to install gopy from their repo,
and does not look at our local version.&lt;br &#x2F;&gt;
Another simple fix, we clone the &lt;code&gt;slidge-whatsapp&lt;&#x2F;code&gt; repo, make a change to the
build script, and build it locally.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; git clone https:&#x2F;&#x2F;codeberg.org&#x2F;slidge&#x2F;slidge-whatsapp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; cd slidge-whatsapp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In &lt;code&gt;.&#x2F;build.py&lt;&#x2F;code&gt;, find this line:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;subprocess&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;([&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;go&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;install&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;github.com&#x2F;go-python&#x2F;gopy@master&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;],&lt;&#x2F;span&gt;&lt;span&gt; check&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=True&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;and comment it out so it doesn&#x27;t run.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;#subprocess.run([&amp;quot;go&amp;quot;, &amp;quot;install&amp;quot;, &amp;quot;github.com&#x2F;go-python&#x2F;gopy@master&amp;quot;], check=True)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;notice warning&quot;&gt;
&lt;p&gt;As with the change to &lt;code&gt;gopy&lt;&#x2F;code&gt; previously, this should only be a temporary requirement until
the aforementioned pull request gets accepted.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;h4 id=&quot;running-slidge-whatapp&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#running-slidge-whatapp&quot; aria-label=&quot;Anchor link for: running-slidge-whatapp&quot;&gt;Running Slidge-WhatApp&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;Slidge recommend (if not using docker containers) that &lt;code&gt;slidge-whatsapp&lt;&#x2F;code&gt; builds and runs in
a python &lt;code&gt;venv&lt;&#x2F;code&gt; - which is a very sensible recommendation. There&#x27;s a number of ways of doing this, but using &lt;code&gt;uv&lt;&#x2F;code&gt; is a single command way of doing it.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Install uv&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# As root&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span&gt;# pkg install uv&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Non root&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Try to build slidge-whatsapp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; uv sync --frozen --all-groups --all-extras&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h4 id=&quot;more-errors&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#more-errors&quot; aria-label=&quot;Anchor link for: more-errors&quot;&gt;More Errors...&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;We&#x27;re nearly there! But, &lt;code&gt;uv&lt;&#x2F;code&gt; is failing with some more errors. The error messages
are long, and require a bit of scrolling to find the issue, but you may see
something like this if you look:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;not&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; found&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;          6&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #616E88;&quot;&gt; #include &amp;lt;mupdf&#x2F;fitz.h&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;            |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;          ^~~~~~~~~~~~~~&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;      1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; error generated.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;or&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;      ld:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; error: unable to find library -lgumbo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;      ld:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; error: unable to find library -lmujs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;      clang:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; error: linker command failed with exit code&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt; (use&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -v to see invocation&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;and many others. I&#x27;ve gone through them so you don&#x27;t have to...&lt;&#x2F;p&gt;
&lt;p&gt;We need some dependencies, so let&#x27;s install them.&lt;br &#x2F;&gt;
Also, I&#x27;ve found some souce code has trouble compiling with &lt;code&gt;clang&lt;&#x2F;code&gt;;
there&#x27;s probably a way to solve it but as a shortcut let&#x27;s just install
&lt;code&gt;gcc&lt;&#x2F;code&gt; and build using that, setting the &lt;code&gt;CC&lt;&#x2F;code&gt; envvar when running the &lt;code&gt;uv&lt;&#x2F;code&gt; command.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span&gt;# pkg install gcc gmake mupdf gumbo mujs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; CC=gcc uv sync --frozen --all-groups --all-extras&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h4 id=&quot;built&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#built&quot; aria-label=&quot;Anchor link for: built&quot;&gt;Built!&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;&lt;code&gt;slidge-whatsapp&lt;&#x2F;code&gt; should now be available in &lt;code&gt;$BUILD_DIR&#x2F;.venv&#x2F;bin&#x2F;slidge-whatsapp&lt;&#x2F;code&gt;, ready for use.&lt;br &#x2F;&gt;
A couple of other runtime dependencies will be required though, so let&#x27;s install them now.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span&gt;# pkg install py311-sqlite3 ffmpeg nginx&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;sqlite3&lt;&#x2F;code&gt; for database connectivity, &lt;code&gt;ffmpeg&lt;&#x2F;code&gt; for media handling and &lt;code&gt;nginx&lt;&#x2F;code&gt; for
media publishing.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;finally-configuration&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#finally-configuration&quot; aria-label=&quot;Anchor link for: finally-configuration&quot;&gt;Finally, configuration!&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;slidge.im&quot;&gt;slidge&lt;&#x2F;a&gt; website has some decent documentation, and setting
things up boils down to a handful of steps:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Configure &lt;code&gt;slidge-whatsapp&lt;&#x2F;code&gt; to communicate with &lt;code&gt;eJabberD&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Configure &lt;code&gt;eJabberD&lt;&#x2F;code&gt; to allow &lt;code&gt;slidge-whatsapp&lt;&#x2F;code&gt;, and set privileges.&lt;&#x2F;li&gt;
&lt;li&gt;Set up &lt;code&gt;nginx&lt;&#x2F;code&gt; for publishing the sent media.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h4 id=&quot;configure-slidge-whatsapp&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#configure-slidge-whatsapp&quot; aria-label=&quot;Anchor link for: configure-slidge-whatsapp&quot;&gt;Configure &lt;code&gt;slidge-whatsapp&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;A simple &lt;code&gt;slidge-whatsapp&lt;&#x2F;code&gt; configuration will look like this.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;ini&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# &#x2F;usr&#x2F;local&#x2F;etc&#x2F;slidge-whatsapp.ini&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;server&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;localhost  &lt;&#x2F;span&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# you can use your xmpp address here, but communication &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;                  # is unencrypted so make sure it&amp;#39;s either on the same host,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;                  # or you can encrypt the transmissions between the services&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                  &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;secret&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;v3rYSecur3 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# secret to authenticate the slidge service to ejabberd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;                  # you can just run `openssl rand -base64 32` to get something decent&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;              &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;jid&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;slidge-whatsapp.my.xmpp.host &lt;&#x2F;span&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# should be a subdomain of the ejabberd address&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;no-upload-path&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;var&#x2F;lib&#x2F;slidge&#x2F;attachments &lt;&#x2F;span&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# where media will be stored&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;no-upload-url-prefix&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;https:&#x2F;&#x2F;my.xmpp.host&#x2F;slidge&#x2F; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# the address where an XMPP client&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;                                                  # can find the media&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h4 id=&quot;configure-ejabberd&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#configure-ejabberd&quot; aria-label=&quot;Anchor link for: configure-ejabberd&quot;&gt;Configure &lt;code&gt;eJabberD&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;In the &lt;code&gt;ejabberd&lt;&#x2F;code&gt; configuration, we add a new listener, set up an acl, rules and some module privileges.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# &#x2F;usr&#x2F;local&#x2F;ejabberd&#x2F;ejabber.yml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;#...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;listen&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;  #...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;  -&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;    port&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 5347&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;    module&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ejabberd_service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;    hosts&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;      slidge-whatsapp.my.xmpp.host&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;        password&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; v3rYSecur3&lt;&#x2F;span&gt;&lt;span style=&quot;color: #616E88;&quot;&gt; # Same as the secret in slidge-whatsapp.ini&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;#...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;acl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;  #...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;  slidge_acl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;    server&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span&gt; `&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;slidge-whatsapp.my.xmpp.host`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;#...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;access_rules&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;  #...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;  slidge_rule&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;    allow&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; slidge_acl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;#...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;modules&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;  #...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;  mod_roster&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;    versioning&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;  #...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;  mod_privilege&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;    roster&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;      bost&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; slidge_rule&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;    message&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;      outgoing&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; slidge_rule&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h4 id=&quot;configure-nginx&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#configure-nginx&quot; aria-label=&quot;Anchor link for: configure-nginx&quot;&gt;Configure &lt;code&gt;nginx&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;The reason we need &lt;code&gt;nginx&lt;&#x2F;code&gt; is &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;slidge.im&#x2F;docs&#x2F;slidge&#x2F;main&#x2F;admin&#x2F;attachments.html&quot;&gt;documented here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I will put a basic &lt;code&gt;nginx&lt;&#x2F;code&gt; configuration server block below. If you have many sites
in the same nginx configuration, you should adjust this to your needs.&lt;br &#x2F;&gt;
Please also configure certificates for your site here, you should already have
them available for use with &lt;code&gt;ejabberd&lt;&#x2F;code&gt; anyway.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# &#x2F;usr&#x2F;local&#x2F;etc&#x2F;nginx&#x2F;nginx.conf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    server {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                listen 80;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                root &#x2F;var&#x2F;www&#x2F;html;  # if you already have nginx serving files…&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                # the section below is for slidge&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                location &#x2F;slidge {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                        #  Must be the same value as slidge&amp;#39;s no-upload-path&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                        alias &#x2F;var&#x2F;lib&#x2F;slidge&#x2F;attachments&#x2F;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;           }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;run&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#run&quot; aria-label=&quot;Anchor link for: run&quot;&gt;Run!&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;And there we have it. We can restart &lt;code&gt;ejabberd&lt;&#x2F;code&gt; and run &lt;code&gt;slidge-whatsapp&lt;&#x2F;code&gt; with
command parameter to use the config file:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; slidge-whatsapp -c &#x2F;usr&#x2F;local&#x2F;etc&#x2F;slidge-whatsapp.ini&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You can also use an init script to run this as a daemon. &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;pswilde&#x2F;freebsd_rcd_init_scripts&#x2F;src&#x2F;branch&#x2F;main&#x2F;slidge-whatsapp&quot;&gt;My init script is in my rc.d scripts repo&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;We should then start to &lt;code&gt;ejabberd&lt;&#x2F;code&gt; and &lt;code&gt;slidge-whatsapp&lt;&#x2F;code&gt; communicate with each other in their respective log files.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;connect-clients&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#connect-clients&quot; aria-label=&quot;Anchor link for: connect-clients&quot;&gt;Connect clients&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;All that&#x27;s left is to connect up our XMPP client, and we&#x27;ll be good to go.
The &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;slidge.im&#x2F;docs&#x2F;slidge-whatsapp&#x2F;main&#x2F;user&#x2F;registration.html&quot;&gt;Documentation on Slidge&#x27;s website&lt;&#x2F;a&gt; talks through this, but to summarise, you can either send a
message saying &quot;register&quot; to the &lt;code&gt;slidge-whatsapp.my.xmpp.host&lt;&#x2F;code&gt; account, or
in something like &lt;code&gt;gajim&lt;&#x2F;code&gt;, go to &lt;code&gt;Accounts &amp;gt; $Account &amp;gt; Discover Services&lt;&#x2F;code&gt;,
select &quot;WhatsApp (slidge)&quot; and click &quot;Register&quot;. Then just follow the standard
WhatsApp &quot;Linked Devices&quot; process.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;done&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#done&quot; aria-label=&quot;Anchor link for: done&quot;&gt;Done!&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;And that&#x27;s that. If things aren&#x27;t working, we can just check the output of the &lt;code&gt;slidge-whatsapp&lt;&#x2F;code&gt; command (or the log file if you&#x27;re using &lt;code&gt;daemon&lt;&#x2F;code&gt;) and solve what&#x27;s going wrong.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h3 id=&quot;step-by-step-commands-only&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#step-by-step-commands-only&quot; aria-label=&quot;Anchor link for: step-by-step-commands-only&quot;&gt;Step-by-Step. Commands only&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The whole thing, narrowed down to a handful of commands:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Install Dependencies&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Adjust your python version accordingly - i.e. `py311` may become `py312` in the future.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span&gt;# pkg install rust go gcc gmake git py311-pipx py311-sqlite3 ffmpeg nginx mupdf mujs gumbo uv&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;code&gt;pipx install slidge-whatsapp&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;(No Longer Required) Build &lt;code&gt;gopy&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; git clone https:&#x2F;&#x2F;github.com&#x2F;go-python&#x2F;gopy&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; cd gopy&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; sed -i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;#39;&amp;#39; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;s&#x2F;|| openbsd&#x2F;|| openbsd || freebsd&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; main_unix.go&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; sed -i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;#39;&amp;#39; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;s&#x2F;dragonfly openbsd&#x2F;dragonfly openbsd freebsd&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; main_unix.go&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; go install .&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;(No Longer Required) Build &lt;code&gt;slidge-whatsapp&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; git clone https:&#x2F;&#x2F;codeberg.org&#x2F;slidge&#x2F;slidge-whatsapp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; cd slidge-whatsapp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; grep -v -E&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;subprocess.+gopy&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; build.py&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; build.py.patched&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; cp build.py.patched build.py&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;Run &lt;code&gt;slidge-whatsapp&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# In `slidge-whatsapp` git dir&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; CC=gcc uv sync --frozen --all-groups --all-extras&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;paulwilde.uk&#x2F;ponderings&#x2F;integrating-xmpp-with-wa&#x2F;#configure-slidge-whatsapp&quot;&gt;Configure &lt;code&gt;slidge-whatsapp&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;paulwilde.uk&#x2F;ponderings&#x2F;integrating-xmpp-with-wa&#x2F;#configure-ejabberd&quot;&gt;Configure &lt;code&gt;ejabberd&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;paulwilde.uk&#x2F;ponderings&#x2F;integrating-xmpp-with-wa&#x2F;#configure-nginx&quot;&gt;Configure &lt;code&gt;nginx&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;[Re]Start Services&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;paulwilde.uk&#x2F;ponderings&#x2F;integrating-xmpp-with-wa&#x2F;#connect-clients&quot;&gt;Connect Clients&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Making an Automated, Operational Hydro-Electric Dam in Luanti</title>
        <published>2025-05-13T11:20:00+00:00</published>
        <updated>2025-05-13T11:20:00+00:00</updated>
        
        <author>
          <name>
            Paul Wilde
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/making-an-automated-operational-hydroelectric-dam-in-luanti/"/>
        <id>https://paulwilde.uk/ponderings/making-an-automated-operational-hydroelectric-dam-in-luanti/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/making-an-automated-operational-hydroelectric-dam-in-luanti/">&lt;p&gt;Here are some notes and pictures of how I made a working, automated hydro-electric
dam in &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.luanti.org&#x2F;&quot;&gt;Luanti&lt;&#x2F;a&gt;. The dam gates can be opened and closed manually to generate more
or less power, or, if the power demand becomes too high or too low, the dam will automatically open or close gates to adjust the power accordingly.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;



&lt;img class=&quot;article-img &quot; src=&quot;https:&amp;#x2F;&amp;#x2F;paulwilde.uk&amp;#x2F;processed_images&amp;#x2F;dam_from_sky.ac27869f4d1f207d.webp&quot; alt=&quot;A Dam, shown from the sky. A large lake body site behind it. On the front of the dam there are four outlets, one of these outlets is open and has water coming out of it. The others are closed.&quot; title=&quot;Luanti Dam from the Sky&quot; &#x2F;&gt;
&lt;h3 id=&quot;luanti-mods-in-use&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#luanti-mods-in-use&quot; aria-label=&quot;Anchor link for: luanti-mods-in-use&quot;&gt;Luanti Mods in Use&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I use a bunch on Luanti mods, but some key ones in use for this build are listed below:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;content.luanti.org&#x2F;packages&#x2F;mt-mods&#x2F;technic_plus&#x2F;&quot;&gt;Technic Plus&lt;&#x2F;a&gt; - For power generation&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;content.luanti.org&#x2F;packages&#x2F;Jeija&#x2F;digilines&#x2F;&quot;&gt;Digilines&lt;&#x2F;a&gt; - for programmable signals&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;content.luanti.org&#x2F;packages&#x2F;mt-mods&#x2F;digistuff&#x2F;&quot;&gt;Digistuff&lt;&#x2F;a&gt; - For some control interfaces&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;content.luanti.org&#x2F;packages&#x2F;Jeija&#x2F;mesecons&#x2F;&quot;&gt;Mesecons&lt;&#x2F;a&gt; - For circuitry and programmable controllers&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;And many others that are dependencies of the above, and generally decent looking blocks.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;building-the-dam-structure&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#building-the-dam-structure&quot; aria-label=&quot;Anchor link for: building-the-dam-structure&quot;&gt;Building the Dam Structure&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I will leave the general design of the dam as a exercise for the reader, but in basic terms what you need is:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;A large body of water&lt;&#x2F;li&gt;
&lt;li&gt;A big wall to hold the water back, holes cut into the wall at certain intervals where water will flow through.&lt;&#x2F;li&gt;
&lt;li&gt;Another big wall a reasonable distance from the other one to create a large building, within which all the dam mechanics will be. Holes in the same-but-lower position as the back wall&#x27;s holes to let the water out.&lt;&#x2F;li&gt;
&lt;li&gt;Within the dam, sections built around where the water will run from the back to the front of the dam. More info on this next.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Nice to have:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;A control tower, away from the main dam, but in a location where you can see the dam
&lt;ul&gt;
&lt;li&gt;This is where you can control the gates, and where some of the programming happens.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Per-section control areas, for emergency cut off switches and per-section controls.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;intake-gates&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#intake-gates&quot; aria-label=&quot;Anchor link for: intake-gates&quot;&gt;Intake Gates&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;




&lt;img class=&quot;article-img &quot; src=&quot;https:&amp;#x2F;&amp;#x2F;paulwilde.uk&amp;#x2F;processed_images&amp;#x2F;gate_from_lake.d17a153c7804d551.webp&quot; alt=&quot;A row of 9 steel blocks block water from entering our generator room.&quot; title=&quot;Gate from the water side&quot; &#x2F;&gt;
&lt;p&gt;Of course, we need to control if water is allowed to flow into these generator areas, and we can do this using blocks and Mesecons Sticky Pistons. This is just a simple row of upward facing sticky pistons, with a block of your choosing on top, all connected to a mesecons wire - and a NOT gate (so no signal means the pistons are extended). More on this later.&lt;br &#x2F;&gt;
I&#x27;ve put my intake gate around one block lower than the water level as I&#x27;ve found if it&#x27;s any lower, the water just flows downwards, instead of into the intake gate.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-generators-and-generator-area&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-generators-and-generator-area&quot; aria-label=&quot;Anchor link for: the-generators-and-generator-area&quot;&gt;The Generators and Generator Area&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;For simplicity, I&#x27;ll be using Low-Voltage Hydro Generators from the Technic&#x2F;Technic Plus mod, but you could easily switch these out with Mid-Voltage Hydro Generators if you wish. Or run both in parallel.&lt;&#x2F;p&gt;
&lt;p&gt;These Hydro LV Generators generate power based on water flowing past any of their 4 sides, and their efficiency changes depending on that flow. I&#x27;ve found an ideal efficiency build is to ensure water can flow from at least above, to at least one block below the sides of the generator. This basically means the generator will be sat on it&#x27;s own wire, which acts as a pedestal to hold it up.&lt;&#x2F;p&gt;




&lt;img class=&quot;article-img &quot; src=&quot;https:&amp;#x2F;&amp;#x2F;paulwilde.uk&amp;#x2F;processed_images&amp;#x2F;generators.8a71f9b851604fa3.webp&quot; alt=&quot;An array of Hydro Generators. Some are stood on a pedestrals (that are actually a wires), and others are fixed to the ground. You can see the closed intake gate at the back of the image.&quot; title=&quot;Hydro Generator Array&quot; &#x2F;&gt;
&lt;p&gt;I have an array of 17 generators, in rows of 4, 4, 5 and 4, with concrete blocks in places to maximise water flow.&lt;&#x2F;p&gt;




&lt;img class=&quot;article-img &quot; src=&quot;https:&amp;#x2F;&amp;#x2F;paulwilde.uk&amp;#x2F;processed_images&amp;#x2F;generator_array.9a415cb37f489cb9.webp&quot; alt=&quot;An array of Hydro Generators. Some are stood on a pedestrals (that are actually a wires), and others are fixed to the ground.&quot; title=&quot;Hydro Generator Array&quot; &#x2F;&gt;
&lt;p&gt;You should ensure the water flow by allowing it to drop down every couple of blocks, so each generator block would be 1 block lower and 2 blocks forward of the previous generator.&lt;&#x2F;p&gt;
&lt;p&gt;I have this duplicated 3 more times for a total of 4 different generating sections.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;switching-station&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#switching-station&quot; aria-label=&quot;Anchor link for: switching-station&quot;&gt;Switching Station&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The Technic mod requires all power networks are connected to one (and ony one) switching station. My 4 hydro generator arrays all have cables coming back to a Switching Station building I have built inside the dam, which then supplies power to the rest of the world.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;programming&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#programming&quot; aria-label=&quot;Anchor link for: programming&quot;&gt;Programming&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Where the control tower, intake gate section controls are and wiring to them is up to you. You will need a digiline wire from each intake gate control section back to the main control tower, and a bunch of luacontrollers.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;intake-gate-section&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#intake-gate-section&quot; aria-label=&quot;Anchor link for: intake-gate-section&quot;&gt;Intake Gate Section&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;




&lt;img class=&quot;article-img &quot; src=&quot;https:&amp;#x2F;&amp;#x2F;paulwilde.uk&amp;#x2F;processed_images&amp;#x2F;outside_gate_room.540e28639fa1010b.webp&quot; alt=&quot;Outside one of our generator rooms, we have a window to see into the generator room and a door to enter it (for maintenance). We also see a small room within with is a load of circuitry. Outside this small room is a lever switch, a couple of display screens, and a touchscreen control.&quot; title=&quot;Generator room, outside&quot; &#x2F;&gt;
&lt;p&gt;My intake gate sections consist of a luacontroller, &lt;del&gt;an AND gate&lt;&#x2F;del&gt;, a NOT gate, the sticky pistons for the gate, and a switch to act as an emergency override switch to turn that section off fully.&lt;&#x2F;p&gt;
&lt;p&gt;The setup looks something like this:&lt;&#x2F;p&gt;




&lt;img class=&quot;article-img &quot; src=&quot;https:&amp;#x2F;&amp;#x2F;paulwilde.uk&amp;#x2F;processed_images&amp;#x2F;intake_section_network.4725a47c289c0534.webp&quot; alt=&quot;Top left, incoming digilines network, connected to a luacontroller. Beneath the luacontroller is an AND gate which is also connected to a wall switch. The output of the AND gate is connected to a NOT gate and back to port C on the luacontroller. It&amp;#x27;s also connected to a vertical mesecons wire, which just connects to some unseen lights.&quot; title=&quot;Generator room, network&quot; &#x2F;&gt;
&lt;p&gt;EDIT: I&#x27;ve removed the AND gate from my set up, as the luacontroller can handle
this and also allows us to report back if the emergency switch has been triggered
(&quot;locked&quot;). So ignore the AND gate from the image above.&lt;&#x2F;p&gt;
&lt;p&gt;Programming-wise, the luacontroller will run the below code.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;lua&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;gate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #616E88;&quot;&gt; -- ID of the Gate&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;-- The Control Tower luacontroller interfaces with a touch screen control.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;-- When the touch screen button is pressed, the luacontroller sends a &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;-- &amp;quot;Gate {ID} Open&amp;quot; or &amp;quot;Gate {ID} Close&amp;quot; signal, which we use here to &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;-- switch port.d of this luacontroller on or off&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;-- If pin.d (our override switch) is off, then don&amp;#39;t do anything here&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; event.channel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Gate &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt;gate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; Open&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;and&lt;&#x2F;span&gt;&lt;span&gt; pin.d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  mem.status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;open&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  digiline_send&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;gate_status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, {gate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; gate, status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; mem.status})&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  port.c&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; = true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;elseif&lt;&#x2F;span&gt;&lt;span&gt; (event.channel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Gate &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt;gate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; Close&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;and&lt;&#x2F;span&gt;&lt;span&gt; pin.d) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  mem.status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;closed&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  port.c&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; = false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  digiline_send&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;gate_status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, {gate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; gate, status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; mem.status})&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;-- WHen our override switch on pin.d is triggered, set the status to locked&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; event.type&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;off&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;and&lt;&#x2F;span&gt;&lt;span&gt; event.pin.name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;D&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  mem.status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;locked&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  port.c&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; = false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  digiline_send&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;gate_status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, {gate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; gate, status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; mem.status})&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;elseif&lt;&#x2F;span&gt;&lt;span&gt; event.type&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;on&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;and&lt;&#x2F;span&gt;&lt;span&gt; event.pin.name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;D&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  mem.status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;closed&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  port.c&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; = false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  digiline_send&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;gate_status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, {gate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; gate, status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; mem.status})&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;-- Start an interrupt cycle to run after 5 seconds&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; event.type&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;program&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  mem.status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;closed&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;  if not&lt;&#x2F;span&gt;&lt;span&gt; pin.d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    mem.status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;locked&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  interrupt&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;5&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;send_status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt;gate)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;-- When the interrupt signal is received, send the current gate status to &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;-- the control tower.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; event.iid&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;send_status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt;gate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  digiline_send&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;gate_status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, {gate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; gate, status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; mem.status})&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; event.iid&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;    interrupt&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;15&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;send_status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt;gate)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h4 id=&quot;control-tower&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#control-tower&quot; aria-label=&quot;Anchor link for: control-tower&quot;&gt;Control Tower&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;



&lt;img class=&quot;article-img &quot; src=&quot;https:&amp;#x2F;&amp;#x2F;paulwilde.uk&amp;#x2F;processed_images&amp;#x2F;control_tower_visuals_high.01bbd98279ded016.webp&quot; alt=&quot;We see a wall with two LCD screens and a touchscreen display. The first screen displays the current Supply, Demand, and High and Low Thresholds. The second screen displays what intake gates are open and closed.&quot; title=&quot;Control Tower Controls&quot; &#x2F;&gt;

This is where the control really happens. Here we have a touchscreen with
Open&#x2F;Close buttons for each gate, pressing them sends a signal to that gate&#x27;s
luacontroller and the gate opens or shuts. I have an LCD screen nearby to
display the current status.&lt;br &#x2F;&gt;
I also have the switching station connected to the digilines network, allowing for feedback of power usage, which allows for automation of opening&#x2F;closing the gates.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;lua&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;-- If we get a gate_status signal, update the memory of that gate and &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;-- refresh the screen&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; event.channel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;gate_status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  mem.gates[event.msg.gate] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; { gate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; event.msg.gate, status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; event.msg.status}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  content&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBCB8B;&quot;&gt;\n\n\n\n\n\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;  for&lt;&#x2F;span&gt;&lt;span&gt; i, gate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt; ipairs&lt;&#x2F;span&gt;&lt;span&gt;(mem.gates) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; gate.status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; ~= nil then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      content&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; content&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;G &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt;gate.gate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt;gate.status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBCB8B;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;      digiline_send&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;gates_screen&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;G &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt;gate.gate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt;gate.status)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;    end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  digiline_send&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;gates_screen&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,content&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBCB8B;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;-- When programming, set Unknown status to all gates&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;-- and configure touch screen buttons.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; event.type&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;program&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;  -- Arbitrary order of gate opening I&amp;#39;d like. For automation.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  mem.gateorder&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; { &lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;5&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;  -- Reverse over of above, for closing.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  mem.revorder&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; { &lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;5&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  digiline_send&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;gates_screen&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Loading...&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  mem.gates&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  mem.gates[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; {gate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;,status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Unknown&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  mem.gates[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; {gate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;,status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Unknown&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  mem.gates[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; {gate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span&gt;,status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Unknown&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  mem.gates[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; {gate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;,status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Unknown&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  mem.gates[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;5&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; {gate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;5&lt;&#x2F;span&gt;&lt;span&gt;,status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Unknown&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ts&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; { { command&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;clear&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;},&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         { command&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, width&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 6&lt;&#x2F;span&gt;&lt;span&gt; , height&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 5&lt;&#x2F;span&gt;&lt;span&gt; },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         { command&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, element&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;button_exit&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, X&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 0.0&lt;&#x2F;span&gt;&lt;span&gt;, Y&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;, name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;button&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;, label&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Gate 1 Open&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;},&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         { command&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, element&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;button_exit&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, X&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 3.0&lt;&#x2F;span&gt;&lt;span&gt;, Y&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;, name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;button&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;, label&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Gate 1 Close&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;},&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         { command&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, element&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;button_exit&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, X&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 0.0&lt;&#x2F;span&gt;&lt;span&gt;, Y&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;, name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;button&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;, label&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Gate 2 Open&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;},&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         { command&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, element&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;button_exit&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, X&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 3.0&lt;&#x2F;span&gt;&lt;span&gt;, Y&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;, name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;button&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;, label&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Gate 2 Close&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;} ,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         { command&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, element&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;button_exit&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, X&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 0.0&lt;&#x2F;span&gt;&lt;span&gt;, Y&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span&gt;, name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;button&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;, label&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Gate 3 Open&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;},&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         { command&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, element&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;button_exit&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, X&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 3.0&lt;&#x2F;span&gt;&lt;span&gt;, Y&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span&gt;, name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;button&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;, label&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Gate 3 Close&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;} ,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         { command&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, element&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;button_exit&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, X&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 0.0&lt;&#x2F;span&gt;&lt;span&gt;, Y&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span&gt;, name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;button&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;, label&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Gate 4 Open&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;},&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         { command&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, element&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;button_exit&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, X&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 3.0&lt;&#x2F;span&gt;&lt;span&gt;, Y&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span&gt;, name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;button&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;, label&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Gate 4 Close&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;},&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         { command&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, element&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;button_exit&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, X&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 0.0&lt;&#x2F;span&gt;&lt;span&gt;, Y&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span&gt;, name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;button&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;, label&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Gate 5 Open&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;},&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         { command&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, element&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;button_exit&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, X&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 3.0&lt;&#x2F;span&gt;&lt;span&gt;, Y&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span&gt;, name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;button&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;, label&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Gate 5 Close&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  digiline_send&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;gates_touchscreen&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,ts)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;  -- get the power status from the switching station too&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  digiline_send&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;lv_switch_station&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;-- When a touch screen button is pressed, send a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;-- &amp;quot;Gate {ID} Open&amp;quot; or &amp;quot;Gate {ID} Close&amp;quot; signal to the&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;-- digilines network.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; event.channel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;gates_touchscreen&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  digiline_send&lt;&#x2F;span&gt;&lt;span&gt;(event.msg.button,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;-- When we get a signal back from the switching station, handle it &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;-- and update the screen.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; event.channel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;lv_switch_station&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  content&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBCB8B;&quot;&gt;\n\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;LV Supply: &lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBCB8B;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt;event.msg.supply&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBCB8B;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  content&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; content&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;LV Demand: &lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBCB8B;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt;event.msg.demand&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBCB8B;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;  -- This is the high threshold, i.e. the level we want to watch for to &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;  -- open another gate&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  h_threshold&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; (event.msg.supply&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 10&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 9.5&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  content&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; content&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;HL:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt;h_threshold&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBCB8B;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;  -- Same as h_threshold, but the low threshold, i.e. when we want to close a gate&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  l_threshold&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; (event.msg.supply&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 10&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 2.7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  content&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; content&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;LL:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt;l_threshold&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;  -- it&amp;#39;s a bit of a balancing act, as you could end up repeatedly opening and&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;  -- closing a gate if you&amp;#39;re not careful.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;  -- Show those numbers on screen.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  digiline_send&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;power_screen&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,content)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;  -- Here&amp;#39;s the automation:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;  -- If the power supply is 0 or power demand is higher than our higher threshold&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;  -- check each gate from our order above, and open the next available one&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;  -- Likewise, if demand is lower than the lower threshold,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;  -- cycle through our gates in reverse and close one.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;  -- Pin D is where our Automaton On&#x2F;Off Switch is connected.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; pin.d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (event.msg.supply&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; and&lt;&#x2F;span&gt;&lt;span&gt; event.msg.demand&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;    or&lt;&#x2F;span&gt;&lt;span&gt; event.msg.demand&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; h_threshold&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span&gt; i, v&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt; ipairs&lt;&#x2F;span&gt;&lt;span&gt;(mem.gateorder) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      g&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; mem.gates[v]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; g.status&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;      if&lt;&#x2F;span&gt;&lt;span&gt; status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;closed&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;        digiline_send&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Gate &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt;v&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; Open&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;        break&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;      end&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;    end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;  elseif&lt;&#x2F;span&gt;&lt;span&gt; event.msg.demand&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span&gt; l_threshold&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span&gt; i, v&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt; ipairs&lt;&#x2F;span&gt;&lt;span&gt;(mem.revorder) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      g&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; mem.gates[v]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; g.status&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;      if&lt;&#x2F;span&gt;&lt;span&gt; status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;open&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;        digiline_send&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Gate &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt;v&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; Close&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;        break&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;      end&lt;&#x2F;span&gt;&lt;span&gt;     &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;    end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;  -- Finally, set an interrupt for 10 seconds to get the power usage &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;  -- from the switching station again, continually.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  interrupt&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;10&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;get_power_status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;-- Send a signal to the switching station to get its power usage.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; event.iid&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;get_power_status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  digiline_send&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;lv_switch_station&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;my-5th-gate&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#my-5th-gate&quot; aria-label=&quot;Anchor link for: my-5th-gate&quot;&gt;My 5th Gate&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;You&#x27;ll probably notice in the code blocks above I have a 5th gate, there&#x27;s not a lot different with this one; it&#x27;s controlled the same way, except the power generation is a little different.&lt;br &#x2F;&gt;
Instead of water flowing through the dam across hydrogenerators, when the gate
opens water is free to flow past the dam to a pool. In this pool
is a checkerboard pattern of hydrogenerators that the water can just about
flow over and drop between the gaps in between each generator. The efficiency isn&#x27;t as good as the main dam generators (60% rather than 100%), but you could in theory use multiple layers of generators in series down one big hole to generate massive amount of power without the limitation of horizontal space.&lt;&#x2F;p&gt;




&lt;img class=&quot;article-img &quot; src=&quot;https:&amp;#x2F;&amp;#x2F;paulwilde.uk&amp;#x2F;processed_images&amp;#x2F;fifth_gate_water_over_generators.45efb96f4f478fdd.webp&quot; alt=&quot;Showing water flowing over 8 hydro-generators.&quot; title=&quot;Fifth Gate from Above&quot; &#x2F;&gt;
&lt;h3 id=&quot;let-it-run&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#let-it-run&quot; aria-label=&quot;Anchor link for: let-it-run&quot;&gt;Let it Run!&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;With all that in place, our dam should be operational! Run some wires,
stick some Technic Lamps up, connect some LV machines, open up a gate and
use the power and see everything (hopefully) work as desired.&lt;br &#x2F;&gt;
You&#x27;ll find if you switch all your gates off (and you don&#x27;t use automation),
as the power supply gets to 0 all your lights will go out! Open a gate back up,
and power will return!&lt;&#x2F;p&gt;
&lt;p&gt;Woohoo!&lt;&#x2F;p&gt;
&lt;p&gt;If you need to run maintenance on a gate, use
the emergency override to stop the water, and prevent it from being switch back on, and go in and fix what you need.&lt;&#x2F;p&gt;
&lt;p&gt;Although it is fun to watch the lights go out when the water stops flowing,
you probably should put some batteries on the LV network as well, to cover you
for those times no water is flowing!&lt;&#x2F;p&gt;
&lt;p&gt;Just like real life (almost)!&lt;&#x2F;p&gt;
&lt;h3 id=&quot;block-exchange&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#block-exchange&quot; aria-label=&quot;Anchor link for: block-exchange&quot;&gt;Block Exchange&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;This build is available on &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;blockexchange.minetest.ch&quot;&gt;Block Exchange&lt;&#x2F;a&gt; on the following link:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;blockexchange.minetest.ch&#x2F;schema&#x2F;pswilde&#x2F;hydroelectric_dam&quot;&gt;blockexchange.minetest.ch&#x2F;schema&#x2F;pswilde&#x2F;hydroelectric_dam&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Setting Up Anubis on FreeBSD</title>
        <published>2025-04-15T15:13:00+00:00</published>
        <updated>2025-04-15T15:13:00+00:00</updated>
        
        <author>
          <name>
            Paul Wilde
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/setting-up-anubis-on-freebsd/"/>
        <id>https://paulwilde.uk/ponderings/setting-up-anubis-on-freebsd/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/setting-up-anubis-on-freebsd/">&lt;p&gt;I&#x27;ve noticed a few times recently my &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;forgejo.org&quot;&gt;Forgejo&lt;&#x2F;a&gt; server has been triggering alerts
on my monitoring systems that is isn&#x27;t responding as fast as it normally should be.
Low and behold - it&#x27;s due to AI crawlers causing it to grind to a halt as the scrape every
little section of the service for their own needs.&lt;br &#x2F;&gt;
This is how I implemented &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;anubis.techaro.lol&quot;&gt;Anubis&lt;&#x2F;a&gt; to help mitigate this problem.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;hr&#x2F;&gt;
&lt;div class=&quot;notice warning&quot;&gt;
&lt;h2 id=&quot;anubis-now-in-freebsd-ports&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#anubis-now-in-freebsd-ports&quot; aria-label=&quot;Anchor link for: anubis-now-in-freebsd-ports&quot;&gt;Anubis Now in FreeBSD Ports!&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Since writing this I have learned Anubis is in the ports tree for FreeBSD, which,
in my opinion, should be considered the de-facto method for installing Anubis on FreeBSD.&lt;br &#x2F;&gt;
It can be achieved by running the following:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Sync the ports tree&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; clone --depth&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; https:&#x2F;&#x2F;git.FreeBSD.org&#x2F;ports.git &#x2F;usr&#x2F;ports&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# change to the Anubis port directory&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; &#x2F;usr&#x2F;ports&#x2F;www&#x2F;go-anubis&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# make anubis&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;make&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; install&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Configure and enable anubis in rc.conf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;sysrc&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; anubis_args=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;-target http:&#x2F;&#x2F;localhost:3000 -bind :8923&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #616E88;&quot;&gt; # ... add arguments as required&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;sysrc&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; anubis_enable=YES&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If, however, you wish to compile it yourself and&#x2F;or, like me, you prefer to configure things
using configuration files, and&#x2F;or would like a bit more information on configuration and policies to set, read on.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;hr&#x2F;&gt;
&lt;h3 id=&quot;server-setup&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#server-setup&quot; aria-label=&quot;Anchor link for: server-setup&quot;&gt;Server Setup&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;For those that don&#x27;t know, Forgejo is a software forge; Think of it as a git... hub, that you can host yourself.
I run my Forgejo Instance on a FreeBSD server in a jail, and it sits behind a &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;haproxy.org&quot;&gt;HAProxy&lt;&#x2F;a&gt; reverse proxy which is also a jail.&lt;&#x2F;p&gt;
&lt;p&gt;I monitor the uptime of this service, and many others, using &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;gatus.io&quot;&gt;Gatus&lt;&#x2F;a&gt;,
which is a brilliantly simple infrastructure monitoring system that can send you alerts dependant on various factors
i.e. connectivity loss, certificate expiration, and, crucially, response time.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-problem&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-problem&quot; aria-label=&quot;Anchor link for: the-problem&quot;&gt;The Problem&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Over the last few months, I have noticed a significant increase in alerts due to poor response times. A quick check of the HAProxy logs shows a huge amount of traffic from AI crawlers. Something like the below:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;.thousands of lines before...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;Feb&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 19&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; 21:47:39&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 192.168.200.5&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; haproxy[2334]: 20.171.207.150:41308&lt;&#x2F;span&gt;&lt;span&gt; [19&#x2F;Feb&#x2F;2025:21:47:39.115] ft_in_https~ be_forgejo&#x2F;forgejo 0&#x2F;0&#x2F;1&#x2F;273&#x2F;279 200 17290 - - ---- 6&#x2F;6&#x2F;0&#x2F;0&#x2F;0 0&#x2F;0 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;GET https:&#x2F;&#x2F;forge.notnull.space&#x2F;psw&#x2F;web&#x2F;commit&#x2F;078833d79049280fcc13bfc790b2835d9819de28.patch HTTP&#x2F;2.0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; hdrs:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;host: forge.notnull.space^M x-openai-host-hash: 132087407^M accept: *&#x2F;*^M from: gptbot(at)openai.com^M user-agent: Mozilla&#x2F;5.0 AppleWebKit&#x2F;537.36 (KHTML, like Gecko; compatible; GPTBot&#x2F;1.2; +https:&#x2F;&#x2F;openai.com&#x2F;gptbot)^M accept-encoding: gzip, br, deflate^M ^M &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;.thousands of lines after...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Each of these thousands of requests is scraping data from my code forge causing increased load on the server, making is respond slower and slower.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;basic-defense&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#basic-defense&quot; aria-label=&quot;Anchor link for: basic-defense&quot;&gt;Basic Defense&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;My immediate goal of course was to stop the current AI slopbucket in its tracks to minimise the load on the server
so it can get on with what it is supposed to be doing.&lt;&#x2F;p&gt;
&lt;p&gt;A &lt;code&gt;robots.txt&lt;&#x2F;code&gt; file helps to some extent, but as it turns out, some AI crawlers either do not honour it, or if they are not Disallowed explicitly (i.e. they don&#x27;t follow &lt;code&gt;*&lt;&#x2F;code&gt; wildcard) they say they&#x27;re allowed and get on with it.&lt;&#x2F;p&gt;
&lt;p&gt;As a further defense I set up a basic RegEx based blocklist in HAProxy to return a &lt;code&gt;403&lt;&#x2F;code&gt; HTTP response for any traffic coming from
somewhere that matched certain patterns&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;ini&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# &#x2F;etc&#x2F;haproxy.conf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;frontend ft_in_https&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;    # Block badbots&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    acl is-blockedagent hdr_sub(user-agent) -m reg -i -f &#x2F;opt&#x2F;haproxy-blocklist-agent.txt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    http-request deny if is-blockedagent&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ... rest of config&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;and a bunch of RegEx patterns to block - be it old browser versions or names of AI crawlers.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# &#x2F;opt&#x2F;haproxy-blocklist-agent.txt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;\WImagesiftBot\W&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;\WBytespider\W&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;\WPetalBot\W&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;\WAmazonBot\W&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;\WAndroid [0-8].0\W&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;\WChrome\&#x2F;[0-7][0-8]\W&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;\WChrome\&#x2F;11[0-9]\W&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;\WFirefox\&#x2F;[0-7][0-8]\W&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;\W47\.82\W&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;\Wx-openai-host-hash\W&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;\Wgptbot&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;\Wgptbot\(at\)openai\.com&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;\WGPTBot\&#x2F;1\.2;\W&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...etc...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This works... sort of. It removes the demand on the Forgejo server so that&#x27;s a lot better, but these bots
still continuously send requests - it&#x27;s just HAProxy denys them. HAProxy can deal with this with ease, but still it&#x27;s not nice to see it all in the logs.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;enter-anubis&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#enter-anubis&quot; aria-label=&quot;Anchor link for: enter-anubis&quot;&gt;Enter Anubis&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Anubis is a fantastic, recently developed Anti-AI software product by &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;techaro.lol&quot;&gt;Techaro&lt;&#x2F;a&gt;. It works by giving the connecting computer a proof-of-work challenge which it must solve before being granted access to the requested content. It is a project that has started to pop up everywhere, including the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;policytoolbox.iiep.unesco.org&#x2F;&quot;&gt;United Nations&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;For a visitor like you or I, we will see a brief screen displayed saying &quot;Making sure you&#x27;re not a bot&quot; before the site loads, then after that we can use the site as normal.&lt;br &#x2F;&gt;
For an AI, however, we can configure Anubis to give a harder to solve challenge, which takes much longer, and significantly impacts how quickly that bot can send requests to our service.&lt;br &#x2F;&gt;
This has a massive impact on how many connections HAProxy has to deal with, reducing the overall load immensely.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;building-anubis&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#building-anubis&quot; aria-label=&quot;Anchor link for: building-anubis&quot;&gt;Building Anubis&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Anubis doesn&#x27;t (yet) have any native FreeBSD binaries, but that&#x27;s OK, it&#x27;s a Go and NPM product so we can easily build it ourselves.&lt;&#x2F;p&gt;
&lt;p&gt;First we install Go on our system:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# At the time of writing Go 1.24.2 was the lastest version - adjust as required.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; wget https:&#x2F;&#x2F;go.dev.&#x2F;dl&#x2F;go1.24.2.freebsd-amd64.tar.gz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Extract it&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; tar xf go1.24.2.freebsd-amd64.tar.gz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Copy the downloaded go folder to &#x2F;usr&#x2F;local&#x2F; (for GOROOT reasons used later)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; cp go &#x2F;usr&#x2F;local&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Set your PATH and GOROOT environment variables as required&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; export GOROOT=&#x2F;usr&#x2F;local&#x2F;go&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; export PATH=&lt;&#x2F;span&gt;&lt;span&gt;$PATH&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;;&lt;&#x2F;span&gt;&lt;span&gt;$GOROOT&#x2F;bin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now, we can save ourselves a lot of trouble by downloading the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;anubis.techaro.lol&#x2F;docs&#x2F;developer&#x2F;building-anubis#pre-baked-tarball&quot;&gt;Prebaked Tarball&lt;&#x2F;a&gt;
of Anubis, which means the Go modules dependencies are included, and the static JS, CSS, etc. assets are already compiled.&lt;&#x2F;p&gt;
&lt;p&gt;We can build Anubis by the following.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# At the time of writing, v1.16.0 of Anubus was the latest&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; wget https:&#x2F;&#x2F;github.com&#x2F;TecharoHQ&#x2F;anubis&#x2F;releases&#x2F;download&#x2F;v1.16.0&#x2F;anubis-src-vendor-npm-1.16.0.tar.gz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Extract it&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; tar xf anubis-src-vendor-npm-1.16.0.tar.gz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; cd anubis-src-vendor-npm-1.16.0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# And build&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; make prebaked-build&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;All going well, you should have a ready to go binary &lt;code&gt;.&#x2F;var&#x2F;anubis&lt;&#x2F;code&gt; which we can use.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;running-anubis-as-a-daemon&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#running-anubis-as-a-daemon&quot; aria-label=&quot;Anchor link for: running-anubis-as-a-daemon&quot;&gt;Running Anubis as a Daemon&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I have written a basic &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;raw.githubusercontent.com&#x2F;pswilde&#x2F;anubis&#x2F;refs&#x2F;heads&#x2F;main&#x2F;run&#x2F;anubis.freebsd&quot;&gt;rc.d script&lt;&#x2F;a&gt; for FreeBSD.
This script runs anubis using [daemon](https:&#x2F;&#x2F;man.freebsd.org&#x2F;cgi&#x2F;man.cgi?daemon(8) so it restarts if it crashes, and outputs to a log in &#x2F;var&#x2F;log.&lt;&#x2F;p&gt;
&lt;p&gt;If you want to use it, you can copy it from the archive into rc.d&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; cp anubis.freebsd &#x2F;usr&#x2F;local&#x2F;etc&#x2F;rc.d&#x2F;anubis&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; chmod +x &#x2F;usr&#x2F;local&#x2F;etc&#x2F;rc.d&#x2F;anubis&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then, enable it and set it&#x27;s configuration path&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; sysrc&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;anubis_enable=YES&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; sysrc&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;anubis_environment_file=&#x2F;etc&#x2F;anubis.env&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You will need to have an &lt;code&gt;anubis&lt;&#x2F;code&gt; user account (i.e. &lt;code&gt;adduser anubis&lt;&#x2F;code&gt;) or set the &lt;code&gt;anubis_user&lt;&#x2F;code&gt; variable appropriately.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;configuring-anubis&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#configuring-anubis&quot; aria-label=&quot;Anchor link for: configuring-anubis&quot;&gt;Configuring Anubis&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Now we have the software ready to run, we need to set up a bit of configuration so it works as we need.&lt;br &#x2F;&gt;
First, we should set some basic environment variables - a &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;anubis.techaro.lol&#x2F;docs&#x2F;admin&#x2F;installation&quot;&gt;full list is available on the Anubis website&lt;&#x2F;a&gt;.
i.e. &lt;code&gt;vim &#x2F;etc&#x2F;anubis.env&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# The port Anubis listens on&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BIND&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;:8923&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# your service endpoint, forgejo runs on port 3000 by default on this local server&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;TARGET&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;http:&#x2F;&#x2F;localhost:3000&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Cookie Domain: IMPORTANT: this should be just the root domain of your service, so if your service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# runs on forgejo.example.com, just put example.com&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;COOKIE_DOMAIN&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;example.com&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# A Custom Policy File Location - mnore on this later&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;POLICY_FNAME&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;&#x2F;etc&#x2F;forgejo.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# A hex encoded private key. Without setting this a new one will be generated each time Anubis restarts&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ED25519_PRIVATE_KEY_HEX&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;############################### - run &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;`&lt;&#x2F;span&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;openssl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; rand -hex&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 32&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;`&lt;&#x2F;span&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt; to&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; generate one&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h4 id=&quot;creating-a-custom-policy&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#creating-a-custom-policy&quot; aria-label=&quot;Anchor link for: creating-a-custom-policy&quot;&gt;Creating A Custom Policy&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;Anubis by default will aggressively challenge everything that might be a browser, which may be fine for some uses,
but, often it won&#x27;t be. So we can create a custom policy file that makes it nicer for nice things, and bas for bad things.&lt;&#x2F;p&gt;
&lt;p&gt;The examples in &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;anubis.techaro.lol&#x2F;docs&#x2F;admin&#x2F;policies&quot;&gt;Anubis&#x27; Documentation&lt;&#x2F;a&gt; are a pretty good fit here:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;{&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;bots&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;        [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;generic-bot-catchall&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;user_agent_regex&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;(?i:bot|crawler|gpt)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;action&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;CHALLENGE&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;challenge&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;                        &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;difficulty&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 16&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;                        &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;report_as&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;                        &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;algorithm&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;slow&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;                }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;        },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;well-known&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;path_regex&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;^&#x2F;.well-known&#x2F;.*$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;action&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;ALLOW&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;        },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;favicon&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;path_regex&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;^&#x2F;favicon.ico$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;action&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;ALLOW&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;        },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;robots-txt&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;path_regex&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;^&#x2F;robots.txt$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;action&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;ALLOW&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;        },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;generic-browser&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;user_agent_regex&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Mozilla&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;action&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;CHALLENGE&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;        ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The first definition makes everything connecting with a user-agent string containing &quot;bot&quot;,&quot;crawler&quot;, or &quot;gpt&quot; have to take a high difficulty slow challenge.&lt;br &#x2F;&gt;
The next 3 say that things trying to access the &lt;code&gt;.well-known&lt;&#x2F;code&gt; folder, &lt;code&gt;favicon&lt;&#x2F;code&gt;, or &lt;code&gt;robots.txt&lt;&#x2F;code&gt; files are just allowed. We don&#x27;t want to challenge those. i.e. certbot&#x2F;letsencrypt will need access to &lt;code&gt;.well-known&#x2F;acme-challenge&lt;&#x2F;code&gt; to verify the certificate - we don&#x27;t want to break this.&lt;br &#x2F;&gt;
Finally, the &quot;generic-browser&quot; definition shows a basic challenge for everything else. This is what casual visitors will briefly see when they visit for the first time to confirm they are not a bot.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ready-to-go&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#ready-to-go&quot; aria-label=&quot;Anchor link for: ready-to-go&quot;&gt;Ready to Go&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;There we go. With all that in place, we can now run Anubis and change HAProxy to Anubis&#x27; listening port and put it to work!&lt;&#x2F;p&gt;
&lt;p&gt;Run Anubis&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; service anubis start&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Configure HAProxy&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;ini&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;... rest of config&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;backend be_forgejo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    mode http&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;    # server forgejo 192.168.200.10:3000 # old direct to forgejo route. disabled&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    server forgejo 192.168.200.10:8923 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# new route to anubis&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;monitoring-and-extra-bits&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#monitoring-and-extra-bits&quot; aria-label=&quot;Anchor link for: monitoring-and-extra-bits&quot;&gt;Monitoring and extra bits&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;raw.githubusercontent.com&#x2F;pswilde&#x2F;anubis&#x2F;refs&#x2F;heads&#x2F;main&#x2F;run&#x2F;anubis.freebsd&quot;&gt;rc.d script&lt;&#x2F;a&gt; provided will log stdout and stderr to &lt;code&gt;&#x2F;var&#x2F;log&#x2F;anubis.log&lt;&#x2F;code&gt; so you can see the status of things and any errors.&lt;&#x2F;p&gt;
&lt;p&gt;At this time, Anubis must be run once per endpoint. That is to say if you want to run anubis for Forgejo, and a website, etc. you will need to run at least two instances of anubis.&lt;br &#x2F;&gt;
I am only running a single instance at the moment, but I have a jail that updates and builds Anubis. This jail outputs the anubis binary to a shared location other jails can use and run independantly of each other. This allows me to run numerous instances of it, but I only have to update the Anubis binary in once place.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;final-note&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#final-note&quot; aria-label=&quot;Anchor link for: final-note&quot;&gt;Final Note&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;If you use Anubis, and are able to do so, I strongly encourage you to &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;anubis.techaro.lol&#x2F;docs&#x2F;funding&quot;&gt;donate what you can&lt;&#x2F;a&gt; to the project so they can continue to maintain it into the future.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;happy-ai-stopping&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#happy-ai-stopping&quot; aria-label=&quot;Anchor link for: happy-ai-stopping&quot;&gt;HAPPY AI STOPPING!&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>My Battle with Netcup, IPv6 and FreeBSD combination</title>
        <published>2025-01-20T13:59:00+00:00</published>
        <updated>2025-01-20T13:59:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/my-battles-with-netcup-ipv6-on-freebsd/"/>
        <id>https://paulwilde.uk/ponderings/my-battles-with-netcup-ipv6-on-freebsd/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/my-battles-with-netcup-ipv6-on-freebsd/">&lt;p&gt;Recently I&#x27;ve started to migrate some of my VPS&#x27;s to &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;netcup.eu&quot;&gt;Netcup&lt;&#x2F;a&gt;
as I have found their offerings more performant, and less expensive, than other
VPS providers.&lt;br &#x2F;&gt;
However, it seems due to the way Netup&#x27;s IPv6 network is set up causes some issues
with FreeBSD, and allegedly other BSDs leading to loss of connectivity via IPv6.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h3 id=&quot;tl-dr&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#tl-dr&quot; aria-label=&quot;Anchor link for: tl-dr&quot;&gt;TL;DR:&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Using Netcup&#x27;s IPv6 gateway &lt;code&gt;fe80::1&lt;&#x2F;code&gt; with FreeBSD results in eventual lost connectivity with IPv6.&lt;br &#x2F;&gt;
Instead of using the link-local address for a gateway, using IPv6 addresses in the same &#x2F;48 range as your provided IPv6 range, and setting your IPv6 address prefix to &#x2F;48 instead of &#x2F;64 seems to work fairly reliably.&lt;br &#x2F;&gt;
For example if Netcup provide you with IPv6 range: &lt;code&gt;2a03:4000:AAAA:BBBB::&#x2F;64&lt;&#x2F;code&gt;, you would set this statically in your &lt;code&gt;rc.conf&lt;&#x2F;code&gt; but as a &#x2F;48, and set &lt;code&gt;2a03:4000:AAAA::2&lt;&#x2F;code&gt; and&#x2F;or &lt;code&gt;2a03:4000:AAAA::3&lt;&#x2F;code&gt; as your gateway.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# &#x2F;etc&#x2F;rc.conf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#ifconfig_vtnet0_ipv6=&amp;quot;inet6 2a03:4000:AAAA:BBBB:cccc:dddd:eeee:ffff&#x2F;64&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ifconfig_vtnet0_ipv6=&amp;quot;inet6 2a03:4000:AAAA:BBBB:cccc:dddd:eeee:ffff&#x2F;48&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#ipv6_defaultrouter=&amp;quot;fe80::1%vtnet0&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ipv6_defaultrouter=&amp;quot;2a03:4000:AAAA::2&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;add other routes with&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;route&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -6 add default 2a03:4000:AAAA:3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I&#x27;ve had most reliability setting &lt;em&gt;both&lt;&#x2F;em&gt; &lt;code&gt;::2&lt;&#x2F;code&gt; and &lt;code&gt;::3&lt;&#x2F;code&gt; gateways, YMMV.&lt;br &#x2F;&gt;
It appears in each Netcup &#x2F;48 subnet &lt;code&gt;::2&lt;&#x2F;code&gt; and &lt;code&gt;::3&lt;&#x2F;code&gt; are gateways.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;On with the full story...&lt;&#x2F;p&gt;
&lt;h3 id=&quot;netcup&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#netcup&quot; aria-label=&quot;Anchor link for: netcup&quot;&gt;Netcup&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I have moved to Netcup for a few reasons: 1. expense, 2. experienced better performance than my previous provider, and 3. ability to provide my own ISOs for OS install.&lt;br &#x2F;&gt;
Netcup in my experience are great, I have a few Debian systems with them that have been super reliable.&lt;br &#x2F;&gt;
But, I want to use FreeBSD for my projects, so my new VPSs run FreeBSD.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-issue&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-issue&quot; aria-label=&quot;Anchor link for: the-issue&quot;&gt;The Issue&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;All is well on the IPv4 front, the DHCP client picks up my provided IPv4 address and connectivity is there, great. I still manually set it statically for consistency, but either way it works great.&lt;br &#x2F;&gt;
IPv6 however, different story. FreeBSD doesn&#x27;t seem to get it&#x27;s provided IPv6 address via
SLAAC, so no address gets associated. That&#x27;s OK though, I can set it statically in
&lt;code&gt;rc.conf&lt;&#x2F;code&gt;. Netcup provide a &#x2F;64 IPv6 subnet for each VPS, so I can pick any IPv6 in the range
they have provided, but they also sent one via email, so I&#x27;ll just use that for now.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ifconfig_vtnet0_ipv6=&amp;quot;inet6 2a03:4000:AAAA:BBBB:cccc:dddd:eeee:ffff&#x2F;64&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;2a03:4000&lt;&#x2F;code&gt; is Netcup&#x27;s network I believe with &lt;code&gt;AAAA&lt;&#x2F;code&gt; defining a certain part of that network.&lt;br &#x2F;&gt;
&lt;code&gt;BBBB&lt;&#x2F;code&gt; is the subnet provided to me with &lt;code&gt;cccc:dddd:eeee:ffff&lt;&#x2F;code&gt; being the range of address I can use in that subnet.&lt;&#x2F;p&gt;
&lt;p&gt;Netcup&#x27;s IPv6 network is switched, not routed, I&#x27;m sure there&#x27;s a reason for this, and I&#x27;m sure it&#x27;s sensible, but for now the important bit is that the IPv6 gateway should always be &lt;code&gt;fe80::1%vtnet0&lt;&#x2F;code&gt; (where &lt;code&gt;vtnet0&lt;&#x2F;code&gt; is the external interface name) rather than another &lt;code&gt;2a03:4000:AAAA:BBBB&lt;&#x2F;code&gt; IPv6 address. I pop that into my &lt;code&gt;rc.conf&lt;&#x2F;code&gt; as well.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ipv6_defaultrouter=&amp;quot;fe80::1%vtnet0&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Reboot the VPS, and all works well. &lt;code&gt;ping6&lt;&#x2F;code&gt;s work, &lt;code&gt;curl&lt;&#x2F;code&gt;s to IPv6 addresses work, incoming IPv6 connections work. Great! Done...&lt;&#x2F;p&gt;
&lt;p&gt;Not Done.&lt;&#x2F;p&gt;
&lt;p&gt;After about 10 minutes of connectivity, IPv6 just drops out. &lt;code&gt;ping6&lt;&#x2F;code&gt;s fail, &lt;code&gt;curl&lt;&#x2F;code&gt;s fail, no connectivity on IPv6 from the outside world. Drat.&lt;br &#x2F;&gt;
Reboot the VPS again... oh, it&#x27;s back. Great. Wait a few minutes, it goes again. Reboot, back, wait, gone. And so on.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;tests-and-research&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#tests-and-research&quot; aria-label=&quot;Anchor link for: tests-and-research&quot;&gt;Tests and Research&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Obviously the first thing I&#x27;m thinking is firewall. So I disable &lt;code&gt;pf&lt;&#x2F;code&gt; and reboot and wait again - no difference, IPv6 just stops working after a few minutes.&lt;&#x2F;p&gt;
&lt;p&gt;In my fairly inexperienced IPv6 knowledge (it&#x27;s not big in the UK... yet), using &lt;code&gt;fe80::1&lt;&#x2F;code&gt; as a gateway feels weird, so I try a &lt;code&gt;traceroute6 anyaddress.com&lt;&#x2F;code&gt; to see what the first hop on the route is (it must be my actual gateway, right?) and pop that address into my &lt;code&gt;ipv6_defaultrouter=&lt;&#x2F;code&gt; config in &lt;code&gt;rc.conf&lt;&#x2F;code&gt;.&lt;br &#x2F;&gt;
Reboot... no joy, no IPv6 connectivity at all. OK, I set that back.&lt;&#x2F;p&gt;
&lt;p&gt;I browse the netcup forums a bit, find a handful of posts of people experiencing the same issue. Some refer to people leasing an additional IPv6 lease from Netcup and using that instead which allegedly works for them. I did this, it did not work for me - the IPv6 worked, for about 10 minutes again, then dropped off as before.&lt;br &#x2F;&gt;
FreeBSD forums is the same sort of thing, articles from a few years ago.&lt;&#x2F;p&gt;
&lt;p&gt;Both forums seem to have posts saying the issue lies in the fact the IPv6 address and [actual] gateway exist in different subnets.
My simple understanding of this is: the gateway may have address &lt;code&gt;2a03:4000:AAAA::2&lt;&#x2F;code&gt; which is in a &#x2F;48 subnet, and my VPS may have IPv6 address &lt;code&gt;2a03:4000:AAAA:BBBB::1234&lt;&#x2F;code&gt; which is a &#x2F;64 subnet. Because they do not exist on the same subnet, &lt;em&gt;something&lt;&#x2F;em&gt; happens at some point to stop them being able to communicate. I believe this &quot;&lt;em&gt;something&lt;&#x2F;em&gt;&quot; is to do with Netcup&#x27;s switching (rather than routing).&lt;&#x2F;p&gt;
&lt;p&gt;Of the people experiencing this, some have had the IPv6 Connectivity come back and drop off again on its own. I haven&#x27;t experienced this, but perhaps I&#x27;m just impatient.&lt;&#x2F;p&gt;
&lt;p&gt;So, &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;forums.freebsd.org&#x2F;threads&#x2F;netcup-ipv6-intermittant.96489&#x2F;&quot;&gt;I write a post on the FreeBSD forums&lt;&#x2F;a&gt; with a bit of information of things I&#x27;ve tried asking for help. I link this to a &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;notnull.space&#x2F;@paul&#x2F;statuses&#x2F;01JHZK2YK2JXJ49NW1V1CV2Y1F&quot;&gt;Fediverse post&lt;&#x2F;a&gt; and wait for responses. It doesn&#x27;t take long.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;switching-the-subnet&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#switching-the-subnet&quot; aria-label=&quot;Anchor link for: switching-the-subnet&quot;&gt;Switching the subnet&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;@fab&lt;&#x2F;code&gt; responds with the idea of using a &#x2F;48 prefix instead of &#x2F;64.
Given what I have learned up to this point, this could make sense - the gateway is in a &#x2F;48 of the same first 48 bits of my &#x2F;64 subnet (&lt;code&gt;2a03:4000:AAAA&lt;&#x2F;code&gt;)
after all, so why not put my IPv6 in that same subnet. It &lt;em&gt;could&lt;&#x2F;em&gt; cause issues with communication with other servers in different &#x2F;64 subnets within the same &#x2F;48 subnet, but let&#x27;s risk it for now.&lt;&#x2F;p&gt;
&lt;p&gt;Unfortunately, I experience the same issues again here. After about 10 minutes the connectivity drops off. Reboot, OK, wait, gone.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;learn-german&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#learn-german&quot; aria-label=&quot;Anchor link for: learn-german&quot;&gt;Learn German&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Maybe it&#x27;s because I&#x27;m a native English speaker that I didn&#x27;t do this before, but I
thought I&#x27;d look more in depth at the Netcup forums and found &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;forum.netcup.de&#x2F;administration-of-a-server-vserver&#x2F;vserver-server-kvm-server&#x2F;p166679-freebsd-12-1-probleme-ipv6&#x2F;#post166679&quot;&gt;this thread by a German speaker having the same issues&lt;&#x2F;a&gt;. Fortunately, in browser translate was able to translate it for me and I was able to get the gist of what was going on.&lt;br &#x2F;&gt;
&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;forum.netcup.de&#x2F;administration-of-a-server-vserver&#x2F;vserver-server-kvm-server&#x2F;p166679-freebsd-12-1-probleme-ipv6&#x2F;#post166679&quot;&gt;This post in particular&lt;&#x2F;a&gt; was interesting, along with &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;forum.netcup.de&#x2F;administration-of-a-server-vserver&#x2F;vserver-server-kvm-server&#x2F;p166782-freebsd-12-1-probleme-ipv6&#x2F;#post166782&quot;&gt;this post by the same author&lt;&#x2F;a&gt; - they suggest two things I&#x27;ve tried before - using a &#x2F;48 prefix instead of &#x2F;64, and setting a route for the actual gateway address (not the &lt;code&gt;fe80::1&lt;&#x2F;code&gt; address), but I didn&#x27;t try them both at the same time!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;let-s-try-those-together&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#let-s-try-those-together&quot; aria-label=&quot;Anchor link for: let-s-try-those-together&quot;&gt;Let&#x27;s try those together!&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I&#x27;ll get my default gateway via &lt;code&gt;traceroute6&lt;&#x2F;code&gt; again&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; traceroute6 netcup.de&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;traceroute6&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; to netcup.de&lt;&#x2F;span&gt;&lt;span&gt; (2a03:4000::e01e) from 2a03:4000:AAAA:BBBB:cccc:dddd:eeee:ffff, 64 hops max, 28 byte packets&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;  2a03:4000:AAAA::2&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;  0.472&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ms&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;  1.058&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ms&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;  0.604&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ms&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Pop that in my &lt;code&gt;rc.conf&lt;&#x2F;code&gt; and also change my prefix to &#x2F;48 while I&#x27;m there.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ifconfig_vtnet0_ipv6=&amp;quot;inet6 2a03:4000:AAAA:BBBB:cccc:dddd:eeee:ffff&#x2F;48&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ipv6_defaultrouter=&amp;quot;2a03:4000:AAAA::2&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Reboot. It&#x27;s working. Wait. It&#x27;s still working! Wait a little longer. Still working!&lt;br &#x2F;&gt;
This is progress! &lt;code&gt;ping6&lt;&#x2F;code&gt;s and &lt;code&gt;curl&lt;&#x2F;code&gt;s are working great!&lt;br &#x2F;&gt;
Oh, incoming connections aren&#x27;t so good...&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# From another host&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; ping6 2a03:4000:AAAA:BBBB:cccc:dddd:eeee:ffff&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;From&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; 2a00:11c0:AA:B::fff icmp_seq=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; Destination unreachable: Address unreachable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;From&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; 2a00:11c0:AA:B::fff icmp_seq=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;5&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; Destination unreachable: Address unreachable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;From&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; 2a00:11c0:AA:B::fff icmp_seq=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;6&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; Destination unreachable: Address unreachable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So &lt;code&gt;ping6&lt;&#x2F;code&gt;s go out OK, but nothing is coming in.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;switching-not-routing&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#switching-not-routing&quot; aria-label=&quot;Anchor link for: switching-not-routing&quot;&gt;Switching, not routing&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;As previously mentioned, Netcup switches their IPv6 addresses, they don&#x27;t route them.
I&#x27;m not going to pretend I know exactly what this means, but it feels to me that it&#x27;s
likely the gateway could &quot;switch&quot; periodically, and in normal circumstances the &lt;code&gt;fe80::1&lt;&#x2F;code&gt; can be aware of this and cater for it, just not for the BSDs.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;i-wonder&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#i-wonder&quot; aria-label=&quot;Anchor link for: i-wonder&quot;&gt;I wonder...&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;Maybe... I could try switching my default route to another gateway IP? &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;forum.netcup.de&#x2F;administration-of-a-server-vserver&#x2F;vserver-server-kvm-server&#x2F;p166679-freebsd-12-1-probleme-ipv6&#x2F;#post166679&quot;&gt;This Post on the Netcup thread&lt;&#x2F;a&gt; seems to suggest there could be a number of &lt;code&gt;2a03:4000:AAAA::X&lt;&#x2F;code&gt; gateways that could be routers...&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;route&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -6 add default 2a03:4000:AAAA::3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Meanwhile on another host...&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;From&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; 2a00:11c0:AA:B::fff icmp_seq=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; Destination unreachable: Address unreachable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;From&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; 2a00:11c0:AA:B::fff icmp_seq=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;5&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; Destination unreachable: Address unreachable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;From&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; 2a00:11c0:AA:B::fff icmp_seq=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;6&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; Destination unreachable: Address unreachable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;64&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; bytes from 2a03:4000:AAAA:BBBB:cccc:dddd:eeee:ffff: icmp_seq=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;1308&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ttl=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;48&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; time=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;5.62&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ms&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;64&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; bytes from 2a03:4000:AAAA:BBBB:cccc:dddd:eeee:ffff: icmp_seq=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;1309&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ttl=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;48&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; time=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;4.81&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ms&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;64&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; bytes from 2a03:4000:AAAA:BBBB:cccc:dddd:eeee:ffff: icmp_seq=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;1310&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ttl=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;48&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; time=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;5.04&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ms&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;64&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; bytes from 2a03:4000:AAAA:BBBB:cccc:dddd:eeee:ffff: icmp_seq=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;1311&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ttl=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;48&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; time=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;4.80&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ms&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;PROGRESS!&lt;&#x2F;p&gt;
&lt;h3 id=&quot;all-good-things&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#all-good-things&quot; aria-label=&quot;Anchor link for: all-good-things&quot;&gt;All Good things...&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;At this point I&#x27;m excited. I switch my &lt;code&gt;rc.conf&lt;&#x2F;code&gt; to use that different gateway. I haven&#x27;t rebooted yet but I see no reason to just yet. Right now I&#x27;m at about &lt;code&gt;icmp_seq=5000&lt;&#x2F;code&gt; on my outgoing &lt;code&gt;ping6&lt;&#x2F;code&gt;s and incoming are still successful. But... on my remote server...&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;64&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; bytes from 2a03:4000:AAAA:BBBB:cccc:dddd:eeee:ffff: icmp_seq=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;4504&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ttl=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;48&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; time=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;4.86&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ms&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;64&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; bytes from 2a03:4000:AAAA:BBBB:cccc:dddd:eeee:ffff: icmp_seq=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;4505&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ttl=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;48&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; time=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;4.93&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ms&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;64&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; bytes from 2a03:4000:AAAA:BBBB:cccc:dddd:eeee:ffff: icmp_seq=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;4506&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ttl=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;48&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; time=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;4.81&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ms&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;64&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; bytes from 2a03:4000:AAAA:BBBB:cccc:dddd:eeee:ffff: icmp_seq=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;4507&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ttl=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;48&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; time=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;4.87&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ms&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;From&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; 2a00:11c0:AA:B::fff icmp_seq=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;508&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; Destination unreachable: Address unreachable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;From&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; 2a00:11c0:AA:B::fff icmp_seq=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;509&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; Destination unreachable: Address unreachable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;From&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; 2a00:11c0:AA:B::fff icmp_seq=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;510&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; Destination unreachable: Address unreachable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Drat!&lt;br &#x2F;&gt;
Outgoing &lt;code&gt;ping6&lt;&#x2F;code&gt;s still seem OK though... let&#x27;s switch that default route again&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;route&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -6 add default 2a03:4000:AAAA::2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;and on the other server:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;From&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; 2a00:11c0:AA:B::fff icmp_seq=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; Destination unreachable: Address unreachable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;From&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; 2a00:11c0:AA:B::fff icmp_seq=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;5&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; Destination unreachable: Address unreachable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;From&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; 2a00:11c0:AA:B::fff icmp_seq=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;6&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; Destination unreachable: Address unreachable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;64&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; bytes from 2a03:4000:AAAA:BBBB:cccc:dddd:eeee:ffff: icmp_seq=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;6323&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ttl=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;48&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; time=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;5.42&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ms&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;64&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; bytes from 2a03:4000:AAAA:BBBB:cccc:dddd:eeee:ffff: icmp_seq=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;6324&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ttl=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;48&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; time=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;4.72&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ms&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;64&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; bytes from 2a03:4000:AAAA:BBBB:cccc:dddd:eeee:ffff: icmp_seq=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;6325&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ttl=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;48&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; time=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;5.14&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ms&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;64&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; bytes from 2a03:4000:AAAA:BBBB:cccc:dddd:eeee:ffff: icmp_seq=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;6326&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ttl=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;48&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; time=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;4.94&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; ms&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;OK, so I can dynamically bring connectivity back if&#x2F;when it drops. I can probably script this in some way to happen automatically too. Is it perfect? No, but it&#x27;s something.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;request-for-comments&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#request-for-comments&quot; aria-label=&quot;Anchor link for: request-for-comments&quot;&gt;Request for Comments&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;This is where I am right now. I have a sort-of almost stable IPv6 connection that works most of the time, but it&#x27;s nowhere near ideal. I am continuing my research and I will update this post if&#x2F;when I discover anything that stablises it completely.&lt;br &#x2F;&gt;
In the meantime, I welcome any comments about things that I could do further to help, or, indeed, comments for reasons why I should not have done any of the above. I&#x27;m familiar with networks, but with IPv6 being ignored in the UK my knowledge of it is a little lacking.&lt;&#x2F;p&gt;
&lt;p&gt;If you want to send any comments, please do so either on &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;forums.freebsd.org&#x2F;threads&#x2F;netcup-ipv6-intermittant.96489&#x2F;#post-686757&quot;&gt;this FreeBSD Forum thread&lt;&#x2F;a&gt; or on &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;notnull.space&#x2F;@paul&#x2F;statuses&#x2F;01JHZK2YK2JXJ49NW1V1CV2Y1F&quot;&gt;this Fediverse thread&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;EDIT: I guess I should have found &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;forums.freebsd.org&#x2F;threads&#x2F;how-to-set-ipv6-gateway.68568&#x2F;post-408655&quot;&gt;this post on the FreeBSD forums&lt;&#x2F;a&gt; earlier, which alludes to the same thing.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;updates&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#updates&quot; aria-label=&quot;Anchor link for: updates&quot;&gt;Updates&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;After a while of the above, &lt;code&gt;ndp -a&lt;&#x2F;code&gt; is showing something like the below:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;Neighbor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;                             Linklayer Address  Netif Expire    S Flags&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;fe80::1%vtnet0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;                       **&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;**&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;**&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;**&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;**&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;**&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; vtnet0 20h12m4s  S R&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;2a03:4000:AAAA::2&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;                    **&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;**&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;**&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;**&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;**&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;**&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; vtnet0 23h59m52s S R&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;2a03:4000:AAAA::3&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;                    **&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;**&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;**&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;**&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;**&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;**&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; vtnet0 12s       R R&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So perhaps both gateways are in use? That&#x27;s good I guess.&lt;br &#x2F;&gt;
I&#x27;ve seen, a few times but rarely, my remote &lt;code&gt;ping6&lt;&#x2F;code&gt;s to my Netcup VPS become unreachable
but after a shortwhile it starts working again without any interactions. I&#x27;m &lt;em&gt;hoping&lt;&#x2F;em&gt; this
&quot;self-repair&quot; is something to do with having both routes set up,
meaning I don&#x27;t have to worry about it any more - I just need to set the second gateway
up in my &lt;code&gt;rc.conf&lt;&#x2F;code&gt; as well.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;results&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#results&quot; aria-label=&quot;Anchor link for: results&quot;&gt;Results&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I&#x27;ve had the above in place for a number of hours now and I have to say the stability has been reasonable. A handful of timeouts, but they seem to self-heal.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Joining Debian Linux (Desktop) to an Active Directory Domain</title>
        <published>2025-01-09T15:29:42+00:00</published>
        <updated>2025-01-09T15:29:42+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/joining-debian-to-ad-domain/"/>
        <id>https://paulwilde.uk/ponderings/joining-debian-to-ad-domain/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/joining-debian-to-ad-domain/">&lt;p&gt;I&#x27;ve come across many articles about how to join a linux system to a Microsoft
Active Directory domain and they all work more or less with some tweaking. This is
my article, here describing my own processes for doing it, trying to explain each
bit as it comes.&lt;&#x2F;p&gt;
&lt;p&gt;Part of a &lt;a href=&quot;&#x2F;tags&#x2F;using-linux-in-a-windows-domain&quot;&gt;&quot;Using Linux in a Windows Domain&quot;&lt;&#x2F;a&gt; group of posts.&lt;br &#x2F;&gt;
This article is for desktop Debian Linux - for setting up a PC so it can be used by a standard user of the PC.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;basics&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#basics&quot; aria-label=&quot;Anchor link for: basics&quot;&gt;Basics&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I&#x27;ll be running through the process I use for joining Debian Linux as a desktop to Active Directory. The steps should be fairly generic as they use packages available in most distributions, so adapt to your distro as required.&lt;br &#x2F;&gt;
This follows &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.pierreblazquez.com&#x2F;2024&#x2F;02&#x2F;04&#x2F;how-to-join-debian-12-to-an-active-directory-domain&#x2F;&quot;&gt;this article&lt;&#x2F;a&gt; quite closely, with some changes.&lt;&#x2F;p&gt;
&lt;p&gt;I use &lt;code&gt;neovim&lt;&#x2F;code&gt; as an editor, aliases to &lt;code&gt;vim&lt;&#x2F;code&gt;. If you use another editor then replace &lt;code&gt;vim&lt;&#x2F;code&gt; with your editor i.e. &lt;code&gt;nano&lt;&#x2F;code&gt; in all cases.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;required-packages&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#required-packages&quot; aria-label=&quot;Anchor link for: required-packages&quot;&gt;Required Packages&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;First things first we need the right packages installed. This can be done by the following command:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# apt install realmd sssd samba-common krb5-user adcli libsss-sudo sssd-tools libsasl2-modules-ldap packagekit libpam-mount&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sssd&lt;&#x2F;code&gt; is a set of services and tools to manage the connection to the domain.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;pam&lt;&#x2F;code&gt; handles general user authentication, and creation of mounts for network shares etc.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;realmd&lt;&#x2F;code&gt; is a tool providing a simple way to discover and join domains.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;krb5&lt;&#x2F;code&gt; is a kerberos (authentication token) handler amongst other things.&lt;&#x2F;li&gt;
&lt;li&gt;The other packages like &lt;code&gt;*-ldap&lt;&#x2F;code&gt;, &lt;code&gt;adcli&lt;&#x2F;code&gt; are further tools use for domain administration.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;For the most part, when we say &lt;code&gt;realm&lt;&#x2F;code&gt; we mean your windows &quot;domain name&quot;. We&#x27;ll be using &lt;strong&gt;YOURDOMAIN.LOCAL&lt;&#x2F;strong&gt; as an example.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;joining-the-domain&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#joining-the-domain&quot; aria-label=&quot;Anchor link for: joining-the-domain&quot;&gt;Joining the Domain&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;This is at its simplest a case of configuring basic &lt;code&gt;krb5&lt;&#x2F;code&gt; and using &lt;code&gt;realm join&lt;&#x2F;code&gt; to actually join the domain.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;configuring-krb5&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#configuring-krb5&quot; aria-label=&quot;Anchor link for: configuring-krb5&quot;&gt;Configuring krb5&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Edit the &lt;code&gt;krb5.conf&lt;&#x2F;code&gt; file to set the default realm:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;vim&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; &#x2F;etc&#x2F;krb5.conf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[libdefaults]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;default_realm = YOURDOMAIN.LOCAL # Should be in CAPS&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This will allow the krb5 client to identified the default realm. If you don&#x27;t set this, then a realm will need to be specified with every kerberos request i.e. with &lt;code&gt;kinit&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;realm-join&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#realm-join&quot; aria-label=&quot;Anchor link for: realm-join&quot;&gt;Realm Join&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Realmd handles a massive amount of the work here. It used to be we had to manage a lot of this configuration ourselves, but realm now does a lot of it for us.&lt;&#x2F;p&gt;
&lt;p&gt;You can discover information about the local domain by issuing the below command&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;realm&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; discover&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# or&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;realm&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; discover YOURDOMAIN.LOCAL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If all looks good you can join it&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;realm&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; join --user=&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;your&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; administrator account} YOURDOMAIN.LOCAL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And to check everything is OK&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;realm&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; list&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;which should output something like&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;yourdomain.local&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  type&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;: kerberos&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  realm-name:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; YOURDOMAIN.LOCAL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  domain-name:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; yourdomain.local&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  configured:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; kerberos-member&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  server-software:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; active-directory&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  client-software:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; sssd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  required-package:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; sssd-tools&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  required-package:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; sssd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  required-package:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; libnss-sss&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  required-package:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; libpam-sss&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  required-package:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; adcli&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  required-package:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; samba-common-bin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  login-formats:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; %U@yourdomain.local&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  login-policy:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; allow-realm-logins&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;testing-connection&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#testing-connection&quot; aria-label=&quot;Anchor link for: testing-connection&quot;&gt;Testing Connection&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Technically now the computer is joined to the domain and can authenticate. You can test with:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;kinit&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; {domain user}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #616E88;&quot;&gt; # will authenticate as that user&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;klist&lt;&#x2F;span&gt;&lt;span style=&quot;color: #616E88;&quot;&gt; # to show the kerberos token validity&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;kdestroy&lt;&#x2F;span&gt;&lt;span style=&quot;color: #616E88;&quot;&gt; # deauthenticate as that user&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Or, of course, log out and back in as a domain user account.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;tuning-sssd&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#tuning-sssd&quot; aria-label=&quot;Anchor link for: tuning-sssd&quot;&gt;Tuning SSSD&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Open up your &lt;code&gt;&#x2F;etc&#x2F;sssd&#x2F;sssd.conf&lt;&#x2F;code&gt; file and make a few tweaks&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;vim&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; &#x2F;etc&#x2F;sssd&#x2F;sssd.conf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Most of this will already be completed in your file as realmd handled it. But check over
it anyway.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[sssd]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;domains = yourdomain.local&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;config_file_version = 2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#services = nss, pam # commented out as these are socket units which are dynamically handled by systemd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;implicit_pac_responder = false # having set to true allegedly crashed some SSSD services. It&amp;#39;s not essential.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[domain&#x2F;yourdomain.local]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;access_provider = ad&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;id_provider = ad&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;default_shell = &#x2F;bin&#x2F;bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;krb5_store_password_if_offline = True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;cache_credentials = True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;krb5_realm = YOURDOMAIN.LOCAL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;krb5_ccachedir = &#x2F;tmp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;krb5_ccname_template = FILE:%d&#x2F;.krb5cc_%U&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;full_name_format = %1$s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;realmd_tags = manages-system joined-with-adcli&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fallback_homedir = &#x2F;home&#x2F;%u@%d&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;override_homedir = &#x2F;home&#x2F;%u@%d&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ad_domain = yourdomain.local&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;use_fully_qualified_names = False&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ldap_id_mapping = True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;dydns_update = False&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# This next one was a real fix for me. I had some issues where a Group Policy was unreadable which crashed SSSD and prevented the user from logging in. Windows would silently ignore it, so never an issue. I like the fact it was highlighted to me, but is not ideal for a production machine where people need to log in. So we ignore unreadable GPOs.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ad_gpo_ignore_unreadable = True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now update the PAM modules&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;pam-auth-update&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;and make sure to check &lt;code&gt;[*] Create home directory on login&lt;&#x2F;code&gt; is enabled.&lt;br &#x2F;&gt;
This will allow the system to validate the user again the domain, create the user&#x27;s home directory and mount the user&#x27;s network shares if set.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;sudo&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#sudo&quot; aria-label=&quot;Anchor link for: sudo&quot;&gt;Sudo&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;There&#x27;s a chance you may want domain administrators to have sudo privileges. This can be done by adding the following line to &lt;code&gt;&#x2F;etc&#x2F;sudoers&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;%domainadmins   ALL=(ALL:ALL) ALL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;samba&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#samba&quot; aria-label=&quot;Anchor link for: samba&quot;&gt;Samba&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Having Samba configured also helps streamline connectivity to network shares.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;vim&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; &#x2F;etc&#x2F;samba&#x2F;smb.conf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[global]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  workgroup = yourdomain.local&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  realm = YOURDOMAIN.LOCAL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  encrypt passwords = yes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  client protection = encrypt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;There are a couple of further notes regarding GVFS and automatically mounting network shares in &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.pierreblazquez.com&#x2F;2024&#x2F;02&#x2F;04&#x2F;how-to-join-debian-12-to-an-active-directory-domain&#x2F;&quot;&gt;the article mentioned at the start&lt;&#x2F;a&gt;, if you need those things in place I recommend checking through that article as well.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;testing&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#testing&quot; aria-label=&quot;Anchor link for: testing&quot;&gt;Testing.&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;We should be good to go. Let&#x27;s run some tests.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;are-services-running&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#are-services-running&quot; aria-label=&quot;Anchor link for: are-services-running&quot;&gt;Are services running?&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;systemctl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; status&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# If the state is `degraded` you can see failed services by running this command&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;systemctl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; list-units --failed&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I experienced some issues with SSSD failing due to unreadable GPOs mentioned above. I discovered SSSD crashed when trying to log in, and adding the SSSD option to ignore unreadable GPOs fixed it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;login&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#login&quot; aria-label=&quot;Anchor link for: login&quot;&gt;Login&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Great! We&#x27;re here. Now we can log in.
Either log in using the desktop login screen, or from a terminal enter:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;login&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; {user name}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;to log in as that user. The home directory should be created during login and everything is ready to go.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;automatically-mounting-shared-folders&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#automatically-mounting-shared-folders&quot; aria-label=&quot;Anchor link for: automatically-mounting-shared-folders&quot;&gt;Automatically Mounting Shared Folders&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;You can edit &lt;code&gt;&#x2F;etc&#x2F;security&#x2F;pam_mount.conf.xml&lt;&#x2F;code&gt; to enable automatic mounting of shared folders at login. I have had mixed success with this, but I&#x27;ll put it here anyway:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...prefilled content...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;&amp;lt;!-- this should go somewhere before the `&amp;lt;mkmountpoint ... &amp;gt;` block.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;                &amp;lt;volume&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;                        fstype=&amp;quot;cifs&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;                        sgrp=&amp;quot;domain users&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;                        server=&amp;quot;yourserver.yourdomain.local&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;                        path=&amp;quot;share&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;                        mountpoint=&amp;quot;~&#x2F;Network Drives&#x2F;Share&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;                        options=&amp;quot;vers=3.0,sec=krb5i,cruid=%(USERUID),nodev,nosuid,noexec,rw&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;                &#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;...prefilled content...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
    </entry>
    <entry xml:lang="en">
        <title>Accused of Hacking</title>
        <published>2025-01-06T18:45:00+00:00</published>
        <updated>2025-07-22T08:49:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/robots-aint-hacking/"/>
        <id>https://paulwilde.uk/ponderings/robots-aint-hacking/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/robots-aint-hacking/">&lt;p&gt;About 5 years years ago, during a security sweep of a new &quot;app&quot; a
client had started using, I discovered the hosting company&#x27;s website
had a robots.txt giving the paths of many pages on their website containing
sensitive information.&lt;br &#x2F;&gt;
The whole thing is starting to snowball, so this is my statement.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;div class=&quot;notice yellow&quot;&gt; 
&lt;p&gt;Update: 22&#x2F;07&#x2F;2025 - Finally, some actions are being taken. More information
at the &lt;a href=&quot;https:&#x2F;&#x2F;paulwilde.uk&#x2F;ponderings&#x2F;robots-aint-hacking&#x2F;#someone-finally-understands&quot;&gt;bottom of the page&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;h3 id=&quot;the-app&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-app&quot; aria-label=&quot;Anchor link for: the-app&quot;&gt;The &quot;App&quot;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;For those that don&#x27;t know me, I am an IT Professional, providing IT consultancy
services to businesses around my local area of Devon, UK.&lt;br &#x2F;&gt;
I&#x27;m generally met with people who are happy to see me and trust my advice.
Sometimes though that is not the case.&lt;&#x2F;p&gt;
&lt;p&gt;My client in question is a medium sized business in Devon. They employ
approximately 70-100 staffmembers and have been in operation for over 60 years.&lt;br &#x2F;&gt;
They are a well known local business.&lt;br &#x2F;&gt;
Due to running a business this size, they naturally have outsourced some
workloads to third-parties, specifically for this case, Health and Safety. They
use the services of a Chartered Health and Safety Consultancy used by many other local businesses.&lt;br &#x2F;&gt;
For whatever reason, this H&amp;amp;S company had decided they could make &quot;apps&quot; for their
clients to assist with entering H&amp;amp;S information amongst other things. Seems like a good idea, sure... but...&lt;&#x2F;p&gt;
&lt;p&gt;...These &quot;apps&quot; are not apps at all, they are in fact simple html index pages linking to various Jotform Forms, Google Sheets, etc. These html index pages are, for the most part, &lt;em&gt;unauthenticated&lt;&#x2F;em&gt;. This means anybody who knows the link to that page can access those forms and spreadsheets.&lt;&#x2F;p&gt;
&lt;p&gt;As an example, if a random passer by on the internet was to go to a URL like &lt;code&gt;https:&#x2F;&#x2F;thecompanyswebsite.com&#x2F;someothercompany_portal.html&lt;&#x2F;code&gt; they would be shown a list of links
to various Health and Safety, Vehicle checks, holiday request forms, etc. All of which could be filled out without having to prove who they are.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;why-is-this-bad&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#why-is-this-bad&quot; aria-label=&quot;Anchor link for: why-is-this-bad&quot;&gt;Why is this bad?&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;OK, well maybe that doesn&#x27;t look so bad. I mean, you&#x27;d have to know what the path of the page is (the &lt;code&gt;someothercompany_portal.html&lt;&#x2F;code&gt; bit) right? Well, yes, you would but that
should never be a defense, ever. Even if a URL is difficult to guess (it&#x27;s not), it does not mean it&#x27;s impossible.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;robots-txt&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#robots-txt&quot; aria-label=&quot;Anchor link for: robots-txt&quot;&gt;Robots.txt&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Yep, the portal URL may be difficult to guess (they&#x27;re not), and if it was just that alone things may be OK.&lt;br &#x2F;&gt;
But...&lt;br &#x2F;&gt;
This Health and Safety Company also had to good sense not to let search engines index
those portal pages. We don&#x27;t want people&#x27;s sensitive information being indexed by Google do we! Very Good.&lt;&#x2F;p&gt;
&lt;p&gt;Ah...&lt;&#x2F;p&gt;
&lt;p&gt;The robots.txt looks something like this:
&lt;img src=&quot;&#x2F;images&#x2F;robotstxt.png&quot; alt=&quot;A robots.txt file, showing many lines of portal URL addresses&quot; &#x2F;&gt;&lt;br &#x2F;&gt;
There&#x27;s about 510 lines like that.&lt;br &#x2F;&gt;
(You&#x27;ll notice I have taken the care to pixelise out the paths. I appreciate
pixalisation can be undone, but due to the fact you&#x27;d need to know the base URL
for this to work, and if you had the base URL, you&#x27;d have the full robots.txt file
anyway, I feel no further actions on my part need to be taken here.)&lt;&#x2F;p&gt;
&lt;p&gt;For the uninitiated, this robots.txt means that Google, Bing, DuckDuckGo, etc. will never try to index any content on any of those paths. However, this does &lt;em&gt;absolutely nothing&lt;&#x2F;em&gt; to stop
a badly behaved or malicious webcrawler&#x2F;bot - In fact, this file will act as a lovely index to tell that webcrawler&#x2F;bot exactly what pages you &lt;em&gt;don&#x27;t&lt;&#x2F;em&gt; want it to see.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;privacy&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#privacy&quot; aria-label=&quot;Anchor link for: privacy&quot;&gt;Privacy&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Once again, on face value this just looks like someone will gain access to fill out forms and be a nuisance to the client business. However, on further investigation I
have discovered that some of these URLs contain plaintext information such as
names, email addresses, and telephone numbers of staff members.
In one particularely negligent case (which I only found today), names of parents and their children, including dates of birth, telephone numbers, email addresses of the parent &lt;em&gt;plus&lt;&#x2F;em&gt; their signatures &lt;em&gt;and&lt;&#x2F;em&gt; names, email addresses, telephones numbers and signatures of that child&#x27;s sporting coach.&lt;&#x2F;p&gt;
&lt;p&gt;That last case is extreme, but it&#x27;s there, in plain sight, for anyone who happens
to find the right base URL and path of that particular case.&lt;&#x2F;p&gt;
&lt;p&gt;In short, This. Is. Negligent.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-i-have-done-so-far&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-i-have-done-so-far&quot; aria-label=&quot;Anchor link for: what-i-have-done-so-far&quot;&gt;What I have done so far&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;As I say, I first noticed this about 5 years ago, and immediately informed my client, and
the Health and Safety company involved about it. I ended up being invited to a meeting with them all, and explained my findings and told them these pages should, at the very least, be behind some kind of authentication. From this they decided they would put in
some authentication - but only as groups, i.e. office@clientem.ail, warehouse@clientem.ail etc. and not per user.&lt;br &#x2F;&gt;
Shocking. But at least it was something.&lt;br &#x2F;&gt;
Although... it isn&#x27;t something... they only did it for my client, so perhaps they just
wanted to shut me up. I don&#x27;t know. But other paths remained without authentication.&lt;br &#x2F;&gt;
As time went on, new &quot;apps&quot; for my client appeared (once again without authentication) and so I warned my client about it again, and again, and again.&lt;br &#x2F;&gt;
Over the last week this has reared it&#x27;s ugly head again. I once again provided warning to my client with reasons why.&lt;br &#x2F;&gt;
Humourously, my client forwarded my email to the Health and Safety company and their response to it went like the below:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;We are in the process of modifying our own internal app and it is not normally &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;publicly available, and has now been returned to password protection. To of &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;found the URL for our own internal app would of taken more than bad acting, &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;and probably more aligned with IT guru &#x2F; junior hacker.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&quot;Not normally publicy available&quot;?! Well, I&#x27;ve seen it publicly available for 5 years.
&quot;To have found the URL for our own interal app ... hacker&quot;!? Erm... no. I&#x27;ve proved already this can be found by anyone just looking around, no hacking required (well, no authentication required, so nothing to hack).&lt;&#x2F;p&gt;
&lt;h3 id=&quot;my-actions&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#my-actions&quot; aria-label=&quot;Anchor link for: my-actions&quot;&gt;My Actions&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;OK, they haven&#x27;t &quot;accused&quot; me of hacking, but it&#x27;s close.&lt;&#x2F;p&gt;
&lt;p&gt;I have not dignified that email with a response. But, I have reported the Health and Safety company to the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;ico.org.uk&#x2F;&quot;&gt;ICO&lt;&#x2F;a&gt;, providing links to the robots.txt page
and the direct URL of the page containing parents and child information mentioned above. I&#x27;ll let them deal with it from here.&lt;br &#x2F;&gt;
However, as the term &quot;hacker&quot; has been used, and I am &lt;em&gt;very&lt;&#x2F;em&gt; aware of &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;arstechnica.com&#x2F;tech-policy&#x2F;2021&#x2F;10&#x2F;viewing-website-html-code-is-not-illegal-or-hacking-prof-tells-missouri-gov&#x2F;&quot;&gt;court cases that have happened&lt;&#x2F;a&gt; where a good samaritan trying to help protect people, has instead been victimised and made out to be the &quot;malcious hacker&quot;
because people simply do not understand how the internet works.&lt;&#x2F;p&gt;
&lt;p&gt;So, in the fear something like that could happen to me, this article is my statement.
I ask anyone actively involved in System Administration, Cyber Security, Data Protection, etc. to please get involved and share this article.&lt;br &#x2F;&gt;
If you like, you can join in on &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;notnull.space&#x2F;@paul&#x2F;statuses&#x2F;01JGYD9TM2QMDKEP55495DK0GH&quot;&gt;this Fediverse&#x2F;Mastodon thread&lt;&#x2F;a&gt; too.&lt;&#x2F;p&gt;
&lt;p&gt;Thank you for reading. I&#x27;m a bad writer and I don&#x27;t write much, but I really needed to vent this, and put it somewhere for all to see.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;someone-finally-understands&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#someone-finally-understands&quot; aria-label=&quot;Anchor link for: someone-finally-understands&quot;&gt;Someone Finally Understands!&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I&#x27;m tired of this situation, but on the 21&#x2F;07&#x2F;2025 it all came up again.
The same things happened: I make my concerns known, the system provider says
the same &quot;would take bad acting&quot; comments, but this time a few extra things happened:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;I lose my rag a bit, and ultimately say what I&#x27;ve been needing the confidence
to say to them for ages - &quot;If their security is &#x27;Only hackers can get in&#x27;,
that isn&#x27;t security. Not in the slightest.&quot;&lt;&#x2F;li&gt;
&lt;li&gt;I point out it&#x27;s not just personal information on the site, it also
includes the business internal price lists and other business sensitive information.&lt;&#x2F;li&gt;
&lt;li&gt;I provide my client a link to another client&#x27;s &quot;portal&quot; on the same system
to demonstrate how this affects another client. (I took care to find a client
with little to no sensitive information so as to not trouble them too much.
I apologise to this other company, but I needed to prove my point.)&lt;&#x2F;li&gt;
&lt;li&gt;Somebody actually understood!&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;The fact the business price lists were involved hit a note, definitely, but...
Someone understood! This person within the company, new to this situation,
was able to actively use the link I sent them for the other company&#x27;s &quot;portal&quot;,
look back at the &lt;code&gt;robots.txt&lt;&#x2F;code&gt; file, then proceed to access anything and
everything they wished to. Ultimately, proving beyond a shadow of a doubt
that no hacking is required!&lt;br &#x2F;&gt;
Thank you to this person! You have just saved me!&lt;&#x2F;p&gt;
&lt;p&gt;Things, for my client at least, are now being taken down (at least, I&#x27;m told
they are). Still a bit of a sticking point due to &quot;inconvenience&quot; of losing
access to the documents and forms, but you, dear reader, and I both know this
is moot. If we have to make a choice between convenience and security, security wins.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Norg Backup Utility</title>
        <published>2024-08-18T16:08:00+00:00</published>
        <updated>2024-08-18T16:08:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/norg/"/>
        <id>https://paulwilde.uk/ponderings/norg/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/norg/">&lt;h1 id=&quot;norg&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#norg&quot; aria-label=&quot;Anchor link for: norg&quot;&gt;Norg&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;A simple, portable, wrapper for the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.borgbackup.org&quot;&gt;borg backup&lt;&#x2F;a&gt; and &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;restic.net&quot;&gt;restic&lt;&#x2F;a&gt; utilities written in Nim.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;Inspired by &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;torsion.org&#x2F;borgmatic&quot;&gt;Borgmatic&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;usage&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#usage&quot; aria-label=&quot;Anchor link for: usage&quot;&gt;Usage&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Norg uses a &lt;code&gt;toml&lt;&#x2F;code&gt; based config file for configuration. An example configuration would look like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;source_directories&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; = [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;&#x2F;home&#x2F;me&#x2F;Music&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;&#x2F;home&#x2F;me&#x2F;Pictures&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;[[&lt;&#x2F;span&gt;&lt;span&gt;repositories&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;]]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;label&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; = &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;MyBorgRepo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; = &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;&#x2F;my&#x2F;backup&#x2F;location&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;[[&lt;&#x2F;span&gt;&lt;span&gt;repositories&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;]]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;label&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; = &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Another Respository at BorgBase&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; = &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;ssh:&#x2F;&#x2F;1234abcd@1234abcd.repo.borgbase.com&#x2F;.&#x2F;repo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;encryption&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;encryption_passphrase&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; = &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;MyReallySecurePassword&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;actions&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;before_actions&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; = [&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;echo before actions&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;after_actions&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; = [&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;echo after actions&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;echo actions completed&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;before_backup&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; = [&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;echo before backup&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;date&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;after_backup&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; = [&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;echo after backup&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;,&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;echo backup completed&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;uptimekuma&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;base_url&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; = &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;https:&#x2F;&#x2F;uptime.kuma.url&#x2F;api&#x2F;push&#x2F;1234abcd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;states&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; = [&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Success&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;,&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Failure&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Running&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You can then run the equivalent &lt;code&gt;borg&lt;&#x2F;code&gt; or &lt;code&gt;restic&lt;&#x2F;code&gt; command to init, create, list, mount and extract your backups.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Using BorgBackup&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Init your repository&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;norg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -c myconfig.toml init&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Backup your data&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;norg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -c myconfig.toml create&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# List Archives&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;norg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -c myconfig.toml list&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Mount an Archive&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;norg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -c myconfig.toml mount -r MyBorgRepo -a pcname-2024-08-18T15:20:17773204 &#x2F;home&#x2F;me&#x2F;mnt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Unmount an Archive&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;norg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -c myconfig.toml umount -r MyBorgRepo &#x2F;home&#x2F;me&#x2F;mnt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Extract an Archive&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# You must be in an empty folder for this to work&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;norg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -c myconfig.toml extract -r MyBorgRepo -a pcname-2024-08-18T15:20:17773204&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Or You must set the destination to an empty folder&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;norg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -c myconfig.toml extract -r MyBorgRepo -a pcname-2024-08-18T15:20:17773204 --destination &#x2F;tmp&#x2F;my_extracted_archive&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Prune all repos&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;norg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -c myconfig.toml prune&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Or specify a particula repo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;norg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -c myconfig.toml prune -r MyBorgRepo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Delete an Archive&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;norg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -c myconfig.toml delete -r MyBorgRepo -a pcname-2024-08-18T15:20:17773204&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Using Restic&lt;&#x2F;strong&gt; &lt;em&gt;New in v0.1.6&lt;&#x2F;em&gt;
Add a repository with a &lt;code&gt;tool = &quot;restic&quot;&lt;&#x2F;code&gt; option.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;[[&lt;&#x2F;span&gt;&lt;span&gt;repositories&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;]]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;label&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; = &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;MyResticRepo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; = &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;&#x2F;my&#x2F;restic&#x2F;backup&#x2F;location&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;tool&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; = &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;restic&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then run the appropriate commands&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Init your repository&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;norg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -c myconfig.toml init&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Backup your data&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;norg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -c myconfig.toml backup&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# List Snapshots&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;norg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -c myconfig.toml snapshots&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Mount a Repo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;norg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -c myconfig.toml mount -r MyResticRepo &#x2F;home&#x2F;me&#x2F;mnt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Restore an Archive (restore destination must be empty)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;norg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -c myconfig.toml restore -a latest --destination &#x2F;my&#x2F;restore&#x2F;location&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Prune a repo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;norg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -c myconfig.toml prune&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# Forget a Snapshot&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;norg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -c myconfig.toml forget -r MyBorgRepo -a a1b2c3d4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;command-line-parameters&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#command-line-parameters&quot; aria-label=&quot;Anchor link for: command-line-parameters&quot;&gt;Command line parameters&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-c&lt;&#x2F;code&gt;, &lt;code&gt;--config&lt;&#x2F;code&gt;: The configuration file to use&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;-r&lt;&#x2F;code&gt;, &lt;code&gt;--repository&lt;&#x2F;code&gt;: The repository to work on&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;-a&lt;&#x2F;code&gt;, &lt;code&gt;--archive&lt;&#x2F;code&gt;: The Archive to operate on (snapshots for restic)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;-d&lt;&#x2F;code&gt;, &lt;code&gt;--destination&lt;&#x2F;code&gt;: When extracting&#x2F;restoring, the destination for the extracted files&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;build-from-source&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#build-from-source&quot; aria-label=&quot;Anchor link for: build-from-source&quot;&gt;Build from Source&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Download and build from source&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; clone https:&#x2F;&#x2F;codeberg.org&#x2F;pswilde&#x2F;norgbackup&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; norgbackup&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;nimble&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; install&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;or just install directly with &lt;code&gt;nimble&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;nimble&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; install https:&#x2F;&#x2F;codeberg.org&#x2F;pswilde&#x2F;norgbackup&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;system-support&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#system-support&quot; aria-label=&quot;Anchor link for: system-support&quot;&gt;System Support&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Norg should work on any system that can compile &lt;code&gt;nim&lt;&#x2F;code&gt; code with &lt;code&gt;nimble&lt;&#x2F;code&gt;.
Tested on:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Arch Linux&lt;&#x2F;li&gt;
&lt;li&gt;Debian Linux&lt;&#x2F;li&gt;
&lt;li&gt;AlmaLinux&lt;&#x2F;li&gt;
&lt;li&gt;FreeBSD&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;But in general all Linux distributions and BSDs should work if borg and&#x2F;or restic is installed.
Windows support (Restic only until Borg support in Windows is available) is planned with the only real issue being finding the restic executable. Should be an easy fix.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;naming-why-norg&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#naming-why-norg&quot; aria-label=&quot;Anchor link for: naming-why-norg&quot;&gt;Naming. Why &quot;Norg&quot;?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Well, I don&#x27;t know. I&#x27;m a Star Trek fan so obviously I wanted to keep something
in line with the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;memory-alpha.fandom.com&#x2F;wiki&#x2F;Borg&quot;&gt;Borg pseudo-species&lt;&#x2F;a&gt; as the borg backup utility does.
Also, sometimes I feel my code has elements of inexperience but loads of potential... which reminded me of &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;memory-alpha.fandom.com&#x2F;wiki&#x2F;Nog&quot;&gt;Nog&lt;&#x2F;a&gt;.
So, simply put, &lt;code&gt;Norg&lt;&#x2F;code&gt; is an portmanteau of &quot;Borg&quot; and &quot;Nog&quot;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;borg-and-restic-notes&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#borg-and-restic-notes&quot; aria-label=&quot;Anchor link for: borg-and-restic-notes&quot;&gt;Borg and Restic Notes&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I love both Borg and Restic tools, they are both great and both have their pros and cons. As &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;borgbase.com&quot;&gt;BorgBase&lt;&#x2F;a&gt; has repos for both, I felt it only sensible to
provide a tool that can use both.
Providing implementation for both means you could have duplicate backups using
different tools which should provide a certain amount of protection over failures in
a particular tool.
Caution should be taken when using additional flags when you have repositories of
both types in the same configuration file. I have tried to cater for some common flags
that will be converted to the correct type for a particular tool, but this may not always be the case. If in any doubt, it is advised to use the &lt;code&gt;--repository&lt;&#x2F;code&gt; flag for any borg&#x2F;restic specific flags so as not to cause one the other tool to fail.&lt;&#x2F;p&gt;
&lt;p&gt;Some different yet similar commands should be converted to the correct type. A table below shows some of these:
| Borg Command | Restic Command             | Result                                     |
| create       | backup                     | creates a backup                           |
| list         | snapshots                  | lists archives&#x2F;snapshots                   |
| extract      | restore                    | restores&#x2F;extracts a backup                 |
| delete       | forget                     | removes a archive&#x2F;snapshot                 |
| prune        | forget (with --prune flag) | removes snapshots as per &lt;code&gt;--keep-*&lt;&#x2F;code&gt; config |&lt;&#x2F;p&gt;
&lt;p&gt;You may specify either command and it will work with both except the &lt;code&gt;forget&lt;&#x2F;code&gt; command. This will only forget a single snapshot in restic.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-create-this-when-borgmatic-exists&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#why-create-this-when-borgmatic-exists&quot; aria-label=&quot;Anchor link for: why-create-this-when-borgmatic-exists&quot;&gt;Why create this when Borgmatic exists?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;Borgmatic&lt;&#x2F;code&gt; is absolutely fantastic, and I love it dearly. I even implemented
the &lt;code&gt;Uptime Kuma&lt;&#x2F;code&gt; hook that is in it. However, I got a little impatient waiting
for the version that included the Uptime Kuma hook to arrive in various distributions
package repositories so ended up building borgmatic from source on all computers.
This was a lengthy process, and borgmatic isn&#x27;t very portable; it requires installation of numerous python packages (and the entire rust language in FreeBSD).
I wanted to make something that had to features I needed, in a single binary I
could move around to whatever computer I needed it on.
Norg was the outcome of this.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;work-in-progress&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#work-in-progress&quot; aria-label=&quot;Anchor link for: work-in-progress&quot;&gt;Work in Progress&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Norg is still very much a work in progress, so there will be bugs. Please raise
and issue, or create a pull request for any issues and resolutions you may have.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;contact&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#contact&quot; aria-label=&quot;Anchor link for: contact&quot;&gt;Contact&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;For any issues, please raise an issue here. Otherwise, I can be contacted via
the fediverse at &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;notnull.space&#x2F;@paul&quot;&gt;@paul@notnull.space&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>BatMon</title>
        <published>2024-07-29T21:16:00+00:00</published>
        <updated>2024-07-29T21:16:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/batmon/"/>
        <id>https://paulwilde.uk/ponderings/batmon/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/batmon/">&lt;p&gt;A simple battery monitor tool that can notify you on battery status changes for FreeBSD.&lt;br &#x2F;&gt;
Inspired by but in no way similar to &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;electrickite&#x2F;batsignal&quot;&gt;batsignal&lt;&#x2F;a&gt; - inspiring the basic function only.
Written in pure &lt;a href=&quot;https:&#x2F;&#x2F;paulwilde.uk&#x2F;ponderings&#x2F;batmon&#x2F;https&#x2F;nim-lang.org&quot;&gt;Nim&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;requirements&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#requirements&quot; aria-label=&quot;Anchor link for: requirements&quot;&gt;Requirements&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;run-requirements&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#run-requirements&quot; aria-label=&quot;Anchor link for: run-requirements&quot;&gt;Run Requirements&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;apm&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;notify-send&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;build-requirements&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#build-requirements&quot; aria-label=&quot;Anchor link for: build-requirements&quot;&gt;Build Requirements&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nim&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;nimble&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;installation&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#installation&quot; aria-label=&quot;Anchor link for: installation&quot;&gt;Installation&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;To install into your &lt;code&gt;.nimble&#x2F;bin&lt;&#x2F;code&gt; directory&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; clone https:&#x2F;&#x2F;codeberg.org&#x2F;pswilde&#x2F;batmon&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt; cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; batmon&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;nimble&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; install&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;running&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#running&quot; aria-label=&quot;Anchor link for: running&quot;&gt;Running&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# To run the daemon server notifier, just run:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;batmon&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -d&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# To run once and just show battery level, run:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;batmon&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -o&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;using&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#using&quot; aria-label=&quot;Anchor link for: using&quot;&gt;Using&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;When importing Batmon as a module you have access to the &lt;code&gt;get_battery_status()&lt;&#x2F;code&gt;
procedure which will return a &lt;code&gt;Battery&lt;&#x2F;code&gt; object you can use elsewhere.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;battery-type&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#battery-type&quot; aria-label=&quot;Anchor link for: battery-type&quot;&gt;Battery Type&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;nim&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;type&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;  Battery&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;* = object&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;*:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt; Status&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    charge&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;*: float&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;  Status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;* = enum&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;    High&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;    Low&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;    Critical&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;    Charging&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;    Unknown&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Also, you have access to the notification handler module, where you can build
and send your own notifications:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;nim&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;var&lt;&#x2F;span&gt;&lt;span&gt; n &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt; newNotification&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Title&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Body&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, urgency &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt; Normal&lt;&#x2F;span&gt;&lt;span&gt; , timeout &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 5000&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;discard&lt;&#x2F;span&gt;&lt;span&gt; n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;send&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
    </entry>
    <entry xml:lang="en">
        <title>TootInstall</title>
        <published>2024-07-29T14:18:00+00:00</published>
        <updated>2024-07-29T14:18:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/tootinstall-concept/"/>
        <id>https://paulwilde.uk/ponderings/tootinstall-concept/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/tootinstall-concept/">&lt;h2 id=&quot;tootinstall-concept&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#tootinstall-concept&quot; aria-label=&quot;Anchor link for: tootinstall-concept&quot;&gt;TootInstall Concept&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;status-of-this-memo&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#status-of-this-memo&quot; aria-label=&quot;Anchor link for: status-of-this-memo&quot;&gt;Status of this Memo&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;This memo defines a conceptual protocol for software build and install scripts
for varying platforms published via Fediverse (ActivityPub i.e Mastodon, et al) posts.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h3 id=&quot;overview&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#overview&quot; aria-label=&quot;Anchor link for: overview&quot;&gt;Overview&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;These days, the options for software build and install processes are many,
and jumping through the hoops required for some operating systems can be
troublesome and sometimes impossible.&lt;br &#x2F;&gt;
Additionally, having to maintain many published packages for varying platforms
is laborious, and sometimes means packages in some platforms become out of date
and unmaintained.&lt;br &#x2F;&gt;
The TootInstall concept aims to bypass many of these requirements in an effort
to have build and install scripts available for any application available on a
decentralized, federated, all-accessible platform.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;usage-by-developers&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#usage-by-developers&quot; aria-label=&quot;Anchor link for: usage-by-developers&quot;&gt;Usage - by Developers&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;A software developer or package maintainer would post their script using their
preferred federated ActivityPub service, and mention a &lt;code&gt;tootinstall bot&lt;&#x2F;code&gt;
(i.e. &lt;code&gt;@tootinstall_bot@tootinstall.example&lt;&#x2F;code&gt;). The &lt;code&gt;tootinstall bot&lt;&#x2F;code&gt; would then
parse the script and re-post it, giving attribution to the original poster.&lt;&#x2F;p&gt;
&lt;p&gt;It would be in everyone&#x27;s best interests if all package requirements are listed
to ensure all dependencies are satisfied before attempting the install.&lt;&#x2F;p&gt;
&lt;p&gt;For example, a simple &lt;code&gt;tootinstall&lt;&#x2F;code&gt; script may look like the following:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;ini&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@tootinstall_bot@tootinstall.example &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+++&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; = &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;my_package&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;targets&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;linux+amd64&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;linux+arm&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;freebsd+amd64&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;dependencies&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;bash&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+++&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;#!&#x2F;usr&#x2F;bin&#x2F;env bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;git clone https:&#x2F;&#x2F;gitrepo.example&#x2F;me&#x2F;my_package &#x2F;tmp&#x2F;my_package&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;cd &#x2F;tmp&#x2F;my_package&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;cp .&#x2F;my_package &#x2F;usr&#x2F;local&#x2F;bin&#x2F;my_package&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;which the bot would receive, and re-post like so:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;ini&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+++&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; = &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;my_package&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;targets&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;linux+amd64&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;linux+arm&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;freebsd+amd64&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;dependencies&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;bash&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;author&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; = &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;@you@a_mastodon_instance.example&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;date&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; = &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;2024-29-07T14:48:00&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; = &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;pending approval&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;tootinstall_host&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; = &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;packages.tootinstall.example&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+++&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;#!&#x2F;usr&#x2F;bin&#x2F;env bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;git clone https:&#x2F;&#x2F;gitrepo.example&#x2F;me&#x2F;my_package &#x2F;tmp&#x2F;my_package&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;cd &#x2F;tmp&#x2F;my_package&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;cp .&#x2F;my_package.bash &#x2F;usr&#x2F;local&#x2F;bin&#x2F;my_package&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;tootinstall bot&lt;&#x2F;code&gt; should have RSS enabled for their posts, which is then
parsed by a &lt;code&gt;tootinstall helper&lt;&#x2F;code&gt; and collated into a &lt;code&gt;tootinstall database&lt;&#x2F;code&gt; and
published on a &lt;code&gt;tootinstall host&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;usage-by-end-users&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#usage-by-end-users&quot; aria-label=&quot;Anchor link for: usage-by-end-users&quot;&gt;Usage - by End Users&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;An end user only requires a simple portable &lt;code&gt;tootinstall&lt;&#x2F;code&gt; binary which can be
used as follows:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;tootinstall&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; install my_package @packages.tootinstall.example&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;tootinstall-bot&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#tootinstall-bot&quot; aria-label=&quot;Anchor link for: tootinstall-bot&quot;&gt;TootInstall Bot&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;A &lt;code&gt;tootinstall bot&lt;&#x2F;code&gt; is a ActivityPub account that is able to read posts it is
mentioned in, adapt incoming information and create new posts with correctly
formatted &lt;code&gt;tootinstall script&lt;&#x2F;code&gt; text.&lt;&#x2F;p&gt;
&lt;p&gt;It must:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;be able to publish their ActivityPub feed via RSS so a
&lt;code&gt;tootinstall helper&lt;&#x2F;code&gt; is able to easily read posts it sends for new
&lt;code&gt;tootinstall scripts&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;post a &lt;code&gt;tootinstall script&lt;&#x2F;code&gt; as a new post,
not a reply, nor a boost, nor a quote boost, nor anything similar,
to simplify RSS feed handling.&lt;&#x2F;li&gt;
&lt;li&gt;create &#x27;author&#x27;, &#x27;date&#x27;, &#x27;status&#x27;, and
&#x27;tootinstall_host&#x27; tags in the &lt;code&gt;tootinstall script&lt;&#x2F;code&gt; and ignore those in the
original post to prevent information poisoning.&lt;&#x2F;li&gt;
&lt;li&gt;be able to operate a blacklist of accounts&#x2F;instances to prevent spamming&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;It may also be useful if it could:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;receive boosts&#x2F;favourites and forward these on to a &lt;code&gt;tootinstall helper&lt;&#x2F;code&gt;
for approval and scoring purposes (see Approvals and Scoring).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;tootinstall-helper&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#tootinstall-helper&quot; aria-label=&quot;Anchor link for: tootinstall-helper&quot;&gt;TootInstall Helper&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;A &lt;code&gt;tootinstall helper&lt;&#x2F;code&gt; is a background service that can read RSS feeds provided
by configured &lt;code&gt;tootinstall bots&lt;&#x2F;code&gt; collating all new &lt;code&gt;tootinstall scripts&lt;&#x2F;code&gt; it
has posted, store them in a database, and be able to search and return
information about them as requested by a &lt;code&gt;tootinstall&lt;&#x2F;code&gt; user binary.&lt;&#x2F;p&gt;
&lt;p&gt;It must:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;be able to be configured to check multiple &lt;code&gt;tootinstall bot&lt;&#x2F;code&gt; RSS feeds to
allow for a more federated and decentralised service.&lt;&#x2F;li&gt;
&lt;li&gt;be able to write to a persistent database&lt;&#x2F;li&gt;
&lt;li&gt;be able to return a script by name&lt;&#x2F;li&gt;
&lt;li&gt;NOT allow anyone other than the original author or maintainers to update a script&lt;&#x2F;li&gt;
&lt;li&gt;be able to operate a blacklist of accounts&#x2F;instances to prevent spamming&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;It would also be useful if it could:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;increment a version number of a &lt;code&gt;tootinstall script&lt;&#x2F;code&gt; automatically. Incoming version numbers
should be ignored.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;tootinstall-host&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#tootinstall-host&quot; aria-label=&quot;Anchor link for: tootinstall-host&quot;&gt;TootInstall Host&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;A &lt;code&gt;tootinstall host&lt;&#x2F;code&gt; is a web frontend used by &lt;code&gt;tootinstall&lt;&#x2F;code&gt; user binary
that is able to utilise the &lt;code&gt;tootinstall helper&lt;&#x2F;code&gt; to return &lt;code&gt;tootinstall scripts&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;It must:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;be accessible on the internet&lt;&#x2F;li&gt;
&lt;li&gt;be able to search and return a list of packages in &lt;code&gt;json&lt;&#x2F;code&gt; format&lt;&#x2F;li&gt;
&lt;li&gt;be able to return a specific package script by name in &lt;code&gt;toml&lt;&#x2F;code&gt; format&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Endpoint URLs should be as follows:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&#x2F;search?q=package_name&lt;&#x2F;li&gt;
&lt;li&gt;&#x2F;install?p=package_name&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h4 id=&quot;the-tootinstall-bot-helper-and-host-can-all-be-the-same-system-and-do-not-necessarily-need-to-be-separate-services&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-tootinstall-bot-helper-and-host-can-all-be-the-same-system-and-do-not-necessarily-need-to-be-separate-services&quot; aria-label=&quot;Anchor link for: the-tootinstall-bot-helper-and-host-can-all-be-the-same-system-and-do-not-necessarily-need-to-be-separate-services&quot;&gt;The TootInstall Bot, Helper and Host can all be the same system and do not necessarily need to be separate services&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;h3 id=&quot;tootinstall-script&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#tootinstall-script&quot; aria-label=&quot;Anchor link for: tootinstall-script&quot;&gt;TootInstall Script&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;A &lt;code&gt;tootinstall script&lt;&#x2F;code&gt; is a &lt;code&gt;toml&lt;&#x2F;code&gt; document describing the dependencies and
build&#x2F;install process of a package.&lt;br &#x2F;&gt;
It has the following parameters:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Editable:&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;         : string : the package name&lt;&#x2F;span&gt;&lt;span&gt; (not&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; editable after the first post&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;targets&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;      : array[string] : a list of os+arch targets&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;dependencies&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; : array[string] : a list of software dependencies required&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;maintainers&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;  : array[string] : a list of ActivityPub accounts who can update a script&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;Non-Editable:&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;author&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;           : string : the original author of the script&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;date&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;             : datetime : the date and time the script was last updated&lt;&#x2F;span&gt;&lt;span&gt; (RFC3339)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;status&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;           : string : the status of the script&lt;&#x2F;span&gt;&lt;span&gt; (pending&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; approval, approved, archived&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;tootinstall_host&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; : string : the host on which this package has been published&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The Editable parameters are enclosed in &lt;code&gt;+++&lt;&#x2F;code&gt;&#x27;s to define separation between the
parameters and the main script.&lt;br &#x2F;&gt;
A &lt;code&gt;tootinstall script&lt;&#x2F;code&gt; should also include a &lt;code&gt;shebang&lt;&#x2F;code&gt; to ensure the script runs
as expected.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;tootinstall-binary&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#tootinstall-binary&quot; aria-label=&quot;Anchor link for: tootinstall-binary&quot;&gt;TootInstall Binary&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;A &lt;code&gt;tootinstall binary&lt;&#x2F;code&gt; is a simple portable binary that anyone can download and
run to get &lt;code&gt;TootInstall&lt;&#x2F;code&gt; functionality.&lt;&#x2F;p&gt;
&lt;p&gt;A guideline for usage is as below:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;tootinstall&lt;&#x2F;span&gt;&lt;span&gt; [mode] package_name @&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;tootinstall_host&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  modes:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;    install&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;    -    builds and installs the package as per the script&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;    download&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;   -    downloads a script but does not run it&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;    search&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;     -    searches the tootinstall url for a package name&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;    inspect&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;    -    finds and displays the tootinstall script&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;  parameters:&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;    package_name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;          - Required. the package name to install or&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;                            search&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; or inspect&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;    @[tootinstall&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; host]   - Required. the host on which a tootinstall&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;                            database&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; is running&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It must:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;be able to access the internet&lt;&#x2F;li&gt;
&lt;li&gt;be able to search and download &lt;code&gt;tootinstall scripts&lt;&#x2F;code&gt; from multiple &lt;code&gt;tootinstall hosts&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;be able to run the downloaded script&lt;&#x2F;li&gt;
&lt;li&gt;allow the user to inspect the script&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;verification&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#verification&quot; aria-label=&quot;Anchor link for: verification&quot;&gt;Verification&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The various &lt;code&gt;tootinstall&lt;&#x2F;code&gt; bots and helpers should be configured to do some
basic verification of the script poster.&lt;&#x2F;p&gt;
&lt;p&gt;Good examples of some basic checks are:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;does the poster have a bio?&lt;&#x2F;li&gt;
&lt;li&gt;does the poster have an image?&lt;&#x2F;li&gt;
&lt;li&gt;has the poster been active on the fediverse for a reasonable amount of time&lt;&#x2F;li&gt;
&lt;li&gt;has the poster been interacting with people of the fediverse for a reasonable
amount of time?&lt;&#x2F;li&gt;
&lt;li&gt;does the poster have some other people following them?&lt;&#x2F;li&gt;
&lt;li&gt;has the poster ever been boosted and&#x2F;or favourited by somebody else a few times?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;scoring&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#scoring&quot; aria-label=&quot;Anchor link for: scoring&quot;&gt;Scoring&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;As a popularity&#x2F;rating service, we can utilise ActivityPub boosts and favourites
as a scoring platform for &lt;code&gt;tootinstall scripts&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;favourite&lt;&#x2F;code&gt; = &quot;I like this&quot; = 1 point&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;boost&lt;&#x2F;code&gt; = &quot;I want other people to see this&quot; = 1 point&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;A favourite and a boost from one account can give a script 2 points.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;approvals&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#approvals&quot; aria-label=&quot;Anchor link for: approvals&quot;&gt;Approvals&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;It &lt;strong&gt;would not&lt;&#x2F;strong&gt; be sensible to publish a script immediately after posting as
doing so massively increases the risk of distributing malware.&lt;br &#x2F;&gt;
Instead, it would be wise to implement an approval concept whereby authorised
accounts could authorise a script by replying to the &lt;code&gt;tootinstall bot&lt;&#x2F;code&gt;&#x27;s post
with an approval state i.e. &quot;approved&quot; or &quot;denied&quot;. A &lt;code&gt;tootinstall bot&lt;&#x2F;code&gt; could
also actively seek out approval from a list of configured accounts, and post the
script privately to them before actually posting the published script.&lt;br &#x2F;&gt;
Secondary to this, we could implement a form of crowdsourced approval whereby if
a script score reaches a certain level, it is automatically approved.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;written-by-paul-wilde-29th-july-2024&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#written-by-paul-wilde-29th-july-2024&quot; aria-label=&quot;Anchor link for: written-by-paul-wilde-29th-july-2024&quot;&gt;Written by Paul Wilde - 29th July 2024&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;paul-notnull-space&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#paul-notnull-space&quot; aria-label=&quot;Anchor link for: paul-notnull-space&quot;&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;notnull.space&#x2F;@paul&quot;&gt;@paul@notnull.space&lt;&#x2F;a&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h2 id=&quot;final-notes&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#final-notes&quot; aria-label=&quot;Anchor link for: final-notes&quot;&gt;Final Notes&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;OK… let&#x27;s address the elephant in the room. I am &lt;em&gt;&lt;strong&gt;very&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt; aware this is incredibly
dangerous and &lt;em&gt;you&lt;&#x2F;em&gt; should be very aware this is a parody concept.
Please, everyone, PLEASE, do not implement any of this!! It is just meant as a
humorous thought experiment and is in no way intended to make it to production.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Wholesome Errors</title>
        <published>2024-02-02T00:00:00+00:00</published>
        <updated>2024-02-02T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/errors/"/>
        <id>https://paulwilde.uk/ponderings/errors/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/errors/">&lt;p&gt;Your Friendly Error Code Index
Inspirational instructions for dealing with unhelpful error codes&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;ERROR&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -41: Failure!&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Wouldn’t it be great if there was something to tell you what to do about this error?!
Wouldn’t it be great if it said&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;ERROR&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; -41: Sit by a lake&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;instead?&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Microsoft Exchange 365 Room Calendar - Subject Replaced by Organizer</title>
        <published>2024-01-16T11:09:00+00:00</published>
        <updated>2024-01-16T11:09:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/ms-exchange-room-calendar-title-replaced-by-organiser/"/>
        <id>https://paulwilde.uk/ponderings/ms-exchange-room-calendar-title-replaced-by-organiser/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/ms-exchange-room-calendar-title-replaced-by-organiser/">&lt;p&gt;I recently had a issue logged by a client where a room calendar in Microsoft Exchange 365,
when invited to a meeting, shows the organizer&#x27;s name in the subject instead of the actual subject.&lt;br &#x2F;&gt;
This may well be a desirable feature, but in the case it isn&#x27;t, this is how it can be resolved.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;Room calendars are useful for booking meetings which will take place in a room in an office. Normally, the process would be for somebody to have delegate permissions on this calendar, allowing them to enter a calendar entry into this calendar and invite the required attendees. In this case, everything works well - the room shows the event, including subject and content and invited parties can accept to reject the event depending on their availability.&lt;&#x2F;p&gt;
&lt;p&gt;However, sometimes somebody wishes to create an event in their own calendar, and invite the room calendar to that event. In this case, it appears the default option is for the event in the room calendar to have its subject and content replaced by the organisers details. I&#x27;m sure this makes sense in some cases, but my client in this case does not find this desirable. Luckily, there is a solution.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;powershell-to-the-rescue&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#powershell-to-the-rescue&quot; aria-label=&quot;Anchor link for: powershell-to-the-rescue&quot;&gt;Powershell to the rescue!&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;A single Powershell command can be used to set some options on a calendar to change the way that calendars processing works.&lt;br &#x2F;&gt;
First, connect to Exchange Online:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;powershell&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;Connect-ExchangeOnline&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Once connected, you can issue the following command to show the current options for a particular calendar&#x27;s processing:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;powershell&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;Get-CalendarProcessing&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; -&lt;&#x2F;span&gt;&lt;span&gt; Identity &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;{The Calendar Name}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span&gt; fl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Which should show something like the below:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;powershell&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AutomateProcessing                   : AutoAccept&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AllowConflicts                       : False&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AllowDistributionGroup               : True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AllowMultipleResources               : True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookingType                          : Standard&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookingWindowInDays                  : &lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;180&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MaximumDurationInMinutes             : &lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;1440&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MinimumDurationInMinutes             : &lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AllowRecurringMeetings               : True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;EnforceAdjacencyAsOverlap            : False&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;EnforceCapacity                      : False&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;EnforceSchedulingHorizon             : True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ScheduleOnlyDuringWorkHours          : False&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ConflictPercentageAllowed            : &lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MaximumConflictInstances             : &lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ForwardRequestsToDelegates           : True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;DeleteAttachments                    : True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;DeleteComments                       : True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;RemovePrivateProperty                : True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;DeleteSubject                        : True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AddOrganizerToSubject                : True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;DeleteNonCalendarItems               : True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;TentativePendingApproval             : True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;EnableResponseDetails                : True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;OrganizerInfo                        : True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ResourceDelegates                    : &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;**&lt;&#x2F;span&gt;&lt;span&gt;Names of delegates are here&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;**&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;RequestOutOfPolicy                   : &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;{}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AllRequestOutOfPolicy                : False&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookInPolicy                         : &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;{}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AllBookInPolicy                      : False&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;RequestInPolicy                      : &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;{}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AllRequestInPolicy                   : True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AddAdditionalResponse                : False&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AdditionalResponse                   :&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;RemoveOldMeetingMessages             : True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AddNewRequestsTentatively            : True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ProcessExternalMeetingMessages       : False&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;RemoveForwardedMeetingNotifications  : False&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AutoRSVPConfiguration                : Microsoft.Exchange.Data.Storage.AutoRSVPConfiguration&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;RemoveCanceledMeetings               : False&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;EnableAutoRelease                    : False&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;PostReservationMaxClaimTimeInMinutes : &lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;10&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MailboxOwnerId                       : Room Calendar Name&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Identity                             : Room Calendar Name&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;IsValid                              : True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ObjectState                          : Changed&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You&#x27;ll see there are a few options set to &quot;True&quot; which could be toggled - &lt;code&gt;Delete Subject&lt;&#x2F;code&gt;, &lt;code&gt;Delete Comments&lt;&#x2F;code&gt; and &lt;code&gt;Delete Attachments&lt;&#x2F;code&gt; - they should be fairly self explanitory.
You can toggle these options by issuing the following command:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;powershell&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;Set-CalendarProcessing&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; -&lt;&#x2F;span&gt;&lt;span&gt;Identity &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Room Calendar Name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; -&lt;&#x2F;span&gt;&lt;span&gt;DeleteComments &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;$false -&lt;&#x2F;span&gt;&lt;span&gt;DeleteSubject &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;$false -&lt;&#x2F;span&gt;&lt;span&gt;DeleteAttachments &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;$false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This simply disables those options, so now the subject, comments and attachments will not be deleted when the calendar processes the event.&lt;br &#x2F;&gt;
There is one further options which may, or may not, be helpful to disable - &lt;code&gt;AddOrganizerToSubject&lt;&#x2F;code&gt;. This option adds the organizer&#x27;s name to the start of the Subject. This may be useful, but my client also wanted this switched off which can be done with the following command (or, indeed, adding the flag to the previous command).&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;powershell&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;Set-CalendarProcessing&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; -&lt;&#x2F;span&gt;&lt;span&gt;Identity &lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;Room Calendar Name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; -&lt;&#x2F;span&gt;&lt;span&gt;AddOrganizerToSubject &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;$false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And there we are, new events now will appear in the calendar as desired - with full Subject, Comments and Attachments.&lt;br &#x2F;&gt;
Previous entries will not update automatically, the organizer must go into each one and re-send it (no need to change anything, just re-send it and press &quot;Send Anyway&quot;) which will update the event in the room calendar as desired.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Gemini.css</title>
        <published>2023-02-22T20:57:13+00:00</published>
        <updated>2023-02-22T20:57:13+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/geminicss/"/>
        <id>https://paulwilde.uk/ponderings/geminicss/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/geminicss/">&lt;p&gt;Gemini.css is an &lt;em&gt;almost&lt;&#x2F;em&gt; classless CSS style for making Gemini-like HTML pages.&lt;&#x2F;p&gt;
&lt;p&gt;For a Gemini.css demonstration, go to &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;geminicss.paulwilde.uk&quot;&gt;geminicss.paulwilde.uk&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Nemini</title>
        <published>2023-02-20T12:57:13+00:00</published>
        <updated>2023-02-20T12:57:13+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/nemini/"/>
        <id>https://paulwilde.uk/ponderings/nemini/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/nemini/">&lt;p&gt;&#x27;&#x2F;nɛmɪnaɪ&#x2F;&#x27; Nem-in-eye&lt;&#x2F;p&gt;
&lt;h3 id=&quot;a-simple-gemini-server&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#a-simple-gemini-server&quot; aria-label=&quot;Anchor link for: a-simple-gemini-server&quot;&gt;A simple Gemini server&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Nemini is a simple Gemini server with static file serving, virtual host and alias support.
&quot;Simple&quot; in the way it is, hopefully, simple to configure and use with minimal knowledge of web servers in general.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;You probably need to be familiar with TOML configuration files, but other than that the server should run fairly easily.&lt;&#x2F;p&gt;
&lt;p&gt;See this page on Nemini : &lt;a href=&quot;gemini:&#x2F;&#x2F;paulwilde.uk&#x2F;dev&#x2F;nemini&quot;&gt;gemini:&#x2F;&#x2F;paulwilde.uk&#x2F;dev&#x2F;nemini&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;a href=&quot;https:&#x2F;&#x2F;paulwilde.uk&#x2F;ponderings&#x2F;nemini&#x2F;%22https:&#x2F;&#x2F;codeberg.org&#x2F;pswilde&#x2F;nemini%22&quot;&gt;source code&lt;&#x2F;a&gt; is hosted at Codeberg.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;features&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#features&quot; aria-label=&quot;Anchor link for: features&quot;&gt;Features&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Will serve static files&lt;&#x2F;li&gt;
&lt;li&gt;Virtual host and alias capability&lt;&#x2F;li&gt;
&lt;li&gt;Headers and Footers can be applied to each page&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;how-to-run&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#how-to-run&quot; aria-label=&quot;Anchor link for: how-to-run&quot;&gt;How to run&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Copy the &lt;code&gt;config&#x2F;nemini.sample.toml&lt;&#x2F;code&gt; file to &lt;code&gt;&#x2F;etc&#x2F;nemini&#x2F;nemini.toml&lt;&#x2F;code&gt; nd edit to your liking&lt;&#x2F;li&gt;
&lt;li&gt;Certificates are &lt;em&gt;required&lt;&#x2F;em&gt; so make sure you have those set. They will be automatically created via openssl if they don&#x27;t exist.&lt;&#x2F;li&gt;
&lt;li&gt;Host your files in your &lt;code&gt;root_dir&lt;&#x2F;code&gt; director&#x2F;y|ies&#x2F;&lt;&#x2F;li&gt;
&lt;li&gt;Run the &lt;code&gt;nemini&lt;&#x2F;code&gt; binary&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;parameters&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#parameters&quot; aria-label=&quot;Anchor link for: parameters&quot;&gt;Parameters&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Passing the &lt;code&gt;--config&lt;&#x2F;code&gt; parameter with a file location will allow the use of a custom config file saved wherever you wish.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;build-from-source&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#build-from-source&quot; aria-label=&quot;Anchor link for: build-from-source&quot;&gt;Build from source&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Install nim and nimble and run the following command:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;nimble build&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;All nim dependencies will be installed.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#links&quot; aria-label=&quot;Anchor link for: links&quot;&gt;Links&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;pswilde&#x2F;nemini&quot;&gt;Source Code&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;toml.io&quot;&gt;TOML Config file reference&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>AI Search</title>
        <published>2023-02-16T14:40:00+00:00</published>
        <updated>2023-02-16T14:40:00+00:00</updated>
        
        <author>
          <name>
            Paul Wilde
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/freshgpt/"/>
        <id>https://paulwilde.uk/ponderings/freshgpt/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/freshgpt/">&lt;p&gt;This is a story all about how&lt;br &#x2F;&gt;
Your query got twist-turned upside down&lt;br &#x2F;&gt;
And I&#x27;d like to show an answer just sit right there&lt;br &#x2F;&gt;
It might not be fully accurate but I don&#x27;t care&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Why I have turned off my BirdsiteLIVE instance</title>
        <published>2022-12-21T11:36:00+00:00</published>
        <updated>2022-12-21T11:36:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/turning-off-birdsitelive/"/>
        <id>https://paulwilde.uk/ponderings/turning-off-birdsitelive/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/turning-off-birdsitelive/">&lt;p&gt;Hello. How are you? I am fine.&lt;br &#x2F;&gt;
&lt;br &#x2F;&gt;
You may know me from a few places, but likely on the Fediverse as the person that
maintains a BirdsiteLIVE instance with the url &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;birdsite.wilde.cloud&quot;&gt;birdsite.wilde.cloud&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;why&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#why&quot; aria-label=&quot;Anchor link for: why&quot;&gt;Why?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Due to the recent influx of people from &lt;em&gt;the corporately owned microblogging platform&lt;&#x2F;em&gt;,
the use of many BirdsiteLIVE instances has become massive.
Added to this, I have received many requests from users to block access to block
their posts &lt;em&gt;from the other place&lt;&#x2F;em&gt; via BirdsiteLIVE - which I have happily done
for them, but &lt;em&gt;some people&lt;&#x2F;em&gt; are do not ask nicely and instead resort to claims
of attacks on their privacy (I know, right‽ it&#x27;s a clear misunderstanding of
how the internet works...). I&#x27;ve also been witness to some pretty brutal comments made towards BirdsiteLIVE&#x27;s creator.&lt;br &#x2F;&gt;
I simply don&#x27;t feel comfortable with this.&lt;br &#x2F;&gt;
&lt;br &#x2F;&gt;
Added to this, the instance has become so saturated (over 1000%) that posts
&lt;em&gt;from the other place&lt;&#x2F;em&gt; only turn up sporadically and normally in a flurry that
clutters home timelines.&lt;br &#x2F;&gt;
This really isn&#x27;t nice to see when you&#x27;re trying to interact with many other people on the fediverse, only to have a huge block on nonsense posts in the middle of it all.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;offline&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#offline&quot; aria-label=&quot;Anchor link for: offline&quot;&gt;Offline&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;So, I&#x27;ve been considering doing this for some time, but as from today, December 21st 2022, my BirdsiteLIVE instance is offline. I may start a new one up at some point in the future but with a new database, no old follows will remain.&lt;br &#x2F;&gt;
I will continue to run my &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;birdsites.wilde.cloud&quot;&gt;BirdsiteLIVE Instance List&lt;&#x2F;a&gt; which appears to be fairly web search-able to help people out - my original BSL instance URL will now redirect to this site.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-else-can-i-do&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-else-can-i-do&quot; aria-label=&quot;Anchor link for: what-else-can-i-do&quot;&gt;What else can I do?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Well, to put it bluntly, forget about &lt;em&gt;the other place&lt;&#x2F;em&gt;. Use of the Fediverse has skyrocketed since &lt;em&gt;the other place&lt;&#x2F;em&gt;&#x27;s recent ownership changed. You&#x27;ll find most of the people you want to see postsby are on the Fediverse already! Who needs content from the other place?&lt;&#x2F;p&gt;
&lt;p&gt;If you do need content from the other place, why not try using something like &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;nitter.net&quot;&gt;Nitter&lt;&#x2F;a&gt; or one of it&#x27;s many instances. You can even put &lt;code&gt;&#x2F;rss&lt;&#x2F;code&gt; at the end of the URL to get that content as a lovely RSS feed to put into your favorite RSS reader (you &lt;em&gt;are&lt;&#x2F;em&gt; using RSS, right‽).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;sign-off&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#sign-off&quot; aria-label=&quot;Anchor link for: sign-off&quot;&gt;Sign off&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Anyway, if you managed to get this far, thank you. I don&#x27;t blog normally, but I felt I needed to put some kind of statement up, even if it is poorly written and slightly opinionated. Thanks for reading anyway.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Keyoxide Verification</title>
        <published>2022-11-17T11:44:27+00:00</published>
        <updated>2022-11-17T11:44:27+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/verify/keyoxide/"/>
        <id>https://paulwilde.uk/verify/keyoxide/</id>
        <content type="html" xml:base="https://paulwilde.uk/verify/keyoxide/">&lt;p&gt;[Verifying my keyoxide cryptographic key: 85633E30514CC1932E4268460ED12CF710BC42CA]&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>SQL Haiku</title>
        <published>2022-10-26T22:40:00+00:00</published>
        <updated>2022-10-26T22:40:00+00:00</updated>
        
        <author>
          <name>
            Paul Wilde
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/sql-haiku/"/>
        <id>https://paulwilde.uk/ponderings/sql-haiku/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/sql-haiku/">&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;SELECT&lt;&#x2F;span&gt;&lt;span&gt; haiku &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;FROM&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;tableHaikus &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;WHERE&lt;&#x2F;span&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt; LEFT&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;LIKE&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;SQL&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
    </entry>
    <entry xml:lang="en">
        <title>Fortieth</title>
        <published>2022-09-24T15:45:22+00:00</published>
        <updated>2022-09-24T15:45:22+00:00</updated>
        
        <author>
          <name>
            Paul Wilde
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/fortieth/"/>
        <id>https://paulwilde.uk/ponderings/fortieth/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/fortieth/">&lt;p&gt;&#x27;Twas the morning after the fortieth&lt;br &#x2F;&gt;
And all through the house&lt;br &#x2F;&gt;
Not a creature was stirring&lt;br &#x2F;&gt;
Except the one making the coffee and Alkaseltzer&lt;&#x2F;p&gt;
&lt;p&gt;&#x27;Twas the morning after the morning after the fortieth&lt;br &#x2F;&gt;
And all through the house&lt;br &#x2F;&gt;
The creatures were starting to stir but generally still uncomfortable and underperforming&lt;&#x2F;p&gt;
&lt;p&gt;&#x27;Twas the morning after the morning after the morning after the fortieth&lt;br &#x2F;&gt;
And all through the house&lt;br &#x2F;&gt;
The creatures were stirring&lt;br &#x2F;&gt;
Even the mouse!&lt;br &#x2F;&gt;
It scurried up the staircase&lt;br &#x2F;&gt;
Squeaking the old well known phrase&lt;br &#x2F;&gt;
&quot;Warning! Duration of hangover is proportionate to age!&quot;&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>wm_tools</title>
        <published>2022-05-08T16:25:13+01:00</published>
        <updated>2022-05-08T16:25:13+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/wm-tools/"/>
        <id>https://paulwilde.uk/ponderings/wm-tools/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/wm-tools/">&lt;h1 id=&quot;a-selection-of-information-output-tools-for-dmenu&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#a-selection-of-information-output-tools-for-dmenu&quot; aria-label=&quot;Anchor link for: a-selection-of-information-output-tools-for-dmenu&quot;&gt;A selection of information output tools for dmenu&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;These are a selection of independant tools for displaying various information
about system status in dmenu. Some of them i.e. &lt;code&gt;volume&lt;&#x2F;code&gt; have options (up, down, mute...)
which are selectable options in dmenu.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;tools&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#tools&quot; aria-label=&quot;Anchor link for: tools&quot;&gt;Tools&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pingclock&lt;&#x2F;code&gt;        performs a single &lt;code&gt;ping&lt;&#x2F;code&gt; to a server and returns the response time&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;battery&lt;&#x2F;code&gt;          shows the current battery level&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;brightness&lt;&#x2F;code&gt;       shows the current backlight level and gives options to adjust it&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;volume&lt;&#x2F;code&gt;           shows the current volume level and gives options to adjust and manage it&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;date&lt;&#x2F;code&gt;             shows the date&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;fuzzytime&lt;&#x2F;code&gt;        shows the fuzzytime clock&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;wlan&lt;&#x2F;code&gt;             shows the state of the wireless network interface. SSID connected to and signal level.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;nic&lt;&#x2F;code&gt;              shows the status and&#x2F;or the ip address of the network interface card&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;temperature&lt;&#x2F;code&gt;      shows the current CPU temperature&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;notes&lt;&#x2F;code&gt;            a simple one liner note taking tool, displaying notes in &lt;code&gt;dmenu&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;rofi&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The next two do not work with &lt;code&gt;rofi&lt;&#x2F;code&gt; unless you have &lt;code&gt;alias dmenu=rofi&lt;&#x2F;code&gt; set, but they&#x27;re pretty nice tools&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;passmenu_wrapper&lt;&#x2F;code&gt; a wrapper for passmenu. It basically just styles &lt;code&gt;passmenu&lt;&#x2F;code&gt; with no other features&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;command_wrapper&lt;&#x2F;code&gt;  inspired by passmenu_wrapper, a basic tool to run other &lt;code&gt;dmenu&lt;&#x2F;code&gt; related tools with uniform styling.
&lt;ul&gt;
&lt;li&gt;For example: &lt;code&gt;dmenu_run&lt;&#x2F;code&gt;, &lt;code&gt;clipmenu&lt;&#x2F;code&gt;, &lt;code&gt;passmenu&lt;&#x2F;code&gt; etc.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;example-in-dmenu&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#example-in-dmenu&quot; aria-label=&quot;Anchor link for: example-in-dmenu&quot;&gt;Example in &lt;code&gt;dmenu&lt;&#x2F;code&gt;:&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;user-images.githubusercontent.com&#x2F;31094984&#x2F;167123173-ee8092a2-d5ab-47b4-b207-ced328072cc0.gif&quot; alt=&quot;dmenu_tools&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;example-of-command-wrapper-with-clipmenu&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#example-of-command-wrapper-with-clipmenu&quot; aria-label=&quot;Anchor link for: example-of-command-wrapper-with-clipmenu&quot;&gt;Example of &lt;code&gt;command_wrapper&lt;&#x2F;code&gt; with &lt;code&gt;clipmenu&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;user-images.githubusercontent.com&#x2F;31094984&#x2F;167122436-eea0be88-a929-46e8-9b4d-cb677dcb129c.gif&quot; alt=&quot;command_wrap&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how-to-compile&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#how-to-compile&quot; aria-label=&quot;Anchor link for: how-to-compile&quot;&gt;How to compile&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;There are some configuration variables explicit to me, you&#x27;ll need to change them for you for them to be useful I imagine.&lt;br &#x2F;&gt;
Configuration variables are compile - there are no config files or runtime parameters (except for &quot;rofi&quot;)&lt;&#x2F;p&gt;
&lt;p&gt;Each tool is compiled separately, for example:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;nim&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; c pingclock&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;and then run with&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;.&#x2F;pingclock&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #616E88;&quot;&gt;# or&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;.&#x2F;pingclock&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; rofi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;how-to-use&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#how-to-use&quot; aria-label=&quot;Anchor link for: how-to-use&quot;&gt;How to use&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Personally, I have these bound to key combinations in i3.
In fact, I have a seperate &lt;code&gt;bindsym&lt;&#x2F;code&gt; mode in which all these
tools are accessible i.e. &lt;code&gt;$mod+i&lt;&#x2F;code&gt; to get to &quot;info&quot; mode then &lt;code&gt;p&lt;&#x2F;code&gt; to show pingclock.&lt;br &#x2F;&gt;
It&#x27;s completely up to you how to run them, they&#x27;re just simple CLI tools really.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;you-can-also-set-the-volume-and-brightness-levels-by-typing-a-numeric-figure-into-the-dmenu-rofi-input-box&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#you-can-also-set-the-volume-and-brightness-levels-by-typing-a-numeric-figure-into-the-dmenu-rofi-input-box&quot; aria-label=&quot;Anchor link for: you-can-also-set-the-volume-and-brightness-levels-by-typing-a-numeric-figure-into-the-dmenu-rofi-input-box&quot;&gt;You can also set the volume and brightness levels by typing a numeric figure into the dmenu&#x2F;rofi input box&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;h2 id=&quot;dependencies&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#dependencies&quot; aria-label=&quot;Anchor link for: dependencies&quot;&gt;Dependencies&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dmenu&lt;&#x2F;code&gt; or &lt;code&gt;rofi&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;yad&lt;&#x2F;code&gt; for calendar&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;passmenu&lt;&#x2F;code&gt; for passmenu_wrapper&lt;&#x2F;li&gt;
&lt;li&gt;basically any tool that&#x27;s used to gather the information.&lt;&#x2F;li&gt;
&lt;li&gt;&quot;tools&quot; for audio etc. (&lt;code&gt;pamixer&lt;&#x2F;code&gt;, &lt;code&gt;ncpamixer&lt;&#x2F;code&gt;, etc.) can be set in the source&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>thisisnotmy.email</title>
        <published>2021-11-13T16:17:59+00:00</published>
        <updated>2021-11-13T16:17:59+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/thisisnotmyemail/"/>
        <id>https://paulwilde.uk/ponderings/thisisnotmyemail/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/thisisnotmyemail/">&lt;p&gt;I run the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;thisisnotmy.email&quot;&gt;thisisnotmy.email&lt;&#x2F;a&gt; email service.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-s-it-all-about&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-s-it-all-about&quot; aria-label=&quot;Anchor link for: what-s-it-all-about&quot;&gt;What&#x27;s it all about?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Don’t you hate it when people, businesses, random telephone callers, etc. ask you for your email address out of the blue under the ruse of “providing you a better service”?
It&#x27;s early days but I&#x27;m hoping to be able to offer &lt;em&gt;something&lt;&#x2F;em&gt; for people to
use eventually.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;Wouldn’t it be great to confidently give them your email address, but with a slight passive aggressiveness to make the situation more awkward for them, and less awkward for you‽&lt;&#x2F;p&gt;
&lt;p&gt;Enter thisisnotmy.email. thisisnotmy.email is a fully functional email service. When someone asks you for your email address, just say:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Sure, it’s my name at this is not my, all one word, dot email”&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;And let them decide whether it’s worth continuing on with this worthless data collecting routine.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Peanut Butter Recipe</title>
        <published>2021-11-13T14:15:22+00:00</published>
        <updated>2021-11-13T14:15:22+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/peanut-butter/"/>
        <id>https://paulwilde.uk/ponderings/peanut-butter/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/peanut-butter/">&lt;p&gt;This is the easiest thing in the world.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Dry-fry (no oil etc.) the peanuts in the large frying pan for about 10 mins or for as long as it takes for the peanuts to become golden brown.
&lt;ul&gt;
&lt;li&gt;This will encourage the oils in the peanuts to release - which is exactly what we want!&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Put the now-roasted peanuts into the blender and blend.
&lt;ul&gt;
&lt;li&gt;Blend, blend, blend and blend some more.&lt;&#x2F;li&gt;
&lt;li&gt;There will be a point when you think nothing&#x27;s happening and the small bits of peanut are just moving around the blender, or just stuck in place. Give the stuck pieces a nudge with a spatula and get back to blending.&lt;&#x2F;li&gt;
&lt;li&gt;Blend, blend, blend even more until, eventually, the mixture starts to bind together and turn into a thick solid mass.&lt;&#x2F;li&gt;
&lt;li&gt;Keep blending and the mixture will loosen up become a lovely, smooth, peanut butter.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Spoon out into a suitable container and allow to cool (or just eat it there and then, I won&#x27;t judge you).&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Top Tips  =&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;If you prefer a chunky peanut butter, save some of the roasted peanuts back and only put them into the blended mixture at the end with a bit of a stir - lovely!&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>I Use …</title>
        <published>2021-08-17T11:04:14+01:00</published>
        <updated>2021-08-17T11:04:14+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/toolsiuse/"/>
        <id>https://paulwilde.uk/ponderings/toolsiuse/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/toolsiuse/">&lt;p&gt;In the interest of sharing interesting information, I thought I&#x27;d create this page to list some of my favourite software packages and tools.&lt;br &#x2F;&gt;
This list is by no means complete as, if you&#x27;re like me you&#x27;ll understand, I use hundreds of software packages.&lt;&#x2F;p&gt;
&lt;p&gt;For PC&#x2F;Laptop :&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Operating System
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;archlinux.org&quot;&gt;Arch Linux&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;freebsd.org&quot;&gt;FreeBSD&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;isaacfreund.com&#x2F;software&#x2F;river&#x2F;&quot;&gt;river&lt;&#x2F;a&gt; (Wayland)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;baskerville&#x2F;bspwm&quot;&gt;bspwm&lt;&#x2F;a&gt; (Xorg)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;baskerville&#x2F;sxhkd&quot;&gt;sxhkd&lt;&#x2F;a&gt; (Xorg)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;davatorium&#x2F;rofi&quot;&gt;rofi&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;dunst-project.org&#x2F;&quot;&gt;dunst&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;alacritty&#x2F;alacritty&quot;&gt;alacritty&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;zsh.org&quot;&gt;zsh&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;paulwilde.uk&#x2F;ponderings&#x2F;wm_tools&quot;&gt;some of my own WM tools&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Web browsers
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;librewolf.org&quot;&gt;LibreWolf&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;qutebrowser.org&#x2F;&quot;&gt;qutebrowser&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;vivaldi.com&quot;&gt;Vivaldi Browser&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Productivity
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.thunderbird.net&#x2F;en-GB&#x2F;&quot;&gt;Thunderbird&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;libreoffice.org&quot;&gt;LibreOffice&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;cryptpad.fr&quot;&gt;Cryptpad&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;neovim.io&quot;&gt;Neovim&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Chat Software
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;xmpp.org&quot;&gt;XMPP&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;ejabberd.im&quot;&gt;ejabberd&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;slidge.im&quot;&gt;Slidge&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;gajim.org&quot;&gt;Gajim&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Programming Languages
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;nim-lang.org&quot;&gt;Nim&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;go.dev&quot;&gt;GoLang&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;python.org&quot;&gt;Python&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;rust-lang.org&quot;&gt;Rust&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Theming&#x2F;Colourschemes
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;morhetz&#x2F;gruvbox&quot;&gt;Gruvbox&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;catppuccin.com&quot;&gt;Catppuccin&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;For Servers :&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Operating Systems
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;freebsd.org&quot;&gt;FreeBSD&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;debian.org&quot;&gt;Debian&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Services
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;bastillebsd.org&quot;&gt;BastilleBSD&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;podman.io&quot;&gt;Podman&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;efa-project.org&quot;&gt;eFA&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;getzola.org&quot;&gt;Zola&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;mailscanner.info&quot;&gt;MailScanner&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;mailwatch.org&quot;&gt;MailWatch&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;dovecot.org&#x2F;&quot;&gt;Dovecot&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;www.postfix.org&#x2F;&quot;&gt;Postfix&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wildduck.email&quot;&gt;WildDuck&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.haproxy.org&quot;&gt;HAProxy&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;nginx.org&#x2F;&quot;&gt;nginx&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;paulwilde.uk&#x2F;dev&#x2F;mailautoconf&quot;&gt;MailAutoConf&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;If I have missed anyone out, I apologise!&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Mailautoconf</title>
        <published>2021-08-17T10:49:13+01:00</published>
        <updated>2021-08-17T10:49:13+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/mailautoconf/"/>
        <id>https://paulwilde.uk/ponderings/mailautoconf/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/mailautoconf/">&lt;h3 id=&quot;a-simple-configurable-autodiscover-autoconfig-service-for-distributed-and-self-hosted-services&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#a-simple-configurable-autodiscover-autoconfig-service-for-distributed-and-self-hosted-services&quot; aria-label=&quot;Anchor link for: a-simple-configurable-autodiscover-autoconfig-service-for-distributed-and-self-hosted-services&quot;&gt;A simple, configurable autodiscover&#x2F;autoconfig service for distributed and self-hosted services.&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;h3 id=&quot;what-is-mailautoconf&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-is-mailautoconf&quot; aria-label=&quot;Anchor link for: what-is-mailautoconf&quot;&gt;What is MailAutoConf?&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;MailAutoConf is autodiscover&#x2F;autoconfig web server for self-hosted mail services
which do not have their own autodiscover service.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h3 id=&quot;what-does-mailautoconf-do&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-does-mailautoconf-do&quot; aria-label=&quot;Anchor link for: what-does-mailautoconf-do&quot;&gt;What does MailAutoConf do?&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;MailAutoConf is currently in &lt;em&gt;very&lt;&#x2F;em&gt; early stages, but it does generate valid
autoconfig XML files (&lt;code&gt;&#x2F;mail&#x2F;config-v1.1.xml&lt;&#x2F;code&gt;) compatible with many mail clients
i.e. &lt;code&gt;Thunderbird&lt;&#x2F;code&gt;, &lt;code&gt;Evolution&lt;&#x2F;code&gt;, etc.&lt;br &#x2F;&gt;
Theoretically, anything that can read the standard autoconfig XML file -
&lt;code&gt;https:&#x2F;&#x2F;wiki.mozilla.org&#x2F;Thunderbird:Autoconfiguration:ConfigFileFormat&lt;&#x2F;code&gt;, should
be able to auto-configure using this service.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;installation&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#installation&quot; aria-label=&quot;Anchor link for: installation&quot;&gt;Installation&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;MailAutoConf runs its own webserver on port &lt;code&gt;8010&lt;&#x2F;code&gt;.
You will need to supply a volume for the configuration file and port forwarding.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;podman&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; run -dt&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBCB8B;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;  --name mailautoconf&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBCB8B;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;  -v .&#x2F;config:&#x2F;mailautoconf&#x2F;config&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBCB8B;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;  -p 8010:8010&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBCB8B;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;  pswilde&#x2F;mailautoconf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You will need a reverse proxy server to publish to the outside world and handle SSL encryption.&lt;br &#x2F;&gt;
For example, in nginx:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;server {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  listen                443 ssl;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  server_name           autoconfig.example.com;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ssl_certificate       &#x2F;path&#x2F;to&#x2F;certificate.file;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ssl_certificate_key   &#x2F;path&#x2F;to&#x2F;certificate.key&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  location &#x2F; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    proxy_set_header    X-Forwarded-Host $host:$server_port;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    proxy_set_header    X-Forwarded-Server $host;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    proxy_pass          http:&#x2F;&#x2F;localhost:8010&#x2F;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    proxy_redirect      http:&#x2F;&#x2F;localhsot:8010&#x2F; &#x2F;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    proxy_read_timeout  60s;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;First run will create &lt;code&gt;sample.yaml&lt;&#x2F;code&gt; files in the config directory. Copy these to &lt;code&gt;config.yaml&lt;&#x2F;code&gt; and &lt;code&gt;services.yaml&lt;&#x2F;code&gt; and configure them to your needs.&lt;&#x2F;p&gt;
&lt;p&gt;MailAutoConf will handle all the URLs it&#x27;s able to deal with, i.e. &lt;code&gt;&#x2F;mail&#x2F;config-v1.1.xml&lt;&#x2F;code&gt;, &lt;code&gt;&#x2F;Autodiscover&#x2F;Autodiscover.xml&lt;&#x2F;code&gt; automatically.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;dns-config&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#dns-config&quot; aria-label=&quot;Anchor link for: dns-config&quot;&gt;DNS config&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;You will need to configure DNS records for your domain.&lt;br &#x2F;&gt;
I would recommend setting up an A record for &lt;code&gt;autoconfig.your.domain&lt;&#x2F;code&gt; to point
directly to your MailAutoConf&#x27;s instance which will work for Thunderbird and
Evolution clients.
Then, if Outlook Autodiscover is required (currently not implemented), configure
a &lt;code&gt;SRV&lt;&#x2F;code&gt; record to redirect to the &lt;code&gt;autoconfig.your.domain&lt;&#x2F;code&gt; &lt;code&gt;A&lt;&#x2F;code&gt; record. i.e.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Type                                TTL  P  M  Port Target&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SRV _autodiscover._tcp.your.domain  3600 10 10 443  autoconfig.your.domain&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;compatibility&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#compatibility&quot; aria-label=&quot;Anchor link for: compatibility&quot;&gt;Compatibility&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;MailAutoConf has been tested and confirmed working with the following software packages&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;&#x2F;&gt;
Thunderbird (v78 and probably earlier versions too)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;&#x2F;&gt;
Evolution Mail (v3.40.3 and probably earlier versions too)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;&#x2F;&gt;
Nextcloud Mail app&lt;&#x2F;li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
Other Mail Clients are likely supported if they support &#x2F;mail&#x2F;config-v1.1.xml&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;future-plans&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#future-plans&quot; aria-label=&quot;Anchor link for: future-plans&quot;&gt;Future plans&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;MailAutoConf is currently in &lt;em&gt;very&lt;&#x2F;em&gt; early stages, with a &lt;em&gt;very&lt;&#x2F;em&gt; limited set of features.
My hope for MailAutoConf is to run as an autoconfig service which provides Calendar and AddressBook locations as well.
Calendar and AddressBook is in the autoconfig XML documentation, but currently not implemented. MailAutoConf can generate the correct information for Calendar and AddressBook into the autoconfig XML file, though no clients currently use it.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;todo&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#todo&quot; aria-label=&quot;Anchor link for: todo&quot;&gt;TODO:&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;&#x2F;&gt;
&#x2F;mail&#x2F;config-v1.1.xml file for Thunderbird and Evolution mail clients.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
Add more code commenting, it&#x27;s pretty terrible right now.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
Refactor the autoconfig and autodiscover XML files, they&#x27;ve been copied and bodged together and could look so much better.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
Autodiscover.xml for Outlook clients - currently does generate, but untested.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
Autodiscover.json for more modern Outlook clients - this is currently undocumented. I have implemented some features of it but it is currently not working.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
Calendars and Address Book - does generate into mail&#x2F;config-v1.1.xml, but no actual clients support it yet.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
Additional, custom services. For example, Nextcloud - instead of having to type in your Nextcloud instance URL, you can just enter your email address associated with you Nextcloud account and it looks up the URL from autoconfig - wouldn&#x27;t that be nice?&lt;&#x2F;li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
Probably loads of stuff I haven&#x27;t thought of yet.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;when-will-it-be-ready-for-production&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#when-will-it-be-ready-for-production&quot; aria-label=&quot;Anchor link for: when-will-it-be-ready-for-production&quot;&gt;When will it be ready for production?&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Well, not yet. Though it does sort of work already.&lt;br &#x2F;&gt;
I&#x27;m working on this ultimately for my own use for my own small business. I&#x27;m hoping once it&#x27;s good enough I could deploy the set up to my businesses customers and ultimately get them away from a Microsoft Exchange based environment. There&#x27;s a long way to go for that right now though.&lt;&#x2F;p&gt;
&lt;p&gt;If you feel you may be able to help, or ideas on features and their implementation, notice any bugs, or just want to say hi. Please do so and submit a pull request if required.&lt;&#x2F;p&gt;
&lt;p&gt;Thanks for reading!&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>St Skeletor&#x27;s Day</title>
        <published>2021-08-03T16:53:20+01:00</published>
        <updated>2021-08-03T16:53:20+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/skeletor/"/>
        <id>https://paulwilde.uk/ponderings/skeletor/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/skeletor/">&lt;p&gt;St Skeletor&#x27;s Day&lt;br &#x2F;&gt;
February 15th&lt;br &#x2F;&gt;
Every Year&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Ross Rates</title>
        <published>2021-04-06T21:12:57+01:00</published>
        <updated>2021-04-06T21:12:57+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/rossrates/"/>
        <id>https://paulwilde.uk/ponderings/rossrates/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/rossrates/">&lt;p&gt;Rate Stuff with Ross, quite simple.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Basic Dough Recipe</title>
        <published>2021-04-01T11:41:38+01:00</published>
        <updated>2021-04-01T11:41:38+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/basicdough/"/>
        <id>https://paulwilde.uk/ponderings/basicdough/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/basicdough/">&lt;p&gt;If you have a bread maker:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;add the water, salt, sugar, herbs, oil, flour and yeast&#x2F;sourdough starter
&lt;strong&gt;IN THAT ORDER&lt;&#x2F;strong&gt; to the bread maker&#x27;s container.
&lt;ul&gt;
&lt;li&gt;You &lt;em&gt;must&lt;&#x2F;em&gt; add them in that order, or at least water first else the
mixture will not mix correctly.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;set the bread maker to its &quot;dough&quot; setting and set it going - job done!&lt;br &#x2F;&gt;
(P.S. you can just use this same recipe as a regular bread too - just set the
bread maker to the regular &quot;bread&quot; mode)&lt;&#x2F;li&gt;
&lt;li&gt;At this point I normally transfer the dough to a suitable container and
cover it to let it rise.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Without a bread maker:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;add the flour, salt, sugar, herbs and yeast&#x2F;sourdough starter to the
large mixing bowl and dry mix them all together.&lt;&#x2F;li&gt;
&lt;li&gt;form a well in the middle of the flour mixture and slowly pour in the
water bit by bit, mixing the flour mixture into the water as you go&lt;&#x2F;li&gt;
&lt;li&gt;continue to mix the flour and water mixture, you&#x27;re going to need to use
your hands, but give it a good mix until everything is mixed together well.
&lt;ul&gt;
&lt;li&gt;you want the dough to still be a bit wet, so if it&#x27;s dry, add a bit more
water&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;dust the large chopping board with flour and turn out the wet-ish dough
ball onto the board.&lt;&#x2F;li&gt;
&lt;li&gt;Knead the dough, &lt;em&gt;a lot!&lt;&#x2F;em&gt; Just keep kneading, adding more flour if
necessary.
&lt;ul&gt;
&lt;li&gt;As you knead you&#x27;ll noticed the dough ball become more smooth and
springy, but it will also feel &quot;stronger&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Once the ball is nice and firm, but still springy, place it into a suitable
container and cover to let it rise.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;After a few hours of rising time (longer if you&#x27;re using sourdough starter)
your dough will, hopefully, have risen enormously. You can now use it.
I&#x27;ll be adding recipes for &lt;a href=&quot;&#x2F;recipes&#x2F;&quot;&gt;pizzas&lt;&#x2F;a&gt;, &lt;a href=&quot;&#x2F;recipes&#x2F;&quot;&gt;naans&lt;&#x2F;a&gt; and other
things that use this dough here, eventually.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Unphonetic ABC</title>
        <published>2021-04-01T11:05:46+01:00</published>
        <updated>2021-04-01T11:05:46+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/unphoneticabc/"/>
        <id>https://paulwilde.uk/ponderings/unphoneticabc/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/unphoneticabc/">&lt;p&gt;A website directory of all words that can be associated with their letters by &lt;em&gt;not&lt;&#x2F;em&gt;
sounding as their corresponding letter should do.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Bedford &amp; Co</title>
        <published>2021-04-01T10:54:15+01:00</published>
        <updated>2021-04-01T10:54:15+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/bedfordandco/"/>
        <id>https://paulwilde.uk/ponderings/bedfordandco/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/bedfordandco/">&lt;p&gt;Simple single page website for a local accountancy business.
Has additional Vue.js implementation for news and exchange rates updates.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Wilde IT</title>
        <published>2021-04-01T10:47:49+01:00</published>
        <updated>2021-04-01T10:47:49+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/wildeit/"/>
        <id>https://paulwilde.uk/ponderings/wildeit/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/wildeit/">&lt;p&gt;A local IT business website detailing available services.
Our business website.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>The Lost Tin Opener Society</title>
        <published>2021-03-31T22:20:31+01:00</published>
        <updated>2021-03-31T22:20:31+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/ltos/"/>
        <id>https://paulwilde.uk/ponderings/ltos/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/ltos/">&lt;p&gt;A spoof single page animation website of a secret society dedicated to finding all
lost tin openers.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Noisy Faces</title>
        <published>2021-03-31T17:22:16+01:00</published>
        <updated>2021-03-31T17:22:16+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/faces/"/>
        <id>https://paulwilde.uk/ponderings/faces/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/faces/">&lt;p&gt;Just a very silly website with an animated face making sounds.&lt;br &#x2F;&gt;
Yeah, just that really. (The image is &lt;em&gt;not&lt;&#x2F;em&gt; me)&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>The Geese Webpage</title>
        <published>2021-03-31T10:05:31+01:00</published>
        <updated>2021-03-31T10:05:31+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/ponderings/geesewildecloud/"/>
        <id>https://paulwilde.uk/ponderings/geesewildecloud/</id>
        <content type="html" xml:base="https://paulwilde.uk/ponderings/geesewildecloud/">&lt;p&gt;Starting life as a (sort of inappropriate) parody of a certain popular dating website
the geese website was made as a bit of fun and to please minor obsession with geese.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>About Me</title>
        <published>2021-03-29T10:19:20+01:00</published>
        <updated>2021-03-29T10:19:20+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulwilde.uk/aboutme/"/>
        <id>https://paulwilde.uk/aboutme/</id>
        <content type="html" xml:base="https://paulwilde.uk/aboutme/">&lt;p&gt;Hello,&lt;br &#x2F;&gt;
This is my website which will contain my general thoughts, utterings,
maybe my opinions, possibly some tech stuff I find interesting, some of the
recipes I cook and want to remember the ingredients of and a bit of artwork I
draw for fun and I in no way claim to be a good artist in any way.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;some-things-about-me-i&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#some-things-about-me-i&quot; aria-label=&quot;Anchor link for: some-things-about-me-i&quot;&gt;Some things about me. I :&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;am an IT Professional.
&lt;ul&gt;
&lt;li&gt;I run my own &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wilde-it.co.uk&quot;&gt;IT Business&lt;&#x2F;a&gt; that provides IT consulting, assistance and procurement services to local businesses (Devon, South West UK).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;am an Open Source advocate&#x2F;evangelist.
&lt;ul&gt;
&lt;li&gt;I try to use Open Source products in my personal and working life as often as possible.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;am data privacy conscious.
&lt;ul&gt;
&lt;li&gt;I believe we shouldn&#x27;t pay for products or services with our personal data and &quot;marketability&quot;&lt;&#x2F;li&gt;
&lt;li&gt;I don&#x27;t use the mainstream social media services. You shouldn&#x27;t either.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;use &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;archlinux.org&quot;&gt;Arch Linux&lt;&#x2F;a&gt; btw …&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;some-information-about-this-site-it&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#some-information-about-this-site-it&quot; aria-label=&quot;Anchor link for: some-information-about-this-site-it&quot;&gt;Some information about this site. It :&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;was created using &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;getzola.org&quot;&gt;Zola&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;is built with efficiency in mind; It&#x27;s small and light and quick to view.&lt;&#x2F;li&gt;
&lt;li&gt;uses no JavaScript (except a little bit for &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;plausible.io&quot;&gt;Plausible Analytics&lt;&#x2F;a&gt;, forgive me).&lt;&#x2F;li&gt;
&lt;li&gt;runs on an &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;caddyserver.com&quot;&gt;Caddy&lt;&#x2F;a&gt; server on top of a &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;rockylinux.org&quot;&gt;Rocky Linux&lt;&#x2F;a&gt; VPS provided by &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;ovh.com&quot;&gt;OVH&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;was written using the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;neovim.io&#x2F;&quot;&gt;Neovim&lt;&#x2F;a&gt; text editor on a &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.pcspecialist.co.uk&#x2F;&quot;&gt;PC Specialist&lt;&#x2F;a&gt; laptop running &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;archlinux.org&quot;&gt;Arch Linux&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
    </entry>
</feed>
