<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>de1ux</title><link>/</link><description>Recent content on de1ux</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Thu, 09 Oct 2025 09:51:04 -0600</lastBuildDate><atom:link href="/index.xml" rel="self" type="application/rss+xml"/><item><title>Building a Gameboy repair cartridge from scratch</title><link>/posts/building-a-gameboy-repair-cartridge-from-scratch/</link><pubDate>Thu, 09 Oct 2025 09:51:04 -0600</pubDate><guid>/posts/building-a-gameboy-repair-cartridge-from-scratch/</guid><description>Disclosure: PCBWay sponsored the PCBs for this project.
The Graveyard Box 🪦 Last year (2024), I started buying up broken Pokemon games on eBay. The idea was simple: find games that didn&amp;rsquo;t work, get them working again, and sell them back to players.
The graveyard box of unfixable cartridges
I learned some basic repair techniques, but ended up with 114 cartridges that I couldn&amp;rsquo;t fix.
My repair tracking page, broken cartridges ain&amp;rsquo;t cheap</description></item><item><title>Building a Puzzle Box</title><link>/posts/building-a-puzzle-box/</link><pubDate>Sat, 17 Sep 2022 15:28:29 -0600</pubDate><guid>/posts/building-a-puzzle-box/</guid><description>The finished boxes, ready to send out
Background I decided to make something fun for my teammates to hack on during a team offsite in France. Although I didn&amp;rsquo;t end up bringing these overseas, I still wanted to detail how they were made, what was involved.
Each puzzle box has a couple of games, using some of my favorite sensors for the Arduino.
Game 1 I stole this game from this arcade machine</description></item><item><title>ESP-IDF for Arduino Users</title><link>/posts/esp-idf-for-arduino-users/</link><pubDate>Thu, 18 Aug 2022 23:07:40 -0600</pubDate><guid>/posts/esp-idf-for-arduino-users/</guid><description>Why switch from Arduino to ESP-IDF? If you&amp;rsquo;re like me, you love all the cheap, WiFi-y goodness of Espressif MCU&amp;rsquo;s, but hate the complexity of the Espressif IoT Development Framework (esp-idf). So you decide to go with the Arduino framework, and all is well and there is much rejoicing.
For a time. Enter the watchdog.
The idea is to reap long-running, unresponsive tasks. If a thread doesn&amp;rsquo;t yield, doesn&amp;rsquo;t ask the watchdog for more time, it gets reaped.</description></item><item><title>My hardware/software projects that survived and died in 2021</title><link>/posts/hardware-software-projects-that-survived-or-died-in-2021/</link><pubDate>Thu, 06 Jan 2022 09:43:02 -0700</pubDate><guid>/posts/hardware-software-projects-that-survived-or-died-in-2021/</guid><description>I made some stuff in 2021 Here&amp;rsquo;s a breakdown of projects and outcomes.
Your Diagram TitleHardware → Projects started: 7Projects started → Alive: 6Projects started → Dead: 4Alive → Not ready yet: 4Software → Projects started: 3Alive → Open-sourced: 2Cat water bowl filler → Hardware: 1Giant vending machine → Hardware: 1Grafana e-paper → Hardware: 1Statlord → Hardware: 1Thermal printer → Hardware: 1Kegerator flow gauge → Hardware: 1Home inventory → Hardware: 1Shitbanker → Software: 1Omni → Software: 1Librarian → Software: 1Cat water bowl filler: 1Cat water bowl filler: 1Giant vending machine: 1Giant vending machine: 1Grafana e-paper: 1Grafana e-paper: 1Statlord: 1Statlord: 1Thermal printer: 1Thermal printer: 1Kegerator flow gauge: 1Kegerator flow gauge: 1Home inventory: 1Home inventory: 1Shitbanker: 1Shitbanker: 1Omni: 1Omni: 1Librarian: 1Librarian: 1Dead: 4Dead: 4Hardware: 7Hardware: 7Software: 3Software: 3Alive: 6Alive: 6Not ready yet: 4Not ready yet: 4Open-sourced: 2Open-sourced: 2Projects started: 10Projects started: 10</description></item><item><title>Traefik: gotchas</title><link>/posts/traefik-gotchas/</link><pubDate>Tue, 22 Jun 2021 22:01:12 -0600</pubDate><guid>/posts/traefik-gotchas/</guid><description>Background Last year, I started running Traefik full-time in my homelab. Coming from nginx, I&amp;rsquo;m happy that its
not nginx HTTP/2 support out-the-box decent troubleshooting dashboard plug-n-play with k3s, prometheus But it&amp;rsquo;s not all roses. I&amp;rsquo;ve lost a few evenings (and a couple Saturdays) troubleshooting my Traefik setup.
Hopefully these gotchas will saves someone, somewhere a few hours of head-scratching.
I can&amp;rsquo;t reach the Traefik dashboard No, it&amp;rsquo;s not that you disabled the dashboard in the configuration file.</description></item><item><title>State of the homelab</title><link>/posts/state-of-the-homelab/</link><pubDate>Sun, 13 Jun 2021 20:58:47 -0600</pubDate><guid>/posts/state-of-the-homelab/</guid><description>Baby steps Rack mounted RIP power bill Specs From top to bottom
Edgerouter 4 Edgeswitch 24 (non-PoE) Netgear PoE, Starlink PoE Injector Synology DS220j, Synology DS720+ Ebay Special Dell r430, 48gb RAM, 2x E5-2630v3 Dell r510, 32gb RAM, 2x X5670 CyberPower 2100VA/1650W Software proxmox k3s postgres / timescale grafana / prometheus / snmp exporters docker registry traefik kafka consul gitea unifi / uisp openvpn and a whole bunch of homebrew projects!</description></item><item><title>Best of 2020: kids, homelab, books</title><link>/posts/best-of-2020/</link><pubDate>Sun, 03 Jan 2021 10:58:00 -0700</pubDate><guid>/posts/best-of-2020/</guid><description>Kids Having a kid was easily the best part of 2020. There&amp;rsquo;s so much stuff to do. Prepare for, learn. At times it was overwhelming, but when my son was born, it easily became one of the greatest joys of my life.
He taught me some stuff too, like how badly I had prepared for fatherhood. For the 9 months leading up to his birth, I had spent all my time reading up about babies.</description></item><item><title>Installing Debian 10 on a Dell PowerEdge R510</title><link>/posts/installing-debian-10-on-dell-r510/</link><pubDate>Tue, 10 Nov 2020 19:20:58 -0700</pubDate><guid>/posts/installing-debian-10-on-dell-r510/</guid><description>It takes a little finaggling to get a 10 year old server to run the latest Debian with RAID 5 or 6.
The Perc 6/i RAID controller needs the MBR on the beginning 100GB of the virtual drive, or partition layout. If it&amp;rsquo;s not, and you let the Debian partition installation wizard suggest a layout, it&amp;rsquo;ll fail on first boot.
Every time I got it wrong, it dropped me into GRUB rescue mode with the message</description></item><item><title>Graphing Eigen's vitals With Timescale, Grafana and the Owlet Smart Sock</title><link>/posts/graphing-babys-vitals-with-timescale-grafana-and-the-owlet-smart-sock/</link><pubDate>Mon, 09 Nov 2020 17:37:00 -0600</pubDate><guid>/posts/graphing-babys-vitals-with-timescale-grafana-and-the-owlet-smart-sock/</guid><description>Goal Monitor your newborn&amp;rsquo;s heart rate, O2 levels and more in Grafana!
Note: some of the graphs (particulate, temp, etc are from a Pimoroni Enviro+, not the sock)
Parts Required server: don&amp;rsquo;t need anything extravagant &amp;ndash; a Raspberry Pi 4 can easily handle the python scraper, grafana and postgres. I used the default, 32-bit Raspbian OS with the Desktop environment.
baby: put sock on baby
sock: tested with the Gen3 Owlet Smart Sock.</description></item><item><title>Controlling an esp32 with a trackball</title><link>/posts/controlling-an-esp32-with-a-trackball/</link><pubDate>Sat, 15 Jun 2019 12:15:03 -0600</pubDate><guid>/posts/controlling-an-esp32-with-a-trackball/</guid><description>ESP32, Sharp Memory LCD, 6DOF and trackball
Confession: I have always used a library/wrapper for working with components.
At work, high-level stuff like Go, Python, REST/HTTP is the norm. Writing C, low level communications is not.
So when my shiny Pimoroni trackball arrived without an Arduino library: the horror. When I don&amp;rsquo;t find an Arduino library for a component, it usually turns into a paperweight.
But this is the tipping point.</description></item><item><title>Realtime canvas with Puppeteer, Go and Typescript</title><link>/posts/realtime-canvas-with-puppeteer-go-and-typescript/</link><pubDate>Fri, 19 Apr 2019 22:29:15 -0600</pubDate><guid>/posts/realtime-canvas-with-puppeteer-go-and-typescript/</guid><description>What I quickly wrote an app that lets users paint on an HTML5 canvas together.
Puppeteer is used to simulate headless browser users (instead of direct API calls).
If you&amp;rsquo;ve read any of my gRPC with Typescript and Go posts, you&amp;rsquo;ll be familiar with the tech &amp;ndash; it&amp;rsquo;s an RPC service with two methods
...service DrawService { rpc SendDrawing(Drawing) returns (None); rpc GetDrawings(None) returns (stream Drawings) {}}... Right now, Puppeteer simulates a single user.</description></item><item><title>CI/CD from scratch with Kubernetes and Gitlab</title><link>/posts/cicd-autoscaling-two-apps-from-scratch/</link><pubDate>Sat, 06 Apr 2019 22:55:49 -0600</pubDate><guid>/posts/cicd-autoscaling-two-apps-from-scratch/</guid><description>Code gets built. Tested, Shipped. Scaled. You&amp;rsquo;ve probably inherited, or wrote products that kept these processes humming happily along.
But writing all of it from the ground up? What tools would you use? Given a clean canvas, what would you do differently?
Below is my journey creating a CI/CD workflow using primarily Kubernetes and Gitlab.
I&amp;rsquo;ll be simulating two &amp;ldquo;teams&amp;rdquo; using my brand new workflow to get their code into prod.</description></item><item><title>Building a wristwatch</title><link>/posts/building-a-wristwatch/</link><pubDate>Fri, 22 Mar 2019 03:22:00 -0600</pubDate><guid>/posts/building-a-wristwatch/</guid><description>In my personal life, I like collecting watches.
Usually I go after cheap quartz watches. The weirder the better.
How else would you let others know your extremeness and athleticism?
I&amp;rsquo;ve always wondered what it would be like to build my own wrist watch&amp;hellip; start simple, maybe work my way up to a smart watch?
Enjoy
Attempt 1 The first microcontroller I chose was the ATtiny85. Praised for its low power consumption, this 8-bit MCU sports 512B of memory and either SPI or I2C out.</description></item><item><title>gRPC with Typescript and Go (part 3)</title><link>/posts/grpc-with-typescript-and-go-part-3/</link><pubDate>Fri, 28 Dec 2018 04:00:00 -0600</pubDate><guid>/posts/grpc-with-typescript-and-go-part-3/</guid><description>In part 2 we implemented the service. Let&amp;rsquo;s write a Typescript client to complete the app.
Geting the Typescript setup out of the way $ tsc --init $ npm i --save grpc-web-client $ npm i --save-dev webpack@4 webpack-cli@4 awesome-typescript-loader typescript @types/google-protobuf
Quick webpack config for transpilation to Javascript const webpack = require(&amp;#39;webpack&amp;#39;); module.exports = function makeWebpackConfig() { let config = {}; config.entry = { index: &amp;#34;./index.ts&amp;#34;, }; config.devtool = &amp;#39;eval-source-map&amp;#39;; config.</description></item><item><title>gRPC with Typescript and Go (part 2)</title><link>/posts/grpc-with-typescript-and-go-part-2/</link><pubDate>Sat, 22 Dec 2018 23:01:00 -0600</pubDate><guid>/posts/grpc-with-typescript-and-go-part-2/</guid><description>In part 1 we:
defined a gRPC service (LogService) generated the server and client with protoc stubbed the gRPC server implementation in Go Getting logs from Kubernetes Right now, our GetLogs method is not very interesting.
func (service) GetLogs(_ context.Context, request *api.GetLogsRequest) (*api.GetLogsResponse, error) { panic(&amp;#34;implement me&amp;#34;) } Let&amp;rsquo;s import the lovely Kubernetes client-go and get to work returning real logs.
Get a client to communicate with the Kubernetes cluster func getClientSet() (*kubernetes.</description></item><item><title>What I learned from a year of DevOps</title><link>/posts/what-i-learned-from-a-year-of-devops/</link><pubDate>Thu, 29 Nov 2018 02:32:00 -0600</pubDate><guid>/posts/what-i-learned-from-a-year-of-devops/</guid><description>Last year I had the opportunity to join DevOps, and with it, a whole new class of challenges that Ops faces.
And I&amp;rsquo;m glad I did.
But if I could have given myself some knowledge to prepare for DevOps a year ago, this would be it.
You will (still) grow as a Developer in DevOps During the interview, my first question was can I still code. And the short answer to that is yes.</description></item><item><title>Kubernetes client-go: updating, rolling back a deployment</title><link>/posts/kubernetes-go-creating-updating-rolling-back/</link><pubDate>Fri, 23 Nov 2018 01:34:00 -0600</pubDate><guid>/posts/kubernetes-go-creating-updating-rolling-back/</guid><description>WARNING All of this was written during version 6.0 of the Kubernetes client. The information here may be out of date: ymmv
Picking the right Kubernetes client version Kubernetes provides an excellent compatibility matrix to help target the right client version for communicating with the cluster.
Don&amp;rsquo;t worry about picking a minor version higher than your current Kubernetes API minor version; I targeted two versions ahead of the API server and all tested out well.</description></item><item><title>gRPC with Typescript and Go (part 1)</title><link>/posts/grpc-with-typescript-and-go-part-1/</link><pubDate>Wed, 14 Nov 2018 04:49:00 -0600</pubDate><guid>/posts/grpc-with-typescript-and-go-part-1/</guid><description>One of the best tools for diagnosing failed Kubernetes deployments is with the log viewer, kubectl logs.
But direct kubectl logs may be restricted to Ops if your organization doesn&amp;rsquo;t allow engineers access to the Kubernetes cluster.
Or, our end users might not be engineers at all, but still want something to send along with a report.
Either way it&amp;rsquo;s a convenient excuse to build a webapp that gives anyone with a browser the same functionality as kubectl logs.</description></item><item><title>Contracting</title><link>/contracting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/contracting/</guid><description>Looking for a developer in the U.S. that won&amp;rsquo;t ghost you?
I&amp;rsquo;d love to help. I&amp;rsquo;m available for medium-term engagements (~15/hrs a week).
Resume 10 years developing products at agile companies Python / Go / Javascript / Typescript DevOps included: Terraform, AWS, GCP more Contact Drop me a line at nathan@de1ux.com</description></item></channel></rss>