<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>tradik.com</title>
  <link href="https://tradik.com/" rel="alternate"/>
  <link href="https://tradik.com/feed.xml" rel="self"/>
  <id>https://tradik.com/</id>
  <updated>2026-09-16T08:28:55Z</updated>
  <entry>
    <title>Three bugs in FreeBSD&#39;s ig4 driver, one dead touchpad</title>
    <link href="https://tradik.com/blog/freebsd-ig4-lpss-touchpad/"/>
    <id>https://tradik.com/blog/freebsd-ig4-lpss-touchpad/</id>
    <published>2026-09-16T00:00:00Z</published>
    <updated>2026-09-16T08:28:55Z</updated>
    <summary>A touchpad that died on every resume turned out not to be a suspend bug at all. FreeBSD never started the I2C controller the touchpad is wired to, for three separate reasons.</summary>
  </entry>
  <entry>
    <title>From Next.js to SSG: Rebuilding tradik.com</title>
    <link href="https://tradik.com/blog/from-nextjs-to-ssg/"/>
    <id>https://tradik.com/blog/from-nextjs-to-ssg/</id>
    <published>2026-08-07T00:00:00Z</published>
    <updated>2026-08-07T21:35:48Z</updated>
    <summary>tradik.com ran on Next.js with a static export: a React toolchain and a node_modules tree to publish nine pages that never change. It now runs on spagu/ssg — Markdown and YAML in, HTML out.</summary>
  </entry>
  <entry>
    <title>Good, fast, cheap: the triangle in one diagram</title>
    <link href="https://tradik.com/blog/good-fast-and-cheap/"/>
    <id>https://tradik.com/blog/good-fast-and-cheap/</id>
    <published>2020-05-18T08:45:39Z</published>
    <updated>2026-09-08T17:28:16Z</updated>
    <summary>Cheap and good is long, cheap and fast is ugly, good and fast is expensive, and the middle of the diagram is marked NO. A budget conversation in one image.</summary>
  </entry>
  <entry>
    <title>Four ways to get files into a git repository</title>
    <link href="https://tradik.com/blog/ways-to-upload-files-into-a-git-repository/"/>
    <id>https://tradik.com/blog/ways-to-upload-files-into-a-git-repository/</id>
    <published>2020-04-14T17:05:45Z</published>
    <updated>2026-09-08T22:15:35Z</updated>
    <summary>Web editor, GUI client, command line or an IDE — the same commit made four ways, and which one suits a one-line fix versus a whole theme.</summary>
  </entry>
  <entry>
    <title>FreeBSD 12.1: changing the default shell for jexec</title>
    <link href="https://tradik.com/blog/freebsd-12-1-default-shell-for-jexec/"/>
    <id>https://tradik.com/blog/freebsd-12-1-default-shell-for-jexec/</id>
    <published>2020-04-01T12:33:18Z</published>
    <updated>2026-09-08T17:28:16Z</updated>
    <summary>chsh, .profile and a path argument all fail to give jexec a different shell. Reading jexec.c shows why, and where the hardcoded /bin/sh comes from.</summary>
  </entry>
  <entry>
    <title>FreeBSD jails: extending the jls command</title>
    <link href="https://tradik.com/blog/freebsd-jails-extending-jls/"/>
    <id>https://tradik.com/blog/freebsd-jails-extending-jls/</id>
    <published>2020-03-31T11:06:43Z</published>
    <updated>2026-09-08T17:28:16Z</updated>
    <summary>jls reports the parameters a jail was defined with, not what it is doing now. A small script adds process counts, users and live state to the same table.</summary>
  </entry>
  <entry>
    <title>Installing Portainer on a remote machine over SSH</title>
    <link href="https://tradik.com/blog/install-portainer-on-a-remote-machine/"/>
    <id>https://tradik.com/blog/install-portainer-on-a-remote-machine/</id>
    <published>2020-03-25T15:18:13Z</published>
    <updated>2026-09-08T17:28:16Z</updated>
    <summary>Portainer&#39;s setup screen is served on port 9000 and expects a browser. An SSH tunnel puts that screen on your own laptop, with no X server on the box.</summary>
  </entry>
  <entry>
    <title>Trigger a Jenkins job from Bitbucket Pipelines</title>
    <link href="https://tradik.com/blog/trigger-a-jenkins-job-from-bitbucket-pipelines/"/>
    <id>https://tradik.com/blog/trigger-a-jenkins-job-from-bitbucket-pipelines/</id>
    <published>2020-03-03T13:54:56Z</published>
    <updated>2026-09-08T17:28:16Z</updated>
    <summary>Two Jenkins plugins, a parametrised job and one curl line in bitbucket-pipelines.yml — passing the commit hash across without a webhook in sight.</summary>
  </entry>
  <entry>
    <title>Mattermost 5.19 on FreeBSD 12.1, inside a jail</title>
    <link href="https://tradik.com/blog/mattermost-5-19-on-freebsd-inside-a-jail/"/>
    <id>https://tradik.com/blog/mattermost-5-19-on-freebsd-inside-a-jail/</id>
    <published>2020-02-16T23:49:58Z</published>
    <updated>2026-09-08T17:28:16Z</updated>
    <summary>Self-hosting Mattermost from the FreeBSD port: the jail, the database user, TLS with Let&#39;s Encrypt behind Cloudflare, and a working server in five minutes.</summary>
  </entry>
  <entry>
    <title>svn: E175002: Received fatal alert: protocol_version</title>
    <link href="https://tradik.com/blog/svn-e175002-received-fatal-alert-protocol-version/"/>
    <id>https://tradik.com/blog/svn-e175002-received-fatal-alert-protocol-version/</id>
    <published>2020-02-08T15:41:03Z</published>
    <updated>2026-09-08T22:15:35Z</updated>
    <summary>Jenkins could not check out from Subversion behind Cloudflare. The alert is a TLS version mismatch between SVNKit and a repository set to TLS 1.3.</summary>
  </entry>
  <entry>
    <title>Install a master Kubernetes cluster on CentOS 8</title>
    <link href="https://tradik.com/blog/install-a-master-kubernetes-cluster-on-centos-8/"/>
    <id>https://tradik.com/blog/install-a-master-kubernetes-cluster-on-centos-8/</id>
    <published>2019-11-18T22:00:12Z</published>
    <updated>2026-09-08T17:28:16Z</updated>
    <summary>The CentOS 8 walkthrough, where podman replaces docker and firewalld behaves differently — every command from a clean install to a joined worker node.</summary>
  </entry>
  <entry>
    <title>Filebeat for custom Nginx logs on FreeBSD 12.0</title>
    <link href="https://tradik.com/blog/filebeat-custom-nginx-logs-on-freebsd/"/>
    <id>https://tradik.com/blog/filebeat-custom-nginx-logs-on-freebsd/</id>
    <published>2019-11-09T22:50:23Z</published>
    <updated>2026-09-08T17:28:16Z</updated>
    <summary>Filebeat&#39;s Nginx module expects the default log format. Changing the grok patterns, adding a field and loading the ingest pipeline so Kibana parses your own.</summary>
  </entry>
  <entry>
    <title>Kubernetes vs Docker Swarm: a simple comparison</title>
    <link href="https://tradik.com/blog/kubernetes-vs-docker-swarm-simple-comparison/"/>
    <id>https://tradik.com/blog/kubernetes-vs-docker-swarm-simple-comparison/</id>
    <published>2019-11-02T16:04:42Z</published>
    <updated>2026-09-08T17:28:16Z</updated>
    <summary>Installation, scaling limits, load balancing, rollbacks, updates and logging, side by side — where Swarm is simpler and where Kubernetes earns the effort.</summary>
  </entry>
  <entry>
    <title>Install a master Kubernetes cluster on CentOS 7</title>
    <link href="https://tradik.com/blog/install-a-master-kubernetes-cluster-on-centos-7/"/>
    <id>https://tradik.com/blog/install-a-master-kubernetes-cluster-on-centos-7/</id>
    <published>2019-10-26T10:03:43Z</published>
    <updated>2026-09-08T17:28:16Z</updated>
    <summary>From the virtualisation flags a node needs to a working master: firewall rules, swap, kubeadm init, the pod network and joining the first worker.</summary>
  </entry>
  <entry>
    <title>Inside an APC APCRBC124 UPS battery cartridge</title>
    <link href="https://tradik.com/blog/inside-an-apc-apcrbc124-ups-battery-cartridge/"/>
    <id>https://tradik.com/blog/inside-an-apc-apcrbc124-ups-battery-cartridge/</id>
    <published>2019-10-24T10:39:03Z</published>
    <updated>2026-09-08T22:15:35Z</updated>
    <summary>Eleven photographs of an APCRBC124 taken apart: the glued sticker plate, the connector holder and the two 12V sealed lead-acid cells behind it.</summary>
  </entry>
  <entry>
    <title>Upgrading firmware on an HP 2620-24-PoEP from the GUI</title>
    <link href="https://tradik.com/blog/hp-2620-24-poep-firmware-upgrade/"/>
    <id>https://tradik.com/blog/hp-2620-24-poep-firmware-upgrade/</id>
    <published>2019-10-20T22:55:33Z</published>
    <updated>2026-09-08T22:15:35Z</updated>
    <summary>The switch keeps a primary and a secondary image, so an upgrade has a way back. Finding the right SWI file for a J9625A and flashing it from the GUI.</summary>
  </entry>
  <entry>
    <title>Setting time and date on an HP 2620-24-PoEP switch</title>
    <link href="https://tradik.com/blog/hp-2620-24-poep-time-and-date/"/>
    <id>https://tradik.com/blog/hp-2620-24-poep-time-and-date/</id>
    <published>2019-10-20T22:39:35Z</published>
    <updated>2026-09-08T22:15:35Z</updated>
    <summary>Three ways to give an HP 2620-24-PoEP the right time: an NTP server found with dig, SNTP unicast, or typing it in by hand over the console.</summary>
  </entry>
  <entry>
    <title>A release process built on trunk, tags and branches</title>
    <link href="https://tradik.com/blog/release-process-with-trunk-tags-and-branches/"/>
    <id>https://tradik.com/blog/release-process-with-trunk-tags-and-branches/</id>
    <published>2019-03-27T17:12:53Z</published>
    <updated>2026-09-08T22:15:35Z</updated>
    <summary>Who owns trunk, what a tag is for, and where a developer&#39;s branch fits — the repository layout behind a release, drawn as one diagram.</summary>
  </entry>
  <entry>
    <title>Captcha: a simple way to protect your website</title>
    <link href="https://tradik.com/blog/captcha-simple-way-to-protect-your-website/"/>
    <id>https://tradik.com/blog/captcha-simple-way-to-protect-your-website/</id>
    <published>2019-03-24T11:03:57Z</published>
    <updated>2026-09-08T22:15:35Z</updated>
    <summary>Why an unprotected form is a target, the six habits that keep bots out, and reCAPTCHA v3 on a WordPress site in about ten minutes.</summary>
  </entry>
  <entry>
    <title>Colour coding error categories: error, warning, notice</title>
    <link href="https://tradik.com/blog/colour-coding-error-categories/"/>
    <id>https://tradik.com/blog/colour-coding-error-categories/</id>
    <published>2019-03-19T23:36:15Z</published>
    <updated>2026-09-08T22:15:35Z</updated>
    <summary>Three severities, three colours, and one sentence each saying what the reader is expected to do about it. The whole convention on one screen.</summary>
  </entry>
</feed>
