<X />C{}JS();

It's Been a While

December 11, 2025

AI Generated Image Featuring an Assortment of Technology Logos, such as GitLab, Ansible, and Node.js

Eleven years, in fact. I've gotten older and hopefully a little wiser – I'm no longer the young mid‑20s technologist I once was. Life circumstances drastically redirected the momentum I had built around myself, pulling my attention away from engaging with technology constructively for a time.

I made a very difficult decision to course‑correct and prioritize myself and my passions at great personal cost. I could not have lived with the alternative.

That being said, what have I been up to since the last update to this site?

GitLab

I’ve hosted GitLab since 2015 out of a desire to own my own data, control access to repository mirrors, and use it as a frontend for GitHub. As GitHub grew, joined Microsoft, and made more controversial decisions, I largely abandoned pushing to it. I’m not against utilizing it as I originally intended, but it largely became a secondary concern.

Still, I hope to use GitHub for future open‑source contributions should I ever create anything of note.

Another primary reason I focused on my private GitLab instance was GitHub’s lack of a CI/CD offering at the time. Of course GitHub Actions would be released in 2019, but I enjoyed the benefits of GitLab Runner for a few years ahead of the curve. I still use GitLab Runners to this day.

I started with a shell runner, but quickly moved to docker runners. I now have four docker runners running inside Docker itself, using the docker:dind (Docker‑in‑Docker) image.

Ansible

IaC (Infrastructure as Code) always made intuitive sense to me.

First, disaster recovery – it’s one thing to install and configure GitLab and other self‑hosted services, but what would I do if I needed to reproduce that effort?

Hard drives crash. Package managers misconfigure. Destructive bugs happen. Servers can be compromised, migrated, or upgraded. Do I want to relearn every nuanced configuration and install step for every server, package, or application I use in my personal infrastructure?

No. I record my knowledge as a set of interdependent roles in Ansible, tracked by version control so I can review the history of my changes as needed.

Ansible has been a game‑changer that allows me to manage both servers and clients alike with identically configured and installed roles. I can pick up any of my personal devices and expect it to be ready to go, even if I haven’t touched it in weeks or months.

Docker

Docker has become a staple in my personal infrastructure. I run my own container registry through my self‑hosted GitLab instance and design and build my own containers when necessary.

  • Autoheal keeps my containers running. Docker restarts containers where the process exits, but if a container is just labeled unhealthy it sits there uselessly.
  • Watchtower keeps my containers updated based on my selected tag, and I largely allow it to perform rolling updates across most of my containers. I prefer security updates over the risk of stability, but I’ve had far fewer issues than expected from this trade‑off.

Node.js/TypeScript

While C# is my favorite language, TypeScript is a close second. Both were designed by Anders Hejlsberg, so the similarity makes sense. The JavaScript ecosystem is frequently criticized, but its breadth of libraries makes development enjoyable.

Node.js recently gained native TypeScript support. I haven’t migrated many of my TypeScript projects to use it yet, but I look forward to it.

I typically embed my Node.js applications in the Node.js binary using the pkg package. This adds a small obfuscation layer to my source in closed‑source projects and makes distribution a lot easier and faster, so I don’t have to ship an entire node_modules/ tree.

Drone Piloting

Seven years ago, I purchased a DJI Mavic Air that I was very excited to use for photography and videography.

Unfortunately, it felt like no time at all before the United States passed a law requiring Remote ID for all drones above the 0.55 lb limit. DJI never updated the original Air to support this, and DJI Fly was removed from the Google Play Store in 2021.

I have great memories, photos, and videos of flying the drone, but I gave up with the rapidly rotating regulations and mysterious DJI app behavior. Maybe I’ll return one day, but I have a lot more on my to‑do list first.

Beat Saber/VR

During the early days of the pandemic, I grabbed a Valve Index VR kit. I didn’t let the opportunity expire. With social distancing, I could explore virtual spaces, which helped keep me sane.

I built up a collection of VR titles, but I kept returning to Beat Saber. I had never been a fan of rhythm games, but something inside me adapted to this game like no other before. I can play any song at expert difficulty and have a few ranked at expert+.

NAS/MergerFS

A few months later, my NAS system died. I’ve always been interested in niche hardware, and my poor GNUBee could not take it any longer.

Under a tighter budget, I explored panicked options. By combining available hardware on eBay, I assembled an 8‑bay NAS system for ~$420.00 USD, minus the hard drives I already owned.

The GNUBee supported only 5 Mbps under my workloads. The replacement system kept up with gigabit speeds, even with a Gen 3 Intel i3 processor.

Today, using MergerFS, it supports up to 75 TB of storage.

Discord Community

I’ve had a Discord account and community for a while because of friends, but only during the pandemic did I truly invest in it.

Today the XCJS Discord has over 100 members and has become a testing lab for my new software projects and technology discussions. If you’re reading this, we’d love to have you.

Generative AI

Generative AI is everywhere in today’s world, for better or worse. I couldn’t resist building a mid‑range AI server at home while PC hardware pricing was more reasonable.

The server originally featured a 12 GB Nvidia RTX 3060 and my old 8 GB RTX 2070 Super. After giving a presentation to my employer, I was gifted a 16 GB RTX 5060 Ti to continue my research and experimentation.

I spec’ed it all to fit inside a micro‑ATX case. I’m not sure whether I’m proud or embarrassed that the RTX 2070 Super and RTX 5060 Ti had to be suspended by zip ties from the top.

I started with EasyDiffusion, briefly moved to Automatic1111, and finally graduated to ComfyUI, alongside Ollama and Open WebUI for LLM inference.

Musebot

What use is an AI server if you can’t let your friends borrow it? That was why I created Musebot.

What started as a simple Node.js Discord bot turned into a fairly complex piece of software engineering. It grew alongside my generative AI skill set, originally built on top of EasyDiffusion.

Today Musebot features:

  • Support for Ollama
    • User‑clearable context windows
    • Multi‑source context management, blending chat history from multiple users, the channel topic, and the system prompt
    • Reacts to message reactions
    • Includes media attachments when integrated with a ComfyUI backend
  • Support for ComfyUI
    • Image, video, audio, and miscellaneous output types
    • User‑customizable ComfyUI API workflow templates using predefined variables and Mustache syntax
    • User‑extendable img2img workflow types
    • Contextual image editing through user replies
    • LLM assistance for detailed media when integrated with an Ollama backend

It’s honestly been one of the most fun projects I’ve ever worked on, creating many memorable moments with friends, acquaintances, and strangers.

You can even purchase your own copy if you know how to configure the backend services yourself.

Headscale/Tailscale

Tailscale has made a positive impression in the self‑hosted community with its easy‑to‑use WireGuard networks. Why let them have all the fun when I can run my own control server with Headscale? The Tailscale client is open‑source and supports custom control servers.

I now have every host I manage in my personal infrastructure securely available online behind my own Tailnet. I don’t need Tailscale (the company) to do it.

Keycloak

Running Headscale requires an authentication server. I chose Keycloak for its versatility. The complexity is worthwhile, and I now use Keycloak to back authentication for many of my self‑hosted services. A colleague once marveled at my “digital empire.” I like that.

Nuxt.js and the Rebirth of this Web Site

That brings us to…well, now I suppose. This site has been neglected for a long time. It started as a personal technology blog, but I have an LLC to start, and maybe it’s finally time to do that.

Pico CMS was unsupported, so I needed something new.

I’ve always enjoyed working with the Vue framework. Based on that, Nuxt seemed the perfect candidate so I could also prepare backend services.

The updates may not be daily or even weekly, but I can do better than every 11 years.