Quarterly inventory – 2026 Q3

Dear FutureMe,

Today would be a good day to do a quarterly inventory.

How is your personal life going?

How is your work life going?

How is your Volunteer Service life going?

Future Me

Personal Life

Near the end of July, I will retire from 37 years of “doing computers” for my employer.

I have done so.

I have yet to get a good routine going. On the other hand, I have had a day or four that were wonderful.

Mom is gravely ill

At the beginning of the year, she was fine, if a little unsteady on her feet. The underlying problem is that she wasn’t getting enough exercise. In years past, she would do some gardening and go on trips with Frank. There were four falls in four months, although thankfully, she hadn’t broken any bones. But she was unable to get back up on her own feet by herself. Her cardiac condition has been deteriorating, and her doctor forced a pacemaker on her. Within a day, she was in the emergency room at Kaweah Delta and couldn’t get herself out of bed. She’s been almost entirely bedridden ever since. From KDDH, she went to a physical rehabilitation nursing home but didn’t really make much progress. Insurance stopped paying, so now she is at home getting palliative care. I’m visiting almost every day, but her health is in slow decline.

Twitter/X

I deactivated my paid account on 2026-07-02 because these unhelpful people couldn’t figure out how to get me logged in via email with a second-factor via SMS. I never did find out why my account was flagged for lockout. My suspicion is that what I was reposting was deemed offensive by some, and they reported me, and no one at Twitter is tasked with reigning in butthurt bullies even when it leads to the loss of a paying customer. But it worked: I’m off Twitter now.

Weekend in Las Vegas

I tried mobile ticketing with the Las Vegas monorail, and that was a disaster.

Actually, on the way out of the monorail, there was a placard announcing “This way to Freedom Fest”. Huh, I had heard about that from the Andrew Heaton podcast. I looked up their agenda, and yes, I would have really liked to have heard from Andrew and Spike Cohen. I went to see how much it costs, and … $250 for the day. Oof, I’m out. By now it’s already 10 AM, and the day would have been over with by 4 PM (and there would have been downtime too as they break for lunch).

So now I’ve spent money for two nights on a hotel room, $50 for a mediocre breakfast, felt scammed by the monorail (although really it was just bad software programming), and essentially napped and played a video game. Just staying home would have been better. Well, I hoped Jimmy Carr would be funny.1

But really, I would have been far better off getting a room in the Wynn, where the Jimmy Carr show was, and doing the Thursday night show (cheaper room rate) instead of the Friday night show. If I’d simply done a one-night stay and turnaround, I wouldn’t have tried to mess with the monorail, and I wouldn’t have had to walk outside in the heat and wouldn’t have paid for a rip-off breakfast buffet.

Retirement Life

I explored a few new computer languages to learn. I think I’ll go with Racket, which is a version of Lisp.

One thing I’ve wanted to do for four years now is to 3D print some button covers for my Anker PowerConf S500. There’s a whole story behind using it in a Zoom meeting every week as a portable microphone in a room of 30+ people, but fighting the fear of needing to scream at people: DON’T TOUCH THE BUTTONS!!!

And, by the way, stranger, welcome to the meeting. But please don’t touch the buttons.

That is to say, the Anker PowerConf S500 has four buttons on the front, but only one (the power button) is a press-and-hold-to-activate button. The other three are insta-kill for Zoom.2 The middle button for answering a telephone call: wow, does that ever break Zoom. One must actually power down the PowerConf S500, unplug the dongle from the Zoom laptop, Windows registers the microphone as gone, plug the dongle back into the Zoom laptop, and then power up the PowerConf S500. Windows registers the microphone as present again. Zoom reattaches. Meanwhile, the online meeting attendees are filling the Zoom chat with messages that they cannot hear anything anymore.

It’s a little stressful.

The in-person people want to be helpful. They reach for the speakerphone to pick it up and hand it to the microphone runner. Sometimes they touch the insta-kill button. Sigh. 3

Nicely enough, the Racket programming language and the OpenSCAD computer-aided design program are a match made in heaven. Here’s my button:

This is from the underside; the top has smooth curves.

Anyway, this quarter, the real reason I bought the Anycubic Photon Mono resin 3D printer was realized. And I had a lot of fun getting Racket to emit an OpenSCAD file directly. The only thing I didn’t try was to get the edge that will be glued to the PowerConf S500 to curve in the same way that the PowerConf S500 curves. It doesn’t curve much, so glue ought to be enough to fill in the gap. But the perfectionist in me would like to find out the Bezier curve of the face where the three buttons poke out and then slice away that top plane (in the Z axis) to match the curve.

Work Life

I have built one last mail relay server to replace one made in 2009. The one in 2009 was a big mistake (Tenets of IT #47). But to test it, I need to be able to use swaks from many places. The security team has been a little slow to update the firewalls to let boxes and networks talk to my new server. I finally got it done, and every time someone sends an undeliverable email, my server sends not just the bounce but the original message! This will vastly help the people who have configured systems with bad email addresses. Their biggest problem is identifying which system or process is generating the bouncing email.

I got my retirement going-away lunch on Wednesday, July 22, 2026. There were probably more than 25 but fewer than 30 people in attendance. I gave a speech about my 37-year journey in IT; I’d set the timer for seven minutes4 and finished up 15 seconds before the timer went off. 🙂

Volunteer Service Life

On the drive to Las Vegas, I listened to a fabulous podcast episode directly tying to what our organization does. It was just wonderful and made me grateful to go on the trip.

Clubhouse volunteer

I’ve started volunteering at a local clubhouse two days a week for 4 hours a day. Mostly, I’m a janitor, but I also run the cash register, selling sodas, bottled waters, and candy. There was a board meeting, and it looks like they would like me to become their IT guy too. Really, they need a server to run CiviCRM, but thankfully I was given a Raspberry Pi 5 as a retirement gift. My personality wants to price out a refurbished Dell Optiplex with an LSI 9207-8i connected to an ICY DOCK MB326SP-1B disk enclosure running TrueNAS over six SATA SSDs…. This project could quickly become unwieldy before I even start. A friend asked if I couldn’t just do it on a Raspberry Pi, and sure, I could.5 I just need to plan to eventually build a low-cost robust server and migrate away from the Pi. I also have a leftover Protectli Vault V1210, so I’ll set that up with HA Proxy to let the local box host CiviCRM and a Nextcloud instance.

Chairman for New Year’s Eve Party

I have volunteered to be the main planner/chairman of our New Year’s Eve party. The fun part so far has been that I recorded the audio of the two planning meetings (so far) and (installed and) used my local LLMs to turn the audio into summary documents. Next month, I’m going to ask if we can start buying a texting service so that I can use a web page for texting to communicate with volunteers.

SF 2026 Master of Ceremonies

For our most recent dinner-and-a-speaker event, I got to be emcee. A nice thing is that this service commitment gave me motivation to lose some weight, and I did drop twenty pounds over eight weeks. My clothes for the event certainly fit me better than if I had not lost the weight. A bummer is that I lost my hat. I loved that hat67. Perhaps it will show up in some sort of lost-and-found box, but I probably won’t hear about that for a week.

  1. Yes, he was funny. ↩︎
  2. Well, two of the three are insta-kill; if you tap the Bluetooth button while already on Bluetooth, nothing happens. ↩︎
  3. I actually sent in a product enhancement request to Anker for a firmware fix to make all the buttons press-and-hold-to-activate buttons but they didn’t implement that. I understand that: No company of mass market consumer appliances wants to complicate their technical support by first having to ask, “Which version of the firmware are you on?” Heck, how would anyone even figure that out? ↩︎
  4. No-one remembers anything if one talks too long, so brevity is the essence of a good speech. 37 years in seven minutes, with thank-yous and everything! ↩︎
  5. The major problem with using a Raspberry Pi as a server is that /var/log gets written to the SD card, and writing to it is continuous. SD cards are built to store data; they are not built for continuous writing – they wear out after months or a year or two. If you know that it will wear out and die, you build a routine of backing up the SD card periodically. Then when it dies, it’s not a catastrophic loss of data. ↩︎
  6. I’m surprised that I didn’t post about my hat back in 2024. The first one I bought was from Etsy, for $32. It is a green baseball cap with embroidery that says “Make Orwell Fiction Again”. Along those lines, I later deleted my Google account. I wanted to buy these hats for Christmas gifts, so then I went with Rockatee, which was a mistake. Those were $27 apiece, but Rockatee didn’t deliver. Well, they didn’t deliver until I threatened to have my credit card company rescind the payment. But by that time, it was too late for Christmas. I placed a new order with Amazon, which did arrive in time, but those were $35 apiece. Rockatee shipped, so I ended up with product, and I did pay for them, and then I had extras to give away as gifts. ↩︎
  7. I had deleted my Facebook account way before. ↩︎

Converting an audio recording to summary text via local LLM

As mentioned in my previous post, I had fun installing code to run LLMs locally. This post will be for me: steps to replicate turning the recording into a summary text.

Convert from MP3 to WAV

ffmpeg -i ~/transcripts/meeting-2026-09-08.mp3 -acodec pcm_s16le -ac 1 -ar 16000 ~/transcripts/meeting-2026-09-08.wav

Run the Whisper.cpp code to turn the recording into a transcript

cd ~/src/whisper.cpp

./build/bin/whisper-cli --model models/ggml-small.en.bin --file ~/transcripts/meeting-2026-09-08.wav --language en --output-txt --output-srt --output-file ~/transcripts/meeting-2026-09-08 --print-progress

I created a prompt file for reuse after every planning meeting:

You create accurate meeting notes from a supplied transcript.

Use exactly these Markdown headings:
## Summary
## Decisions
## Action items
## Open questions
## Names, dates, and terms to verify

Only report decisions, owners, dates, and deadlines that the transcript explicitly states.
Do not invent, infer, or "clean up" unclear details. Mark ambiguity as uncertain.

Split the transcript into smaller chunks

rm -rf ~/transcripts/meeting-2026-09-08-chunks

mkdir ~/transcripts/meeting-2026-09-08-chunks

split --lines=400 --numeric-suffixes=1 --suffix-length=3 --additional-suffix=.txt ~/transcripts/meeting-2026-09-08.txt ~/transcripts/meeting-2026-09-08-chunks/chunk-

Prep for the run of the LLM to make summaries

rm -rf ~/transcripts/meeting-2026-09-08-chunk-summaries

mkdir -p ~/transcripts/meeting-2026-09-08-chunk-summaries

And then I got a bash script:

#!/usr/bin/env bash
set -u
shopt -s nullglob

LLAMA="$HOME/src/llama.cpp-rocm57/build-rocm/bin/llama-cli"
MODEL="$HOME/models/gguf/Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf"
SYSTEM_PROMPT="$HOME/llm-prompts/meeting-summary-system.txt"
CHUNKS_DIR="$HOME/transcripts/meeting-2026-09-08-chunks"
OUTPUT_DIR="$HOME/transcripts/meeting-2026-09-08-chunk-summaries"

mkdir -p "$OUTPUT_DIR"

for chunk in "$CHUNKS_DIR"/*.txt; do
base=$(basename "$chunk" .txt)
summary="$OUTPUT_DIR/$base.md"
log="$OUTPUT_DIR/$base.log"

printf 'Summarizing %s...\n' "$base"

if "$LLAMA" \
-m "$MODEL" \
--system-prompt-file "$SYSTEM_PROMPT" \
--file "$chunk" \
-c 4096 \
-n 500 \
-ngl 99 \
-cnv \
-st \
--no-display-prompt \
2>"$log" \
>"$summary"
then
printf ' Wrote %s\n' "$summary"
else
printf ' FAILED: inspect %s\n' "$log" >&2
rm -f "$summary"
fi
done

Fun project: ROCm and local LLMs

Back in May, I got the idea that while I was still employed and had money, I should buy upgrades for my computer. I did so. Last week, I implemented the plan, and it worked.

Background

Back in 2017 (nine years ago!), I bought an ASRock motherboard. At the time, AM4 CPUs were all you could get. I did not buy the latest and greatest CPU, because the latest and greatest is always overpriced. Although Ryzen 7 was available, an AMD Ryzen 7 1800X went for $500. Instead, I bought a Ryzen 5 1500X for $150.

Later, in 2020, I bought an MSI motherboard because I was having trouble with random lockups. But I was still on the Ryzen 5 1500X and 16 GB RAM.

This rig did just fine for me for the last six years. Really, for the last nine years. I’d kept a video card from 2013, though, and it has only 3 GB of RAM. Okay, back in 2013, I splurged the heck out of my purchase there because the video card was $700 before tax and shipping. But for the games I enjoyed playing (Factorio, Tropico, Endless Space, XCOM2, World of Warcraft), it was plenty.

Somewhat, I’d like to play Baldur’s Gate III next. The 3 GB RAM video card was nowhere near good enough.

May 2026 purchases

  • 32 GB RAM (Man, those prices hurt.)
  • MSI Radeon RX Vega 56 (8G RAM)
  • AMD Ryzen 7 5700X3D CPU

The RX Vega 56 was the video card with the largest amount of RAM that I could get without growing into a PCI 5 slot. The motherboard has only PCI 4 slots, so it didn’t make sense to me to pay more money for a card with a capability it cannot use. In the back of my mind too, I didn’t want to mix a card with PCI 5 capability being stymied by a PCI 4 motherboard. If everything matches and lines up, then there won’t be weird problems because some software expects PCI 5 access.

I did want the Ryzen 7 5700X3D processor because it is built with a 7 nm process (oh my goodness!) and consumes (only) 105 watts. The X3D part of it has a whopping 93 MB of L3 cache.

Well, when I received the parts, of course I added the RAM first. Easy peasy, but it didn’t change things much. I wasn’t doing much work that needed RAM.

I went to install the RX Vega 56, and… this video card is about 1/4″ too long for my case. Oof.

Well, way back when, I’d built a Windows 7 box and bought gear for it to be beefy. It sat in a large and quiet Antec P180 case, with an Antec 850 watt power supply.1 So I’ve got a case large enough, and it has the power supply with the extra connections for the RX Vega 56. I’m just going to have to find the time to do the migration.

Migration

I had moved the Antec case / Windows 7 box into my old office, where I used to work from home, and then pulled all the components out.

Last week, on Wednesday, everything lined up, and the whole day was mine. I started with vacuuming and dust blowing the Antec case. Then I powered down my main machine and started the migration process. Between the cleaning and component moves, it took about five hours before I hit the power switch on the new rig.2 It had the same MSI motherboard but now with the Radeon RX Vega 56 and the Ryzen 7 5700X3D.

The magic smoke did not escape! In short order, Debian was running, and I was happy. I did move the audio from electrical to S/PDIF (IEC 60958-3).

The project

I asked an AI to guide me through adding ROCm to this machine. It did so pretty easily. However, the devil is in the details, and pretty quickly, I was running into all sorts of obstacles. It helped that I had a specific goal: turn an MP3 file into a summary of a meeting.3

The AI guided me through installing llama.cpp4 with HIP to connect to the hardware via ROCm. There were numerous packages that HIP expected would be there that I had to find out about because they were missing. Thankfully, pasting the messages of the failed compiles would lead the AI to figuring out what was missing.

By the time I was done, I’d added all these:

rocminfo
clinfo
hipcc
cmake
build-essential
git
pkg-config
mesa-utils
libamdhip64-dev
rocm-cmake
clang
llvm
libclang-rt-dev
libclang-rt-19-dev
libomp-17-dev
libhipblas-dev
libcurl4-openssl-dev

One of the snags was that llama.cpp had a dependency on HIP 6.1, but my hardware can only do HIP 5.7.

git clone https://github.com/ggml-org/llama.cpp.git llama.cpp-rocm57

Amazingly, the AI guided me through downloading the llama.cpp-rocm57 source code, find the check-in for the code that depends on HIP version 6.1, and guided me through deleting it!

This worked!

I am an utter git newbie, but the AI has enough training to guide me through the whole process.

After getting the initial part of ROCm, HIP and llama.cpp-rocm57 installed, I asked about how to do transcription. “Please guide me through installing an LLM to do speech to text, inputting an mp3 file recording of a meeting, and outputting a transcript of what was said.”

The AI then guided me through installing Whisper (whisper.cpp). That went easy. I got about 11,000 words out of the transcription.

Then I asked how to summarize it. It generated a prompt file for me, and threw that at llama.cpp-rocm57. I did run into the problem that the 11,000 words were too much for the 8 GB video card. But I split the transcript file in two, and ran llama.cpp-rocm57 on each piece.

It worked.

I even got a nice little summary like this:

Action items

ActionOwnerDeadlineEvidence/notes
Find a cookUnclearUnclearThe group is looking for a cook.
Decide on menuUnclearUnclearThe group needs to decide on a menu.
Determine ticket priceUnclearUnclearThe price of the event is still uncertain.

This is just so cool: from an hour-long MP3 recording of the first planning meeting to a list of action items, all on my local machine. I’m thrilled.

  1. Foolishly, I hadn’t kept on with the task of installing a Bitcoin miner in it. I would later find in this machine a Bitcoin wallet from summer 2014. But back in 2014, the idea of running an 850 watt power supply full-time during summer really did not appeal to me. But if I had been able to mine 1 Bitcoin, that would be worth about $80,000 today. ↩︎
  2. I’m retired now, so I don’t have to be in a rush. ↩︎
  3. I had volunteered to be the project lead on a New Year’s Eve party. I had recorded the first meeting on my Sony ICD-UX570. In the past, I would pay Amazon to transcribe it for me, but that would cost around $3. I wasn’t terribly thrilled about uploading a recording of a meeting to the cloud, either. ↩︎
  4. I tagged this post with “Facebook” because although I have my beef with them, they do provide their large language model, Llama, as open source and for free. Credit where credit is due, man. ↩︎