Bonum Certa Men Certa

Techrights Available for Download as XML Files

Open data, Free/libre software, free society

tar gz file



Summary: Archiving of the site in progress; scripts and data are being made available for all to download

IN ADDITION to Drupal pages and almost 26,000 WordPress blog posts (and videos and podcasts, not to mention loads of IRC logs) we also have nearly 700 Wiki pages and a reader decided to organise an archive or an index for an archive.



Now available for download as a compressed archive (lots of XML files) is last week's pile. It's also available for download from the Internet Archive. Those are all the Wiki pages.

The code in Fig:




#< fig code > # comments | built-in functions | user functions | inline python

#### license: creative commons cc0 1.0 (public domain) #### http://creativecommons.org/publicdomain/zero/1.0/ proginf = "wikidump 0.1 jul 2019 mn" # dump xml for each wiki page on techrights (no edit hist) # create each actual file function dumppage url urltext = arrcurl url title = "" forin each urltext findtitle = instr each "<title>" iftrue = findtitle title = each ltrim rtrim split title "<title>" join title "" split title "</title>" join title "" break fig next iftrue title outfilename = "techrights_" plus title plus ".xml" split outfilename "/" join outfilename ":slash:" open "w" forin each urltext now = each fprint outfilename next now = outfilename close fig fig

# get list of pages allpages = arrcurl "http://techrights.org/wiki/index.php/Special:AllPages" allpageslen = allpages len longest = 0 longestindex = 0 for each 1 allpageslen 1 eachlen = allpages mid each 1 len ifmore eachlen longest longest = eachlen longestindex = each fig next

# process list of pages and call dumppage for each quot = 34 chr pages = allpages mid longestindex 1 split pages quot forin each pages iswiki = instr each "/wiki/index.php/" ifequal each "/wiki/index.php/Special:AllPages" ignoreit else iftrue iswiki now = "http://techrights.org" plus each split now "http://techrights.org/wiki/index.php/" join now "http://techrights.org/wiki/index.php/Special:Export/" dumppage now fig fig next

# create tgz archive pos = 0 python if figosname != "nt": pos = 1 fig iftrue pos tm = time split tm ":" join tm "." dt = date split dt "/" join dt "-" tgzname = "techrightswiki_" plus dt plus "_" plus tm plus ".tar.gz" now = "tar -cvzf " plus tgzname plus " techrights_*" shell fig



Or alternatively in Python (Fig-derived):




#!/usr/bin/env python2 # encoding: utf-8 # fig translator version: fig 4.6 import sys, os from sys import stdin, stdout from sys import argv as figargv try: from colorama import init init() except: pass # (only) windows users want colorama installed or ansi.sys enabled

try: from sys import exit as quit except: pass

from random import randint from time import sleep

from os import chdir as figoch from os import popen as figpo from os import system as figsh from os import name as figosname figsysteme = 0 figfilehandles = {} figfilecounters = {} from sys import stdout def figlocate(x, l = "ignore", c = "ignore"): import sys if l == "ignore" and c == "ignore": pass # do nothing. want it to return an error?

elif l< 1 and c != "ignore": sys.stdout.write("[" + str(c) + "G") # not ansi.sys compatible elif l != "ignore" and c == "ignore": sys.stdout.write("[" + str(l) + ";" + str(1) + "H") else: sys.stdout.write("[" + str(l) + ";" + str(c) + "H")

import time

def fignonz(p, n=None): if n==None: if p == 0: return 1 else: if p == 0: return n return p

def fignot(p): if p: return 0 return -1

figbac = None figprsbac = None sub = None def fignone(p, figbac): if p == None: return figbac return p return -1

def stopgraphics(): global yourscreen global figraphics figraphics = 0 try: pygame.quit() except: pass

def figcolortext(x, f): b = 0 if f == None: f = 0 if b == None: b = 0 n = "0" if f > 7: n = "1" f = f - 8

if f == 1: f = 4 ## switch ansi colours for qb colours elif f == 4: f = 1 ## 1 = blue not red, 4 = red not blue, etc.

if f == 3: f = 6 elif f == 6: f = 3

if b > 7: b = b - 8

if b == 1: b = 4 elif b == 4: b = 1

if b == 3: b = 6 elif b == 6: b = 3

stdout.write("\x1b[" + n + ";" + str(30+f) + "m") return "\x1b[" + n + ";" + str(30+f) + ";" + str(40+b) + "m"

def figcolourtext(x, f): b = 0 if f == None: f = 0 if b == None: b = 0 n = "0" if f > 7: n = "1" f = f - 8

if f == 1: f = 4 ## switch ansi colours for qb colours elif f == 4: f = 1 ## 1 = blue not red, 4 = red not blue, etc.

if f == 3: f = 6 elif f == 6: f = 3

if b > 7: b = b - 8

if b == 1: b = 4 elif b == 4: b = 1

if b == 3: b = 6 elif b == 6: b = 3

stdout.write("\x1b[" + n + ";" + str(30+f) + "m") return "\x1b[" + n + ";" + str(30+f) + ";" + str(40+b) + "m"

figcgapal = [(0, 0, 0), (0, 0, 170), (0, 170, 0), (0, 170, 170), (170, 0, 0), (170, 0, 170), (170, 85, 0), (170, 170, 170), (85, 85, 85), (85, 85, 255), (85, 255, 85), (85, 255, 255), (255, 85, 85), (255, 85, 255), (255, 255, 85), (255, 255, 255)]

def figget(p, s): return s

def fighighlight(x, b): f = None if f == None: f = 0 if b == None: b = 0 n = "0" if f > 7: n = "1" f = f - 8

if f == 1: f = 4 ## switch ansi colours for qb colours elif f == 4: f = 1 ## 1 = blue not red, 4 = red not blue, etc.

if f == 3: f = 6 elif f == 6: f = 3

if b > 7: b = b - 8

if b == 1: b = 4 elif b == 4: b = 1

if b == 3: b = 6 elif b == 6: b = 3

stdout.write("\x1b[" + n + str(40+b) + "m") return "\x1b[" + n + str(40+b) + "m"

def figinstr(x, p, e): try: return p.index(e) + 1 except: return 0

def figchdir(p): try: figoch(p) except: print "no such file or directory: " + str(p) figend(1)

def figshell(p): global figsysteme try: figsysteme = figsh(p) except: print "error running shell command: " + chr(34) + str(p) + chr(34) figend(1)

def figarrshell(c): global figsysteme try: figsysteme = 0 sh = figpo(c) ps = sh.read().replace(chr(13) + chr(10), chr(10)).replace(chr(13), chr(10)).split(chr(10)) figsysteme = sh.close() except: print "error running arrshell command: " + chr(34) + str(c) + chr(34) figend(1) return ps[:]

def figsgn(p): p = float(p) if p > 0: return 1 if p< 0: return -1 return 0

def figstr(p): return str(p)

def figprint(p): print p

def figchr(p): if type(p) == str: if len(p) > 0: return p[0] return chr(p)

def figprints(p): stdout.write(str(p)) sys.stdout.flush()

def figleft(p, s): return p[:s]

def figmid(p, s, x): arr = 0 if type(p) == list or type(p) == tuple: arr = 1 rt = p[s - 1: x + s - 1] if arr and len(rt) == 1: rt = rt[0] return rt

def figright(p, s): return p[-s:]

def figrandint(x, s, f): return randint(s, f)

def figlcase(p): return p.lower()

def figucase(p): return p.upper()

def figint(p): return int(p)

def figarrset(x, p, s): if type(s) == tuple: if len(s) == 1: fas = s[0] elif type(s) == list: if len(s) == 1: fas = s[0] else: fas = s x[p - 1] = s

def figopen(x, s): import fileinput if s.lower() == "w": if (x) not in figfilehandles.keys(): figfilehandles[x] = open(x[:], s.lower()) elif s.lower() == "r": if (x) not in figfilehandles.keys(): figfilehandles[x] = fileinput.input(x[:]) figfilecounters[x] = 0 else: if (x) not in figfilehandles.keys(): figfilehandles[x] = open(x[:], s[:])

def figfprint(x, s): fon = figosname sep = chr(10) if fon == "nt": sep = chr(13) + chr(10) figfilehandles[s].write(str(x) + sep)

def figflineinput(x, s): try: p = figfilehandles[s][figfilecounters[s]].replace(chr(13), "").replace(chr(10), "") figfilecounters[s] += 1 except: p = chr(10) return p

def figclose(x): if (x) in figfilehandles.keys(): figfilehandles[x].close() del figfilehandles[x] try: del figfilecounters[x] except: pass

def figcls(x): if figosname == "nt": cls = figsh("cls") else: stdout.write("[2J[1;1H") sys.stdout.flush()

def figarropen(x, s): x = open(s).read().replace(chr(13) + chr(10), chr(10)).replace(chr(13), chr(10)).split(chr(10)) return x[:]

def figarrcurl(x, s): from urllib import urlopen x = str(urlopen(s).read()) x = x.replace(chr(13) + chr(10), chr(10)).replace(chr(13), chr(10)).split(chr(10)) return x[:]

def figarrstdin(x): ps = [] for p in stdin: ps += [p[:-1]] return ps[:]

def figarrget(x, p, s): if 1: return p[s - 1]

def figplus(p, s): if type(p) in (float, int): if type(s) in (float, int): p = p + s else: p = p + s # float(s) if you want it easier if p == float(int(p)): p = int(p) else: if type(p) == str: p = p + s # str(s) if you want it easier if type(p) == list: if type(s) == tuple: p = p + list(s) elif type(s) == list: p = p + s[:] else: p = p + [s] if type(p) == tuple: if type(s) == tuple: p = tuple(list(p) + list(s)) elif type(s) == list: p = tuple(list(p) + s[:]) else: p = tuple(list(p) + [s]) return p

def figjoin(p, x, s): t = "" if len(x): t = str(x[0]) for c in range(len(x)): if c > 0: t += str(s) + str(x[c]) return t # s.join(x)

def figarr(p): if type(p) in (float, int, str): p = [p] else: p = list(p) return p

def figsplit(p, x, s): return x.split(s)

def figval(n): n = float(n) if float(int(n)) == float(n): n = int(n) return n

def figtimes(p, s): if type(p) in (float, int): p = p * s # float(s) if you want it easier if p == float(int(p)): p = int(p) else: if type(p) == list: p = p[:] * s # figval(s) else: p = p * s # figval(s) if you want it easer return p

def figdivby(p, s): p = float(p) / s if p == float(int(p)): p = int(p) return p def figminus(p, s): return p - s

def figtopwr(p, s): p = p ** s if p == float(int(p)): p = int(p) return p def figmod(p, s): return p % s

def figcos(p): from math import cos p = cos(p) if p == float(int(p)): p = int(p) return p

def figsin(p): from math import sin p = sin(p) if p == float(int(p)): p = int(p) return p def figsqr(p): from math import sqrt p = sqrt(p) if p == float(int(p)): p = int(p) return p

def figltrim(p): return p.lstrip() def figlineinput(p): return raw_input() def figlen(p): return len(p) def figasc(p): return ord(p[0]) def figatn(p): from math import atan p = atan(p) if p == float(int(p)): p = int(p) return p

def fighex(p): return hex(p) def figrtrim(p): return p.rstrip() def figstring(x, p, n): if type(n) == str: return n * p return chr(n) * p def figtimer(p): from time import strftime return int(strftime("%H"))*60*60+int(strftime("%M"))*60+int(strftime("%S"))

def figtime(p): from time import strftime return strftime("%H:%M:%S")

def figdate(p): from time import strftime return strftime("%m/%d/%Y")

def figcommand(p): return figargv[1:]

def figtan(p): from math import tan p = tan(p) if p == float(int(p)): p = int(p) return p

def figoct(p): return oct(p)

def figsleep(p, s): sleep(s) def figarrsort(p): p.sort()

def figdisplay(x): global figraphics, figrupd figrupd = 0 if figraphics == 1: pygame.display.update()

def figreverse(p): if type(p) == list: p.reverse() return p elif type(p) == str: p = map(str, p) p.reverse() p = "".join(p) return p

def figarreverse(p): p.reverse()

def figfunction(p, s): return p

def figend(x): quit()

def figif(p, s): return p

def figthen(p, s): return p

def figsystem(x): quit()

#### http://creativecommons.org/publicdomain/zero/1.0/

figlist = 0 try: figlist = int(type(proginf) == list) except NameError: pass if not figlist: proginf = 0 proginf = "wikidump 0.1 jul 2019 mn"

# dump xml for each wiki page on techrights (no edit hist)

# create each actual file def dumppage(url):

figlist = 0 try: figlist = int(type(urltext) == list) except NameError: pass if not figlist: urltext = 0 urltext = figarrcurl(urltext, url)

figlist = 0 try: figlist = int(type(title) == list) except NameError: pass if not figlist: title = 0 title = ""

for each in urltext:

figlist = 0 try: figlist = int(type(findtitle) == list) except NameError: pass if not figlist: findtitle = 0 findtitle = figinstr(findtitle, each, "<title>")

if findtitle:

figlist = 0 try: figlist = int(type(title) == list) except NameError: pass if not figlist: title = 0 title = each title = figltrim(title) title = figrtrim(title) title = figsplit(title, title, "<title>") title = figjoin(title, title, "") title = figsplit(title, title, "</title>") title = figjoin(title, title, "")

break if title:

figlist = 0 try: figlist = int(type(outfilename) == list) except NameError: pass if not figlist: outfilename = 0 outfilename = "techrights_" outfilename = figplus(outfilename, title) outfilename = figplus(outfilename, ".xml") outfilename = figsplit(outfilename, outfilename, "/") outfilename = figjoin(outfilename, outfilename, ":slash:") figopen(outfilename, "w")

for each in urltext:

figlist = 0 try: figlist = int(type(now) == list) except NameError: pass if not figlist: now = 0 now = each figfprint(now, outfilename)

figlist = 0 try: figlist = int(type(now) == list) except NameError: pass if not figlist: now = 0 now = outfilename figclose(now)

# get list of pages

figlist = 0 try: figlist = int(type(allpages) == list) except NameError: pass if not figlist: allpages = 0 allpages = figarrcurl(allpages, "http://techrights.org/wiki/index.php/Special:AllPages")

figlist = 0 try: figlist = int(type(allpageslen) == list) except NameError: pass if not figlist: allpageslen = 0 allpageslen = allpages allpageslen = figlen(allpageslen)

figlist = 0 try: figlist = int(type(longest) == list) except NameError: pass if not figlist: longest = 0 longest = 0

figlist = 0 try: figlist = int(type(longestindex) == list) except NameError: pass if not figlist: longestindex = 0 longestindex = 0

for each in range(int(float(1)), int(float(allpageslen)) + figsgn(1), fignonz(int(float(1)))):

figlist = 0 try: figlist = int(type(eachlen) == list) except NameError: pass if not figlist: eachlen = 0 eachlen = allpages eachlen = figmid(eachlen, each, 1) eachlen = figlen(eachlen)

if eachlen > longest:

figlist = 0 try: figlist = int(type(longest) == list) except NameError: pass if not figlist: longest = 0 longest = eachlen

figlist = 0 try: figlist = int(type(longestindex) == list) except NameError: pass if not figlist: longestindex = 0 longestindex = each

# process list of pages and call dumppage for each

figlist = 0 try: figlist = int(type(quot) == list) except NameError: pass if not figlist: quot = 0 quot = 34 quot = figchr(quot)

figlist = 0 try: figlist = int(type(pages) == list) except NameError: pass if not figlist: pages = 0 pages = allpages pages = figmid(pages, longestindex, 1) pages = figsplit(pages, pages, quot)

for each in pages:

figlist = 0 try: figlist = int(type(iswiki) == list) except NameError: pass if not figlist: iswiki = 0 iswiki = figinstr(iswiki, each, "/wiki/index.php/")

if each == "/wiki/index.php/Special:AllPages":

figlist = 0 try: figlist = int(type(ignoreit) == list) except NameError: pass if not figlist: ignoreit = 0

else: if iswiki:

figlist = 0 try: figlist = int(type(now) == list) except NameError: pass if not figlist: now = 0 now = "http://techrights.org" now = figplus(now, each) now = figsplit(now, now, "http://techrights.org/wiki/index.php/") now = figjoin(now, now, "http://techrights.org/wiki/index.php/Special:Export/") figbac = now now = dumppage(now) ; now = fignone(now, figbac) ;

# create tgz archive

figlist = 0 try: figlist = int(type(pos) == list) except NameError: pass if not figlist: pos = 0 pos = 0

if figosname != "nt": pos = 1 if pos:

figlist = 0 try: figlist = int(type(tm) == list) except NameError: pass if not figlist: tm = 0 tm = figtime(tm) tm = figsplit(tm, tm, ":") tm = figjoin(tm, tm, ".")

figlist = 0 try: figlist = int(type(dt) == list) except NameError: pass if not figlist: dt = 0 dt = figdate(dt) dt = figsplit(dt, dt, "/") dt = figjoin(dt, dt, "-")

figlist = 0 try: figlist = int(type(tgzname) == list) except NameError: pass if not figlist: tgzname = 0 tgzname = "techrightswiki_" tgzname = figplus(tgzname, dt) tgzname = figplus(tgzname, "_") tgzname = figplus(tgzname, tm) tgzname = figplus(tgzname, ".tar.gz")

figlist = 0 try: figlist = int(type(now) == list) except NameError: pass if not figlist: now = 0 now = "tar -cvzf " now = figplus(now, tgzname) now = figplus(now, " techrights_*") figshell(now)


We also have a complete set of pages and associated scripts/metadata. We might post these separately some other day. We encourage people to make backups or copies. No site lasts forever and decentralisation is key to longterm preservation.

Recent Techrights' Posts

Symptom of Publishers Dying: They Move to Adopt Slop. Symptom of Software Companies Dying: They Move to Adopt Slop ('Vibe').
It'll always fail. It's hype. It's a bubble.
Under IBM, Red Hat Replaces Code With LLM Slop, Fedora is Slopware
Not even hiding it, those things are in plain sight
"systemd is essentially a corporate IBM/Redhat project and corporations of course will comply"
Microsoft and IBM care about users' freedom like Cheeto Lump cares about the US Constitution
Gemini Links 20/03/2026: Digital Identity Bifurcation and a "Return to Gemini"
Links for the day
 
The EPO's Local Staff Committee Munich (LSCMN) Explains to the Administrative Council (AC) How Bad Things Have Become at Europe's Second-Largest Institution, Biggest Patent Office, and Corruption/Cocaine Hub (Jobs Sold to Friends)
We'll say a bit more tomorrow
IBM's Red Hat Diversity: Only 3 Women (Out of 11 Leaders)
For comparison's sake, the FSF is about 50% female
Gemini Links 20/03/2026: Depictions of Culture and The Social Smolnet
Links for the day
SimilarWeb Was Never a Reliable Yardstick for Traffic
5RB may need some "house-cleaning"
Strangulation, suffocation, Jonathan Carter & Debian toxic culture confirmed
Reprinted with permission from Daniel Pocock
Reports or Hearsay Suggest Ogilvy Broke Up With IBM and Insiders Report Mass Layoffs in "Infrastructure" (Might Impact Red Hat Entrants)
hearsay in Social Control Media
Scheduled Server Maintenance Tomorrow Night
Starting 9PM
None of the Above (NotA) & Debian snubbing Sruthi Chandran
Reprinted with permission from Daniel Pocock
Links 20/03/2026: Cryptography Pioneers Win Turing Award and BMG Sues Anthropic for Copyright Infringement
Links for the day
Even Uganda Understands That Journalists Never Belong in Prison
"Ugandan authorities must respect the spirit of this ruling and abandon any measures that seek to jail Ugandans for the free flow of ideas."
Inaction Helps Your Enemies
Without freedom, there's nothing else left
Windows Down From 99% to ~50% in Republic of Seychelles (République des Seychelles)
Windows fell by a lot
Confluent Insiders: IBM Laid Over Over 800 at Confluent, Not Just 800
For the record, the layoffs at Confluent won't be over. After the bluewashing there will be "IBM RAs" impacting Confluent folks, aside from PIPs
The Layoffs at IBM Carry on (Shades of Enron)
Is IBM another Enron?
"IBM boss Arvind Krishna... financial package valued at $38 million in calendar 2025 - equivalent to the average collective pay of 765 Big Blue workers."
continues to ruin the company to enrich himself while pretending he has a strategy
Over at Tux Machines...
GNU/Linux news for the past day
IRC Proceedings: Thursday, March 19, 2026
IRC logs for Thursday, March 19, 2026
SLAPP Censorship - Part 16 Out of 200: Detailing the Actors and Explaining Techrights' Own Internet Relay Chat (IRC) Network
For those who have not followed our story
Microsoft "hiding behind bigger news of war, Epstein, other companies' layoffs"
They know what's coming, they just don't know when
Joerg Jaspert (Debian Account Manager/DAM) personally approved Raphael Hertzog's wife Sophie Brun
Reprinted with permission from Daniel Pocock
Letter 'A' prohibited by Code of Conduct extremism
Reprinted with permission from Daniel Pocock
Spoiler: Diversity & Debian means different things to different people
Reprinted with permission from Daniel Pocock
Solicitors Regulation Authority (SRA) Admits Failures and Criticism of Inaction on SLAPPs
many if not all solicitors and solicitor firms in the UK are in effect unregulated
Archiving or Preserving Pages About IBM Layoffs
Layoffs at IBM and the media does not talk about these
ABC, the American National Broadcaster, "Now Publishes Slop"
If the "big media" absorbs slop, it'll no longer be trusted and therefore not read/watched by the public
Links 19/03/2026: Culling Deepfakes of Artists’ Music and "Age Verification Isn’t the Answer"
Links for the day
Gemini Links 19/03/2026: "Aktion GPT-4" and "Kill All Descendants"
Links for the day
"AI" 15 Times in Short 'Article' From The Register MS. And The Register MS Got Paid to Publish It.
gets paid to do this
People Who Decided to Boycott Novell Over Its Microsoft Alliance Should Also Boycott Canonical
As an associate put it, "selling out further, due to Microsoft moles inside Canonical"
Links 19/03/2026: "AI Glasses" as Euphemism for Mass Surveillance and ABC (US) Has Begun Publishing Slop as 'News'
Links for the day
The European Patent Office, Europe's Second-Largest Institution, is on Strike Today
Lots more to come
What People Impacted by the Bluewashing Layoffs at IBM Confluent Say (While the Media Says Nothing at All, in Effect Burying the News)
Worse yet, the mainstream media spreads lies about it right now
IBM Has Turned Red Hat and Fedora Into Slop
This is IBM policy
IBM is Being Robbed, Companies and Jobs Are Destroyed
Companies taken over by IBM will be exploited and destroyed to keep a bubble inflated for a little while longer
In Confluent Layoffs, IBM Vapourises a Quarter of Its Workforce (IBM Buys Something That It Destroys Already)
In the past, such things were typically referred to as "media blackout"; now it's just "the norm".
IBM Effect at Confluent: Mass Layoffs and IBM's Business Conduct Guidelines (BCGs) Said to be Violated
For Confluent employees who survived the layoffs there will be "culture chock"
Over at Tux Machines...
GNU/Linux news for the past day
IRC Proceedings: Wednesday, March 18, 2026
IRC logs for Wednesday, March 18, 2026
Links 19/03/2026: LLM Fatigue (It Doesn't Work as Advertised), "Small Web Feeds"
Links for the day
SLAPP Censorship - Part 15 Out of 200: Background and Particulars of Truth Regarding Techrights and Tux Machines
the basic facts (this has aged well, except the times/ages/numbers)
A Slopfarms Survey for Today (linuxteck.com, linuxsecurity.com, linuxjournal.com)
Not only did Google news link to a slopfarm; it linked to three run by the same team!
Links 18/03/2026: "Venture Capitalist Warns That It’s All About to Come Crashing Down" Due to Slop Bubble, "Birdwatching for Fun and no Profit"
Links for the day
IBM Red Hat is Still Promoting Restricted Boot Which Restricts Users' Control Over Their Computers
Red Hat under IBM is a total catastrophe
Arvind Says... Something Something "Hey Hi" (the State of Today's Media)
Look for news about IBM and most likely it'll boil down to some sound bites from an executive and nothing else
New Post Has Just Explained How IBM Gets Robbed by the People Who Fail IBM
Their plan for IBM is a personal plan
Slop-Spewing GAFAM LLM That Knows Nothing and Understands Nothing, It's a Stochastic Parrot That Cannot Even Figure Out Tux Machines is a Community That Started in Tennessee 22 Years Ago
RMS rightly calls those things "bullshit generators"
Cusdeb Makes New Presentation About Where GNU Hurd (Still a Possible Linux Replacement) Stands in 2026
coming from a generally RMS-friendly account
Gemini Links 18/03/2026: Librarians, Phone Anxiety, Growing 'Small' Net, and Slop Versus Software Engineering
Links for the day
Estimates That IBM to Lay Off Close to 10,000 Workers in 2026 (Not Counting People Pushed Out)
There's still chatter about Confluent mass layoffs
Smug Threat by Garrett to Put My Family and I in Prison Doesn't Prove We Did Anything Wrong, It Only Proves He's Truly Desperate to Stop Further Publications That Embarrass Him
his reputation is poor in the United States
systemd Increasingly Microsoft Project, Controlled by Microsoft and Slopware
Cannot allow choice
What IBM Meant to Red Hat: "Proprietary Bundling, Restricted Source Access"
Anyone or anything that joins IBM likely shortens its lifespan
IBM Thrashing Confluent Upon Arrival, Based on Rumours
We deem it a bigger issue that investigative journalism perished, not that one must rely on hearsay online or mere "rumours"
Slop Is Plagiarism, Not (Vibe) Coding, and It's Not Automated, It Doesn't Save Money
Reject misnomers, explain what's actually happening
UPC is Still Illegal and Unconstitutional (Kangaroo Court for Patents, Manned by Corporate Staff), Federal Court of Justice of Germany Receives Belated Complaint About It
What is happening to Europe???
EPO Demonstration Happening Right Now, Later This Week Things Will Only Escalate Further
The SUEPO The Hague Committee wrote to staff this morning
Sophie Brun, Raphael Hertzog & Debian sexual conflicts of interest
Reprinted with permission from Daniel Pocock
Links 18/03/2026: Commodore's Hedley Davis Dies, Apple Not Good Enough, Cheeto "Floats Treason Charges for Iran War Coverage"
Links for the day
A Step Close to Shutting Down the European Patent Office (EPO)
Not going to work all month long
EPO Staff Demonstration Today
The demonstration will be live-streamed for those thousands of colleagues who don't live in Munich
Gemini Links 18/03/2026: Brazilian SYN Attacks and BGP
Links for the day
LibreLocal Also Coming to Jordan, Kenya, Mexico, New Zealand, and Spain
It helps raise awareness of Software Freedom
Over at Tux Machines...
GNU/Linux news for the past day
IRC Proceedings: Tuesday, March 17, 2026
IRC logs for Tuesday, March 17, 2026