Old Computer Challenge 5 (2025)
After skipping the last year Old Computer Challenge I’m back at it with friends at IRC channel1 with the idea of using low specs computer or setup for a whole week of July 13th to 19th.
Operating system
I planned to use OpenBSD 7.7 but at the very last minute installed NetBSD 10.1. The reason for that is quite simple - openbsd is unbearably slow, even for this challenge that expects a slowdowns in routine tasks compared to modern computers, I can’t even say it is a meaningful handicap. Lots of OpenBSD features aimed for security, and it takes a huge toll on overall performance on ~25 years old hardware.
Hardware
tldr: cpu - Celeron 633mhz (Coppermine), 128mb SDRAM, GeForce2 MX400.
The time hath cometh! I am using rebuilt and battle-ready replica of my very first computer, that I had back in early 00s.
At first I had an OS installed on CF card, connected via IDE adapter, but turns out those are really slow and most of the processes on openbsd were held in ‘biowait’ status. I have a 160gb SATA hard drive connected through another IDE adapter, so using it now and it is much better. I think rotary drives are still good thing even after SSD became cheap, reliable and widespread.
I thought 128mb RAM might be way too crumped for the modern OS, and it still might be since I postponed setting everything up properly to the very last day; just in case I ordered some more RAM (2 sticks of 256mb SDRAM) a week ago, but don’t know how much will it take to arrive.
Software
This part hasn’t change much since occ2023, I’m still using mutt, irssi and nano. Firefox obviously won’t be able to run on this box, browsers are the hardest part of the challenge for lots of people I think. I’ll have to figure something out in that regard as well, will use lynx for the time being to be able to access WWW at least in some way.
WM is ‘stock’ netbsd CTWM for now, I plan to fix my usual setup with dwm+dmenu+dwmstatus here.
The Journey
Just as before I’ll try to do a small writeups about quirks and hiccups and fun moments I encounter right here every day for the next week.
My good friends at http://occ.deadnet.se have a list of blogs of people doing this challenge - be sure to check them out! Lots of awesome skilled people there.
Day 1 (Sunday, setting up)
I still have to type and build this page on my main rig - at least via SSH. The reason being is that the setup on the Celeron is still not finished, and I need at least nano editor and golang and hugo to publish those pages. Golang should be interesting because of memory constraints. Maybe it pushes me to some other SSR with more lightweight footprint, maybe even follow trends and write one of my own :D
Edited later: both hugo and golang installed with pkgin
are effectively unusable - and not because of scarce RAM but because they’re compiled with SSE2 instructions which my CPU lacks. Go1.24 crashes spectacularly trying to invoke movsd
. Ah well.
Day 2 (Monday, easing in, peripherals)
It is monday, that means I gotta use modern rotten tech to do a $dayjob. I have work-issued Macbook Pro M2, and of all the Apple tech I’ve owned this is undisputably the worst piece of crap. Wifi issues, network issues, CPU throttling issues, CPU being encumbered issues, potato RAM issues…
Honestly going to my sweet home setup that is hundred times slower feels like a breath of fresh air because this PC just works. Old, sometimes sluggish, definitely not pretty (on the case side) but nevertheless charming and most importantly - reliable. I can leave it for a day knowing it won’t succumb to some obscure kernel panic resulting in complete network stack crash; once I move the mouse (PS/2 one! more on that later) the screen will light and all my stuff will be there.
Right, about the peripherals. My display is still ‘golden ratio’ (4x3) LCD, everything is crisp and eyes are not strained after prolonged use - the problem I always had with CRT displays that had refresh rate lower than 100Hz.
Keyboard is probably much newer - I found it brand new on Amazon(!) a while ago, it is PS/2 Perixx Keyboard with optical trackpad inside. It was cheap and is is membrane ofcourse, but the typing doesn’t feel bad to say the least. Maybe it is the feeling of “something unusual” because for past 5+ years I only had mechanical keyboards for my desktops.
It has a trackball on topmost right corner, that is not very comfortable but was totally usable, especially in absense of real mouse.
Mouse is PS/2 “Optical Mouse”. No, seriously, it doesn’t have any branding or even company/model name anywhere. I found it on local Cyprus ‘craigslist’ and it was around 10 euro brand new in unopened blister package. In the end seller was so happy that someone finally took this off his hand he gave me another mouse exatly like that for free. I should find it sometime, maybe blister package has some traces of its identity.
Anyhow, I’ve installed dwm and st here (with pkgin
, not pkgsrc
though); works great and quite snappy compared to the previous OpenBSD install. Xorg cpu utilization is not over the top here too even with fullscreen apps.
Browser-wise I use Dillo for now, it was suggested by compadres at IRC channel, somehow it is even faster than graphical links2.
Day 3 (Tuesday, Desktop Environment)
Today’s plan was to quickly finish setting the desktop up, namely install dwmstatus
, and to try to work on the emote2ss project of mine (converting animated WEBP to spritesheets of given X:Y size).
Obviously it didn’t go as planned: dwmstatus with my fixes2 got built successfully but couldn’t launch because of missing libX11.so.7
. Messing with libraries is always fun so I had to investigate; I vaguely remember that I solved the similar problems several years ago.
ldd ./dwmstatus
showed me this:
./dwmstatus:
-lc.12 => /usr/lib/libc.so.12
-lX11.7 => not found
Linker gets the correct way to the dynamic library but the executable cannot find the library when launched. Ouch. It can be run with setting LD_LIBRARY_PRELOAD=/usr/X11R7/lib/libX11.so.7
but that’s kinda lame, I figured.
ELF executables can have library search path set for them with linker; for some reason I thought -L does that too (sounds logical) but alas that wasn’t the case. To fix the issue I had to pass the rpath variable to the underlying linker like that:
cc -o dwmstatus ... -Wl,-rpath=/usr/X11R7/lib
And Bob’s the uncle.
I’ve copied some config files and GnuPG2 keys database onto this computer, so had to fix some stuff for NetBSD before commiting and pushing that:
- Install gnupg2 (from standard pkgin repo)
- Install pinentry (I’m using pinentry-tty usually)
- Export the
GPG_TTY=$(tty)
setting in ~/.profile - Set the gpg.program=/usr/pkg/bin/gpg2 option in ~/.gitconfig3
- Set the pinentry program path in ~/.gnupg/gpg-agent.conf (and
pkill(1)
gpg-agent).
I’ll try to build here my emote2ss
program tomorrow.
Day 4 (Wednesday, building my sources)
Most of today’s mental capacity was spent on an (unsuccessful) production release at work, we had to roll back and reassess things. Ofcourse the culprit is DNS. It is always DNS.
Anyhow, my plan for todays evening was to build a program of mine, emote2ss. I wrote it some time ago to work on some game I completely forgot the premise is now; I was making it with Godot and needed some animations essentially, and got some animated .webp files off Twitch chat that I wanted to use. But Godot doesn’t support them natively; at first I wanted to make a plugin or something, but then decided that making a program that ‘unpacks’ those animations into neat spritesheets of given size would be much more fun.
So I spent next few days (maybe even more) working on that and obviously never went back to that videogame, haha.
The program itself is made with plain C (C99 to be precise), and its only dependance is libwebp. At first it was just a CLI tool, then I thought making GUI version of it with preview would be fun so took the luigi GUI library for that. It is a single header library that is pretty easy to use and hack on so I quite liked it in the end.
I’ve built and used it on Linux (my main OS anyway) with different architectures - x86-64, i386, arm, arm64, even riscv64; and with OpenBSD that I had on several of my machines in the past. But NetBSD is a first to me; I had to fix couple of things first before the successful build.
Installing libwebp and pkg-config (I’m using it in my dumpster fire Makefile) was easy; truth be told I never got to the hard part at all. MAX_PATH constant that is defined in limits.h for Linux is in syslimits.h header for OpenBSD and NetBSD too, so I only had to add an #ifdef
block.
Since my makefiles are not very good I can only use them with GNU make, so had to install that from pkgin
too (as gmake, did the same on OpenBSD). One day I’ll write proper good unified makefiles, or degrade back to build.sh scripts :D
I’ve used prctl(2)
on Linux to change the displayed process name, which is unavailable on NetBSD, wrapping it with #ifndef
did the trick.
There is a bunch of warnings about improper use of libX11 functions, but I guess I got lucky and they didn’t affect the built binary functionality - the file could be open, resized and saved properly, which made me immensely happy and grateful to basic tools I’m using.
Seeing how this thing is totally usable even on this outdated hardware is another small pride point, to be honest.
Apart from tinkering with build I’ve managed to find a curious fact about netbsd ps(1)
utility: it always formats the output to the current TTY width, so if you try to find the process in sufficiently ’narrow’ terminal (usually tmux panel in my case) with classic ps Au|grep blah
you’ll be surprised for there won’t be any output. Since program name is the righmost column that might not fit on output the pipe gets the same trunked output. Honestly this is the first time ever I saw ps
behaving that way.
The proper solution on NetBSD is to use -w
flag to force the ‘wide’ output regardless of terminal width. I guess ps Auw
should be my new fingers-hardwired command from now on :)
Day 5 (Thursday, ksh)
Apart from usual daily chitchat on IRC and decompressing after work I’ve tried to figure out why command-line shell config doesn’t work.
I’m using bundled /bin/ksh and it should use ~/.profile where I put my PS1, PATH, EDITOR, GPG_TTY and other stuff I like; but after launching any terminal emulator (uxterm or xt) those environment variables just weren’t there.
Friendly folks at #netbsd IRC channel gave me some tips, like what to use instead of strace (ktruss
).
Interestingly enough .profile was read inside of the tmux session, but launching ‘bare’ terminal wasn’t enough.
In the end I was able to figure out (quite obvious thing) that my shell wasn’t launching in login mode, therefore not honoring default config file.
If you were expecting here an insight of how I overcame this struggle - there is none :) I was happy to learn about ktruss and was too tired to dig more about the shell since I’m using tmux by default anyway.
Day 6 (Friday, asleep)
Lost day - was exhausted after work so the only thing I’ve tried is to finally get some sound off this rig. I’ve connected an usb audio card (trusty ESI Dr.DAC Nano that I’ve had for 10+ years) and it was recognized even. I switched the default audio output to it with audiocfg default 0
but alas the whole thing didn’t work; tests didn’t go through and dmesg was full of messages
uaudio0: uaudio_trigger_output open channel err=STALLED
audio1(uaudio0): trigger_output failed: errno=5
audio1(uaudio0): device timeout
Still I’m able to use the integrated AC97 soundcard in the motherboard, so that’s a small win.
mpv playing an audio stream (web radio, mp3 192kbps) eats up 10-20% cpu time :)
Day 7 (Saturday, music&chill)
UVM: pid 9547.9547 (dillo), uid 1000 killed: out of swap
UVM: pid 733.733 (X), uid 0 killed: out of swap
Swap partition is sized 1:1 as RAM which is 128mb and clearly is not enough for modern web even without javascript bloat.
Managed to find a nice web radio station with trance music encoded with Vorbis: http://radio.hbr1.com/stream/trance.ogg
Interestingly enough decoding vorbis eats up much less CPU than MP3.
At some point I realized my dwmstatus displays memory stats wrong; it simply parses /proc/meminfo data but output is not good; I’ve briefly searched for netbsd “native” solution and implemented it in ’netbsd-coppermine’ branch of my dwmstatus version.
Finale, afterthoughts
I’ve had the idea of using my very first computer as main system for quite a while, really happy I managed to do that. Overall it wasn’t much of a memory lane trip since the OS and software were modern; more of an experiment.
And I think that this experiment went quite well, all things considered. Some things are left unsolved - I could try to fix and rebuild golang compiler and some other software to not use SSE2 (and above), and the ’login shell mystery’ is more of a question of reading manpages some more. I also didn’t rebuild dwm and was using its hotkeys mapped through Alt+key, not Win+key as I’m used to.
Most important thing is that I still was able to have fun with computers and wasn’t feeling frustrated or overly constrained. Since this era PC is the one I’m most familiar one it felt like home even though I didn’t use IDE interfaces for a long time, for example.
Closing on this week and OCC2025 (mainly because I need space for other projects and comptuters, not because I want to stop using this) I’m moving on ‘New Computers Challenge’ aka our everyday life :D Because I’d rather address issues with slow CPU or scarce RAM than endless tackle with ads, LLM bloat and shameless selling of all of my personal data left and right.
Bulleted ’takes’:
- Everything is better with friends - call out to good folks of #oldcomputerchallenge and #deadnet channels! Wouldn’t be the same doing all this solo without anyone to share to. Bonus shoutout to #netbsd!
- 25 years PC is still holds up ok for lots of tasks, primary programming, especially recreational. But I’m waiting for 2x256mb ram sticks, bet they will make this rig much more responsive.
- One of the challenges was using somewhat unfamiliar OS (NetBSD), modern version, it left very good impression.
- Unexpected side-challenge is to work with storage and peripherals, since neither PS/2 nor IDE are widespread anymore.
- Modern OpenBSD is quite sad for outdated hardware, all the security fixes make it unbearably sluggish.
- Lesson repeated second time since Geode: i386 packages are myth unless you build them yourself. Lots of modern software expects CPU to have (at least) SSE2 instruction set; fair because it’s been 25 years since its introduction with Pentium 4.
- I have to finish exporting this blog/pages to gopher at some point.