
Priority: Wallpaper
I hereby confess that the “niceties” of a functional lab image have never been my priority. Part of a unified look-and-feel for any computer are the login-screen background, the default user wallpaper, and the lock screen background. In KDE Plasma 6 specifically, these are, eh, cartoonish. Regardless what one thinks of them, they certainly don’t say “Yale CS Music Lab” or really any kind of professional setup. So, with a little down time, I spent a few hours putting together something for the DAW systems in the lab and getting it work for new users this Fall.
Wallpaper Design
DISCLAIMER: I AM NOT A VISUAL DESIGNER.
There, that out of the way, check this out.

Gritty, dark, Yale branded. It’s me on a background. Okay, it’s not the most amazing and will not appeal to everyone, but it has something going for it. Specifically, I used node.js to design it so that the randomness of the letter positions and sizes varies from iteration to iteration. That’s computer sciencey && artsy! Right? RIGHT?? The code is here:
let cpar = "Computing & the Arts";
let cs = "Computer Science";
let omi = "Open Music Initiative";
let ll = 250;
let lh = 350;
// cpar stuff
let cparsize = 200;
let cparx = 100;
let cpary = 1100;
let cparoff = 175;
// x, y
let x = 50;
let y = 100;
let font;
function preload() {
font = loadFont('wallpaper/YaleNew-Roman.otf');
}
function setup() {
createCanvas(3840, 2160);
}
function draw() {
background(0, 0, 0); //background(0, 53, 107);
textSize(350);
textFont("Noto Sans Mono");
fill(65, 168, 255, 100);
// -- CS
for (let i = 0; i < cs.length; i++) {
let letterSize = random(ll, lh); // Randomize letter size
let xOffset = random(-20, 20); // Randomize x offset
let yOffset = random(-10, 20); // Randomize y offset
textSize(letterSize);
text(cs.charAt(i), 100 + i * 120 + xOffset, 500 + y + yOffset); // Draw each letter
};
// -- DOUBLED
for (let i = 0; i < cs.length; i++) {
let letterSize = random(ll, lh); // Randomize letter size
let xOffset = random(-20, 20); // Randomize x offset
let yOffset = random(-10, 20); // Randomize y offset
textSize(letterSize);
text(cs.charAt(i), 100 + i * 120 + xOffset, 500 + y + yOffset); // Draw each letter
};
// -- CPAR ----------------------------------------------
fill(65, 168, 255, 50);
for (let i = 0; i < cpar.length; i++) {
let letterSize = random(ll + cparsize, lh + cparsize); // Randomize letter size
let xOffset = random(-20, 20); // Randomize x offset
let yOffset = random(-10, 20); // Randomize y offset
textSize(letterSize);
text(cpar.charAt(i), cparx + i * cparoff + xOffset, cpary + y + yOffset); // Draw each letter
};
// -- DOUBLED
fill(65, 168, 255, 50);
for (let i = 0; i < cpar.length; i++) {
let letterSize = random(ll + cparsize, lh + cparsize); // Randomize letter size
let xOffset = random(-20, 20); // Randomize x offset
let yOffset = random(-10, 20); // Randomize y offset
textSize(letterSize);
text(cpar.charAt(i), cparx + i * cparoff + xOffset, cpary + y + yOffset); // Draw each letter
};
// -- TRIPLED
fill(180, 200, 255, 200);
for (let i = 0; i < cpar.length; i++) {
let letterSize = random(ll + cparsize, lh + cparsize); // Randomize letter size
let xOffset = random(0, 0); // Randomize x offset
let yOffset = random(0, 0); // Randomize y offset
textSize(letterSize);
text(cpar.charAt(i), cparx + i * cparoff + xOffset, cpary + y + yOffset); // Draw each letter
};
// -- OMI ---------------------------------------------------------
fill(65, 168, 255, 100);
for (let i = 0; i < omi.length; i++) {
let letterSize = random(ll, lh); // Randomize letter size
let xOffset = random(-20, 20) + 20; // Randomize x offset
let yOffset = random(-10, 20); // Randomize y offset
textSize(letterSize);
text(omi.charAt(i), 1480 + i * 100 + xOffset, 1550 + y + yOffset); // Draw each letter
};
// -- DOUBLED
for (let i = 0; i < omi.length; i++) {
let letterSize = random(ll, lh); // Randomize letter size
let xOffset = random(-20, 20) + 20; // Randomize x offset
let yOffset = random(-10, 20); // Randomize y offset
textSize(letterSize);
text(omi.charAt(i), 1480 + 10 + i * 100 + xOffset, 1550 + y + yOffset); // Draw each letter
};
textSize(80);
fill(255, 255, 255, 150);
textFont(font)
text("Yale University Department of Computer Science", 100, 2000);
textSize(80);
fill(255, 255, 255, 150);
textFont(font)
text("c2.cs.yale.edu", 3200, 2000);
noLoop();
}
Ugly? Yes! But I’m not a visual coder, so I’ll give myself a break here as well. Suffice it to say, the node.js online editor is pretty easy to use for someone with nothing but a dream and a web browser. With a satisfactory image in hand, all that was needed was to set it as the default login screen, lock screen, and user backgrounds. Easy-peasy.
Dreams destroyed
Okay, destroyed is a little hyperbolic, but still, it was not fun to troubleshoot default configs for several hours. KDE really wants you to use a GUI to make changes to look-and-feel and does not seem the slightest bit interested in making things easy for multi-user setups where unified look-and-feel are required. That means a combination of using a GUI to set the default image for the various locations and then copying those config files to the correct location to be used for new users.
Ubuntu (KDE Neon uses Ubuntu 22.04 as the base system) uses /etc/skel/ as the file path for files needed for new users. Anything there gets populated to the same location in the new users home directory. That means in /etc/skel/ you have to create a .config folder and then populate it with the correct files. This *should* be as easy as copying a model users .config files to /etc/skel/.config, but it’s not. I’ll spare you the gory details (which you can read here) but there appears to be some bug with how default configs are created and when to use/ignore existing config files for new users (necessary for, say, setting wallpaper preferences.) Most frustrating is that it’s not even clear what part of the Plasma Desktop is responsible for writing/checking those files. Good thing I’m not a KDE developer.
Anyway, the system looks good – kind of artsy, kind of techy. I would love to work on a better branding/identity image, something more akin to a logo. That, however, will have to wait until a future year.