Thursday, October 22, 2026

My Key Mappings on OSX

 As primarily a linux user, the MacOS key mapping for copy-paste is really uncomfortable.  To map it more like Linux (and Windows) the general recommendation is to switch the Command and Control key, but then the switch windows (Alt-Tab on Linux and Windows) shortcut is different.  The solution is to create a shortcut on MacOS for the "Copy" and "Paste" command to map to Control-C and Control-V  respectively (System Settings > Keyboard > Keyboard Shortcuts > App Shortcuts).

Tuesday, October 20, 2026

Framework 13 Pro with Fedora Cinnamon

Framework laptops are very Linux friendly and the Framework 13 Pro is no exception.  I won't go into details about the build quality as there are plenty of people online giving their reviews in detail so I'll just quickly say that build quality feels very good.  It feels a bit more solid then the Framework 13 but also heavier. 

Hardware Spec

  • Intel® Core™ Ultra Series 3 - Ultra X7 358H:
    • 4 performance cores (1.9 GHz - 4.8 GHz Turbo) , 
    • 8 efficient cores (1.5GHz - 3.5GHz Turbo), 
    • 4 lower power efficient cores (1.5 GHz - 3.3 GHz Turbo), 
    • 16 threads
    • 18MB Cache
    • 15W-80W (Framework doesn't reach max power draw)
    • Intel Arc B390 GPU
    • 50 NPU
  • 74Wh Battery
  • 2.8K Touchscreen Display
  • Crucial 32GB DDR5-7500 PC5-60000 Single Channel Laptop Memory Module (CT32G75C2LP5X)
  • WD SN850X 2 TB M.2 PCIe Gen4 NVMe

Install Cinnamon


With Fedora 44 everything worked out-of-the-box.  Simply install Fedora normally from a USB stick and it is ready to use.  I installed the Cinnamon spin on it.  To install Cinnamon after another desktop environment (Gnome, KDE, etc):
sudo dnf upgrade --refresh
sudo dnf install @cinnamon-desktop

Power and Performance Fix


While I did not notice any immediate problems with power or performance, I also didn't do any bench marking.  However, others have noticed that it runs slower or might have some stability problems waking from suspend that has been attributed to the power management.  There were issues with the Framework 13 on AMD processors with Fedora's Tuned power management and many have recommended switching back to power-profile-daemon. 
To properly switch back to to power-profiles-daemon:
sudo dnf swap tuned-ppd power-profiles-daemon

Fingerprint Login


Fedora recognized the finger print sensor immediately so no extra work.  Cinnamon doesn't have a GUI to setup your biometric, so it has to be done on the command line:
fprintd-enroll
Once the fingerprint is registered, you can login with it.

Expansion Cards


One thing I did notice on the Framework 13 and also on the 13 Pro is that the expansion cards sometimes don't always lock in.  Pulling out the HDMI connection might also pull out the card itself. 

Sunday, July 12, 2026

Fedora 44

A couple of weeks I installed Fedora 44 but not as an upgrade like I normally do.  I had to do a clean  install because btrfs indicated there was a problem with the file system.  It became noticeable when a system backup was happening and it kept running into errors.  At one point, the whole system went into read-only mode (which is what btrfs will do when it runs into an issue).  

On reboot, everything "seemed" okay and the hardware checks didn't reveal any issue with the drive.  However, the logs and btrfs' health check indicated an error.  The suggestion was that it was safest to reformat the partition and reinstall everything and that's what I eventually did.

Fedora 44 worked without any problems and it was a quick install to get everything up-and-running again.  It gave me a chance to rework my install scripts and update them.  One package (golang-github-nvidia-container-toolkit) that was available in Fedora 43 for enabling Nvidia GPU access to containers was not available for Fedora 44.  It seems like to get it approved for Fedora 44 so because of that I didn't try do upgrade the other machines.  I'll see if the package will eventually get into the Fedora core package so I don't have to add the Copr repo just for that.

Sunday, July 5, 2026

ComfyUI in a Container

Setting up ComfyUI in a Podman container on Fedora Linux with a Nvidia GPU.

Prepare Persistent Directories

Create directories on your host machine to store your models, custom nodes, outputs, and user data. This ensures your configurations and large model files survive container restarts and updates.

mkdir -p ~/comfyui/{models,custom_nodes,output,user}

Create the Container Image

We will build a custom image based on Debian (python:3.11-slim).

Note: We explicitly include the GNU C-compilers (gcc, g++) via apt. This is required because the Triton library (used by PyTorch) needs to dynamically compile GPU kernels when ComfyUI starts. Without them, Triton will throw a 0 active drivers error.

Create a file named Containerfile in your current directory with the following contents:

# Use a slim Python 3.11 image as the base (Debian-based)
FROM python:3.11-slim

WORKDIR /app

# Install system dependencies (including C compilers for Triton and OpenGL for OpenCV)
RUN apt-get update && apt-get install -y \
    git \
    libgl1 \
    libglib2.0-0 \
    gcc \
    g++ \
    && rm -rf /var/lib/apt/lists/*

# Clone the latest ComfyUI repository
RUN git clone https://github.com/comfyanonymous/ComfyUI.git .

# Install PyTorch with CUDA 13.0 support (Required for RTX 50-series)
RUN pip install --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu130

# Install standard ComfyUI dependencies
RUN pip install --no-cache-dir -r requirements.txt

EXPOSE 8188

# Bind to 0.0.0.0 so the host network can access the web interface
CMD ["python", "main.py", "--listen", "0.0.0.0"]

Build the image using Podman:

podman build -t comfyui-nvidia .

Deploy the Container

Run the container using the configuration below.

Critical Fedora-Specific Flags to Note:

  • --security-opt label=disable: This disables SELinux separation specifically for this container, preventing SELinux from blocking the execution of the injected Nvidia driver binaries (libcuda.so).
  • :Z (on volume mounts): Instructs Podman to label the mounted host directories with a private unconfined SELinux context, allowing the container read/write access.
podman run -d \
  --name comfyui \
  --security-opt label=disable \
  --device nvidia.com/gpu=all \
  -p 8188:8188 \
  -v ~/comfyui/models:/app/models:Z \
  -v ~/comfyui/custom_nodes:/app/custom_nodes:Z \
  -v ~/comfyui/output:/app/output:Z \
  -v ~/comfyui/user:/app/user:Z \
  localhost/comfyui-nvidia

Automate Firewall for Remote Access (Optional)

If you want to access ComfyUI from another device on your network, you must open port 8188 in Fedora's firewall. Instead of leaving the port open permanently, you can use a wrapper script that temporarily opens it when ComfyUI starts, and securely closes it when the container stops.

Create a file named start_comfyui.sh:

#!/bin/bash

echo "Opening firewall port 8188..."
sudo firewall-cmd --add-port=8188/tcp

echo "Starting ComfyUI container..."
# The --attach flag keeps the script running until the container is stopped
podman start --attach comfyui

echo "Container stopped. Closing firewall port..."
sudo firewall-cmd --remove-port=8188/tcp

Make the script executable and run it whenever you want to start your server for remote access:

chmod +x start_comfyui.sh
./start_comfyui.sh

Access and Day-to-Day Management

Once deployed, you can access the ComfyUI web interface by opening your browser and navigating to:
http://localhost:8188 (or your machine's local IP address if accessing from another device on the network).

Useful Podman Commands

  • Check Startup Logs: Monitor the initialization process or kernel compilations:
    podman logs -f comfyui
  • Stop the Server:
    podman stop comfyui
  • Start the Server:
    podman start comfyui
  • Clean up Disk Space: After rebuilding images (e.g., updating ComfyUI in the future), run this to delete dangling, unnamed images and recover gigabytes of storage space:
    podman image prune

Friday, July 3, 2026

How to Create a Windows 11 Bootable USB on Fedora Linux (Without Third-Party Apps)

 Microsoft's Media Creation Tool is only for Windows so what happens if you're on Linux?  I didn't want to download another third party tool when I don't need to.  Fedora (and most Linux) had all the tools needed in the distribution to do this. 

This article tells you how to do it manually but I'm lazy and wanted a script to do it and it is now available on Github.

Sunday, May 10, 2026

Alacritty with Terminus On MacOS

Getting Alacritty to render Terminus font nicely along with having those nice nerd font symbols on MacOS  turned out to be much more of a hassle then I ever expected it to be.  With iTerm2, it was simply a matter of installing the Terminess Nerd Font and disable anti-aliasing, but with Alacritty there's a lot more steps involved.

Installing Terminus


Installing Terminus on MacOS can be done through Brew for both Terminus TTF and Terminess (the Nerd Font equivalent).  Make sure to do the following:
  1. Go to Font Book and check that the fonts are all activated.
  2. Make sure you have the right family name and style as Alacritty is case sensitive and both needs to be entered into the config exactly or Alacritty will give you a misleading error message.

Disabling Anti-Aliasing


Terminus is a font that might look worse with anti-aliasing.  Both the Terminus TTF and Terminess did not look as clear and as sharp compared to what I'm used to.  iTerm has a checkbox to turn it off but Alacritty requires you to do this from the OS:
defaults write org.alacritty AppleFontSmoothing -int 0
To turn it back on:  
defaults delete org.alacritty AppleFontSmoothing

Installing a Better Terminus


Alacritty couldn't render either of the above fonts very clearly.  On programmingfonts.org, I found another Terminus font that looked nice on the browser called Consoleet Terminus. 



I installed it on to MacOS but getting Alacritty to recognize it had me pulling out my hair.

[font]
size = 18.0
normal = { family = "Consoleet Terminus-18", style = "medium" }
bold = { family = "Consoleet Terminus-18", style = "bold" }
Notice what's unusual about the configuration that finally worked in Alacritty?  Some Terminus fonts don't have "Regular" styles and only define it as "Medium".  In the case of Consoleet Terminus, the styles are all lowercase.  If it is capitalized (e.g. "Medium" instead of "medium") then there will be an error.

I finally got the same nice looking terminal except it doesn't have those Nerd Font symbols.

 Installing Nerd Font Symbols


On Linux, it is easy to tell it that if a font doesn't have a symbol to go to a fallback font that does have it and use that one.  MacOS doesn't allow that so I had to merge a font that has it into Consoleet Terminus.  The problem is that most fonts with the symbols are scalable while classic version of Terminus fonts (like Consoleet) are not.   That's why you'll see individual font files for specific sizes.  In my case, the Consoleet em size is 36 units (ascent 30, descent 6) while Terminess will be 2048 — so the symbols are coming in roughly 56× too large.

The following script got me the right numbers to use to figure out what size I need to extract:
#!/usr/local/bin/bash
SYMBOL_REGULAR="$HOME/Library/Fonts/TerminessNerdFont-Regular.ttf"
SYMBOL_BOLD="$HOME/Library/Fonts/TerminessNerdFont-Bold.ttf"
mkdir -p ~/merged-fonts

declare -A SYMBOL_MAP=(
  [/Library/Fonts/consoleet_ter18nr.otf]="$SYMBOL_REGULAR|medium"
  [/Library/Fonts/consoleet_ter18br.otf]="$SYMBOL_BOLD|bold"
)

for f in "${!SYMBOL_MAP[@]}"; do
  IFS='|' read -r symbol style <<< "${SYMBOL_MAP[$f]}"
  name=$(basename "$f" .otf)
  family="Consoleet Terminus-18 Nerd"
  psname="ConsoleetTerminus18Nerd-${style}"
  fullname="${family} ${style}"

  cat > /tmp/merge.pe <<EOF
Open("$f")
Print("Destination em: " + \$em)
Print("Destination ascent: " + \$ascent + " descent: " + \$descent)
\$dst_em = \$em
\$dst_ascent = \$ascent
\$dst_descent = \$descent

Open("$symbol")
Print("Source em (before): " + \$em)
ScaleToEm(\$dst_ascent, \$dst_descent)
Print("Source em (after): " + \$em)
Generate("/tmp/scaled_symbol.ttf")
Close()

MergeFonts("/tmp/scaled_symbol.ttf")
SetFontNames("$psname", "$family", "$fullname", "$style")
Generate("$HOME/merged-fonts/${name}-merged.otf")
EOF
  fontforge -script /tmp/merge.pe
Then with the results, update the script to create the merged fonts:
#!/usr/local/bin/bash
SYMBOL_REGULAR="$HOME/Library/Fonts/TerminessNerdFont-Regular.ttf"
SYMBOL_BOLD="$HOME/Library/Fonts/TerminessNerdFont-Bold.ttf"
mkdir -p ~/merged-fonts

declare -A SYMBOL_MAP=(
  [/Library/Fonts/consoleet_ter18nr.otf]="$SYMBOL_REGULAR|medium"
  [/Library/Fonts/consoleet_ter18br.otf]="$SYMBOL_BOLD|bold"
)

for f in "${!SYMBOL_MAP[@]}"; do
  IFS='|' read -r symbol style <<< "${SYMBOL_MAP[$f]}"
  name=$(basename "$f" .otf)
  family="Consoleet Terminus-18 Nerd"
  psname="ConsoleetTerminus18Nerd-${style}"
  fullname="${family} ${style}"

  cat > /tmp/merge.pe <<EOF
Open("$f")
dst_ascent = \$ascent
dst_descent = \$descent
Print("Destination em: " + \$em + " ascent: " + dst_ascent + " descent: " + dst_descent)

Open("$symbol")
Print("Source em (before): " + \$em)
ScaleToEm(dst_ascent, dst_descent)
Print("Source em (after): " + \$em)
Generate("/tmp/scaled_symbol.ttf")
Close()

Open("$f")
MergeFonts("/tmp/scaled_symbol.ttf")
SetFontNames("$psname", "$family", "$fullname", "$style")
Generate("$HOME/merged-fonts/${name}-merged.otf")
EOF
  fontforge -script /tmp/merge.pe
Done

Once the script is run, validate it first:
fc-scan --format "%{family}\n%{fullname}\n%{postscriptname}\n%{style}\n" ~/merged-fonts/consoleet_ter18nr-merged.otf
fc-scan --format "%{family}\n%{fullname}\n%{postscriptname}\n%{style}\n" ~/merged-fonts/consoleet_ter18br-merged.otf
If there are no errors then install and validate:
cp ~/merged-fonts/consoleet_ter18*-merged.otf ~/Library/Fonts/
fc-match "Consoleet Terminus\-18 Nerd"
fc-match "Consoleet Terminus\-18 Nerd:style=bold"
Your final alacritty.conf file will be:
[font]
size = 18.0
normal = { family = "Consoleet Terminus-18 Nerd", style = "medium" }
bold = { family = "Consoleet Terminus-18 Nerd", style = "bold" }
Restart Alacritty.

 

Monday, May 4, 2026

Chrome and Fedora Crashes With Multi-Monitor Setup

 I've noticed with more frequency that after waking from sleep, Chrome or some of its tabs will crash.  It can happen immediately or shortly after.  A kernel crash or system freeze  happens less frequently but is more disruptive when they happen.


This is happening on my main system that has 3 monitors (2 are 120Hz), an AMD CPU with integrated graphics and a discrete Nvidia GPU.  The monitors are connected to the motherboard (1 HDMI and 2 DisplayPort that are daisy-chained) rather than to the discrete graphics so I can preserve as much VRAM for LLM inference.

Initially, I though the culprit was the Nvidia driver since the most common responses on the Internet mention them.  The next most common response was to turn off hardware acceleration in Chrome. 

chrome://gpu revealed that the iGPU was only being allocated 512MB of memory which not enough with a multi-monitor setup.  This was being automatically set in the BIOS so I changed the UMA Frame Buffer Size (Found under NB Configuration)  to 1GB.

Next, Chrome showed it knew there are two graphics option so this tells it to almost use the integrated graphics.  

google-chrome-stable --disable-gpu-driver-bug-workarounds --gpu-testing-vendor-id=<vendor id> --gpu-testing-device-id=<device id>

There are some settings for the Nvidia card that might also improve stability.  Edit /etc/modprobe.d/nvidia.conf and add the following settings might improve stability but might also slow waking up:

options nvidia "NVreg_PreserveVideoMemoryAllocations=1"
options nvidia "NVreg_TemporaryFilePath=/var/tmp"
options nvidia "NVreg_EnableS0ixPowerManagement=1"
options nvidia "NVreg_PreserveVideoMemoryAllocations=1"

To make sure the system leverage these values:

sudo dracut -f 
sudo reboot

Tip: Restart the Cinnamon process without losing your open windows by pressing Alt + F2, typing r, and hitting Enter

Sunday, April 19, 2026

Fedora 42 to 43

 Time to do another upgrade of Fedora (from 42 to 43).  I didn't find any immediate issue with the upgrade so nothing to report.

Friday, April 10, 2026

CLI and Terminal utilities

 Recent developments with AI has brought renewed interest in command line tools and terminal apps.  Linux had always had a rich collection of CLI utilities, but I wanted to check out what new options are now available.  This is my running list of things I've found interesting but haven't spent enough time for me to recommend it on my tools page.

  • Glow - a terminal markdown viewer written in Go.
  • LazyGit - terminal UI for Git written in Go.
  • Chafa - view images in the terminal written in C.
  • cvslens - terminal viewer of CSV files written in Rust

Tuesday, April 7, 2026

Aerospace, Sketchybar, Jankyborders to Make OSX Workable

I've been using a combination of a Linux and ChromeOS as my work laptops, but my current job now has me using a Macbook Pro which I haven't touched in over 10 years.  A combination of the way OSX behaves and the workflow necessary for my particular work environment (Slack, Outlook, Claude Code, etc.) made me realize that I really needed to configure it if I expect to have a half decent work experience.

Aerospace Windows Manager

With the sheer number of different windows (apps and many browser windows), I couldn't function with a floating windows manager.  OSX's spaces/Mission Control was not effective in taming the chaos so I decided to use Aerospace, a tiling windows manager influenced by i3wm.  With Aerospace, having one application per workspace is much more intuitive and natural because of how well it's shortcuts are integrated with it.  It was almost instinctive to have my browser windows in the B workspace because the shortcut to it is simply Alt-B and Aerospace allowed you to configure so that whenever a browser window is opened that it can automatically put in the B workspace.  Along with not having all the gazillions windows overlapping each other was enough for me to use it, but the additional features, programmability and keyboard friendliness made it even more worth while for me to adopt it.

SketchyBar

SketchyBar is a nice complement to Aerospace.  It's a programmable OSX menu replacement, but I have it running vertically exclusively for Aerospace where it shows the Aerospace workspaces and what is running in each workspace.

JankyBorders

When there are multiple windows in one workspace, sometimes it wasn't obvious which was the active window.  JankyBorders is an utility program that draws a more visible border around the active window to make it more easily identifiable.

Integrating Aerospace, SketchyBar and JankyBorders

AeroSpace and JankyBoarder complements each other and doesn't exactly require integration but since Aerospace can be configured to run external programs as part of its startup it is simple to simply have Aerospace launch JankyBorder.

Integrating Aerospace and SketchyBar took a little more effort but the basic steps are:

  1. [Aerospace] Have Aerospace start SketchyBar.
  2. [Aerospace] Tell Aerospace that whenever there is a chance to a workspace that it should call SketchyBar to tell it of an event change and pass along the workspace that is in focus.
  3. [SketchyBar] Set its config file (~/config/sketchybar/sketchybarrc) to call Aerospace's command line app to get the active workspaces and apps in each workspace to be added to the SketchyBar menu.

My ~/.aerospace.toml and ~/.config/sketchybar/[sketchybarrc | aerospace.sh] can be found on Github.