<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>John Nye</title>
    <link>https://johnnye.net</link>
    <description>Johns website</description>
    <managingEditor>scrapers@johnnye.net (John Nye)</managingEditor>
    <pubDate>Fri, 28 Aug 2026 05:04:49 +0000</pubDate>
    <item>
      <title>Unscalable Agile Framework for Personal Projects</title>
      <link>https://johnnye.net/post/unscalable-agile-framework-for-personal-projects</link>
      <description>How I like to keep track of intended work on small projects</description>
      <content:encoded><![CDATA[<p>UnSaFe - I&rsquo;ll soon be selling a 5 day onsite training course that will allow you too certify your own personal project as UnSaFe. The Good news is that to maintain this certification you&rsquo;ll have to renew every year for large sums of money.</p>

<p>Snark over. I apologise for it, but sometimes it bubbles up when I should be in better control. Over the years I have tried a multitude of ways to keep track of personal projects. Basecamp, Trello, Github Issues, paper, iOS based apps, macOS based apps. Nothing was as frictionless and easy to maintain as a markdown checklist in the README.  I think in the end it felt too much like work. There is the cost of maintaining the tool, sometimes financial sometimes time. There is a benefit to imitating work for side projects - but here this didn&rsquo;t make me feel inclined to work on projects.</p>

<p>I find that having the task list as part of the code reduces any friction in maintaining it. It does mean that there can be several versions as branching occurs, but git sorts this out in the end. I tend to add feature tasks in the task branch, and new ones in the main branch. The list can be broken up into various sections. For this site I have <code>Launch To Do</code> as a section, along with the main body of tasks. Tasks themselves are simply one liners, no need for detailed user stories or acceptance criteria here - remember we&rsquo;re UnSaFe. Invariably as I start to work on tasks, then more work is discovered, this normally takes the form of indented items. However is it is a related item it gets added to the main list with some common identifier for the feature, such as <code>posts page - add title image</code>.</p>

<p>Prioritisation of items can be done by simply moving the lines around in the list. In fact when I come to tend to my little projects, I often start by reorganising the task list. Then promptly pick one that I feel like doing that probably isn&rsquo;t the most important. Done tasks tend to end up at the bottom of the task list, to act as a reminder of the greatness that has been achieved over the years.</p>

<p>For me this has been the most sustainable method of keeping track of intended work on side projects. Once again proving the utility of a simple text file.  Maybe I could move this to a better place <code>UnSaFe.md</code>or probably <code>TASKS.md</code>.</p>
]]></content:encoded>
      <author>John Nye</author>
      <pubDate>Tue, 18 Jun 2024 22:04:10 +0000</pubDate>
    </item>
    <item>
      <title>Madd(eningl)y Simple Self Hosted eMail</title>
      <link>https://johnnye.net/post/maddy-email-simple-hosting</link>
      <description>Where I decide to run my own mail server.</description>
      <content:encoded><![CDATA[<p>Internet lore decrees that hosting your own email is impossible. Maybe not impossible but a disaster waiting to happen. Either its a Sisyphean task to configure and maintain, or you&rsquo;ll never be able to send email to anyone.</p>

<p>Is it really? Someone has to host the email that you don&rsquo;t want to.</p>

<p>I remember reading that 37Signals <a href="https://signalvnoise.com/posts/3096-giving-away-the-secrets-of-993-email-delivery">did their own email</a> 10 years ago. If such a small company could do it, maybe it wasn&rsquo;t that hard?</p>

<p>Having bought nye.lol for a federated social media instance (fediverse seems just as clunky to me). I decided what better domain to try hosting my own email. It&rsquo;s a joke domain running joke services.</p>

<p>The traditional stack of postfix, dovecot et al. seemed a bit complicated. I&rsquo;d recently passed by <a href="https://maddy.email">maddy.email</a> and an all in one install initially appears to be more my style.</p>

<p>So, I went to digital ocean, span up their smallest instance and started down the install guide. Within an hour I had a working setup.</p>

<p>The question is, did it work?</p>

<p>Mostly. I drew a &ldquo;clean&rdquo; IP address from lottery that is getting IPs assigned from a cloud provider. <a href="https://mxtoolbox.com">MX Toolbox</a> has a blocklist checker and it showed up just on the Barracuda and UCEPROTECT lists. UCEPROTECT is a pain because it uses blocks of IP addresses and also the organisation that owns them. However, my understanding is that UCEPROTECT isn&rsquo;t well regarded as being a strong spam signal. Barracuda removed me from the list overnight after filling out a removal request.</p>

<p>My assumption has been that if you do the work to put in place all the right DNS records for email delivery. <code>DKIM</code>, <code>DMARC</code>, <code>SPF</code>, etc. Which are part of the tutorial for configuring Maddy - then you&rsquo;ll be given the benefit of the doubt for sending email.</p>

<p>I&rsquo;m yet to implement MTA-STS and DANE records, these are a little more involved. So far Gmail has worked flawlessly and Microsoft is an ongoing process. Microsoft seems to just block by default any IP that hasn&rsquo;t been whitelisted. Unblocking was a simple process - but I still seem to be marked as spam.</p>

<p>So far, 2 days into hosting my email - things seem to be working well. The configuration was straight forward, documentation clear and conscise. Hosting hasn&rsquo;t been a pain and I can mostly send emails from my joke domain. Time will tell if this turns into a Sisyphean task.</p>

<h4>Postscript</h4>

<p>After writing this I noticed that maddy does occasionaly crash. I&rsquo;ve had it happen twice now in a week. Logging in and restarting service works. Fair warning - maddy is beta software.</p>
]]></content:encoded>
      <author>John Nye</author>
      <pubDate>Mon, 20 Jun 2022 04:21:45 +0000</pubDate>
    </item>
    <item>
      <title>Auto Deployments</title>
      <link>https://johnnye.net/post/auto-deployments-dokku</link>
      <description>Where I catch up with modern times &amp; build a Continuous deployment solution for this site</description>
      <content:encoded><![CDATA[<p>What magical times we live in, automatic deployments after every commit to the app running this website! I remember enviously reading about Capistrano while uploading files via FTP like an animal way back when. Finally got around to build out some reliable continuous deployments for my home projects, and it is a thing of beauty!</p>

<p><a href="https://dokku.com/docs/getting-started/installation/">Dokku</a> deals with all of the details of actually running containers for me on the VPS I have in a cloud somewhere.</p>

<blockquote>
<p>Powered by Docker, you can install Dokku on any hardware. Use it on inexpensive cloud providers. Use the extra cash to buy a pony or feed kittens. You&rsquo;ll save tens of dollars a year on your dog photo sharing website.</p>
</blockquote>

<p>We can save money, littteraly pennies are being saved.</p>

<p>I probably could have done this earlier, using some other platform, or even scripts and a post commit hook. Github actions though makes it easy, it&rsquo;s integrated right there next to my repo. Writing actions themselves is it a pretty horrible user experience if you&rsquo;re not familiar. The documentation isn&rsquo;t particularly clear, there isn&rsquo;t anyway to trial an action without commiting it to the repo. If you have any errors in your YAML file then, good luck figuring out what you did wrong. For me it&rsquo;s always almost indentation.</p>

<p>I&rsquo;m undecided if I want deployments when marking a release, or deploys when commiting to <code>main</code>. Either way having the <code>workflow_dispatch</code> option as a trigger allows you to manually run the job.</p>

<p>In github secrets for the repo add in a private key, and a signature for the host your pushing to.</p>

<p>Finally the <code>actions/checkout</code> step needs <code>fetch-depth: 0</code> to checkout with history otherwise dokku rejects the push.</p>

<pre><code>name: Deploy to dokku

# Controls when the workflow will run

on:
# Triggers the workflow on push or pull request events but only for the master branch

  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]
  #release when a version is tagged. 
  release:
    types: [ published ]

  

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
    - uses: actions/checkout@v3
      with:
        fetch-depth: 0

    - name: Install SSH key
      uses: shimataro/ssh-key-action@v2.3.1
      with:
        key: ${{ secrets.SSH_PRIVATE_KEY }}
        name: id_rsa # optional
        known_hosts: ${{ secrets.KNOWN_HOSTS }}

    - name: Push to Dokku
      run: |
        git remote add dokku dokku@d.example.com:container
        git push dokku master
     
</code></pre>
]]></content:encoded>
      <author>John Nye</author>
      <pubDate>Mon, 23 May 2022 06:03:05 +0000</pubDate>
    </item>
    <item>
      <title>The Rules</title>
      <link>https://johnnye.net/post/the-rules</link>
      <description>Aspirational targets for this site. </description>
      <content:encoded><![CDATA[<ol>
<li>new layout for anything over 512 words</li>
<li>article, section containing <code>h1</code> publish date, etc. then only basic html tags, <code>p</code>, <code>ul</code> etc</li>
<li>only <del>1</del> 2 typeface (except for code extracts, then one monospaced font is ok)</li>
<li>must work on mobile too. Although a more normal experience, single column, is ok on smaller screens.</li>
<li>only CSS is allowed to style the content. No JavaScript.<br>
</li>
</ol>

<p>These rules are dated 2020-01-20, I forgotten about them when finally getting around to building this CMS. I seem to have done a good job of internalising them as I seem to have implemented them.</p>
]]></content:encoded>
      <author>John Nye</author>
      <pubDate>Thu, 19 May 2022 05:05:51 +0000</pubDate>
    </item>
    <item>
      <title>Muntheschrift vs Fabritius</title>
      <link>https://johnnye.net/post/muntheschrift-vs-fabritius</link>
      <description>The only Norwegian designed lead type </description>
      <content:encoded><![CDATA[<p>At the Stavanger Graphics museum there is a small mention of Fabritius being the only lead type of Norwegian design. Inspired by the hand illustrated and lettered by by Gerhard Munthe of the ancient poem &ldquo;Draumkvædet&rdquo;. It&rsquo;s taken a while to get around to looking for a digital version, being a blackletter font I don&rsquo;t think I be using it any time soon.</p>

<p>I came across this fascinating article (<a href="http://www.typografi.org/munthe/muntheschrift.html">Gerhard Munthe and the struggle for a typeface of the early Middle Ages</a>) into the history of trying to get this font, from illustration to typeface and the failure of Muntheschrift to see the light of day. The long swishes on the example prints are fascinating, so too are the struggles to fit the typeface onto lead. The whole history of the typeface, with its mix of roman and gothic capitals, and inspiration from ancient texts is well worth a read.</p>

<p>While at the museum there were some print samples from a Ludlow print press - in Tempo. Tempo 😍 the Futura I never knew I loved, but sadly there is no digital recreation of it. &ldquo;LudlowTempo&rdquo; is not Tempo. Plumbing the depths of the internet for samples of Tempo, I learnt a bit more than needed about Ludlows type, from &ldquo;<a href="https://blog.threestepsahead.com/general/the-ludlow-typographic-influence-1931–1962/"># The Ludlow: Typographic Influence, 1931–1962</a>&rdquo;</p>
]]></content:encoded>
      <author>John Nye</author>
      <pubDate>Wed, 13 Apr 2022 15:51:30 +0000</pubDate>
    </item>
    <item>
      <title>PiHole and OpenVPN</title>
      <link>https://johnnye.net/post/pihole-and-openvpn</link>
      <description>Finally a meaningful use for my Raspberry Pi! </description>
      <content:encoded><![CDATA[<p>I used the $5 a month server from DigitalOcean to boot up this <a href="https://github.com/digitalocean/OpenVPN-Pihole">pre-built image</a>. Ideally I’d like it to be true to form and running on a Pi, maybe on my home network. Alas that can’t be for a few more months.</p>

<p>Setup was super easy - I’ve gone for <a href="http://tunnelblick.net">TunnelBlick</a> rather than the official OpenVPN client for MacOS as I’ve used it for work previously. I had a few hiccups with TripMode blocking the agents - my stupid fault.</p>

<p>So far after about a week of running it I’m pretty pleased. There is a noticeable speed bump when on really slow or tenuous connections. About 20% of requests get blackholed by the DNS server.</p>

<p>One unexpected improvement is that my search results on DuckDuckGo are massively improved. I have the VPN in the London data centre and now I get much more relevant results then I ever got from Norway or when travelling. The problem is that DuckDuckGo seems to default to US based sites when it can’t fulfil a request with a local site. So searching for shopping items etc. was always a horrible experience.</p>
]]></content:encoded>
      <author>John Nye</author>
      <pubDate>Mon, 20 Jan 2020 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Things I have Learnt This Week (50)</title>
      <link>https://johnnye.net/post/things-50-2019</link>
      <description>NSOutlineView and Deficient RSS in Hugo</description>
      <content:encoded><![CDATA[<h2>NSOutlineView and It’s Data Structure</h2>

<p>I’m jumping through what feels like daft hoops to get Swift to cast <code>Any</code> to something sensible for the NSOutlineViewDataSource. <code>Any</code> doesn’t have the nice <code>isKind(of:)</code> methods that I’d use in Objective-C. Having a data structure with mixed data, <code>String</code> and a CoreData object it’s messy. I’ll have to come back and fix this later. Working is better than not, even if it is inefficient.</p>

<p>I realise that progress marches to it’s own beat. Often with Swift I’m trying to get the language to play nice with the frameworks. It’s a shame - but maybe with SwiftUI things will be easier.</p>

<h2>Hugo and RSS</h2>

<p>It seems that Hugo only ships with the summary in RSS feeds - that seems a shame. From a quick google it seems as if there isn’t a simple way to fix this. I don’t particularly want to become a Hugo developer - but it seems as if you do need to get fairly involved with the CMS to get what you want out of it.</p>
]]></content:encoded>
      <author>John Nye</author>
      <pubDate>Sun, 15 Dec 2019 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Things I Have Learnt This Week (49) </title>
      <link>https://johnnye.net/post/things-49-2019</link>
      <description>Embedded Binaries, no WiFi and AppKit</description>
      <content:encoded><![CDATA[<h2>Embedding Binaries in MacOS Apps.</h2>

<p>Don’t tick the <code>sign on embed</code> box when embedding binaries in a sandboxed application. You’ll get an annoying error message when using it from <code>NSTask</code>, or <code>Process</code> in swift. I’m not entirely sure that I’ve enacted the correct magic incantations to pass app review - but who says this app will ever make it to the App Store.</p>

<h2>NSPopover</h2>

<p>Using NSPopover don’t init the popover directly, rather use the presenting view controllers method <code>func present(_ viewController: NSViewController, asPopoverRelativeTo positioningRect: NSRect, of positioningView: NSView, preferredEdge: NSRectEdge, behaviour: NSPopover.Behavior)</code> This gives you the dismiss with <code>escape</code> for free.</p>

<h2>macOS Networking</h2>

<p>If you’re on a WiFi connection that isn’t connected to the internet - all sorts of funky stuff happens on macOS Catalina. Applications take forever to open, Simulator doesn’t work full stop - <code>launchd failed to open simulator</code>. Does simulator <em>really</em> need an internet connection to open?</p>
]]></content:encoded>
      <author>John Nye</author>
      <pubDate>Mon, 09 Dec 2019 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Back</title>
      <link>https://johnnye.net/post/back</link>
      <description></description>
      <content:encoded><![CDATA[<p>In 2013 I hit a bit of a bump in the road, I deleted a lot of my online presence and scaled back lots of thing in my life. So 6 years later I realise I miss blogging - looking at the wayback machine there are a few things I have written that I&rsquo;m actually proud of.</p>
]]></content:encoded>
      <author>John Nye</author>
      <pubDate>Wed, 04 Dec 2019 09:36:22 +0000</pubDate>
    </item>
    <item>
      <title>Emergency Number API</title>
      <link>https://johnnye.net/post/emergency-number-api</link>
      <description>An API with Emergency Numbers for every country. Open Sourced Data.</description>
      <content:encoded><![CDATA[<p><a href="https://emergencynumberapi.com">Emergency Number API</a>: is exactly what is says on the tin. It is an API that provides Emergency Numbers given a country. Built in Golang, the data is open sourced and available on <a href="https://github.com/EmergencyNumbersAPI/data">Github</a>.</p>

<p>Documentation can be found at <a href="https://emergencynumberapi.com/docs">https://emergencynumberapi.com/docs</a></p>
]]></content:encoded>
      <author>John Nye</author>
      <pubDate>Tue, 10 May 2016 09:35:14 +0000</pubDate>
    </item>
  </channel>
</rss>