My thoughts on Slackware, life and everything

Category: Me (Page 1 of 29)

Using Claude to create a work of art

© 2026 Eric Hameleers. All Rights Reserved.

Take the “work of art” with a grain of salt please 🙂 This is an article about computer-generated art but with my own photographs as the source material.

In May, the last of our four cats died. They were two pairs of Holy Birmans, first two little sisters who we took in when they were only 7 weeks old; and later two big brothers whom we adopted when they were over 8 years old.
For the first time in 30 years we do not have any cat in the house. It is silent and sometimes desolate, and I miss the little fluff-balls. But we need to be realistic – we also want to see more of the world and having cats means you need to take care of their well-being. These four are it. There will not be future cats.

Me and my wife decided we wanted to commemorate them by creating some kind of artwork and put that up on the living room wall. We wanted their pictures, and since they were four very different cats, we looked for defining features and old photos that showed their uniqueness. We succeeded in that part, but then came the question, what form and shape should this take? The pictures had different backgrounds, the lighting created different colors, the cats in the pictures had different sizes.

I came up with the idea to create solarized versions of these pictures, give them a kind of Warhol effect with primary colors and bold planes. I looked into ImageMagick, and could not find a good way forward. I looked at online AI image generators and manglers, and none of that was any good either, no consistency in the results.

So I turned to Anthropic’s Claude chat bot. I started with a simple question:

I have four pictures of my cats. I need the cats without the background and primarily the cat heads and/or bodies in a composite picture, which has the solarized style of an Andy Warhol painting

To which the bot responded (it knows I work on Slackware):

Good news: this is very achievable with a Python script using a couple of well-suited libraries, and you can run it entirely on your Slackware machine. Here’s the plan:
Tool stack:

rembg – AI-powered background removal (uses a U2Net model), works excellently on pets/animals. This is the part where ImageMagick would genuinely struggle.
Pillow (PIL) – for cropping, compositing, posterizing, colorizing, and assembling the grid.
Both installable via pip.

The pipeline per cat photo:

Remove background with rembg (outputs a clean RGBA PNG)
Auto-crop to the cat’s bounding box (head/body)
Posterize (reduce to ~4 color levels) to get that flat, graphic look
Apply a flat color tint per panel (Warhol used vivid, clashing hues)
Arrange all four panels in a 2×2 grid

What I need from you to write the script:

Confirm you can install Python packages via pip on your Slackware machine (or in a venv)
Any preference on output size (e.g. 2000x2000px total, so 1000×1000 per panel)?
Do you want each cat in a different color scheme, or the same cat repeated Warhol-style (like the Marilyn print where it’s one subject, four colorways)?
Should the background of each panel be a solid flat color, or transparent/black?

Once you confirm, I’ll write you a clean, self-contained Python script that takes your four JPEGs as input and produces a single composite PNG.

I checked that I could indeed install the dependencies without any issue. I gave it some additional information:

I can install any package using pip, no problem. The image dimensions of 2000×2000 sounds fine.
Each cat should have a different primary color and I would like to associate the four input pictures with specific colors myself. The background is a good question, since I do not yet know what will give the best result. For now I would go with a gradient background that contrasts with the primary colors I will select for the cats and potentially add some smudging to that background.

That produced a script in a few seconds that actually did everything I had imagined for the resulting bitmap wich consisted of 4 panels in a 2×2 grid, one solarized cat image per panel.

Of course, then the creative mind wanted more. It is interesting how this works. I have ideas, I conceptualize them into a prompt, the AI returns Python code that evolves with every new question I have, and actually every iteration of the script does everything I wanted from it.
Eventually, the script was capable of a lot more, tweaks that created better and visually more pleasing versions of the WarholCats.

What was added during this “discussion”:

  • Per-panel configuration:
    • Define the primary color (required) and optionally specify a different background color than the default color complement of the foreground.
    • An optional (x,y) offset to place each cat squarely in the panel’s center.
    • Background styles, several gradients are possible: diagonal, vertical, horizontal, radial; as well as a simple monochrome background.
  • The bot documented all of these configurable parameters in a PANELS block. All parameters were given sensible fallback values in case they are not provided.
  • Optionally a black outline drawn around the cats to make them stand out more – looks better against a monochrome background.
  • Three layouts: a 2×2, 4×1, or 1×4 canvas.
  • The script has defaults set for my wallmount project (I intend to have the result directly printed on dibond aluminium): my LAYOUT = “4×1” and PANEL_SIZE = 2000, allowing for roughly 127 dpi when the image is applied to a 160×40 cm dibond.

Variables like FILL_FRACTION (defaulting to 0.90) and PADDING_FRACTION (defaulting to 0.06), allow for a middle ground for the framing of the cat images. Eventually I also needed an OFFSET variable to move individual cat images into the center of their panel.
The result is the picture at the top of this article. The Python script can be found in the Slackware Forge: https://forge.slackware.nl/alienbob/randomstuff/src/branch/main/WarholCats/warhol_cats.py
The four original cat photos are attached to this blog:

© 2026 Eric Hameleers. All Rights Reserved.

© 2026 Eric Hameleers. All Rights Reserved.

© 2026 Eric Hameleers. All Rights Reserved.

© 2026 Eric Hameleers. All Rights Reserved.

That’s it for today. I wanted to share how a Large Language Model like Anthropic’s Claude is able to boost your creativity with respect for your precious free time. No… this is not vibe coding. The Python code is simple and clean, and is easy to follow. No weird functionality, and proper inlined comments all over.
Feel free to use the script as you see fit. I would however appreciate that you do not share the pictures of my cats or the resulting solarized bitmap any further. The images are copyrighted.
Cheers, Eric

Building Chromium for Slackware

I thought it would be helpful, and in any case insightful, to describe how I build the Chromium (also -ungoogled) packages for Slackware.

It is not a trivial task but a necessary one I believe. Slackware users should have a choice of browsers – some prefer Mozilla Firefox, others Google Chrome, and then there’s LibreWolf and Chromium that are built on the same code base as respectively Firefox and Chrome. There are others too, but I decided to stick with packages for Librewolf  and Chromium (-ungoogled). This article will focus on Chromium because Librewolf is pretty trivial to compile into a package.

Google develops the Chromium source code using tools which it partly created and maintains itself and for another part extends and patches them from the originals. Most notorious are the heavily customized Clang and Rust compilers used inside Google. The Chromium code reflects those compiler customizations because its codebase contains sections that will fail to compile using the official releases from the LLVM Project and the Rust Team (on which Slackware bases its own llvm and rust packages).

Google formally stopped supporting 32bit releases for their binary distribution of Chrome as long ago as 2015 (that’s ten years ago!) but indicated that the Chromium source code would still be compilable on 32bit platforms. Over time it became clear that internal code reviews and checks only happen on 64bit OS-es and the 32bit compatibility has been susceptible to “code-rot” ever since. As evidenced in my SlackBuild script where more and more patches and code modifications have been added to keep the ability to compile Chromium sourcecode into 32bit binaries.

Google provides binary snapshots of their internally used versions of Clang and Rust which reduces the need for patches a lot. Unfortunately Google at some point in time stopped providing 32bit binaries and so these binaries are nowadays only provided for 64bit machine architectures. In the past I relied on these binary snapshots to compile Chromium for Slackware.
After Google stopped providing those 32bit binaries, I have been putting a lot of effort in making Chromium compilable using the Slackware stock Clang and Rust compilers.

Note: I compile Chromium and Chromium-ungoogled on Slackware 15.0 and make these packages available in repositories for both Slackware 15.0 and -current. The challenge with Slackware 15 is that the provided llvm and rust compiler packages are way too old to be able to compile Chromium. Therefore Patrick Volkerding provides newer llvm and rust packages in the ‘extra’ section of the Slackware 15.0 repository. From time to time I run into new issues with clang and upon request, Patrick then builds and uploads a newer version of llvm into the repository.

Let’s have a look at the required updates for a Slackware 15.0 system (Slackware-current is up-to-date on all these package versions):

  • nodejs >= 20.13.0
  • llvm >= 21
  • rust >= 1.88.0
  • nasm >= 2.14
  • cmake >= 3.30.1

Some of these updates for Slackware 15.0 are in my own package repository (cmake, nodejs, nasm), some others in the ‘extra’ section of the official Slackware 15.0 package tree (llvm and rust).

When these updates are applied to Slackware 15, or in case you are running Slackware-current, compiling a Chromium package is simply:

# ./chromium.SlackBuild

… and compiling Chromium-ungoogled needs this commandline:

# USE_UNGOOGLED=1 ./chromium.SlackBuild

Note: you will need an enormous amount of RAM and lots of free disk space (in the filesystem which $TMP is pointing to) to run this build successfully, and then a lot of patience for that build to complete (my QEMU virtual machine needs about 12 hours to complete this build – per package).

From time to time, usually when the major version number of Chromium makes a jump, the source code has been modified to such an extent that the Slackware compilers will fail to build the binaries successfully. In that case (and if you are creating a 64bit package) you can force the SlackBuild to download and use Google’s binary clang and rust compiler snapshots using this commandline:

# BUILD_CLANG=1 ./chromium.SlackBuild

# BUILD_CLANG=1 USE_UNGOOGLED=1 ./chromium.SlackBuild

Usually this way the compilation will be successful.

Attribution:
Next to the Arch Linux PKGBUILD maintainer for Chromium, I depend more and more on the unparalleled knowledge of the NixOS package maintainers, to find the proper patches for my SlackBuild.
I would have been forced to drop the 32bit package support a long time ago if it were not for emilylange and networkException (NixOS) and Christian Heusel and Evangelos Foutras (Arch Linux).

I hope this article gave some insight into the life of a package maintainer.

Cheers, Eric

No Kings! Power belongs to the people

To my friends and their friends and family in the USA: stand up against blatant corruption, greed and power grabs. Fight the corrosion of your democracy and the rise of authoritarianism and fascism in the “land of the free”.

I stand with you.

New URL: blog.slackware.nl

Me

Hi all.
It was time to migrate my blog to a new server. The URL ‘alien.slackbook.org/blog/’ has changed to ‘blog.slackware.nl’.

For years, my hosting server has been https://harrier.slackbuilds.org/ – ever since I had to move away from the original host, the slackware.com server (Pat does not trust PHP code).
I am eternally grateful to the team of people (Robby Workman and friends) who purchased its hardware and have been maintaining it in a US datacenter for all that time. They gave me full root rights over my virtual machine. Also many thanks to Teklinks for offering colocation and bandwidth!
Check out harrier‘s frontpage to get an idea of all the Slackware community services are hosted on that iron.

But the QEMU VM which runs on harrier and which essentially hosted my blog, is still on Slackware 14.2. Over time I had to upgrade httpd, mariadb and php to keep the WordPress code happy, but now WordPress is again nagging me about not having PHP 8 and to be honest, Slackware 14.2 has not received security updates for two years now. I am not feeling comfortable with that.
I had a short chat with Robby and he indicated that there’s just too much to be done and too little time to do it. I fully understand that and I have not bothered him with my worries.

I decided to migrate the blog to a new Slackware -current host. I have done a few trial runs over the years; it is not trivial to move a WordPress blog to a new domain and at the same time to a new host. But I think I figured out the challenges and ironed out the kinks.

Also, this was a good opportunity to reconsider the hosting location. Harrier runs in a US datacenter. I am not at all happy with the racist and autocratic direction the US is taking under Trump and his MAGA cult. I’ve seen people being detained and/or sent back at airport border control checkpoints simply because they have written online posts that are unfavorable to Trump. Look at my previous posts here on the blog – I will not attempt to enter the US as long as Trump is its dictator. And therefore it makes sense to choose the European Union as the new location for my blog server.

Welcome to blog.slackware.nl! Please update your bookmarks.
I am creating a redirect for alien.slackbook.org/blog/ to get that forwarded to the new URL, but it never hurts to spread the word to your friends.

Cheers, Eric

« Older posts

© 2026 Alien Pastures

Theme by Anders NorenUp ↑