Can You Spot #000000?

I work with a UX designer who has a strong reaction every time she sees pure black (#000000) in a design. “It’s too harsh!” she’ll say, insisting that dark grays create more sophisticated digital experiences. Her passion got me thinking - could people actually tell the difference? That question turned into isit000000.com, a playful challenge that tests whether you can spot true black among various dark shades. Spoiler: it’s much harder than you’d think! ...

May 30, 2025 · 1 min · 143 words · Joey Gennari · 

Adding Vue Router and Shadcn-Vue to Fastify and Vite: Part 2

In Part 1, I walked through setting up Fastify, Vite, and TypeScript together, including all the gotchas I ran into along the way. Now that the backend and front-end tooling are working smoothly, it’s time to take things up a notch by adding page routing with Vue Router and enhancing the UI with Shadcn-Vue. Adding Vue Router The first step to building a more dynamic front-end is introducing client-side routing. This will let us navigate between different pages without needing full page reloads—a must-have for any modern web application. Vue Router is the standard tool for this job when working with Vue. ...

November 12, 2024 · 4 min · 701 words · Me · 

Fastify, Vite, and TypeScript Setup Guide - Part 1

This is a recap of how I got Fastify, Vite, TypeScript, and Tailwind CSS working together. It was a bit like assembling a complicated jigsaw puzzle without the picture on the box, and I ran into a few unexpected gotchas along the way. Here, I’ve documented what worked, what didn’t, and how I solved the problems that came up. Hopefully, this helps me revisit the setup later or assists anyone else going down the same path. ...

October 26, 2024 · 5 min · 862 words · Me · 

Submitting an Unraid Community App

In a previous post I created a docker container for Goatcounter, a privacy-friendly analytics service. I wanted to submit it to the Unraid Community Apps repository so that others could easily install it. This post will cover the process of submitting a new app to the Unraid Community Apps repository. The first step I took was to install the docker container from Docker Hub. To do this, you can use the “Click Here To Get More Results From DockerHub” link. ...

March 1, 2024 · 2 min · 334 words · Me · 

Creating a Docker Hub Repository

Recently I was looking to implement some analytics from this site and came across the following blog post by Haseed Majid: How to Add Page Views to your Hugo Blog Posts Using Goatcounter. I really like the concept of Goatcounter and wanted to try it in my self-hosted environment, but it appears the creator has strong opinions about Docker, so there’s no provided Dockerfile. There are a few implementations referenced in the readme, however they were all based on older versions and not kept up. ...

February 28, 2024 · 4 min · 789 words · Me · 

Adding Chat Context to Teams: Pt 2

Getting Started In Part 1 I explained how we were going to use Teams and Power Automate to generate a contextually aware chatbot for your team. We’re going to use Teams channel communication to simplify how we “window” communication. That gives us a few nice things out of the box: A list of messages that we can easily iterate over Multi-user communication A clear “beginning” and “end” to a conversation So I pulled in the “When a new channel message is added” trigger: ...

July 29, 2023 · 2 min · 387 words · Me · 

Adding Chat Context to Teams: Pt 1

Chatbots are handy, but let’s be honest, they can be a bit forgetful. Frustrated with bot conversations that felt like starting from scratch with every message, I decided to roll up my sleeves and tackle the problem. Armed with Power Automate and OpenAI, I started a quest to build a Microsoft Teams chatbot that could actually remember our chat history. Here’s a walkthrough of what I learned along the way - the successes, the hurdles, and everything in between. Let’s get into it. ...

July 25, 2023 · 2 min · 396 words · Me ·