<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Gareth Parris</title>
    <link>https://parris.me.uk/</link>
    <atom:link href="https://parris.me.uk/rss.xml" rel="self" type="application/rss+xml" />
    <description>Blog posts on networking, hardware projects, and career highlights.</description>
    <language>en-gb</language>
  <item>
    <title>kitty-pounce: A Flat-Ring Window Cycler for Kitty</title>
    <link>https://parris.me.uk/blog/kitty-pounce/</link>
    <guid isPermaLink="true">https://parris.me.uk/blog/kitty-pounce/</guid>
    <pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate>
    <description>Why I built kitty-pounce, a kitty terminal extension that cycles every window, tab and OS window as one flat ring.</description>
    <content:encoded><![CDATA[<p>This morning I built <a href="https://github.com/garethparris/kitty-pounce">kitty-pounce</a>, a small
<a href="https://sw.kovidgoyal.net/kitty/">kitty terminal</a> extension that cycles through every window,
in every tab, in every OS window, as one flat ring: one keypress moves forward or backward,
wrapping from the last one back to the first.</p>
<p>I run a lot of Claude Code agents at once, each in its own kitty window or tab, and finding the
right one again was getting harder as the count grew. The immediate trigger was hardware: my
Jiffy 75 keyboard has two rotary knobs, and the right one is already spoken for, volume and
mute, but the left one had nothing bound to it.</p>
<h2>Kitty already had three shortcuts, none of them the right one</h2>
<p>Kitty&#39;s built-in <code>next_window</code>/<code>previous_window</code> only cycle the windows in the current tab, and
<code>next_tab</code>/<code>previous_tab</code> only cycle the tabs in the current OS window. With several tabs and OS
windows open, there&#39;s no single keystroke that walks every window everywhere: switching to the
right agent meant switching OS window, then tab, then window, three separate actions for what
felt like one motion.</p>
<p>Kitty&#39;s own <code>select_tab</code> picker actually lists tabs from every OS window, which looked
promising, but it silently fails to switch to most of them. It hands the list to
<a href="https://github.com/kovidgoyal/kitty/blob/v0.48.2/kitty/boss.py#L2782-L2786"><code>Boss.set_active_tab</code></a>,
which only knows how to activate a tab inside the OS window that&#39;s currently focused. Not a bug
worth reporting so much as a gap kitty-pounce exists to fill, one level deeper.</p>
<h2>A flat ring was the obvious fit for a knob</h2>
<p>Turn it one way or the other and step through every window, tab and OS window as a single
continuous list, wrapping round at either end. That turned out to be a genuinely faster way to
find a specific agent than hunting through three separate shortcuts. kitty-pounce doesn&#39;t bind
the knob itself: it only reads the direction, <code>next</code> or <code>prev</code>, passed on the <code>map</code> line in
<code>kitty.conf</code>, so it works with whatever key or device someone wants to wire it up to.</p>
<p>It&#39;s a Python kitten, developed and verified against kitty 0.48.2. No lower bound is claimed yet
beyond that: kitty&#39;s own docs describe its internal APIs as &quot;neither entirely stable nor
documented&quot;, so I&#39;d rather state a floor once CI has actually tested more than one release than
guess at one now.</p>
<h2>What doesn&#39;t work yet</h2>
<p>Three honest limitations, straight from the README rather than glossed over:</p>
<ul>
<li><code>tab_bar_filter</code> is ignored. If a tab is hidden from the tab bar, kitty-pounce still visits
its windows: it enumerates every tab kitty knows about, not just the visible ones.</li>
<li>A stacked or grouped set of windows sharing one on-screen position counts as a single stop,
landing on whichever one was last active there, the same as kitty&#39;s own built-in cycling.</li>
<li>Crossing OS windows on different macOS Spaces triggers a real Space-switch animation. Kitty
exposes no API for a kitten to know which Space an OS window lives on, so there&#39;s no way to
avoid it: one keypress can trigger a full macOS Space switch if the next window happens to be
on another one.</li>
</ul>
<p>None of those are deal-breakers for what it&#39;s actually for, finding the next agent fast, but
they&#39;re worth knowing before wiring it up to something you&#39;ll be pressing a hundred times a day.</p>
<p>It&#39;s on GitHub, MIT licensed, if the same problem sounds familiar:
<a href="https://github.com/garethparris/kitty-pounce">github.com/garethparris/kitty-pounce</a></p>
]]></content:encoded>
  </item>
  <item>
    <title>Finalist, 2025 Graham Impact Awards</title>
    <link>https://parris.me.uk/blog/graham-impact-awards/</link>
    <guid isPermaLink="true">https://parris.me.uk/blog/graham-impact-awards/</guid>
    <pubDate>Sat, 01 Nov 2025 00:00:00 +0000</pubDate>
    <description>Named a Finalist for BrightSign&apos;s 2025 Graham Impact Awards, recognising contribution to the business.</description>
    <content:encoded><![CDATA[<p>Some welcome news to close out the year: I was named a Finalist for BrightSign&#39;s 2025 Graham Impact Awards, a company-wide award run by Graham Partners, BrightSign&#39;s private equity backer, recognising contribution to the business.</p>
<p>It landed at a good point in the year. I&#39;d been promoted to Director of Software Engineering not long before, now leading the Cloud, Platform and Client teams behind the BSN.Cloud SaaS platform and BrightSign Control Plus, and this was a nice bit of external recognition for the work those teams have been putting in.</p>
<p>None of it happens solo. Thanks to everyone across Cloud, Platform and Client for the work that made this possible.</p>
]]></content:encoded>
  </item>
  <item>
    <title>Event Technology of the Year 2020 Drum Award</title>
    <link>https://parris.me.uk/blog/drum-award/</link>
    <guid isPermaLink="true">https://parris.me.uk/blog/drum-award/</guid>
    <pubDate>Tue, 01 Dec 2020 00:00:00 +0000</pubDate>
    <description>Two Lines Meet won the Drum Awards&apos; Event Technology of the Year category for the MIT interactive wall project.</description>
    <content:encoded><![CDATA[<p>Last year I created a post about an Interactive Hardware and Software project I worked on with <a href="https://twolinesmeet.com/">Two Lines Meet</a> for <a href="https://betterworld.mit.edu/">MIT&#39;s Campaign for a Better World</a>.</p>
<p>In summer 2020, Two Lines Meet entered the <a href="https://www.thedrum.com/news/2020/11/09/finalists-revealed-the-drum-awards-experience-2020">Drum Awards, in the category &quot;Event Technology of the Year&quot;</a>. We were up against some strong, established contenders, like The Mill, and Momentum Worldwide.</p>
<p>As it turns out, <a href="https://twitter.com/TheDrum/status/1334538677381427201?s=20">we won the category award</a>! I&#39;d like to pass on my thanks to everyone in the team who helped us achieve this!</p>
<p>You can find <a href="https://parris.me.uk/blog/mit-wall">the original post here</a>.</p>
]]></content:encoded>
  </item>
  <item>
    <title>Custom SoHo Server Rack with Ubiquity Unifi</title>
    <link>https://parris.me.uk/blog/server-rack/</link>
    <guid isPermaLink="true">https://parris.me.uk/blog/server-rack/</guid>
    <pubDate>Wed, 01 Jul 2020 00:00:00 +0000</pubDate>
    <description>Upgrading a home network to a rack-mounted UniFi setup, plus the Raspberry Pi cluster living alongside it.</description>
    <content:encoded><![CDATA[<p>I&#39;ve just updated my SoHo network set-up from:</p>
<ul>
<li>UniFi USG 3P</li>
<li>UniFi USW-24-PoE 250 Switch</li>
<li>UniFi Cloud Key G2 Plus</li>
<li>2x UniFi AC Pro Access Points</li>
<li>3x UniFi G3 Dome Cameras</li>
<li>1x UniFi G3 Flex Camera</li>
</ul>
<p>to:</p>
<ul>
<li><a href="https://unifi-network.ui.com/dreammachine">UniFi Dream Machine Pro</a></li>
<li><a href="https://unifi-network.ui.com/switching">UniFi 24 Port PoE GEN2 Switch</a></li>
<li><a href="https://unifi-network.ui.com/wi-fi">2x UniFi NanoHD Access Points</a></li>
<li><a href="https://unifi-network.ui.com/camera-security">3x UniFi G3 Dome Cameras</a></li>
<li><a href="https://unifi-network.ui.com/camera-security">1x UniFi G3 Flex Camera</a></li>
<li><a href="https://unifi-network.ui.com/camera-security">1x UniFi G4 Bullet Camera</a></li>
</ul>
<p><img src="https://parris.me.uk/images/blog/server-rack-kit.jpg" alt="SoHo Server Rack"></p>
<p>It&#39;s using around 10W less power than the previous configuration and its quieter being passively cooled. I&#39;ve added a solar powered extraction fan, and a separate powered temperature monitoring module that will activate two intake and one exhaust fan if needed.</p>
<p>I&#39;m also running the following rack mounted equipment in there:</p>
<ul>
<li>Synology RS816 NAS Drive</li>
<li><a href="http://www.bitscope.com/product/BB04/">BitScope Quattro Raspberry Pi blade</a></li>
<li>Cyberpower 600VA UPS with Remote Management Adapter</li>
</ul>
<p>I&#39;m running six Raspberry Pis, ranging from an original Model B hosting <a href="https://www.flightradar24.com/">FlightRadar24</a>, an <a href="https://shop.openenergymonitor.com/emonpi/">EmonPi</a> power monitor on a Model 3B, and on the BitScope blade I have a model 4B, model 3B plus, model 3B and a model 2B all running <a href="https://www.docker.com/">Docker</a> and various containers hosting some applications 24x7 along with being a test bed for testing some simple micro-services prototypes.</p>
<p>Below is a quick demonstration of the UniFi AR feature: <a href="https://www.youtube.com/watch?v=0dlB-UAhTyw">youtube.com/watch?v=0dlB-UAhTyw</a></p>
]]></content:encoded>
  </item>
  <item>
    <title>Helping create an Interactive Wall for MIT</title>
    <link>https://parris.me.uk/blog/mit-wall/</link>
    <guid isPermaLink="true">https://parris.me.uk/blog/mit-wall/</guid>
    <pubDate>Fri, 01 Nov 2019 00:00:00 +0000</pubDate>
    <description>Designing and building the hardware and software behind an interactive wall for MIT&apos;s Campaign for a Better World.</description>
    <content:encoded><![CDATA[<p>In summer 2019, the MD of <a href="https://twolinesmeet.com/">Two Lines Meet</a> contacted me and asked if I could assist them with the software and hardware design and development of an interactive wall for <a href="https://betterworld.mit.edu/">MIT&#39;s Campaign for a Better World</a>.</p>
<p>My brief was to gather all of the interaction data from various hardware devices on the wall, and then build and transmit commands to a projection mapping software package called <a href="https://resolume.com/">Resolume</a>.</p>
<p>The hardware specification (shown in the image below) included:</p>
<ul>
<li>3x <a href="https://www.bareconductive.com/shop/touch-board/">Bare Conductive Capacitive Touch Boards</a></li>
<li>4x <a href="https://www.arduino.cc/en/Main/arduinoBoardUno/">Arduino Uno Boards</a> with various sensors attached, i.e. 3x RFID readers, a Magnetometer, and a pull-cord on/off switch</li>
<li>2x USB <a href="https://www.ultimarc.com/trackballs-and-spinners/spinners/">SpinTrak Precision Rotary controls</a> that produced a single dimensional mouse input</li>
<li>1x USB Microphone (for the clap sensor)</li>
<li>2x powered USB Hubs</li>
<li>1x Intel NUC PC</li>
<li>2x <a href="https://www.optoma.co.uk/product-details/zw400ust">Optoma Ultra Short Throw</a> projectors</li>
</ul>
<p><img src="https://parris.me.uk/images/blog/mit-wall-rear.jpg" alt="Rear Wall"></p>
<p>The software application itself was written as a C# WPF application using .NET Framework 4.8. Each wall section was written as a separate task, so they were all completely independent of each other. This was needed as multiple users could be interacting with different parts of the wall at any one time.</p>
<p>It interacted with both USB and USB/Serial hardware devices. There were several lower level pieces of code that needed to work well together, including the serial port handler and multiple mouse input devices. The latter required some Win32 calls to be able to select which mouse input device data was to be read from. Each task subscribed to the relevant input device handler in order to receive the appropriate events. That task then translated the data and sent instructions to Resolume in order to play the appropriate projection map.</p>
<p>Communication from the application to Resolume took the form of OSC packets. <a href="https://en.wikipedia.org/wiki/Open_Sound_Control">OSC is a networking protocol</a> sent over UDP. A combination of open-source libraries and proprietary code was used to tweak this to our requirements.</p>
<p>A simple WPF GUI was created to indicate the current status of each task and also to allow some minor tweaks as the application was running, like adjusting the USB microphone sensitivity to cater for changes in background noise levels throughout the event.</p>
<p><img src="https://parris.me.uk/images/blog/mit-wall-app.jpg" alt="Rear Wall"></p>
<p>The first event was hosted at the <a href="https://qeiicentre.london/">Queen Elizabeth II Conference Centre</a> in London, and we&#39;ve since been out to Stamford, Connecticut with it. Unfortunately, due to COVID, the MIT Campaign for a Better World tour has been put on hold.</p>
<p>Here&#39;s a video of the wall in action at the London Event: <a href="https://youtube.com/watch?v=Xov5VAHRwZk">youtube.com/watch?v=Xov5VAHRwZk</a></p>
]]></content:encoded>
  </item>
  <item>
    <title>Working with a Winning Team</title>
    <link>https://parris.me.uk/blog/mercedes/</link>
    <guid isPermaLink="true">https://parris.me.uk/blog/mercedes/</guid>
    <pubDate>Wed, 01 Nov 2017 00:00:00 +0000</pubDate>
    <description>Reflections on writing telemetry software for the Mercedes AMG F1 team.</description>
    <content:encoded><![CDATA[<p>In my career I&#39;ve always focused on my passion of technology and applied it to everywhere I&#39;ve worked. I made a choice not to focus on one specific business area, and instead try to gain a broad experience from many diverse businesses. Most of the places that I&#39;ve worked have generally been a positive experience, with the usual caveats of politics and red tape.</p>
<p>One place in particular that I enjoyed working was at Mercedes AMG HPP, writing software to support the engineers for the Mercedes F1 Team. What struck me here at Mercedes, was the passion that the entire company showed towards the business itself. Everyone I worked with was dedicated to the cause and loved their job.</p>
<p>What was also great was the fact that the business saw what the I.T. teams brought to the table, making meetings very productive. This allowed us to design and plan our projects well and deliver performant solutions that satisfied the requirements.</p>
<p>The best part though was the win. When Mercedes won a race, it felt like we all had won the race. I actually felt like the software I developed there really had contributed to that win in a small way. It&#39;s not often you get to feel your results as a software developer in a way that was as tangible as that. Good times!</p>
<p><img src="https://parris.me.uk/images/blog/mercedes-silver.jpg" alt="Rear Wall"></p>
]]></content:encoded>
  </item>
  </channel>
</rss>
