Lynx icon

Lynx thoughts


2025-12-08-17-34-45

Meanwhile, the parallel reality introduced “guilds”. As if this is capable of saving the situation there somehow.

Gotta love this desire for reinventing the bicycle without fixing the fundamentals first.

Webrings >>>>>>> guilds. For sure.


2025-12-08-17-18-08

I don’t understand some ringmasters though.

In some webrings, you need to create a pull request to their Git repo in order to apply.

The thing is, such repos are always hosted on GitHub (as if no other Git hosting exists). So, you need to have a GitHub account first. So, you need to submit your personal data to M$ before you can even manifest your presence on the indie Web. Looks extremely absurd, doesn’t it?

Well, that’s because it is. Same, but to a bit lesser extent, goes about applying for a webring membership through Google Forms. Yeah, I’ve seen that too today.

Just stop this please. Make the process automatic or semi-automatic. Don’t require or assume having big tech accounts by people whose entire (or main) point of personal website creation is running away from big tech.


2025-12-08-16-37-01

Continuing the webring topic. This webring list might be a bit incomplete but includes all major ones, while showing the current situation with them.

Most are manually approved but some are automatic. I found Hotline and Retronaut webrings the easiest ones to get started with. They also are quite fun to browse around.

The null webring also works but it’s JS-only and limited to Neocities.


2025-12-08-13-36-12

Oh, Neocities also has an API. Which, on one hand, might seem pretty limited but, on the other hand, allows you to make your own site management tools in any language you want.

Browsing through Neocities and webrings seems a whole other experience. Looks like a lot of good people are there but the bad ones are just better united.


2025-12-08-12-16-13

“Okay”, you might ask, “but how in the world can indie Web creations be discovered by other such creators and usual people if they are not promoted on big media and drown beneath a heap of useless search engine results?”

Good question, and I think there is an answer to that: webrings.

In the old day, it was considered a good practice to leave some links to thematically close websites in the footer, in the last section of the page body or even on a dedicated HTML page. A bit later on, such links transformed into small banners, sometimes animated. Having a wall of such banners was a special topic of bragging. But what to do if you don’t know whose links to put into your footer or just building your organic network of connections too slowly? Here’s where webrings come to help. You give some info about your page to the ringmaster and put the ring’s links into your page. If the page gets approved, it can be visited from any other page in the ring (by pressing on the “next”/“previous”/“random” links, depending on which mechanism is supported), as well as seen in the overall ring’s page directory. This allows for self-sustainable interconnection without having to rely on mainstream search engines or other corporate “sources of truth”.

Of course, there are some issues with webrings being isolated from one another, but a lot of indie websites often apply to several rings at once, so, in theory, one can navigate from one webring to another by just jumping around the sites. And, of course, good old direct linking never hurt anyone.

I think I might join some too. Just in case, to be prepared when the bubble finally pops.


2025-12-08-09-58-35

Ok, I checked whether you can create multiple Neocities sites with the same email.

No, with a free account, you can’t. If, however, your email provider supports plus-aliases (making name+somestuff@provider.org point to the same inbox as name@provider.org), then nothing prevents you from using the same real email with different plus-aliases to create several free websites on Neocities.

I think that’s fair enough. Again, the website subdomain name is the one you use for login, email is just for signup purposes. So, I can live with that.


2025-12-08-07-27-41

Neocities turns out to be an even nicer place than I initially thought. There are some “social” features (like ability to “follow” each other’s sites) but they are so non-invasive that it doesn’t matter. It also has a nice CLI utility for website management, written in Ruby (which I don’t mind at this point). There’s only one thing left to test: since your handle ([handle].neocities.org) is primary and email is just for verification, can several websites be registered with a single email? I couldn’t find any confirmation or disproval about that, so there’s only one way to find out.

Meanwhile, the “parallel reality” keeps getting more bizarre and further away from the initial spirit of the project. As I predicted, it just keeps becoming a reskin of mainstream social media with the same kind of people pervasively occupying the space. Never, never in my 20-year Internet presence could I feel so much hypocrisy in one place, mostly practiced by those who blame others for putting out divisive posts.

Speaking of 20 years… Yes, 2005 was the year I finally got some internet access. I could browse the Web that was mostly not infested with bloat, corporate egos and SJW agendas yet. Freedom of speech was mostly unaffected back then. We already needed HTTPS to protect from our own ISPs (and saying too much on a local ISP forum was a no-no, I found that out the hard way), but felt rather safe otherwise. No one would get offended if anyone called a lamer a lamer, for instance. People in general had a greater sense of humor and healthier self-esteem, as it looks like.

Nowadays, “social media” is unbearable because all of that has been mutilated long ago. You can make text-only (or text-first) portals as much as you like but that won’t work because you can’t import 2005s people with that free-thinking mindset straight into today. I managed to preserve that mindset through all of the troubles in my life, but most folks gave in. And they raised other folks who don’t even know what it’s like to think outside the agenda. That’s why “social media” is doomed. Only individual (but interlinked) web pages and standalone blogs can truly revive the spirit.


2025-12-07-20-38-43

If you thought I could get away with data: URIs, then no, they are blocked via their CSP as well.


2025-12-07-19-38-48

For some reason, I have decided to create a Neocities account myself. Honestly don’t regret it. It’s an interesting case study. Especially intresting is the fact that it disallows CORS requests via CSP for free accounts. Of course, there’s a way to bypass that using another, no less interesting “ephemeral” hosting called itty bitty. You just create the long URL of the web page you need to enable CORS for, e.g. using this alias for ibs command:

alias ibs='ibsf(){ cat $* | lzma -9 | base64 -w0 | xargs -0 printf "https://itty.bitty.site/#/%s\n"; }; ibsf'  
Then, you just embed this page into the main “restricted” page using an iframe:

<iframe src="https://itty.bitty.site/#/(long hash of your page)" width=800 height=480></iframe>  
And that’s pretty much it. Of course, to render the embed correctly, you also need to keep in mind the styles itty bitty alters by itself. In particular, it changes the following CSS properties for the body element: margin, padding, max-width, line-height, word-wrap, color, background-color. So, you might want to adjust some or all of them within the HTML document you encode for itty bitty.

I honestly miss the time when such tinkering was the essence of the art of Web development. Neocities even managed to remind me of this time in such an unusual way.


2025-12-07-14-03-41

Look. I don’t see any problem with web applications per se. Most of the time, they work fine and solve a lot of tasks that would otherwise be solved in a trojan-first and/or Faildows-only way. At least a modern browser gives you a cross-platform sandbox to run the same code everywhere, and that’s a good thing that’s hard to not agree with.

What I definitely don’t agree with is constant shovage of web app functionality into places that never needed it. I remember the times when you could use Web forums and entire portals without JS, let alone view someone’s blog feed. Nowadays, you often can’t view a fucking landing page without JS and WebGL. Even if the owner doesn’t use JS, you will be turned away by Cloudflare, Fastly or other shitty gateway that requires you to turn it on… just because. Lynx? Links2? Elinks? Dillo+? W3M? Offpunk? Netsurf? Fuck off then, we only serve normies. Remember when some pages refused to display the contents if you didn’t have ActiveX or Flash plugin enabled? Well, now the Web standards are mostly adhered to, but somehow the situation is ten times worse if you think about it.

This “everything is an app” paradigm is the way to long-term failure. Not everything on the Web has to be an app. HTTP stands for “hypertext transfer protocol”, and HTML stands for “hypertext markup language”. The keyword here is hypertext, and that’s more than enough for plenty of use cases, which is something lazy app-cash-grabbers don’t seem to understand with their reacts, nextjses and other tailwinds. They don’t know proper Web development techniques, haven’t adopted any Web design culture, yet still think they can produce something opposite to mainstream while using the same mainstream approach. Still, I don’t think there’s any malicious intent hidden in their minds, just basic tech illiteracy combined with desire to “conquer the world” and attract gullible investors as quickly as possible.

What can we do to combat this on the Web itself, without moving away to Gopher/Nex/Gemini? Boycott every “non-app” webpage, forum or social portal that doesn’t display in Netsurf or other non-JS browsers. Learn the actual HTML and some CSS and create your own, really independent Web content that doesn’t suffer from this bloat. Link to each other’s lightweight pages. Fully understand the markup you write. Embrace the power of plain hypertext as opposed to application-centric logic.

If you need a place to start creating before leveling up to self-hosting, I think Neocities and Surge are both good starting points. The former is the place one can spend hours clicking on various sites that keep the spirit of truly independent Web alive. The latter is for those only interested in bare functionality that allows you to get up and running as quickly as possible (if you’re fine with installing a NodeJS package, that is). If, on the other hand, you think you’re ready for self-hosting, I’ll write about my approach to that a bit later.

And so, we don’t give up. And we will return.


2025-12-07-12-48-26

TIL that you don’t even have to unzip the .wsz skins for Audacious to work with them.

Just move the skin file itself to ~/.local/share/audacious/Skins and everything will be fine.

Of course you have to mkdir -p this directory if it doesn’t exist yet.


2025-12-07-12-11-45

To have some fun:

  1. Install Audacious and switch to the Winamp Classic interface in the settings menu (Ctrl+P).
  2. Go to e.g. this site and download some .wsz skins.
  3. Save this shell script and use it to install skins:

#!/bin/sh  
# Install Winamp skins for Audacious  
SKINDIR=${HOME}/.local/share/audacious/Skins  
SKINNAME="$(basename -s.wsz $1)"  
mkdir -p $SKINDIR  
unzip $1 -d "${SKINDIR}/${SKINNAME}"  
echo "Skin $SKINNAME installed!"  
4. Select the installed skins in the Audacious settings menu.


2025-12-07-11-27-31

Oh to be 13 again, chatting with friends on msn messenger over dial-up and listening to linkin park in winamp

I think this luser made a couple of typos about Gaim and XMMS.

The modern equivalents would be Pidgin and Audacious, of course. Although I personally never considered either of these UIs something outstanding. Maybe gonna rediscover Audacious for nostalgia sake, but I’m just fine with mpg123 and mpv.


2025-12-07-11-07-26

Having rlwrap and ed on a remote host greatly helps with quick edits of a single file via SSH.


2025-12-07-11-02-13

Don’t hate the jargon. It’s not some secret knowledge.


2025-12-07-10-30-11

Ok, here are some great music sets for you to yt-dlp -t mp3:

To be continued…


2025-12-07-08-07-03

Not sure how ethical it would be to leave YT music links here.

On one hand, the URLs can be fed into yt-dlp -t mp3 for free downloading.

On the other hand, this still increases your engagement with commercial platforms.

On the third :) hand, I don’t have enough exposed storage in a place secure enough to provide direct DL links, and torrenting might be problematic for some. It wouldn’t be problematic if they were encrypted, but the idea is to add them ad hoc, and encrypting every individual file can be tedious.

So, for now, I think I’m going to settle on the links from YT and other non-mandatory-signup sources along with specifying full track names. It’s up to you to download them with yt-dlp or any other sources you see fit.


2025-12-07-07-41-28

Meanwhile, in the “parallel reality”:

I reckon something went wrong there from the very beginning. Well, at least there’s some visual style to borrow, especially with the warm, lynx-colored text.


2025-12-07-07-20-44

The CMS now looks like this:

#!/bin/sh  
# vars  
scriptdir="$(dirname "$(realpath "$0")")"  
postfile="${scriptdir}/posts"  
tmpfile="$(mktemp)"  
# the vars file must define BLOG_HOST, BLOG_CONTENT_DIR and BLOG_BACKUP  
. "${scriptdir}/vars"  
target="${BLOG_HOST}:${BLOG_CONTENT_DIR}"  
backup="${BLOG_HOST}:${BLOG_BACKUP}"  
# fetch the backup  
echo "Fetching the post backup..."  
rsync $backup $postfile  
if [ "$1" != "upd" ]; then # prepare the post  
  echo "Preparing the post..."  
  dt="$(date -Is -u | cut -d + -f 1| tr ':T' -)"  
  printf '<span class=dim id="%s">[%s](#%s)</span>\n\n' "$dt" "$dt" "$dt" > $tmpfile  
  cat >> $tmpfile  
  printf '\n%s\n' '*****' >> $tmpfile  
  cat $postfile >> $tmpfile  
  mv $tmpfile $postfile  
fi  
# compile and cleanup  
echo "Compiling..."  
markdown -5 -G -f links,image,pants,html,ext,fencedcode,strikethrough $postfile > $tmpfile  
cat ${scriptdir}/start.html $tmpfile ${scriptdir}/end.html > ${scriptdir}/index.html  
rm -f $tmpfile  
# send it  
echo "Sending..."  
rsync ${scriptdir}/lynx128.png ${target}/  
rsync ${scriptdir}/index.html ${target}/  
rsync $postfile $backup  
ssh $BLOG_HOST 'docker restart lynx-server'  
echo "Done"  
The markdown command here is provided by the discount package.

If there are any further changes to this script, they are gonna be very minor.


2025-12-07-06-53-12

Don’t get me wrong, I like pandoc, it’s just an overkill for this particular task.


2025-12-06-23-15-14

Looks like transitioning from pandoc to discount went smoothly. Less bloat, more compatibility.


2025-12-06-22-32-12

Testing another Markdown filter. Things may break.


2025-12-06-13-55-33

Speaking of .vimrc, mine is now just 20 lines long:

syntax off  
filetype indent off  
set encoding=utf-8  
set backspace=indent,eol,start  
set autoindent  
set copyindent  
set noswapfile  
set nobackup  
set tabstop=2  
set shiftwidth=2  
set softtabstop=2  
set expandtab  
set wrap  
set ignorecase  
set ruler  
set magic  
set scrolloff=4  
set smartindent  
set shiftround  
set shortmess=I  
Minimal and efficient.


2025-12-06-13-50-34

Hmm, I noticed that if you open bare Vim then it no longer displays the Uganda related message all the time. Only sometimes.

Anyway, will probably add set shortmess=I into all of my .vimrc instances.


2025-12-06-13-27-12

Played around with Q4OS (TDE edition) on A1370. Looks very promising.

This is the first distro so far that offered me to adjust the display scaling from the start, also providing a virtual ruler for the user to match it with a physical one.

Other than that, it’s a Debian Trixie with some heavy ricing and UX optimizations.

The 32-bit version is still based upon Debian Bookworm simply because there won’t be any 32-bit Trixie anymore. Yet the Q4OS team vows to provide updates to the previous release until June 2028. Impressive.

I don’t like x86 as a whole but I think ditching its 32-bit support is a huge L for Debian project. No wonder since rust-a-mans and leftists started taking over it as well.

In a few years, there will be fewer distros that I can run on my nc2400 and still get fresh software versions. Oh well, I hope to DIY everything to reach a sustainable level then.


2025-12-06-09-22-26

Decided to experiment on the Air first. The nc2400 still needs battery replacement.

From the live+install image, Q4OS definitely looks and feels like a distro for the normies. Well, TDE tries to look like current KDE, even with the same standard theme but without all of the bloat.

Not sure why the installation takes so long though. Maybe my thumbdrive I use to install OSes from is just that old.


2025-12-06-08-42-33

Glad for @cyberpilate to finally find a nice LTS distro for his Vaio P.

Maybe will give Q4OS a try on my old MBA or even nc2400 and see what this TDE is all about.

Because Crunchbang++ is boring.


2025-12-06-08-22-56

Chromium on the deck (recent Raspbian) started living its own life, scrolling around the page. I said “enough is enough” and installed LibreWolf here:

sudo apt update && sudo apt install extrepo -y  
sudo extrepo enable librewolf  
sudo apt update && sudo apt install librewolf -y  
Now everything looks stable and quiet.
Although I only need a non-text browser for certain types of content.


2025-12-06-07-31-49

If IMEI modification is explicitly illegal in your jurisdiction, then your jurisdiction sucks ass and deserves a revolution.


2025-12-06-07-08-41

How to know whether a piece of software is written in Rust?

Simple: its author will tell you about it before anything else. Before telling what this software is doing or how it’s better than any existing one for the same purpose or how to use it.

Look at GitHub (not encouraging you to use it, far from it), Codeberg or any other public repository platform and search for the phrase “written in Rust”. Thousands of results. Over 34K on GitHub and about 540 on Codeberg (which already implies which hosting is better, but still). People put this phrase into the project’s description as if this is the main merit of the project (or maybe their own). I used to put the language into the descriptions of some of my early projects but stopped doing so long ago. And advise everyone to stop doing so, regardless of the languages used (unless it’s some exotics like TI-74 BASIC, VTL-2, Brainfuck or Intercom 1000). Why?

First, this is plain useless. All of those platforms now show which (mainstream) languages the project uses in the project’s sidebar. If it’s written in Rust, everyone will see that anyway, even without looking at the files.

Second, end users mostly don’t care what the project is written in, at least as long as it builds and works correctly. They don’t even look at the languages in the sidebar. Most of them don’t look anywhere beyond the readme. And that’s totally normal. On the other hand, I’m not “most users” and I can use the phrase “written in Rust” to filter out potential crap without even having to try it out. For the record, good Rust projects (like ripgrep) never use this phrase in their project descriptions.

Third, and this is most important, such phrases are solid indicators of the authors' insecurity. They show that the authors don’t know how else to justify their NIH syndrome besides putting the language as a distinct feature. In almost 100% cases, this phrase shows two things: 1) that such software already exists and the author brings nothing new to the scene, 2) that the author thinks of Rust as of a panacea that will solve every possible problem with security, stability etc. Which is obviously not the case (see the recent sudo-rs and Cloudflare outages when they rewrote their core to Rust). These two points are enough to filter out such projects without even trying.

Again, even having to highlight issues like this shows that Rust has turned into something very unhealthy. Like, you know… cancer.

P.S. This post is written in Markdown. Do I make a big deal of it?


2025-12-05-16-10-58

Here’s more of a final version of my CMS (with host and directory names redacted):

#!/bin/sh  
# vars  
scriptdir="$(dirname "$(realpath "$0")")"  
postfile="${scriptdir}/posts"  
tmpfile="$(mktemp)"  
targethost="..."  
target="${targethost}:..."  
backup="${targethost}:..."  
# fetch the backup  
echo "Fetching the post backup..."  
rsync $backup $postfile  
if [ "$1" != "upd" ]; then # prepare the post  
  echo "Preparing the post..."  
  dt="$(date -Is -u | cut -d + -f 1| tr ':T' -)"  
  printf '<span class=dim id="%s">[%s](#%s)</span>\n\n' "$dt" "$dt" "$dt" > $tmpfile  
  cat >> $tmpfile  
  printf '\n%s\n' '*****' >> $tmpfile  
  cat $postfile >> $tmpfile  
  mv $tmpfile $postfile  
fi  
# compile and cleanup  
echo "Compiling..."  
pandoc -f markdown -t html5 -o $tmpfile $postfile  
cat ${scriptdir}/start.html $tmpfile ${scriptdir}/end.html > ${scriptdir}/index.html  
rm -f $tmpfile  
# send it  
echo "Sending..."  
rsync ${scriptdir}/lynx128.png ${target}/  
rsync ${scriptdir}/index.html ${target}/  
rsync $postfile $backup  
ssh $targethost 'docker restart lynx-server'  
echo "Done"  


2025-12-05-16-06-29

I think even moving the symlink to .local/bin should work fine.


2025-12-05-16-03-06

Attempt at a raw live posting, no editor whatsoever. The script still should work fine when I end this sentence with ^D.


2025-12-05-15-56-04

Posting from the deck some symlinks later…


2025-12-05-15-27-15

Imagine signing up in a place that poses to be the opposite of big, commercialized Web, “striving to bring back the spirit of Web 1.0”, designed in a cyberpunk asethetics, emphasizing on usage of no AI, algorithms, tracking or other modern scum, distancing itself from “the cyber malls of the corpos”. The place looks nice and promising a great hacker vibe at the first glance.

But then, you open the feed. And get instantly bombarded with words like… Windows. Iphone. Spotify. Apple Music. Rust. C#.

“Lolwut? Where am I really?”

And then you read the FAQ.

Images aren’t loading? They need a WebGL shader component to render. Enable WebGL in your browser settings.

Stack? Nuxt frontend. Firebase backend. Vercel hosting. Your email and password are safe and encrypted using Firebase Auth.

And then you open the CSS styles. Tailwind over the top.

And the site doesn’t even display in Dillo Plus because its “Vercel security check” requires JS. Even with JS, the auth doesn’t work on some Android browsers.

And then, the more you read the feed, the more you realize all of it is a fucking charade.

No real hackers there. No believers in the cause. Not a single person who knows what it’s really like to live in a dystopia (which I’ve been trapped in for the last 4 years btw). Just average lusers with their first-world problems, not having a slightest clue what they are doing, hipsters who think they are somehow different (by going all-in form over function) and aggressive commies who call to silence and cancel anyone who doesn’t agree with their doctrine of conformity.

It’s just another fad. Just another pseudo-underground to steal your attention from what really matters.

I created this microblog to not be lured into such places ever again.

And you, you, whoever stumbles upon it, can read it with any Web browser imaginable with HTTPS support. Even lynx. And it’s going to stay that way.


2025-12-05-13-55-00

This even displays nicely in the Offpunk browser. The footer is cut out for some reason though. Maybe because it’s semantically meaningless.


2025-12-05-13-37-41

Some shell aliases I use

alias ab='abduco'  
alias aba='abduco -A'  
alias aliases='vim $HOME/.aliases && . $HOME/.aliases'  
alias doas='sudo'  
alias edr='ef() { ssh "$1" rlwrap ed -p: "$2"; }; ef'  
alias ee='rlwrap ed -p:'  
alias eer='doas rlwrap ed -p:'  
alias fbstream='stream --vo=drm'  
alias grep='grep --color=auto'  
alias ibs='ibsf(){ cat $* | lzma -9 | base64 -w0 | xargs -0 printf "https://itty.bitty.site/#/%s\n"; }; ibsf'  
alias l='ls -lahF'  
alias musgrab='yt-dlp -t mp3'  
alias n='echo -e "$(date -Im)\t$*" >> ~/n'  
alias nixclean='sudo nix-collect-garbage -d && sudo nixos-rebuild switch'  
alias nixupgrade='sudo nixos-rebuild switch --upgrade'  
alias r13='r13(){ echo "$*" | tr "A-Za-z" "N-ZA-Mn-za-m"; }; r13'  
alias radio='mpv --vid=no --sid=no --ytdl-format=bestaudio/best'  
alias reload-aliases='. $HOME/.aliases'  
alias rootsh='sudo $SHELL'  
alias stream='mpv --ytdl-format="bestvideo[height<=?768][vcodec!=vp9]+bestaudio/best"'  
alias toraria='torsocks aria2c --async-dns=false -x 16 -j 16'  
alias tornew='echo -e "AUTHENTICATE \"\"\r\nsignal NEWNYM\r\nQUIT" | nc 127.0.0.1 9051'  
alias websrv='python3 -m http.server'  


2025-12-05-12-18-34

To prevent OpenSSH from treating you like a toddler with those quantum scarecrow warnings, just append WarnWeakCrypto no to your ~/.ssh/config file under the Host * section.


2025-12-05-12-10-30

Oh, and every post’s date line actually is a permalink.

What if everyone, instead of using a locked down social platform, created their own web pages with their own unique content, linking to each other’s posts on different sites? Crazy, huh?

Oh well, I guess it’s much easier to sit inside a walled garden and still call yourself “indie web”. Disgusting.


2025-12-05-12-04-47

Wanna see my CMS for this?

#!/bin/sh  
# vars  
scriptdir="$(dirname "$0")"  
postfile="${scriptdir}/posts"  
tmpfile="$(mktemp)"  
targethost="..."  
target="${targethost}:..."  
if [ "$1" != "upd" ]; then # prepare the post  
  dt="$(date -Is -u | cut -d + -f 1| tr ':T' -)"  
  printf '<span class=dim id="%s">[%s](#%s)</span>\n\n' "$dt" "$dt" "$dt" > $tmpfile  
  cat >> $tmpfile  
  printf '\n%s\n' '*****' >> $tmpfile  
  cat $postfile >> $tmpfile  
  mv $tmpfile $postfile  
fi  
# compile and cleanup  
pandoc -f markdown -t html5 -o $tmpfile $postfile  
cat ${scriptdir}/start.html $tmpfile ${scriptdir}/end.html > ${scriptdir}/index.html  
rm -f $tmpfile  
# send it  
rsync ${scriptdir}/lynx128.png ${target}/  
rsync ${scriptdir}/index.html ${target}/  
ssh $targethost 'docker restart lynx-server'  
And I post everything directly from a Vim buffer via :w !./post.sh.

Keep it simple, stupid.


2025-12-05-11-58-33

Hellorld!

Starting this new microblog for the reasons I’ll explain a bit later. Still in testing phase.

Main features: no JS, no tailwind, no cookies. Just content.