Git browser: Links/
This page presents code associated with the module/unit named above.
Links/merge-daily-links.sh
#!/bin/sh
PATH=/home/links/bin:/usr/local/bin:/usr/bin:/bin
# 2020-03-13
# updated : see Git
set -evx
closure() {
test -d ${tmpdir} || exit 1
echo "Erasing temporary directory (${tmpdir}) and its files."
rm -f ${tmpdir}/feed-tmp.*
rmdir ${tmpdir}
}
cancel() {
echo "Cancelled."
closure
exit 2
}
# trap various signals to be able to erase temporary files
trap "cancel" 1 2 15
d=$(date +"%F");
read -p "Enter a date or press return for $d: " dt;
# update perl libraries from Git
cd ${HOME}/Git/tr-git/Links/
git pull
cd -
if [ -n ${dt} ]; then
dt=${dt:-$d};
d=$(date -d ${dt} +"%F") || exit 1;
fi;
datepath=$(date -d ${d} +"m%Y-%m")
linkshome="/home/links/Links"
linksdir="${linkshome}/${datepath}/"
mergedfile="${linkshome}/${datepath}/${d}-merged.html"
srcfile="${linkshome}/tmp/${d}.html"
automatedfile="${linkshome}/tmp/${d}-automated.html"
otherlinks="${linkshome}/tmp/other-links-${d}.txt"
if ! test -e ${dir}; then
if ! mkdir -p ${dir}; then
echo "problem making or finding'${dir}'"
exit 1
fi
fi
# verify camelCase variants for all URL-generated "tags" in manual file
links-check-camelcase.pl ${srcfile} || exit 1
# validate XHTML in the manual file
echo "Checking for '$srcfile'"
test -e $file || exit 1;
tidy -errors -quiet -xml ${srcfile} || exit 1;
echo "Ok";
echo "Checking if way is clear for new '${mergedfile}'"
test -e ${mergedfile} && exit 1;
echo "Ok";
umask 027
tmpdir=$(mktemp -d /tmp/feeds-tmp.XXXXXX)
tmpfile=$(mktemp -p ${tmpdir} feed-tmp.XXXXXXX)
# remove empty nodes from the manually collected links
# and generate a table of contents
links-cull-empty.pl ${srcfile} > ${tmpfile}
# do TOC separately in case links-cull-empty.pl fails
test -d ${linksdir} || mkdir ${linksdir}
cat ${tmpfile} | links-toc.pl > ${mergedfile}
rm ${tmpfile}
echo
start=$(date -d "$d yesterday" +"%F")
feeds=/home/links/Links/daily.feeds
echo "Loading automated feeds"
while read feed; do
tmpfile=$(mktemp -p ${tmpdir} feed-tmp.XXXXXXX)
rss-since-scraper.pl -d $start -o ${tmpfile} ${feed} &
done <<EOF
$(grep -E -v '^#|^$' ${feeds})
EOF
wait
echo "Done waiting"
echo "T=${tmpdir}"
# concatenate the results of all the feeds
cat ${tmpdir}/feed-tmp.* > ${automatedfile}
# clear signal trapping
trap - 1 2 15
# remove temporary files
closure
cat ${automatedfile} >> ${mergedfile}
dl=$(date -d "${d} last month" +"m%Y-%m")
dn=$(date -d "${d}" +"m%Y-%m")
p="/home/links/Links"
# check this month and last month for duplicates, remove those found
links-de-duplicate.pl -w ${mergedfile}
chmod 644 ${mergedfile}
dir="/home/links/Links/${datepath}/"
if test -e ${otherlinks}; then
chmod 644 ${otherlinks}
cp -p ${otherlinks} $dir && rm ${otherlinks}
fi
# insert citations formatted for social control media
# links-interleave-social-control-media.pl -w ${mergedfile}
exit 0
Links/tr-links-cull-empty.pl
#!/usr/bin/perl
# Try to cull empty nodes recursively upwards
# https://devhints.io/xpath
use utf8;
use HTML::TreeBuilder::XPath;
use Getopt::Long;
use Term::ANSIColor qw(:constants);
use HTML::Entities;
use open qw(:std :utf8);
use English;
use warnings;
use strict;
our %opt = ('p' => 0, 'w' => 0, 'h' => 0, 'v' => 0, );
GetOptions ("paragraphs|p" => \$opt{'p'},
"write|w" => \$opt{'w'},
"verbose+" => \$opt{'v'},
"help|h" => \$opt{'h'},
);
&usage if ($opt{'h'});
# read directly from stdin or else get a list of file names
push(@ARGV, '/dev/stdin') if ($#ARGV < 0);
while (my $infile = shift) {
&readthefile($infile, $opt{'p'}, $opt{'w'});
}
exit(0);
sub readthefile {
my ($file, $opt_p, $opt_w) = (@_);
my $xhtml = HTML::TreeBuilder::XPath->new;
$xhtml->implicit_tags(1);
$xhtml->no_space_compacting(1);
# force input to be read in as UTF-8
my $filehandle;
open ($filehandle, "<", $file)
or die("Could not open file '$file' : error: $!\n");
# parse UTF-8
$xhtml->parse_file($filehandle)
or die("Could not parse file handle for '$file' : $!\n");
close ($filehandle);
# find blockquotes with text but missing paragraph elements, add paragraphs
for my $blockquote (
$xhtml->findnodes('//li/blockquote[text()][count(p)=0]')) {
my $bq = $blockquote->as_text();
$blockquote->delete_content;
# trim leading and trailing whitespace
$bq =~ s/^\s+//; $bq =~ s/\s+$//;
my @p = split(/\s*\n\s*/, $bq);
foreach my $paragraph (@p) {
$blockquote->push_content(['p', ,$paragraph]);
}
}
if ($opt_p) {
# find double-spaced paragraphs inside blockquotes and expand them
for my $blockquote ($xhtml->findnodes('//blockquote[p][count(p)=1]')) {
for my $p ($blockquote->findnodes('./p')) {
my $text = $p->as_text();
my @paragraphs = split(/\n\s*\n\s*/, $text);
if ($#paragraphs >= 0) {
my @new_elems;
for my $p (@paragraphs) {
my $new = HTML::Element->new('p');
$new->push_content($p);
push(@new_elems, $new);
}
$p->replace_with(@new_elems);
}
}
}
}
# find empty end nodes
for my $link ($xhtml->findnodes('//li[h5/a[not(text())and @href=""]
and blockquote[not(*/child::text())]')) {
$link->delete;
}
# also find empty end nodes which are missing a blockquote due to Tidy
for my $link ($xhtml->findnodes('//li[h5/a[not(text())and @href=""]
and not(./blockquote)')) {
$link->delete;
}
# work-around to delete empty ul nodes
for my $link ($xhtml->findnodes('//ul[count(*)=0]')) {
$link->delete;
}
# remove LI nodes with H3 and empty UL
my $keepgoing = 1;
while ($keepgoing) {
$keepgoing = 0;
for my $link ($xhtml->findnodes('//li[h3 and count(ul/li)=0 and count(blockquote)=0]')) {
$link->delete;
$keepgoing=1;
}
}
# trim any leading or trailing whitespace from within anchor href
for my $anchor ($xhtml->findnodes('//h5/a[@href]')) {
my $href = $anchor->attr('href');
$href =~ s/^\s+//;
$href =~ s/\s+$//;
$anchor->attr('href', $href);
}
# remove repeated HR elements
for my $hr ($xhtml->findnodes('//hr/preceding-sibling::*[1][self::hr]')) {
$hr->delete;
}
my $h5err = 0;
my @h5 = ();
for my $anchor ($xhtml->findnodes( '//h5[not(./a)]')) {
$h5err++;
push(@h5, $anchor->as_text());
}
if ($#h5 == 0) {
print STDERR BRIGHT_RED ON_BLUE, "One anchor missing\n";
print STDERR BRIGHT_RED ON_BLUE, "\t".join("\n\t", @h5),"\n";
print STDERR RESET "\n";
} elsif ($#h5 > 0) {
print STDERR BRIGHT_RED ON_BLUE, "Some anchors missing\n";
print STDERR BRIGHT_RED ON_BLUE, "\t".join("\n\t", @h5),"\n";
print STDERR RESET "\n";
}
my $uerr = 0;
for my $anchor ($xhtml->findnodes( '//a[@href = ""]')) {
unless ($uerr++) {
print STDERR BRIGHT_RED ON_BLUE, "One or more URLs missing\n";
}
print STDERR qq(\t),$anchor->as_text(),qq(\n);
}
print STDERR RESET "\n";
my $aerr=0;
for my $anchor ($xhtml->findnodes('//a[@href and not(boolean(text()))]')) {
unless ($aerr++) {
print STDERR BRIGHT_RED ON_BLUE "One or more titles missing\n";
}
print STDERR qq(\t),$anchor->attr('href'),qq(\n);
}
if($uerr || $aerr || $h5err) {
my $s = $uerr + $aerr + $h5err;
print STDERR qq(\n), $s, qq( error),$s eq 1 ? qq() : qq(s),qq(\n);
for my $quote ($xhtml->findnodes('//h5[a[@href="" and not(boolean(text()))]]/following-sibling::blockquote')) {
print STDERR qq(\nHint:\t),$quote->as_text(),qq(\n);
}
print STDERR RESET "\n";
exit(1);
}
open (OUT, ">", "/dev/stdout")
or die("Could not open file 'stdout' : error: $!\n");
print OUT $xhtml->as_XML_indented;
$xhtml->delete;
return (1);
}
sub usage {
my $script = $PROGRAM_NAME;
$script =~ s/^.*\///;
print qq(Usage: $script [hp] filename [filename...] \n);
print qq(\t-h\tthis output\n);
print qq(\t-p\texpand double-spacing into paragraphs within blockquotes\n);
print qq(\t-w\twarnings about links missing a URL or text go to STDERR\n);
exit 0;
}
sub trim_white_space {
my $element = shift;
# see: HTML::Element and HTML::Element::traverse
for my $itemref ($element->content_refs_list) {
if($element->starttag =~ m/^<pre/) {
next;
} elsif (ref ${$itemref}) {
&trim_white_space(${$itemref});
} else {
${$itemref} =~ s/^\s+/ /g;
${$itemref} =~ s/\s+$/ /g;
}
}
return(1);
}
Links/tr-opml-tester.py
#!/usr/bin/python3
"""
Copyright (C) 2024 Bytes Media. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, version 3. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see https://www.gnu.org/licenses/
"""
from argparse import ArgumentParser, RawTextHelpFormatter
from lxml import etree as et
from collections import defaultdict # not sorted
def import_opml_files(importfiles: list):
global verbosity
global appendopml
if verbosity > 1:
print("Reading: ", end='')
pprint.pprint(importfiles)
# read the first file
try:
infile = importfiles.pop()
try:
with open(infile) as xml_file:
feed = xml_file.read()
if verbosity:
print(f"+ Importing from '{infile}'")
except FileNotFoundError:
print(f"Wrong file or file path 1: {infile}")
sys.exit(1)
except Exception:
print("no input OPML files exist")
# to make the first part of the tree
exit(1)
try:
main_tree = et.XML(feed.encode("UTF-8"))
except Exception as e:
print(f"Problem with {infile} : {e}")
exit(1)
# read the rest, if there are more
for infile in importfiles:
if verbosity:
print(f"+ Importing from '{infile}'")
try:
with open(infile) as xml_file:
feed = xml_file.read()
opml = et.fromstring(feed.encode("UTF-8"))
old_body = main_tree.find('.//body')
for new_body in opml.findall('.//body/*'):
node2 = copy.deepcopy(new_body)
main_tree.append(node2)
except FileNotFoundError as e:
print(f"Wrong file or file path 2: {infile}")
sys.exit(1)
except Exception as e:
print(f"{infile} : Exception '{e}'")
exit(1)
# print(et.tostring(main_tree, method="xml").decode("UTF-8"))
return(main_tree)
def check_opml_for_duplicates(main_tree):
duplicates = defaultdict(defaultdict)
# print(et.tostring(main_tree, method="xml").decode("UTF-8"))
for outline in main_tree.findall('.//outline[@xmlUrl]'):
# use the feed URL (xmlUrl) for the key
xmlUrl = outline.attrib['xmlUrl']
# get the name for that feed's site
t = outline.attrib['text']
# get current count for that feed, or a zero if empty
c = int(duplicates[xmlUrl].get('count', 0))
# increment counter for that element
duplicates[xmlUrl].update({'count' : c + 1})
# push name of site onto list within that element
duplicates[xmlUrl].setdefault('text', []).append(t)
for xmlUrl in duplicates.keys():
if duplicates[xmlUrl]['count'] > 1:
print(f"duplicate: {duplicates[xmlUrl]['count']}x {xmlUrl} :",
'"' + '", "'.join(duplicates[xmlUrl]['text']) + '\"')
return(False)
return(True)
# main script
# read ARGV into options variable
parser = ArgumentParser( prog='PROG',
description="This script roughly checks OPML file for correct syntax.",
formatter_class=RawTextHelpFormatter)
parser.add_argument('importfiles', metavar='OPML_file', type=str, nargs='*',
help='OPML files to import', default='')
parser.add_argument("-v", "--verbose", dest="verbosity", action='count',
help="increase verbosity of reporting.", default=0)
parser.epilog='''
The script parses MOPL files
'''
# get run time options
options = parser.parse_args()
importfiles = options.importfiles
verbosity = options.verbosity
try:
main_tree = import_opml_files(importfiles)
if check_opml_for_duplicates(main_tree):
# no duplicates
if verbosity:
print("All OK")
exit(0)
else:
print("Duplicates")
exit(1)
exit(0)
except Exception as e:
if verbosity:
print("Broken")
exit(1)
Links/decruft.sh
# renove cruft and unwanted newlines
sed ~/rss-tools/feedlist2.html -z \
-e 's/?bia_source=rss//g' \
-e 's/?utm_source=h2v&utm_medium=rss_feed&utm_campaign=rss//g' \
-e 's/?utm_source=h2v&utm_medium=rss_feed&utm_campaign=rss//g' \
-e 's/?utm_source=social&utm_medium=feed&utm_campaign=rssfeed//g' \
-e 's/?ref=rss&utm_medium=rss&utm_source=rss_feed//g' \
-e 's/?utm_source=rss&utm_campaign=rss&utm_medium=links//g' \
-e 's/?bia_source=rss//g' \
-e 's/?origin=rss//g' \
-e 's/#ftag=RSSbaffb68//g' \
-e 's/#ref=rss//g' \
-e 's/?cmp=rss//g' \
-e 's/?utm_source=rss&utm_medium=feed&utm_campaign=rss_feed//g' \
-e 's/?maca=en-rss-en-all-1573-xml-atom//g' \
-e 's/?src=rss//g' \
-e 's/?utm_medium=rss&utm_source=site-feed&utm_campaign=rss//g' \
-e 's/?utm_source=feed//g' \
-e 's/?icid=rss//g' \
-e 's/\n<\/blockquote><\/li>/<\/blockquote><\/li>/g' \
-e 's/\n<div><\/div><\/blockquote><\/li>/<\/blockquote><\/li>/g' \
-e 's/\n<\/div><\/blockquote><\/li>/<\/blockquote><\/li>/g' \
-e 's/\n<br \/><br \/><\/blockquote><\/li>/<\/blockquote><\/li>/g' \
-e 's/\n<br \/><\/blockquote><\/li>/<\/blockquote><\/li>/g' \
-e 's/\n<\/p><\/blockquote><\/li>/<\/blockquote><\/li>/g' \
-e 's/\n<p><\/p><\/blockquote><\/li>/<\/blockquote><\/li>/g' \
-e "s/\n<!-- text end --><\/blockquote><\/li>/<\/blockquote><\/li>/g" \
-e "s/Read our blog to see how the day's events unfolded. All times are Paris time (GMT+2)./ /g" \
-e "s/Follow our live blog for all the latest developments on the war in Ukraine. All times are Paris time (GMT+2)./ /g" \
>> ~/rss-tools/RSS.html
./compress-links.sh # next stage appended
Links/tr-supplementary-daily-links.sh
#!/bin/sh
PATH=/home/links/bin:/usr/local/bin:/usr/bin:/bin
# 2023-01-31
# updated : see Git
set -evx
closure() {
test -d ${tmpdir} || exit 1
echo "Erasing temporary directory (${tmpdir}) and its files."
rm -f ${tmpdir}/feed-tmp.*
rmdir ${tmpdir}
}
cancel() {
echo "Cancelled."
closure
exit 2
}
# trap various signals to be able to erase temporary files
trap "cancel" 1 2 15
d=$(date +"%F");
path=$(date -d ${d} +"m%Y-%m")
if tty; then
read -p "Enter a date or press return for $d: " dt;
fi
if [ -n ${dt} ]; then
dt=${dt:-$d};
d=$(date -d ${dt} +"%F") || exit 1;
fi;
sfile="/home/links/Links/tmp/${d}-supplementary.html"
dir="/home/links/Links/${path}/"
if [ -e ${dir}/${d}-supplementary.html ]; then
echo "Links for '${d}' already in place"
exit 1
fi
if ! test -e ${dir}; then
if ! mkdir -p ${dir}; then
echo "problem making or finding'${dir}'"
exit 1
fi
fi
umask 027
start=$(date -d "$d yesterday" +"%F")
feeds=/home/links/Links/daily-supplementary.feeds
tmpdir=$(mktemp -d /tmp/feeds-tmp.XXXXXX)
echo
echo "Loading automated feeds"
while read feed; do
tmpfile=$(mktemp -p ${tmpdir} feed-tmp.XXXXXXX)
tr-rss-since-scraper.pl -d $start -o ${tmpfile} ${feed} &
done <<EOF
$(grep -E -v '^#|^$' ${feeds})
EOF
wait
echo "Done waiting"
# concatenate the results of all the feeds
cat ${tmpdir}/feed-tmp.* > ${sfile}
# clear signal trapping
trap - 1 2 15
# remove temporary files
closure
umask 022
dl=$(date -d "${d} last month" +"m%Y-%m")
dn=$(date -d "${d}" +"m%Y-%m")
p="/home/links/Links"
# check for duplicates, remove those found from the main part of the file
tr-links-de-duplicate.pl -w ${sfile}
# be careful not to run the above script twice since the list of duplicates
# is stored in database and thus *all* the links will be considered duplicate
# the second time around
cp ${sfile} ${dir} && rm ${sfile}
chmod 664 ${dir}/${d}-supplementary.html
# insert citations formatted for social control media
# links-interleave-social-control-media.pl -w ${sfile}
exit 0
Links/list-rss-feed.sh
#!/bin/sh
# print out list of RSS links, based on OPML file
# updated 2022-06-13
# cat roy-feeds.opml | grep -o 'xmlUrl.*\"' | sort | uniq > sorted-rss-feeds.txt
cat roy-feeds.opml \
| xmlstarlet sel -t -v '//outline/@xmlUrl' \
| sort \
| uniq \
> sorted-rss-feeds.txt
Links/tr-links-check-camelcase.pl
#!/usr/bin/perl
# find links and prepend the nodes they are in with
# citations suitable for social control media
# "tag" the comment based on the page's domain
# see Git
use utf8;
use Getopt::Long;
use File::Glob ':bsd_glob';
use HTML::TreeBuilder::XPath;
use URI;
use open qw(:std :utf8);
use Term::ANSIColor qw(:constants);
use lib "$ENV{HOME}/lib/";
use Links::MetaData qw(camelCase);
use English;
use warnings;
use strict;
our %tags;
our %opt = (
'verbose' => 0,
'help' => 0,
);
GetOptions (
"help|h" => \$opt{'help'}, # flag
"verbose|v+" => \$opt{'verbose'}, # flag, multiple settings
);
&usage if ($opt{'help'});
my @filenames;
while (my $file = shift) {
my @files = bsd_glob($file);
foreach my $f (@files) {
push(@filenames, $f);
}
}
&usage if($#filenames < 0);
while (my $infile = shift(@filenames)) {
next if ($infile=~/~$/);
my $result = &interleave($infile);
if(keys %tags) {
print STDERR BRIGHT_RED ON_BLUE "Check these for CamelCase: \n";
# print join("\n ", @tags);
foreach my $site (sort keys %tags) {
print qq( $site\n);
}
print STDERR RESET;
print qq(\n);
# print qq(Run "links-interleave-social-control-media.pl" manually.\n);
# print STDERR qq(Re-run "merge-daily-links.sh" manually.\n);
exit(1);
}
}
exit(0);
sub usage {
print qq(Check URLs and verify that the Links::CamelCase module\n);
print qq(recognizes them and can substitute the right "tag" for them.\n);
$0 =~ s/^.*\///;
print qq($0: file\n);
exit(1);
}
sub interleave {
my ($file)= (@_);
my $xhtml = HTML::TreeBuilder::XPath->new;
$xhtml->implicit_tags(1);
$xhtml->parse_file($file)
or die("Could not parse '$file' : $!\n");
for my $node ($xhtml->findnodes('//li[h5]')) {
for my $anchor ($node->findnodes('./h5/a[@href]')) {
my $href = $anchor->attr('href');
next unless($href);
my $uri = URI->new($href);
if ($opt{'verbose'}) {
print qq(U=$uri\n);
}
my $host = $uri->host;
if ($opt{'verbose'}) {
print qq(H=$host\n);
}
my $sitetag = MetaData::camelCase($host);
if ( ! $sitetag ) {
$tags{$host}++;
}
}
}
$xhtml->delete;
return (1);
}
Links/Techrights-Daily-Links-L.opml
<?xml version="1.0" encoding="UTF-8"?>
<opml version="2.0">
<head>
<title>RRRRRR</title>
<dateModified>Sat Oct 18 08:17:05 AM UTC 2023</dateModified>
</head>
<body>
<outline text="Techrights" type="rss" htmlUrl="https://techrights.org" xmlUrl="https://techrights.org/feed.xml"/>
<outline text="Tux Machines" type="rss" htmlUrl="https://tuxmachines.org/" xmlUrl="https://news.tuxmachines.org/feed.xml"/>
<outline text="Blogs">
<outline text="Defunct Blogs">
<!-- <outline text="GeeksforGeeks" type="rss" htmlUrl="https://www.geeksforgeeks.org" xmlUrl="https://www.geeksforgeeks.org/feed/"/> -->
<outline text="Michael West" type="rss" htmlUrl="https://michaelwest.com.au/" xmlUrl="https://michaelwest.com.au/feed/"/>
<outline text="Sabine Hossenfelder" type="rss" htmlUrl="http://backreaction.blogspot.com/" xmlUrl="http://backreaction.blogspot.com/feeds/posts/default"/>
<outline text="The Lunduke Journal of Technology" type="rss" htmlUrl="https://lunduke.substack.com" xmlUrl="https://lunduke.substack.com/feed"/>
</outline>
<outline text="Covered automatically">
<outline text="Krebs on Security" type="rss" htmlUrl="https://krebsonsecurity.com" xmlUrl="https://krebsonsecurity.com/feed/"/>
<outline text="Craig Murray" type="rss" htmlUrl="https://www.craigmurray.org.uk/" xmlUrl="https://www.craigmurray.org.uk/feed/"/>
</outline>
<outline text="Programming">
<outline text="A Blog from the Erlang/OTP team" type="rss" htmlUrl="https://www.erlang.org/" xmlUrl="https://www.erlang.org/blog.xml"/>
<outline text="News from the Erlang/OTP team" type="rss" htmlUrl="https://www.erlang.org/" xmlUrl="https://www.erlang.org/news.xml"/>
<!-- AdaCore is broken, and they don't respond to e-mails about it
<outline text="AdaCore" type="rss" htmlUrl="https://blog.adacore.com/" xmlUrl="https://blog.adacore.com/feed.rss"/>
-->
<outline text="Alex Edwards" type="rss" htmlUrl="https://www.alexedwards.net/static/" xmlUrl="https://www.alexedwards.net/static/feed.rss"/>
<outline text="Alex Ewerlöf" type="rss" htmlUrl="https://blog.alexewerlof.com" xmlUrl="https://blog.alexewerlof.com/feed"/>
<outline text="Archipylago" type="rss" htmlUrl="https://archipylago.dev/blog/" xmlUrl="https://archipylago.dev/feed/feed.xml"/>
<outline text="Ben Congdon" type="rss" htmlUrl="https://benjamincongdon.me/blog/" xmlUrl="https://benjamincongdon.me/blog/feed.xml"/>
<outline text="Ben Wiener" type="rss" htmlUrl="https://blog.benwiener.com/" xmlUrl="https://blog.benwiener.com/feed.xml"/>
<outline text="Ben Werdmuller" type="rss" htmlUrl="https://werd.io/" xmlUrl="https://werd.io/rss/"/>
<outline text="Benoit Daloze" type="atom" htmlUrl="https://eregon.me/blog/" xmlUrl="https://eregon.me/blog/feed.xml"/>
<outline text="BertHub.eu" type="rss" htmlUrl="https://berthub.eu/articles/" xmlUrl="https://berthub.eu/articles/index.xml"/>
<outline text="Adolfo Ochagavía" type="rss" htmlUrl="https://ochagavia.nl/blog/" xmlUrl="https://ochagavia.nl/blog/index.xml"/>
<outline text="Arduino Blog" type="rss" htmlUrl="https://blog.arduino.cc" xmlUrl="https://blog.arduino.cc/feed/"/>
<outline text="ArduPilot" type="rss" htmlUrl="https://ardupilot.org/" xmlUrl="https://discuss.ardupilot.org/posts.rss"/>
<outline text="Athanasia Mo Mowinckel" type="rss" htmlUrl="https://drmowinckels.io/blog/" xmlUrl="https://drmowinckels.io/blog/index.xml"/>
<outline text="Cliffski's Blog" type="rss" htmlUrl="https://www.positech.co.uk/cliffsblog" xmlUrl="https://www.positech.co.uk/cliffsblog/feed/"/>
<outline text="Computational Complexity" type="rss" htmlUrl="https://blog.computationalcomplexity.org/" xmlUrl="https://blog.computationalcomplexity.org/feeds/posts/default?alt=rss"/>
<outline text="Computing Education Research Blog" type="rss" htmlUrl="https://computinged.wordpress.com" xmlUrl="https://computinged.wordpress.com/feed/"/>
<outline text="Concurrency Freaks" type="atom" htmlUrl="http://concurrencyfreaks.blogspot.com/" xmlUrl="http://concurrencyfreaks.blogspot.com/feeds/posts/default"/>
<outline text="Daniel Beskin" type="rss" htmlUrl="https://blog.daniel-beskin.com/posts" xmlUrl="https://blog.daniel-beskin.com/rss.xml"/>
<outline text="Daniel Holden" type="atom" htmlUrl="https://theorangeduck.com/page/all" xmlUrl="https://theorangeduck.com/feeds/pages"/>
<outline text="Daniel Hooper" type="rss" htmlUrl="https://danielchasehooper.com/" xmlUrl="https://danielchasehooper.com/feed.xml"/>
<outline text="Daniel Janus" type="atom" htmlUrl="http://blog.danieljanus.pl" xmlUrl="https://blog.danieljanus.pl/atom.xml"/>
<outline text="Daniel Jalkut" type="rss" htmlUrl="https://bitsplitting.org/" xmlUrl="https://bitsplitting.org/feed/"/>
<outline text="Daniel Lemire's blog" type="rss" htmlUrl="https://lemire.me/blog" xmlUrl="https://lemire.me/blog/feed/"/>
<outline text="Eli Bendersky" type="atom" htmlUrl="https://eli.thegreenplace.net/archives/all" xmlUrl="https://eli.thegreenplace.net/feeds/all.atom.xml"/>
<outline text="Ergo IRC Chat" type="atom" htmlUrl="https://ergo.chat/" xmlUrl="https://ergo.chat/feed.xml"/>
<outline text="Finnix Blog" type="rss" htmlUrl="https://blog.finnix.org/" xmlUrl="https://blog.finnix.org/feed.xml"/>
<outline text="Fortran High-performance parallel programming language" type="atom" htmlUrl="https://fortran-lang.org/news/" xmlUrl="https://fortran-lang.org/news/atom.xml"/>
<outline text="Francesco Mazzoli" type="rss" htmlUrl="http://mazzo.li" xmlUrl="https://mazzo.li/rss.xml"/>
<outline text="GNU Octave" type="rss" htmlUrl="https://octave.org/" xmlUrl="https://octave.org/feed.xml"/>
<outline text="Haiku Project" type="rss" htmlUrl="https://www.haiku-os.org/" xmlUrl="https://www.haiku-os.org/index.xml"/>
<outline text="Hazel Weakly" type="rss" htmlUrl="https://hazelweakly.me/blog/" xmlUrl="https://hazelweakly.me/rss.xml"/>
<outline text="Henrik Warne" type="rss" htmlUrl="https://henrikwarne.com" xmlUrl="https://henrikwarne.com/feed/"/>
<outline text="Henry Schreiner" type="rss" htmlUrl="https://iscinumpy.dev/" xmlUrl="https://iscinumpy.dev/index.xml"/>
<outline text="Horst Gutmann" type="rss" htmlUrl="https://zerokspot.com/" xmlUrl="https://zerokspot.com/weblog/index.xml"/>
<outline text="Jakub Jarosz" type="rss" htmlUrl="https://jarosz.dev/article/" xmlUrl="https://jarosz.dev/article/index.xml"/>
<outline text="Jakub Nowosad" type="rss" htmlUrl="https://jakubnowosad.com/posts.html" xmlUrl="https://jakubnowosad.com/posts.xml"/>
<outline text="Jamie Montgomerie" type="rss" htmlUrl="https://www.blog.montgomerie.net/posts/" xmlUrl="https://www.blog.montgomerie.net/posts/index.xml"/>
<outline text="Joab Jackson" type="rss" htmlUrl="https://www.joabj.com/Writing/" xmlUrl="https://thenewstack.io/blog/feed/"/>
<outline text="Joe Crawford" type="rss" htmlUrl="https://artlung.com/blog/" xmlUrl="https://artlung.com/feed/"/>
<outline text="Julia Bloggers" type="atom" htmlUrl="https://www.juliabloggers.com/" xmlUrl="https://www.juliabloggers.com/feed/"/>
<outline text="The Julia Language Blog" type="atom" htmlUrl="https://julialang.org/" xmlUrl="https://julialang.org/feed.xml"/>
<outline text="Karl Seguin" type="atom" htmlUrl="https://www.openmymind.net/" xmlUrl="https://www.openmymind.net/atom.xml"/>
<outline text="Lars Lofgren" type="rss" htmlUrl="https://larslofgren.com/blog/" xmlUrl="http://feeds.feedburner.com/LarsLofgren"/>
<outline text="Lars Wikman" type="rss" htmlUrl="https://underjord.io/blog.html" xmlUrl="https://underjord.io/feed.xml"/>
<outline text="LinuxPhoneApps - Blog" type="rss" htmlUrl="https://linuxphoneapps.org/blog/please-help-adding-appstream-metadata/" xmlUrl="https://linuxphoneapps.org/blog/atom.xml"/>
<outline text="Lua" type="rss" htmlUrl="https://www.lua.org/" xmlUrl="https://www.lua.org/news.rss"/>
<outline text="Luca Lombardo" type="rss" htmlUrl="https://lukefleed.xyz/posts/" xmlUrl="https://lukefleed.xyz/rss.xml"/>
<outline text="Lucy D'Agostino McGowan & Nick Strayer" type="rss" htmlUrl="https://livefreeordichotomize.com/" xmlUrl="https://livefreeordichotomize.com/index.xml"/>
<outline text="Mahesh Balakrishnan" type="rss" htmlUrl="https://maheshba.bitbucket.io/blog/" xmlUrl="https://maheshba.bitbucket.io/blog/feed.xml"/>
<outline text="Marcin Juszkiewicz" type="rss" htmlUrl="https://marcin.juszkiewicz.com.pl/" xmlUrl="https://marcin.juszkiewicz.com.pl/feed/"/>
<outline text="Marcin Szewczyk-Wilgan" type="rss" htmlUrl="https://m4c.pl/blog/" xmlUrl="https://m4c.pl/blog/feed/"/>
<outline text="MaskRay" type="atom" htmlUrl="https://maskray.me/blog/" xmlUrl="https://maskray.me/blog/atom.xml"/>
<outline text="Matan Abudy" type="rss" htmlUrl="https://matanabudy.com/" xmlUrl="https://matanabudy.com/feed/"/>
<outline text="Maury" type="rss" htmlUrl="https://maurycyz.com/" xmlUrl="https://maurycyz.com/index.xml"/>
<outline text="Michał Sapka" type="rss" htmlUrl="https://michal.sapka.pl/" xmlUrl="https://michal.sapka.pl/rss.xml"/>
<outline text="Michael and Christian's Blog" type="rss" htmlUrl="https://lorentzen.ch/" xmlUrl="https://lorentzen.ch/index.php/feed/"/>
<outline text="Michael Bang" type="rss" htmlUrl="https://blog.vbang.dk/" xmlUrl="https://blog.vbang.dk/feed.xml"/>
<outline text="Misty De Méo" type="atom" htmlUrl="https://www.mistys-internet.website/blog/" xmlUrl="https://www.mistys-internet.website/blog/atom.xml"/>
<outline text="Muxup" type="atom" htmlUrl="https://muxup.com/" xmlUrl="https://muxup.com/feed.xml"/>
<outline text="Olimex Ltd" type="rss" htmlUrl="https://olimex.wordpress.com/" xmlUrl="https://olimex.wordpress.com/feed/"/>
<outline text="Opus Interactive Audio Codec" type="rss" htmlUrl="https://opus-codec.org/" xmlUrl="https://opus-codec.org/feed.xml"/>
<outline text="Perl.com" type="rss" htmlUrl="https://www.perl.com/article/" xmlUrl="https://www.perl.com/article/index.xml"/>
<outline text="Perl.org" type="atom" htmlUrl="https://blogs.perl.org/" xmlUrl="https://blogs.perl.org/atom.xml"/>
<outline text="The Perl Foundation" type="rss" htmlUrl="https://news.perlfoundation.org/" xmlUrl="https://news.perlfoundation.org/rss.xml"/>
<outline text="Phoboslab" type="rss" htmlUrl="https://phoboslab.org/log" xmlUrl="https://phoboslab.org/log/feed"/>
<outline text="Pimoroni" type="rss" htmlUrl="https://blog.pimoroni.com/" xmlUrl="https://blog.pimoroni.com/rss/"/>
<outline text="Pivot to AI" type="rss" htmlUrl="https://pivot-to-ai.com/" xmlUrl="https://pivot-to-ai.com/feed/"/>
<outline text="PowerDNS Blog" type="rss" htmlUrl="https://blog.powerdns.com/" xmlUrl="https://blog.powerdns.com/rss.xml"/>
<outline text="Mostly Python" type="rss" htmlUrl="https://www.mostlypython.com/" xmlUrl="https://www.mostlypython.com/rss/"/>
<outline text="Python⇒Speed" type="rss" htmlUrl="https://pythonspeed.com/" xmlUrl="https://pythonspeed.com/atom.xml"/>
<outline text="Scientific Python Blog" type="atom" htmlUrl="https://blog.scientific-python.org/" xmlUrl="https://blog.scientific-python.org/atom.xml"/>
<outline text="R-bloggers" type="rss" htmlUrl="https://www.r-bloggers.com" xmlUrl="https://feeds.feedburner.com/RBloggers"/>
<outline text="Raku Musings (Arne Sommer)" type="rss" htmlUrl="raku-musings.com/" xmlUrl="https://raku-musings.com/rss.xml"/>
<outline text="Weekly Rakudo News" type="rss" htmlUrl="https://rakudoweekly.blog" xmlUrl="https://rakudoweekly.blog/feed/"/>
<outline text="RelyAbility Blog" type="rss" htmlUrl="https://blog.relyabilit.ie/" xmlUrl="https://blog.relyabilit.ie/rss/"/>
<outline text="research!rsc" type="atom" htmlUrl="http://research.swtch.com/govcs" xmlUrl="https://research.swtch.com/feed.atom"/>
<outline text="ROS-Industrial" type="rss" htmlUrl="https://rosindustrial.org/news/" xmlUrl="https://rosindustrial.org/news?format=rss"/>
<outline text="Ruud van Asseldonk" type="rss" htmlUrl="https://ruudvanasseldonk.com/writing" xmlUrl="https://ruudvanasseldonk.com/feed.xml"/>
<outline text="Sequoia-PGP" type="rss" htmlUrl="https://sequoia-pgp.org/" xmlUrl="https://sequoia-pgp.org/blog/index.xml"/>
<outline text="SparkFun: Commerce Blog" type="rss" htmlUrl="https://www.sparkfun.com/news" xmlUrl="https://www.sparkfun.com/feeds"/>
<outline text="Stéphane Huc" type="atom" htmlUrl="http://doc.huc.fr.eu.org/en/" xmlUrl="http://doc.huc.fr.eu.org/en/atom.xml"/>
<outline text="Structure and Interpretation of Computer Programmers" type="rss" htmlUrl="https://www.sicpers.info" xmlUrl="https://www.sicpers.info/feed/"/>
<outline text="Subnetspider" type="atom" htmlUrl="https://www.subnetspider.com/" xmlUrl="https://www.subnetspider.com/feed.xml"/>
<outline text="Susam's Blog" type="rss" htmlUrl="https://susam.net/blog/" xmlUrl="https://susam.net/feed.xml"/>
<outline text="Thea Flowers" type="rss" htmlUrl="https://blog.thea.codes" xmlUrl="https://blog.thea.codes/feed.xml"/>
<outline text="Dirk Eddelbuettel" type="rss" htmlUrl="http://dirk.eddelbuettel.com/blog" xmlUrl="http://dirk.eddelbuettel.com/blog/index.rss"/>
<outline text="Tim Bradshaw" type="rss" htmlUrl="https://www.tfeb.org/fragments/2023/01/11/a-case-like-macro-for-regular-expressions/?utm_source=all&utm_medium=Atom" xmlUrl="https://www.tfeb.org/fragments/feeds/all.atom.xml"/>
<outline text="Tim Kellogg" type="rss" htmlUrl="http://timkellogg.me/" xmlUrl="https://timkellogg.me/blog/atom.xml"/>
<outline text="Timur Kristóf" type="atom" htmlUrl="https://timur.hu/" xmlUrl="https://timur.hu/feed.xml"/>
<outline text="Trickster Dev" type="rss" htmlUrl="https://www.trickster.dev/post/" xmlUrl="https://www.trickster.dev/post/index.xml"/>
<outline text="William Lachance" type="atom" htmlUrl="https://wrla.ch/blog/2022/11/working-with-depression/" xmlUrl="https://wrla.ch/feeds/all.atom.xml"/>
<outline text="Zig" type="rss" htmlUrl="https://ziglang.org/devlog/" xmlUrl="https://ziglang.org/devlog/index.xml"/>
<outline text="Adafruit Industries" type="rss" htmlUrl="https://blog.adafruit.com" xmlUrl="https://blog.adafruit.com/feed/"/>
</outline>
<outline text="General blogs">
<outline text="Defunct blogs">
<outline text="Martin Tournoij" type="rss" htmlUrl="https://www.arp242.net/" xmlUrl="https://www.arp242.net/feed.xml"/>
<outline text="Michael Warren Lucas" type="rss" htmlUrl="https://mwl.io" xmlUrl="https://mwl.io/feed"/>
</outline>
<outline text="8bit" type="rss" htmlUrl="https://blog.8bit.lol/" xmlUrl="https://blog.8bit.lol/rss.xml"/>
<outline text="Aaron Aiken" type="atom" htmlUrl="https://cwa.omg.lol/" xmlUrl="https://cwa.omg.lol/feed.atom"/>
<outline text="Aaron Brethorst" type="atom" htmlUrl="https://www.brethorsting.com/" xmlUrl="https://www.brethorsting.com/feed.xml"/>
<outline text="Abe Fehr" type="atom" htmlUrl="https://www.abefehr.com/" xmlUrl="https://www.abefehr.com/feed"/>
<outline text="Abhinav" type="rss" htmlUrl="https://arkoinad.com/posts/" xmlUrl="https://arkoinad.com/rss.xml"/>
<outline text="Abin Simon" type="rss" htmlUrl="https://blog.meain.io/" xmlUrl="https://blog.meain.io/feed.xml"/>
<outline text="Abhinav Sarkar" type="atom" htmlUrl="https://abhinavsarkar.net/" xmlUrl="https://abhinavsarkar.net/feed.atom"/>
<outline text="Abishek Muthian" type="rss" htmlUrl="https://abishekmuthian.com/" xmlUrl="https://abishekmuthian.com/index.xml"/>
<outline text="Adam Fortuna" type="rss" htmlUrl="https://adamfortuna.com/" xmlUrl="https://feeds.feedburner.com/adamfortuna"/>
<outline text="Adam Johnson" type="atom" htmlUrl="https://adamj.eu/tech/" xmlUrl="https://adamj.eu/tech/atom.xml"/>
<outline text="Adam Newbold" type="atom" htmlUrl="https://www.neatnik.net/writing/" xmlUrl="https://www.neatnik.net/feed.xml"/>
<outline text="Adam Nowak" type="rss" htmlUrl="https://lubieniebieski.pl/" xmlUrl="https://lubieniebieski.pl/feed.xml"/>
<outline text="Adam Silver" type="atom" htmlUrl="https://adamsilver.io/" xmlUrl="https://adamsilver.io/atom.xml"/>
<outline text="adam.yml" type="rss" htmlUrl="https://maxamillion.sh/" xmlUrl="https://maxamillion.sh/rss.xml"/>
<outline text="Adnan Siddiqi" type="rss" htmlUrl="https://blog.adnansiddiqi.me/" xmlUrl="https://blog.adnansiddiqi.me/feed/"/>
<outline text="Adrian Izquieta" type="rss" htmlUrl="https://www.izq.fm/" xmlUrl="https://www.izq.fm/feed.xml"/>
<outline text="Adrián Perales" type="rss" htmlUrl="https://adrianperales.com/2023/12/aplicaciones-por-defecto-en-2023/" xmlUrl="https://adrianperales.com/feed/"/>
<outline text="Adrian Roselli" type="rss" htmlUrl="https://adrianroselli.com/" xmlUrl="https://adrianroselli.com/feed"/>
<outline text="Aerthrvmn" type="rss" htmlUrl="https://aethrvmn.gr/blog/" xmlUrl="https://aethrvmn.gr/index.xml"/>
<outline text="A Few Thoughts on Cryptographic Engineering" type="rss" htmlUrl="https://blog.cryptographyengineering.com" xmlUrl="https://blog.cryptographyengineering.com/feed/"/>
<outline text="Ahmad Alfy" type="atom" htmlUrl="https://alfy.blog/" xmlUrl="https://alfy.blog/feed.xml"/>
<outline text="Aigars Mahinovs" type="rss" htmlUrl="http://aigarius.com/" xmlUrl="https://aigarius.com/feeds/rss/rss.xml"/>
<outline text="AJ Bourg" type="rss" htmlUrl="https://aj.bourg.family/" xmlUrl="https://aj.bourg.family/rss.xml"/>
<outline text="Akseli Lahtinen" type="rss" htmlUrl="https://akselmo.dev/" xmlUrl="https://akselmo.dev/feed.xml"/>
<outline text="Akshay" type="rss" htmlUrl="https://oppi.li/" xmlUrl="https://oppi.li/index.xml"/>
<outline text="Alan Byrne" type="rss" htmlUrl="https://www.homeautomationguy.io/blog" xmlUrl="https://www.homeautomationguy.io/blog?format=rss"/>
<outline text="Alastair Roberts" type="atom" htmlUrl="https://bitsnpieces.dev/" xmlUrl="https://bitsnpieces.dev/feed.xml"/>
<outline text="Alberto Marinucci" type="rss" htmlUrl="https://alby.xyz/" xmlUrl="https://alby.xyz/feed/"/>
<outline text="Alcides Fonseca" type="rss" htmlUrl="Alcides Fonsecalcidesfonseca.com/" xmlUrl="https://wiki.alcidesfonseca.com/feeds/en/"/>
<outline text="Adriano" type="atom" htmlUrl="https://aldur.blog/" xmlUrl="https://aldur.blog/feed.xml"/>
<outline text="Aleksandar Vacić" type="rss" htmlUrl="https://aplus.rs/" xmlUrl="https://aplus.rs/index.xml"/>
<outline text="Alex Russell" type="atom" htmlUrl="https://infrequently.org/" xmlUrl="https://infrequently.org/feed/"/>
<outline text="Alexandra Wolfe" type="rss" htmlUrl="https://alexwolfe.ca/posts/" xmlUrl="https://alexwolfe.ca/feed/"/>
<outline text="Alexandru Nedelcu" type="rss" htmlUrl="https://alexn.org/" xmlUrl="https://alexn.org/feeds/blog.xml"/>
<outline text="Alexandru Scvorțov" type="atom" htmlUrl="https://scvalex.net/" xmlUrl="https://scvalex.net/atom.xml"/>
<outline text="Alex & Manu" type="rss" htmlUrl="https://alexandmanu.com/" xmlUrl="https://alexandmanu.com/index.xml"/>
<outline text="Alex Alejandre" type="rss" htmlUrl="https://alexalejandre.com/" xmlUrl="https://alexalejandre.com/index.xml"/>
<outline text="Alex Ellis" type="rss" htmlUrl="https://blog.alexellis.io/" xmlUrl="https://blog.alexellis.io/rss/"/>
<outline text="Alex Gaynor" type="rss" htmlUrl="https://alexgaynor.net/" xmlUrl="https://alexgaynor.net/feed.xml"/>
<outline text="Alex Haydock" type="rss" htmlUrl="https://blog.infected.systems/posts/" xmlUrl="https://blog.infected.systems/posts/index.xml"/>
<outline text="Alex Sirac" type="rss" htmlUrl="https://alexsirac.com/" xmlUrl="https://alexsirac.com/tag/en/feed/"/>
<outline text="Alex Ward" type="rss" htmlUrl=" https://alextheward.com/" xmlUrl="https://alextheward.com/feed.xml"/>
<outline text="alienlebarge" type="rss" htmlUrl="https://alienlebarge.ch/articles/" xmlUrl="https://alienlebarge.ch/articles.rss"/>
<outline text="Alin Panaitiu" type="rss" htmlUrl="https://alinpanaitiu.com/blog/" xmlUrl="https://alinpanaitiu.com/index.xml"/>
<outline text="Alisa Sireneva" type="rss" htmlUrl="https://purplesyringa.moe/blog/" xmlUrl="https://purplesyringa.moe/blog/feed.rss"/>
<outline text="Allen Downey" type="rss" htmlUrl="https://www.allendowney.com/blog/" xmlUrl="https://www.allendowney.com/blog/feed/"/>
<outline text="Allen Pike" type="atom" htmlUrl="https://allenpike.com/archive/" xmlUrl="https://feeds.allenpike.com/feed/"/>
<outline text="Alperen Keles" type="rss" htmlUrl="https://alperenkeles.com/posts/" xmlUrl="https://alperenkeles.com/atom.xml"/>
<outline text="Alvaro Montoro" type="rss" htmlUrl="https://alvaromontoro.com/" xmlUrl="https://alvaromontoro.com/feed.rss"/>
<outline text="Aman Mittal" type="rss" htmlUrl="https://amanhimself.dev/blog/" xmlUrl="https://amanhimself.dev/rss.xml"/>
<outline text="Amber Settle" type="rss" htmlUrl="https://ambersettle.wordpress.com/" xmlUrl="https://ambersettle.wordpress.com/feed/"/>
<outline text="Amit Gawande" type="rss" htmlUrl="https://www.amitgawande.com/" xmlUrl="https://www.amitgawande.com/rss/"/>
<outline text="Amit Patel" type="rss" htmlUrl="https://simblob.blogspot.com/" xmlUrl="https://www.redblobgames.com/blog/posts.xml"/>
<outline text="Ana Rodrigues" type="atom" htmlUrl="https://ohhelloana.blog/" xmlUrl="https://ohhelloana.blog/feed.xml"/>
<outline text="Anantha Kumaran" type="atom" htmlUrl="https://ananthakumaran.in/" xmlUrl="https://ananthakumaran.in/"/>
<outline text="αναγωγιστής" type="rss" htmlUrl="https://anagogistis.com/posts/" xmlUrl="https://anagogistis.com/index.xml"/>
<outline text="Anna Havron" type="rss" htmlUrl="https://analogoffice.net/" xmlUrl="https://analogoffice.net/feed.xml"/>
<outline text="Annie Mueller" type="rss" htmlUrl="https://anniemueller.com/" xmlUrl="https://anniemueller.com/posts_feed"/>
<outline text="Andrea Contino" type="rss" htmlUrl="https://gwtf.it/blog/" xmlUrl="https://contino.com/feed"/>
<outline text="André Machado" type="atom" htmlUrl="https://machaddr.com/blog/" xmlUrl="https://machaddr.com/blog/feed.xml"/>
<outline text="André Almeida" type="rss" htmlUrl="https://andrealmeid.com/post/" xmlUrl="https://andrealmeid.com/post/index.xml"/>
<outline text="Andrei Ciobanu" type="atom" htmlUrl="https://www.andreinc.net/" xmlUrl="https://www.andreinc.net/feed.xml"/>
<outline text="Andreas" type="rss" htmlUrl="https://andreas-spiegler.de/" xmlUrl="https://andreas-spiegler.de/feed/"/>
<outline text="Andreas Farre" type="atom" htmlUrl="https://blog.farre.se/archive/" xmlUrl="https://blog.farre.se/feed.xml"/>
<outline text="Andre Franca" type="rss" htmlUrl="https://afranca.com.br/" xmlUrl="https://afranca.com.br/feed.xml"/>
<outline text="Andre Garzia" type="rss" htmlUrl="https://andregarzia.com/" xmlUrl="https://andregarzia.com/feeds/all.atom.xml"/>
<outline text="Andrei Nicolin Ciobanu" type="rss" htmlUrl="https://andreinc.net/" xmlUrl="https://andreinc.net/feed.xml"/>
<outline text="Andrew Ayer" type="rss" htmlUrl="https://www.agwa.name/blog" xmlUrl="https://www.agwa.name/blog/feed"/>
<outline text="Andrew Canion" type="rss" htmlUrl="https://canion.blog/" xmlUrl="https://canion.blog/feed.xml"/>
<outline text="Andrew Domain" type="rss" htmlUrl="https://andrewdomain.com/" xmlUrl="https://andrewdomain.com/index.xml"/>
<outline text="Andrew Eikum" type="rss" htmlUrl="https://www.smokingonabike.com/" xmlUrl="https://www.smokingonabike.com/feed/"/>
<outline text="Andrew Healey" type="rss" htmlUrl="https://healeycodes.com" xmlUrl="https://healeycodes.com/feed.xml"/>
<outline text="Andrew Helwer" type="rss" htmlUrl="https://ahelwer.ca/" xmlUrl="https://ahelwer.ca/index.xml"/>
<outline text="Andrew Kelley" type="rss" htmlUrl="https://andrewkelley.me/" xmlUrl="https://andrewkelley.me/rss.xml"/>
<outline text="Andrew Moore" type="atom" htmlUrl="https://andrewmoore.ca/blog/" xmlUrl="https://andrewmoore.ca/blog/feed.atom"/>
<outline text="Andrew Murphy" type="atom" htmlUrl="https://andrewmurphy.io/blog/" xmlUrl="https://debuggingleadership.com/atom.xml"/>
<outline text="Andrew Nesbitt" type="atom" htmlUrl="https://nesbitt.io/" xmlUrl="https://nesbitt.io/feed.xml"/>
<outline text="Andrew Rowson" type="atom" htmlUrl="https://www.growse.com/" xmlUrl="https://www.growse.com/feed.xml"/>
<outline text="Andrew Shell" type="rss" htmlUrl="https://andrewshell.org/essays/" xmlUrl="https://andrewshell.org/feed/"/>
<outline text="Andrew Stiefel" type="rss" htmlUrl="https://andrewstiefel.com/" xmlUrl="https://andrewstiefel.com/feed.xml"/>
<outline text="Andy Bell" type="rss" htmlUrl="https://piccalil.li/" xmlUrl="https://piccalil.li/feed.xml"/>
<outline text="Andy Dote" type="rss" htmlUrl="https://andydote.co.uk/" xmlUrl="https://andydote.co.uk/rss.xml"/>
<outline text="Andy Wingo" type="atom" htmlUrl="https://wingolog.org/" xmlUrl="https://wingolog.org/feed/atom"/>
<outline text="Ange Chierchia" type="atom" htmlUrl="https://chierchia.fr/blog/" xmlUrl="https://chierchia.fr/feed/atom/"/>
<outline text="Angelino Desmet" type="rss" htmlUrl="https://www.arscyni.cc/" xmlUrl="https://www.arscyni.cc/feed.rss"/>
<outline text="Anil Dash" type="atom" htmlUrl="https://www.anildash.com/" xmlUrl="https://www.anildash.com/feed.xml"/>
<outline text="Anirudh Oppiliappan" type="atom" htmlUrl="https://anirudh.fi/blog/" xmlUrl="https://anirudh.fi/blog/feed.xml"/>
<outline text="Ankaph" type="rss" htmlUrl="https://ankaph.xyz/posts/" xmlUrl="https://ankaph.xyz/index.xml"/>
<outline text="Ankur Sethi" type="rss" htmlUrl="https://ankursethi.com/" xmlUrl="https://ankursethi.com/feeds/index.xml"/>
<outline text="Another Dayu" type="rss" htmlUrl="https://anotherdayu.com/" xmlUrl="https://anotherdayu.com/feed/"/>
<outline text="Anthony Dumas" type="rss" htmlUrl="https://adamas.dev/" xmlUrl="https://adamas.dev/rss.xml"/>
<outline text="Anton Zhiyanov" type="rss" htmlUrl="https://antonz.org/" xmlUrl="https://antonz.org/index.xml"/>
<outline text="Antonio Rodrigues" type="rss" htmlUrl="https://antonio.is/" xmlUrl="https://antonio.is/index.xml"/>
<outline text="Anže Pečar" type="rss" htmlUrl="https://blog.pecar.me/" xmlUrl="https://blog.pecar.me/feed.xml"/>
<outline text="Aral Balkan" type="rss" htmlUrl="https://ar.al/" xmlUrl="https://ar.al/index.xml"/>
<outline text="The Arcade Blogger" type="rss" htmlUrl="https://arcadeblogger.com/" xmlUrl="https://arcadeblogger.com/feed/"/>
<outline text="Arcan" type="rss" htmlUrl="https://arcan-fe.com" xmlUrl="https://arcan-fe.com/feed/"/>
<outline text="Argemma" type="rss" htmlUrl="https://argemma.com/blog/" xmlUrl="https://argemma.com/blog/index.xml"/>
<outline text="Arjen Wiersma" type="rss" htmlUrl="http://www.arjenwiersma.nl/" xmlUrl="https://www.arjenwiersma.nl/feed/"/>
<outline text="Armanc Keser" type="rss" htmlUrl="https://armanckeser.com/" xmlUrl="https://armanckeser.com/rss.xml"/>
<outline text="Armin Ronacher" type="rss" htmlUrl="http://lucumr.pocoo.org/" xmlUrl="https://lucumr.pocoo.org/feed.atom"/>
<outline text="Arne" type="rss" htmlUrl="https://arne.me/articles/" xmlUrl="https://arne.me/blog/feed.xml"/>
<outline text="Arne Kamola" type="rss" htmlUrl="https://arne.xyz/archive/" xmlUrl="https://arne.xyz/feed/"/>
<outline text="Artyom Bologov" type="rss" htmlUrl="https://aartaka.me/" xmlUrl="https://aartaka.me/rss.xml"/>
<outline text="Arun Raghavan" type="rss" htmlUrl="https://arunraghavan.net/" xmlUrl="https://arunraghavan.net/feed/"/>
<outline text="Assaf" type="rss" htmlUrl="https://labnotes.org/" xmlUrl="https://labnotes.org/rss/"/>
<outline text="Astrid Yu" type="rss" htmlUrl="https://astrid.tech/blog/" xmlUrl="https://astrid.tech/feed.xml"/>
<outline text="Atharva Raykar" type="rss" htmlUrl="https://atharvaraykar.com/posts/" xmlUrl="https://atharvaraykar.com/rss/"/>
<outline text="Aurélien Gâteau" type="rss" htmlUrl="https://agateau.com/" xmlUrl="https://agateau.com/feed"/>
<outline text="Austin Gil" type="rss" htmlUrl="https://austingil.com" xmlUrl="https://austingil.com/feed/"/>
<outline text="Austin Kleon" type="rss" htmlUrl="https://austinkleon.com/" xmlUrl="https://feeds2.feedburner.com/AustinKleon"/>
<outline text="Austin Pivarnik" type="rss" htmlUrl="https://austinsnerdythings.com/" xmlUrl="https://austinsnerdythings.com/feed/"/>
<outline text="Austin White" type="rss" htmlUrl="https://austinwhite.org/" xmlUrl="https://austinwhite.org/posts_feed"/>
<outline text="Ava" type="rss" htmlUrl="https://blog.avas.space/" xmlUrl="https://blog.avas.space/feed/"/>
<outline text="Avi Loeb" type="rss" htmlUrl="https://avi-loeb.medium.com/" XMlUrl="https://medium.com/feed/@avi-loeb"/>
<outline text="Avinash Sajjanshetty" type="rss" htmlUrl="https://avi.im/blag/" xmlUrl="https://avi.im/blag/index.xml"/>
<outline text="Axel Rietschin" type="rss" htmlUrl="https://isolveproblems.substack.com/" xmlUrl="https://isolveproblems.substack.com/feed"/>
<outline text="Baldur Bjarnason" type="rss" htmlUrl="https://www.baldurbjarnason.com/" xmlUrl="https://feedpress.me/baldurbjarnason"/>
<outline text="Balthazar" type="rss" htmlUrl="https://blog.balthazar-rouberol.com/" xmlUrl="https://blog.balthazar-rouberol.com/feeds/all.atom.xml"/>
<outline text="Barry Frost" type="rss" htmlUrl="https://barryfrost.com/" xmlUrl="https://barryfrost.com/rss?post-type=article"/>
<outline text="Barry Hess" type="rss" htmlUrl=">https://bjhess.com/" xmlUrl="https://bjhess.com/posts_feed"/>
<outline text="Bartosz Milewski" type="rss" htmlUrl="https://bartoszmilewski.com" xmlUrl="https://bartoszmilewski.com/feed/"/>
<outline text="Becky Spratford" type="atom" htmlUrl="https://raforall.blogspot.com/" xmlUrl="https://raforall.blogspot.com/feeds/posts/default"/>
<outline text="Beej" type="rss" htmlUrl="https://beej.us/blog/" xmlUrl="https://beej.us/blog/rss.xml"/>
<outline text="Ben Frain" type="rss" htmlUrl="https://benfrain.com/blog/" xmlUrl="https://benfrain.com/feed/"/>
<outline text="Ben Hoyt" type="rss" htmlUrl="https://benhoyt.com/writings/" xmlUrl="https://benhoyt.com/writings/rss.xml"/>
<outline text="Ben Joffe" type="rss" htmlUrl="https://www.benjoffe.com/" xmlUrl="https://www.benjoffe.com/rss.xml"/>
<outline text="Ben Kuhn" type="atom" htmlUrl="https://www.benkuhn.net/" xmlUrl="https://www.benkuhn.net/index.xml"/>
<outline text="Benedict Evans" type="rss" htmlUrl="https://www.ben-evans.com/" xmlUrl="https://www.ben-evans.com/benedictevans?format=RSS"/>
<outline text="Benjamin Esham" type="atom" htmlUrl="https://esham.io/" xmlUrl="https://esham.io/atom.xml"/>
<outline text="Benji Encalada Mora" type="rss" htmlUrl="https://benji.dog/articles/" xmlUrl="https://www.benji.dog/feed.xml"/>
<outline text="benjojo blog" type="rss" htmlUrl="https://blog.benjojo.co.uk" xmlUrl="https://blog.benjojo.co.uk/rss.xml"/>
<outline text="Benjamin Hollon" type="rss" htmlUrl="https://benjaminhollon.com/" xmlUrl="https://benjaminhollon.com/feed/"/>
<outline text="Bernát Gábor" type="rss" htmlUrl="https://bernat.tech/posts/" xmlUrl="https://bernat.tech/posts/index.xml"/>
<outline text="Bernd “beko” Kosmahl" type="rss" htmlUrl="https://beko.famkos.net/kind/article/" xmlUrl="https://beko.famkos.net/kind/note/feed/"/>
<outline text="Ben Tsai" type="atom" htmlUrl="https://bentsai.org/" xmlUrl="https://bentsai.org/posts_feed"/>
<outline text="benzblog" type="rss" htmlUrl="https://bentsukun.ch/" xmlUrl="https://bentsukun.ch/index.xml"/>
<outline text="Bèr ‘berkes’ Kessels" type="rss" htmlUrl="http://berk.es" xmlUrl="http://feeds.feedburner.com/berkes"/>
<outline text="Bert Peters" type="atom" htmlUrl="https://bertptrs.nl/posts/" xmlUrl="https://bertptrs.nl/feed.xml"/>
<outline text="Bertrand Meyer" type="rss" htmlUrl="https://bertrandmeyer.com" xmlUrl="http://feeds.feedburner.com/BertrandMeyer"/>
<outline text="Bill Glover" type="rss" htmlUrl="https://billglover.me/blog/" xmlUrl="https://billglover.me/index.xml"/>
<outline text="BinaryDigit" type="atom" htmlUrl="https://binarydigit.net/posts/" xmlUrl="https://binarydigit.net/feed/"/>
<outline text="Bjoern Brembs" type="rss" htmlUrl="http://bjoern.brembs.net" xmlUrl="https://bjoern.brembs.net/feed/"/>
<outline text="Björn Wärmedal" type="rss" htmlUrl="https://warmedal.se/~bjorn/" xmlUrl="https://warmedal.se/~bjorn/atom.xml"/>
<outline text="Blain Smith" type="atom" htmlUrl="https://blainsmith.com/" xmlUrl="https://blainsmith.com/atom.xml"/>
<outline text="Blake Rain" type="rss" htmlUrl="https://blakerain.com/blog/" xmlUrl="https://blakerain.com/blog/index.xml"/>
<outline text="Blake Watson" type="rss" htmlUrl="https://blakewatson.com/journal/" xmlUrl="https://blakewatson.com/feed.xml"/>
<outline text="Blinry" type="atom" htmlUrl="https://blinry.org/" xmlUrl="https://blinry.org/feed/"/>
<outline text="Blog on madboa.com" type="rss" htmlUrl="https://www.madboa.com/blog/" xmlUrl="https://www.madboa.com/blog/index.xml"/>
<outline text="Bob Monsour" type="atom" htmlUrl="https://www.bobmonsour.com/posts/" xmlUrl="https://bobmonsour.com/feed.xml"/>
<outline text="Bobby Hiltz" type="atom" htmlUrl="https://bobbyhiltz.com/archive.html" xmlUrl="https://bobbyhiltz.com/atom.xml"/>
<outline text="Bodo Tasche" type="rss" htmlUrl="https://bitboxer.de/" xmlUrl="https://bitboxer.de/atom.xml"/>
<outline text="Bogdan Chadkin" type="rss" htmlUrl="https://trysound.io/" xmlUrl="https://trysound.io/rss.xml"/>
<outline text="Boiling Steam" type="rss" htmlUrl="https://boilingsteam.com" xmlUrl="https://boilingsteam.com/feed/rss-feed.xml"/>
<outline text="Brad Frost" type="rss" htmlUrl="https://bradfrost.com/blog/" xmlUrl="https://bradfrost.com/blog/category/post/feed/"/>
<outline text="Bradley Taunt" type="atom" htmlUrl="https://btxx.org/posts/" xmlUrl="https://btxx.org/index.rss"/>
<outline text="Brandon Pugh" type="rss" htmlUrl="https://www.brandonpugh.com/blog/my-default-apps-of-2023/" xmlUrl="https://www.brandonpugh.com/index.xml"/>
<outline text="Brandon Rozek" type="rss" htmlUrl="https://brandonrozek.com/blog/" xmlUrl="https://brandonrozek.com/blog/index.xml"/>
<outline text="Brandon Simmons" type="rss" htmlUrl="https://brandon.si/code/" xmlUrl="https://brandon.si/index.xml"/>
<outline text="Brandur Leach" type="rss" htmlUrl="https://brandur.org" xmlUrl="https://brandur.org/articles.atom"/>
<outline text="Dr. Brian Robert Callahan" type="rss" htmlUrl="https://briancallahan.net/blog" xmlUrl="https://briancallahan.net/blog/feed.xml"/>
<outline text="Brian Sholis" type="rss" htmlUrl="https://www.sholis.com/blog/" xmlUrl="https://www.sholis.com/blog/feed.xml"/>
<outline text="Bruce Lawson" type="rss" htmlUrl="https://brucelawson.co.uk/" xmlUrl="https://brucelawson.co.uk/feed/"/>
<!-- defunct ... for now
<outline text="Bruce Perens" type="rss" htmlUrl="https://perens.com" xmlUrl="https://perens.com/feed/"/>
-->
<outline text="Bruno Rodrigues" type="rss" htmlUrl="https://www.brodrigues.co/" xmlUrl="https://brodrigues.co/index.xml"/>
<outline text="Bryan Cantrill" type="rss" htmlUrl="http://dtrace.org/blogs/bmc" xmlUrl="https://bcantrill.dtrace.org/index.xml"/>
<outline text="Bryce Kerley" type="atom" htmlUrl="https://blog.brycekerley.net/" xmlUrl="https://blog.brycekerley.net/feed.xml"/>
<outline text="Bryce Wray" type="rss" htmlUrl="https://www.brycewray.com/posts/" xmlUrl="https://www.brycewray.com/index.xml"/>
<outline text="Bunnie's Blog" type="rss" htmlUrl="https://www.bunniestudios.com/blog" xmlUrl="https://www.bunniestudios.com/blog/feed/"/>
<outline text="Burkhard Stubert" type="rss" htmlUrl="https://embeddeduse.com" xmlUrl="https://embeddeduse.com/feed/"/>
<outline text="Busybee" type="atom" htmlUrl="https://beesbuzz.biz/code/" xmlUrl="https://beesbuzz.biz/code/feed-summary"/>
<outline text="But she's a girl..." type="rss" htmlUrl="https://www.rousette.org.uk/" xmlUrl="https://www.rousette.org.uk/index.xml"/>
<outline text="Cal Paterson" type="rss" htmlUrl="https://calpaterson.com/" xmlUrl="https://calpaterson.com/calpaterson.rss"/>
<outline text="Calum Ryan" type="rss" htmlUrl="https://www.calumryan.com/articles" xmlUrl="https://www.calumryan.com/feeds/articles/rss"/>
<outline text="Cambus.net" type="atom" htmlUrl="https://www.cambus.net/" xmlUrl="https://www.cambus.net/atom.xml"/>
<outline text="Carl Barenbrug" type="rss" htmlUrl="https://carlbarenbrug.com/app-defaults" xmlUrl="https://carlbarenbrug.com/feed/rss"/>
<outline text="Carl Chenet's Blog" type="rss" htmlUrl="https://carlchenet.com" xmlUrl="https://carlchenet.com/feed/"/>
<outline text="Carlos Alexandro Becker" type="rss" htmlUrl="https://carlosbecker.com/posts/" xmlUrl="https://carlosbecker.com/posts/index.xml"/>
<outline text="Carlo Zancanaro" type="atom" htmlUrl="https://carlo.zancanaro.id.au/" xmlUrl="https://carlo.zancanaro.id.au/feed.xml"/>
<outline text="Carlo Zottmann" type="rss" htmlUrl="https://zottmann.org/" xmlUrl="https://zottmann.org/feed.xml"/>
<outline text="Carl Schwan" type="rss" htmlUrl="https://carlschwan.eu/" xmlUrl="https://carlschwan.eu/index.xml"/>
<outline text="Carole Cadwalladr" type="rss" htmlUrl="https://broligarchy.substack.com/archive" xmlUrl="https://broligarchy.substack.com/feed"/>
<outline text="Cascade" type="atom" htmlUrl="https://blog.cascading.space/" xmlUrl="https://blog.cascading.space/feed/"/>
<outline text="Casey Primozic" type="rss" htmlUrl="https://cprimozic.net" xmlUrl="https://cprimozic.b-cdn.net/rss.xml"/>
<outline text="Cassidy Williams" type="rss" htmlUrl="https://cassidoo.co/" xmlUrl="https://cassidoo.co/rss.xml"/>
<outline text="CBarrete" type="rss" htmlUrl="https://cbarrete.com/" xmlUrl="https://cbarrete.com/feed.xml"/>
<outline text="Cedric" type="rss" htmlUrl="https://www.cedricbonhomme.org/" xmlUrl="https://www.cedricbonhomme.org/blog/index.xml"/>
<outline text="Celso Martinho" type="rss" htmlUrl="https://celso.io/" xmlUrl="https://celso.io/index.xml"/>
<outline text="Cemrehan Çavdar" type="rss" htmlUrl="https://cemrehancavdar.com/archive/" xmlUrl="https://cemrehancavdar.com/feed.xml"/>
<outline text="Cendyne Naga" type="rss" htmlUrl="https://cendyne.dev" xmlUrl="https://cendyne.dev/feed.xml"/>
<outline text="Chad Whitacre" type="atom" htmlUrl="https://openpath.chadwhitacre.com/" xmlUrl="https://openpath.quest/feed.xml"/>
<outline text="Charles Leifer" type="atom" htmlUrl="https://charlesleifer.com/blog/" xmlUrl="https://charlesleifer.com/blog/rss/"/>
<outline text="Charlie's Diary" type="rss" htmlUrl="http://www.antipope.org/charlie/blog-static/" xmlUrl="http://www.antipope.org/charlie/blog-static/atom.xml"/>
<outline text="Chloé Vulquin" type="rss" htmlUrl="https://pencil.toast.cafe/bunker-labs/" xmlUrl="https://pencil.toast.cafe/bunker-labs/feed/"/>
<outline text="Chloé Vulquin - Toast" type="atom" htmlUrl="https://blog.toast.cafe/" xmlUrl="https://blog.toast.cafe/rss"/>
<outline text="Chen Hui Jing" type="rss" htmlUrl="https://chenhuijing.com/blog/" xmlUrl="https://chenhuijing.com/rss.xml"/>
<outline text="Chi Señires" type="atom" htmlUrl="https://chisenires.design/blog/" xmlUrl="https://chisenires.design/feed.xml"/>
<outline text="Chip Overclock" type="atom" htmlUrl="https://coverclock.blogspot.com/" xmlUrl="https://coverclock.blogspot.com/feeds/posts/default"/>
<outline text="Chris Aldrich" type="rss" htmlUrl="https://boffosocko.com/" xmlUrl="https://boffosocko.com/feed/"/>
<outline text="Chris Amico" type="rss" htmlUrl="https://chrisamico.com/blog/" xmlUrl="https://chrisamico.com/blog.rss"/>
<outline text="Chris Coyier" type="rss" htmlUrl="https://chriscoyier.net/" xmlUrl="https://chriscoyier.net/feed/"/>
<outline text="Chris Done" type="rss" htmlUrl="https://chrisdone.com/" xmlUrl="https://chrisdone.com/rss.xml"/>
<outline text="Chris Enns" type="rss" htmlUrl="https://chrisenns.com/" xmlUrl="https://chrisenns.com/rss/"/>
<outline text="Chris Fenner" type="atom" htmlUrl="https://www.dlp.rip/" xmlUrl="https://www.dlp.rip/feed.xml"/>
<outline text="Chris Ferris" type="rss" htmlUrl="https://www.chrisfarris.com/" xmlUrl="https://www.chrisfarris.com/rss.xml"/>
<outline text="Chris Funderburg" type="rss" htmlUrl="https://chris.funderburg.me/" xmlUrl="https://chris.funderburg.me/index.xml"/>
<outline text="Chris Glass" type="rss" htmlUrl="https://chrisglass.com/" xmlUrl="https://chrisglass.com/feed/"/>
<outline text="Chris Hannah" type="rss" htmlUrl="https://chrishannah.me/" xmlUrl="https://chrishannah.me/index.xml"/>
<outline text="Chris Holdgraf" type="rss" htmlUrl="https://chrisholdgraf.com/" xmlUrl="https://chrisholdgraf.com/rss.xml"/>
<outline text="Chris Jones" type="atom" htmlUrl="https://misterchrisjones.ca/" xmlUrl="https://misterchrisjones.ca/feed.xml"/>
<outline text="Chris Maiorana" type="rss" htmlUrl="https://chrismaiorana.com/" xmlUrl="https://chrismaiorana.com/feed/"/>
<outline text="Chris McLeod" type="rss" htmlUrl="https://chrismcleod.dev/blog/page-0/" xmlUrl="https://chrismcleod.dev/follow/blog/feed.atom"/>
<outline text="Chris O'Donnell" type="rss" htmlUrl="https://odonnellweb.com/pelican/" xmlUrl="https://chrisod.org/rss.xml"/>
<outline text="Chris Penner" type="atom" htmlUrl="https://chrispenner.ca/" xmlUrl="https://chrispenner.ca/atom.xml"/>
<outline text="Chris Siebenmann" type="rss" htmlUrl="https://utcc.utoronto.ca/~cks/space/blog/" xmlUrl="https://utcc.utoronto.ca/~cks/space/blog/?atom"/>
<outline text="Chris Wellons" type="atom" htmlUrl="https://nullprogram.com/" xmlUrl="https://nullprogram.com/feed/"/>
<outline text="Chris Zietlow" type="rss" htmlUrl="https://zietlow.io/" xmlUrl="https://zietlow.io/index.xml"/>
<outline text="Christian Fischer" type="rss" htmlUrl="https://hmbl.blog/" xmlUrl="https://hmbl.blog/feed/"/>
<outline text="Christian Haschek" type="rss" htmlUrl="https://blog.haschek.at" xmlUrl="https://blog.haschek.at/rss.xml"/>
<outline text="Christian Hofstede-Kuhn" type="rss" htmlUrl="https://blog.hofstede.it/" xmlUrl="https://blog.hofstede.it/feeds/all.rss.xml"/>
<outline text="Christiano Anderson" type="rss" htmlUrl="https://christiano.dev/post/" xmlUrl="https://christiano.dev/post/index.xml"/>
<outline text="Christophe Brocas" type="rss" htmlUrl="https://blog.brocas.org/" xmlUrl="https://blog.brocas.org/index.xml"/>
<outline text="Christopher Downer" type="rss" htmlUrl="https://cjd.weblog.lol/" xmlUrl="https://cjd.weblog.lol/rss.xml"/>
<outline text="Chuck Carroll" type="rss" htmlUrl="https://chuck.is/writing/" xmlUrl="https://chuck.is/feed.xml"/>
<outline text="Chuck Grimmett" type="rss" htmlUrl="https://cagrimmett.com/tech/" xmlUrl="https://cagrimmett.com/feed/"/>
<outline text="Ciprian Dorin Craciun" type="rss" htmlUrl="https://notes.volution.ro/" xmlUrl="https://notes.volution.ro/index.xml"/>
<outline text="Clayton Errington" type="rss" htmlUrl="https://claytonerrington.com/blog/" xmlUrl="https://claytonerrington.com/feed.xml"/>
<outline text="Clemens Koza" type="rss" htmlUrl="https://blog.ensko.at/" xmlUrl="https://blog.ensko.at/rss.xml"/>
<outline text="Clinton Blackburn" type="rss" htmlUrl="https://dev.clintonblackburn.com/" xmlUrl="https://dev.clintonblackburn.com/feed.xml"/>
<outline text="Cobb" type="atom" htmlUrl="https://cobb.land/posts/" xmlUrl="https://cobb.land/feed-articles.xml"/>
<outline text="Colin Leroy-Mira" type="rss" htmlUrl="https://www.colino.net/wordpress/en/" xmlUrl="https://www.colino.net/wordpress/en/feed/"/>
<outline text="Colin Morris" type="rss" htmlUrl="https://vonexplaino.com/blog/" xmlUrl="https://vonexplaino.com/blog/rss.xml"/>
<outline text="Colin Walker" type="rss" htmlUrl="https://colinwalker.blog/blog/" xmlUrl="https://colinwalker.blog/dailyfeed.xml"/>
<outline text="comiCSS" type="rss" htmlUrl="https://comicss.art/blog/" xmlUrl="https://comicss.art/rss.xml"/>
<outline text="computers are bad" type="rss" htmlUrl="https://computer.rip" xmlUrl="https://computer.rip/rss.xml"/>
<outline text="Connor Tumbleson" type="rss" htmlUrl="https://connortumbleson.com/" xmlUrl="https://connortumbleson.com/rss/"/>
<outline text="copyrighteous" type="rss" htmlUrl="https://mako.cc/copyrighteous" xmlUrl="https://mako.cc/copyrighteous/feed/atom"/>
<outline text="Corey Stephan, Ph.D." type="rss" htmlUrl="https://www.coreystephan.com" xmlUrl="https://www.coreystephan.com/feed/"/>
<outline text="Cory Doctorow" type="rss" htmlUrl="https://pluralistic.net" xmlUrl="https://pluralistic.net/feed/"/>
<outline text="Cory Dransfeldt" type="rss" htmlUrl="https://coryd.dev/posts/" xmlUrl="https://www.coryd.dev/feeds/posts.xml"/>
<outline text="Coyote" type="atom" htmlUrl="https://osteophage.neocities.org/essays" xmlUrl="https://osteophage.dreamwidth.org/data/atom"/>
<outline text="Crescentrose" type="atom" htmlUrl="https://crescentro.se/posts/" xmlUrl="https://crescentro.se/posts/atom.xml"/>
<outline text="Crooked Timber" type="rss" htmlUrl="https://crookedtimber.org/" xmlUrl="https://crookedtimber.org/feed/"/>
<outline text="cr.yp.to - D J Bernstein" type="rss" htmlUrl="http://blog.cr.yp.to" xmlUrl="http://blog.cr.yp.to/feed.application=xml"/>
<outline text="Cryptography.dog OÜ" type="atom" htmlUrl="https://cryptography.dog/" xmlUrl="https://cryptography.dog/feed.xml"/>
<outline text="Curt Merrill" type="rss" htmlUrl="https://curtmerrill.com/blog/" xmlUrl="https://curtmerrill.com/blog/feed/"/>
<outline text="Cybergeeks" type="rss" htmlUrl="https://cybergeeks.tech" xmlUrl="https://cybergeeks.tech/feed/"/>
<outline text="Cyd Stumpel" type="rss" htmlUrl="https://cydstumpel.nl/blogs/" xmlUrl="https://cydstumpel.nl/feed/"/>
<outline text="Cynthia Dunlop" type="rss" htmlUrl="https://writethatblog.substack.com/" xmlUrl="https://writethatblog.substack.com/feed"/>
<outline text="Cyryl Płotnicki" type="rss" htmlUrl="https://blog.cyplo.dev/posts/" xmlUrl="https://blog.cyplo.dev/feed.xml"/>
<outline text="D Griffin Jones" type="rss" htmlUrl="https://www.dgriffinjones.com/" xmlUrl="https://www.dgriffinjones.com/extra_ordinary_feed.xml"/>
<outline text="Dana Byerly" type="rss" htmlUrl="https://danabyerly.com/notes/" xmlUrl="https://danabyerly.com/feed.xml"/>
<outline text="Dan Erat" type="atom" htmlUrl="https://www.erat.org/" xmlUrl="https://www.erat.org/atom.xml"/>
<outline text="Dan MacKinlay" type="rss" htmlUrl="https://danmackinlay.name/" xmlUrl="https://danmackinlay.name/index.xml"/>
<outline text="Dan McQuillan" type="atom" htmlUrl="https://www.danmcquillan.org/" xmlUrl="https://www.danmcquillan.org/feeds/all.atom.xml"/>
<outline text="Daniël de Kok" type="atom" htmlUrl="https://danieldk.eu/" xmlUrl="https://danieldk.eu/index.xml"/>
<outline text="Daniel Andrlik" type="rss" htmlUrl="https://www.andrlik.org/" xmlUrl="https://www.andrlik.org/index.xml"/>
<outline text="Daniel Doubrovkine" type="atom" htmlUrl="https://code.dblock.org/" xmlUrl="https://code.dblock.org/feed.xml"/>
<outline text="Daniel Cantarín" type="rss" htmlUrl="https://blog.canta.com.ar/" xmlUrl="https://blog.canta.com.ar/feed/"/>
<outline text="Daniel De Laney" type="rss" htmlUrl="http://danieldelaney.net/" xmlUrl="http://danieldelaney.net/feed.xml"/>
<outline text="Daniel Demby" type="rss" htmlUrl="https://heliomass.com/posts/" xmlUrl="https://heliomass.com/index.xml"/>
<outline text="Daniel Estévez" type="rss" htmlUrl="https://destevez.net/" xmlUrl="https://destevez.net/feed/"/>
<outline text="Daniele" type="rss" htmlUrl="https://fokewulf.it/" xmlUrl="https://fokewulf.it/feed/"/>
<outline text="Daniel Fedorin" type="rss" htmlUrl="https://danilafe.com/blog/" xmlUrl="https://danilafe.com/blog/index.xml"/>
<outline text="Daniel Fichtinger" type="rss" htmlUrl="https://ficd.sh/" xmlUrl="https://ficd.sh/rss.xml"/>
<outline text="Daniel Miessler" type="rss" htmlUrl="https://danielmiessler.com/" xmlUrl="https://rss.beehiiv.com/feeds/gQxaV1KHkQ.xml"/>
<outline text="Daniel Miller" type="atom" htmlUrl="https://www.daniel.industries/blog/" xmlUrl="https://www.daniel.industries/atom.xml"/>
<outline text="Daniel P Gross" type="rss" htmlUrl="https://dgross.ca/" xmlUrl="https://dgross.ca/feed.xml"/>
<outline text="Daniel Pipes" type="rss" htmlUrl="https://www.danielpipes.org" xmlUrl="https://www.danielpipes.org/rss.xml"/>
<outline text="Daniel Pocock" type="atom" htmlUrl="https://danielpocock.com/" xmlUrl="https://danielpocock.com/feed.atom"/>
<outline text="Daniel Xu" type="atom" htmlUrl="https://dxuuu.xyz/" xmlUrl="https://dxuuu.xyz/atom.xml"/>
<outline text="Dan Cătălin Burzo" type="atom" htmlUrl="https://danburzo.ro/" xmlUrl="https://danburzo.ro/feeds/posts.xml"/>
<outline text="Dan Langille's Other Diary" type="rss" htmlUrl="https://dan.langille.org" xmlUrl="https://dan.langille.org/feed/"/>
<outline text="Dan Q" type="rss" htmlUrl="https://danq.me/blog/" xmlUrl="https://danq.me/feed/"/>
<outline text="Dan Sinker" type="atom" htmlUrl="https://dansinker.com/posts/" xmlUrl="https://dansinker.com/feed.xml"/>
<outline text="Dan Slimmon" type="rss" htmlUrl="https://blog.danslimmon.com/" xmlUrl="https://blog.danslimmon.com/feed/"/>
<outline text="Danny McClelland" type="rss" htmlUrl="https://blog.dmcc.io/" xmlUrl="https://blog.dmcc.io/index.xml"/>
<outline text="Daphne Preston-Kendal" type="atom" htmlUrl="https://crumbles.blog/" xmlUrl="https://crumbles.blog/atom.xml"/>
<outline text="Darek Kay" type="atom" htmlUrl="https://darekkay.com/" xmlUrl="https://darekkay.com/atom.xml"/>
<outline text="Daring Fireball" type="rss" htmlUrl="https://daringfireball.net/" xmlUrl="https://daringfireball.net/feeds/main"/>
<outline text="Darko Mesaroš" type="rss" htmlUrl="https://rup12.net/" xmlUrl="https://rup12.net/rss.xml"/>
<outline text="Darren Goossens" type="rss" htmlUrl="https://darrengoossens.wordpress.com/" xmlUrl="https://darrengoossens.wordpress.com/feed/"/>
<outline text="datagubbe" type="rss" htmlUrl="https://www.datagubbe.se" xmlUrl="https://www.datagubbe.se/atom.xml"/>
<outline text="Dave DeGraw" type="atom" htmlUrl="https://catskull.net/" xmlUrl="https://catskull.net/feed.xml"/>
<outline text="Dave Gauer" type="atom" htmlUrl="https://ratfactor.com/" xmlUrl="https://ratfactor.com/atom.xml"/>
<outline text="Dave Johnston" type="rss" htmlUrl="https://www.johnsto.co.uk/blog/" xmlUrl="https://www.johnsto.co.uk/blog/index.xml"/>
<outline text="Dave Peck" type="rss" htmlUrl="https://davepeck.org/" xmlUrl="https://davepeck.org/feed/"/>
<outline text="David Buchanan" type="rss" htmlUrl="https://www.da.vidbuchanan.co.uk/blog/" xmlUrl="https://www.da.vidbuchanan.co.uk/blog/rss.xml"/>
<outline text="David Bushell" type="rss" htmlUrl="https://dbushell.com/blog/" xmlUrl="https://dbushell.com/rss.xml"/>
<outline text="David Celis" type="atom" htmlUrl="https://davidcel.is/" xmlUrl="https://davidcel.is/feeds/articles"/>
<outline text="David Edmundson" type="rss" htmlUrl="http://blog.davidedmundson.co.uk/" xmlUrl="http://blog.davidedmundson.co.uk/feed/"/>
<outline text="David Gerrells" type="rss" htmlUrl="https://dgerrells.com/blog" xmlUrl="https://dgerrells.com/feed"/>
<outline text="David Hamp-Gonsalves" type="rss" htmlUrl="https://davidhampgonsalves.com/" xmlUrl="https://davidhampgonsalves.com/index.xml"/>
<outline text="David H" type="rss" htmlUrl="https://notes.1705.net/" xmlUrl="https://notes.1705.net/index.xml"/>
<outline text="David John Foley" type="atom" htmlUrl="https://www.dfoley.ie/blog" xmlUrl="https://www.dfoley.ie/blog.atom"/>
<outline text="David L Farquhar" type="rss" htmlUrl="https://dfarq.homeip.net/" xmlUrl="https://dfarq.homeip.net/feed/"/>
<outline text="David Leadbeater" type="atom" htmlUrl="https://dgl.cx/" xmlUrl="https://dgl.cx/feed"/>
<outline text="David Mead" type="rss" htmlUrl="https://davidjohnmead.com/posts/" xmlUrl="https://davidjohnmead.com/feed/feed.xml"/>
<outline text="David Oks" type="rss" htmlUrl="https://davidoks.blog/archive" xmlUrl="https://davidoks.blog/feed"/>
<outline text="David Pasek" type="atom" htmlUrl="https://freebsd.uw.cz/p/series-and-topics.html" xmlUrl="https://freebsd.uw.cz/feeds/posts/default"/>
<outline text="David Pogue" type="rss" htmlUrl="https://pogueman.substack.com/" xmlUrl="https://pogueman.substack.com/feed"/>
<outline text="David Revoy" type="rss" htmlUrl="https://www.davidrevoy.com/" xmlUrl="https://www.davidrevoy.com/feed/rss"/>
<outline text="David Roessli" type="rss" htmlUrl="https://davidroessli.com/" xmlUrl="https://davidroessli.com/rss/"/>
<outline text="David Soria Parra" type="rss" htmlUrl="https://experimentalworks.net/posts/" xmlUrl="https://experimentalworks.net/posts/index.xml"/>
<outline text="David Yates" type="rss" htmlUrl="https://davidyat.es/" xmlUrl="https://davidyat.es/rss.xml"/>
<outline text="Superdavey" type="rss" htmlUrl="https://www.superdavey.com/" xmlUrl="https://superdavey.com/posts_feed"/>
<outline text="Dayvi Schuster" type="rss" htmlUrl="https://dayvster.com/" xmlUrl="https://dayvster.com/rss.xml"/>
<outline text="Declan Chidlow" type="rss" htmlUrl="https://vale.rocks/posts/" xmlUrl="https://vale.rocks/posts/feed.xml"/>
<outline text="Dedoimedo" type="rss" htmlUrl="https://www.dedoimedo.com" xmlUrl="https://www.dedoimedo.com/rss_feed.xml"/>
<outline text="DemoChen" type="rss" htmlUrl="https://demochen.com/posts/" xmlUrl="https://demochen.com/atom.xml"/>
<outline text="Den Odell" type="rss" htmlUrl="https://denodell.com/blog/" xmlUrl="https://denodell.com/rss.xml"/>
<outline text="Denis Lantsman" type="atom" htmlUrl="https://dlants.me/" xmlUrl="https://dlants.me/atom"/>
<outline text="Derek Kędziora" type="atom" htmlUrl="http://derekkedziora.com/" xmlUrl="https://derekkedziora.com/feed.xml"/>
<outline text="Derek Sivers" type="rss" htmlUrl="https://sive.rs/led" xmlUrl="https://sive.rs/articles.xml"/>
<outline text="Derek Thompson" type="rss" htmlUrl="https://www.derekthompson.org/archive" xmlUrl="https://www.derekthompson.org/feed"/>
<outline text="Devon Dundee" type="rss" htmlUrl="https://devondundee.com/blog/default-apps" xmlUrl="https://devondundee.com/blog?format=rss"/>
<outline text="Dhole Moments" type="rss" htmlUrl="https://soatok.blog" xmlUrl="https://soatok.blog/feed/"/>
<outline text="Didier Stevens" type="rss" htmlUrl="https://blog.didierstevens.com" xmlUrl="https://blog.didierstevens.com/feed/"/>
<outline text="Dieter Plaetinck" type="rss" htmlUrl="https://dieter.plaetinck.be/posts/" xmlUrl="https://dieter.plaetinck.be/index.xml"/>
<outline text="Dillon Mok" type="rss" htmlUrl="https://dillonmok.com/blog/" xmlUrl="https://dillonmok.com/feed.xml"/>
<outline text="Diomidis Spinellis" type="rss" htmlUrl="https://www.spinellis.gr/blog/" xmlUrl="https://www.spinellis.gr/blog/dds-blog-rss.xml"/>
<outline text="Ian Jackson" type="rss" htmlUrl="https://diziet.dreamwidth.org/" xmlUrl="https://diziet.dreamwidth.org/data/atom"/>
<outline text="DJ Adams" type="atom" htmlUrl="https://qmacro.org/" xmlUrl="https://qmacro.org/feed/feed.xml"/>
<outline text="Dmitrii Kovanikov" type="rss" htmlUrl="https://chshersh.com/" xmlUrl="https://chshersh.com/rss.xml"/>
<outline text="Dmitry Dolzhenko" type="rss" htmlUrl="https://dolzhenko.me/blog/" xmlUrl="https://dolzhenko.me/feed.xml"/>
<outline text="Dmitry Frank" type="rss" htmlUrl="https://dmitryfrank.com/" xmlUrl="https://dmitryfrank.com/lib/plugins/feed/feed.php"/>
<outline text="Doc Searls" type="rss" htmlUrl="https://doc.searls.com/" xmlUrl="https://doc.searls.com/feed/"/>
<outline text="Dolev Hadar" type="rss" htmlUrl="https://dlvhdr.me" xmlUrl="https://www.dlvhdr.me/rss/feed.xml"/>
<outline text="Dominik Schwind" type="rss" htmlUrl="https://lostfocus.de/" xmlUrl="https://lostfocus.de/feed/"/>
<outline text="Dom Jay" type="rss" htmlUrl="https://dominickjay.com/writing/" xmlUrl="https://dominickjay.com/feed.xml"/>
<outline text="Don Marti" type="rss" htmlUrl="https://blog.zgp.org/" xmlUrl="https://blog.zgp.org/feed.xml"/>
<outline text="Doug Jones" type="rss" htmlUrl="https://doug.pub/" xmlUrl="https://doug.pub/feed.xml"/>
<outline text="Doug Square" type="rss" htmlUrl="https://dgsq.net/" xmlUrl="https://dgsq.net/rss.xml"/>
<outline text="Douglas Rushkoff" type="rss" htmlUrl="https://archive.rushkoff.com/" xmlUrl="https://archive.rushkoff.com/feed/articles.xml"/>
<outline text="Downtown Doug Brown" type="rss" htmlUrl="https://www.downtowndougbrown.com" xmlUrl="https://www.downtowndougbrown.com/feed/"/>
<outline text="Dr Molly Tov" type="rss" htmlUrl="https://drmollytov.smol.pub/" xmlUrl="https://drmollytov.smol.pub/atom.xml"/>
<outline text="Drew Breunig" type="atom" htmlUrl="https://www.dbreunig.com/" xmlUrl="https://www.dbreunig.com/feed.xml"/>
<outline text="DSHR's Blog" type="rss" htmlUrl="https://blog.dshr.org/" xmlUrl="https://blog.dshr.org/feeds/posts/default"/>
<outline text="dt.iki.fi" type="rss" htmlUrl="http://dt.iki.fi" xmlUrl="https://dt.iki.fi/feeds/rss.xml"/>
<outline text="Dustin K" type="rss" htmlUrl="https://dustinknopoff.dev/articles/" xmlUrl="https://dustinknopoff.dev/rss.xml"/>
<outline text="eapl.mx" type="rss" htmlUrl="https://text.eapl.mx/" xmlUrl="https://text.eapl.mx/atom.xml"/>
<outline text="Earthly Blog" type="rss" htmlUrl="https://earthly.dev/blog/" xmlUrl="https://earthly.dev/blog/feed.xml"/>
<outline text="The Eclectic Light Company" type="rss" htmlUrl="https://eclecticlight.co/" xmlUrl="https://eclecticlight.co/feed/"/>
<outline text="Edward Li" type="rss" htmlUrl="https://blog.edward-li.com/" xmlUrl="https://blog.edward-li.com/index.xml"/>
<outline text="eerielinux" type="rss" htmlUrl="https://eerielinux.wordpress.com" xmlUrl="https://eerielinux.wordpress.com/feed/"/>
<outline text="Efron Licht" type="rss" htmlUrl="https://eblog.fly.dev/" xmlUrl="https://eblog.fly.dev/rss.xml"/>
<outline text="Ehqo" type="rss" htmlUrl="https://ehqo.weblog.lol/" xmlUrl="https://ehqo.weblog.lol/rss.xml"/>
<outline text="eiffair" type="rss" htmlUrl="https://www.eiffair.fr/" xmlUrl="https://www.eiffair.fr/rss/"/>
<outline text="Eli Billauer" type="rss" htmlUrl="https://billauer.se/blog/" xmlUrl="ihttps://billauer.se/blog/feed/"/>
<outline text="Elias Daler" type="rss" htmlUrl="https://edw.is/" xmlUrl="https://edw.is/feed.xml"/>
<outline text="Elias Mårtenson" type="rss" htmlUrl="https://blog.dhsdevelopments.com/" xmlUrl="https://blog.dhsdevelopments.com/feed/"/>
<outline text="Eliseo Martelli" type="rss" htmlUrl="https://www.eliseomartelli.it/blog" xmlUrl="https://www.eliseomartelli.it/feed.xml"/>
<outline text="Elliot C Smith" type="rss" htmlUrl="https://www.elliotcsmith.com/" xmlUrl="https://www.elliotcsmith.com/rss/"/>
<outline text="eMariete" type="rss" htmlUrl="https://emariete.com/en/" xmlUrl="https://emariete.com/en/feed/"/>
<outline text="emptywheel" type="rss" htmlUrl="https://www.emptywheel.net/" xmlUrl="http://feeds.feedburner.com/emptywheel/cAUy"/>
<outline text="Eric Bailey" type="rss" htmlUrl="https://ericwbailey.website" xmlUrl="https://ericwbailey.website/feed/feed.xml"/>
<outline text="Eric MacAdie" type="rss" htmlUrl="https://macadie.info/" xmlUrl="https://macadie.info/feed/"/>
<outline text="Eric Noodén" type="rss" htmlUrl="https://armyeric67.com/" xmlUrl="https://armyeric67.com/feed/"/>
<outline text="Eric P Hanson" type="rss" htmlUrl="https://ericphanson.com/blog/" xmlUrl="https://ericphanson.com/blog/index.xml"/>
<outline text="Eric Pauley" type="rss" htmlUrl="https://pauley.me/" xmlUrl="https://pauley.me/index.xml"/>
<outline text="Eric Turgeon" type="atom" htmlUrl="https://ericbsd.com/" xmlUrl="https://ericbsd.com/feeds/all.atom.xml"/>
<outline text="Erik Johannes Husom" type="rss" htmlUrl="https://erikjohannes.no/" xmlUrl="https://erikjohannes.no/index.xml"/>
<outline text="Erik McClure" type="rss" htmlUrl="https://erikmcclure.com/blog/" xmlUrl="https://erikmcclure.com/blog/index.xml"/>
<outline text="Erik W" type="atom" htmlUrl="https://ewintr.nl/posts/" xmlUrl="https://ewintr.nl/atom.xml"/>
<outline text="Eskild Hustvedt" type="atom" htmlUrl="https://blog.zerodogg.org/" xmlUrl="https://blog.zerodogg.org/atom.xml"/>
<outline text="Ethan Zuverkman" type="rss" htmlUrl="https://ethanzuckerman.com/blog/" xmlUrl="https://ethanzuckerman.com/feed/"/>
<outline text="Étienne Pflieger" type="atom" htmlUrl="https://etienne.pflieger.bzh/a-ecrit/" xmlUrl="https://etienne.pflieger.bzh/a-ecrit/feeds/index.xml"/>
<outline text="Evan Hahn" type="rss" htmlUrl="https://evanhahn.com/blog/" xmlUrl="https://evanhahn.com/blog/index.xml"/>
<outline text="Eyes Above The Waves" type="atom" htmlUrl="https://robert.ocallahan.org/" xmlUrl="https://robert.ocallahan.org/feed.xml"/>
<outline text="Fabien Beuke" type="atom" htmlUrl="https://beuke.org/" xmlUrl="https://beuke.org/atom.xml"/>
<outline text="Fabian Lindfors" type="atom" htmlUrl="https://fabianlindfors.se/blog/" xmlUrl="https://fabianlindfors.se/feed.xml"/>
<outline text="Fabian Holzer" type="rss" htmlUrl="https://holzer.online/articles/" xmlUrl="https://holzer.online/feed.xml"/>
<outline text="Fabian “ryg” Giesen" type="rss" htmlUrl="https://fgiesen.wordpress.com/" xmlUrl="https://fgiesen.wordpress.com/feed/"/>
<outline text="Fabien Sanglard" type="rss" htmlUrl="https://fabiensanglard.net/" xmlUrl="https://fabiensanglard.net/rss.xml"/>
<outline text="Facundo Olano" type="atom" htmlUrl="https://olano.dev/blog/" xmlUrl="https://olano.dev/feed.xml"/>
<outline text="fasterthanli.me" type="rss" htmlUrl="https://fasterthanli.me/" xmlUrl="https://fasterthanli.me/index.xml"/>
<outline text="Farid Zakaria" type="atom" htmlUrl="https://fzakaria.com/" xmlUrl="https://fzakaria.com/feed"/>
<outline text="Fabrizio Ferri Benedetti" type="rss" htmlUrl="https://passo.uno/posts/" xmlUrl="https://passo.uno/posts/index.xml"/>
<outline text="Feld" type="atom" htmlUrl="https://blog.feld.me/" xmlUrl="https://blog.feld.me/feeds/all.atom.xml"/>
<outline text="Felix Krause" type="rss" htmlUrl="https://krausefx.com//" xmlUrl="https://krausefx.com/feed.xml"/>
<outline text="Ferd.ca" type="rss" htmlUrl="https://ferd.ca/" xmlUrl="https://ferd.ca/feed.rss"/>
<outline text="Fernando Borretti" type="rss" htmlUrl="https://borretti.me/" xmlUrl="https://borretti.me/feed.xml"/>
<outline text="Filippo Valsorda" type="rss" htmlUrl="https://words.filippo.io/" xmlUrl="https://words.filippo.io/rss/"/>
<outline text="fLaMEd" type="rss" htmlUrl="https://flamedfury.com/posts/" xmlUrl="https://flamedfury.com/feed.xml"/>
<outline text="Floh Gro" type="rss" htmlUrl="https://flohgro.com/" xmlUrl="https://flohgro.com/rss.xml"/>
<outline text="Florian Anderiasch" type="atom" htmlUrl="https://f5n.org/blog/" xmlUrl="https://f5n.org/blog/atom.xml"/>
<outline text="flower.codes" type="rss" htmlUrl="http://flower.codes/" xmlUrl="https://flower.codes/feed.xml"/>
<outline text="Frank Delporte" type="rss" htmlUrl="https://webtechie.be/" xmlUrl="https://webtechie.be/index.xml"/>
<outline text="Frank Meeuwsen" type="rss" htmlUrl="https://blog.frankmeeuwsen.com/" xmlUrl="https://blog.frankmeeuwsen.com/feed.xml"/>
<outline text="Frederick Vanbrabant" type="rss" htmlUrl="https://frederickvanbrabant.com/" xmlUrl="https://frederickvanbrabant.com/index.xml"/>
<outline text="Frederik Braun" type="rss" htmlUrl="https://frederikbraun.de/" xmlUrl="https://frederikbraun.de/feeds/all.atom.xml"/>
<outline text="Frills" type="rss" htmlUrl="https://frills.dev/blog/" xmlUrl="https://frills.dev/rss.xml"/>
<outline text="G4HSK" type="rss" htmlUrl="https://radio.g4hsk.co.uk/" xmlUrl="https://radio.g4hsk.co.uk/feed/"/>
<outline text="Giles Turnbull" type="rss" htmlUrl="https://gilest.org/" xmlUrl="https://gilest.org/feed/index.xml"/>
<outline text="Glen E. Friedman" type="atom" htmlUrl="https://idealistpropaganda.blogspot.com/" xmlUrl="https://idealistpropaganda.blogspot.com/feeds/posts/default"/>
<outline text="Fundor333" type="rss" htmlUrl="https://fundor333.com/post/" xmlUrl="https://fundor333.com/post/index.xml"/>
<outline text="Fuzzix" type="atom" htmlUrl="https://fuzzix.org/" xmlUrl="https://fuzzix.org/atom.xml"/>
<outline text="FuzzyGrim" type="rss" htmlUrl="https://www.fuzzygrim.com/posts/default-apps-2023" xmlUrl="https://www.fuzzygrim.com/feed.xml"/>
<outline text="Gabe Venberg" type="rss" htmlUrl="https://gabevenberg.com/" xmlUrl="https://gabevenberg.com/index.xml"/>
<outline text="Gábor Melis" type="rss" htmlUrl="https://quotenil.com/" xmlUrl="http://quotenil.com/blog.rss"/>
<outline text="Gabriel Garrido" type="rss" htmlUrl="https://garrido.io/posts/" xmlUrl="https://garrido.io/posts/index.xml"/>
<outline text="Gabriele Girelli" type="rss" htmlUrl="https://ggirelli.info/blog/" xmlUrl="https://ggirelli.info/blog/feed.xml"/>
<outline text="Gabriel Simmer" type="rss" htmlUrl="https://gabrielsimmer.com/blog/" xmlUrl="https://gabrielsimmer.com/rss"/>
<outline text="Gabz" type="atom" htmlUrl="https://gabz.blog/posts" xmlUrl="https://gabz.blog/posts_feed"/>
<outline text="Garrit Franke" type="rss" htmlUrl="https://garrit.xyz/posts/" xmlUrl="https://garrit.xyz/rss.xml"/>
<outline text="Garry Kasparov" type="rss" htmlUrl="https://www.thenextmove.org/" xmlUrl="https://www.thenextmove.org/feed"/>
<outline text="Geek Blight" type="rss" htmlUrl="https://rg3.name" xmlUrl="https://rg3.name/rss/index.rss"/>
<outline text="Geir Isene" type="rss" htmlUrl="https://isene.org/" xmlUrl="https://isene.org/feed.xml"/>
<outline text="Geoff Manaugh" type="rss" htmlUrl="https://bldgblog.com/" xmlUrl="https://bldgblog.com/feed/"/>
<outline text="Geoffrey Litt" type="rss" htmlUrl="https://www.geoffreylitt.com/" xmlUrl="https://www.geoffreylitt.com/feed.xml"/>
<outline text="Gergely Nagy" type="atom" htmlUrl="https://chronicles.mad-scientist.club/" xmlUrl="https://chronicles.mad-scientist.club/atom.xml"/>
<outline text="Geshan's Blog" type="rss" htmlUrl="https://geshan.com.np/" xmlUrl="https://geshan.com.np/atom.xml"/>
<outline text="Gigi" type="rss" htmlUrl="https://dergigi.com/" xmlUrl="https://dergigi.com/feed.xml"/>
<outline text="Gilles Chehade" type="rss" htmlUrl="https://poolp.org/" xmlUrl="https://poolp.org/index.xml"/>
<outline text="Giovanni Collazo" type="rss" htmlUrl="https://gcollazo.com/blog/" xmlUrl="https://gcollazo.com/feed.xml"/>
<outline text="Graham Cluley" type="rss" htmlUrl="https://grahamcluley.com/" xmlUrl="https://grahamcluley.com/feed/"/>
<outline text="Graham Helton" type="rss" htmlUrl="https://grahamhelton.com/blog/" xmlUrl="https://grahamhelton.com/rss.xml"/>
<outline text="Graham Sutherland" type="atom" htmlUrl="https://blog.poly.nomial.co.uk/" xmlUrl="https://blog.poly.nomial.co.uk/feed.xml"/>
<outline text="Greg Morris" type="rss" htmlUrl="https://gregmorris.co.uk/" xmlUrl="https://gregmorris.co.uk/rss/"/>
<outline text="Greg Newman" type="rss" htmlUrl="https://gregnewman.io/posts/" xmlUrl="https://gregnewman.io/rss.xml"/>
<outline text="Gregory Anders" type="rss" htmlUrl="https://gpanders.com/" xmlUrl="https://gpanders.com/index.xml"/>
<outline text="Gregory Hammond" type="rss" htmlUrl="https://gregoryhammond.ca" xmlUrl="https://gregoryhammond.ca/feed.xml"/>
<outline text="GreyCoder" type="rss" htmlUrl="https://greycoder.com/" xmlUrl="https://greycoder.com/feed/"/>
<outline text="Groot Koerkamp" type="rss" htmlUrl="https://curiouscoding.nl/posts/" xmlUrl="https://curiouscoding.nl/posts/index.xml"/>
<outline text="Guillermo Latorre" type="rss" htmlUrl="https://guillermolatorre.com/" xmlUrl="https://guillermolatorre.com/feed/blog"/>
<outline text="Gunnar" type="rss" htmlUrl="https://gunnar.se/" xmlUrl="https://gunnar.se/feed.xml"/>
<outline text="Gunnar Morling" type="rss" htmlUrl="https://www.morling.dev/blog/" xmlUrl="https://www.morling.dev/blog/index.xml"/>
<outline text="Gunnar Þór Magnússon" type="rss" htmlUrl="https://www.magnusson.io/post/" xmlUrl="https://www.magnusson.io/post/index.xml"/>
<outline text="Guy LeCharles Gonzalez" type="rss" htmlUrl="https://loudpoet.com/" xmlUrl="https://loudpoet.com/feed/"/>
<outline text="Gwen Lofman" type="rss" htmlUrl="https://glfmn.io/" xmlUrl="https://glfmn.io/rss.xml/"/>
<outline text="Haki Benita" type="rss" htmlUrl="https://hakibenita.com/" xmlUrl="https://hakibenita.com/feeds/all.atom.xml"/>
<outline text="Ham Vocke" type="rss" htmlUrl="https://hamvocke.com/blog/" xmlUrl="https://hamvocke.com/feed.xml"/>
<outline text="Hamilton Nolan" type="rss" htmlUrl="https://www.hamiltonnolan.com/" xmlUrl="https://www.hamiltonnolan.com/feed"/>
<outline text="Hannah Robertson" type="rss" htmlUrl="https://hannahilea.com/blog/" xmlUrl="https://hannahilea.com/rss.xml"/>
<outline text="Hanno's blog" type="rss" htmlUrl="https://blog.hboeck.de/" xmlUrl="https://blog.hboeck.de/feeds/index.rss2"/>
<outline text="Hanno Embregts" type="atom" htmlUrl="https://hanno.codes/" xmlUrl="https://hanno.codes/feed.xml"/>
<outline text="hanshq.net" type="rss" htmlUrl="https://www.hanshq.net/" xmlUrl="https://www.hanshq.net/feed.rss"/>
<outline text="Harald Sitter" type="rss" htmlUrl="https://kde.haraldsitter.eu/" xmlUrl="https://kde.haraldsitter.eu/index.xml"/>
<outline text="Harrison's Sandbox" type="rss" htmlUrl="https://harrisonsand.com/posts/" xmlUrl="https://harrisonsand.com/posts/index.xml"/>
<outline text="Harry Cresswell" type="rss" htmlUrl="https://harrycresswell.com/writing/" xmlUrl="https://harrycresswell.com/writing/feed.xml"/>
<outline text="Helen Chong" type="atom" htmlUrl="https://helenchong.dev/blog/" xmlUrl="https://helenchong.dev/blog/feed.xml"/>
<outline text="Henri Bergius" type="rss" htmlUrl="https://bergie.iki.fi" xmlUrl="https://bergie.iki.fi/blog/rss.xml"/>
<Outline text="Henrique Cabral" type="atom" htmlUrl="https://www.hmpcabral.com/" xmlUrl="https://www.hmpcabral.com/atom.xml"/>
<outline text="Henrique Dias" type="rss" htmlUrl="https://hacdias.com//writings/" xmlUrl="https://hacdias.com/writings/feed.xml"/>
<outline text="Henrik Forstén" type="atom" htmlUrl="https://hforsten.com/" xmlUrl="https://hforsten.com/feeds/all.atom.xml"/>
<outline text="Henry Desroches" type="rss" htmlUrl="https://henry.codes/" xmlUrl="https://henry.codes/rss/writing.xml"/>
<outline text="Herb Sutter" type="rss" htmlUrl="https://herbsutter.com/" xmlUrl="https://herbsutter.com/feed/"/>
<outline text="Herman Martinus" type="rss" htmlUrl="https://herman.bearblog.dev/blog/" xmlUrl="https://herman.bearblog.dev/feed/"/>
<outline text="Herman Õunapuu" type="rss" htmlUrl="https://ounapuu.ee/" xmlUrl="https://ounapuu.ee/index.xml"/>
<outline text="Marcel Bischoff" type="rss" htmlUrl="https://herrbischoff.com/" xmlUrl="https://herrbischoff.com/index.xml"/>
<outline text="Hidde de Vries" type="atom" htmlUrl="https://hidde.blog/" xmlUrl="https://hidde.blog/feed.xml"/>
<outline text="Hillel Wayne - essays" type="rss" htmlUrl="https://buttondown.com/hillelwayne" xmlUrl="https://buttondown.com/hillelwayne/rss"/>
<outline text="Hillel Wayne" type="rss" htmlUrl="https://www.hillelwayne.com/post/" xmlUrl="https://www.hillelwayne.com/post/index.xml"/>
<outline text="hisham.hm" type="rss" htmlUrl="https://hisham.hm/" xmlUrl="https://hisham.hm/feed/rss2/"/>
<outline text="HTML Heaven / Hell ( Manuel Matuzović )" type="rss" htmlUrl="https://www.htmhell.dev/" xmlUrl="https://www.htmhell.dev/feed.xml"/>
<outline text="Hugues" type="atom" htmlUrl="https://blog.izissise.net/" xmlUrl="https://blog.izissise.net/atom.xml"/>
<outline text="Hugo van Kemenade" type="rss" htmlUrl="https://hugovk.dev/blog/" xmlUrl="https://hugovk.dev/index.xml"/>
<outline text="Hugo Daniel" type="atom" htmlUrl="https://hugodaniel.com/posts/" xmlUrl="https://hugodaniel.com/atom.xml"/>
<outline text="humdrum" type="rss" htmlUrl="https://tiv.today/" xmlUrl="https://tiv.today/rss/"/>
<outline text="Ian Dick" type="rss" htmlUrl="https://www.iandick.com/" xmlUrl="https://www.iandick.com/blog/feed/"/>
<outline text="Ian Duncan" type="rss" htmlUrl="https://www.iankduncan.com/" xmlUrl="https://www.iankduncan.com/rss.xml"/>
<outline text="Idiomdrottning" type="rss" htmlUrl="https://idiomdrottning.org/" xmlUrl="https://idiomdrottning.org/blog/feed.xml"/>
<outline text="Ignacio Brasca" type="atom" htmlUrl="https://blog.ignaciobrasca.com/" xmlUrl="https://blog.ignaciobrasca.com/feed.xml"/>
<outline text="Igor Roztropiński" type="atom" htmlUrl="https://binaryigor.com/" xmlUrl="https://binaryigor.com/feed.xml"/>
<outline text="Ish Sookun" type="rss" htmlUrl="https://sysadmin-journal.com/" xmlUrl="https://sysadmin-journal.com/rss/"/>
<outline text="Ivan Kuleshov" type="rss" htmlUrl="https://uplab.pro" xmlUrl="https://uplab.pro/feed/"/>
<outline text="Ivan Sagalaev" type="rss" htmlUrl="https://softwaremaniacs.org/blog/en/" xmlUrl="https://softwaremaniacs.org/blog/feed/en/"/>
<outline text="Ivan Velichko" type="rss" htmlUrl="https://iximiuz.com/en/" xmlUrl="https://iximiuz.com/feed.rss"/>
<outline text="J Kenneth King" type="rss" htmlUrl="https://agentultra.com/archive.html" xmlUrl="https://agentultra.com/feed.xml"/>
<outline text="J Wolfgang Goerlich" type="rss" htmlUrl="https://jwgoerlich.com/blog/" xmlUrl="https://jwgoerlich.com/feed/"/>
<outline text="Jack Baty" type="rss" htmlUrl="https://baty.net/" xmlUrl="https://baty.net/index.xml"/>
<outline text="Jack Franklin" type="rss" htmlUrl="http://www.jackfranklin.co.uk" xmlUrl="https://www.jackfranklin.co.uk/feed.xml"/>
<outline text="Jacky Alciné" type="atom" htmlUrl="https://jacky.wtf/" xmlUrl="https://www.jacky.wtf/essays/feed.atom"/>
<outline text="Jacob Tomlinson" type="rss" htmlUrl="https://jacobtomlinson.dev/posts/" xmlUrl="https://jacobtomlinson.dev/posts/feed.xml"/>
<outline text="Jade Ellis" type="rss" htmlUrl="https://jade.ellis.link/blog/" xmlUrl="https://jade.ellis.link/blog/rss.xml"/>
<outline text="Jahir Fiquitiva" type="rss" htmlUrl="https://jahir.dev/" xmlUrl="https://jahir.dev/feed.xml"/>
<outline text="Jake Howard" type="rss" htmlUrl="https://theorangeone.net/posts/" xmlUrl="https://theorangeone.net/feed/"/>
<outline text="Jake Lazaroff" type="rss" htmlUrl="https://jakelazaroff.com/" xmlUrl="https://jakelazaroff.com/rss.xml"/>
<outline text="Jake Weidokal" type="rss" htmlUrl="https://weidok.al/" xmlUrl="https://weidok.al/feed.xml"/>
<outline text="Jakob Nybo Nissen" type="rss" htmlUrl="https://viralinstruction.com/" xmlUrl="https://viralinstruction.com/feed.xml"/>
<outline text="Jakub Steiner" type="rss" htmlUrl="https://blog.jimmac.eu/" xmlUrl="https://blog.jimmac.eu/feed.xml"/>
<outline text="James Bennett" type="rss" htmlUrl="https://www.b-list.org/" xmlUrl="https://www.b-list.org/feeds/entries/"/>
<outline text="James Brown" type="atom" htmlUrl="https://www.roguelazer.com/" xmlUrl="https://www.roguelazer.com/atom.xml"/>
<outline text="James' Coffee Blog" type="atom" htmlUrl="https://jamesg.blog/" xmlUrl="https://jamesg.blog/feeds/posts.xml"/>
<outline text="James Doc" type="rss" htmlUrl="https://jamesdoc.com/blog/2023/" xmlUrl="https://jamesdoc.com/blog/feed.xml"/>
<outline text="James Kerr" type="rss" htmlUrl="https://www.jameskerr.blog/posts/" xmlUrl="https://www.jameskerr.blog/index.xml"/>
<outline text="James Leighton" type="atom" htmlUrl="https://www.jamesleighton.com/blog/" xmlUrl="https://www.jamesleighton.com/feed/"/>
<outline text="James Mead" type="atom" htmlUrl="https://jamesmead.org/blog/" xmlUrl="https://jamesmead.org/blog/index.xml"/>
<outline text="James Randall" type="rss" htmlUrl="https://www.jamesdrandall.com/posts/" xmlUrl="https://www.jamesdrandall.com/index.xml"/>
<outline text="James Sinclair" type="rss" htmlUrl="http://jrsinclair.com" xmlUrl="https://jrsinclair.com/index.rss"/>
<outline text="James Stanley" type="rss" htmlUrl="https://incoherency.co.uk/blog/" xmlUrl="https://incoherency.co.uk/blog/rss.xml"/>
<outline text="Jamie Crisman" type="rss" htmlUrl="https://longest.voyage/" xmlUrl="https://longest.voyage/index.xml"/>
<outline text="Jamie Lawrence" type="atom" htmlUrl="https://jamie.ideasasylum.com/" xmlUrl="https://jamie.ideasasylum.com/feed.xml"/>
<outline text="Jamie Zawinski" type="rss" htmlUrl="https://www.jwz.org/" xmlUrl="https://cdn.jwz.org/blog/feed/"/>
<outline text="Jan Schaumann" type="rss" htmlUrl="https://www.netmeister.org/blog/index.html" xmlUrl="https://www.netmeister.org/blog/rss.xml"/>
<outline text="Jan Skriver Sørensen" type="rss" htmlUrl="https://monzool.net/blog/" xmlUrl="https://monzool.net/blog/feed/"/>
<outline text="Jan Wildeboer" type="atom" htmlUrl="https://jan.wildeboer.net/" xmlUrl="https://jan.wildeboer.net/feed.xml"/>
<outline text="Jan-Lukas Else" type="rss" htmlUrl="https://janlukas.blog/" xmlUrl="https://janlukas.blog/.rss"/>
<outline text="Jan-Piet Mens" type="rss" htmlUrl="https://jpmens.net" xmlUrl="https://jpmens.net/atom.xml"/>
<outline text="Jarema" type="rss" htmlUrl="https://jarema.me/blog/" xmlUrl="https://jarema.me/rss.xml"/>
<outline text="Jari Komppa" type="rss" htmlUrl="https://solhsa.com/" xmlUrl="https://solhsa.com/rss.xml"/>
<outline text="Jarrod Blundy" type="rss" htmlUrl="https://heydingus.net/blog/" xmlUrl="https://heydingus.net/feed.rss"/>
<outline text="Jason Becker (100+ MB)" type="rss" htmlUrl="https://json.blog/" xmlUrl="https://json.blog/macro/feed.xml"/>
<outline text="Jason Bryer" type="rss" htmlUrl="https://bryer.org/" xmlUrl="https://bryer.org/blog.xml"/>
<outline text="Jason Burk" type="rss" htmlUrl="https://grepjason.sh/" xmlUrl="https://cdn.grepjason.sh/feed.xml"/>
<outline text="Jason Snell" type="rss" htmlUrl="https://sixcolors.com/post/" xmlUrl="https://feedpress.me/sixcolors"/>
<outline text="Jason Tucker" type="rss" htmlUrl="https://jasontucker.blog/" xmlUrl="https://jasontucker.blog/rss/"/>
<outline text="Jason V" type="atom" htmlUrl="https://www.fromjason.xyz/p/notebook/" xmlUrl="https://www.fromjason.xyz/p/notebook/feed/feed.xml"/>
<outline text="Jasper" type="rss" htmlUrl="https://jasper.tandy.is/blogging/" xmlUrl="https://jasper.tandy.is/syndicated"/>
<outline text="Javier Martinez Canillas" type="rss" htmlUrl="https://blog.dowhile0.org" xmlUrl="https://blog.dowhile0.org/feed/"/>
<outline text="Jay Little" type="rss" htmlUrl="https://jaylittle.com/post/" xmlUrl="https://jaylittle.com/post/index.xml"/>
<outline text="JDPFu.com" type="rss" htmlUrl="https://blog.jdpfu.com" xmlUrl="https://blog.jdpfu.com/articles.rss"/>
<outline text="Jeanine Adkisson" type="rss" htmlUrl="https://jneen.ca/blag/" xmlUrl="https://jneen.ca/rss"/>
<outline text="Jeff Bridgforth" type="rss" htmlUrl="https://jeffbridgforth.com/apps-i-use-2023/" xmlUrl="https://jeffbridgforth.com/feed/"/>
<outline text="Jeff Dickey" type="rss" htmlUrl="https://jdx.dev/posts/" xmlUrl="https://jdx.dev/posts/index.xml"/>
<outline text="Jeff Geerling" type="rss" htmlUrl="https://www.jeffgeerling.com/" xmlUrl="https://www.jeffgeerling.com/blog.xml"/>
<outline text="Jeff Sheets" type="rss" htmlUrl="https://sheetsj.com/blog/" xmlUrl="https://sheetsj.com/feed.xml"/>
<outline text="Jeff Triplett" type="rss" htmlUrl="https://jefftriplett.com/" xmlUrl="https://jefftriplett.com/feed.xml"/>
<outline text="Jeffrey Paul" type="rss" htmlUrl="https://sneak.berlin/" xmlUrl="https://sneak.berlin/feed.xml"/>
<outline text="Jeffrey Snover" type="rss" htmlUrl="https://www.jsnover.com/blog/" xmlUrl="https://www.jsnover.com/blog/feed/"/>
<outline text="Jennifer Moore" type="rss" htmlUrl="https://jenniferplusplus.com/" xmlUrl="https://jenniferplusplus.com/rss/"/>
<outline text="Jenny (Phirepheonix)" type="atom" htmlUrl="https://phirephoenix.com/" xmlUrl="https://phirephoenix.com/feed.xml"/>
<outline text="Jens Gustedt" type="rss" htmlUrl="https://gustedt.wordpress.com/" xmlUrl="https://gustedt.wordpress.com/feed/"/>
<outline text="Jeppe Larsen" type="atom" htmlUrl="https://winther.sysctl.dk/blog/" xmlUrl="https://winther.sysctl.dk/feed/"/>
<outline text="Jeremy Cherfas" type="atom" htmlUrl="http://www.jeremycherfas.net/" xmlUrl="https://www.jeremycherfas.net/blog.atom"/>
<outline text="Jeremy Keith" type="rss" htmlUrl="https://adactio.com/articles/" xmlUrl="https://adactio.com/articles/rss"/>
<outline text="Jeroen Sangers" type="rss" htmlUrl="https://jeroensangers.com/" xmlUrl="https://jeroensangers.com/feed.xml"/>
<outline text="Jérôme Marin" type="rss" htmlUrl="https://cafetechinenglish.substack.com/feed" xmlUrl="https://cafetechinenglish.substack.com/feed"/>
<outline text="Jes Olson" type="atom" htmlUrl="https://j3s.sh/" xmlUrl="https://j3s.sh/feed.atom"/>
<outline text="Jesse Sandberg" type="rss" htmlUrl="https://ospi.fi/blog" xmlUrl="https://ospi.fi/blog/rss.xml"/>
<outline text="Jessica Nickelsen" type="rss" htmlUrl="https://discombobulated.co.nz/" xmlUrl="https://discombobulated.co.nz/feed.rss"/>
<outline text="Jim Grey" type="rss" htmlUrl="https://blog.jimgrey.net/" xmlUrl="https://blog.jimgrey.net/feed/"/>
<outline text="Jim Mitchell" type="rss" htmlUrl="https://jimmitchell.org/" xmlUrl="https://jimmitchell.org/feed.xml"/>
<outline text="Jimmy Koppel" type="atom" htmlUrl="https://www.pathsensitive.com/p/" xmlUrl="https://www.pathsensitive.com/feeds/posts/default"/>
<outline text="Jim Nielsen’s Blog" type="rss" htmlUrl="https://blog.jim-nielsen.com" xmlUrl="https://blog.jim-nielsen.com/feed.xml"/>
<outline text="Joel" type="rss" htmlUrl="https://joelchrono.xyz/blog/" xmlUrl="https://joelchrono.xyz/feed.xml"/>
<outline text="Johan Bleuzen" type="rss" htmlUrl="https://www.johanbleuzen.fr/" xmlUrl="https://www.johanbleuzen.fr/feed.xml"/>
<outline text="Johan Halse" type="rss" htmlUrl="https://johan.hal.se/" xmlUrl="https://johan.hal.se/feed.xml"/>
<outline text="Johan Larsson" type="rss" htmlUrl="https://www.johanl.se/blogg/" xmlUrl="https://www.johanl.se/feed.xml"/>
<outline text="Johannes Ebeling" type="rss" htmlUrl="https://technocidal.com/" xmlUrl="https://technocidal.com/feed.xml"/>
<outline text="Johannes Mirus" type="rss" htmlUrl="https://1ppm.de/" xmlUrl="https://1ppm.de/feed/"/>
<outline text="John Calhoun" type="rss" htmlUrl="https://www.engineersneedart.com/" xmlUrl="https://www.engineersneedart.com/rss.xml"/>
<outline text="John D Cook" type="rss" htmlUrl="https://www.johndcook.com/blog/" xmlUrl="https://www.johndcook.com/blog/feed/"/>
<outline text="John Goerzen" type="rss" htmlUrl="https://changelog.complete.org" xmlUrl="https://changelog.complete.org/feed"/>
<outline text="John J Hoare" type="rss" htmlUrl="https://www.dirtyfeed.org/" xmlUrl="https://www.dirtyfeed.org/feed/"/>
<outline text="John Mikael Lindbakk" type="atom" htmlUrl="https://lindbakk.com/blog/" xmlUrl="https://lindbakk.com/blog?format=atom"/>
<outline text="Johnny Noble" type="rss" htmlUrl="https://johnnydecimal.com/" xmlUrl="https://johnnydecimal.com/rss.xml"/>
<outline text="John Ozbay" type="atom" htmlUrl="https://blog.johnozbay.com/" xmlUrl="https://blog.johnozbay.com/feed.xml"/>
<outline text="John Payne" type="rss" htmlUrl="https://jpayne.sackheads.blog/" xmlUrl="https://jpayne.sackheads.blog/feed.xml"/>
<outline text="John Stawinski IV" type="rss" htmlUrl="https://johnstawinski.com/home-2/" xmlUrl="https://johnstawinski.com/feed/"/>
<outline text="jomalo" type="rss" htmlUrl="https://jomalo.com/defaults/" xmlUrl="https://jomalo.com/feed.xml"/>
<outline text="Jon Charter" type="atom" htmlUrl="https://jon.chrt.dev/" xmlUrl="https://jon.chrt.dev/feed.xml"/>
<outline text="Jon Seager" type="rss" htmlUrl="https://jnsgr.uk/" xmlUrl="https://jnsgr.uk/posts/index.xml"/>
<outline text="Jon Udell" type="rss" htmlUrl="https://blog.jonudell.net" xmlUrl="https://blog.jonudell.net/feed/"/>
<outline text="Jonah Aragon" type="rss" htmlUrl="https://www.jonaharagon.com/posts/" xmlUrl="https://www.jonaharagon.com/posts/rss/"/>
<outline text="Jonas Brusman" type="rss" htmlUrl="https://jonas.brusman.se/my-default-apps-at-the-end-of-2023/" xmlUrl="https://jonas.brusman.se/rss.xml"/>
<outline text="Jonas Haslbeck" type="rss" htmlUrl="https://jonashaslbeck.com/" xmlUrl="https://jonashaslbeck.com/feed.xml"/>
<outline text="Jonas Hietala" type="atom" htmlUrl="https://www.jonashietala.se/" xmlUrl="https://www.jonashietala.se/feed.xml"/>
<outline text="Jonas Schäfer" type="atom" htmlUrl="https://jssfr.de/" xmlUrl="https://jssfr.de/feeds/all.atom.xml"/>
<outline text="Dr Jonathan Carroll" type="rss" htmlUrl="https://jcarroll.com.au/" xmlUrl="https://jcarroll.com.au/index.xml"/>
<outline text="Jonathan Frere" type="rss" htmlUrl="https://jonathan-frere.com/" xmlUrl="https://jonathan-frere.com/index.xml"/>
<outline text="Jonathan Y Chan" type="atom" htmlUrl="https://www.jonathanychan.com/blog/" xmlUrl="https://www.jonathanychan.com/atom.xml"/>
<outline text="Jonathan Pallant" type="atom" htmlUrl="https://thejpster.org.uk/" xmlUrl="https://thejpster.org.uk/atom.xml"/>
<outline text="Jonathan Kamens" type="rss" htmlUrl="https://blog.kamens.us/" xmlUrl="https://blog.kamens.us/feed/"/>
<outline text="Jono Alderson" type="rss" htmlUrl="https://www.jonoalderson.com/blog/" xmlUrl="https://www.jonoalderson.com/feed/"/>
<outline text="Joost de Valk" type="rss" htmlUrl="https://joost.blog/" xmlUrl="https://joost.blog/feed.xml"/>
<outline text="Jordan Matelsky" type="rss" htmlUrl="https://blog.jordan.matelsky.com/" xmlUrl="https://blog.jordan.matelsky.com/feed.xml"/>
<outline text="Jorge Sanz" type="rss" htmlUrl="https://jorgesanz.net/posts/" xmlUrl="https://jorgesanz.net/index.xml"/>
<outline text="Jorin's Logbook" type="rss" htmlUrl="https://jorin.me/" xmlUrl="https://jorin.me/index.xml"/>
<outline text="Jose Munoz" type="rss" htmlUrl="https://www.josemunozmatos.com/blog/" xmlUrl="https://www.josemunozmatos.com/blog/rss.xml"/>
<outline text="Josep Bigorra" type="rss" htmlurl="https://jointhefreeworld.org/blog/" xmlurl="https://jointhefreeworld.org/rss.xml"/>
<outline text="Josh Austin" type="rss" htmlUrl="https://joshaustin.tech/" xmlUrl="https://joshaustin.tech/index.xml"/>
<outline text="Josh Betz" type="rss" htmlUrl="https://josh.blog/" xmlUrl="https://josh.blog/feed"/>
<outline text="Josh Bleecher Snyder" type="rss" htmlUrl="https://commaok.xyz/" xmlUrl="https://commaok.xyz/index.xml"/>
<outline text="Josh Byrd" type="atom" htmlUrl="https://josh.is-cool.dev/" xmlUrl="https://josh.is-cool.dev/atom.xml"/>
<outline text="Josh Ginter" type="rss" htmlUrl="https://thenewsprint.co/" xmlUrl="https://thenewsprint.co/rss/"/>
<outline text="Joshua Blais" type="rss" htmlUrl="https://joshblais.com/" xmlUrl="https://joshblais.com/index.xml"/>
<outline text="Joshua Stein" type="rss" htmlUrl="https://jcs.org/" xmlUrl="https://jcs.org/rss"/>
<outline text="Josh Withers" type="rss" htmlUrl="https://joshwithers.blog/" xmlUrl="https://joshwithers.blog/rss.xml"/>
<outline text="J Pieper (mjbots blog)" type="rss" htmlUrl="https://blog.mjbots.com/" xmlUrl="https://blog.mjbots.com/index.xml"/>
<outline text="Juan B Rodriguez" type="rss" htmlUrl="https://jbrio.net/posts/" xmlUrl="https://jbrio.net/posts/rss.xml"/>
<outline text="Juan J Martínez" type="rss" htmlUrl="https://www.usebox.net/jjm/blog/" xmlUrl="https://www.usebox.net/jjm/blog/index.xml"/>
<outline text="Juha-Matti Santala" type="atom" htmlUrl="https://hamatti.org/" xmlUrl="https://hamatti.org/feed/feed.xml"/>
<outline text="Julia Evans" type="rss" htmlUrl="http://jvns.ca" xmlUrl="https://jvns.ca/atom.xml"/>
<outline text="Julian Andres Klode" type="rss" htmlUrl="https://blog.jak-linux.org/" xmlUrl="https://blog.jak-linux.org/index.xml"/>
<outline text="Julian Peters" type="rss" htmlUrl="https://jupe.studio/" xmlUrl="https://jupe.studio/feed.xml"/>
<outline text="Julien Cretel" type="rss" htmlUrl="https://jub0bs.com/posts/" xmlUrl="https://jub0bs.com/posts/index.xml"/>
<outline text="Julik Tarkhanov" type="atom" htmlUrl="https://blog.julik.nl/" xmlUrl="https://blog.julik.nl/feed.atom.xml"/>
<outline text="Juri Linkov" type="rss" htmlUrl="https://jurta.org/" xmlUrl="https://jurta.org/feed.xml"/>
<outline text="Justin Duke" type="atom" htmlUrl="https://www.jmduke.com/" xmlUrl="https://www.jmduke.com/feed.xml"/>
<outline text="Justin Lam" type="rss" htmlUrl="https://www.justinmklam.com/" xmlUrl="https://www.justinmklam.com/index.xml"/>
<outline text="Justin Meiners" type="rss" htmlUrl="https://www.jmeiners.com/" xmlUrl="https://www.jmeiners.com/feed.xml"/>
<outline text="Justin Miller" type="rss" htmlUrl="https://justinmiller.io/posts/" xmlUrl="https://justinmiller.io/posts/index.xml"/>
<outline text="Justin Searls" type="atom" htmlUrl="https://justin.searls.co/" xmlUrl="https://justin.searls.co/atom.xml"/>
<outline text="Justin Vollmer" type="rss" htmlUrl="https://justinvollmer.com/posts/" xmlUrl="https://justinvollmer.com/posts/index.xml"/>
<outline text="Jutty.Dev" type="atom" htmlUrl="https://blog.jutty.dev/" xmlUrl="https://blog.jutty.dev/atom.xml"/>
<outline text="jwb" type="rss" htmlUrl="https://blog.bdw.li/posts/" xmlUrl="https://blog.bdw.li/posts/index.xml"/>
<outline text="夏恺/Kai Xia" type="atom" htmlUrl="https://blog.xiaket.org/archive-en.html" xmlUrl="https://blog.xiaket.org/feed.xml"/>
<outline text="Kane Narraway" type="rss" htmlUrl="https://kanenarraway.com/archives/" xmlUrl="https://kanenarraway.com/index.xml"/>
<outline text="Karl Bartel" type="atom" htmlUrl="https://www.karl.berlin/" xmlUrl="https://www.karl.berlin/atom.xml"/>
<outline text="Karl Bode" type="rss" htmlUrl="https://karlbode.com/" xmlUrl="https://karlbode.com/rss/"/>
<outline text="Kasper Timm Hansen" type="rss" htmlUrl="https://kaspth.com/posts" xmlUrl="https://kaspth.com/posts_feed"/>
<outline text="Kavin Gnanapandithan" type="rss" htmlUrl="https://blog.kaving.me/blog/" xmlUrl="https://blog.kaving.me/blog/index.xml"/>
<outline text="Keenan" type="rss" htmlUrl="https://gkeenan.co/avgb/" xmlUrl="https://gkeenan.co/avgb/feed.xml?format=rss"/>
<outline text="Keith Cirkel" type="rss" htmlUrl="https://www.keithcirkel.co.uk/" xmlUrl="https://www.keithcirkel.co.uk/feed.xml"/>
<outline text="Keith Harrison" type="rss" htmlUrl="https://useyourloaf.com/blog/" xmlUrl="https://useyourloaf.com/blog/rss.xml"/>
<outline text="Kelly Hayes" type="rss" htmlUrl="https://organizingmythoughts.org/" xmlUrl="https://organizingmythoughts.org/rss/"/>
<outline text="Kelson Vibber - new" type="rss" htmlUrl="https://journal.kvibber.com/" xmlUrl="https://journal.kvibber.com/feed/"/>
<!-- moved to kvibber.com
<outline text="Kelson Vibber - old" type="rss" htmlUrl="https://hyperborea.org/journal/" xmlUrl="https://hyperborea.org/journal/feed/"/>
-->
<outline text="Ken Kantzer" type="rss" htmlUrl="https://kenkantzer.com/" xmlUrl="https://kenkantzer.com/feed/"/>
<outline text="Ken Klippenstein" type="rss" htmlUrl="https://www.kenklippenstein.com/" xmlUrl="https://www.kenklippenstein.com/feed"/>
<outline text="Ken Shirriff's blog" type="rss" htmlUrl="http://www.righto.com/" xmlUrl="http://www.righto.com/feeds/posts/default"/>
<outline text="Ken Koon Wong" type="rss" htmlUrl="https://www.kenkoonwong.com/blog/" xmlUrl="https://www.kenkoonwong.com/index.xml"/>
<outline text="Kenneth Finnegan" type="atom" htmlUrl="https://blog.thelifeofkenneth.com/" xmlUrl="https://blog.thelifeofkenneth.com/feeds/posts/default"/>
<outline text="Kenneth Retiz" type="rss" htmlUrl="https://kennethreitz.org/archive" xmlUrl="https://kennethreitz.org/feed.xml"/>
<outline text="Kerrick Long" type="rss" htmlUrl="https://kerrick.blog/" xmlUrl="https://kerrick.blog/feed/"/>
<outline text="Kevin Boone" type="rss" htmlUrl="https://kevinboone.me/" xmlUrl="https://kevinboone.me/feed.xml"/>
<outline text="Kevin Burke" type="rss" htmlUrl="https://kevin.burke.dev" xmlUrl="https://kevin.burke.dev/feed/"/>
<outline text="Kevin C. Tofel" type="rss" htmlUrl="https://myconscious.stream/blog/" xmlUrl="https://myconscious.stream/feed.xml"/>
<outline text="Kevin Kelly" type="rss" htmlUrl="https://kk.org/" xmlUrl="https://feedpress.me/thetechnium"/>
<outline text="Kevin Lawver" type="atom" htmlUrl="https://lawver.net/" xmlUrl="https://lawver.net/feed.xml"/>
<outline text="Kevin Liu" type="rss" htmlUrl="https://kliu.io" xmlUrl="https://kliu.io/feed.xml"/>
<outline text="Kevin McDonald" type="rss" htmlUrl="https://kmcd.dev/posts/" xmlUrl="https://kmcd.dev/posts/index.xml"/>
<outline text="Kevin Wammer" type="rss" htmlUrl="https://overkill.wtf/" xmlUrl="https://overkill.wtf/feed"/>
<outline text="Kev Quirk" type="rss" htmlUrl="https://kevquirk.com" xmlUrl="https://kevquirk.com/feed/"/>
<outline text="Kian Ryan" type="rss" htmlUrl="https://www.kianryan.co.uk/" xmlUrl="https://www.kianryan.co.uk/feed.xml"/>
<outline text="Kiran Chauhan" type="atom" htmlUrl="https://chauhankiran.blogspot.com/feeds/posts/" xmlUrl="https://chauhankiran.blogspot.com/feeds/posts/default"/>
<outline text="Kieran Healy" type="rss" htmlUrl="https://kieranhealy.org/blog/" xmlUrl="https://kieranhealy.org/blog/index.xml"/>
<outline text="Kirill A Korinsky" type="rss" htmlUrl="https://kirill.korins.ky/" xmlUrl="https://kirill.korins.ky/index.xml"/>
<outline text="Kirsty" type="rss" htmlUrl="https://nocto.com/posts/" xmlUrl="https://nocto.com/posts/rss.xml"/>
<outline text="kivikakk.ee" type="rss" htmlUrl="https://kivikakk.ee/" xmlUrl="https://kivikakk.ee/atom.xml"/>
<outline text="Kokada" type="rss" htmlUrl="https://kokada.dev/" xmlUrl="https://kokada.dev/rss/"/>
<outline text="Konstantin Tutsch" type="rss" htmlUrl="https://konstantintutsch.com/" xmlUrl="https://konstantintutsch.com/feed.xml"/>
<outline text="Kristof Zerbe" type="atom" htmlUrl="https://kiko.io/archives/" xmlUrl="https://kunall.is/feed.rs://kiko.io/atom.xml"/>
<outline text="Kush" type="rss" htmlUrl="https://krabf.com/" xmlUrl="https://krabf.com/index.xml"/>
<outline text="Ky Decker" type="rss" htmlUrl="https://ky.fyi/" xmlUrl="https://ky.fyi/rss.xml"/>
<outline text="Kyle Kingsbury" type="atom" htmlUrl="https://aphyr.com/posts/" xmlUrl="https://aphyr.com/posts.atom"/>
<outline text="Kyle E Mitchelk" type="rss" htmlUrl="https://writing.kemitchell.com/" xmlUrl="https://writing.kemitchell.com/feed.xml"/>
<outline text="Kyle Ford" type="rss" htmlUrl="https://houseofkyle.com/" xmlUrl="https://houseofkyle.com/feed/"/>
<outline text="Kyle Reddoch" type="atom" htmlUrl="https://www.kylereddoch.me/blog/" xmlUrl="https://www.kylereddoch.me/feed.xml"/>
<outline text="Kyrylo Silin" type="atom" htmlUrl="https://kyrylo.org/" xmlUrl="https://kyrylo.org/feed.xml"/>
<outline text="Lalit Maganti" type="rss" htmlUrl="https://lalitm.com/" xmlUrl="https://lalitm.com/index.xml"/>
<outline text="Larry Bank" type="rss" htmlUrl="https://bitbanksoftware.blogspot.com/" xmlUrl="https://bitbanksoftware.blogspot.com/rss.xml"/>
<outline text="Lars Thießen" type="rss" htmlUrl="https://larstofus.com/" xmlUrl="ihttps://larstofus.com/feed."/>
<outline text="Laurence Tratt" type="rss" htmlUrl="https://tratt.net" xmlUrl="https://tratt.net/laurie/blog/blog.rss"/>
<outline text="L Carlos Pando" type="rss" htmlUrl="https://blog.luiscarlospando.com/personal/" xmlUrl="https://blog.luiscarlospando.com/feed/"/>
<outline text="Lea Verou" type="atom" htmlUrl="https://lea.verou.me/blog/" xmlUrl="https://lea.verou.me/feed.xml"/>
<outline text="Lean Rada" type="rss" htmlUrl="https://leanrada.com/" xmlUrl="https://leanrada.com/rss.xml"/>
<outline text="Lee Peterson" type="rss" htmlUrl="https://ljpuk.net/" xmlUrl="https://ljpuk.net/feed/"/>
<outline text="Lee YintongLi" type="rss" htmlUrl="https://yingtongli.me/blog/" xmlUrl="https://yingtongli.me/blog/feed.xml"/>
<outline text="Leo Robinovitch" type="rss" htmlUrl="https://theleo.zone/" xmlUrl="https://theleo.zone/index.xml"/>
<outline text="Leon Furze" type="rss" htmlUrl="https://leonfurze.com/blog/" xmlUrl="https://leonfurze.com/blog/feed/"/>
<outline text="Leon Mika" type="rss" htmlUrl="https://lmika.org/" xmlUrl="https://lmika.org/feed.xml"/>
<outline text="Lesley Lai 赖思理" type="rss" htmlUrl="https://lesleylai.info/en/blog/" xmlUrl="https://lesleylai.info/rss.xml"/>
<outline text="Lev Lazinskiy" type="rss" htmlUrl="https://levlaz.org/" xmlUrl="https://levlaz.org/index.xml"/>
<outline text="Light Blue Touchpaper" type="rss" htmlUrl="https://www.lightbluetouchpaper.org" xmlUrl="https://www.lightbluetouchpaper.org/feed/"/>
<outline text="Linus Heckemann" type="rss" htmlUrl="https://linus.schreibt.jetzt/" xmlUrl="https://linus.schreibt.jetzt/feed.rss"/>
<outline text="Linus Åkesson" type="rss" htmlUrl="http://www.linusakesson.net/" xmlUrl="http://www.linusakesson.net/rssfeed.php"/>
<outline text="LinuxJedi" type="rss" htmlUrl="https://linuxjedi.co.uk" xmlUrl="https://linuxjedi.co.uk/feed/"/>
<outline text="Logikal Solutions" type="rss" htmlUrl="https://www.logikalsolutions.com/wordpress/" xmlUrl="https://www.logikalsolutions.com/wordpress/feed/"/>
<outline text="Loïc Carr" type="rss" htmlUrl="https://dimtion.fr/blog/" xmlUrl="https://dimtion.fr/atom.xml"/>
<outline text="Loris Cro" type="rss" htmlUrl="https://kristoff.it/" xmlUrl="https://kristoff.it/index.xml"/>
<outline text="Lost In Haste" type="rss" htmlUrl="https://lostinhaste.com/" xmlUrl="https://lostinhaste.com/feed.xml"/>
<outline text="Louie Mantia" type="atom" htmlUrl="https://lmnt.me/blog/" xmlUrl="https://lmnt.me/feed.xml"/>
<outline text="Lou Plummer" type="atom" htmlUrl="https://louplummer.lol/" xmlUrl="https://louplummer.lol/feed.atom/"/>
<outline text="Loup Vaillant" type="atom" htmlUrl="https://loup-vaillant.fr/" xmlUrl="https://loup-vaillant.fr/updates"/>
<outline text="Loura" type="rss" htmlUrl="https://heyloura.com/" xmlUrl="https://heyloura.com/feed.xml"/>
<outline text="Louwrentius" type="atom" htmlUrl="https://louwrentius.com/" xmlUrl="https://louwrentius.com/feed/all.atom.xml"/>
<outline text="Lucas" type="rss" htmlUrl="https://lucas.art/blog/" xmlUrl="https://lucas.art/rss"/>
<outline text="Luigi Mozzillo" type="rss" htmlUrl="https://mzll.it/posts/" xmlUrl="https://mzll.it/index.xml"/>
<outline text="Luis Quintanilla" type="rss" htmlUrl="https://lqdev.me/" xmlUrl="https://lqdev.me/posts/feed.xml"/>
<outline text="Lukáš Lalinský" type="atom" htmlUrl="https://lalinsky.com/" xmlUrl="https://lalinsky.com/feed.xml"/>
<outline text="Luke Harris" type="rss" htmlUrl="https://www.lkhrs.com/blog/" xmlUrl="https://www.lkhrs.com/blog/rss/"/>
<outline text="Lyokolux" type="rss" htmlUrl="https://blog.lyokolux.space/posts/" xmlUrl="https://blog.lyokolux.space/rss.xml"/>
<outline text="Maarten" type="rss" htmlUrl="https://www.filmvanalledag.nl/" xmlUrl="https://www.filmvanalledag.nl/feed/"/>
<outline text="Maarten van Gompel" type="rss" htmlUrl="https://proycon.anaproy.nl/posts/" xmlUrl="https://proycon.anaproy.nl/rss.xml"/>
<outline text="Maique" type="rss" htmlUrl="https://maique.eu/" xmlUrl="https://maique.eu/posts_feed"/>
<outline text="Mairo Rufus" type="rss" htmlUrl="https://rmpr.github.io/" xmlUrl="https://rmpr.xyz/feed.xml"/>
<outline text="Malcolm Matalka" type="rss" htmlUrl="https://pid1.dev/posts/" xmlUrl="https://pid1.dev/posts/feed.xml"/>
<outline text="Mandaris" type="rss" htmlUrl="https://mandarismoore.com/" xmlUrl="https://mandarismoore.com/feed.xml"/>
<outline text="Mandy Brown 1" type="atom" htmlUrl="https://aworkinglibrary.com/" xmlUrl="https://aworkinglibrary.com/feed/index.xml"/>
<outline text="Mandy Brown 2" type="atom" htmlUrl="https://everythingchanges.us/blog/" xmlUrl="https://everythingchanges.us/feed.xml"/>
<outline text="Manton Reece" type="rss" htmlUrl="https://www.manton.org/" xmlUrl="https://www.manton.org/feed.xml"/>
<outline text="Manuel Matuzović" type="rss" htmlUrl="https://www.matuzo.at" xmlUrl="https://www.matuzo.at/feed.xml"/>
<outline text="Manuel Moreale" type="rss" htmlUrl="https://manuelmoreale.com/" xmlUrl="https://manuelmoreale.com/feed/rss"/>
<outline text="Marc Brooker" type="rss" htmlUrl="https://brooker.co.za/blog/" xmlUrl="https://brooker.co.za/blog/rss.xml"/>
<outline text="Marcel Kapfer" type="rss" htmlUrl="https://mmk2410.org/" xmlUrl="https://mmk2410.org/blog.rss"/>
<outline text="Marco" type="rss" htmlUrl="https://mb.esamecar.net/" xmlUrl="https://mb.esamecar.net/feed.xml"/>
<outline text="Marco Roth" type="atom" htmlUrl="https://marcoroth.dev/blog/" xmlUrl="https://marcoroth.dev/feed.xml"/>
<outline text="Marc" type="rss" htmlUrl="https://marcamos.com/journal/" xmlUrl="https://marcamos.com/journal/feed.xml"/>
<outline text="Marcus Buffett" type="rss" htmlUrl="https://mbuffett.com/posts/" xmlUrl="https://mbuffett.com/posts/index.xml"/>
<outline text="Marijke Luttekes" type="atom" htmlUrl="https://marijkeluttekes.dev/blog/" xmlUrl="https://marijkeluttekes.dev/blog/atom/"/>
<outline text="Marian Bouček" type="rss" htmlUrl="https://boucek.me/" xmlUrl="https://www.boucek.me/index.xml"/>
<outline text="Mario Zechner" type="rss" htmlUrl="https://mariozechner.at/" xmlUrl="https://mariozechner.at/rss.xml"/>
<outline text="Marisa Kabas" type="rss" htmlUrl="https://www.thehandbasket.co/" xmlUrl="https://rss.beehiiv.com/feeds/40ZQ7CSldT.xml"/>
<outline text="Marius" type="rss" htmlUrl="https://blog.xaner.dev/post/" xmlUrl="https://blog.xaner.dev/index.xml"/>
<outline text="Mariusz Zaborski" type="rss" htmlUrl="https://www.oshogbo.com/blog/83/" xmlUrl="https://feeds.feedburner.com/oshogbo"/>
<outline text="Mark Dastmalchi-Round" type="atom" htmlUrl="https://www.markround.com/" xmlUrl="https://www.markround.com/feed.xml"/>
<outline text="Mark Hysted" type="rss" htmlUrl="https://mark.hysted.com/" xmlUrl="https://mark.hysted.com/feehttps://mark.hysted.com/feed"/>
<outline text="Mark Nottingham" type="rss" htmlUrl="https://www.mnot.net/blog/" xmlUrl="https://mnot.net/blog/index.atom"/>
<outline text="Mark Phillips" type="rss" htmlUrl="https://probably.co.uk/posts/" xmlUrl="https://probably.co.uk/index.xml"/>
<outline text="Martijn Braam" type="rss" htmlUrl="https://blog.brixit.nl/" xmlUrl="https://blog.brixit.nl/rss/"/>
<outline text="Martijn Faassen" type="atom" htmlUrl="https://blog.startifact.com/posts/" xmlUrl="https://blog.startifact.com/atom.xml"/>
<outline text="Martin Alderson" type="rss" htmlUrl="https://martinalderson.com/" xmlUrl="https://martinalderson.com/feed.xml"/>
<outline text="Martin Chang" type="atom" htmlUrl="https://clehaxze.tw/" xmlUrl="https://clehaxze.tw/atom.xml"/>
<outline text="Martin Feld" type="rss" htmlUrl="https://loungeruminator.net/" xmlUrl="https://loungeruminator.net/feed/"/>
<outline text="Martin Fowler" type="atom" htmlUrl="https://martinfowler.com/" xmlUrl="https://martinfowler.com/feed.atom"/>
<outline text="Martin Gunnarsson" type="rss" htmlUrl="https://www.martingunnarsson.com/posts/" xmlUrl="https://www.martingunnarsson.com/feed-rss.xml"/>
<outline text="Martin Hähnel" type="rss" htmlUrl="https://blog.martin-haehnel.de/" xmlUrl="https://blog.martin-haehnel.de/feed.xml"/>
<outline text="Martin Schneider" type="rss" htmlUrl="https://www.dertagundich.de/" xmlUrl="https://www.dertagundich.de/feed"/>
<outline text="Martin Stransky" type="rss" htmlUrl="https://mastransky.wordpress.com/" xmlUrl="https://mastransky.wordpress.com/feed/"/>
<outline text="Marty Day" type="rss" htmlUrl="https://www.blast-o-rama.com/" xmlUrl="https://blast-o-rama.com/feed/"/>
<outline text="Maryanne Wachter" type="atom" htmlUrl="https://mclare.blog/" xmlUrl="https://mclare.blog/feed.atom"/>
<outline text="Mathieu Aumont" type="atom" htmlUrl="https://aumont.fr/posts/" xmlUrl="https://aumont.fr/feed/feed.xml"/>
<outline text="Matheus Lima" type="rss" htmlUrl="https://terriblesoftware.org/" xmlUrl="https://terriblesoftware.org/feed/"/>
<outline text="Mathieu" type="atom" htmlUrl="http://blog.mathieui.net/" xmlUrl="https://blog.mathieui.net/feeds/all.atom.xml"/>
<outline text="Matt Birchler" type="rss" htmlUrl="https://birchtree.me/blog/my-default-apps-at-the-end-of-2023/" xmlUrl="https://birchtree.me/rss/"/>
<outline text="Matt Blewitt" type="rss" htmlUrl="https://matt.blwt.io/post/" xmlUrl="https://matt.blwt.io/post/index.xml"/>
<outline text="Matt Cool" type="rss" htmlUrl="https://mattcool.tech/posts/" xmlUrl="https://mattcool.tech/rss.xml"/>
<outline text="Matt Fantinel" type="rss" htmlUrl="https://fantinel.dev/" xmlUrl="https://fantinel.dev/rss.xml"/>
<outline text="Matt Gemmell" type="rss" htmlUrl="https://mattgemmell.scot/blog/" xmlUrl="https://mattgemmell.scot/atom-articles.xml"/>
<outline text="Matt Godbolt" type="atom" htmlUrl="https://xania.org/" xmlUrl="https://xania.org/feed.atom"/>
<outline text="Matt Webb" type="rss" htmlUrl="http://interconnected.org/home" xmlUrl="https://interconnected.org/home/feed"/>
<outline text="Matthew Brunelle" type="rss" htmlUrl="https://blog.matthewbrunelle.com/" xmlUrl="https://blog.matthewbrunelle.com/rss/"/>
<outline text="Matthew Duggan" type="rss" htmlUrl="https://matduggan.com/" xmlUrl="https://matduggan.com/rss/"/>
<outline text="Matthew Ernisse" type="rss" htmlUrl="https://www.going-flying.com/blog/" xmlUrl="https://www.going-flying.com/blog/feed.xml"/>
<outline text="Matthew Lamont" type="rss" htmlUrl="https://techtea.io/articles/" xmlUrl="https://techtea.io/index.xml"/>
<outline text="Matthew Weber" type="rss" htmlUrl="https://mtwb.blog/" xmlUrl="https://mtwb.blog/index.xml"/>
<outline text="Matthias" type="rss" htmlUrl="https://blog.tenstral.net/" xmlUrl="https://blog.tenstral.net/feed"/>
<outline text="Matthias Ott" type="rss" htmlUrl="https://newsletter.ownyourweb.site/" xmlUrl="https://newsletter.ownyourweb.site/rss.xml"/>
<outline text="Matthias Wrocklin" type="atom" htmlUrl="https://matthewrocklin.com/" xmlUrl="https://matthewrocklin.com/atom.xml"/>
<outline text="Matthias Zöchling" type="rss" htmlUrl="https://cssence.com/articles/" xmlUrl="https://cssence.com/articles/rss.xml"/>
<outline text="Matthias Monroy" type="rss" htmlUrl="https://digit.site36.net" xmlUrl="https://digit.site36.net/feed/"/>
<outline text="Matt Ehler" type="rss" htmlUrl="https://mrehler.com/" xmlUrl="https://mrehler.com/feed/"/>
<outline text="Matt Keeter" type="rss" htmlUrl="https://mattkeeter.com" xmlUrl="https://www.mattkeeter.com/atom.xml"/>
<outline text="Matt Langford" type="rss" htmlUrl="https://mattlangford.com/" xmlUrl="https://mattlangford.com/posts_feed"/>
<outline text="Matt Stein" type="rss" htmlUrl="https://mattstein.com/thoughts/" xmlUrl="https://mattstein.com/rss.xml"/>
<outline text="Matt Routley" type="rss" htmlUrl="https://matt.routleynet.org/" xmlUrl="https://matt.routleynet.org/feed.xml"/>
<outline text="Matt" type="rss" htmlUrl="https://www.wyrd.systems/" xmlUrl="https://www.wyrd.systems/posts_feed"/>
<outline text="Max Bernstein" type="rss" htmlUrl="https://bernsteinbear.com/blog/" xmlUrl="https://bernsteinbear.com/feed.xml"/>
<outline text="Max Leibman" type="rss" htmlUrl="https://www.overmorrow.tech/" xmlUrl="https://www.overmorrow.tech/rss/"/>
<outline text="Max Leiter" type="rss" htmlUrl="https://maxleiter.com/" xmlUrl="https://maxleiter.com/feed.xml"/>
<outline text="Max Seelemann" type="rss" htmlUrl="https://macguru.dev/" xmlUrl="https://macguru.dev/rss/"/>
<outline text="Max Sommer" type="rss" htmlUrl="https://maxsommer.de/blog/" xmlUrl="https://maxsommer.de/blog/feed/rss"/>
<!-- deceased -->
<outline text="mb" type="rss" htmlUrl="https://jarunmb.com/" xmlUrl="https://jarunmb.com/posts_feed"/>
<outline text="Meadowhawk" type="rss" htmlUrl="https://blog.meadowhawk.xyz/category/blog.html" xmlUrl="https://blog.meadowhawk.xyz/feeds/rss.xml"/>
<outline text="Mediocregopher" type="rss" htmlUrl="https://mediocregopher.com/" xmlUrl="https://mediocregopher.com/feed.xml"/>
<outline text="MereCivilian" type="rss" htmlUrl="https://merecivilian.com/" xmlUrl="https://merecivilian.com/rss/"/>
<outline text="Meta Redux" type="rss" htmlUrl="https://metaredux.com/" xmlUrl="https://metaredux.com/feed.xml"/>
<outline text="Michaël" type="rss" htmlUrl="https://r.iresmi.net/" xmlUrl="https://r.iresmi.net/index.xml"/>
<outline text="Michael Burkhardt - 1" type="atom" htmlUrl="https://mihobu.lol/" xmlUrl="https://mihobu.lol/atom.xml"/>
<outline text="Michael Burkhardt - 2" type="atom" htmlUrl="https://mihobu.net/" xmlUrl="https://mihobu.net/atom.xml"/>
<outline text="Michael Gale" type="rss" htmlUrl="https://www.michaelgale.dev/" xmlUrl="https://www.michaelgale.dev/feed.xml"/>
<outline text="Michael Geist" type="rss" htmlUrl="https://www.michaelgeist.ca/" xmlUrl="https://www.michaelgeist.ca/feed/"/>
<outline text="Michael Green" type="rss" htmlUrl="https://www.yesigiveafig.com/" xmlUrl="https://www.yesigiveafig.com/feed"/>
<outline text="Michael Greenberg" type="rss" htmlUrl="https://blog.greenberg.science/" xmlUrl="https://blog.greenberg.science/rss.xml"/>
<outline text="Michael Kjörling" type="rss" htmlUrl="https://michael.kjorling.se/" xmlUrl="https://michael.kjorling.se/feeds/fulltext.xml"/>
<outline text="Michael Kohl" type="rss" htmlUrl="https://citizen428.net/" xmlUrl="https://citizen428.net/index.xml"/>
<outline text="Michael Stapelberg" type="rss" htmlUrl="https://michael.stapelberg.ch/" xmlUrl="https://michael.stapelberg.ch/feed.xml"/>
<outline text="Michael Taggart" type="atom" htmlUrl="https://taggart-tech.com/" xmlUrl="https://taggart-tech.com/atom.xml"/>
<outline text="Michael Tsai" type="rss" htmlUrl="https://mjtsai.com/blog/" xmlUrl="https://mjtsai.com/blog/feed/"/>
<outline text="Michael Winston Dales" type="rss" htmlUrl="https://digitalflapjack.com/blog/" xmlUrl="https://digitalflapjack.com/blog/index.xml"/>
<outline text="Michał Woźniak" type="rss" htmlUrl="https://rys.io/" xmlUrl="https://rys.io/en/feed.rss"/>
<outline text="Michal Zelazny" type="rss" htmlUrl="https://www.michalzelazny.com/joining-the-party/" xmlUrl="https://www.michalzelazny.com/feed/"/>
<outline text="Miguel Batista" type="atom" htmlUrl="https://www.testingbranch.com/" xmlUrl="https://www.testingbranch.com/feed.xml"/>
<outline text="Miguel Grinberg" type="rss" htmlUrl="https://blog.miguelgrinberg.com/" xmlUrl="https://blog.miguelgrinberg.com/feed"/>
<outline text="Miguel Young de la Sota" type="atom" htmlUrl="https://mcyoung.xyz/" xmlUrl="https://mcyoung.xyz/atom.xml"/>
<outline text="Mikael Hansson" type="atom" htmlUrl="https://oxcrag.net/" xmlUrl="https://oxcrag.net/feed.xml"/>
<outline text="Mikael Zayenz Lagerkvist" type="rss" htmlUrl="https://zayenz.se/" xmlUrl="https://zayenz.se/rss.xml"/>
<outline text="Mike Belousov" type="rss" htmlUrl="https://mikemikeb.com/blog/" xmlUrl="https://mikemikeb.com/rss.xml"/>
<outline text="Mike Brock" type="rss" htmlUrl="https://www.notesfromthecircus.com/" xmlUrl="https://www.notesfromthecircus.com/feed"/>
<outline text="Mike Rockwell" type="rss" htmlUrl="https://initialcharge.net/" xmlUrl="https://initialcharge.net/feed/"/>
<outline text="Mike Swanson" type="rss" htmlUrl="https://blog.mikeswanson.com/" xmlUrl="https://blog.mikeswanson.com/feed/"/>
<outline text="Mira Welnar" type="atom" htmlUrl="https://mirawelner.com/all_posts.html" xmlUrl="https://mirawelner.com/atom.xml"/>
<outline text="Miod Vallat" type="rss" htmlUrl="http://miod.online.fr/" xmlUrl="http://miod.online.fr/rss.xml"/>
<outline text="Mitchell Hashimoto" type="rss" htmlUrl="https://mitchellh.com/" xmlUrl="https://mitchellh.com/feed.xml"/>
<outline text="Laura Fisher (mitten)" type="atom" htmlUrl="https://mitten.lol/" xmlUrl="https://mitten.lol/feed/feed.xml"/>
<outline text="MJ Fransen" type="rss" htmlUrl="http://box.matto.nl/index.html" xmlUrl="http://box.matto.nl/index.xml"/>
<outline text="Modus Create LLC" type="rss" htmlUrl="https://www.tweag.io/blog/" xmlUrl="https://www.tweag.io/rss.xml"/>
<outline text="Molly White" type="rss" htmlUrl="https://www.citationneeded.news/" xmlUrl="https://www.citationneeded.news/rss/"/>
<outline text="Mond" type="rss" htmlUrl="https://herecomesthemoon.net/posts/" xmlUrl="https://herecomesthemoon.net/posts/index.xml"/>
<outline text="Monroe Clinton" type="rss" htmlUrl="https://monroeclinton.com/" xmlUrl="https://monroeclinton.com/index.xml"/>
<outline text="Morten Linderud" type="rss" htmlUrl="https://linderud.dev/blog/" xmlUrl="https://linderud.dev/blog/index.xml"/>
<outline text="Moved by Freedom – Powered by Standards" type="rss" htmlUrl="http://standardsandfreedom.net" xmlUrl="http://standardsandfreedom.net/index.php/feed/"/>
<outline text="Mozilla Research" type="rss" htmlUrl="https://research.mozilla.org/" xmlUrl="https://research.mozilla.org/feed/"/>
<outline text="Mt Front" type="rss" htmlUrl="https://blog.douchi.space/" xmlUrl="https://blog.douchi.space/index.xml"/>
<outline text="Murtuzaali Surti" type="rss" htmlUrl="https://syntackle.com/blog/" xmlUrl="https://syntackle.com/feed.xml"/>
<outline text="n3wjack" type="rss" htmlUrl="https://n3wjack.net/" xmlUrl="https://n3wjack.net/feed/"/>
<outline text="N A Ferrell" type="rss" htmlUrl="https://thenewleafjournal.com/" xmlUrl="https://thenewleafjournal.com/feed/"/>
<outline text="N Recursions" type="atom" htmlUrl="https://nrecursions.blogspot.com/" xmlUrl="https://nrecursions.blogspot.com/feeds/posts/default"/>
<outline text="Naeem Noor" type="rss" htmlUrl="https://naeemnur.com/blog/" xmlUrl="https://naeemnur.com/feed/"/>
<outline text="Naman Sood" type="rss" htmlUrl="https://prose.nsood.in" xmlUrl="https://prose.nsood.in/rss.xml"/>
<outline text="Namanyay Goel" type="atom" htmlUrl="https://nmn.gl/blog/" xmlUrl="https://nmn.gl/blog/feed"/>
<outline text="Nat Bennett" type="rss" htmlUrl="https://www.simplermachines.com/" xmlUrl="https://www.simplermachines.com/rss/"/>
<outline text="Nate Graham" type="rss" htmlUrl="https://pointieststick.com/feed/" xmlUrl="https://pointieststick.com/feed/"/>
<outline text="Nate" type="rss" htmlUrl="https://nate.mecca1.net/posts/" xmlUrl="https://nate.mecca1.net/index.xml"/>
<outline text="Nathaniel Daught" type="atom" htmlUrl="https://daught.me/blog/" xmlUrl="https://daught.me/feed/feed.xml"/>
<outline text="Nathaniel J Borenstein" type="rss" htmlUrl="http://theviewfromguppylake.blogspot.com/" xmlUrl="http://theviewfromguppylake.blogspot.com/feeds/posts/default"/>
<outline text="Nathan Dyer" type="rss" htmlUrl="https://nathandyer.me/" xmlUrl="https://nathandyer.me/feed.xml"/>
<outline text="Nathan Knowler" type="rss" htmlUrl="https://knowler.dev/blog" xmlUrl="https://knowler.dev/feed.xml"/>
<outline text="Nathan Snelgrove" type="rss" htmlUrl="https://nathansnelgrove.com/" xmlUrl="https://nathansnelgrove.com/feeds/writing.atom"/>
<outline text="Nathan Upchurch" type="rss" htmlUrl="https://nathanupchurch.com/" xmlUrl="https://nathanupchurch.com/feed/feed.xml"/>
<outline text="Naty" type="rss" htmlUrl="https://burgeonlab.com/blog/" xmlUrl="https://burgeonlab.com/index.xml"/>
<outline text="Naz Hamid" type="atom" htmlUrl="https://nazhamid.com/f" xmlUrl="https://nazhamid.com/feed.xml"/>
<outline text="Ned Batchelder" type="rss" htmlUrl="https://nedbatchelder.com/blog/" xmlUrl="https://nedbatchelder.com/blog/rss.xml"/>
<outline text="Neil Macy" type="rss" htmlUrl="https://www.neilmacy.co.uk/blog/app-defaults" xmlUrl="https://www.neilmacy.co.uk/feed.rss"/>
<outline text="Neil Selwyn" type="rss" htmlUrl="https://criticaledtech.com" xmlUrl="https://criticaledtech.com/feed/"/>
<outline text="Neritam" type="rss" htmlUrl="https://en.neritam.com/" xmlUrl="https://en.neritam.com/feed/"/>
<outline text="Ness Labs" type="rss" htmlUrl="https://nesslabs.com/" xmlUrl="https://nesslabs.com/feed"/>
<outline text="Nibble Stew" type="rss" htmlUrl="https://nibblestew.blogspot.com/" xmlUrl="https://nibblestew.blogspot.com/feeds/posts/default"/>
<outline text="Nic Chan" type="atom" htmlUrl="https://www.nicchan.me/blog/" xmlUrl="https://www.nicchan.me/feed.xml"/>
<outline text="Nicholas Tietz-Sokolsky" type="atom" htmlUrl="https://ntietz.com" xmlUrl="https://ntietz.com/atom.xml"/>
<outline text="Nico Cartron" type="rss" htmlUrl="https://www.ncartron.org/" xmlUrl="https://www.ncartron.org/feed.rss"/>
<outline text="Nicola Losito" type="atom" htmlUrl="https://scribbles.page/nicola/" xmlUrl="https://scribbles.page/nicola/feed.atom"/>
<outline text="Nicolas Devenet" type="rss" htmlUrl="https://www.nicolas.pm/" xmlUrl="https://www.nicolas.pm/feed/atom"/>
<outline text="Nicolas F R A Prado" type="atom" htmlUrl="https://nfraprado.net/" xmlUrl="https://nfraprado.net/pages/feeds/all.atom.xml"/>
<outline text="Nicolas Fella" type="atom" htmlUrl="https://nicolasfella.de/posts/" xmlUrl="https://nicolasfella.de/posts/atom.xml"/>
<outline text="Nicolas Fränkel" type="rss" htmlUrl="https://blog.frankel.ch/" xmlUrl="https://blog.frankel.ch/feed.xml"/>
<outline text="Nicolas Magand" type="rss" htmlUrl="https://thejollyteapot.com/" xmlUrl="https://thejollyteapot.com/feed.rss/"/>
<outline text="Nick" type="rss" htmlUrl="https://nickvsnetworking.com/" xmlUrl="https://nickvsnetworking.com/feed/"/>
<outline text="Nick Heer" type="rss" htmlUrl="https://pxlnv.com/" xmlUrl="https://feedpress.me/pxlnv"/>
<outline text="Nick Miller" type="atom" htmlUrl="https://nickmonad.blog/" xmlUrl="https://nickmonad.blog/atom.xml"/>
<outline text="Niel Madden" type="rss" htmlUrl="https://neilmadden.blog/" xmlUrl="https://neilmadden.blog/feed/"/>
<outline text="Niels Cautaerts" type="atom" htmlUrl="https://nielscautaerts.xyz/blog_archive.html" xmlUrl="https://nielscautaerts.xyz/feeds/all.atom.xml"/>
<outline text="Niels Provos" type="rss" htmlUrl="https://www.provos.org/" xmlUrl="https://www.provos.org/index.xml"/>
<outline text="Nikhil's blog" type="rss" htmlUrl="https://nikhilism.com/post/" xmlUrl="https://nikhilism.com/post/index.xml"/>
<outline text="Nikhil Anand" type="atom" htmlUrl="https://nikhil.io/" xmlUrl="https://nikhil.io/feed.xml"/>
<outline text="Nikhil Jha" type="rss" htmlUrl="https://nikhiljha.com/" xmlUrl="https://nikhiljha.com/rss.xml"/>
<outline text="Nikhil Suresh" type="rss" htmlUrl="https://ludic.mataroa.blog/" xmlUrl="https://ludic.mataroa.blog/rss/"/>
<outline text="Nikita Lapkov" type="rss" htmlUrl="https://laplab.me/" xmlUrl="https://laplab.me/posts/index.xml"/>
<outline text="Niklas Oberhuber" type="atom" htmlUrl="https://obrhubr.org/" xmlUrl="https://obrhubr.org/feed.xml"/>
<outline text="Nikola Kotur" type="rss" htmlUrl="https://nikola.kotur.org/" xmlUrl="https://nikola.kotur.org/feed/"/>
<outline text="Niko Kultalahti" type="rss" htmlUrl="https://nikokultalahti.com/posts/" xmlUrl="https://nikokultalahti.com/feed.xml"/>
<outline text="Noah Bailey" type="rss" htmlUrl="https://nbailey.ca/post/" xmlUrl="https://nbailey.ca/post/index.xml"/>
<outline text="Noah Jacobus" type="rss" htmlUrl="https://noahjacob.us/words/" xmlUrl="https://www.noahjacob.us/feed.xml"/>
<outline text="Noah Liebman" type="rss" htmlUrl="https://noahliebman.net/" xmlUrl="https://noahliebman.net/feed/index.xml"/>
<outline text="Noah Petherbridgen" type="atom" htmlUrl="https://www.kirsle.net/" xmlUrl="https://www.kirsle.net/blog.atom"/>
<outline text="Noë Flatreaud" type="atom" htmlUrl="https://nflatrea.bearblog.dev/blog/" xmlUrl="https://nflatrea.bearblog.dev/feed/"/>
<outline text="Noel Rappin" type="atom" htmlUrl="https://noelrappin.com/blog/" xmlUrl="https://noelrappin.com/rss.xml"/>
<outline text="Nolan Lawson" type="rss" htmlUrl="https://nolanlawson.com" xmlUrl="https://nolanlawson.com/feed/"/>
<outline text="Nolen Royalty" type="atom" htmlUrl="https://eieio.games/blog/" xmlUrl="https://eieio.games/feed.xml"/>
<outline text="Norbert Preining" type="rss" htmlUrl="https://www.preining.info/blog" xmlUrl="https://www.preining.info/blog/feed/"/>
<outline text="Numeric Citizen" type="rss" htmlUrl="https://blog.numericcitizen.me/" xmlUrl="https://blog.numericcitizen.me/feed.xml"/>
<outline text="NVISO Labs" type="rss" htmlUrl="https://blog.nviso.eu" xmlUrl="https://blog.nviso.eu/feed/"/>
<outline text="Olaf Alders" type="rss" htmlUrl="https://www.olafalders.com/" xmlUrl="https://www.olafalders.com/index.xml"/>
<outline text="Old Vintage Computing Research" type="rss" htmlUrl="https://oldvcr.blogspot.com/" xmlUrl="https://oldvcr.blogspot.com/feeds/posts/default"/>
<outline text="Ollin Boer Bohan" type="rss" htmlUrl="http://www.madebyoll.in/" xmlUrl="https://madebyoll.in/rss.xml"/>
<outline text="Onmar Roth" type="atom" htmlUrl="https://omar.yt/" xmlUrl="https://omar.yt/atom.xml"/>
<outline text="Ondrej Sevcik" type="rss" htmlUrl="https://ondrejsevcik.com/blog/" xmlUrl="https://ondrejsevcik.com/rss.xml"/>
<outline text="Oona Räisänen" type="rss" htmlUrl="https://www.windytan.com/p/posts.html" xmlUrl="https://www.windytan.com/feeds/posts/default?alt=rss"/>
<outline text="Orhun Parmaksız" type="rss" htmlUrl="https://blog.orhun.dev/" xmlUrl="https://blog.orhun.dev/rss.xml"/>
<outline text="Orson R L Peters" type="atom" htmlUrl="https://orlp.net/blog/" xmlUrl="https://orlp.net/blog/atom.xml"/>
<outline text="Oskar Wickström" type="atom" htmlUrl="https://wickstrom.tech/" xmlUrl="https://wickstrom.tech/feed.xml"/>
<outline text="Osservatorio Nessuno" type="rss" htmlUrl="https://osservatorionessuno.org/blog/" xmlUrl="https://osservatorionessuno.org/blog/index.xml"/>
<outline text="Otávio Cordeiro" type="rss" htmlUrl="https://otavio.cc/" xmlUrl="https://otavio.cc/posts_feed"/>
<outline text="Panagiotis Vryonis" type="" htmlUrl="https://blog.vrypan.net/" xmlUrl="https://blog.vrypan.net/rss-en.xml"/>
<outline text="Paolo Melchiorre" type="rss" htmlUrl="https://www.paulox.net/" xmlUrl="https://www.paulox.net/feed.xml"/>
<outline text="ParanoidPenguin" type="rss" htmlUrl="https://blog.paranoidpenguin.net/" xmlUrl="https://blog.paranoidpenguin.net/posts/index.xml"/>
<outline text="Paris Buttfield-Addison" type="rss" htmlUrl="https://hey.paris/all-posts/" xmlUrl="https://hey.paris/index.xml"/>
<outline text="paritybit.ca - What's New" type="rss" htmlUrl="https://www.paritybit.ca" xmlUrl="https://www.paritybit.ca/feed.xml"/>
<outline text="Patricia Aas" type="atom" htmlUrl="https://patricia.no/" xmlUrl="https://patricia.no/feed.xml"/>
<outline text="Patrick Breyer" type="rss" htmlUrl="https://www.patrick-breyer.de" xmlUrl="https://www.patrick-breyer.de/feed/?lang=en"/>
<outline text="Paul Gross" type="atom" htmlUrl="https://www.pgrs.net/" xmlUrl="http://feeds.feedburner.com/pgrs"/>
<outline text="Paul Krugman" type="rss" htmlUrl="https://paulkrugman.substack.com/archive" xmlUrl="https://paulkrugman.substack.com/feed"/>
<outline text="Paul Lutus" type="rss" htmlUrl="https://arachnoid.com/" xmlUrl="https://arachnoid.com/feed.xml"/>
<outline text="Paul Robert Lloyd" type="rss" htmlUrl="https://paulrobertlloyd.com/" xmlUrl="https://paulrobertlloyd.com/feed.xml"/>
<outline text="Paul Smith" type="atom" htmlUrl="https://www.pauladamsmith.com/" xmlUrl="https://www.pauladamsmith.com/atom.xml"/>
<outline text="Pavel Panchekha" type="rss" htmlUrl="https://pavpanchekha.com/blog.html" xmlUrl="https://pavpanchekha.com/rss.xml"/>
<outline text="Paweł Grzybek" type="rss" htmlUrl="https://pawelgrzybek.com/" xmlUrl="https://pawelgrzybek.com/feed.xml"/>
<outline text="Paweł Orzech" type="rss" htmlUrl="https://pawel.orzech.me/" xmlUrl="https://pawel.orzech.me/feed.xml"/>
<outline text="Pedrag Gruevski" type="atom" htmlUrl="https://predr.ag/blog/" xmlUrl="https://predr.ag/atom.xml"/>
<outline text="Pedro Cora" type="rss" htmlUrl="https://blog.pcora.eu/" xmlUrl="https://blog.pcora.eu/posts_feed"/>
<outline text="Pekka Väänänen" type="atom" htmlUrl="https://30fps.net/" xmlUrl="https://30fps.net/atom.xml"/>
<outline text="Pensées de Michel" type="rss" htmlUrl="https://michel-slm.name/" xmlUrl="https://michel-slm.name/index.xml"/>
<outline text="peroty" type="rss" htmlUrl="https://peroty.micro.blog/" xmlUrl="https://peroty.micro.blog/feed.xml"/>
<outline text="Pete Brown" type="rss" htmlUrl="https://explodingcomma.com/feed.xml" xmlUrl="https://explodingcomma.com/posts_feed"/>
<outline text="Peter Bex" type="atom" htmlUrl="https://www.more-magic.net/" xmlUrl="https://www.more-magic.net/feed.atom"/>
<outline text="Peter Eisentraut" type="atom" htmlUrl="http://peter.eisentraut.org/" xmlUrl="http://peter.eisentraut.org/feed.xml"/>
<outline text="Peter Hofmann" type="atom" htmlUrl="https://movq.de/blog/" xmlUrl="https://movq.de/blog/feeds/en.atom"/>
<outline text="Peter Hosey" type="rss" htmlUrl="https://boredzo.org/blog/" xmlUrl="https://boredzo.org/blog/feed"/>
<outline text="Peter Tillemans" type="rss" htmlUrl="https://www.snamellit.com/posts/" xmlUrl="https://www.snamellit.com/posts/rss.xml"/>
<outline text="Pete Warden" type="rss" htmlUrl="https://petewarden.com" xmlUrl="https://petewarden.com/feed/"/>
<outline text="Phil Eaton" type="rss" htmlUrl="http://notes.eatonphil.com/" xmlUrl="https://notes.eatonphil.com/rss.xml"/>
<outline text="Phil Gyford" type="rss" htmlUrl="https://www.gyford.com/phil/writing/" xmlUrl="https://www.gyford.com/phil/writing/feeds/posts/rss/"/>
<outline text="Phil Stollerys" type="rss" htmlUrl="https://stollerys.co.uk/" xmlUrl="https://stollerys.co.uk/rss.xml"/>
<outline text="Philip Zucker" type="atom" htmlUrl="https://www.philipzucker.com/" xmlUrl="https://www.philipzucker.com/feed.xml"/>
<outline text="Philipp Hagenlocher" type="atom" htmlUrl="https://philipphagenlocher.de/" xmlUrl="https://philipphagenlocher.de/index.xml"/>
<outline text="Piper Haywood" type="rss" htmlUrl="https://piperhaywood.com/" xmlUrl="https://piperhaywood.com/feed/"/>
<outline text="Piya Gehi" type="rss" htmlUrl="https://orgnizedmess.net/" xmlUrl="https://orgnizedmess.net/feed.xml"/>
<outline text="Ploum.net" type="rss" htmlUrl="https://ploum.net/" xmlUrl="https://ploum.be/atom_en.xml"/>
<outline text="podiboq" type="rss" htmlUrl="https://podiboq.micro.blog/2023/11/18/120817.html" xmlUrl="https://podiboq.micro.blog/feed.xml"/>
<outline text="Pointless Ramblings" type="rss" htmlUrl="https://pointlessramblings.com/" xmlUrl="https://pointlessramblings.com/index.xml"/>
<outline text="polarhive" type="rss" htmlUrl="https://polarhive.net/blog/" xmlUrl="https://polarhive.net/blog/index.xml"/>
<outline text="Posts on Made of Bugs" type="rss" htmlUrl="https://blog.nelhage.com/post/" xmlUrl="https://blog.nelhage.com/atom.xml"/>
<outline text="Posts on mtlynch.io" type="rss" htmlUrl="https://mtlynch.io/posts/" xmlUrl="https://mtlynch.io/posts/index.xml"/>
<outline text="Protesilaos Stavrou" type="rss" htmlUrl="https://protesilaos.com/" xmlUrl="https://protesilaos.com/master.xml"/>
<outline text="Quentin Santos" type="rss" htmlUrl="https://qsantos.fr/" xmlUrl="https://qsantos.fr/feed/"/>
<outline text="R J Faas" type="rss" htmlUrl="https://rjfaas.com/" xmlUrl="https://rjfaas.com/feed/"/>
<outline text="R Scott Jones" type="rss" htmlUrl="https://rscottjones.com/" xmlUrl="https://rscottjones.com/feed/"/>
<outline text="Rn37" type="rss" htmlUrl="https://www.pcloadletter.dev/" xmlUrl="https://www.pcloadletter.dev/feed/feed.xml"/>
<outline text="rachelbythebay" type="atom" htmlUrl="https://rachelbythebay.com/w/" xmlUrl="https://rachelbythebay.com/w/atom.xml"/>
<outline text="Rach Smith" type="rss" htmlUrl="https://rachsmith.com/" xmlUrl="https://rachsmith.com/feed.xml"/>
<outline text="Rachel Kaufman" type="atom" htmlUrl="https://www.readwriterachel.com/" xmlUrl="https://www.readwriterachel.com/feed.xml"/>
<outline text="Rahul Gopinath" type="rss" htmlUrl="https://rahul.gopinath.org/iposts/" xmlUrl="https://rahul.gopinath.org/feed.xml"/>
<outline text="Raphael Amorim" type="rss" htmlUrl="https://rapha.land/" xmlUrl="https://rapha.land/feed"/>
<outline text="Raphael Sadowski" type="rss" htmlUrl="https://rsadowski.de/posts/" xmlUrl="https://rsadowski.de/posts/index.xml"/>
<outline text="Ravi" type="rss" htmlUrl="https://ravi.weblog.lol/" xmlUrl="https://ravi.weblog.lol/rss.xml"/>
<outline text="Raymond Camden" type="atom" htmlUrl="https://www.raymondcamden.com/" xmlUrl="https://www.raymondcamden.com/feed.xml"/>
<outline text="Rebecca Solnit" type="rss" htmlUrl="https://www.meditationsinanemergency.com/" xmlUrl="https://www.meditationsinanemergency.com/rss/"/>
<outline text="Rebecca Williams" type="rss" htmlUrl="https://rebeccawilliams.info/tag/writing/" xmlUrl="https://rebeccawilliams.info/rss/"/>
<outline text="Redowan Delowar" type="rss" htmlUrl="https://rednafi.com/" xmlUrl="https://rednafi.com/index.xml"/>
<outline text="Reilly Spitzfaden" type="rss" htmlUrl="https://reillyspitzfaden.com/blog/" xmlUrl="https://reillyspitzfaden.com/blog/feed.xml"/>
<outline text="Remkus de Vries" type="rss" htmlUrl="https://remkusdevries.com/" xmlUrl="https://remkusdevries.com/feed/"/>
<outline text="Remy van Elst" type="rss" htmlUrl="https://raymii.org/s/feed.xml" xmlUrl="https://raymii.org/s/feed.xml"/>
<outline text="Remy Wang" type="rss" htmlUrl="https://remy.wang/blog/blog/" xmlUrl="https://remy.wang/blog/feed.rss"/>
<outline text="Reuven Lerner" type="rss" htmlUrl="https://lerner.co.il/blog/" xmlUrl="https://lerner.co.il/feed/"/>
<outline text="rexarski" type="rss" htmlUrl="https://rexarski.com/posts/" xmlUrl="https://rexarski.com/index.xml"/>
<outline text="Ricardo Gomes da Silva" type="rss" htmlUrl="https://rgsilva.com/blog/" xmlUrl="https://rgsilva.com/blog/index.xml"/>
<outline text="Riccardo Mendes" type="rss" htmlUrl="https://rmendes.net/" xmlUrl="https://rmendes.net/feed.xml"/>
<outline text="Riccardo Mori" type="rss" htmlUrl="https://morrick.me" xmlUrl="https://morrick.me/archives/tag/english/feed"/>
<outline text="Rich Trouton" type="rss" htmlUrl="https://derflounder.wordpress.com/" xmlUrl="https://derflounder.wordpress.com/feed/"/>
<outline text="Richard Green" type="rss" htmlUrl="https://www.ragman.net/musings/" xmlUrl="https://www.ragman.net/rss.xml"/>
<outline text="Rick Carlino" type="rss" htmlUrl="https://rickcarlino.com" xmlUrl="https://rickcarlino.com/rss/feed.rss"/>
<outline text="Riley Testut" type="rss" htmlUrl="http://rileytestut.com/blog/" xmlUrl="https://rileytestut.com/feed.xml"/>
<outline text="Rishi Baldawa" type="rss" htmlUrl="https://rishi.baldawa.com/posts/" xmlUrl="https://rishi.baldawa.com/posts/index.xml"/>
<outline text="River MacLeod" type="atom" htmlUrl="https://river.cat/" xmlUrl="https://river.cat/atom.xml"/>
<outline text="Rob Bowley" type="rss" htmlUrl="https://blog.robbowley.net/" xmlUrl="https://blog.robbowley.net/feed/"/>
<outline text="Rob Zolkos" type="atom" htmlUrl="https://www.zolkos.com/" xmlUrl="https://www.zolkos.com/feed.xml"/>
<outline text="Robb Knight" type="rss" htmlUrl="https://rknight.me/" xmlUrl="https://rknight.me/subscribe/posts/rss.xml"/>
<outline text="Robert Birming" type="rss" htmlUrl="https://birming.com/" xmlUrl="https://birming.com/feed.xml"/>
<outline text="Robert Breen" type="rss" htmlUrl="https://robertbreen.com/blog/" xmlUrl="https://robertbreen.com/feed/"/>
<outline text="Robert Bryce" type="rss" htmlUrl="https://robertbryce.substack.com/archive" xmlUrl="https://robertbryce.substack.com/feed"/>
<outline text="Robert Greiner" type="rss" htmlUrl="https://robertgreiner.com/" xmlUrl="https://robertgreiner.com/rss.xml"/>
<outline text="Robert Haas" type="atom" htmlUrl="https://http://rhaas.blogspot.com/" xmlUrl="http://rhaas.blogspot.com/feeds/posts/default"/>
<outline text="Robert Heaton" type="rss" htmlUrl="https://robertheaton.com" xmlUrl="https://robertheaton.com/feed.xml"/>
<outline text="Robert J Hansen" type="rss" htmlUrl="https://sixdemonbag.org/" xmlUrl="https://sixdemonbag.org/?feed=rss2"/>
<outline text="Robert P" type="rss" htmlUrl="https://frittiert.es/frittiert-es/" xmlUrl="https://frittiert.es/rss.xml"/>
<outline text="Robert Reich" type="rss" htmlUrl="https://robertreich.substack.com/" xmlUrl="https://robertreich.substack.com/feed"/>
<outline text="Roberto Viola" type="rss" htmlUrl="https://robertoviola.cloud/" xmlUrl="https://robertoviola.cloud/feed/"/>
<outline text="Robin" type="rss" htmlUrl="https://www.robin.is/archiving/" xmlUrl="https://www.robin.is/feed/index.xml"/>
<outline text="Robin Berjon" type="atom" htmlUrl="https://berjon.com/" xmlUrl="https://berjon.com/feed.atom"/>
<outline text="Robin Rendle" type="rss" htmlUrl="https://robinrendle.com/" xmlUrl="https://robinrendle.com/feed.xml"/>
<outline text="Robin Sloan" type="atom" htmlUrl="http://robinsloan.com/" xmlUrl="https://www.robinsloan.com/feed.xml"/>
<outline text="Rodrigo Ghedin" type="rss" htmlUrl="https://notes.ghed.in/posts/" xmlUrl="https://manualdousuario.net/en/feed/"/>
<outline text="Rohan Kumar" type="rss" htmlUrl="https://seirdy.one/posts/2022/12/09/limited-utility-gnu-linux/" xmlUrl="https://seirdy.one/posts/atom.xml"/>
<outline text="Rohit Farmer" type="rss" htmlUrl="https://rohitfarmer.com/blog.html" xmlUrl="https://rohitfarmer.com/blog.xml"/>
<outline text="Roman Kashitsyn" type="atom" htmlUrl="https://mmapped.blog/" xmlUrl="https://mmapped.blog/feed.xml"/>
<outline text="Roman Komarov" type="rss" htmlUrl="https://kizu.dev/" xmlUrl="https://kizu.dev/index.xml"/>
<outline text="Roman Zipp" type="rss" htmlUrl="https://romanzipp.com/" xmlUrl="https://romanzipp.com/rss"/>
<outline text="Rom" type="rss" htmlUrl="https://my.advocrazy.com/2023/11/26/after-reading-maiques.html" xmlUrl="https://my.advocrazy.com/feed.xml"/>
<outline text="Roscoe Rubin-Rottenberg" type="rss" htmlUrl="https://knotbin.leaflet.pub/" xmlUrl="https://knotbin.leaflet.pub/rss"/>
<outline text="Roy Tang" type="rss" htmlUrl="https://roytang.net/blog/" xmlUrl="https://roytang.net/blog/feed/rss/"/>
<outline text="Ruben Arakelyan" type="atom" htmlUrl="https://www.wackomenace.co.uk/blog/" xmlUrl="https://www.wackomenace.co.uk/blog/atom.xml"/>
<outline text="Ruben Verweij" type="rss" htmlUrl="https://kedara.eu/blog/" xmlUrl="https://kedara.eu/blog/index.xml"/>
<outline text="Rubenerd" type="rss" htmlUrl="https://www.rubenerd.au/" xmlUrl="https://www.rubenerd.au/feed/"/>
<outline text="Rui Carmo" type="atom" htmlUrl="https://taoofmac.com/" xmlUrl="https://taoofmac.com/feed"/>
<outline text="Rukshan" type="rss" htmlUrl="https://ruky.me/" xmlUrl="https://ruky.me/index.xml"/>
<outline text="Ruslan's Blog" type="rss" htmlUrl="https://ruslanspivak.com/" xmlUrl="https://ruslanspivak.com/feeds/all.atom.xml"/>
<outline text="Russell Graves" type="rss" htmlUrl="https://www.sevarg.net/2023/01/28/bw-tek-btc100-spectrometer/" xmlUrl="https://www.sevarg.net/feed.xml"/>
<outline text="Ryan Farmer (BaronHK)" type="rss" htmlUrl="https://baronhk.wordpress.com" xmlUrl="https://baronhk.wordpress.com/feed/"/>
<outline text="Ryan Gibb" type="atom" htmlUrl="https://ryan.freumh.org/" xmlUrl="https://ryan.freumh.org/home.xml"/>
<outline text="Ryan Himmelwright" type="atom" htmlUrl="https://ryan.himmelwright.net/post/" xmlUrl="https://ryan.himmelwright.net/post/index.xml"/>
<outline text="Ryan Mulligan" type="rss" htmlUrl="https://ryanmulligan.dev" xmlUrl="https://ryanmulligan.dev/feed.xml"/>
<outline text="Ryan Singer" type="rss" htmlUrl="https://www.ryansinger.co/" xmlUrl="https://www.ryansinger.co/rss//"/>
<outline text="Sacha Chua" type="rss" htmlUrl="https://sachachua.com/blog/" xmlUrl="https://sachachua.com/blog/feed/"/>
<outline text="Saket Narayan" type="rss" htmlUrl="https://saket.me/" xmlUrl="https://saket.me/feed/"/>
<outline text="Sal" type="atom" htmlUrl="https://sals.place/" xmlUrl="https://sals.place/feed/"/>
<outline text="Sally Lait" type="rss" htmlUrl="https://sallylait.com/blog/" xmlUrl="https://sallylait.com/blog/index.xml"/>
<outline text="Sandor Dargo" type="atom" htmlUrl="https://www.sandordargo.com/" xmlUrl="https://www.sandordargo.com/feed.xml"/>
<outline text="Saneef H Ansari" type="atom" htmlUrl="https://saneef.com/blog/" xmlUrl="https://saneef.com/feed-firehose.xml"/>
<outline text="Santo Pfingsten" type="rss" htmlUrl="https://blog.lusito.info/" xmlUrl="https://blog.lusito.info/rss.xml"/>
<outline text="Sara Jakša" type="rss" htmlUrl="https://sarajaksa.eu/" xmlUrl="https://sarajaksa.eu/rss.xml"/>
<outline text="Saurabh Sam Khawase" type="rss" htmlUrl="https://samkhawase.com/blog/" xmlUrl="https://samkhawase.com/rss.xml"/>
<outline text="Sauropod Vertebra Picture of the Week" type="rss" htmlUrl="https://svpow.com/" xmlUrl="https://svpow.com/feed/"/>
<outline text="Schneier on Security" type="rss" htmlUrl="https://www.schneier.com" xmlUrl="https://www.schneier.com/feed/"/>
<outline text="SchwarzTech" type="rss" htmlUrl="https://schwarztech.net/" xmlUrl="https://schwarztech.net/category/articles,news,reviews/feed"/>
<outline text="Scorpil" type="rss" htmlUrl="https://scorpil.com/" xmlUrl="https://scorpil.com/index.xml"/>
<outline text="Scott Feeney" type="rss" htmlUrl="https://scott.mn/2022/12/30/quote_toot_is_link/" xmlUrl="https://scott.mn/posts.atom"/>
<outline text="Scott Jehl" type="rss" htmlUrl="https://scottjehl.com/posts/" xmlUrl="https://scottjehl.com/feed.xml"/>
<outline text="Scott Laird" type="rss" htmlUrl="https://scottstuff.net/posts/" xmlUrl="https://scottstuff.net/posts/index.xml"/>
<outline text="Scott Lawson" type="rss" htmlUrl="https://scottlawsonbc.com/posts" xmlUrl="https://scottlawsonbc.com/rss"/>
<outline text="Scott Smitelli" type="rss" htmlUrl="https://www.scottsmitelli.com/" xmlUrl="https://www.scottsmitelli.com/index.xml"/>
<outline text="Scott Willsey" type="rss" htmlUrl="https://scottwillsey.com/" xmlUrl="https://scottwillsey.com/rss.xml"/>
<outline text="Scruss" type="rss" htmlUrl="https://scruss.com/blog/" xmlUrl="https://scruss.com/blog/feed/"/>
<outline text="Sean Boots" type="rss" htmlUrl="https://sboots.ca/" xmlUrl="https://sboots.ca/index.xml"/>
<outline text="Sean Coates" type="atom" htmlUrl="https://seancoates.com/" xmlUrl="https://seancoates.com/index.xml"/>
<outline text="Sean Conner" type="atom" htmlUrl="http://boston.conman.org/" xmlUrl="https://boston.conman.org/index.atom"/>
<outline text="Sean Goedecke" type="rss" htmlUrl="https://www.seangoedecke.com/" xmlUrl="https://www.seangoedecke.com/rss.xml"/>
<outline text="Sean Heelan" type="rss" htmlUrl="https://sean.heelan.io" xmlUrl="https://sean.heelan.io/feed/"/>
<outline text="Sean McPherson" type="rss" htmlUrl="https://seanmcp.com/" xmlUrl="https://www.seanmcp.com/rss.xml"/>
<outline text="Sean Monahan" type="rss" htmlUrl="https://www.8ball.report/" xmlUrl="https://www.8ball.report/feed"/>
<outline text="Sean Voisen" type="atom" htmlUrl="https://sean.voisen.org/blog/" xmlUrl="https://seanvoisen.com/feed.xml"/>
<outline text="Sebastiaan Andeweg" type="rss" htmlUrl="https://seblog.nl/" xmlUrl="https://seblog.nl/feed.rss"/>
<outline text="Seiya Nuta" type="atom" htmlUrl="https://seiya.me/blog/" xmlUrl="https://seiya.me/atom.xml"/>
<outline text="Serge Zaitsev" type="rss" htmlUrl="https://zserge.com/posts/" xmlUrl="https://zserge.com/rss.xml"/>
<outline text="Serghei Iakovlev" type="rss" htmlUrl="https://blog.serghei.pl/posts/" xmlUrl="https://blog.serghei.pl/rss.xml"/>
<outline text="Sergio Visinoni" type="rss" htmlUrl="https://makemeacto.substack.com/" xmlUrl="https://makemeacto.substack.com/feed"/>
<outline text="Seth Godin" type="rss" htmlUrl="https://seths.blog/" xmlUrl="https://seths.blog/feed/"/>
<outline text="Seth Michael Larson" type="rss" htmlUrl="http://sethmlarson.dev/" xmlUrl="https://sethmlarson.dev/feed"/>
<outline text="Sharon Rosner" type="rss" htmlUrl="https://noteflakes.com/" xmlUrl="https://noteflakes.com/feeds/rss"/>
<outline text="Shayon Mukherjee" type="rss" htmlUrl="https://www.shayon.dev/post/" xmlUrl="https://www.shayon.dev/post/index.xml"/>
<outline text="Shrikant Sharat Kandula" type="rss" htmlUrl="https://sharats.me/" xmlUrl="https://sharats.me/posts/index.xml"/>
<outline text="Shrivu Shankar" type="rss" htmlUrl="https://blog.sshh.io/" xmlUrl="https://blog.sshh.io/feed"/>
<outline text="Sigfrid Lundberg" type="rss" htmlUrl="https://sigfrid-lundberg.se/" xmlUrl="https://sigfrid-lundberg.se/atom_feed.atom"/>
<outline text="Šime" type="rss" htmlUrl="https://xn--ime-zza.eu/" xmlUrl="https://xn--ime-zza.eu/feed.xml"/>
<outline text="Simon Collison" type="rss" htmlUrl="https://colly.com/journal/" xmlUrl="https://colly.com/journal/feed"/>
<outline text="Simon Hartcher" type="rss" htmlUrl="https://simonhartcher.com/" xmlUrl="https://simonhartcher.com/rss.xml"/>
<outline text="Simon Josefsson" type="rss" htmlUrl="https://blog.josefsson.org" xmlUrl="https://blog.josefsson.org/feed/"/>
<outline text="Simon P Couch" type="rss" htmlUrl="https://simonpcouch.com/blog/" xmlUrl="https://simonpcouch.com/blog/index.xml"/>
<outline text="Simon Safar" type="atom" htmlUrl="https://simonsafar.com/" xmlUrl="https://simonsafar.com/index.xml"/>
<outline text="Simon Späti" type="rss" htmlUrl="https://www.ssp.sh/" xmlUrl="https://www.ssp.sh/index.xml"/>
<outline text="Simone Silvestroni" type="rss" htmlUrl="https://minutestomidnight.co.uk/" xmlUrl="https://minutestomidnight.co.uk/feed.xml"/>
<outline text="Simone Vellei" type="rss" htmlUrl="https://simonevellei.com/" xmlUrl="https://simonevellei.com/index.xml"/>
<outline text="Sophie Koonan" type="atom" htmlUrl="https://localghost.dev/blog/" xmlUrl="https://localghost.dev/feed.xml"/>
<outline text="Soeren" type="rss" htmlUrl="https://soeren.one/" xmlUrl="https://soeren.one/index.xml"/>
<outline text="Solene's percent %" type="rss" htmlUrl="https://dataswamp.org/~solene/" xmlUrl="https://dataswamp.org/~solene/rss.xml"/>
<outline text="Son Luong Ngoc" type="rss" htmlUrl="https://sluongng.substack.com/archive" xmlUrl="https://sluongng.substack.com/feed"/>
<outline text="Spaceraccoon" type="rss" htmlUrl="https://spaceraccoon.dev/" xmlUrl="https://spaceraccoon.dev/feed.xml"/>
<outline text="Spencer Lloyd Dixon" type="atom" htmlUrl="https://spencer.wtf/archive" xmlUrl="https://spencer.wtf/feed.xml"/>
<!-- inactive <outline text="Stan Bright" type="atom" htmlUrl="https://stanbright.com/blog" xmlUrl="https://stanbright.com/feed.xml"/> -->
<outline text="Stefan Grund" type="rss" htmlUrl="https://eay.cc/" xmlUrl="https://eay.cc/feed/"/>
<outline text="Stefan Eissing" type="rss" htmlUrl="https://eissing.org/icing/" xmlUrl="https://eissing.org/icing/index.xml"/>
<outline text="Stefan Marr" type="atom" htmlUrl="https://stefan-marr.de/" xmlUrl="https://stefan-marr.de/feed/index.xml"/>
<outline text="Stefan Hajnoczi" type="atom" htmlUrl="https://stefanzweifel.dev/posts/" xmlUrl="https://blog.vmsplice.net/feeds/posts/default"/>
<outline text="Stefan Zweifel" type="rss" htmlUrl="https://stefanzweifel.dev/posts/" xmlUrl="https://stefanzweifel.dev/rss.xml"/>
<outline text="Stefano Marinelli" type="rss" htmlUrl="https://my-notes.dragas.net/archives/" xmlUrl="https://my-notes.dragas.net/rss.xml"/>
<outline text="Stefano Verna" type="rss" htmlUrl="https://squeaki.sh/" xmlUrl="https://squeaki.sh/rss.xml"/>
<outline text="Stephen Hackett" type="rss" htmlUrl="https://512pixels.net/gear/" xmlUrl="https://feedpress.me/512pixels"/>
<outline text="Stephen Kell" type="rss" htmlUrl="https://www.humprog.org/%7Estephen/blog/" xmlUrl="https://www.humprog.org/%7Estephen/blog/index.rss"/>
<outline text="Stephen Smith - slop" type="rss" htmlUrl="https://smist08.wordpress.com/" xmlUrl="https://smist08.wordpress.com/feed/"/>
<outline text="Steve Ledlow" type="rss" htmlUrl="https://tangiblelife.net/" xmlUrl="https://tangiblelife.net/feed.rss"/>
<outline text="Steve Makofsky" type="rss" htmlUrl="https://makoism.com/" xmlUrl="https://makoism.com/rss/"/>
<outline text="Steve Yegge" type="rss" htmlUrl="https://steve-yegge.medium.com/" xmlUrl="https://medium.com/feed/@steve-yegge"/>
<outline text="Steven Deobald" type="rss" htmlUrl="https://www.deobald.ca/" xmlUrl="https://www.deobald.ca/index.xml"/>
<outline text="Steven Wittens" type="atom" htmlUrl="https://acko.net/" xmlUrl="https://acko.net/atom.xml"/>
<outline text="Stuart Breckenridge" type="rss" htmlUrl="https://stuartbreckenridge.net/" xmlUrl="https://stuartbreckenridge.net/rss.xml"/>
<outline text="Stuart Schechter" type="rss" htmlUrl="https://stuartschechter.org/posts/" xmlUrl="https://stuartschechter.org/index.xml"/>
<outline text="Stig Brautaset" type="rss" htmlUrl="https://www.brautaset.org/" xmlUrl="https://www.brautaset.org/feed.xml"/>
<outline text="sulami" type="rss" htmlUrl="https://blog.sulami.xyz" xmlUrl="https://blog.sulami.xyz/atom.xml"/>
<outline text="Sumana Harihareswara" type="atom" htmlUrl="https://www.harihareswara.net/" xmlUrl="https://www.harihareswara.net/atom/"/>
<outline text="Sven Luijten" type="rss" htmlUrl="http://svenluijten.com/posts/" xmlUrl="https://svenluijten.com/feeds/all.xml"/>
<outline text="System76 Blog" type="rss" htmlUrl="https://blog.system76.com/" xmlUrl="https://blog.system76.com/rss"/>
<outline text="systemd-free linux community" type="rss" htmlUrl="https://sysdfree.wordpress.com" xmlUrl="https://sysdfree.wordpress.com/feed/"/>
<outline text="Talospace" type="rss" htmlUrl="https://www.talospace.com/" xmlUrl="https://www.talospace.com/feeds/posts/default"/>
<outline text="Tao Bojlén" type="rss" htmlUrl="https://btao.org/" xmlUrl="https://btao.org/feed.xml"/>
<outline text="TaranakiNeko" type="rss" htmlUrl="https://blog.nekoq.top/blog/" xmlUrl="https://blog.nekoq.top/atom.xml"/>
<outline text="Tautvilas Mečinskas" type="rss" htmlUrl="https://tautvilas.medium.com/" xmlUrl="https://medium.com/feed/@tautvilas"/>
<outline text="Tech Reflect" type="rss" htmlUrl="https://substack.techreflect.org/" xmlUrl="https://substack.techreflect.org/feed"/>
<outline text="TechTea" type="rss" htmlUrl="https://techtea.io/articles/" xmlUrl="https://techtea.io/articles/index.xml"/>
<outline text="Terence Eden" type="rss" htmlUrl="https://shkspr.mobi/blog" xmlUrl="https://shkspr.mobi/blog/feed/atom/"/>
<outline text="Thalskarth" type="rss" htmlUrl="https://blog.thalskarth.ar/aplicaciones-por-defecto/" xmlUrl="https://blog.thalskarth.ar/feed.xml"/>
<outline text="That grumpy BSD guy" type="rss" htmlUrl="https://bsdly.blogspot.com/" xmlUrl="https://bsdly.blogspot.com/feeds/posts/default"/>
<outline text="The Advisory Boar" type="rss" htmlUrl="https://toroid.org/etc" xmlUrl="https://toroid.org/etc/index.atom"/>
<outline text="The Cyber Vanguard" type="rss" htmlUrl="http://cyber.dabamos.de/blog/" xmlUrl="http://cyber.dabamos.de/blog/feed.rss"/>
<outline text="The Drone Girl" type="rss" htmlUrl="https://www.thedronegirl.com/" xmlUrl="https://www.thedronegirl.com/feed/"/>
<outline text="The Invisible Things" type="rss" htmlUrl="https://blog.invisiblethings.org/" xmlUrl="https://blog.invisiblethings.org/feed.xml"/>
<outline text="The occasional scrivener" type="atom" htmlUrl="https://gerikson.com/m/" xmlUrl="https://gerikson.com/m/feed.atom"/>
<outline text="The Universe of Discourse" type="rss" htmlUrl="https://blog.plover.com" xmlUrl="https://blog.plover.com/index.rss"/>
<outline text="Theodore Ts'o" type="rss" htmlUrl="https://thunk.org/tytso/blog/" xmlUrl="https://thunk.org/tytso/blog/index.xml"/>
<outline text="(think)" type="atom" htmlUrl="https://batsov.com/" xmlUrl="https://batsov.com/atom.xml"/>
<outline text="Thomas Günther" type="rss" htmlUrl="https://medienbaecker.com/articles" xmlUrl="https://medienbaecker.com/articles.xml"/>
<outline text="Thomas Jensen" type="rss" htmlUrl="https://www.cavelab.dev/" xmlUrl="https://www.cavelab.dev/index.xml"/>
<outline text="Thomas Leonard" type="atom" htmlUrl="https://roscidus.com/blog/" xmlUrl="https://roscidus.com/blog/atom.xml"/>
<outline text="Thomas Rigby" type="rss" htmlUrl="https://thomasrigby.com/posts/" xmlUrl="https://thomasrigby.com/feed.xml"/>
<outline text="Thorsten Alteholz" type="rss" htmlUrl="https://blog.alteholz.eu" xmlUrl="https://blog.alteholz.eu/feed/"/>
<outline text="Thorsten Ball" type="rss" htmlUrl="https://registerspill.thorstenball.com/" xmlUrl="https://registerspill.thorstenball.com/feed"/>
<outline text="Tim Bornholdt" type="rss" htmlUrl="https://timbornholdt.com/blog/" xmlUrl="https://timbornholdt.com/blog/feed.rss"/>
<outline text="Tim Bray" type="rss" htmlUrl="http://pubsubhubbub.appspot.com/" xmlUrl="https://www.tbray.org/ongoing/ongoing.atom"/>
<outline text="Tim Nahumck" type="rss" htmlUrl="https://nahumck.me/" xmlUrl="https://nahumck.me/feed.xml"/>
<outline text="Timo Tijhof" type="rss" htmlUrl="https://timotijhof.net/" xmlUrl="https://timotijhof.net/feed/"/>
<outline text="Tim Chambers" type="rss" htmlUrl="https://www.timothychambers.net/" xmlUrl="https://www.timothychambers.net/feed.xml"/>
<outline text="Tim Chase" type="rss" htmlUrl="https://blog.thechases.com/" xmlUrl="https://blog.thechases.com/rss.xml"/>
<outline text="Tobias Mädel" type="rss" htmlUrl="https://kittenlabs.de/" xmlUrl="https://kittenlabs.de/index.xml"/>
<outline text="Tom Critchlow" type="rss" htmlUrl="http://tomcritchlow.com/" xmlUrl="https://tomcritchlow.com/feed"/>
<outline text="Tom Hodson" type="rss" htmlUrl="https://thod.dev/blog/" xmlUrl="https://thod.dev/feed.xml"/>
<outline text="Tom Jones" type="rss" htmlUrl="https://adventurist.me/" xmlUrl="https://adventurist.me/feed.xml"/>
<outline text="Tom Murphy VII" type="rss" htmlUrl="https://tom7.org/" xmlUrl="http://radar.spacebar.org/f/a/weblog/rss/1"/>
<outline text="Tom Shafer" type="rss" htmlUrl="https://tshafer.com/blog/" xmlUrl="https://tshafer.com/blog/rss-r.xml"/>
<outline text="Tom MacWright" type="rss" htmlUrl="https://macwright.com" xmlUrl="https://macwright.com/rss.xml"/>
<outline text="Tomasz Wisniewski" type="atom" htmlUrl="https://twdev.blog/posts/" xmlUrl="https://twdev.blog/posts/index.xml"/>
<outline text="Tomasz Kramkowski" type="atom" htmlUrl="https://kramkow.ski/archive.html" xmlUrl="https://kramkow.ski/atom.xml"/>
<outline text="Tommy Palmer" type="rss" htmlUrl="https:/tommyp.org/blog/" xmlUrl="https://tommyp.org/rss.xml"/>
<outline text="Tony Finch" type="atom" htmlUrl="https://dotat.at/" xmlUrl="https://dotat.at/@/blog.atom"/>
<outline text="Tony Garnock-Jones" type="atom" htmlUrl="https://www.eighty-twenty.org/" xmlUrl="https://eighty-twenty.org/index.atom"/>
<outline text="Tony Sundharam" type="rss" htmlUrl="https://0xsid.com/blog/" xmlUrl="https://0xsid.com/blog/rss.xml"/>
<outline text="Tony Solomnik" type="atom" htmlUrl="https://tontinton.com/posts/" xmlUrl="https://tontinton.com/atom.xml"/>
<outline text="Topslakr" type="rss" htmlUrl="https://topslakr.com/" xmlUrl="https://topslakr.com/feed/"/>
<outline text="Tracy Durnell" type="rss" htmlUrl="https://tracydurnell.com/" xmlUrl="https://tracydurnell.com/feed/"/>
<outline text="Trevor Morris" type="rss" htmlUrl="https://www.trovster.com/" xmlUrl="https://www.trovster.com/blog/posts.xml"/>
<outline text="Troy Patterson" type="rss" htmlUrl="https://troypatterson.me" xmlUrl="https://troypatterson.me/feed/"/>
<outline text="Troy Hunt" type="rss" htmlUrl="https://www.troyhunt.com/" xmlUrl="https://www.troyhunt.com/rss/"/>
<outline text="Tuan-Anh Tran" type="rss" htmlUrl="https://tuananh.net/posts/" xmlUrl="https://tuananh.net/posts/feed.xml"/>
<outline text="TuM'Fatig" type="rss" htmlUrl="https://www.tumfatig.net/" xmlUrl="https://www.tumfatig.net/index.xml"/>
<outline text="Two-Wrongs" type="rss" htmlUrl="https://entropicthoughts.com/" xmlUrl="https://entropicthoughts.com/feed"/>
<outline text="Tyler Sticka" type="rss" htmlUrl="https://tylersticka.com/journal/" xmlUrl="https://tylersticka.com/journal/feed.xml"/>
<outline text="Tyler Thorsted" type="rss" htmlUrl="https://preservation.tylerthorsted.com/" xmlUrl="https://preservation.tylerthorsted.com/feed/"/>
<outline text="Tymscar" type="rss" htmlUrl="https://blog.tymscar.com/" xmlUrl="https://blog.tymscar.com/index.xml"/>
<outline text="Uğur Erdem Seyfi" type="rss" htmlUrl="https://www.rugu.dev/en/" xmlUrl="https://www.rugu.dev/en/index.xml"/>
<outline text="Ulla Jordan" type="rss" htmlUrl="https://ullajordan.wordpress.com/" xmlUrl="https://ullajordan.wordpress.com/feed/"/>
<outline text="Unix Digest" type="rss" htmlUrl="https://unixdigest.com/" xmlUrl="https://unixdigest.com/articles.xml"/>
<outline text="Unmitigated Risks" type="rss" htmlUrl="https://unmitigatedrisk.com" xmlUrl="https://unmitigatedrisk.com/?feed=rss2"/>
<outline text="Untitled Operator" type="rss" htmlUrl="https://chris.funderburg.me/index.xml" xmlUrl="https://commentingon.xyz/feed/"/>
<outline text="US Library of Congress - Copyright" type="rss" htmlUrl="https://blogs.loc.gov/copyright/" xmlUrl="https://blogs.loc.gov/copyright/feed/"/>
<outline text="Valtteri Koskivuori" type="atom" htmlUrl="https://vkoskiv.com/" xmlUrl="https://vkoskiv.com/atom.xml"/>
<outline text="Valtteri Lehtinen" type="rss" htmlUrl="https://shufflingbytes.com/posts/" xmlUrl="https://shufflingbytes.com/posts/index.xml"/>
<outline text="Varun Gandhi" type="rss" htmlUrl="https://typesanitizer.com/blog/" xmlUrl="https://typesanitizer.com/blog/rss.xml"/>
<outline text="Vegard's Blog" type="rss" htmlUrl="https://vegard.blog.engen.priv.no/" xmlUrl="https://vegard.blog.engen.priv.no/?feed=rss2"/>
<outline text="Venam's Blog" type="rss" htmlUrl="https://venam.nixers.net/blog/" xmlUrl="https://venam.net/blog/feed.xml"/>
<outline text="Vereis" type="rss" htmlUrl="https://vereis.com/" xmlUrl="https://vereis.com/rss"/>
<outline text="vermaden" type="rss" htmlUrl="https://vermaden.wordpress.com" xmlUrl="https://vermaden.wordpress.com/feed/"/>
<outline text="Vic Demuzere" type="atom" htmlUrl="https://vic.demuzere.be/articles/archive/" xmlUrl="https://vic.demuzere.be/articles/atom.xml"/>
<outline text="Vicki Boykis" type="rss" htmlUrl="https://vickiboykis.com/" xmlUrl="https://vickiboykis.com/index.xml"/>
<outline text="Victor Kropp" type="rss" htmlUrl="https://victor.kropp.name/blog/" xmlUrl="https://victor.kropp.name/blog/index.xml"/>
<outline text="Victor Skvortsov" type="atom" htmlUrl="https://tenthousandmeters.com/" xmlUrl="https://tenthousandmeters.com/feeds/all.atom.xml"/>
<outline text="Victor Zverovich" type="rss" htmlUrl="https://vitaut.net/posts/" xmlUrl="https://vitaut.net/posts/index.xml"/>
<outline text="Vidit Bhargava" type="rss" htmlUrl="https://blog.viditb.com/" xmlUrl="https://blog.viditb.com/rss/"/>
<outline text="Vijay Prema" type="rss" htmlUrl="https://vijayprema.com/" xmlUrl="https://vijayprema.com/rss/"/>
<outline text="Vikash Patel" type="rss" htmlUrl="https://lorbic.com/" xmlUrl="https://lorbic.com/index.xml"/>
<outline text="Viktor Löfgren" type="rss" htmlUrl="https://www.marginalia.nu/log/" xmlUrl="https://www.marginalia.nu/log/index.xml"/>
<outline text="Vinay Keerthi" type="rss" htmlUrl="https://tech.stonecharioteer.com/archives/" xmlUrl="https://tech.stonecharioteer.com/index.xml"/>
<outline text="Vincent Bernat" type="rss" htmlUrl="https://vincent.bernat.ch/en" xmlUrl="https://vincent.bernat.ch/en/blog/atom.xml"/>
<outline text="Vincent Delft" type="rss" htmlUrl="https://vincentdelft.be/" xmlUrl="https://vincentdelft.be/rss"/>
<outline text="Vincent Driessen" type="atom" htmlUrl="https://nvie.com/posts/" xmlUrl="http://feeds.feedburner.com/nvie"/>
<outline text="Vishnu Haridas" type="rss" htmlUrl="https://iamvishnu.com/" xmlUrl="https://iamvishnu.com/rss.xml"/>
<outline text="Vittorio Romeo" type="rss" htmlUrl="https://vittorioromeo.com/" xmlUrl="https://vittorioromeo.com/index.rss"/>
<outline text="Vlad-Stefan Harbuz" type="rss" htmlUrl="https://vlad.website/" xmlUrl="https://vlad.website/index.xml"/>
<outline text="VulpineCitrus" type="atom" htmlUrl="https://vulpinecitrus.info/blog/" xmlUrl="https://vulpinecitrus.info/blog/atom.xml"/>
<outline text="V" type="rss" htmlUrl="https://vmac.ch/posts/" xmlUrl="https://vmac.ch/index.xml"/>
<outline text="W Evan Sheehan" type="rss" htmlUrl="https://darthmall.net/feed/all.xml" xmlUrl="https://darthmall.net/feed/all.xml"/>
<outline text="Wade Urry" type="rss" htmlUrl="https://iwader.co.uk/posts/" xmlUrl="https://www.iwader.co.uk/feed.xml"/>
<outline text="Watts Martin" type="atom" htmlUrl="https://coyotetracks.org/blog/" xmlUrl="https://coyotetracks.org/blog/atom.xml"/>
<outline text="Werner Vogels" type="rss" htmlUrl="https://www.allthingsdistributed.com/" xmlUrl="https://www.allthingsdistributed.com/index.xml"/>
<outline text="WerWolv" type="atom" htmlUrl="https://werwolv.net/posts/" xmlUrl="https://werwolv.net/atom.xml"/>
<outline text="Wesley Moore" type="rss" htmlUrl="https://www.wezm.net/v2" xmlUrl="https://www.wezm.net/v2/rss.xml"/>
<outline text="Wild code" type="rss" htmlUrl="http://blog.viraptor.info/" xmlUrl="https://blog.viraptor.info/feeds/all.rss.xml"/>
<outline text="Will Cooke" type="rss" htmlUrl="https://www.whizzy.org/" xmlUrl="https://www.whizzy.org/feed.xml"/>
<outline text="William Liu" type="atom" htmlUrl="https://www.willsroot.io/" xmlUrl="https://www.willsroot.io/feeds/posts/default"/>
<outline text="Wladimir Palant" type="rss" htmlUrl="https://palant.info/" xmlUrl="https://palant.info/rss.xml"/>
<outline text="Wladislav Artsimovich" type="atom" htmlUrl="https://blog.frost.kiwi/" xmlUrl="https://blog.frost.kiwi/feed.xml"/>
<outline text="Woonbin Kang" type="atom" htmlUrl="https://wbk.one/" xmlUrl="https://wbk.one/feed/atom"/>
<outline text="Wouter Groeneveld" type="rss" htmlUrl="https://brainbaking.com/post/" xmlUrl="https://brainbaking.com/index.xml"/>
<outline text="Xanthe Tynehorne" type="atom" htmlUrl="https://satyrs.eu/new/" xmlUrl="https://satyrs.eu/new/feed.xml"/>
<outline text="Xiph" type="rss" htmlUrl="https://xiph.org/flac/news.html" xmlUrl="https://xiph.org/flac/feeds/feed.xml"/>
<outline text="Xythobuz" type="rss" htmlUrl="https://www.xythobuz.de/" xmlUrl="https://www.xythobuz.de/rss.xml"/>
<outline text="Yann Esposito" type="rss" htmlUrl="https://her.esy.fun/" xmlUrl="https://her.esy.fun/rss.xml"/>
<outline text="Yash Garg" type="atom" htmlUrl="https://yashgarg.dev/posts/" xmlUrl="https://yashgarg.dev/posts/index.xml"/>
<outline text="Yilei Yang" type="rss" htmlUrl="https://mangoumbrella.com/post/" xmlUrl="https://mangoumbrella.com/posts.rss"/>
<outline text="Yinan" type="rss" htmlUrl="https://yinan.me/" xmlUrl="https://yinan.me/atom.xml"/>
<outline text="Yordi Verkroost" type="rss" htmlUrl="https://yordi.me/" xmlUrl="https://yordi.me/feed/"/>
<outline text="Yossi Kreinin" type="rss" htmlUrl="https://yosefk.com/blog/" xmlUrl="https://yosefk.com/blog/feed"/>
<outline text="YottaDB" type="rss" htmlUrl="https://yottadb.com/" xmlUrl="https://yottadb.com/feed/"/>
<outline text="Yuexun Jiang" type="rss" htmlUrl="https://yuexun.me/" xmlUrl="https://yuexunj.com/rss.xml"/>
<outline text="Yury Molodtsov" type="rss" htmlUrl="https://molodtsov.me/" xmlUrl="https://molodtsov.me/blog/index.xml"/>
<outline text="Zach Mitchell" type="rss" htmlUrl="https://tinkering.xyz/" xmlUrl="https://tinkering.xyz/rss.xml"/>
<outline text="Zachary" type="rss" htmlUrl="https://alpine.weblog.lol/" xmlUrl="https://alpine.weblog.lol/rss.xml"/>
<outline text="Zack Apiratitham" type="rss" htmlUrl="https://vatthikorn.com/" xmlUrl="https://vatthikorn.com/rss.xml"/>
<outline text="Zak Kemble" type="atom" htmlUrl="https://blog.zakkemble.net/" xmlUrl="https://blog.zakkemble.net/feed/"/>
<outline text="Zak Manson" type="rss" htmlUrl="https://notes.zachmanson.com/" xmlUrl="https://notes.zachmanson.com/posts.xml"/>
<outline text="Zerforschung" type="rss" htmlUrl="https://zerforschung.org/" xmlUrl="https://zerforschung.org/index.xml"/>
<outline text="Zeus WPI" type="atom" htmlUrl="https://zeus.gent/" xmlUrl="https://zeus.gent/feed.xml"/>
<outline text="Zit Seng" type="rss" htmlUrl="https://zitseng.com/" xmlUrl="https://zitseng.com/feed"/>
<outline text="Zoobab (Benjamin Henrion)" type="rss" htmlUrl="http://zoobab.wikidot.com/" xmlUrl="http://zoobab.wikidot.com/feed/site-changes.xml"/>
<outline text="ZorinOS" type="rss" htmlUrl="https://blog.zorin.com/" xmlUrl="https://blog.zorin.com/index.xml"/>
<outline text="Zsolt Kacsandi" type="rss" htmlUrl="https://serversfor.dev/" xmlUrl="https://serversfor.dev/rss.xml"/>
</outline>
</outline>
<outline text="Tech">
<outline text="Defunct">
<outline text="Analytics India Magazine - M$ partner" type="rss" htmlUrl="https://analyticsindiamag.com/" xmlUrl="https://analyticsindiamag.com/feed/"/>
</outline>
<outline text="Adventures in PC Emulation" type="atom" htmlUrl="https://martypc.blogspot.com/" xmlUrl="https://martypc.blogspot.com/feeds/posts/default"/>
<outline text="Ahrefs" type="rss" htmlUrl="https://tech.ahrefs.com/" xmlUrl="https://tech.ahrefs.com/feed"/>
<outline text="The Cyber Show" type="rss" htmlUrl="https://cybershow.uk/blog/" xmlUrl="https://cybershow.uk/blog/feed/"/>
<outline text="Crazy Stupid Tech" type="rss" htmlUrl="https://crazystupidtech.com/" xmlUrl="https://crazystupidtech.com/feed/"/>
<outline text="Coreboot" type="rss" htmlUrl="https://blogs.coreboot.org/" xmlUrl="https://blogs.coreboot.org/feed/"/>
<outline text="Daniel Stenberg" type="rss" htmlUrl="https://daniel.haxx.se/blog" xmlUrl="https://daniel.haxx.se/blog/feed/"/>
<outline text="The Deployer Times" type="rss" htmlUrl="https://deployer.org/blog/" xmlUrl="https://deployer.org/blog/rss.xml"/>
<outline text="FOSDEM" type="atom" htmlUrl="https://fosdem.org/" xmlUrl="https://fosdem.org/atom.xml"/>
<outline text="Ironclad" type="rss" htmlUrl="https://blog.ironclad-os.org/" xmlUrl="https://blog.ironclad-os.org/blog.xml"/>
<outline text="Low←Tech Magazine" type="rss" htmlUrl="https://solar.lowtechmagazine.com/" xmlUrl="https://solar.lowtechmagazine.com/posts/index.xml"/>
<outline text="Explain Extended" type="rss" htmlUrl="https://explainextended.com/" xmlUrl="https://feeds.feedburner.com/explainextended"/>
<outline text="Hackaday" type="rss" htmlUrl="https://hackaday.com/" xmlUrl="https://hackaday.com/feed/"/>
<outline text="Inside Towers" type="rss" htmlUrl="https://insidetowers.com/" xmlUrl="https://insidetowers.com/feed/"/>
<outline text="Ladybird Web Browser" type="rss" htmlUrl="https://ladybird.org/news/" xmlUrl="https://ladybird.org/posts.rss"/>
<outline text="LibreNews" type="rss" htmlUrl="https://thelibre.news/latest/" xmlUrl="https://thelibre.news/latest/rss/"/>
<outline text="Macworld (IDG)" type="rss" htmlUrl="https://www.macworld.com/" xmlUrl="https://www.macworld.com/en-us/feed"/>
<outline text="PC Mag" type="rss" htmlUrl="https://www.pcmag.com/" xmlUrl="https://www.pcmag.com/feeds/rss/latest"/>
<outline text="PCWorld (IDG)" type="rss" htmlUrl="https://www.pcworld.com/" xmlUrl="https://www.pcworld.com/feed"/>
<outline text="Framework Computer BV" type="rss" htmlUrl="https://frame.work/" xmlUrl="https://frame.work/fi/en/blog.rss"/>
<outline text="Android Police" type="rss" htmlUrl="https://www.androidpolice.com/" xmlUrl="https://www.androidpolice.com/feed/"/>
<outline text="Digital Camera World" type="rss" htmlUrl="https://www.digitalcameraworld.com/" xmlUrl="https://www.digitalcameraworld.com/feeds.xml"/>
<outline text="RedMonk" type="rss" htmlUrl="https://redmonk.com/" xmlUrl="https://redmonk.com/feed/"/>
<outline text="The Verge" type="atom" htmlUrl="https://www.theverge.com/" xmlUrl="https://www.theverge.com/rss/index.xml"/>
<outline text="Tor Project" type="rss" htmlUrl="https://blog.torproject.org/" xmlUrl="https://blog.torproject.org/feed.xml"/>
<outline text="Waterfox" type="rss" htmlUrl="https://www.waterfox.com/blog/" xmlUrl="https://www.waterfox.com/rss.xml"/>
<outline text="Wired - LLM Slop">
<outline text="Wired - Business" type="rss" htmlUrl="https://www.wired.com/" xmlUrl="https://www.wired.com/feed/category/business/latest/rss"/>
<outline text="Wired - Science" type="rss" htmlUrl="https://www.wired.com/" xmlUrl="https://www.wired.com/feed/category/science/latest/rss"/>
<outline text="Wired - Security" type="rss" htmlUrl="https://www.wired.com/" xmlUrl="https://www.wired.com/feed/category/security/latest/rss"/>
</outline>
<outline text="The Washington Post: Tech — now with LLM slop" type="rss" htmlUrl="https://www.washingtonpost.com/business/technology/" xmlUrl="https://feeds.washingtonpost.com/rss/business/technology"/>
<outline text="WolfSSL" type="rss" htmlUrl="https://www.wolfssl.com/blog/" xmlUrl="https://www.wolfssl.com/blog/feed/"/>
<outline text="404 Media" type="rss" htmlUrl="https://www.404media.co/" xmlUrl="https://www.404media.co/rss/"/>
<outline text="iTWire" type="rss" htmlUrl=">https://itwire.com/" xmlUrl="https://itwire.com/itwire-rss/itwire.feed"/>
<outline text="9to5Linux" type="rss" htmlUrl="https://9to5linux.com/" xmlUrl="https://9to5linux.com/feed"/>
<outline text="Haaretz" type="rss" htmlUrl="https://www.haaretz.com/" xmlUrl="https://www.haaretz.com/srv/technology-news-rss"/>
<outline text="APNIC Blog" type="rss" htmlUrl="https://blog.apnic.net/" xmlUrl="https://blog.apnic.net/feed/"/>
<outline text="Civil Society Alliances for Digital Empowerment" type="rss" htmlUrl="https://cadeproject.org/" xmlUrl="https://cadeproject.org/feed/"/>
<outline text="RIPE Labs" type="rss" htmlUrl="https://labs.ripe.net" xmlUrl="https://labs.ripe.net/atom.xml"/>
<outline text="SANS Internet Storm Center" type="rss" htmlUrl="https://isc.sans.edu" xmlUrl="https://www.dshield.org/rssfeed.xml"/>
<outline text="SecurityWeek" type="rss" htmlUrl="https://www.securityweek.com/" xmlUrl="https://www.securityweek.com/feed/"/>
<outline text="Mandiant" type="rss" htmlUrl="https://www.mandiant.com/" xmlUrl="https://cloudblog.withgoogle.com/topics/threat-intelligence/rss/"/>
<outline text="Cisco Talos Blog" type="rss" htmlUrl="https://blog.talosintelligence.com/" xmlUrl="https://blog.talosintelligence.com/rss/"/>
<outline text="The Cyber Express" type="rss" htmlUrl="https://thecyberexpress.com/" xmlUrl="https://thecyberexpress.com/feed/"/>
<outline text="CyberScoop" type="rss" htmlUrl="https://cyberscoop.com" xmlUrl="https://cyberscoop.com/feed/"/>
<outline text="Dark Reading" type="rss" htmlUrl="https://www.darkreading.com/" xmlUrl="https://www.darkreading.com/rss.xml"/>
<outline text="The Record" type="rss" htmlUrl="https://therecord.media/" xmlUrl="https://therecord.media/feed"/>
<outline text="Domain Tools" type="rss" htmlUrl="https://www.domaintools.com/resources/blog/" xmlUrl="https://rss.app/feeds/_22lRQJMKndkBEjVr.xml"/>
<outline text="Howtoforge Linux Howtos und Tutorials" type="rss" htmlUrl="https://www.howtoforge.com" xmlUrl="https://www.howtoforge.com/feed.rss"/>
<outline text="IBTimes.co.uk : Technology" type="rss" htmlUrl="https://www.ibtimes.co.uk/" xmlUrl="https://feeds.ibtimes.co.uk/feeds/bhsz8.rss"/>
<outline text="International Policy Digest" type="rss" htmlUrl="https://intpolicydigest.org/" xmlUrl="https://intpolicydigest.org/home/feed/"/>
<outline text="ITWire" type="rss" htmlUrl="https://itwire.com/" xmlUrl="https://itwire.com/?format=feed&type=rss"/>
<outline text="Krita" type="rss" htmlUrl="https://krita.org/en/" xmlUrl="https://krita.org/en/index.xml"/>
<outline text="mutt:master commits" type="atom" htmlUrl="https://gitlab.com/muttmua/mutt/-/commits/master" xmlUrl="https://gitlab.com/muttmua/mutt/-/commits/master?format=atom"/>
<outline text="MIT Technology Review" type="rss" htmlUrl="https://www.technologyreview.com" xmlUrl="https://www.technologyreview.com/feed/"/>
<outline text="NYT > Technology — AI slop tainted?" type="rss" htmlUrl="https://www.nytimes.com/section/technology" xmlUrl="https://www.nytimes.com/svc/collections/v1/publish/https://www.nytimes.com/section/technology/rss.xml"/>
<outline text="OSTechNix" type="rss" htmlUrl="https://ostechnix.com/" xmlUrl="https://ostechnix.com/feed/"/>
<outline text="SiliconANGLE" type="rss" htmlUrl="https://siliconangle.com" xmlUrl="https://siliconangle.com/feed/"/>
<outline text="TaoSecurity" type="rss" htmlUrl="https://taosecurity.blogspot.com/" xmlUrl="https://taosecurity.blogspot.com/feeds/posts/default"/>
<outline text="Trail of Bits" type="rss" htmlUrl="https://blog.trailofbits.com" xmlUrl="https://blog.trailofbits.com/index.xml"/>
<outline text="Of Interest - Stanford" type="rss" htmlUrl="https://cyberlaw.stanford.edu/of-interest" xmlUrl="https://cyberlaw.stanford.edu/press/rss/"/>
<outline text="Interesting Engineering" type="rss" htmlUrl="https://www.interestingengineering.com/" xmlUrl="https://interestingengineering.com/feed"/>
<outline text="PINE64" type="rss" htmlUrl="https://www.pine64.org" xmlUrl="https://pine64.org/blog/index.xml"/>
<outline text="VideoLAN project - News feed" type="rss" htmlUrl="http://www.videolan.org/" xmlUrl="https://images.videolan.org/videolan-news.rss"/>
<outline text="Arca Noae" type="rss" htmlUrl="https://www.arcanoae.com/" xmlUrl="https://www.arcanoae.com/feed/"/>
<outline text="The Linux Mint Blog" type="rss" htmlUrl="https://blog.linuxmint.com" xmlUrl="https://blog.linuxmint.com/?feed=rss2"/>
<outline text="HiR Information Report" type="rss" htmlUrl="http://www.h-i-r.net/" xmlUrl="http://feeds.feedburner.com/HiR"/>
<outline text="Free Software Foundation of India - Feed" type="rss" htmlUrl="https://fsf.org.in/news/board-statement-2021" xmlUrl="https://fsf.org.in/feed.atom"/>
<outline text="securepairs.org" type="rss" htmlUrl="https://securepairs.org" xmlUrl="https://securepairs.org/feed/"/>
<outline text="The Register" type="atom" htmlUrl="https://www.theregister.com/" xmlUrl="https://www.theregister.com/headlines.atom"/>
<outline text="Vintage Everyday" type="atom" htmlUrl="http://www.vintag.es/" xmlUrl="http://feeds.feedburner.com/vintageeveryday"/>
<outline text="Small Technology Foundation’s News" type="rss" htmlUrl="https://small-tech.org/news/" xmlUrl="https://small-tech.org/news/index.xml"/>
<outline text="SmallCypress" type="rss" htmlUrl="https://smallcypress.bearblog.dev/" xmlUrl="https://smallcypress.bearblog.dev/feed/?type=rss"/>
<outline text="Gentoo Linux" type="rss" htmlUrl="https://www.gentoo.org/" xmlUrl="https://www.gentoo.org/feeds/news.xml"/>
<outline text="Nushell" type="atom" htmlUrl="https://www.nushell.sh/" xmlUrl="https://www.nushell.sh/atom.xml"/>
<outline text="Tedium: The Dull Side of the Internet." type="rss" htmlUrl="https://tedium.co/" xmlUrl="https://feed.tedium.co/"/>
<outline text="Tom's Hardware" type="rss" htmlUrl="https://www.tomshardware.com/" xmlUrl="https://www.tomshardware.com/feeds.xml"/>
<outline text="Citation Style Language" type="rss" htmlUrl="https://citationstyles.org/" xmlUrl="https://citationstyles.org/feed.xml"/>
<outline text="Inkscape!" type="rss" htmlUrl="https://inkscape.org/news/" xmlUrl="https://inkscape.org/news/feed/"/>
<outline text="Don’t smile for the camera – stop automated facial recognition!" type="rss" htmlUrl="https://algorithmwatch.org/en/dont-smile-for-the-camera/" xmlUrl="https://algorithmwatch.org/en/dont-smile-for-the-camera/feed/"/>
<outline text="Renewable Energy World" type="rss" htmlUrl="https://www.renewableenergyworld.com/" xmlUrl="https://www.renewableenergyworld.com/feed/"/>
<outline text="Right Of Publicity" type="rss" htmlUrl="https://rightofpublicity.com/" xmlUrl="https://rightofpublicity.com/feed"/>
<outline text="DB Browser for SQLite" type="rss" htmlUrl="https://sqlitebrowser.org/blog/" xmlUrl="https://sqlitebrowser.org/blog/index.xml"/>
<outline text="TorrentFreak" type="rss" htmlUrl="https://torrentfreak.com/" xmlUrl="https://torrentfreak.com/feed/"/>
<outline text="Glyn Moody – Techdirt" type="rss" htmlUrl="https://www.techdirt.com" xmlUrl="https://www.techdirt.com/user/glynmoody/feed/"/>
<outline text="DistroWatch" type="rss" htmlUrl="https://distrowatch.com/news/" xmlUrl="https://distrowatch.com/news/dw.xml"/>
<outline text="Ubuntu Blog" type="rss" htmlUrl="https://ubuntu.com/" xmlUrl="https://ubuntu.com/blog/feed"/>
<outline text="Ubuntu Buzz !" type="rss" htmlUrl="http://www.ubuntubuzz.com/" xmlUrl="http://feeds.feedburner.com/Ubuntubuzz"/>
<outline text="Kodi News" type="rss" htmlUrl="https://kodi.tv" xmlUrl="https://kodi.tv/rss.xml"/>
<outline text="Raspberry Pi Foundation" type="rss" htmlUrl="https://www.raspberrypi.org/" xmlUrl="https://www.raspberrypi.org/feed/"/>
<outline text="Raspberry Pi - News" type="rss" htmlUrl="https://www.raspberrypi.com/news/" xmlUrl="https://www.raspberrypi.com/news/feed/"/>
<outline text="DataGeek" type="rss" htmlUrl="https://datageeek.com" xmlUrl="https://datageeek.com/feed/"/>
<outline text="The Thunderbird Blog" type="rss" htmlUrl="https://blog.thunderbird.net/" xmlUrl="https://blog.thunderbird.net/feed/"/>
<outline text="ITTavern.com" type="rss" htmlUrl="https://ittavern.com/" xmlUrl="https://ittavern.com/rss.xml"/>
<outline text="OMG! Linux" type="rss" htmlUrl="https://www.omglinux.com/" xmlUrl="https://www.omglinux.com/feed/"/>
<outline text="BSD">
<outline text="FreeBSD Foundation" type="rss" htmlUrl="https://freebsdfoundation.org" xmlUrl="https://freebsdfoundation.org/feed/"/>
<outline text="Upcoming FreeBSD Events" type="rss" htmlUrl="https://www.freebsd.org/events/" xmlUrl="https://www.freebsd.org/events/feed.xml"/>
<outline text="Undeadly" type="rss" htmlUrl="https://undeadly.org/" xmlUrl="https://undeadly.org/cgi?action=rss"/>
<outline text="DragonFly BSD Digest" type="rss" htmlUrl="https://www.dragonflydigest.com" xmlUrl="https://www.dragonflydigest.com/feed/"/>
<outline text="Klara Inc." type="rss" htmlUrl="https://klarasystems.com" xmlUrl="https://klarasystems.com/feed/"/>
</outline>
</outline>
<outline text="CC">
<outline text="Defunct">
<outline text="Human Rights Watch News" type="rss" htmlUrl="https://www.hrw.org/" xmlUrl="https://www.hrw.org/rss/news"/>
<outline text="Counterpunch" type="rss" htmlUrl="https://www.counterpunch.org/" xmlUrl="http://www.counterpunch.org/feed/"/>
</outline>
<outline text="American Civil Liberties Union" type="rss" htmlUrl="https://www.aclu.org/" xmlUrl="https://www.aclu.org/foia-collections/feed"/>
<outline text="American Library Association" type="rss" htmlUrl="https://www.ala.org/news/" xmlUrl="https://www.ala.org/rss.xml"/>
<!-- defunct <outline text="Amnesty" type="rss" htmlUrl="https://blog.amnestyusa.org" xmlUrl="https://blog.amnestyusa.org/feed/"/> -->
<!-- anti-NATO, not actually anti-war <outline text="Antiwar.com" type="rss" htmlUrl="https://original.antiwar.com/" xmlUrl="https://feeds.feedburner.com/antiwarcom-original"/> -->
<!-- bad optics
<outline text="The Breach" type="rss" htmlUrl="https://breachmedia.ca/" xmlUrl="https://breachmedia.ca/feed/"/>
-->
<outline text="Committee to Protect Journalists" type="rss" htmlUrl="https://cpj.org/" xmlUrl="https://cpj.org/feed/"/>
<outline text="Common Dreams" type="rss" htmlUrl="https://www.commondreams.org/" xmlUrl="https://www.commondreams.org/feeds/feed.rss"/>
<outline text="Copyrightlately" type="rss" htmlUrl="https://copyrightlately.com/" xmlUrl="https://copyrightlately.com/feed/"/>
<outline text="Creative Commons" type="rss" htmlUrl="https://creativecommons.org" xmlUrl="https://creativecommons.org/feed/"/>
<outline text="DAWN" type="rss" htmlUrl="https://dawnmena.org/" xmlUrl="https://dawnmena.org/feed/"/>
<outline text="FAIR Blog" type="rss" htmlUrl="https://fair.org/blog/" xmlUrl="https://fair.org/blog/feed/"/>
<outline text="FSF blogs" type="rss" htmlUrl="http://www.fsf.org/blogs/recent-blog-posts" xmlUrl="https://static.fsf.org/fsforg/rss/blogs.xml"/>
<outline text="FSF News" type="rss" htmlUrl="http://www.fsf.org/news/aggregator" xmlUrl="https://static.fsf.org/fsforg/rss/news.xml"/>
<outline text="The Good Internet" type="rss" htmlUrl="https://goodinternetmagazine.com/" xmlUrl="https://goodinternetmagazine.com/rss/"/>
<outline text="The Grayzone" type="rss" htmlUrl="thegrayzone.com/" xmlUrl="https://thegrayzone.com/feed/"/>
<outline text="H2 View" type="rss" htmlUrl="https://www.h2-view.com" xmlUrl="https://www.h2-view.com/rss/feed/e15e1d6422c35afec038fbd559797494/"/>
<outline text="HRANA" type="rss" htmlUrl="https://www.en-hrana.org/" xmlUrl="https://www.en-hrana.org/feed/"/>
<outline text="Information Technology and Libraries" type="atom" htmlUrl="https://ital.corejournals.org/" xmlUrl="https://ital.corejournals.org/index.php/ital/gateway/plugin/WebFeedGatewayPlugin/atom"/>
<outline text="Jacobin" type="rss" htmlUrl="https://jacobin.com/" xmlUrl="https://jacobin.com/feed/"/>
<outline text="MAHB" type="rss" htmlUrl="https://mahb.stanford.edu/" xmlUrl="https://mahb.stanford.edu/feed/"/>
<outline text="The Coalition for Networked Information" type="rss" htmlUrl="https://www.cni.org/" xmlUrl="https://www.cni.org/feed"/>
<outline text="NBTV Newsletter" type="rss" htmlUrl="https://nbtv.substack.com/" xmlUrl="https://nbtv.substack.com/feed"/>
<outline text="New Humanist" type="rss" htmlUrl="https://newhumanist.org.uk/" xmlUrl="https://feeds.feedburner.com/NewHumanistBlog"/>
<outline text="The New Lede" type="rss" htmlUrl="https://www.thenewlede.org/category/news/" xmlUrl="https://www.thenewlede.org/feed/"/>
<outline text="netzpolitik.org" type="rss" htmlUrl="https://netzpolitik.org" xmlUrl="https://netzpolitik.org/feed/"/>
<outline text="ORG blog RSS" type="rss" htmlUrl="https://www.openrightsgroup.org" xmlUrl="https://www.openrightsgroup.org/rss.xml"/>
<outline text="Open Web Advocacy" type="rss" htmlUrl="https://open-web-advocacy.org/" xmlUrl="https://open-web-advocacy.org/feed.xml"/>
<outline text="The Overpopulation Project" type="rss" htmlUrl="https://overpopulation-project.com/" xmlUrl="https://overpopulation-project.com/feed/"/>
<outline text="Papers, Please!" type="rss" htmlUrl="https://papersplease.org/wp/feed/" xmlUrl="https://papersplease.org/wp/feed/"/>
<outline text="People vs Big Tech" type="rss" htmlUrl="https://peoplevsbig.tech/" xmlUrl="https://peoplevsbig.tech/feed/"/>
<outline text="Physicians for Human Rights" type="rss" htmlUrl="https://phr.org/" xmlUrl="https://phr.org/feed/"/>
<outline text="Press Gazette" type="rss" htmlUrl="https://pressgazette.co.uk/" xmlUrl="https://pressgazette.co.uk/feed/"/>
<outline text="Project Censored" type="rss" htmlUrl="https://www.projectcensored.org" xmlUrl="http://feeds.feedburner.com/projectcensored/gEpu"/>
<outline text="ProPublica: Articles and Investigations" type="rss" htmlUrl="https://www.propublica.org/feeds/main" xmlUrl="https://www.propublica.org/feeds/propublica/main"/>
<outline text="Public Citizen" type="rss" htmlUrl="https://www.citizen.org/news/" xmlUrl="https://www.citizen.org/feed/"/>
<outline text="Washingon-Baltimore News Guild" type="rss" htmlUrl="https://wbng.org/category/guild-news/" xmlUrl="https://wbng.org/feed/"/>
<outline text="Truthdig: Expert Reporting, Current News, Provocative Columnists" type="rss" htmlUrl="https://www.truthdig.com/" xmlUrl="https://www.truthdig.com/feed/"/>
<outline text="Truthout Stories" type="rss" htmlUrl="https://truthout.org" xmlUrl="https://truthout.org/feed/?format=feed"/>
<outline text="Western Water" type="rss" htmlUrl="https://www.western-water.com/" xmlUrl="https://www.western-water.com/feed/"/>
<outline text="Xnet" type="rss" htmlUrl="https://xnet-x.net/feed" xmlUrl="https://xnet-x.net/en/feed/"/>
<outline text="La Quadrature du Net" type="rss" htmlUrl="https://www.laquadrature.net" xmlUrl="https://www.laquadrature.net/en/feed/"/>
<outline text="Freedom From Religion Foundation" type="rss" htmlUrl="https://ffrf.org/" xmlUrl="https://ffrf.org/feed/"/>
<outline text="Locus Online" type="rss" htmlUrl="https://locusmag.com" xmlUrl="https://locusmag.com/feed/"/>
<outline text="Walled Culture - Glyn Moody" type="rss" htmlUrl="https://walledculture.org" xmlUrl="https://walledculture.org/feed/"/>
<outline text="Waxy.org" type="rss" htmlUrl="https://waxy.org/" xmlUrl="https://waxy.org/feed/"/>
<outline text="We Distribute" type="rss" htmlUrl="https://wedistribute.org/category/news/" xmlUrl="https://wedistribute.org/category/news/feed/"/>
<outline text="Votebeat" type="atom" htmlUrl="https://www.votebeat.org/" xmlUrl="https://www.votebeat.org/arc/outboundfeeds/rss/"/>
</outline>
<outline text="Science">
<outline text="Smithsonian Mag" type="rss" htmlUrl="https://www.smithsonianmag.com/" xmlUrl="https://www.smithsonianmag.com/rss/latest_articles/"/>
<outline text="ARRL" type="rss" htmlUrl="https://www.arrl.org/" xmlUrl="https://www.arrl.org/arrl.rss"/>
<outline text="Quanta Magazine" type="rss" htmlUrl="https://www.quantamagazine.org/computer-science/" xmlUrl="https://www.quantamagazine.org/computer-science/feed/"/>
<outline text="Phys.org" type="rss" htmlUrl="https://phys.org/" xmlUrl="https://phys.org/rss-feed/"/>
<outline text="Respectful Insolence" type="rss" htmlUrl="https://www.respectfulinsolence.com/" xmlUrl="https://www.respectfulinsolence.com/feed/"/>
<outline text="ScienceAlert" type="rss" htmlUrl="https://www.sciencealert.com" xmlUrl="https://www.sciencealert.com/feed"/>
<outline text="Science News" type="rss" htmlUrl="https://www.sciencenews.org" xmlUrl="https://www.sciencenews.org/feed"/>
<outline text="The Scientist" type="atom" htmlUrl="https://www.the-scientist.com/" xmlUrl="https://www.the-scientist.com/atom/latest"/>
<outline text="The Conversation – Science + Technology" type="rss" htmlUrl="https://theconversation.com" xmlUrl="https://theconversation.com/uk/technology/articles.atom"/>
</outline>
<outline text="USA">
<outline text="Defunct">
<outline text="CNET - spam" type="rss" htmlUrl="https://www.cnet.com/#ftag=CADf328eec" xmlUrl="https://www.cnet.com/rss/all/"/>
</outline>
<outline text="Vox" type="rss" htmlUrl="https://www.vox.com/" xmlUrl="https://www.vox.com/rss/index.xml"/>
<outline text="The Nation" type="rss" htmlUrl="https://www.thenation.com" xmlUrl="https://www.thenation.com/feed/?post_type=article"/>
<outline text="The Washington Spectator" type="rss" htmlUrl="https://washingtonspectator.org/" xmlUrl="https://washingtonspectator.org/feed/"/>
<outline text="NOTUS" type="rss" htmlUrl="https://www.notus.org/" xmlUrl="https://www.notus.org/index.rss"/>
<outline text="Semafor" type="rss" htmlUrl="https://semafor.com/" xmlUrl="https://www.semafor.com/rss.xml"/>
<outline text="Christian Science Monitor" type="rss" htmlUrl="https://www.csmonitor.com" xmlUrl="https://rss.csmonitor.com/feeds/csm?format=xml"/>
<!--
<outline text="New York Post" type="rss" htmlUrl="https://nypost.com" xmlUrl="https://nypost.com/feed/"/>
-->
<outline text="Universities">
<outline text="Case Western Reserve" type="rss" htmlUrl="https://observer.case.edu" xmlUrl="https://observer.case.edu/feed/"/>
<outline text="The Emory Wheel" type="rss" htmlUrl="https://emorywheel.com" xmlUrl="https://emorywheel.com/xml/feed/firehose.xml"/>
<outline text="The Harvard Gazette" type="rss" htmlUrl="https://news.harvard.edu/gazette/" xmlUrl="https://news.harvard.edu/gazette/feed/"/>
<outline text="Local News Initiative (Northwestern University)" type="atom" htmlUrl="https://localnewsinitiative.northwestern.edu/posts/" xmlUrl="https://localnewsinitiative.northwestern.edu/feed.xml"/>
<outline text="The Stanford Daily" type="rss" htmlUrl="https://stanforddaily.com" xmlUrl="https://stanforddaily.com/feed/"/>
<outline text="Kent Wired" type="rss" htmlUrl="https://kentwired.com" xmlUrl="https://kentwired.com/feed/"/>
<outline text="Daily Sundial" type="rss" htmlUrl="https://sundial.csun.edu/" xmlUrl="https://sundial.csun.edu/feed/"/>
<outline text="The University Record" type="rss" htmlUrl="https://record.umich.edu/" xmlUrl="https://record.umich.edu/feed/"/>
<outline text="The Michigan Daily" type="rss" htmlUrl="https://www.michigandaily.com/" xmlUrl="https://www.michigandaily.com/feed/"/>
<outline text="The Chronicle of Higher Education | Global" type="rss" htmlUrl="https://www.chronicle.com/tag/international" xmlUrl="https://www.chronicle.com/tag/international.rss"/>
</outline>
<outline text="American Oversight" type="rss" htmlUrl="https://www.americanoversight.org/" xmlUrl="https://americanoversight.org/feed/"/>
<outline text="Federal News Network" type="rss" htmlUrl="https://federalnewsnetwork.com" xmlUrl="https://federalnewsnetwork.com/feed/"/>
<outline text="FedScoop" type="rss" htmlUrl="https://fedscoop.com/" xmlUrl="https://fedscoop.com/feed/"/>
<outline text="Fifth Domain" type="rss" htmlUrl="https://www.fifthdomain.com" xmlUrl="https://www.c4isrnet.com/arc/outboundfeeds/rss/?outputType=xml"/>
<outline text="Task & Purpose" type="rss" htmlUrl="https://taskandpurpose.com" xmlUrl="https://taskandpurpose.com/feed/"/>
<outline text="Navy Times" type="rss" htmlUrl="https://www.navytimes.com" xmlUrl="https://www.navytimes.com/arc/outboundfeeds/rss/category/news/?outputType=xml"/>
<outline text="Air Force Times" type="rss" htmlUrl="https://www.airforcetimes.com" xmlUrl="https://www.airforcetimes.com/arc/outboundfeeds/rss/category/news/?outputType=xml"/>
<outline text="Army Times" type="rss" htmlUrl="https://www.armytimes.com" xmlUrl="https://www.armytimes.com/arc/outboundfeeds/rss/category/news/?outputType=xml"/>
<outline text="Marine Corps Times" type="rss" htmlUrl="https://www.marinecorpstimes.com" xmlUrl="https://www.marinecorpstimes.com/arc/outboundfeeds/rss/category/news/?outputType=xml"/>
<outline text="The Dissenter" type="rss" htmlUrl="https://thedissenter.org/" xmlUrl="https://thedissenter.org/rss/"/>
<!-- Koch runs The Reason Foundation <outline text="Reason.com (Koch)" type="rss" htmlUrl="https://reason.com/" xmlUrl="https://reason.com/feed/"/> -->
<!-- scheerpost has become a Kremlin propaganda site <outline text="scheerpost.com" type="rss" htmlUrl="https://scheerpost.com/" xmlUrl="https://scheerpost.com/feed/"/> -->
<outline text="Courthouse News Service" type="rss" htmlUrl="https://www.courthousenews.com/" xmlUrl="https://www.courthousenews.com/feed/"/>
<outline text="JURIST – News" type="rss" htmlUrl="https://www.jurist.org/news/" xmlUrl="https://www.jurist.org/news/feed/"/>
<outline text="Digital Rights">
<outline text="Center for Investigative Reporting" type="rss" htmlUrl="https://revealnews.org/" xmlUrl="https://revealnews.org/feed/"/>
<outline text="The Citizen Lab" type="rss" htmlUrl="https://citizenlab.ca" xmlUrl="https://citizenlab.ca/feed/"/>
<outline text="Techdirt." type="rss" htmlUrl="https://www.techdirt.com" xmlUrl="https://www.techdirt.com/feed/"/>
<outline text="Deeplinks (EFF)" type="rss" htmlUrl="https://www.eff.org/" xmlUrl="https://www.eff.org/rss/updates.xml"/>
<outline text="FFII" type="rss" htmlUrl="https://ffii.org/" xmlUrl="https://ffii.org/feed/"/>
</outline>
<outline text="Digital Music News" type="rss" htmlUrl="https://www.digitalmusicnews.com/" xmlUrl="https://www.digitalmusicnews.com/feed/?format=rss"/>
<outline text="Variety" type="rss" htmlUrl="https://variety.com/" xmlUrl="https://variety.com/feed/"/>
<outline text="Alabama Reflector (Alabama)" type="rss" htmlUrl="https://alabamareflector.com/" xmlUrl="https://alabamareflector.com/feed/"/>
<outline text="Tuscon Sentinel (Arizona)" type="rss" htmlUrl="https://www.tucsonsentinel.com/" xmlUrl="https://www.tucsonsentinel.com/site/rss/"/>
<outline text="Arkansas Advocate (Arkanasas)" type="rss" htmlUrl="https://arkansasadvocate.com/feed/localFeed/" xmlUrl="https://arkansasadvocate.com/feed/localFeed/"/>
<outline text="Georgia Recorder (Georgia)" type="rss" htmlUrl="https://georgiarecorder.com/" xmlUrl="https://georgiarecorder.com/feed/"/>
<outline text="Indiana Capital Chronicle (Indiana)" type="rss" htmlUrl="https://indianacapitalchronicle.com/" xmlUrl="https://indianacapitalchronicle.com/feed/localFeed/"/>
<outline text="Kansas Reflector (Kansas)" type="rss" htmlUrl="https://kansasreflector.com/" xmlUrl="https://kansasreflector.com/feed/"/>
<outline text="Kentucky Lantern (Kentucky)" type="rss" htmlUrl="https://kentuckylantern.com/" xmlUrl="https://kentuckylantern.com/feed/localFeed/"/>
<outline text="Maine Morning Star" type="rss" htmlUrl="https://mainemorningstar.com/" xmlUrl="https://mainemorningstar.com/feed/"/>
<outline text="Bridge Michigan (Michigan)" type="rss" htmlUrl="https://www.bridgemi.com/" xmlUrl="https://bridgemi.com/feed/?partner-feed=latest-articles"/>
<!-- no feeds for Detroit any more
<outline text="Detroit Free Press (gannett)" type="rss" htmlUrl="https://freep.com/" xmlUrl="http://freep.com/"/>
<outline text="Detroit News (gannett)" type="rss" htmlUrl="https://eu.detroitnews.com/" xmlUrl="http://rssfeeds.detroitnews.com/detroit/home&x=1"/>
-->
<outline text="Michigan Advance (Michigan)" type="rss" htmlUrl="https://michiganadvance.com/" xmlUrl="https://michiganadvance.com/feed/"/>
<!--
<outline text="Mlive (Michigan) — AI slop tainted" type="rss" htmlUrl="https://www.mlive.com/" xmlUrl="https://www.mlive.com/arc/outboundfeeds/rss/?outputType=xml"/>
-->
<outline text="MinPost (Minnesota)" type="rss" htmlUrl="https://www.minnpost.com/tag/news/" xmlUrl="https://www.minnpost.com/feed/"/>
<outline text="Twin Cities (Minnesota)" type="rss" htmlUrl="https://www.twincities.com" xmlUrl="https://www.twincities.com/feed/"/>
<outline text="Mississippi Free Press (Mississippi)" type="rss" htmlUrl="https://www.mississippifreepress.org/news/" xmlUrl="https://www.mississippifreepress.org/feed/"/>
<outline text="Nevada Current (Nevada)" type="rss" htmlUrl="https://nevadacurrent.com/" xmlUrl="https://nevadacurrent.com/feed/localFeed/"/>
<outline text="North Dakota Monitor (North Dakota)" type="rss" htmlUrl="https://northdakotamonitor.com/" xmlUrl="https://northdakotamonitor.com/feed/localFeed/"/>
<outline text="Southeast Ohio (Ohio)" type="rss" htmlUrl="https://southeastohiomagazine.com/" xmlUrl="https://southeastohiomagazine.com/feed/"/>
<outline text="Nebraska Examinier (Nebraska)" type="rss" htmlUrl="https://nebraskaexaminer.com/" xmlUrl="https://nebraskaexaminer.com/feed/"/>
<outline text="Memhpis Flyer (Tennessee)" type="rss" htmlUrl="https://www.memphisflyer.com/" xmlUrl="https://www.memphisflyer.com/feed/"/>
<outline text="Tennessee Lookout (Tennessee)" type="rss" htmlUrl="https://tennesseelookout.com/" xmlUrl="https://tennesseelookout.com/feed/localFeed/"/>
<outline text="Lonestar Live (Texas)" type="rss" htmlUrl="https://www.lonestarlive.com/news/" xmlUrl="https://www.lonestarlive.com/arc/outboundfeeds/rss/?outputType=xml"/>
<outline text="KSL (Utah)" type="rss" htmlUrl="https://www.ksl.com/" xmlUrl="https://www.ksl.com/rss/news"/>
<outline text="Utah Education Network (Utah)" type="rss" htmlUrl="https://www.uen.org/" xmlUrl="https://www.uen.org/feeds/rss/news.xml.php"/>
<outline text="Utah News Dispatch (Utah)" type="rss" htmlUrl="https://utahnewsdispatch.com/" xmlUrl="https://utahnewsdispatch.com/feed/localFeed/"/>
<outline text="Brattleboro Reformer (Vermont)" type="rss" htmlUrl="http://www.reformer.com/" xmlUrl="https://www.reformer.com/search/?f=rss&t=article&l=50"/>
<outline text="New Yorker (Condé Nast)" type="rss" htmlUrl="https://www.newyorker.com/" xmlUrl="https://www.newyorker.com/feed/rss"/>
<outline text="Los Angeles Times" type="rss" htmlUrl="https://www.latimes.com/" xmlUrl="https://www.latimes.com/index.rss"/>
<outline text="New York Times — AI slop tainted?" type="rss" htmlUrl="https://www.nytimes.com" xmlUrl="https://rss.nytimes.com/services/xml/rss/nyt/HomePage.xml"/>
<outline text="New York Times > World — AI slop tainted?" type="rss" htmlUrl="https://www.nytimes.com/section/world" xmlUrl="https://www.nytimes.com/svc/collections/v1/publish/https://www.nytimes.com/section/world/rss.xml"/>
<!-- <outline text="The Hill" type="rss" htmlUrl="https://thehill.com/" xmlUrl="https://thehill.com/feed/?feed=partnerfeed-news-feed&format=rss"/> too much blocking via javascript -->
<outline text="The Atlantic" type="rss" htmlUrl="https://www.theatlantic.com/" xmlUrl="http://feeds.feedburner.com/TheAtlantic?format=xml"/>
<outline text="U.S. News" type="rss" htmlUrl="https://www.usnews.com/news" xmlUrl="https://www.usnews.com/rss/news"/>
<outline text="Ann Arbor Observer" type="rss" htmlUrl="https://annarborobserver.com/" xmlUrl="https://annarborobserver.com/feed/"/>
<outline text="Rolling Stone" type="rss" htmlUrl="https://www.rollingstone.com/" xmlUrl="https://www.rollingstone.com/feed/"/>
<outline text="TMZ" type="rss" htmlUrl="https://www.tmz.com/" xmlUrl="https://www.tmz.com/rss.xml"/>
<outline text="European Digital Rights (EDRi)" type="rss" htmlUrl="https://edri.org/" xmlUrl="https://edri.org/feed/"/>
<outline text="Scholarly Kitchen" type="rss" htmlUrl="https://scholarlykitchen.sspnet.org/" xmlUrl="https://scholarlykitchen.sspnet.org/feed/"/>
<outline text="Futurism" type="rss" htmlUrl="https://futurism.com" xmlUrl="https://futurism.com/feed"/>
<outline text="epic.org" type="rss" htmlUrl="http://epic.org/" xmlUrl="https://epic.org/search/feed/rss2/"/>
<outline text="Privacy International" type="rss" htmlUrl="https://privacyinternational.org/" xmlUrl="https://privacyinternational.org/rss.xml"/>
<outline text="April" type="rss" htmlUrl="https://www.april.org/en/news" xmlUrl="https://www.april.org/en/news/feed"/>
<outline text="noyb.eu - schrems" type="rss" htmlUrl="https://noyb.eu/en" xmlUrl="https://noyb.eu/en/rss"/>
<outline text="GNU Taler" type="rss" htmlUrl="https://taler.net//" xmlUrl="https://www.taler.net/en/rss.xml"/>
</outline>
<outline text="Nature">
<outline text="Climate News Network" type="rss" htmlUrl="https://www.theenergymix.com" xmlUrl="https://www.theenergymix.com/feed/"/>
<outline text="DeSmogBlog" type="rss" htmlUrl="https://www.desmog.com/" xmlUrl="https://www.desmog.com/feed/"/>
<outline text="EcoWatch" type="rss" htmlUrl="https://www.ecowatch.com/" xmlUrl="https://www.ecowatch.com/feed"/>
<outline text="The Green Party UK" type="rss" htmlUrl="https://www.greenparty.org.uk/" xmlUrl="https://greenparty.org.uk/feed/?preview=true"/>
<outline text="International Dark-Sky Association" type="rss" htmlUrl="https://www.darksky.org" xmlUrl="https://darksky.org/feed/"/>
<outline text="NOS News" type="rss" htmlUrl="https://oceanservice.noaa.gov/news/" xmlUrl="https://oceanservice.noaa.gov/rss/nosnews.xml"/>
<outline text="The Revelator" type="rss" htmlUrl="https://therevelator.org/" xmlUrl="https://therevelator.org/feed/"/>
</outline>
<outline text="Nat Sec">
<outline text="Defunct">
<outline text="nsa - Google News" type="rss" htmlUrl="https://news.google.com/search?hl=en-US&gl=US&q=nsa&ceid=US:en" xmlUrl="https://news.google.com/rss/search?hl=en-US&gl=US&q=nsa&ceid=US:en"/>
<outline text="censorship - Google News" type="rss" htmlUrl="https://news.google.com/search?hl=en-US&gl=US&q=censorship&ceid=US:en" xmlUrl="https://news.google.com/rss/search?hl=en-US&gl=US&q=censorship&ceid=US:en"/>
<outline text="drone killed - Google News" type="rss" htmlUrl="https://news.google.com/search?hl=en-US&gl=US&q=drone+killed&ceid=US:en" xmlUrl="https://news.google.com/rss/search?hl=en-US&gl=US&q=drone+killed&ceid=US:en"/>
<outline text="cia - Google News" type="rss" htmlUrl="https://news.google.com/search?hl=en-US&gl=US&q=cia&ceid=US:en" xmlUrl="https://news.google.com/rss/search?hl=en-US&gl=US&q=cia&ceid=US:en"/>
<outline text="assange - Google News" type="rss" htmlUrl="https://news.google.com/search?hl=en-US&gl=US&q=assange&ceid=US:en" xmlUrl="https://news.google.com/rss/search?hl=en-US&gl=US&q=assange&ceid=US:en"/>
<outline text="gchq - Google News" type="rss" htmlUrl="https://news.google.com/search?hl=en-US&gl=US&q=gchq&ceid=US:en" xmlUrl="https://news.google.com/rss/search?hl=en-US&gl=US&q=gchq&ceid=US:en"/>
<outline text="wikileaks - Google News" type="rss" htmlUrl="https://news.google.com/search?hl=en-US&gl=US&q=wikileaks&ceid=US:en" xmlUrl="https://news.google.com/rss/search?hl=en-US&gl=US&q=wikileaks&ceid=US:en"/>
</outline>
</outline>
<outline text="World">
<outline text="Paywall">
<outline text="The Straits Times Asia News" type="rss" htmlUrl="https://www.straitstimes.com/" xmlUrl="https://www.straitstimes.com/news/tech/rss.xml"/>
<!-- Le Monde is now slop
<outline text="France - (Le Monde.fr)" type="rss" htmlUrl="https://www.lemonde.fr/en/rss/une.xml" xmlUrl="https://www.lemonde.fr/en/rss/une.xml"/>
-->
</outline>
<outline text="Covered automatically">
<outline text="MintPress News" type="rss" htmlUrl="https://www.mintpressnews.com" xmlUrl="https://www.mintpressnews.com/feed/"/>
</outline>
<outline text="VOA">
<outline text="VOA Technology" type="rss" htmlUrl="https://www.voanews.com/z/621" xmlUrl="https://www.voanews.com/api/zyritequir"/>
<outline text="VOA Europe" type="rss" htmlUrl="https://www.voanews.com/z/611" xmlUrl="https://www.voanews.com/api/zjboveytit"/>
<outline text="VOA Press" type="rss" htmlUrl="https://www.voanews.com/z/5818" xmlUrl="https://www.voanews.com/api/zpmyqie--yqm"/>
<outline text="VOA Fact Check" type="rss" htmlUrl="https://www.voanews.com/z/7515" xmlUrl="https://www.voanews.com/api/zmbjqvebv-qr"/>
<outline text="VOA Africa" type="rss" htmlUrl="https://www.voanews.com/z/7515" xmlUrl="https://www.voanews.com/api/z-botevtiq"/>
<outline text="VOA East Asia" type="rss" htmlUrl="https://www.voanews.com/z/600" xmlUrl="https://www.voanews.com/api/zobo_egviy"/>
<outline text="VOA Log On" type="rss" htmlUrl="https://www.voanews.com/z/6714" xmlUrl="https://www.voanews.com/api/zpjuqve-_kqq"/>
</outline>
<outline text="Asia">
<outline text="India">
<outline text="India (Bhaskar English)" type="rss" htmlUrl="https://www.bhaskarenglish.in/" xmlUrl="https://www.bhaskarenglish.in/rss-v1--category-16336.xml"/>
<outline text="India (BW BusinessWorld)" type="rss" htmlUrl="https://businessworld.in/" xmlUrl="https://businessworld.in/rss/news-article.xml"/>
<outline text="India (Deccan Chronicle)" type="rss" htmlUrl="https://www.deccanchronicle.com/" xmlUrl="https://www.deccanchronicle.com/google_feeds.xml"/>
<outline text="India (The Economic Times)" type="rss" htmlUrl="https://economictimes.indiatimes.com/" xmlUrl="https://economictimes.indiatimes.com/tech/rssfeeds/13357270.cms"/>
<outline text="India (The Hindu)" type="rss" htmlUrl="https://www.thehindu.com/" xmlUrl="https://www.thehindu.com/news/national/feeder/default.rss"/>
<outline text="India (Hindustan Times)" type="rss" htmlUrl="https://www.hindustantimes.com/" xmlUrl="https://www.hindustantimes.com/feeds/rss/latest/rssfeed.xml"/>
<outline text="India (NDTV) - tainted by LLM slop ²⁰²⁵¯⁰⁵" type="rss" htmlUrl="https://www.ndtv.com/latest/" xmlUrl="https://feeds.feedburner.com/ndtvnews-top-stories"/>
<outline text="India (The New Indian Express)" type="rss" htmlUrl="https://www.newindianexpress.com/" xmlUrl="https://www.newindianexpress.com/api/v1/collections/northeast-nation.rss"/>
<outline text="India (Outlook India)" type="rss" htmlUrl="https://www.outlookindia.com/" xmlUrl="https://www.outlookindia.com/stories.rss"/>
<outline text="India (The North Lines)" type="rss" htmlUrl="https://thenorthlines.com/" xmlUrl="https://thenorthlines.com/feed/"/>
<outline text="India (Observer Research Foundation)" type="rss" htmlUrl="https://www.orfonline.org" xmlUrl="https://www.orfonline.org/feed/?post_type=research&withoutcomments=1"/>
<!-- ai slop <outline text="India (The Times of India)" type="rss" htmlUrl="https://timesofindia.indiatimes.com/" xmlUrl="https://timesofindia.indiatimes.com/rssfeedstopstories.cms"/> -->
</outline>
<outline text="Hong Kong Free Press HKFP" type="rss" htmlUrl="https://hongkongfp.com/" xmlUrl="https://hongkongfp.com/feed/"/>
<outline text="Radio Free Asia (RFA)" type="rss" htmlUrl="https://www.rfa.org/english" xmlUrl="https://www.rfa.org/arc/outboundfeeds/english/rss/"/>
</outline>
<outline text="Australia (The Age)" type="rss" htmlUrl="https://www.theage.com.au/" xmlUrl="https://www.theage.com.au/rss/feed.xml"/>
<outline text="Australia (SBS News)" type="rss" htmlUrl="https://www.sbs.com.au/news/topic/australia/" xmlUrl="https://www.sbs.com.au/news/topic/australia/feed"/>
<outline text="Australia (The Spectator Ltd)" type="rss" htmlUrl="https://www.spectator.com.au/" xmlUrl="https://www.spectator.com.au/feed/"/>
<outline text="Australia (The Strategist)" type="rss" htmlUrl="https://www.aspistrategist.org.au/" xmlUrl="https://www.aspistrategist.org.au/feed/"/>
<outline text="Canada - (CBC | Business News)" type="rss" htmlUrl="http://www.cbc.ca/business/?cmp=rss" xmlUrl="https://rss.cbc.ca/lineup/business.xml"/>
<outline text="Canada - (CBC | Top Stories News)" type="rss" htmlUrl="http://www.cbc.ca/news/?cmp=rss" xmlUrl="https://www.cbc.ca/webfeed/rss/rss-topstories"/>
<outline text="Canada - (CBC | Technology News)" type="rss" htmlUrl="https://www.cbc.ca/news/science" xmlUrl="https://www.cbc.ca/webfeed/rss/rss-technology"/>
<outline text="Canada - (The Tyee)" type="rss" htmlUrl="https://thetyee.ca/" xmlUrl="https://thetyee.ca/rss2.xml"/>
<outline text="Canada - (The Walrus)" type="atom" htmlUrl="https://thewalrus.ca/" xmlUrl="https://thewalrus.ca/feed/"/>
<outline text="Costa Rica - (Tico Times)" type="rss" htmlUrl="https://ticotimes.net/" xmlUrl="https://ticotimes.net/feed"/>
<outline text="Estonia - (Eesti Rahvusringhääling)" type="rss" htmlUrl="https://news.err.ee/" xmlUrl="https://news.err.ee/rss"/>
<outline text="Europe - (Medievalists.net)" type="rss" htmlUrl="https://www.medievalists.net/" xmlUrl="https://www.medievalists.net/feed/"/>
<outline text="France - (France24)" type="rss" htmlUrl="https://www.france24.com/en/" xmlUrl="https://www.france24.com/en/rss"/>
<outline text="Germany - (Der Spiegel)" type="rss" htmlUrl="https://www.spiegel.de/" xmlUrl="https://www.spiegel.de/international/index.rss"/>
<outline text="Germany - (Deutsche Welle)" type="rss" htmlUrl="https://www.dw.com/en/africa-goes-e-mobile-in-a-bid-to-curb-emissions/a-64538737?maca=en-rss-en-all-1573-xml-atom" xmlUrl="https://rss.dw.com/atom/rss-en-all"/>
<outline text="Greece - (Ekathimerini)" type="rss" htmlUrl="https://www.ekathimerini.com/infeeds/rss/nx-rss-feed.xml" xmlUrl="https://feeds.feedburner.com/ekathimerini/sKip"/>
<outline text="Hungary (Telex)" type="rss" htmlUrl="https://telex.hu/english/" xmlUrl="https://telex.hu/rss/archivum?filters=%7B%22superTagSlugs%22%3A%5B%22english%22%5D%2C%22parentId%22%3A%5B%22null%22%5D%7D&perPage=10"/>
<outline text="Hungary (Insight Hungary)" type="rss" htmlUrl="https://insighthungary.444.hu/" xmlUrl="https://insighthungary.444.hu/feed/"/>
<outline text="Hungary (Mérték Médiaelemző Műhely)" type="rss" htmlUrl="https://mertek.eu/en/category/blog-en/" xmlUrl="https://mertek.eu/feed/"/>
<outline text="Ireland (Irish Examiner)" type="atom" htmlUrl="https://www.irishexaminer.com/" xmlUrl="https://www.irishexaminer.com/feed/35-top_news.xml"/>
<outline text="Ireland (RTÉ)" type="rss" htmlUrl="https://about.rte.ie" xmlUrl="https://about.rte.ie/feed/"/>
<outline text="Kurdistan - (ANFEnglish)" type="rss" htmlUrl="https://english.anf-news.com/" xmlUrl="https://english.anf-news.com/feed.rss"/>
<!-- missing RSS now <outline text="Kurdistan - (Hengaw)" type="rss" htmlUrl="https://hengaw.net/en/news/" xmlUrl="https://hengaw.net/en/news/rss.xml"/> -->
<outline text="Latin America (teleSUR: .ru)" type="rss" htmlUrl="https://www.telesurenglish.net" xmlUrl="https://www.telesurenglish.net/feed/"/>
<outline text="Latin America (Prensa Latina)" type="rss" htmlUrl="https://www.plenglish.com/" xmlUrl="https://www.plenglish.com/feed/"/>
<outline text="Latvia (LSM)" type="rss" htmlUrl="https://eng.lsm.lv/" xmlUrl="https://eng.lsm.lv/rss/?lang=en&catid=315"/>
<outline text="Lithuania (LRT)" type="rss" htmlUrl="https://www.lrt.lt/en/news-in-english" xmlUrl="https://www.lrt.lt/en/news-in-english?rss"/>
<outline text="Luxembourg (RTL)" type="rss" htmlUrl="https://today.rtl.lu/" xmlUrl="https://today.rtl.lu/rss/news"/>
<outline text="Nicaragua (La Prensa SA)" type="rss" htmlUrl="https://www.laprensani.com/english/" xmlUrl="https://www.laprensani.com/english/feed"/>
<outline text="Mexico - (Mexico News Daily)" type="rss" htmlUrl="https://mexiconewsdaily.com/" xmlUrl="https://mexiconewsdaily.com/feed/"/>
<outline text="Netherlands - (NL Times)" type="rss" htmlUrl="https://nltimes.nl/" xmlUrl="https://nltimes.nl/rssfeed2"/>
<outline text="New Eastern Europe" type="rss" htmlUrl="https://neweasterneurope.eu/" xmlUrl="https://neweasterneurope.eu/feed/"/>
<outline text="Nordic">
<outline text="Nordic Review of International Studies" type="atom" htmlUrl="https://nris.journal.fi/" xmlUrl="https://nris.journal.fi/gateway/plugin/WebFeedGatewayPlugin/atom"/>
<outline text="The Barents Observer" type="rss" htmlUrl="https://thebarentsobserver.com/en/" xmlUrl="https://thebarentsobserver.com/en/rss"/>
<outline text="Finland">
<outline text="YLE News" type="rss" htmlUrl="https://yle.fi/news" xmlUrl="https://feeds.yle.fi/uutiset/v1/recent.rss?publisherIds=YLE_NEWS"/>
</outline>
<outline text="Norge">
<outline text="TrønderRød" type="rss" htmlUrl="https://tronderrod.no/" xmlUrl="https://tronderrod.no/feed/"/>
<outline text="Lars Egelands blogg" type="rss" htmlUrl="https://larsegeland.com" xmlUrl="https://larsegeland.com/feed/"/>
<outline text="Biblioteket tar saka #librarycase" type="rss" htmlUrl="https://bibliotekettarsaka.com" xmlUrl="https://bibliotekettarsaka.com/feed/"/>
<outline text="NRK" type="rss" htmlUrl="https://www.nrk.no/nyheter/" xmlUrl="https://www.nrk.no/nyheter/siste.rss"/>
<outline text="Digi.NO" type="rss" htmlUrl="http://www.digi.no" xmlUrl="https://www.digi.no/rss"/>
<outline text="ITavisen.NO" type="rss" htmlUrl="https://itavisen.no/" xmlUrl="https://itavisen.no/feed/"/>
</outline>
<outline text="Sverige">
<outline text="Femte juli" type="rss" htmlUrl="https://femtejuli.se" xmlUrl="https://femtejuli.se/feed/"/>
<outline text="Mårtenssonsmeningar" type="rss" htmlUrl="http://martenssonsmeningar.se" xmlUrl="http://martenssonsmeningar.se/feed/"/>
<outline text="The Local.SE" type="rss" htmlUrl="https://www.thelocal.se/" xmlUrl="https://feeds.thelocal.com/rss/se"/>
<outline text="M3" type="rss" htmlUrl="https://www.m3.se/" xmlUrl="https://www.m3.se/feed"/>
<outline text="PC För Alla" type="rss" htmlUrl="https://www.pcforalla.se/" xmlUrl="https://www.pcforalla.se/feed"/>
<outline text="Svenska Dagbladet (svd)" type="rss" htmlUrl="https://www.svd.se/" xmlUrl="https://www.svd.se/feed/articles.rss"/>
<outline text="Sydsvenskan" type="rss" htmlUrl="https://www.sydsvenskan.se" xmlUrl="https://www.sydsvenskan.se/rss.xml?latest"/>
<outline text="Smålandsposten" type="rss" htmlUrl="https://www.smp.se/" xmlUrl="https://www.smp.se/feed"/>
<outline text="Helsingborgs Dagblad" type="rss" htmlUrl="https://www.hd.se" xmlUrl="https://www.hd.se/rss.xml?latest=x"/>
<outline text="Swedish Authority for Privacy Protection" type="rss" htmlUrl="https://www.imy.se/en/news/" xmlUrl="https://www.imy.se/en/news/rss/"/>
</outline>
<outline text="Danmark">
<outline text="DR" type="rss" htmlUrl="https://www.dr.dk" xmlUrl="https://www.dr.dk/nyheder/service/feeds/senestenyt"/>
<outline text="The Local.DK" type="rss" htmlUrl="https://www.thelocal.dk/" xmlUrl="https://feeds.thelocal.com/rss/dk"/>
<outline text="Version2" type="rss" htmlUrl="https://www.version2.dk/" xmlUrl="https://www.version2.dk/rss"/>
<outline text="Politiken.dk" type="rss" htmlUrl="http://politiken.dk/" xmlUrl="https://politiken.dk/rss/senestenyt.rss"/>
</outline>
</outline>
<outline text="Philippines (Philippine Daily Inquirer)" type="rss" htmlUrl="https://globalnation.inquirer.net/" xmlUrl="https://www.inquirer.net/fullfeed/"/>
<outline text="Poland (Polskie Radio)" type="rss" htmlUrl="https://www.polskieradio.pl/395,english-section" xmlUrl="https://www.polskieradio.pl/rss/e6979d4e-5bf9-4cbf-90f4-76d2bb74e60b"/>
<outline text="Romania (Recorder)" type="rss" htmlUrl="https://recorder.ro/english/" xmlUrl="https://recorder.ro/english/feed/"/>
<outline text="Romania (Rise Project)" type="rss" htmlUrl="https://recorder.ro/" xmlUrl="https://recorder.ro/feed/"/>
<outline text="Caucasus (OC Media)" type="rss" htmlUrl="https://oc-media.org/news/" xmlUrl="https://oc-media.org/feed/"/>
<outline text="Russia (Meduza.io)" type="rss" htmlUrl="https://meduza.io/en/" xmlUrl="https://meduza.io/rss/en/all"/>
<outline text="Russia (The Moscow Times)" type="rss" htmlUrl="https://www.themoscowtimes.com/" xmlUrl="https://www.themoscowtimes.com/rss/news"/>
<outline text="Spain (El País)" type="rss" htmlUrl="https://english.elpais.com/" xmlUrl="https://feeds.elpais.com/mrss-s/pages/ep/site/english.elpais.com/portada"/>
<outline text="Spain (Muy Linux)" type="rss" htmlUrl="https://www.muylinux.com/" xmlUrl="https://www.muylinux.com/feed/"/>
<outline text="South Africa (TechCentral)" type="rss" htmlUrl="https://techcentral.co.za/" xmlUrl="https://techcentral.co.za/feed/"/>
<outline text="Turkey (bianet)" type="rss" htmlUrl="https://www.bianet.org/english" xmlUrl="https://bianet.org/rss/english"/>
<outline text="Ukraine (Kyiv Independent)" type="rss" htmlUrl="https://kyivindependent.com/news-archive/" xmlUrl="https://kyivindependent.com/news-archive/rss/"/>
<outline text="UK">
<outline text="UK (The Guardian)" type="rss" htmlUrl="https://www.theguardian.com/europe/" xmlUrl="https://www.theguardian.com/europe/rss"/>
<outline text="UK (The Highland Times)" type="rss" htmlUrl="https://thehighlandtimes.com/" xmlUrl="https://thehighlandtimes.com/feed/"/>
<outline text="UK (The Independent)" type="rss" htmlUrl="https://www.independent.co.uk/" xmlUrl="https://www.independent.co.uk/rss"/>
<outline text="UK (Ipswich)" type="rss" htmlUrl="https://www.ipswich.co.uk/" xmlUrl="https://www.ipswich.co.uk/rss/"/>
<outline text="UK (The Scotsman)" type="rss" htmlUrl="https://www.scotsman.com/news/" xmlUrl="https://www.scotsman.com/news/rss"/>
<outline text="UK (New Statesman)" type="rss" htmlUrl="https://www.newstatesman.com/feeds" xmlUrl="https://www.newstatesman.com/feed"/>
<outline text="UK (StokeTrentLive)" type="rss" htmlUrl="https://www.stokesentinel.co.uk/news/" xmlUrl="https://www.stokesentinel.co.uk/news/?service=rss"/>
</outline>
<outline text="Vietnam (The Vietnamese Magazine)" type="rss" htmlUrl="https://www.thevietnamese.org/latest/" xmlUrl="https://thevietnamese.org/latest/feed/"/>
<outline text="Zambia (Times of Zambia)" type="rss" htmlUrl="https://www.times.co.zm/" xmlUrl="https://www.lusakatimes.com/feed:/www.times.co.zm/feed/"/>
<outline text="Zambia (Lusaka Times)" type="rss" htmlUrl="https://www.lusakatimes.com" xmlUrl="https://www.lusakatimes.com/feed/"/>
<outline text="Zambia (Zambian Observer)" type="rss" htmlUrl="https://zambianobserver.com/" xmlUrl="https://zambianobserver.com/feed/"/>
<outline text="Zimbabwe (Techzim)" type="rss" htmlUrl="https://www.techzim.co.zw/" xmlUrl="https://www.techzim.co.zw/feed/"/>
<outline text="Africa Defense Forum" type="rss" htmlUrl="https://adf-magazine.com/" xmlUrl="https://adf-magazine.com/feed/"/>
<outline text="African Defence Web" type="rss" htmlUrl="https://www.defenceweb.co.za" xmlUrl="https://defenceweb.co.za/feed/"/>
<outline text="Atlantic Council" type="rss" htmlUrl="https://www.atlanticcouncil.org/" xmlUrl="https://www.atlanticcouncil.org/feed/"/>
<!-- too low quality <outline text="Axios - ???" type="rss" htmlUrl="https://www.axios.com/top/" xmlUrl="https://api.axios.com/feed/top/"/> -->
<outline text="EU Commission" type="rss" htmlUrl="https://ec.europa.eu/commission/presscorner/api/rss?latestnews?language=en&ts=1653031554110&pagesize=10" xmlUrl="https://ec.europa.eu/commission/presscorner/api/rss?latestnews?language=en&ts=1653031554110&pagesize=10"/>
<outline text="GDPRhub — New pages" type="rss" htmlUrl="https://gdprhub.eu/index.php?title=Special:NewPages" xmlUrl="https://gdprhub.eu/index.php?title=Special:NewPages&feed=atom&hideredirs=1&limit=10&render=1"/>
<!-- Modern Diplomacy's feed is always filled with heinous spam
<outline text="Modern Diplomacy" type="rss" htmlUrl="https://moderndiplomacy.eu/" xmlUrl="https://moderndiplomacy.eu/feed/"/>
-->
<outline text="Dag Hammarskjöld Foundation" type="rss" htmlUrl="https://www.daghammarskjold.se/category/blog/" xmlUrl="https://www.daghammarskjold.se/category/blog/feed/"/>
<outline text="Radio Free Europe">
<outline text="Radio Free Europe / Radio Liberty" type="rss" htmlUrl="https://www.rferl.org/latest-news" xmlUrl="https://www.rferl.org/api/"/>
<outline text="Radio Free Europe / Radio Liberty / Farda" type="rss" htmlUrl="https://en.radiofarda.com" xmlUrl="https://en.radiofarda.com/api/"/>
</outline>
</outline>
<outline text="Podcasts">
<outline text="Kodsnack in English" type="rss" htmlUrl="https://kodsnack.se/international/" xmlUrl="https://kodsnack.se/international/index.xml"/>
<outline text="Risky Business" type="rss" htmlUrl="https://risky.biz/risky-business/" xmlUrl="https://risky.biz/feeds/risky-business/"/>
<outline text="BSD Now" type="rss" htmlUrl="http://bsdnow.tv/" xmlUrl="https://feeds.fireside.fm/bsdnow/rss"/>
<outline text="Ask Noah" type="rss" htmlUrl="https://podcast.asknoahshow.com/" xmlUrl="https://feeds.fireside.fm/asknoah/rss"/>
</outline>
</body>
</opml>
Links/filter-sorted.sh
grep -v -e telesur \
-e rferl \
-e france24 \
-e scheeerpost \
-e techdirt \
-e nytimes \
-e qz \
-e lxer \
-e vice.com \
-e ec.europa.eu \
-e technologyreview \
-e detroitnews \
-e h2-view \
-e stanforddaily \
-e yle \
-e meduza \
-e lrt.lt \
-e atlanticcouncil \
-e sciencealert \
-e axios \
-e michaelwest \
-e commondreams \
-e rfa.org \
-e aspistrategist \
-e csmonitor \
-e reason.com \
-e desmog \
-e ipwatchdog \
-e unifiedpatents.com \
-e juve-patent \
-e patentlyo.com \
-e www.epo.org \
-e kluweriplaw \
-e patentprogress \
-e cyberscoop \
-e pressgazette \
-e phoronix \
-e ubuntu.com \
-e idroot \
-e hackaday \
-e omgubuntu \
-e unixcop \
-e tecmint \
-e trendoceans \
-e tecadmin \
-e savannah.gnu \
-e cloudbooklet \
-e tfir.io \
-e drydeadfish \
-e tomshardware \
-e siliconangle \
-e venturebeat \
-e cloudnativenow \
-e itavisen \
-e version2.dk \
-e digitalmusicnews \
-e federalnewsnetwork \
-e which.co.uk \
-e helsinkitimes \
-e neritam \
-e hongkongfp \
-e techrights.org \
-e linuxhint \
-e linuxlinks \
-e gamingonlinux \
-e straitstimes \
-e linuxtoday.com \
-e linuxconcept \
-e 9to5linux \
-e linuxiac \
-e jupiter.zone \
-e unixmen \
-e linuxcapable \
-e nypost \
-e fair.org \
-e jurist.org \
-e theatlantic.com \
-e twincities \
-e net2.com \
-e hecticgeek \
-e sysdfree \
-e cnx-software \
-e linuxconcept \
-e boilingsteam \
-e linux-magazine.com \
-e fossmint \
-e dwaves.de \
-e techzim \
-e howtoforge \
-e medevel \
-e schneier \
-e linuxsecurity.com \
-e securityweek \
-e itjungle \
-e thenation.com \
/home/roy/rss-tools/sorted.html > /home/roy/rss-tools/filtered.html
Links/template-roy-2022.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="generator" content=
"HTML Tidy for HTML5 for Linux version 5.2.0" />
<title></title>
</head>
<body>
Links 13/05/2022:
Links for the day
<div style="background: url(/images/techrights-links.jpg)">
<div id="___________________________________________________contents">
<p><img align="right" alt="GNOME bluefish" border="0"
hspace="20" width="120" height="118" src="/wp-content/uploads/2008/03/120px-Gartoon-Bluefish-icon.png"
vspace="4" /></p>
<h3>Contents</h3>
<ul>
<li>
<a href="#gnulinux" title="Scroll down to GNU/Linux">GNU/Linux</a>
<ul>
<li>
<a href="#distros" title="Scroll down to Distributions">Distributions</a>
</li>
<li>
<a href="#devices" title="Scroll down to Devices/Embedded">Devices/Embedded</a>
</li>
</ul>
</li>
<li>
<a href="#foss" title="Scroll down to Free Software/Open Source">Free Software/Open Source</a>
</li>
<li>
<a href="#leftovers" title="Scroll down to Leftovers">Leftovers</a>
</li>
</ul>
</div>
<ul><li>
<h3><a name="gnulinux" id="___________________________________________________gnulinux">GNU/Linux</a></h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li>
<h3>Desktop/Laptop</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Server</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Audiocasts/Shows</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Kernel Space</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li>
<h3>Graphics Stack</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
</ul>
</li>
<li>
<h3>Benchmarks</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Applications</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Instructionals/Technical</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Wine or Emulation</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Games</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Desktop Environments/WMs</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li>
<h3>K Desktop Environment/KDE SC/Qt</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>GNOME Desktop/GTK</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
</ul>
</li>
<li>
<h3><a name="distros" id="___________________________________________________distros">Distributions</a></h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li>
<h3>Reviews</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>New Releases</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>BSD</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Screenshots/Screencasts</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>PCLinuxOS/Mageia/Mandriva/OpenMandriva Family</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Gentoo Family</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>SUSE/OpenSUSE</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Slackware Family</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Arch Family</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>IBM/Red Hat/Fedora</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Devuan Family</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Debian Family</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
<li>
<h3>Canonical/Ubuntu Family</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
</ul>
</li>
<li>
<h3><a name="devices" id="___________________________________________________devices">Devices/Embedded</a></h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li>
<h3>Open Hardware/Modding</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Mobile Systems/Mobile Applications</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
</ul>
</li>
<li>
<h3><a name="foss" id="___________________________________________________foss">Free, Libre, and Open Source Software</a></h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li>
<h3>Events</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Web Browsers</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li>
<h3>Chromium</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Mozilla</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
</ul>
</li>
<li>
<h3>SaaS/Back End/Databases</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Productivity Software/LibreOffice/Calligra</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Content Management Systems (CMS)</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Education</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Funding</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>FSFE</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>FSF</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li>
<h3>GNU Projects</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Licensing/Legal</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
</ul>
</li>
<li>
<h3>Public Services/Government</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Openness/Sharing/Collaboration</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li>
<h3>Open Data</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Open Access/Content</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
</ul>
</li>
<li>
<h3>Programming/Development</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li>
<h3>Perl/Raku</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Python</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Shell/Bash/Zsh/Ksh</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
<li>
<h3>Rust</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Java</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
</li>
</ul>
</li>
<li>
<h3>Standards/Consortia</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<h3><a name="leftovers" id="___________________________________________________leftovers">Leftovers</a></h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li>
<h3>Science</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Education</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Hardware</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Health/Nutrition/Agriculture</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Integrity/Availability</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li>
<h3>Proprietary</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li>
<h3>Pseudo-Open Source</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li>
<h3>Openwashing</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Privatisation/Privateering</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li>
<h3>Linux Foundation</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
</ul>
</li>
<li>
<h3>Entrapment (Microsoft GitHub)</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
</ul>
</li>
<li>
<h3>Security</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li>
<h3>Fear, Uncertainty, Doubt/Fear-mongering/Dramatisation</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Privacy/Surveillance</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote>
</li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote>
</li>
<li>
<h3>Confidentiality</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<h3>Defence/Aggression</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Transparency/Investigative Reporting</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Environment</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li>
<h3>Energy</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Wildlife/Nature</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Overpopulation</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
</ul>
</li>
<li>
<h3>Finance</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>AstroTurf/Lobbying/Politics</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Misinformation/Disinformation</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Censorship/Free Speech</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Freedom of Information/Freedom of the Press</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Civil Rights/Policing</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Internet Policy/Net Neutrality</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Digital Restrictions (DRM)</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Monopolies</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li>
<h3>Patents</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li>
<h3>Software Patents</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
</ul>
</li>
<li>
<h3>Trademarks</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
<li>
<h3>Copyrights</h3>
<ul>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
<li><h5><a href=""></a></h5>
<blockquote><p>
</p></blockquote></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</body>
</html>
Links/add-lines-for-irc.pl
#!/usr/bin/perl
# 2022-04-09 See Git logs for change history
# 2020-12-31
# 2021-01-24
# find links and prepend the nodes they are in with
# citations suitable for social control media
# "tag" the comment based on the page's domain
use utf8;
use open qw(:std :utf8);
use Getopt::Std;
use File::Glob ':bsd_glob';
use HTML::TreeBuilder::XPath;
use File::Temp qw(tempfile tempdir);
use File::Copy qw(move);
use URI;
use lib "$ENV{HOME}/lib/"; # also look for local modules
use Links::MetaData qw(camelCase); # local module
use English;
use warnings;
use strict;
our %opt;
getopts('hw', \%opt);
&usage if ($opt{'h'});
my @filenames;
while (my $file = shift) {
my @files = bsd_glob($file);
foreach my $f (@files) {
push(@filenames, $f);
}
}
&usage if($#filenames < 0);
while (my $infile = shift(@filenames)) {
next if ($infile=~/~$/);
my $result = &interleave($infile);
# $result =~ s/\x{00A0}/ /gm;
if($opt{'w'}) {
&overwrite_file($infile, $result);
} else {
open(OUT, ">", "/dev/stdout")
or die("Could not open file 'stdout' : error: $!\n");
print OUT $result;
close(OUT)
}
}
exit(0);
sub usage {
print qq(Find links and prepend the nodes they are in.\n);
print qq(with citations suitable for social control media\n);
print qq(The default is to send output to stdout.\n);
print qq( -w overwrites the exiting files instead of sending to stdout.\n);
$0 =~ s/^.*\///;
print qq($0: new_file old_file [oldfile...]\n);
exit(1);
}
sub interleave {
my ($file)= (@_);
my $xhtml = HTML::TreeBuilder::XPath->new;
$xhtml->implicit_tags(1);
$xhtml->no_space_compacting(1);
# force input to be read in as UTF-8
my $filehandle;
open ($filehandle, "<", $file)
or die("Could not open file '$file' : error: $!\n");
# parse UTF-8
$xhtml->parse_file($filehandle)
or die("Could not parse file handle for '$file' : $!\n");
close ($filehandle);
for my $node ($xhtml->findnodes('//li[h5]')) {
for my $heading ($node->findnodes('./h5[a[@href]]')) {
for my $anchor ($node->findnodes('./h5/a[@href]')) {
my $href = $anchor->attr('href');
next unless($href);
my $title = $anchor->as_text;
next unless($title);
my $sitetag = &sitetag($href);
$sitetag = &MetaData::camelCase($sitetag);
my $sc;
$sc = HTML::Element->new('~literal',
'text'=>"\n");
$node->preinsert($sc);
$sc = HTML::Element->new('~comment',
'text'=>" $href | Source: $sitetag ");
$node->preinsert($sc);
}
}
}
my $result = $xhtml->as_HTML('<', "\t", {});
$xhtml->delete;
return ($result);
}
sub overwrite_file {
my ($outfile, $result) = (@_);
my ($fh, $filename) = tempfile();
print qq(F= $filename\n);
print $fh $result;
close($fh);
rename($outfile,"$outfile.old")
or die("$!\n");
move($filename, $outfile)
or die("$!\n");
return(1);
}
sub sitetag {
my ($href) = (@_);
my $tag;
my $uri = URI->new($href);
next unless(defined $uri->scheme && $uri->scheme =~ /^http/);
my $domain = $uri->host || 0;
return($domain);
}
sub exceptions {
my ($d) = (@_);
$d = 'riskybiz' if ($d =~ m/\brisky\.biz$/i);
return($d);
}
Links/sort-wrapper.sh
#!/bin/sh
#Licence: Public Domain, feel free to share as you see fit
#
#Author: Roy Schestowitz
search_news() {
STRING=$1
echo
echo
echo " =========================== Input string: $1"
echo
echo
grep -A0 -B0 --ignore-case --no-group-separator -- \
$STRING /home/roy/rss-tools/outlines.html
}
search_news_inverted() {
STRING=$1
grep -A0 -B0 --ignore-case --no-group-separator -v -- \
$STRING /home/roy/rss-tools/outlines-subset.html
}
sort_rss() {
SEARHFTERM=$1
echo "\n\n" >> ~/rss-tools/sorted.html
echo " ================================ Input string: $1" \
>> ~/rss-tools/sorted.html
echo "\n\n" >> ~/rss-tools/sorted.html
FULLDATE0=$(date +"%F")
FULLDATE1=$(date --date="$FULLDATE0 -1 days" +"%F")
FULLDATE2=$(date --date="$FULLDATE0 -2 days" +"%F")
FULLDATE3=$(date --date="$FULLDATE0 -3 days" +"%F")
FULLDATE4=$(date --date="$FULLDATE0 -4 days" +"%F")
FULLDATE5=$(date --date="$FULLDATE0 -5 days" +"%F")
FULLDATE6=$(date --date="$FULLDATE0 -6 days" +"%F")
FULLDATE7=$(date --date="$FULLDATE0 -7 days" +"%F")
FULLDATE8=$(date --date="$FULLDATE0 -8 days" +"%F")
FULLDATE9=$(date --date="$FULLDATE0 -9 days" +"%F")
search_news $SEARHFTERM \
| grep $FULLDATE0 \
>> ~/rss-tools/sorted.html
search_news $SEARHFTERM \
| grep $FULLDATE1 \
| sed 's/<li/ <li/' \
>> ~/rss-tools/sorted.html
search_news $SEARHFTERM \
| grep $FULLDATE2 \
| sed 's/<li/ <li/' \
>> ~/rss-tools/sorted.html
search_news $SEARHFTERM \
| grep $FULLDATE3 \
| sed 's/<li/ <li/' \
>> ~/rss-tools/sorted.html
search_news $SEARHFTERM \
| grep $FULLDATE4 \
| sed 's/<li/ <li/' \
>> ~/rss-tools/sorted.html
search_news $SEARHFTERM \
| grep $FULLDATE5 \
| sed 's/<li/ <li/' \
>> ~/rss-tools/sorted.html
search_news $SEARHFTERM \
| grep $FULLDATE6 \
| sed 's/<li/ <li/' \
>> ~/rss-tools/sorted.html
search_news $SEARHFTERM \
| grep $FULLDATE7 \
| sed 's/<li/ <li/' \
>> ~/rss-tools/sorted.html
search_news $SEARHFTERM \
| grep $FULLDATE8 \
| sed 's/<li/ <li/' \
>> ~/rss-tools/sorted.html
search_news $SEARHFTERM \
| grep $FULLDATE9 \
| sed 's/<li/ <li/' \
>> ~/rss-tools/sorted.html
cp ~/rss-tools/outlines.html ~/rss-tools/outlines-subset.html
search_news_inverted $SEARHFTERM > ~/rss-tools/outlines.html
# Legacy (manual):
# search_news russia >> sorted.html
# cp ~/rss-tools/outlines.html ~/rss-tools/outlines-subset.html
# ~/search-news-inverted.sh russia > ~/rss-tools/outlines.html
}
for w in 'russia' 'tiktok' 'ukrai' 'xkcd.com' 'fsfe.org' 'twit.tv' \
'distrowatch' 'security' 'copyright' 'tllts' 'linuxmadesimple' \
'makeuseof' 'yewtu.be' 'youtube' 'how-to' 'linux' 'apple' \
'microsoft' 'databreaches.net' 'gnu' 'ubuntu' 'bsd' 'banking' \
'banks' 'patent' 'schestow' 'techrights' 'climate' 'energy' \
'speech' 'censor' 'suse' 'syria' 'saudi' 'turkey' 'redhat.com' \
'redhat' 'photo' 'uprising' 'ctrl.blog' 'unix' 'utcc' 'server' \
'canada' 'africa' 'twitter' 'facebook' 'telesurenglish' \
'dw.com' 'debian' 'perl' 'ipkitten'
do
sort_rss "${w}"
done
exit 0
Links/convert-latest-links.sh
# techrights
clear
echo Today in Techrights
echo Some of the latest articles
echo
echo Over at Tux Machines...
echo GNU/Linux news for the past day
sed -z -e 's/<dd> <\/dd>/ <h4>New<\/h4> /g' \
-e 's/--/ <h4>New<\/h4> /g' \
-e 's/<dl>/<h4>Updated This Past Day<\/h4><ol>/g' \
-e 's/<dt/<li><h5/g' \
-e 's/<\/dt>/<\/h5>/g' \
-e 's/<dd/<blockquote/g' \
-e 's/<\/dd>/<\/blockquote><\/li>/g' \
-e 's/\/n\/202/\http:\/\/techrights.org\/n\/202/g' \
~/Desktop/Text_Workspace/groups-links.html
echo
echo '---------------------------'
echo
# tuxmachines
sed -z -e 's/<dd> <\/dd>/ <h4>New<\/h4> /g' \
-e 's/--/ <h4>New<\/h4> /g' \
-e 's/<dl>/<h4>Updated This Past Day<\/h4><ol>/g' \
-e 's/<dt/<li><h5/g' \
-e 's/<\/dt>/<\/h5>/g' \
-e 's/<dd/<blockquote/g' \
-e 's/<\/dd>/<\/blockquote><\/li>/g' \
-e 's/\/n\/202/\http:\/\/news.tuxmachines.org\/n\/202/g' \
~/Desktop/Text_Workspace/groups-links.html
Links/template.html
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8" /> <meta name="generator" content="HTML Tidy for HTML5 for Linux version 5.6.0" /> <title></title> </head> <body>Links for the day <div style="background: url(http://techrights.org/images/techrights-links.jpg)"> <div id="_contents"> <p><img class="links" align="right" alt="GNOME bluefish" border="0" hspace="20" width="120" height="118" src="http://techrights.org/wp-content/uploads/2008/03/120px-Gartoon-Bluefish-icon.png" vspace="4" /></p> <h3>Contents</h3> <ul> <li><a href="#gnulinux" title="Scroll down to GNU/Linux">GNU/Linux</a> <ul> <li><a href="#distros" title="Scroll down to Distributions"> Distributions and Operating Systems</a></li> <li><a href="#devices" title="Scroll down to Devices/Embedded"> Devices/Embedded</a></li> </ul> </li> <li><a href="#foss" title="Scroll down to Free Software/Open Source"> Free Software/Open Source</a></li> <li><a href="#leftovers" title="Scroll down to Leftovers">Leftovers</a></li> </ul> </div> <ul> <li> <h3 id="gnulinux">GNU/Linux</h3> <ul> <li><h5><a href=""></a></h5> <blockquote><p> </p></blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> <ul> <li> <h3>Desktop/Laptop</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Server</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Audiocasts/Shows</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Kernel Space / File Systems / Virtualization</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Graphics Stack</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Benchmarks</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Applications</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Instructionals/Technical</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>WINE or Emulation</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Games</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Desktop Environments (DE)/Window Managers (WM)</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> <ul> <li> <h3>K Desktop Environment/KDE SC/Qt</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>GNOME Desktop/GTK</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> </ul> </li> </ul> </li> <li> <h3 id="distros">Distributions and Operating Systems</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> <ul> <li> <h3>Reviews</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>New Releases</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Screenshots/Screencasts</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>BSD</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>PCLinuxOS/Mageia/Mandriva/OpenMandriva Family</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Gentoo Family</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>SUSE/OpenSUSE</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Slackware Family</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Arch Family</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Fedora Family / IBM</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Devuan Family</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Debian Family</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Canonical/Ubuntu Family</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3 id="devices">Devices/Embedded</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Open Hardware/Modding</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Mobile Systems/Mobile Applications</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> </ul> </li> <li> <h3 id="foss">Free, Libre, and Open Source Software</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> <ul> <li> <h3>Events</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Web Browsers/Web Servers/Feed Readers</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> <ul> <li> <h3>Chromium</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Mozilla</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> </ul> </li> <li> <h3>SaaS/Back End/Databases</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Productivity Software/LibreOffice/Calligra</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Content Management Systems (CMS) / Static Site Generators (SSG)</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <!-- FOSS --> <h3>Education</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Funding</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>FSF / Software Freedom / Digital Sovereignty</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>FSFE</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>GNU Projects</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Licensing / Legal</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Public Services/Government</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Openness/Sharing/Collaboration</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> <ul> <li> <h3>Open Data</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Open Access/Content</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> </ul> </li> <li> <h3>Programming/Development</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li> <h3>Perl / Raku</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>R / R-Script</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Python</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Shell/Bash/Zsh/Ksh</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Java/Golang</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Rust</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> </ul> </li> <li> <h3>Standards/Consortia</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> </ul> </li> <li> <h3 id="leftovers">Leftovers</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> <ul> <li> <h3>Science</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Career/Education</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Hardware</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Health/Nutrition/Agriculture</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Proprietary</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li> <h3>Artificial Intelligence (AI) / LLM Slop / Plagiarism</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Social Control Media</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Windows TCO / Windows Bot Nets</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> </ul> </li> <li> <h3>Pseudo-Open Source</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> <ul> <li> <h3>Openwashing</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> </ul> </li> <li> <h3>Privatisation/Privateering</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Linux Foundation</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Entrapment (Microsoft GitHub)</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Security</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> <ul> <li> <h3>Fear, Uncertainty, Doubt/Fear-mongering/Dramatisation</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Integrity/Availability/Authenticity</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Privacy/Surveillance</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Confidentiality</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> </ul> </li> <li> <h3>Defence/Aggression</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li> <h3>Overpopulation</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> </ul> </li> </ul> </li> <li> <h3>Transparency/Investigative Reporting</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Environment</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> <ul> <li> <h3>Energy/Transportation</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Wildlife/Nature</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> </ul> </li> <li> <h3>Finance</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>AstroTurf/Lobbying/Politics</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li> <h3>Misinformation/Disinformation/Propaganda</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> </ul> </li> <li> <h3>Censorship/Free Speech</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Freedom of Information / Freedom of the Press</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Civil Rights / Policing / Accessibility</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Internet Policy/Net Neutrality</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Digital Restrictions (DRM)</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Monopolies/Monopsonies</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> <ul> <li> <h3>Patents</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li> <h3>Kangaroo Courts</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <h3>Software Patents</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> </ul> </li> <li> <h3>Trademarks</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li> <h3>Right of Publicity</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> </ul> </li> <li> <h3>Copyrights</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> </ul> </li> <li> <h3 id="____gemini">Gemini* and Gopher</h3> <ul> <li> <!-- gemini and gopher --> <h3>Personal</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <!-- gemini and gopher --> <h3>Politics</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <!-- gemini and gopher --> <h3>Technical</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> <ul> <li> <!-- gemini and gopher --> <h3>Science</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <!-- gemini and gopher --> <h3>Internet/Gemini</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <!-- gemini and gopher --> <h3>Announcements</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> <li> <!-- gemini and gopher --> <h3>Programming</h3> <ul> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> <li><h5><a href=""></a></h5> <blockquote> <p> </p> </blockquote></li> </ul> </li> </ul> </li> </ul> </li> </ul> </div> <hr /> <p> <sup>*</sup> <a href="http://techrights.org/gemini" title="Gemini">Gemini (Primer)</a> links can be opened using <a href="https://gemini.circumlunar.space/software/" title="Gemini software">Gemini software</a>. It's like the World Wide Web but a lot lighter.</p> </body> </html>
Links/rrrrrr.py
#!/usr/bin/python3
"""
Copyright (C) 2024 Bytes Media. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, version 3. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see https://www.gnu.org/licenses/
"""
from argparse import ArgumentParser, RawTextHelpFormatter
from collections import defaultdict
from contextlib import closing
from datetime import datetime, timezone, timedelta
from html import unescape
from itertools import batched, chain # batched() comes from python >= 3.12
from lxml import etree as et
from lxml.html import fromstring as htmlstring
from pathlib import Path as path
from multiprocessing.pool import ThreadPool # because IO-bound task
from requests.structures import CaseInsensitiveDict
from ssl import SSLError
from sys import stderr
from time import sleep, gmtime, strftime
from urllib.request import Request, urlopen, urlcleanup
from urllib.error import URLError, HTTPError
from urllib.parse import urlparse, quote
import copy
import dateparser
import feedparser
import gzip
import os
import pprint
import re
import resource
import sqlite3
# starting time of the script
starttime = datetime.now(timezone.utc).replace(microsecond=0)
# regex pattern characters allowed inside the ETag field
# see https://datatracker.ietf.org/doc/html/rfc7232#section-2.3
# any ETag response strings should be saved as-is, this is just to verify it
etagc = re.compile('^(W/)?"[%s]{1,90}"$' % "".join(k for k,_ in
{chr(e):1 for e in
list(range(33,33)) +
list(range(35,127)) +
list(range(128,254))}.items()))
def import_dbpath():
# calculate the path for where the database goes
global quiet
dbpath = os.environ.get('HOME') + '/.cache/rrrrrr/'
# try creating the path
try:
path(dbpath).mkdir(parents=True, exist_ok=True)
except FileExistsError as e:
if verbosity > 1:
print(f"Path P{dbpath} exists, but that's ok.")
except FileNotFoundError as e:
if not quiet:
print(f"Path {dbpath} could not be created: {e}")
exit(1)
# make sure the path's permissions are all right
if not os.access(dbpath, os.R_OK):
if not quiet:
print(f"Path {dbpath} cannot be read: {e}")
exit(1)
elif not os.access(dbpath, os.W_OK):
if not quiet:
print(f"Path {dbpath} cannot be written: {e}")
exit(1)
elif not os.access(dbpath, os.X_OK):
if not quiet:
print(f"Path {dbpath} cannot be searched: {e}")
exit(1)
return(dbpath)
def import_opml_files(importfiles: list, dbcursor):
# read designated OPML files from list of file names
# or else fetch the OPML data from the db cache
global verbosity
global quiet
global appendopml
if not importfiles:
# read the cached OPML data from the db
try:
dbcursor.execute('SELECT opml FROM opml LIMIT 1')
try:
feeds, = dbcursor.fetchone()
except Exception:
if not quiet:
print(f"1 Failed to retrieve OPML template from record")
exit(1)
except Exception:
if not quiet:
print(f"1 Failed to retrieve OPML template from db")
print("Provide at least one path to an OPML file to read")
exit(1)
else:
main_tree = et.XML(feeds.encode("UTF-8"))
return(main_tree)
if verbosity:
print("Reading: ", end='')
pprint.pprint(importfiles)
# read the first file
infile = importfiles.pop()
if verbosity:
print(f"+ Importing from '{infile}'")
try:
with open(infile) as xml_file:
feed = xml_file.read()
if verbosity:
print(f"+ Importing from '{infile}'")
except FileNotFoundError:
if not quiet:
print(f"Bad file name or file path 1: {infile}")
exit(1)
# start with an initial XML tree, either the first file or a default tree
main_tree = et.XML(feed.encode("UTF-8"))
# set the OPML file's date to the local time
# e.g. Mon Sep 18 10:54:05 AM UTC 2023
dateModified = starttime.astimezone().strftime('%a %d %b %Y %H:%M:%S %Z')
try:
old_dateModified = main_tree.find('.//head/dateModified')
old_dateModified.text = dateModified
except Exception:
if verbosity:
print("Skipping")
# read and append the rest of the OPML files, if there are others
for infile in importfiles:
if verbosity:
print(f"+ Importing from '{infile}'")
try:
with open(infile) as xml_file:
feed = xml_file.read()
opml = et.fromstring(feed.encode("UTF-8"))
old_body = main_tree.find('.//body')
for new_body in opml.findall('.//body/*'):
node2 = copy.deepcopy(new_body)
old_body.append(node2)
except FileNotFoundError:
if not quiet:
print(f"Wrong file or file path 2: {infile}")
exit(1)
# check the new, just-read OPML data for duplicate feeds
# use a dictionary of dictionaries, keeping site names in a list
duplicates = defaultdict(defaultdict)
for xmlUrl in main_tree.findall('.//outline[@xmlUrl]'):
# use the feed URL (xmlUrl) for the key
x = xmlUrl.attrib['xmlUrl']
# get the name of that feed
t = xmlUrl.attrib['text']
# get current count for that feed, or set a zero if empty
c = int(duplicates[x].get('count', 0))
# increment counter for that element
duplicates[x].update({'count' : c + 1})
# push name of site onto list within that element
duplicates[x].setdefault('text', []).append(t)
# report duplicate feeds in the OPML file(s) and quit if any are found
stop = False
for xmlUrl in duplicates.keys():
if duplicates[xmlUrl]['count'] > 1:
if not quiet:
print(f"duplicate: {duplicates[xmlUrl]['count']}x {xmlUrl} :",
'"' + '", "'.join(duplicates[xmlUrl]['text']) + '\"')
stop = True
if stop:
if not quiet:
print("Stopping due to duplicate feeds")
exit(1)
# at least one OPML file existed and was read, clear the cache from the db
dbcursor.execute("DELETE FROM opml")
dbconnection.commit()
# save the OPML file data into the database for possible re-use next time
save_opml_into_db(main_tree, dbcursor)
return(main_tree)
def validate_last_modified(lm):
# validate last modified header's date string
try:
datetime.strptime(lm, "%a, %d %b %Y %H:%M:%S GMT")
except Exception:
lm = ''
return(lm)
def validate_etag(etag):
# validate eTag string
try:
etagc.match(etag)
except Exception:
etag = ''
return(etag)
def validate_retry_after(h):
# validate retry-after header's date string
after = 0
try:
# h should be either a date-time string or an integer
h = datetime.strptime(h, "%a, %d %b %Y %H:%M:%S GMT")
except Exception:
# check if it was an integer for seconds
try:
after = int(h)
except Exception:
after = 0
else:
# convert time difference to seconds
now = datetime(*gmtime()[:6])
if h > now:
after = (h - now).total_seconds()
# convert seconds to minutes, rounding up
after = int(after / 60) + (after % 60 > 1)
return(after)
def initialize_db(dbcursor):
# initialized database by creating tables, erasing what is already there
global quiet
# create a list of database instructions to create all the needed tables
initialization = list(
[
'DROP TABLE IF EXISTS status',
'DROP TABLE IF EXISTS modified',
'DROP TABLE IF EXISTS opml',
'''CREATE TABLE IF NOT EXISTS status (
ttl INTEGER DEFAULT 0,
keep INTEGER DEFAULT 1,
active INTEGER DEFAULT 1,
tried INTEGER DEFAULT 0,
success INTEGER DEFAULT 0,
status INTEGER DEFAULT 0,
repeats INTEGER DEFAULT 0,
url VARCHAR(256) NOT NULL PRIMARY KEY);''',
'''CREATE TABLE IF NOT EXISTS modified (
url VARCHAR(256) NOT NULL PRIMARY KEY,
lastmodified VARCHAR(29) DEFAULT NULL,
etag TEXT DEFAULT NULL,
CONSTRAINT fk_url
FOREIGN KEY (url)
REFERENCES status(url) );''',
'CREATE TABLE IF NOT EXISTS opml(opml TEXT NOT NULL);',
'CREATE UNIQUE INDEX IF NOT EXISTS urls ON status(url);',
'CREATE UNIQUE INDEX IF NOT EXISTS mods ON modified(url)',
'''CREATE TRIGGER on_delete_from_status
AFTER DELETE ON status
BEGIN
DELETE FROM modified WHERE modified.url=OLD.url;
END;'''
]
)
# loop through the steps
for i in initialization:
try:
dbcursor.execute(i)
except Exception:
dbconnection.rollback()
if not quiet:
print(f"4 Fail {i}")
exit(1)
# save the above actions to the database
dbconnection.commit()
return(True)
def save_opml_into_db(opmlfeeds, dbcursor):
# convert OPML XML object into a string and save it in the database
global quiet
opml = et.tostring(opmlfeeds, method="xml")
data = (opml.decode("UTF-8"),)
# clear the old OPML file
query = 'DELETE FROM opml'
try:
dbcursor.execute(query)
except NameError as e:
dbconnection.rollback()
dbconnection.close()
if not quiet:
print(f"1 Failed initialization\n {query}\n\t{e}")
exit(1)
except sqlite3.ProgrammingError as e:
dbconnection.rollback()
dbconnection.close()
if not quiet:
print(f"2 Failed initialization query\n {query}\n\t{e}")
exit(1)
dbconnection.commit()
# save the new OPML file
opml = et.tostring(opmlfeeds, method="xml")
data = (opml.decode("UTF-8"),)
query = 'INSERT INTO opml (opml) VALUES (?)'
try:
dbcursor.execute(query, data)
except NameError as e:
dbconnection.rollback()
dbconnection.close()
if not quiet:
print(f"3 Failed initialization\n {query}\n\t{e}")
exit(1)
except sqlite3.ProgrammingError as e:
dbconnection.rollback()
dbconnection.close()
if not quiet:
print(f"4 Failed initialization query\n {query}\n\t{e}")
exit(1)
dbconnection.commit()
return(True)
def cull_database(dbcursor):
# cull entries which were not updated during this run of the script
global quiet
# clear the unused URLs
query = 'DELETE FROM status WHERE keep = 0 AND active = 1'
try:
dbcursor.execute(query)
except NameError as e:
dbconnection.rollback()
dbconnection.close()
if not quiet:
print(f"5 Failed cull initialization\n {query}\n\t{e}")
exit(1)
except sqlite3.ProgrammingError as e:
dbconnection.rollback()
dbconnection.close()
if not quiet:
print(f"6 Failed execution of cull query\n {query}\n\t{e}")
exit(1)
dbconnection.commit()
return(True)
def export_opml_to_file(dbcursor, exportfile):
# extract OPML from the database cache and save it to a file
global quiet
try:
dbcursor.execute('SELECT opml FROM opml LIMIT 1')
try:
feeds, = dbcursor.fetchone()
except Exception:
if not quiet:
print(f"2 Failed to retrieve OPML template from record")
exit(1)
except Exception:
if not quiet:
print(f"2 Failed to retrieve OPML template from db")
exit(1)
# main copy for conversion to XHTML at the end
main_tree = et.XML(feeds.encode("UTF-8"))
# alternation so that only one loop is needed
for cruft in main_tree.findall('.//outline/ttl|.//outline/status'):
cruft.getparent().remove(cruft)
opml = et.tostring(main_tree, method="xml")
if exportfile:
try:
with open(exportfile, 'w', encoding='utf-8') as f:
print(opml.decode("UTF-8"), file=f)
except OSError as e:
if not quiet:
print(f"Some error: {e}")
exit(1)
else:
print(opml.decode("UTF-8"))
exit(0)
def fetch_tree(oktime,exportlog):
# umbrella function to begin processing
global verbosity
global quiet
global forcefetch
# open the database and designate a cursor
dbconnection = sqlite3.connect(db)
dbcursor = dbconnection.cursor()
# read OPML from the database and parse it as XML
try:
dbcursor.execute('SELECT opml FROM opml LIMIT 1')
try:
feeds, = dbcursor.fetchone()
except Exception:
if not quiet:
print(f"2 Failed to retrieve OPML template from record")
exit(1)
except Exception:
if not quiet:
print(f"2 Failed to retrieve OPML template from db")
exit(1)
# main copy for conversion to XHTML at the end
main_tree = et.XML(feeds.encode("UTF-8"))
# set the date modified for use in the final output
dateModified = starttime.astimezone().strftime('%a %d %b %Y %H:%M:%S %Z')
try:
old_dateModified = main_tree.find('.//head/dateModified')
finally:
old_dateModified = et.Element('dateModified')
old_dateModified.text = dateModified
# list of URL data and list of errors
urls = list()
# work through each feed URL one at a time in sequence
for outline in main_tree.findall('.//outline[@xmlUrl]'):
url = outline.attrib['xmlUrl']
# basic sanity check of the feed URL
try:
result = urlparse(url)
if not all([result.scheme, result.netloc]):
raise
except Exception:
if not quiet:
print(f"Malformed URL: {url}")
print(et.tostring(outline, method="xml").decode("UTF-8"))
print("Repair the OPML file and try again.")
exit(1)
# fetch cached status and other data
data = (url,)
# check previous status details from db
try:
dbcursor.execute('SELECT status.url AS url,ttl,tried,success, \
status,repeats,lastmodified,etag,active \
FROM status \
LEFT JOIN modified ON status.url = modified.url \
WHERE status.url=?', data)
try:
url,ttl,tried,success,status,repeats, \
lastmodified,etag,active = dbcursor.fetchone()
except Exception:
# initialize this instead
ttl = 0
tried = 0
success = 0
status = 0
repeats = 0
lastmodified = ''
etag = ''
active = 1
except Exception as e:
if not quiet:
print(f"Failed to retrieve db record for {url} {e}")
exit(1)
# re-check date and etag format even though it is not necessary
lastmodified = validate_last_modified(lastmodified)
etag = validate_etag(etag)
if verbosity > 1:
print('db rec:',
f'ttl: {ttl},',
f'tried: {tried},',
f'success: {success},',
f'status: {status},',
f'repeats: {repeats},',
f'lastmodified: {lastmodified},',
f'etag: {etag},',
f'active: {active}',
f'url: {url}')
# list of lists with URL status data
urls.append((url,ttl,tried,success,status,repeats,
lastmodified,etag,active))
if verbosity:
print('Queuing for processing', url)
dbcursor.close()
dbconnection.close()
if verbosity:
print("Checking feeds from list of URLs")
# set the batch size based on the soft limit for number of open files
softlimit, hardlimit = resource.getrlimit( resource.RLIMIT_NOFILE)
batchsize = round(softlimit * 2 / 3 + 1)
# list to contain selected results from the HTTP(S) requests
results = list()
# process the feed URLs in batches of the calculated size
for batchofurls in list(batched(urls, batchsize)):
# prepare a pool of threads for parallel processing of HTTP requests
# the number of threads must be low (<15) for home networks
pool = ThreadPool(threads)
# fetch the URLs in parallel, saving the results into a list
result = pool.imap_unordered(fetch_url, batchofurls)
# keep results as single, long list
results = list(chain(results, result))
# wrap things up, must call close() before join()
pool.close()
pool.join()
del pool
# process the list of results
main_tree = parse_results(main_tree, results, exportlog, oktime)
# return XML object
return(main_tree)
def fetch_url(url):
# fetch a URL over HTTPS / HTTP
global verbosity
global quiet
global forcefetch
# inherited from SQL query
url,ttl,tried,success,status,repeats,lastmodified,etag,active = url
# reply info as a dictionary to save on return arguments
reply = {
'ttl': ttl,
'oldttl': ttl,
'ttlstamp': False, # datetime object
'oldtried' : tried, # integer
'tried': int(datetime.now().replace(microsecond=0).strftime("%s")),
'success': success, # integer
'oldsuccess': success, # integer
'status': 0, # integer
'oldstatus': status, # integer
'repeats': 0, # integer
'redirection': '', # string
'length': 0, # integer
'cache-control': '', # string
'active': active, # integer
# validate or clear Last-Modified and ETag values
'lastmodified': validate_last_modified(lastmodified),
'etag': validate_etag(etag),
}
version = "0.8"
userAgent="Roy and Rianne's Righteously Royalty-free RSS Reader v" \
+ version
userAgent = userAgent + ' (+https://techrights.org/rrrrrr.shtml)'
# try this many times
counter = 2
while (counter):
# declare feed so that 'None' is returned for errors by default
feed = None
# clear current status each time
status = None
counter = counter - 1
# skip inactive URLs without deleting them from the db
if not active:
reply['status'] = 9
reply['success'] = reply['oldsuccess']
if not reply['oldsuccess']:
oldsuccess = starttime.replace(microsecond=0).astimezone() \
.strftime('%s')
reply['oldsuccess'] = int(oldsuccess)
if verbosity:
print(f"Status {reply['status']} : Skipping inactive link: {url}")
err = 'Inactive'
return(url, feed, reply, err)
# TTL is checked first to avoid even fetching before its time to do so
# thus there are no headers, status, errors, etc because of no fetch
if tried:
s = datetime.fromtimestamp(success, timezone.utc)
else:
s = None
# check TTL if applicable
if not forcefetch and isinstance(s, datetime) \
and starttime - s < timedelta(minutes=ttl):
# TTL has not expired, set status accordingly
reply['status'] = 2
reply['success'] = reply['oldsuccess']
if not reply['oldsuccess']:
oldsuccess = starttime.replace(microsecond=0).astimezone() \
.strftime('%s')
reply['oldsuccess'] = int(oldsuccess)
if verbosity:
print(f"Status {reply['status']} : Skipping because of TTL {ttl}: {url}")
err = 0
return(url, feed, reply, err)
if verbosity:
print(f"HTTP fetch of {url} last tried {tried}")
# build headers to request ETag and/or Last-Modified if available
if lastmodified and etag and not forcefetch:
requestHeaders = dict(
[
(
'User-Agent', userAgent,
),
(
'If-None-Match', etag,
),
(
'If-Modified-Since', lastmodified,
),
]
)
elif lastmodified and not forcefetch:
requestHeaders = dict(
[
(
'User-Agent', userAgent,
),
(
'If-Modified-Since', lastmodified,
),
]
)
elif etag and not forcefetch:
requestHeaders = dict(
[
(
'User-Agent', userAgent,
),
(
'If-None-Match', etag,
),
]
)
else:
requestHeaders = dict(
[
(
'User-Agent', userAgent,
),
]
)
# try fetching actual feed
url2 = quote(url, safe=":/=&?@,~%+#")
if url != url2:
if not quiet:
print(f"Warning, odd URL: {url}")
# build HTTP(S) request
request = Request(url=url2, headers=requestHeaders)
# try fetching the feed
try:
with closing(urlopen(request, timeout=20)) as response:
# someday .headers.get() might be deprecated
status = response.getcode()
content_encoding = \
response.headers.get('Content-Encoding')
# if content was labeled as gzipped, gunzip it
if content_encoding == 'gzip':
try:
content = gzip.decompress(response.read())
except:
try:
# it's probably UTF-8 Unicode
content = response.read().decode("UTF-8")
except UnicodeDecodeError as e:
content = response.read()
else:
try:
# it's probably UTF-8 Unicode
content = response.read().decode("UTF-8")
except UnicodeDecodeError as e:
content = response.read()
# deal with each error type on its own
except HTTPError as e:
# server responded but the feed was not retrieved
reply['status'] = e.code
h = CaseInsensitiveDict(e.headers)
try:
reply['lastmodified'] = \
validate_last_modified(h['Last-Modified'])
except Exception:
reply['lastmodified'] = ''
try:
reply['etag'] = validate_etag(h['ETag'])
except Exception:
reply['etag'] = ''
# record Retry-After as if it were TTL datetime
try:
reply['ttl'] = validate_retry_after(h['Retry-After'])
except:
None
else:
if verbosity:
print(f"RetryAfter '{reply['ttl']}' : {url}")
del h
urlcleanup()
try:
# set the socket's recv method to None before closing it
response.fp._sock.recv = None # a hacky avoidance
except Exception:
# NOP - urllib does not always create the response object
True
try:
# try to close the response object to prevent clogging
response.close()
except Exception:
# NOP - urllib does not always create the response object
True
try:
# try to unset the response object
del response
except Exception:
# NOP - urllib does not always create the response object
True
if verbosity:
print(f"Fetch HTTPError {e.code}, '{e}' : {url}")
return(url, feed, reply, 'HTTPError')
except URLError as e:
# host is not there, or http daemon not responding,
# or protocol unknown or TLS certificate failure
urlcleanup()
try:
# set the socket's recv method to None before closing it
response.fp._sock.recv = None # a hacky avoidance
except Exception:
# NOP - urllib does not always create the response object
True
try:
# try to close the response object to prevent clogging
response.close()
except Exception:
# NOP - urllib does not always create the response object
True
try:
# try to unset the response object
del response
except Exception:
# NOP - urllib does not always create the response object
True
# kludge - urllib3 pkg fails to recognize SSLError itself
# no need to re-try TLS errors
if re.search('CERTIFICATE_VERIFY_FAILED', str(e)):
if re.search('certificate has expired', str(e)):
if verbosity:
print(f"Skipping URLError '{e}' : {url}")
return(url, feed, reply, 'TLSExpired')
if verbosity:
print(f"Skipping URLError '{e}' : {url}")
return(url, feed, reply, 'TLSError')
elif re.search('SSL:', str(e)):
if verbosity:
print(f"Skipping URLError '{e}' : {url}")
return(url, feed, reply, 'TLSError')
# retry network errors up to value in 'counter'
if (counter):
if verbosity:
print(f"Retrying URLError '{e}' : {url}")
sleep(0.2)
continue
elif verbosity:
print(f"Skipping URLError '{e}' : {url}")
return(url, feed, reply, 'URLError')
except SSLError as e:
# see instead the kludge in the URLError exception
if verbosity:
print(f"Fetch SSLError '{e}' : {url}")
return(url, feed, reply, 'TLSError')
except OSError as e:
if verbosity:
print(f"Fetch OSError '{e}' : {url}")
return(url, feed, reply, 'OSError')
except ConnectionResetError as e:
if verbosity:
print(f"Connection Reset. Skipping feed: {url}")
return(url, feed, reply, e)
except Exception as e:
if verbosity:
print(f"Fetch generally failed '{e}' : {url}")
return(url, feed, reply, e)
# save HTTP Response code
reply['status'] = status
# create a case-insensitive dictionary of the rest of the headers
responseHeaders = CaseInsensitiveDict(response.getheaders())
# Last-Modified header string
try:
reply['lastmodified'] = \
validate_last_modified(responseHeaders['Last-Modified'])
except Exception:
reply['lastmodified'] = ''
# ETag header string
try:
reply['etag'] = validate_etag(responseHeaders['ETag'])
except Exception:
reply['etag'] = ''
# response size header
reply['length'] = len(content)
# client error (400s) responses
if status >= int(400) and int(status) < 500:
if verbosity:
print(f" Error 400 to 499 : {url}")
return(url, feed, reply, 'Error')
# Cache-Control header
try:
cache_control = \
response.headers.get('Cache-Control')
except Exception as e:
cache_control = ''
reply['cache-control'] = cache_control
# strip leading white space to see if that makes a valid feed,
# it is a common error and not all sites respond to feedback about it
content = re.sub(r'^\s+<\?xml', '<?xml', str(content),
count = 1, flags = re.MULTILINE)
# try to parse what's left
try:
feed = feedparser.parse(content)
except Exception:
feed = None
if verbosity:
print(f" No content {url}")
return(url, feed, reply, 'Could not parse')
# check for redirections
if response.geturl() != url:
reply['redirection'] = response.geturl()
# ETag and Last-Modified apply to the original URL not the target
reply['etag'] = ''
reply['lastmodified'] = ''
if verbosity:
print(f" Redirection {url} -> ${response.geturl()}")
# either permanent or temporary redirection, but not known
else:
reply['redirection'] = ''
# everything was ok, exit loop
counter = 0
break
# explicitly close the response object to prevent clogging
urlcleanup()
response.close()
del response
return(url, feed, reply, 0)
def save_status(dbcursor, url, ttl, status, success, repeats, tried, active=1):
# prepare to save record to database, commit later -- if at all
global quiet
keep = 1
data = (url, ttl, status, success, repeats, tried, keep, active)
try:
dbcursor.execute("REPLACE INTO status \
(url,ttl,status,success,repeats,tried,keep,active) \
VALUES (?,?,?,?,?,?,?,?)", data)
except Exception as e:
if not quiet:
print(f"Could not replace or update status error {url} : {e}")
exit(1)
return(True)
def save_modified(dbcursor, url, lastmodified, etag):
# prepare to save last-modified and etag strings, commit later -- if at all
global quiet
data = (url, lastmodified, etag)
try:
result = dbcursor.execute("REPLACE INTO modified (url,lastmodified, \
etag) VALUES (?,?,?)", data)
except Exception as e:
if not quiet:
print(f"Could not replace or update modified error {url} {e}")
exit(1)
return(True)
def read_ttl(feed, oldttl):
# extract TTL from the feed, if there is one to extract
# or else use the old TTL, if there is one
ttl = 0
try:
ttl = int(feed['feed']['ttl'])
except Exception as e:
if oldttl:
ttl = oldttl
return(ttl)
def read_max_age(cache_control, lastmodified):
# treat Cache-Control max-age like TTL if it is longer than TTL
max_age = 0
if cache_control:
age = 0
for cache in re.findall(r"[^ ,]+", cache_control):
# loop through Cache-Control header
if cache == "must-revalidate":
# clear settings and exit loop
age = 0
max_age = 0
break
c = re.match(r"^max-age=([0-9]+)", cache,flags=re.IGNORECASE)
if c:
# ensure that max-age is a positive integer
mi = int(c.group(1))
mf = float(c.group(1))
if mi == mf and mi > 0:
max_age = mi
c = re.match(r"^age=([0-9]+)", cache, flags=re.IGNORECASE)
if c:
mi = int(c.group(1))
mf = float(c.group(1))
if mi == mf and mi > 0:
age = mi
max_age = max_age - age
# calculate the actual time when max_age expires and
# compare it to the current time, if there is time left
l = dateparser.parse(lastmodified, languages=['en'])
n = datetime.now(timezone.utc).replace(microsecond=0).astimezone()
interval = 0
if l:
interval = (l + timedelta(seconds = (max_age - age))) - n
# round to the nearest minute
interval = round(interval.total_seconds() / 60)
# use time remaining for max_age, unless it is a week or more
if interval > 0 and interval < 10080:
max_age = interval
else:
max_age = 0
if max_age < 0:
max_age = 0
return(max_age)
def lookup_repeats(url, dbcursor):
# get how many times the same status has repeated from the database
global quiet
repeats = 0
data = (url,)
try:
dbcursor.execute('SELECT repeats FROM status WHERE url=?', data)
except Exception as e:
if not quiet:
print(f"Could not fetch repeats {url} : {e}")
exit(1)
else:
try:
repeats, = dbcursor.fetchone()
except Exception:
repeats = 0
return(repeats)
def repeat(status, oldstatus, repeats):
# tally the number of times this same status has recurred
if status == oldstatus and status != 2:
# count repetitions but not for TTL
repeats = repeats + 1
elif oldstatus == 2 and status == 429:
# count previous TTL timeouts towards 429 timeout
repeats = repeats + 1
elif status == 2:
repeats = repeats
else:
repeats = 0
return(repeats)
def stale_url(feed, error, status, redirection,
repeats, oldsuccess, tried, ttl):
# save error information for later
stale_url = {}
if error == 'OSError' or error == 'URLError':
stale_url['redirection'] = redirection
stale_url['code'] = 4
stale_url['repeats'] = repeats
stale_url['oldsuccess'] = oldsuccess
elif error == 'TLSError':
stale_url['redirection'] = redirection
stale_url['code'] = 6
stale_url['repeats'] = repeats
stale_url['oldsuccess'] = oldsuccess
elif error == 'TLSExpired':
stale_url['redirection'] = redirection
stale_url['code'] = 7
stale_url['repeats'] = repeats
stale_url['oldsuccess'] = oldsuccess
elif error == 'Inactive':
stale_url['redirection'] = redirection
stale_url['code'] = 9
stale_url['repeats'] = repeats
stale_url['oldsuccess'] = oldsuccess
elif status == 404:
# Not Found
stale_url['redirection'] = redirection
stale_url['code'] = 404
stale_url['repeats'] = repeats
stale_url['oldsuccess'] = oldsuccess
elif status == 403:
# Forbidden
stale_url['redirection'] = redirection
stale_url['code'] = 403
stale_url['repeats'] = repeats
stale_url['oldsuccess'] = oldsuccess
elif status == 304:
# Not Modified (not really an error)
stale_url['redirection'] = redirection
stale_url['code'] = 304
stale_url['repeats'] = repeats
stale_url['oldsuccess'] = oldsuccess
elif status == 429:
# Too Many Requests
stale_url['redirection'] = redirection
stale_url['code'] = 429
stale_url['repeats'] = repeats
stale_url['oldsuccess'] = oldsuccess
if ttl:
stale_url['ttlstamp'] \
= datetime.fromtimestamp(tried) \
+ timedelta(minutes=ttl)
elif oldsuccess:
stale_url['ttlstamp'] \
= datetime.fromtimestamp(oldsuccess) \
+ timedelta(minutes=1440 + 1440 * repeats)
else:
stale_url['ttlstamp'] \
= datetime.now().replace(microsecond=0) \
+ timedelta(minutes=1440 + 1440 * repeats)
error = False
elif status == 502:
# bad gateway
stale_url['redirection'] = redirection
stale_url['code'] = 502
stale_url['repeats'] = repeats
stale_url['oldsuccess'] = oldsuccess
elif status == 2:
# TTL
stale_url['redirection'] = redirection
stale_url['code'] = 2
stale_url['repeats'] = repeats
stale_url['oldsuccess'] = oldsuccess
stale_url['ttl'] = ttl
if oldsuccess:
# = datetime.fromtimestamp(oldsuccess, timezone.utc) \
stale_url['ttlstamp'] \
= datetime.fromtimestamp(oldsuccess, timezone.utc)\
.astimezone() + timedelta(minutes=ttl)
else:
stale_url['ttlstamp'] \
= datetime.now(timezone.utc).replace(microsecond=0) \
.astimezone() + timedelta(minutes=ttl)
elif isinstance(feed, type(None)):
# malformed feed
stale_url['redirection'] = redirection
stale_url['code'] = 5
stale_url['repeats'] = repeats
stale_url['oldsuccess'] = oldsuccess
error = True
return(stale_url)
def read_date(post):
# get feed item date, if available
d = None
try:
d = dateparser.parse(post.updated, languages=['en'])
except Exception:
try:
d = dateparser.parse(post.pubdate, languages=['en'])
except Exception:
try:
d = dateparser.parse(post.published, languages=['en'])
except Exception:
d = datetime.now(timezone.utc)
# convert datetime object to date object
try:
d = d.date()
except Exception:
d = datetime.now(timezone.utc).date()
return(d)
def clear_keep(dbcursor):
# set keep to 0 for all feeds
global quiet
try:
dbcursor.execute('UPDATE status SET keep = 0')
except Exception as e:
if not quiet:
print(f"Could not clear keep flag : {e}")
exit(1)
return(True)
def round_up_minute(t):
# round time up to next whole minute
discard = timedelta(seconds = t.second)
t = t - discard
t = t + timedelta(minutes = 1)
return(t)
def stringdate_to_localdate(d):
# convert date string to a datetime object
dt = dateparser.parse(str(d), languages=['en'])
d = dt.astimezone()
return(d)
def is_really_old(d):
# check if a datetme is 52 weeks old or older
n = starttime.astimezone().date()
# avoid possible leap year problem
if (n.month == 2) and (n.day == 29):
n = n.replace(day = 28)
if n - d >= timedelta(weeks = 52):
return(True)
return(False)
def parse_results(main_tree, results, exportlog, oktime):
# process all the results
global verbosity
global quiet
global forcefetch
global forceclose
# holds error information
stale_urls = defaultdict()
# re-open the database and designate a cursor
dbconnection = sqlite3.connect(db)
dbcursor = dbconnection.cursor()
# mark all for deletion in db, unmark as needed later
clear_keep(dbcursor)
logging = False
if exportlog is True:
log = None
logging = True
elif exportlog:
try:
log = open(exportlog, 'w', encoding='utf-8')
except OSError as e:
if not quiet:
print(f"Some error opening logging: {e}")
exit(1)
logging = True
if logging:
# headers for log data
print(f"status\tttl\ttimestamp\turl", file=log)
# iterate through the results one URL at a time
for url, feed, reply, error in results:
# assign local variables for convenience
size = reply['length'] # integer
tried = reply['tried'] # integer
oldtried = reply['oldtried'] # integer
success = reply['success'] # integer
oldsuccess = reply['oldsuccess'] # integer
status = reply['status'] # integer
oldstatus = reply['oldstatus'] # integer
repeats = lookup_repeats(url, dbcursor) # integer
lastmodified = reply['lastmodified'] # epoch
etag = reply['etag'] # string
redirection = reply['redirection'] # URL
cache_control = reply['cache-control'] # string
oldttl = reply['oldttl'] # integer
# use the feed's latest TTL if available, or else keep the old one
ttl = read_ttl(feed, reply['ttl'])
reply['ttl'] = ttl
# check Cache-Control header for max-age setting
max_age = read_max_age(cache_control, lastmodified)
# and if it is greater than TTL, use it for the next TTL
if max_age > ttl and max_age < 10080:
ttl = max_age
# save fresh Last-Modified and ETag strings
save_modified(dbcursor, url, lastmodified, etag)
dbconnection.commit()
if logging:
print(f"{status}\t{ttl}\t{tried}\t{url}", file=log)
if verbosity:
if error:
print(f"Processing {status} status: {url} : {error}")
else:
print(f"Processing {status} status: {url}")
# increment or clear repeat status
repeats = repeat(status, oldstatus, repeats)
# collect error information
stale_urls[url] = stale_url(feed, error, status, redirection,
repeats, oldsuccess, tried, ttl)
# delete empty records
try:
stale_urls[url]['code']
except Exception:
del stale_urls[url]
# set the Last-Modified string for the error record, if applicable
try:
stale_urls[url]
stale_urls[url]['lastmodified'] = \
validate_last_modified(lastmodified)
except Exception:
True
# stop processing this URL when the HTTP response is an error code
if error:
if status != oldstatus:
repeats = 0
# if not modified or inactive
if status == 304:
save_status(dbcursor, url, ttl, status, success,
repeats, tried)
elif status == 9:
active = 0
save_status(dbcursor, url, ttl, status, success,
repeats, tried, active)
else:
save_status(dbcursor, url, ttl, status, oldsuccess,
repeats, tried)
dbconnection.commit()
if verbosity:
if status == 304:
print(f"Skipping because Not Modified: {error}, {url}")
else:
print(f"Skipping because of error: {status}, {error}, {url}")
continue
# date-time of this successful fetch
success = int(datetime.now().astimezone().strftime("%s"))
# save info in db
if status == 2:
# ttl -- but also covers 429 errors
save_status(dbcursor, url, ttl, status, oldsuccess,
repeats, oldtried)
dbconnection.commit()
continue
elif isinstance(feed, type(None)):
# empty feed
if verbosity:
print(f"Skipping because of empty feed: {url}")
save_status(dbcursor, url, ttl, status, oldsuccess, repeats, tried)
dbconnection.commit()
continue
elif feed.bozo and not redirection:
# malformed feed
stale_urls[url] = {}
stale_urls[url]['redirection'] = redirection
stale_urls[url]['code'] = 5
stale_urls[url]['lastmodified'] = \
validate_last_modified(lastmodified)
stale_urls[url]['repeats'] = repeats
if verbosity:
print(f"Skipping because of malformed feed: {url}")
save_status(dbcursor, url, ttl, status, oldsuccess, repeats, tried)
dbconnection.commit()
continue
# double-check feed by looking for title element
try:
feed['feed']['title']
except Exception:
# missing title element
stale_urls[url] = {}
stale_urls[url]['redirection'] = redirection
stale_urls[url]['code'] = 1
stale_urls[url]['lastmodified'] = \
validate_last_modified(lastmodified)
stale_urls[url]['repeats'] = repeats
if verbosity:
print(f"Skipping because of bad feed: {url}")
save_status(dbcursor, url, ttl, status, oldsuccess, repeats, tried)
dbconnection.commit()
continue
# clear repeat count if status has changed since last time
if status != oldstatus:
repeats = 0
# proceed with normal update
save_status(dbcursor, url, ttl, status, success, repeats, tried)
dbconnection.commit()
# begin to process results for the feed
p = './/outline[@xmlUrl="' + url + '"]'
outline = main_tree.find(p)
if isinstance(outline, type(None)):
if not quiet:
print(f'Error: "{url}"', file=stderr)
continue
# create an element to store the results and process each feed item
ul = et.Element('ul')
if isinstance(feed, feedparser.util.FeedParserDict):
# because of the massive inconsistencies in how
# sites mismanage date formats,
# it is necessary to standardize the date format
countAllEntries = 0
for post in feed.entries:
countAllEntries = countAllEntries + 1
# in practice dates vary in format and are non-standard,
# so standardize date-time string
d = read_date(post)
# <pubDate>Wed, 02 Oct 2002 13:00:00 GMT</pubDate>
post.updated = d.strftime('%a, %d %b %Y %T %z')
# keep a copy as a datetime object, too
post.internaldate = d
# here is where the sorting by date happens
latestEntry = datetime(1,1,1).date()
countOkEntries = 0
countTitles = 0
# sort the entries per datetime oldest first
for post in sorted(feed.entries,
key=lambda x: x.internaldate,
reverse=True):
d = post.internaldate
# track what the most recent entry was, even if it is not used
if d > latestEntry:
latestEntry = d
# if TTL was long, use that for the interval to check
d2ttl = False
try:
# needed in case post.internaldate was 0
d2 = starttime - \
datetime(d.year, d.month, d.day).astimezone()
except ValueError:
d2ttl = False
except Exception:
d2ttl = False
else:
if d2 <= timedelta(minutes = ttl):
d2ttl = True
# keep the entry if it is new enough
if d >= oktime or d2ttl:
# get the date of publication
pub = d.strftime("%F")
li = et.SubElement(ul, 'li')
anchor = et.SubElement(li, 'a')
span = et.Element('span')
span.attrib['class'] = 'date'
span.text = pub
# get the title, if available
try:
title = post.title
except Exception:
anchor.text = 'n/a'
anchor.set('title', 'wonky: title missing')
outline.set('class','wonky')
else:
# remove any stray HTML elements from the title
try:
t = htmlstring(title)
except Exception:
True
else:
title = ''.join(t.itertext())
finally:
if title:
anchor.text = title
else:
anchor.text = 'n/a'
anchor.set('title', 'wonky: title missing')
outline.set('class','wonky')
# remember if there was at least one valid title
if re.search(r'\w', title):
countTitles = countTitles + 1
anchor.insert(0,span)
# get the URL
try:
href = post.link
except Exception:
anchor.attrib['href'] = ''
anchor.set('title', 'wonky: link missing')
outline.set('class','wonky')
else:
# make sure the URL is ok
try:
result = urlparse(href)
if not all([result.scheme, result.netloc]):
raise
except Exception:
anchor.attrib['href'] = ''
anchor.set('title', 'wonky: link missing')
outline.set('class','wonky')
else:
anchor.attrib['href'] = quote(href,
safe=":/=&?@,~%+#")
outline.set('class','ok')
if size > 1000000:
outline.set('oversize', bytesToUnits(size))
elif size:
outline.set('size', bytesToUnits(size))
# correct relative links to absolute
if re.search('^/', anchor.attrib['href']):
try:
parsed = urlparse(url)
except Exception as e:
print (e, '->', url)
else:
anchor.attrib['href'] = parsed.scheme \
+ '://' + parsed.netloc + anchor.attrib['href']
countOkEntries = countOkEntries + 1
if not countOkEntries:
# if there were no items or none were fresh enough
# use recent status
stale_urls[url] = {}
stale_urls[url]['redirection'] = redirection
stale_urls[url]['code'] = 3
stale_urls[url]['lastmodified'] = \
validate_last_modified(lastmodified)
stale_urls[url]['repeats'] = repeats
# if most recent entry is older than 1 year
# use recent2 status
if is_really_old(latestEntry):
stale_urls[url]['code'] = 8
li = et.SubElement(ul, 'li')
if (success > 0):
if countAllEntries:
# success but no fresh entries
li.text='No feed entries newer than '+\
datetime(latestEntry.year, latestEntry.month,
latestEntry.day).astimezone()\
.strftime('%F')+',' \
+ ' latest download was ' \
+ datetime.fromtimestamp(int(success))\
.replace(tzinfo=timezone.utc)\
.astimezone().strftime('%F')
else:
# if there were no items at all despite success
li.text='No feed entries.' \
+ ' Latest download was ' \
+ datetime.fromtimestamp(int(success))\
.replace(tzinfo=timezone.utc)\
.astimezone().strftime('%F')
# force back to unmodified status
stale_urls[url]['code'] = 3
else:
# if the fetch was not successful yet
li.text='No successful fetch.'
repeats = lookup_repeats(url, dbcursor)
save_status(dbcursor, url, ttl, status, success,
repeats, tried)
dbconnection.commit()
else:
if countTitles != countOkEntries:
# titles were missing or blank
outline.set('class', 'wonky')
if countTitles:
outline.set('title', 'wonky: some titles missing')
else:
outline.set('title', 'wonky: all titles missing')
if not forceclose:
outline.set('open', '1')
# show that there was some kind of Redirection 1/2
if redirection:
outline.attrib['redirectUrl'] = redirection
outline.append(ul)
outline.attrib['sup'] = 'redirection'
outline.set('class','redirect')
outline.append(ul)
# process broken feeds and errors
for url in stale_urls:
p = './/outline[@xmlUrl="' + url + '"]'
outline = main_tree.find(p)
if isinstance(outline, type(None)):
print(f'Outline Error: "{url}"', file=stderr)
continue
repeats = str(stale_urls[url]['repeats'])
su = stale_urls[url]['code']
if su == 304:
# Unmodified since last time
outline.attrib['sup'] = 'Unmodified'
outline.set('class','unmodified')
ul = et.Element('ul')
li = et.SubElement(ul, 'li')
msg = 'Unmodified. '
if stale_urls[url]['lastmodified']:
lm = stringdate_to_localdate(stale_urls[url]['lastmodified'])
msg = msg + "<br />\n Allegedly Last-Modified: " \
+ lm.strftime('%a, %d %b %Y %T %Z') + '.'
n = datetime.now().astimezone().replace(microsecond=0)
# use CSS class unmodified2 if more than a year old
if n - lm > timedelta(weeks = 52):
outline.set('class','unmodified2')
outline.attrib['sup'] = 'Unmodified for a very long time'
if stale_urls[url]['oldsuccess']:
olds = stringdate_to_localdate(stale_urls[url]['oldsuccess'])
msg = msg + "<br />\n Last download: " \
+ olds.strftime('%a, %d %b %Y %T %Z') + '.'
li.text = msg
outline.append(ul)
elif su == 1:
# malformed feed
ul = et.Element('ul')
li = et.SubElement(ul, 'li')
if int(repeats) > 1:
li.text='Broken feed x ' + repeats + '.'
else:
li.text='Broken feed.'
outline.append(ul)
outline.attrib['sup'] = 'Broken Feed'
outline.set('class','broken')
elif su == 2:
# TTL or Cache-Control max-age
ttl = stale_urls[url]['ttl']
ttlstamp = stale_urls[url]['ttlstamp']
ttlstamp = round_up_minute(ttlstamp)
ul = et.Element('ul')
li = et.SubElement(ul, 'li')
li.text=f'TTL ({ttl}) not expired, check back after ' \
+ ttlstamp.astimezone().strftime('%F %H:%M %Z')
outline.append(ul)
outline.attrib['sup'] = 'TTL not expired.'
outline.set('class','ttl')
elif su == 3:
# no recent items
# these are all filled in already above so clear them
ul = et.Element('ul')
li = et.SubElement(ul, 'li')
outline.append(ul)
outline.attrib['sup'] = 'No recent feeds.'
outline.set('class','recent')
elif su == 4:
# site down
ul = et.Element('ul')
li = et.SubElement(ul, 'li')
if int(repeats) > 1:
li.text='Site not available x ' + repeats + '.'
else:
li.text='Site not available.'
outline.append(ul)
outline.attrib['sup'] = 'Site not available.'
outline.set('class','network')
elif su == 5:
# malformed or missing feed
ul = et.Element('ul')
li = et.SubElement(ul, 'li')
if int(repeats) > 1:
li.text='Malformed or empty feed x ' + repeats + '.'
else:
li.text='Malformed or empty feed.'
outline.append(ul)
outline.attrib['sup'] = 'Malformed or empty feed.'
outline.set('class','malformed')
elif su == 6:
# TLS certificate error of some sort
ul = et.Element('ul')
li = et.SubElement(ul, 'li')
if int(repeats) > 1:
li.text='Site TLS certificate error x ' + repeats + '.'
else:
li.text='Site TLS certificate error.'
outline.append(ul)
outline.attrib['sup'] = 'Site TLS certififcate error.'
outline.set('class','tlserror')
elif su == 7:
# TLS certificate has expired
ul = et.Element('ul')
li = et.SubElement(ul, 'li')
li.text='Site TLS certificate has expired.'
outline.append(ul)
outline.attrib['sup'] = 'Site TLS certififcate has expired.'
outline.set('class','tlserror')
elif su == 8:
# no recent items
# these are all filled in already above so clear them
ul = et.Element('ul')
li = et.SubElement(ul, 'li')
outline.append(ul)
outline.attrib['sup'] = 'No recent feeds for very long time.'
outline.set('class','recent2')
elif su == 9:
# inactive
ul = et.Element('ul')
li = et.SubElement(ul, 'li')
li.text = 'Marked inactive manually in db. Skipping but not deleting.'
outline.append(ul)
outline.attrib['sup'] = 'Marked inactive. Skipping but not deleting.'
outline.set('class','inactive')
outline.attrib['inactive'] = 'inactive'
elif su == 404:
# not found
ul = et.Element('ul')
li = et.SubElement(ul, 'li')
if int(repeats) > 1:
li.text='Missing remote feed file x ' + repeats + '.'
else:
li.text='Missing remote feed file.'
span = et.SubElement(li, 'span')
span.text = url
outline.append(ul)
outline.attrib['sup'] = 'Missing File'
outline.set('class','missing')
elif su == 403:
# access denied
ul = et.Element('ul')
li = et.SubElement(ul, 'li')
if int(repeats) > 1:
li.text='Access denied x ' + repeats + '.'
else:
li.text='Access denied.'
outline.append(ul)
outline.attrib['sup'] = 'Access denied'
outline.set('class','access')
elif su == 429:
# too many requests
try:
pt = stale_urls[url]['ttlstamp']
t = 'Too many requests, too often. Skipping until after ' \
+ pt.replace(tzinfo=timezone.utc).astimezone() \
.strftime('%a, %d %b %Y %H:%M:%S %Z')
except Exception:
t = 'Too many requests, too often. Check back later.'
ul = et.Element('ul')
li = et.SubElement(ul, 'li')
li.text = t
outline.append(ul)
outline.attrib['sup'] = t
outline.set('class','toomany')
elif su == 502:
# bad gateway
ul = et.Element('ul')
li = et.SubElement(ul, 'li')
if int(repeats) > 1:
li.text='Bad gateway x ' + repeats + '.'
else:
li.text='Bad gateway.'
outline.append(ul)
outline.attrib['sup'] = 'Bad gateway'
outline.set('class','malformed')
if stale_urls[url]['redirection']:
# show that there was some kind of Redirection 2/2
outline.attrib['redirectUrl'] = stale_urls[url]['redirection']
outline.attrib['sup'] = 'redirection'
outline.set('class','redirect')
if verbosity:
print("Culling empty nodes")
# this XPath is slow, it marks relevant branches as "open"
for ok in main_tree.xpath('.//outline[descendant::outline[@class="ok"]]|.//outline[descendant::outline[@class="redirect"]]'):
ok.set('class', 'ok')
if not forceclose:
ok.set('open', '1')
# close nodes labeled as Defunct
for defunct in main_tree.xpath('.//outline[contains(@text,"Defunct")]'):
defunct.attrib.pop('open', None)
if verbosity > 2:
print(et.tostring(main_tree, method="xml").decode("UTF-8"))
if exportlog and log:
log.close()
elif logging:
exit(0)
dbcursor.close()
dbconnection.close()
return(main_tree)
def output_css():
# produce matching CSS for the HTML output
css = '''/* floating toggle switch */
p#togglemode {
float: left;
}
/* toggle button formatting and layout */
label.toggle {
position : relative ;
display : inline-block;
width : 2.4em;
height : 4.4em;
background-color: hsl(0, 0%, 0%);
border-radius: 2em;
border: 0.1em solid hsl(0, 0%, 40%);
}
/* After slide changes */
label.toggle:after {
content: '';
position: absolute;
width: 2em;
height: 2em;
border-radius: 2em;
background-color: hsl(0, 0%, 95%);
margin: 0.1em;
padding: 0.1em;
transition: all 0.5s;
}
/* Checkbox checked effect */
input.mode:checked + label.toggle::after {
top: 2em;
background-color: hsl(0, 0%, 5%);
}
/* Checkbox checked toggle label bg color */
input.mode:checked + label.toggle {
background-color: hsl(0, 0%, 65%);
}
/* Checkbox vanished */
input.mode {
display : none;
}
li { padding-left: 0.5rem; }
body:has(input.mode:checked) h1,
body:has(input.mode:checked) h2,
body:has(input.mode:checked) h3,
body:has(input.mode:checked) h4,
body:has(input.mode:checked) h5 {
color: hsl(0, 0%, 85%);
background-color: hsl(0, 0%, 25%);
border: thin solid hsl(0, 0%, 45%);
}
h1, h2, h3, h4, h5 {
padding: 0.2em;
text-align: center;
font-family: sans-serif;
border: thin solid hsl(0, 0%, 45%);
border-top-left-radius: 0.2em 0.2em;
border-bottom-left-radius: 0.2em 0.2em;
border-bottom-right-radius: 0.2em 0.2em;
border-top-right-radius: 0.2em 0.2em;
background-color: hsl(0, 0%, 85%);
}
body {
/* light mode */
background-color: hsl(0, 0%, 100%);
}
body:has(input.mode:checked) {
/* dark mode */
color: hsl(0, 0%, 0%);
background-color: hsl(0, 0%, 10%);
}
body details {
border: thin solid hsl(0, 0%, 45%);
border-radius: 0.3rem;
margin-bottom: 0.5rem;
background-color: hsl(0, 0%, 75%);
}
body details[open] {
border: thin solid hsl(0, 0%, 45%);
background-color: hsl(0, 0%, 75%);
}
body:has(input.mode:checked) details {
color: hsl(0, 0%, 50%);
background-color: hsl(0, 0%, 20%); }
body details > summary {
font-weight: bold;
list-style: none;
border-radius: 0.3rem;
background-color: hsl(0, 0%, 80%);
}
body details[open] > summary {
background-color: hsl(0, 0%, 75%);
}
body:has(input.mode:checked) details > summary {
background-color: hsl(0, 0%, 20%); }
body:has(input.mode:checked) details > summary::before {
font-weight: bold;
list-style: none;
border-radius: 0.3rem;
background-color: hsl(0, 0%, 35%);
}
body details[open]:not(:has(details)) {
background-color: hsl(0, 0%, 75%);
}
body:has(input.mode:checked) details:not(:has(details)) > summary,
body:has(input.mode:checked) details:not(:has(details)),
body:has(input.mode:checked) details[open]:not(:has(details)) {
background-color: hsl(0, 0%, 20%);
}
dt > details > summary::before {
content: "▶";
border-radius: 3rem 0 0 3rem;
padding-left: 0.5em;
padding-right: 0.5em;
font-size: 150%;
font-weight: bold;
}
dt > details[open] > summary::before {
padding-left: 0.5em;
padding-right: 0.5em;
}
body details[open] > summary {
border-bottom: none; }
body:has(input.mode:checked) details[open] > summary {
color: hsl(0, 0%, 50%); }
body dt > details > summary::before,
body dt.ok > details > summary::before {
background-color: hsl(0, 0%, 80%); }
body dt.ok > details[open] > summary::before {
background-color: hsl(0, 0%, 75%); }
body dt.recent details > summary::before,
body dt.unmodified details > summary::before,
body dt.unmodified2 details > summary::before,
body dt.missing details > summary::before,
body dt.inactive details > summary::before,
body dt.network details > summary::before,
body dt.ttl details > summary::before,
body dt.oversize details > summary::before,
body dt.access details > summary::before,
body dt.redirection details > summary::before,
body dt.tlserror details > summary::before,
body dt.wonky details > summary::before,
body dt.broken details > summary::before,
body dt.malformed details > summary::before {
background-color: hsl(0, 0%, 65%); }
body dt.recent2 details > summary::before {
color: hsl(0, 85%, 35%);
background-color: hsl(0, 0%, 65%); }
body dt.recent2 > details[open] > summary::before {
color: hsl(0, 85%, 35%); }
body dt.toomany details > summary::before,
body dt.toomany details[open] > summary::before,
body dt.unmodified2 details > summary::before,
body dt.unmodified2 details[open] > summary::before {
color: hsl(0, 100%, 30%);
background-color: hsl(0, 0%, 65%); }
body dt.recent details > summary,
body dt.recent2 details > summary,
body dt.unmodified details > summary,
body dt.unmodified2 details > summary,
body dt.toomany details > summary,
body dt.missing details > summary,
body dt.inactive details > summary,
body dt.network details > summary,
body dt.ttl details > summary,
body dt.oversize details > summary,
body dt.access details > summary,
body dt.redirection details > summary,
body dt.tlserror details > summary,
body dt.wonky details > summary,
body dt.broken details > summary,
body dt.malformed details > summary {
background-color: hsl(0, 0%, 65%); }
body dt.recent details,
body dt.recent2 details,
body dt.unmodified details,
body dt.unmodified2 details,
body dt.toomany details,
body dt.missing details,
body dt.inactive details,
body dt.network details,
body dt.ttl details,
body dt.oversize details,
body dt.access details,
body dt.redirection details,
body dt.tlserror details,
body dt.wonky details,
body dt.broken details,
body dt.malformed details {
background-color: hsl(0, 0%, 65%); }
body dt.recent details li,
body dt.recent2 details li,
body dt.unmodified details li,
body dt.unmodified2 details li,
body dt.missing details li,
body dt.inactive details li,
body dt.toomany details li,
body dt.missing details li,
body dt.network details li,
body dt.ttl details li,
body dt.oversize details li,
body dt.access details li,
body dt.redirection details li,
body dt.tlserror details li,
body dt.broken details li,
body dt.malformed details li {
background-color: hsl(0, 0%, 60%);
color: hsl(0, 0%, 15%);
}
body:has(input.mode:checked) dt > details > summary::before {
color: hsl(0, 0%, 70%);
background-color: hsl(0, 0%, 20%); }
body:has(input.mode:checked) dt.ok > details > summary::before {
color: hsl(0, 0%, 70%);
background-color: hsl(0, 0%, 20%); }
body:has(input.mode:checked) dt.ok > details[open] > summary::before {
color: hsl(0, 0%, 70%);
background-color: hsl(0, 0%, 20%); }
body:has(input.mode:checked) dt.recent details > summary {
color: hsl(0, 0%, 65%);
background-color: hsl(0, 0%, 35%); }
body:has(input.mode:checked) dt.ok details > summary {
border-bottom: none;
color: hsl(0, 0%, 70%);
background-color: hsl(0deg 0% 20%); }
body:has(input.mode:checked) dt.ok details[open] > summary {
border-bottom: none;
color: hsl(0, 0%, 70%);
background-color: hsl(0, 0%, 20%); }
body:has(input.mode:checked) dt.recent details > summary::before,
body:has(input.mode:checked) dt.unmodified details > summary::before,
body:has(input.mode:checked) dt.missing details > summary::before,
body:has(input.mode:checked) dt.inactive details > summary::before,
body:has(input.mode:checked) dt.network details > summary::before,
body:has(input.mode:checked) dt.ttl details > summary::before,
body:has(input.mode:checked) dt.oversize details > summary::before,
body:has(input.mode:checked) dt.access details > summary::before,
body:has(input.mode:checked) dt.redirection details > summary::before,
body:has(input.mode:checked) dt.tlserror details > summary::before,
body:has(input.mode:checked) dt.wonky details > summary::before,
body:has(input.mode:checked) dt.broken details > summary::before,
body:has(input.mode:checked) dt.malformed details > summary::before {
color: hsl(0, 0%, 75%);
background-color: hsl(0, 0%, 35%); }
body:has(input.mode:checked) dt.toomany details > summary::before,
body:has(input.mode:checked) dt.unmodified2 details > summary::before,
body:has(input.mode:checked) dt.recent2 details > summary::before {
color: hsl(0, 100%, 70%);
background-color: hsl(0, 0%, 40%); }
body:has(input.mode:checked) dt.recent details > summary,
body:has(input.mode:checked) dt.unmodified details > summary,
body:has(input.mode:checked) dt.missing details > summary,
body:has(input.mode:checked) dt.inactive details > summary,
body:has(input.mode:checked) dt.network details > summary,
body:has(input.mode:checked) dt.ttl details > summary,
body:has(input.mode:checked) dt.oversize details > summary,
body:has(input.mode:checked) dt.access details > summary,
body:has(input.mode:checked) dt.redirection details > summary,
body:has(input.mode:checked) dt.tlserror details > summary,
body:has(input.mode:checked) dt.wonky details > summary,
body:has(input.mode:checked) dt.broken details > summary,
body:has(input.mode:checked) dt.malformed details > summary {
color: hsl(0, 0%, 65%);
background-color: hsl(0, 0%, 35%); }
body:has(input.mode:checked) dt.toomany details > summary,
body:has(input.mode:checked) dt.unmodified2 details > summary,
body:has(input.mode:checked) dt.recent2 details > summary {
color: hsl(0, 0%, 65%);
background-color: hsl(0deg 0% 40%); }
body:has(input.mode:checked) dt.recent details[open] > summary,
body:has(input.mode:checked) dt.unmodified details[open] > summary,
body:has(input.mode:checked) dt.missing details[open] > summary,
body:has(input.mode:checked) dt.inactive details[open] > summary,
body:has(input.mode:checked) dt.network details[open] > summary,
body:has(input.mode:checked) dt.ttl details[open] > summary,
body:has(input.mode:checked) dt.oversize details[open] > summary,
body:has(input.mode:checked) dt.access details[open] > summary,
body:has(input.mode:checked) dt.redirection details[open] > summary,
body:has(input.mode:checked) dt.tlserror details[open] > summary,
body:has(input.mode:checked) dt.wonky details[open] > summary,
body:has(input.mode:checked) dt.broken details[open] > summary,
body:has(input.mode:checked) dt.malformed details[open] > summary {
color: hsl(0, 0%, 75%);
background-color: hsl(0, 0%, 35%); }
body:has(input.mode:checked) dt.toomany details[open] > summary,
body:has(input.mode:checked) dt.unmodified2 details[open] > summary,
body:has(input.mode:checked) dt.recent2 details[open] > summary {
color: hsl(0, 0%, 65%);
background-color: hsl(0, 0%, 40%); }
body:has(input.mode:checked) dt.recent details[open],
body:has(input.mode:checked) dt.unmodified details[open],
body:has(input.mode:checked) dt.missing details[open],
body:has(input.mode:checked) dt.inactive details[open],
body:has(input.mode:checked) dt.network details[open],
body:has(input.mode:checked) dt.ttl details[open],
body:has(input.mode:checked) dt.oversize details[open],
body:has(input.mode:checked) dt.access details[open],
body:has(input.mode:checked) dt.redirection details[open],
body:has(input.mode:checked) dt.tlserror details[open],
body:has(input.mode:checked) dt.wonky details[open],
body:has(input.mode:checked) dt.broken details[open],
body:has(input.mode:checked) dt.malformed details[open] {
background-color: hsl(0, 0%, 35%); }
body:has(input.mode:checked) dt.toomany details[open],
body:has(input.mode:checked) dt.unmodified2 details[open],
body:has(input.mode:checked) dt.recent2 details[open] {
background-color: hsl(0, 0%, 40%); }
body:has(input.mode:checked) dt.recent details[open] li,
body:has(input.mode:checked) dt.recent2 details[open] li,
body:has(input.mode:checked) dt.unmodified details[open] li,
body:has(input.mode:checked) dt.unmodified2 details[open] li,
body:has(input.mode:checked) dt.toomany details[open] li,
body:has(input.mode:checked) dt.missing details[open] li,
body:has(input.mode:checked) dt.inactive details[open] li,
body:has(input.mode:checked) dt.network details[open] li,
body:has(input.mode:checked) dt.ttl details[open] li,
body:has(input.mode:checked) dt.oversize details[open] li,
body:has(input.mode:checked) dt.access details[open] li,
body:has(input.mode:checked) dt.redirection details[open] li,
body:has(input.mode:checked) dt.tlserror details[open] li,
body:has(input.mode:checked) dt.broken details[open] li,
body:has(input.mode:checked) dt.malformed details[open] li {
color: hsl(0, 0%, 85%);
background-color: hsl(0, 0%, 50%); }
/* html body dl dt details dd details ul li */
dl {
margin-left: 1.5em;
margin-right: 1.5em;
padding-bottom: 0.5em;
}
dd > details > ul {
margin-bottom: 0.3em;
}
/* https://en.wikipedia.org/wiki/HTML_color_names#Basic_colors */
body li a:link { color: hsl(240, 100%, 50%); }
body:has(input.mode:checked) li:nth-child(odd) a:link {
color: hsl(240, 100%, 69%); }
body:has(input.mode:checked) li:nth-child(even) a:link {
color: hsl(240, 85%, 67%); }
body li a:visited { color: hsl(300, 100%, 25%); }
body:has(input.mode:checked) li:nth-child(odd) a:visited {
color: hsl(270, 66%, 55%); }
body:has(input.mode:checked) li:nth-child(even) a:visited {
color: hsl(270, 68%, 55%); }
body:has(input.mode:checked) li:hover a:link {
color: hsl(240, 90%, 20%); }
body li span.date {
font-family: monospace;
font-weight: bold;
}
body li:nth-child(odd) {
background-color: hsl(0, 0%, 100%); }
body li:nth-child(even) {
background-color: hsl(0, 0%, 90%); }
body li:nth-child(odd) span.date {
color: hsl(0, 0%, 25%); }
body li:nth-child(even) span.date {
color: hsl(0, 0%, 15%); }
body li:hover span.date {
color: hsl(0, 0%, 22%); }
body:has(input.mode:checked) li:nth-child(odd) span.date {
color: hsl(0, 0%, 50%); }
body:has(input.mode:checked) li:nth-child(even) span.date {
color: hsl(0, 0%, 45%); }
body:has(input.mode:checked) li:hover span.date {
color: hsl(0, 0%, 25%); }
body details ul li {
border-radius: 0.2em;
list-style: none;
border: thin solid hsl(0, 0%, 50%); }
li:nth-child(odd):hover { background-color: hsl(120, 25%, 85%); }
li:nth-child(even):hover { background-color: hsl(120, 25%, 85%); }
body:has(input.mode:checked) li:nth-child(odd):hover {
background-color: hsl(120, 9%, 50%); }
body:has(input.mode:checked) li:nth-child(even):hover {
background-color: hsl(120, 9%, 50%); }
body:has(input.mode:checked) dt.missing li:hover {
color: hsl(0, 0%, 15%);
background-color: hsl(120, 9%, 50%); }
body:has(input.mode:checked) dt.inactive li:hover {
color: hsl(0, 0%, 15%);
background-color: hsl(120, 9%, 50%); }
body:has(input.mode:checked) details ul li:nth-child(odd) {
border: thin solid hsl(0, 0%, 35%);
background-color: hsl(0, 0%, 17%);}
body:has(input.mode:checked) details ul li:nth-child(even) {
border: thin solid hsl(0, 0%, 30%);
background-color: hsl(0, 0%, 13%); }
/* regular feed */
dt.ok > details > summary::before {
content: "▶"; }
dt.ok > details[open] > summary::before {
content: "▼"; }
/* not modified since last check (304) */
body:has(input.mode:checked) dt.unmodified details > summary::before,
dt.unmodified details > summary::before,
body:has(input.mode:checked) dt.unmodified2 details > summary::before,
dt.unmodified2 details > summary::before {
content: "◷"; }
body:has(input.mode:checked) dt.unmodified details[open] > summary::before,
dt.unmodified details[open] > summary::before,
body:has(input.mode:checked) dt.unmodified2 details[open] > summary::before,
dt.unmodified2 details[open] > summary::before {
content: "◶"; }
/* not modified since last check (304) */
body:has(input.mode:checked) dt.unmodified details > summary::before {
color: hsl(0, 0%, 75%); }
body:has(input.mode:checked) dt.unmodified details[open] > summary::before {
color: hsl(0, 0%, 75%); }
/* not modified since last check (304) a long time ago */
body:has(input.mode:checked) dt.unmodified2 details > summary::before,
color: hsl(0, 100%, 70%); }
body:has(input.mode:checked) dt.unmodified2 details[open] > summary::before {
color: hsl(0, 100%, 70%); }
/* no recent entries */
body:has(input.mode:checked) dt.recent details > summary::before,
dt.recent details > summary::before {
content: "▷"; }
body:has(input.mode:checked) dt.recent details[open] > summary::before,
dt.recent details[open] > summary::before {
content: "▽"; }
/* no recent entries for a long time */
body:has(input.mode:checked) dt.recent2 details > summary::before,
dt.recent2 details > summary::before {
content: "▷"; }
body:has(input.mode:checked) dt.recent2 details[open] > summary::before,
dt.recent2 details[open] > summary::before {
content: "▽"; }
/* site down, network, or other OSError */
body:has(input.mode:checked) dt.network details > summary::before,
dt.network details > summary::before {
content: "◌"; }
body:has(input.mode:checked) dt.network details[open] > summary::before,
dt.network details[open] > summary::before {
content: "◌"; }
/* ttl has not expired */
body:has(input.mode:checked) dt.ttl details > summary::before,
dt.ttl details > summary::before {
content: "⧖"; }
body:has(input.mode:checked) dt.ttl details[open] > summary::before,
dt.ttl details[open] > summary::before {
content: "⧗"; }
/* too many requests (429) */
body:has(input.mode:checked) dt.toomany details > summary::before,
dt.toomany details > summary::before {
content: "⧖"; }
body:has(input.mode:checked) dt.toomany details[open] > summary::before,
dt.toomany details[open] > summary::before {
content: "⧗"; }
/* feed malformed or empty */
body:has(input.mode:checked) dt.malformed details > summary::before,
dt.malformed details > summary::before {
content: "⦼"; }
body:has(input.mode:checked) dt.malformed details[open] > summary::before,
dt.malformed details[open] > summary::before {
content: "⨸"; }
/* broken feed */
body:has(input.mode:checked) dt.broken details > summary::before,
dt.broken details > summary::before {
content: "⊚"; }
body:has(input.mode:checked) dt.broken details[open] > summary::before,
dt.broken details[open] > summary::before {
content: "⊚"; }
/* feed missing */
body:has(input.mode:checked) dt.missing details > summary::before,
dt.missing details > summary::before {
content: "○"; }
body:has(input.mode:checked) dt.missing details[open] > summary::before,
dt.missing details[open] > summary::before {
content: "○"; }
/* feed marked inactive internally */
dt.inactive > details > summary::before {
content: "●";
color: hsl(0deg 0% 40%); }
body:has(input.mode:checked) dt.inactive > details > summary::before {
content: "●";
color: hsl(0deg 0% 65%); }
dt.inactive > details[open] > summary::before {
content: "●";
color: hsl(0deg 0% 40%); }
body:has(input.mode:checked) dt.inactive > details[open] > summary::before {
content: "●";
color: hsl(0deg 0% 65%); }
/* redirecton */
dt.redirect details > summary::before {
content: "▸";
color: hsl(0, 100%, 30%); }
body:has(input.mode:checked) dt.redirect details > summary::before {
content: "▸";
color: hsl(0, 75%, 60%); }
dt.redirect details[open] > summary::before {
content: "▾";
color: hsl(0, 100%, 30%);
background-color: hsl(0, 0%, 75%); }
body:has(input.mode:checked) dt.redirect details[open] > summary::before {
content: "▾";
color: hsl(0, 75%, 60%); }
/* tls error */
dt.tlserror details > summary::before {
content: "▶";
color: hsl(0deg 46% 32%); }
body:has(input.mode:checked) dt.tlserror details > summary::before {
content: "▶";
color: hsl(0deg 46% 28%); }
dt.tlserror details[open] > summary::before {
content: "▼";
color: hsl(0deg 0% 0%); }
body:has(input.mode:checked) dt.tlserror details[open] > summary::before {
content: "▼";
color: hsl(0deg 46% 28%); }
/* access forbidden */
dt.access details > summary::before {
content: "◍"; }
body:has(input.mode:checked) dt.access details > summary::before {
content: "◍"; }
dt.access details[open] > summary::before {
content: "◍"; }
body:has(input.mode:checked) dt.access details[open] > summary::before {
content: "◍"; }
/* wonky feed */
dt.wonky > details > summary::before {
content: "⨻";
color: hsl(0deg 0% 40%); }
body:has(input.mode:checked) dt.wonky > details > summary::before {
content: "⨻";
color: hsl(0deg 0% 65%); }
dt.wonky > details[open] > summary::before {
content: "⨻";
color: hsl(0deg 0% 40%); }
body:has(input.mode:checked) dt.wonky > details[open] > summary::before {
content: "⨻";
color: hsl(0deg 0% 65%); }
details > dl > dd {
padding: 1em;
margin-right: 2em;
}
li a { text-decoration: underline; }
a.site:hover,
a.feed:hover,
body:has(input.mode:checked) a.site:hover,
body:has(input.mode:checked) a.feed:hover {
text-decoration: none;
color: hsl(120deg 25% 85%); }
dt > details > summary > span > a.site,
dt > details > summary > span > a.feed {
text-decoration: none;
color: hsl(0deg 0% 50%);
}
dt > details > summary > span > a.redirection {
text-decoration: none;
color: hsl(240deg 100% 50%); }
body:has(input.mode:checked) dt > details > summary > span > a.redirection {
text-decoration: none;
color: hsl(240deg 100% 65%); }
body:has(input.mode:checked) dt > details > summary > span > a.redirection:hover {
text-decoration: none;
color: hsl(240deg 95% 55%); }
dt > details > summary > span > a.oversize {
text-decoration: none;
color: hsl(0deg 0% 40%);
}
body:has(input.mode:checked) dt > details > summary > span > a.site {
color: hsl(0deg 0% 50%); }
body:has(input.mode:checked) dt > details > summary > span > a.feed {
color: hsl(0deg 0% 50%); }
'''
return(css)
def xml_to_html(feeds):
# use XSLT to convert the bastardized OPML results to HTML
global verbosity
xsl = '''
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output method="xhtml" html-version="5" omit-xml-declaration="no"
include-content-type="no" indent="yes"/>
<xsl:template match="/">
<html>
<head>
<title>RRRRRR</title>
<link rel="stylesheet" href="rrrrrr.css" media="screen, projection"
type="text/css" />
</head>
<body>
<p id="togglemode">
<input type="checkbox" id="darkmode" class="mode" />
<label for="darkmode" class="toggle">
</label>
</p>
<h1 title="Roy and Rianne's Righteously Royalty-free RSS Reader">R.R.R.R.R.R.</h1>
<h3>
<xsl:value-of select=".//dateModified"/>
</h3>
<dl>
<xsl:apply-templates />
</dl>
</body>
</html>
</xsl:template>
<xsl:template match="//outline">
<dt>
<xsl:if test="@class">
<xsl:attribute name="class">
<xsl:value-of select="./@class"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="@title">
<xsl:attribute name="title">
<xsl:value-of select="./@title"/>
</xsl:attribute>
</xsl:if>
<xsl:element name="details">
<xsl:if test="@open">
<xsl:attribute name="open">
<xsl:value-of select="./@open"/>
</xsl:attribute>
</xsl:if>
<summary>
<xsl:element name="span">
<xsl:if test="@sup">
<xsl:attribute name="title">
<xsl:value-of select="./@sup"/>
</xsl:attribute>
</xsl:if>
</xsl:element>
<xsl:value-of select="@text" />
<xsl:if test="@htmlUrl">
<xsl:text disable-output-escaping="yes"> </xsl:text>
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="./@htmlUrl"/>
</xsl:attribute>
<xsl:attribute name="title">
<xsl:value-of select="./@htmlUrl"/>
</xsl:attribute>
<xsl:attribute name="class">
<xsl:text>site</xsl:text>
</xsl:attribute>
<xsl:text disable-output-escaping="yes">●</xsl:text>
</xsl:element>
<xsl:text disable-output-escaping="yes"> </xsl:text>
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="./@xmlUrl"/>
</xsl:attribute>
<xsl:attribute name="title">
<xsl:if test="@size">
<xsl:value-of select="./@size"/>
<xsl:text disable-output-escaping="yes"> </xsl:text>
</xsl:if>
<xsl:value-of select="./@xmlUrl"/>
</xsl:attribute>
<xsl:attribute name="class">
<xsl:text>feed</xsl:text>
</xsl:attribute>
<xsl:text disable-output-escaping="yes">●</xsl:text>
</xsl:element>
<xsl:if test="@redirectUrl">
<xsl:text disable-output-escaping="yes"> </xsl:text>
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="./@redirectUrl"/>
</xsl:attribute>
<xsl:attribute name="title">
<xsl:text disable-output-escaping="yes">Redirection: </xsl:text>
<xsl:value-of select="./@redirectUrl"/>
</xsl:attribute>
<xsl:attribute name="class">
<xsl:text>redirection</xsl:text>
</xsl:attribute>
<xsl:text disable-output-escaping="yes">●</xsl:text>
</xsl:element>
</xsl:if>
<xsl:if test="@inactive">
<xsl:text disable-output-escaping="yes"> </xsl:text>
<xsl:element name="span">
<xsl:attribute name="title">
<xsl:text disable-output-escaping="yes">Inactive</xsl:text>
</xsl:attribute>
<xsl:attribute name="class">
<xsl:text>inactive</xsl:text>
</xsl:attribute>
<xsl:text disable-output-escaping="yes">💤</xsl:text>
</xsl:element>
</xsl:if>
<xsl:if test="@oversize">
<xsl:text disable-output-escaping="yes"> </xsl:text>
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="./@xmlUrl"/>
</xsl:attribute>
<xsl:attribute name="title">
<xsl:value-of select="./@oversize"/>
</xsl:attribute>
<xsl:attribute name="class">
<xsl:text>oversize</xsl:text>
</xsl:attribute>
<xsl:text disable-output-escaping="yes">ⓘ</xsl:text>
</xsl:element>
</xsl:if>
</xsl:if>
</summary>
<dl>
<xsl:apply-templates select="*[(self::ul or self::outline)]" />
</dl>
</xsl:element>
</dt>
</xsl:template>
<xsl:template match="ul">
<ul>
<xsl:apply-templates select="li" />
</ul>
</xsl:template>
<xsl:template match="li">
<li>
<xsl:apply-templates select="a[@href]" />
<xsl:value-of select="text()" />
</li>
</xsl:template>
<xsl:template match="a">
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="@href"/>
</xsl:attribute>
<xsl:apply-templates select="./*" />
<xsl:copy-of select="text()[normalize-space()][1]"/>
</xsl:element>
</xsl:template>
<xsl:template match="*[ancestor::a]">
<xsl:element name="span">
<xsl:attribute name="class">
<xsl:value-of select="@class"/>
</xsl:attribute>
<xsl:value-of select="." />
</xsl:element>
<xsl:text disable-output-escaping="yes"> </xsl:text>
</xsl:template>
<xsl:template match="p[ancestor::outline]">
<dd><xsl:value-of select="text()" /></dd>
</xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>
'''
xslt = et.XML(xsl)
transform = et.XSLT(xslt)
dom2 = transform(feeds)
xhtml = et.tostring(dom2,pretty_print=True)
xhtml = unescape(xhtml.decode('utf-8'))
return(xhtml)
def xml_to_citation(feeds):
# alternative HTML output format
global verbosity
xsl = '''
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output method="text" indent="no" include-content-type="no" />
<xsl:template match="/">
<html>
<head>
<title>RRRRRR</title>
<link rel="stylesheet" href="rrrrrr.css" media="screen, projection"
type="text/css" />
</head>
<body>
<h1 title="Roy and Rianne's Righteously Royalty-free RSS Reader">R.R.R.R.R.R.</h1>
<h3>
<xsl:value-of select=".//dateModified"/>
</h3>
<dl>
<xsl:apply-templates select="//outline" />
</dl>
</body>
</html>
</xsl:template>
<xsl:template match="//outline">
<ul>
<xsl:apply-templates select="*[(self::ul or self::outline)]" />
</ul>
</xsl:template>
<xsl:template match="li">
<xsl:element name="li">
<xsl:if test="a[@href]">
<xsl:element name="h5">
<xsl:apply-templates select="a[@href]" />
</xsl:element>
<xsl:element name="blockquote">
<xsl:element name="p">
<xsl:text disable-output-escaping="yes"> </xsl:text>
</xsl:element>
</xsl:element>
</xsl:if>
</xsl:element>
</xsl:template>
<xsl:template match="a">
<xsl:element name="a" disable-output-escaping="yes" >
<xsl:attribute name="href">
<xsl:value-of select="@href" disable-output-escaping="yes"/>
</xsl:attribute>
<xsl:apply-templates select="./*" />
<xsl:copy-of select="text()[normalize-space()][1]"/>
</xsl:element>
</xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>
'''
xslt = et.XML(xsl)
transform = et.XSLT(xslt)
dom2 = transform(feeds)
xhtml = et.tostring(dom2,pretty_print=True)
xhtml = unescape(xhtml.decode('utf-8'))
return(xhtml)
def initialize_date(startdate):
# convert input date to date timwe object for checking feed items
global quiet
if startdate:
try:
oktime = datetime.strptime(startdate, '%Y-%m-%d')
except Exception:
try:
oktime = dateparse.parse(start.date, fuzzy=True)
except Exception:
if not quiet:
print("Malformed or invalid date")
exit(1)
else:
oktime = datetime.now(timezone.utc).replace(microsecond=0) \
- timedelta(days=2)
oktime = oktime.date()
return(oktime)
def bytesToUnits(bytes: int):
# convert bytes to kB, MB, GB, or TB
unit = 0
si =['', 'B', 'kB', 'MB', 'GB', 'TB']
while bytes > 1:
unit = unit + 1
old = int(bytes)
bytes = bytes / 1000
if unit >= len(si):
return("large, odd size")
return(f"{old} {si[unit]}")
def getOutputDirectory(outputfile):
# calculate directory to save output file into
global quiet
if (outputfile):
outputdirectory = re.sub('/[^/]+$', '', outputfile)
else:
outputdirectory = os.environ.get("XDG_RUNTIME_DIR")
if (outputdirectory is None):
outputdirectory = os.getcwd()
if outputdirectory is None:
outputdirectory = '.'
if not os.path.isdir(outputdirectory):
if not quiet:
stderr.write(outputdirectory + " is not a directory\n")
exit(1);
return(outputdirectory)
def CSSOutputFile(outputdirectory):
# create the CSS file in the output directory, if needed
global quiet
cssoutputfile = outputdirectory + "/rrrrrr.css"
if not os.path.exists(cssoutputfile):
try:
with open(cssoutputfile, "w") as css_file:
css = output_css()
css_file.write(css)
css_file.close()
except PermissionError:
if not quiet:
print(f"File or directory unwritable: {cssoutputfile}")
exit(1)
except FileNotFoundError:
if not quiet:
print(f"Wrong file or file path 3: {cssoutputfile}")
exit(1)
elif not os.path.isfile(cssoutputfile):
if not quiet:
stderr.write(cssoutputfile + " is not a file\n")
if not os.path.islink(cssoutputfile):
if not quiet:
stderr.write(outputdirectory \
+ " is not a symbolic link either\n")
exit(1);
return(cssoutputfile)
# main script
dbpath = import_dbpath()
if not dbpath:
if not quiet:
print(f"Path '{dbpath}' unavailable")
exit(1)
# read ARGV
parser = ArgumentParser( prog='PROG',
description="This script fetches updated RSS and Atom feeds as HTML.",
formatter_class=RawTextHelpFormatter)
parser.add_argument("-d", "--date", dest="startdate", type=str,
default=None, # actual default is set below
help="date to start from yyyy-mm-dd, default=2 days ago")
parser.add_argument("-o", "--output", dest="outputfile", type=str,
default=None,
help="destination path for resulting HTML file, defaults XDG_RUNTIME_DIR if it exists or to current working directory otherwise")
parser.add_argument("-s", "--stdout", dest="stdout",
default=False, action="store_true",
help="send output to stdout instead of a file")
parser.add_argument("--append", dest="append",
default=False, action="store_true",
help="append new OPML data to db cache, default=off")
parser.add_argument("--citation", dest="citationformat",
default=False, action="store_true",
help="format HTML output for citation, default=off")
parser.add_argument("--clearopml", dest="clearopml",
default=False, action="store_true",
help="clear existing OMPL cache and exit")
parser.add_argument("--css", "--exportcss", dest="exportcss",
default=False, action="store_true",
help="print matching CSS to stdout and exit.")
parser.add_argument("--opml", "--exportopml", dest="exportfile", type=str,
default=False, nargs='?',
help="output OPML file to stdout, or to optional file if named, and exit.")
parser.add_argument("--force", "--forcefetch", dest="forcefetch",
default=False, action="store_true",
help="try to fetch all URLs regardless of past errors or status.")
parser.add_argument("--forceclose", dest="forceclose",
default=False, action="store_true",
help="force all detail elements to be closed initially, the default is open.")
parser.add_argument("--log", "--exportlog", dest="exportlog", type=str,
default=False, metavar='log_file', nargs="?",
help="log connection info to file, or to stdout if no file given, may be combined with --force to list all missing or broken URLs.")
parser.add_argument("--threads", dest="threads", type=int,
default=10,
help="number of threads to run concurrently, default=10, must be low (<15) on home networks.")
parser.add_argument("-q", "--quiet", dest="quiet",
default=False, action="store_true",
help="suppress messages to stderr")
parser.add_argument("-v", "--verbose", dest="verbosity",
default=0, action='count',
help="increase verbosity of reporting.")
parser.add_argument('importfiles', metavar='OPML_file', type=str, nargs='*',
default='',
help='OPML files to import')
parser.epilog='''
Fetch eligible RSS and Atom feeds and save them to a file as XHTML. A different destination can be designated with the -o option, or stdout with -s. A matching CSS file will be created in the same directory if it does not already exists. Before any feeds can be fetched they must first be loaded by passing an OPML-formatted file as a positional argument:
rrrrrr.py feeds.opml
Using a positional argument loads that OPML structure into the configuration. Loading overwrites the old configuration each time. Without options or positional arguments the script fetches the eligible feeds which have passed their TTL, from those feeds it listrs the available entries if they are fresher than last two days and prints them as XHTML. The default is to print to a file, but there is also the -o option:
rrrrrr.py --stdout > feed.output.html
or
rrrrrr.py --output feed.output.html
The start date can be overidden by the -d option with a date in the yyyy-mm-dd format:
rrrrrr.py -d 2023-02-03 -o feed.output.html
The script can also extract and print the OPML from its configuration as well as produce the CSS file matching the resulting HTML.
There is an internal field, active, in the status table in the database which can be toggled manually to skip fetching a feed without actually deleting it from the database. This allows retention of ETag and Last-Modified information even when skipping a feed.
'''
# get run time options
options = parser.parse_args()
verbosity = options.verbosity
outputfile = options.outputfile
appendopml = options.append
exportfile = options.exportfile
importfiles = options.importfiles
startdate = options.startdate
exportcss = options.exportcss
exportlog = options.exportlog
forcefetch = options.forcefetch
forceclose = options.forceclose
clearopml = options.clearopml
stdout = options.stdout
quiet = options.quiet
threads = options.threads
citationformat = options.citationformat
if exportcss:
# only print the CSS
print(output_css())
exit(0)
if exportlog is None:
exportlog = True
if exportfile is None:
exportfile = True
# calculate the database name including path
db = dbpath + 'status.sqlite3'
# open the database and designate a cursor
dbconnection = sqlite3.connect(db)
dbcursor = dbconnection.cursor()
# intitialize the database, if needed
try:
dbcursor.execute("SELECT * FROM opml LIMIT 1")
tmp, = dbcursor.fetchone()
except Exception:
try:
initialize_db(dbcursor)
if verbosity:
print("Intitalized database 1")
except Exception:
if not quiet:
print("Intitalizing database failed 1")
exit(1)
if clearopml:
# clear the database cache completely and exit
dbcursor.execute("DELETE FROM opml")
dbcursor.execute("DELETE FROM status")
dbcursor.execute("DELETE FROM modified")
dbconnection.commit()
if verbosity:
print("OPML cleared from database cache")
dbcursor.close()
dbconnection.close()
exit(0)
# read the OPML from either the designated files or the database cache
opmltree = import_opml_files(importfiles, dbcursor)
# now that the OPML is guaranteed to be in the database, fetch it from there
try:
dbcursor.execute("SELECT * FROM opml LIMIT 1")
try:
tmp, = dbcursor.fetchone()
if verbosity:
print("OPML present in database")
except Exception:
if not quiet:
print("Specify an OPML file 1")
exit(3)
except Exception:
if not quiet:
print("Specify an OPML file 2")
exit(4)
if exportfile:
# only export the cached OPML file
if not quiet:
print(f"Exporting OPML to '{exportfile}'")
export_opml_to_file(dbcursor, exportfile)
exit(0)
elif outputfile:
# verify that the designated output HTML and CSS files can be written
if os.path.isdir(outputfile):
# check for location of output files before processing feeds
# first use default file name if only a directory was given
outputdirectory = re.sub('/+$', '', outputfile)
outputfile = outputdirectory + '/rrrrrr.html'
if not quiet:
print(f"Saving feed output to '{outputfile}'")
if not os.access(outputdirectory, os.W_OK):
stderr.write(outputdirectory + " is not writable 1\n")
exit(1)
if os.path.isfile(outputfile):
# if the file exists, make sure it is writable
if not os.access(outputfile, os.W_OK):
stderr.write(outputfile + " is not writable\n")
exit(1)
outputdirectory = getOutputDirectory(outputfile)
else:
# if it does not exist, make sure the directory is writable
outputdirectory = getOutputDirectory(outputfile)
if not os.access(outputdirectory, os.W_OK):
stderr.write(outputdirectory + " is not writable 2\n")
exit(1)
cssoutputfile = CSSOutputFile(outputdirectory)
else:
# default to the path designated in an environment variable
outputdirectory = os.environ.get("XDG_RUNTIME_DIR")
if verbosity > 1:
print(f" saving to {outputdirectory}")
if not outputdirectory is None:
if not os.path.isdir(outputdirectory):
if not quiet:
stderr.write(outputdirectory + " is not a directory\n")
exit(1);
else:
if (outputfile is None):
try:
outputdirectory = os.getcwd()
except Exception:
outputdirectory = '.'
outputdirectory = re.sub('/+$', '', outputdirectory)
# calculate CSS and HTML file names including paths
outputfile = outputdirectory + '/rrrrrr.html'
cssoutputfile = CSSOutputFile(outputdirectory)
if not quiet and not stdout:
stderr.write(f"Saving to default location: {outputfile}\n")
dbcursor.close() # Explicitly close the cursor
dbconnection.close()
if outputfile:
# write eventual results to the designated file or to stdout
# accept feed items from this date onwards
oktime = initialize_date(startdate)
# retrieve feeds from database, and then process them
feeds = fetch_tree(oktime,exportlog)
if verbosity:
print(f"Saving feed output")
if stdout:
# write to stdout, not a file
if verbosity:
print(f"Sending feed output to stdout")
if not citationformat:
# convert bastardized OPML to HTML
xhtml = xml_to_html(feeds)
print(xhtml)
else:
# use the citation format instead
xhtml = xml_to_citation(feeds)
print(xhtml)
else:
# write to a file, not stdout
if not citationformat:
# convert bastardized OPML to HTML
xhtml = xml_to_html(feeds)
with open(outputfile, 'w') as out:
out.write(xhtml)
else:
# use the citation format instead
xhtml = xml_to_citation(feeds)
with open(outputfile, 'w') as out:
out.write(xhtml)
# re-open the database and designate a cursor
dbconnection = sqlite3.connect(db)
dbcursor = dbconnection.cursor()
# remove old feeds from db if not in the current / cached OPML file
cull_database(dbcursor)
dbcursor.close()
dbconnection.close()
exit(0)
Links/release-notes-0.8
It is possible to upgrade in-place to 0.8 from 0.6 or 0.7. 0) Upgrade Prerequisite: batched() and chain() from itertools are hard dependences. But that version of itertools is *only* part of Python 3.12 or later. Verify with the following. Success means that 0.8 can run. echo -e "import itertools\nitertools.batched\n" | python3 Thus the new version of RRRRRR is not available for Debian bookworm. 1) add two fields to status table after backing up the database: cp -p ~/.cache/rrrrrr/status.sqlite3 \ ~/.cache/rrrrrr/status.sqlite3.orig echo 'ALTER TABLE status ADD keep INTEGER DEFAULT 1;' \ | sqlite3 ~/.cache/rrrrrr/status.sqlite3 echo 'ALTER TABLE status ADD active INTEGER DEFAULT 1;' \ | sqlite3 ~/.cache/rrrrrr/status.sqlite3 2) update CSS file: ./rrrrrr.py --css > /var/run/user/$(id --user)/rrrrrr.css --- Changes since 0.7: * further standardization of how dates are handled and displayed, especially last modified and last visited and last successfull load * updated CSS, trying to reduce cognitive load * added indicators for feeds which have not been modified in a very long time or that have no recent entries for a very long time * add warning color in CSS for any feeds with HTTP response 429 Too Many Requests. otherwise, still treat 429 as TTL * added partial recognition of and support for reading Cache-Control headers * no need to re-try URLs when a TLS Error is returned * preliminary support for internally marking feeds in the db as inactive to skip them withtout actually deleting them from the db * rename some of the lesser used run-time options for argparse * remove --appendopml option * remove unnused modules and functions
Links/rrrrrr.README
This Python3 script is distributed by Bytes Media UK
under the Affero General Public License (AGPL) version 3.
It is still in rather early stages and may change a bit.
Output currently defaults to what is specified by the environment
variable XDG_RUNTIME_DIR if it is available. The output can
be redirected to another file with --output or to stdout with
the --stdout option if the output is to be captured using a
redirection. In order to initialize the script, export its CSS
rules to a file, then load OPML data, then read the result using
a web browser:
./rrrrrr.py feeds.opml
firefox ${XDG_RUNTIME_DIR}/rrrrrr.html
A matching CSS file is also generated there on first run. The
script's tracking of each feed is kept in an SQLite3 database
in ${HOME}/.config/rrrrrr.sqlite3 by default.
Thereafter the script can be run without specifying a data
file and it will use the OPML data from its cache.
./rrrrrr.py
firefox ${XDG_RUNTIME_DIR}/rrrrrr.html
When loading a new OPML file, the default action is to use the
new feeds from the new file, but keep retain the old records in the
state tables when an entry already exists for a given feed. The
state table can be cleared with --clear or overwritten with --force.
The browser itself will track whether or not a link has been
visited or not.
The script will skip feeds which have not changed since the last pass
by tracking the ETag and Last-Modified headers in the HTTP response.
The idea is for one to make one complete pass through the resulting HTML
file in a single pass when reading the feeds. That is inspired by the
time management principle of processing any given document or task once
and only once if possible. Furthermore, reloading the feeds more than
once a day is generally fruitless.
See the --help option for more details.
RRRRRR dependencies on Devuan:
python3-lxml
python3-dateparser
python3-feedparser
Bug reports welcome.
Feature requests will at least be listened to. ;)
Links/daily-supplementary.feeds
# keep up to date in Git! https://www.gamingonlinux.com/article_rss.php https://opensource.com/feed # blocked by js : https://developers.redhat.com/blog/feed/ https://opensourcesecurity.io/blog/feed https://www.redhat.com/en/rss/blog https://blog.mozilla.org/feed/ https://news.opensuse.org/feed http://insights.ubuntu.com/feed http://linuxgizmos.com/feed https://puri.sm/feed/ https://kubernetes.io/feed.xml https://www.archlinux.org/feeds/news http://feeds.feedburner.com/LnuxTech-lb # http://feeds.feedburner.com/tecmint http://feeds.feedburner.com/Ubuntubuzz https://vitux.com/feed https://www.fossmint.com/rss http://www.linuxbuzz.com/rss https://linuxhandbook.com/rss https://www.rosehosting.com/blog/feed/ http://www.linuxtechi.com/feed/ https://www.tecmint.com/feed/ https://www.unixmen.com/feed https://feeds.feedburner.com/Ostechnix https://www.linuxandubuntu.com/feed https://www.linuxcloudvps.com/blog/feed
Links/tr-merge-daily-links.sh
#!/bin/sh
PATH=/usr/local/bin:/usr/bin:/bin
# see Git
set -evx
closure() {
test -d ${tmpdir} || exit 1
echo "Erasing temporary directory (${tmpdir}) and its files."
rm -f ${tmpdir}/feed-tmp.*
rmdir ${tmpdir}
}
cancel() {
echo "Cancelled."
closure
exit 2
}
# trap various signals to be able to erase temporary files
trap "cancel" 1 2 15
d=$(date +"%F");
read -t 120 -p "Enter a date or press return for $d: " dt;
linkshome="/home/links"
feeds=${linkshome}/Links/daily.feeds
export PERL5LIB=${linkshome}/lib/
# cd ${HOME}/Git/tr-git/Links/; git pull; cd -
# update perl libraries from Git
git --no-pager --git-dir /home/git/techrights.org.git/ \
show master:Links/lib/Links/MetaData.pm \
> ${PERL5LIB}/Links/MetaData.pm
git --no-pager --git-dir /home/git/techrights.org.git/ \
show master:Links/lib/Links/SpamSites.pm \
> ${PERL5LIB}/Links/SpamSites.pm
git --no-pager --git-dir /home/git/techrights.org.git/ \
show master:Links/daily.feeds \
> ${feeds}
if [ -n ${dt} ]; then
dt=${dt:-$d};
d=$(date -d ${dt} +"%F") || exit 1;
echo ${d};
fi;
datepath=$(date -d ${d} +"m%Y-%m")
linksdir="${linkshome}/Links/${datepath}/"
mergedfile="${linkshome}/Links/${datepath}/${d}-merged.html"
srcfile="${linkshome}/Links/tmp/${d}.html"
automatedfile="${linkshome}/Links/tmp/${d}-automated.html"
otherlinks="${linkshome}/Links/tmp/other-links-${d}.txt"
if ! test -e ${dir}; then
if ! mkdir -p ${dir}; then
echo "problem making or finding'${dir}'"
exit 1
fi
fi
# verify camelCase variants for all URL-generated "tags" in manual file
tr-links-check-camelcase.pl ${srcfile} || exit 1
# validate XHTML in the manual file
echo "Checking for '$srcfile'"
test -e $file || exit 1;
tidy -errors -quiet -xml ${srcfile} || exit 1;
echo "Ok";
echo "Checking if way is clear for new '${mergedfile}'"
test -e ${mergedfile} && exit 1;
echo "Ok";
umask 027
tmpdir=$(mktemp -d /tmp/feeds-tmp.XXXXXX)
tmpfile=$(mktemp -p ${tmpdir} feed-tmp.XXXXXXX)
# remove empty nodes from the manually collected links
# and generate a table of contents
tr-links-cull-empty.pl ${srcfile} > ${tmpfile}
# do TOC separately in case links-cull-empty.pl fails
test -d ${linksdir} || mkdir ${linksdir}
cat ${tmpfile} | tr-links-toc.pl > ${mergedfile}
rm ${tmpfile}
echo
start=$(date -d "$d yesterday" +"%F")
echo "Loading automated feeds"
while read feed; do
tmpfile=$(mktemp -p ${tmpdir} feed-tmp.XXXXXXX)
tr-rss-since-scraper.pl -d $start -o ${tmpfile} ${feed} &
done <<EOF
$(grep -E -v '^#|^$' ${feeds})
EOF
wait
echo "Done waiting"
# echo "T=${tmpdir}"
# concatenate the results of all the feeds
cat ${tmpdir}/feed-tmp.* > ${automatedfile}
# clear signal trapping
trap - 1 2 15
# remove temporary files
closure
cat ${automatedfile} >> ${mergedfile}
dl=$(date -d "${d} last month" +"m%Y-%m")
dn=$(date -d "${d}" +"m%Y-%m")
p="/home/links/Links"
# check this month and last month for duplicates, remove those found
tr-links-de-duplicate.pl -w ${mergedfile}
chmod 644 ${mergedfile}
dir="/home/links/Links/${datepath}/"
if test -e ${otherlinks}; then
chmod 644 ${otherlinks}
cp -p ${otherlinks} $dir && rm ${otherlinks}
fi
# insert citations formatted for social control media
# links-interleave-social-control-media.pl -w ${mergedfile}
exit 0
Links/lib/Links/.directory-listing-ok
Links/lib/Links/MetaData.pm
package MetaData 0.1;
use utf8;
use parent qw(Exporter);
use strict;
use warnings;
use feature qw(state);
our @EXPORT = qw(camelCase cleanQuery);
# 2021-01-24
# convert "tag" to camelCase
# updated: see Git history at Techrights.org (HTTP/S) or gemini://gemini.techrights.org
state %siteLookup = (
"tilde.town" => "",
"washbear.neocities.org" => "",
"neko314.hatenablog.com" => "ねこものがたり",
"xn--gckvb8fzb.com" => "マリウス",
"blog.douchi.space" => "椒盐豆豉",
"00f.net" => "00f",
"0x19.org" => "binrc",
"0x19.co" => "0x19",
"0x65.dev" => "0x65",
"100daystooffload.com" => "100 Days To Offload",
"100r.co" => "Hundred Rabbits",
"www.11ty.dev" => "11ty",
"12daysofweb.dev" => "12 Days of Web",
"1517.substack.com" => "1517 Fund",
"blog.1password.com" => "1Password",
"2.5admins.com" => "2.5 Admins",
"2600.com" => "2600",
"2022.internethealthreport.org" => "Mozilla",
"32bit.cafe" => "32-Bit Cafe",
"37signals.com" => "37signals LLC",
"www.404media.co" => "404 Media",
"82mhz.net" => "Andreas",
"8billiontrees.com" => "8 Billion Trees",
"world.hey.com" => "37signals LLC",
"www.2600.com" => "2600",
"www.nokiamobilephonenews.co.uk" => "2S Media",
"www.2-spyware.com" => "2spyware",
"3dprintingindustry.com" => "3D Printing Industry",
"www.3dprintingmedia.network" => "3D Printing Media Network",
"itwont.work" => "3A29",
"www.3dsourced.com" => "3DSourced",
"4mlinux.blogspot.com" => "4M Linux",
"www.channelnews.com.au" => "4Square Media Pty Ltd",
"4state.news" => "4StateNews",
"7news.com.au" => "7NEWS",
"celebrity.nine.com.au" => "9Celebrity",
"9elements.com" => "9Elements GmbH",
"www.9news.com.au" => "9NEWS",
"9to5google.com" => "9to5Google",
"9to5linux.com" => "9to5Linux",
"99percentinvisible.org" => "99% Invisible",
"www.majorcadailybulletin.com" => "Majorca, Spain",
"major.io" => "Major Hayden",
"archlinux.org" => "ArchLinux",
"bbs.archlinux.org" => "ArchLinux",
"ubuntustudio.org" => "Ubuntu Studio",
"dissociatedpress.net" => "Joe Brockmeier",
"www.kitguru.net" => "KitGuru",
"rockylinux.org" => "Rocky Linux",
"rmi.org" => "Rocky Mountain Institute",
"arstechnica.com" => "Ars Technica",
"rtfm.co.ua" => "Arseny",
"blog.remirepo.net" => "Remi Collet",
"www.motherjones.com" => "Mother Jones",
"motherduck.com" => "MotherDuck",
"www.mother.ly" => "Motherly Inc",
"fossweekly.beehiiv.com" => "FOSS Weekly",
"informatique-libre.be" => "Sébastien Wilmet",
"sparkylinux.org" => "Sparky GNU/Linux",
"feaneron.com" => "Georges Basile Stavracas Neto",
"blog.thefinalzone.net" => "Luya Tshimbalanga",
"librearts.org" => "Libre Arts",
"librewolf.net" => "LibreWolf",
"learnubuntu.com" => "Learn Ubuntu",
"mauikit.org" => "MauiKit",
"guyabel.com" => "Guy Abel",
"www.eyrie.org" => "Russ Allbery",
"research.swtch.com" => "Russ Cox",
"russ.garrett.co.uk" => "Russ Garrett",
"tube.kockatoo.org" => "KDE Videos",
"blog.urukproject.org" => "The Uruk Project Blog",
"lists.fedoraproject.org" => "Fedora",
"ubports.com" => "UBports",
"www.montanalinux.org" => "Montana Linux",
"www.gadgetbridge.com" => "Gadget Bridge",
"nokiapoweruser.com" => "Nokia Power User",
"paulmck.livejournal.com" => "Paul E. McKenney",
"linux.slashdot.org" => "Slashdot",
"www.fosslinux.com" => "FOSSLinux",
"linuxconfig.org" => "LinuxConfig",
"www.linuxbuzz.com" => "Linux Buzz",
"thelinuxexp.com" => "The Linux Experiment",
"dwaves.de" => "dwaves.de",
"news.netcraft.com" => "Netcraft",
"www.netcraft.com" => "Netcraft",
"www.rosehosting.com" => "RoseHosting",
"linuxize.com" => "Linuxize",
"www.tuxmachines.org" => "Tux Machines",
"www.in-ulm.de" => "Ulm und Neu-Ulm eV",
"neuroblog.fedoraproject.org" => "NeuroFedora",
"www.gnunet.org" => "GNUnet",
"www.gnupg.org" => "The GNU Privacy Guard",
"containerjournal.com" => "Container Journal",
"winbuzzer.com" => "WinBuzzer",
"pxlnv.com" => "Nick Heer",
"nhigham.com" => "Nick Higham",
"egoslike.us" => "Nick Holland",
"holland-consulting.net" => "Nick Holland",
"itsubuntu.com" => "It's Ubuntu",
"pimylifeup.com" => "Pi My Life Up",
"nexy.blog" => "Nex",
"nextgentips.com" => "NextGenTips",
"kde.org" => "KDE",
"genode.org" => "Genode",
"open-web-advocacy.org" => "Open Web Advocacy",
"www.openfest.org" => "OpenFest",
"en.opensuse.org" => "OpenSUSE",
"news.opensuse.org" => "OpenSUSE",
"phoboslab.org" => "Dominic Szablewski",
"dominickjay.com" => "Dominick Jay",
"dtornow.substack.com" => "Dominik Tornow",
"dominique.leuenberger.net" => "Dominique Leuenberger",
"www.collaboraoffice.com" => "Collabora",
"collabfund.com" => "Collaborative Fund Management LLC",
"www.project-disco.org" => "CCIA",
"kifarunix.com" => "Kifarunix",
"feed.jupiter.zone" => "JupiterMedia",
"linuxstans.com" => "LinuxStans",
"fex-emu.com" => "FEX",
"cpldcpu.com" => "Tim's Blog",
"tim.siosm.fr" => "Timothée Ravier",
"en.euro-linux.com" => "EuroLinux",
"insidehpc.com" => "insideHPC",
"utkarsh2102.com" => "Utkarsh Gupta",
"ubuntu-news.org" => "Ubuntu News",
"fridge.ubuntu.com" => "Ubuntu Fridge",
"ubuntuforums.org" => "Ubuntu Forums",
"apachelog.wordpress.com" => "Harald Sitter",
"www.pentestpartners.com" => "Pen Test Partners",
"www.pcquest.com" => "PCQuest",
"patentblog.kluweriplaw.com" => "Kluwer Patent Blog",
"www.juve-patent.com" => "JUVE",
"patentlyo.com" => "Dennis Crouch/Patently-O",
"flightaware.com" => "FlightAware",
"flutterfoundation.dev" => "Flock",
"flohgro.com" => "Floh Gro",
"f5n.org" => "Florian Anderiasch",
"www.fosspatents.com" => "Florian Müller",
"sha256.net" => "Florian Obser",
"tlakh.xyz" => "Florian Obser",
"linuxnightly.com" => "Linux Nightly",
"people.skolelinux.org" => "Petter Reinholdtsen",
"www.livescience.com" => "Live Science",
"koutoupis.com" => "Petros Koutoupis",
"spaceref.com" => "SpaceRef",
"www.clickorlando.com" => "Click Orlando",
"www.fortra.com" => "Fortra LLC",
"fortune.com" => "Fortune",
"www.tipsonunix.com" => "Tips On UNIX",
"www.gimp.org" => "GNU Image Manipulation Program (GIMP)",
"randomnerdtutorials.com" => "Random Nerd Tutorials",
"blog.randomoracle.io" => "Random Oracle",
"randomoracle.wordpress.com" => "Random Oracle",
"blog.passwordclass.xyz" => "RandomNixFix",
"raphaelhertzog.com" => "Raphaël Hertzog",
"www.rapid7.com" => "Rapid7 LLC",
"www.reallinuxuser.com" => "Real Linux User",
"blog.iconfactory.com" => "The Iconfactory",
"fex-emu.org" => "FEX",
"mintcast.org" => "mintCast Podcast",
"www.os2museum.com" => "OS/2 Museum",
"osinter.dk" => "OSINTer Blog",
"ostechnix.com" => "OSTechNix",
"peppe8o.com" => "peppe8o",
"blog.simos.info" => "Simos Xenitellis",
"thecyberwire.com" => "The Cyber Wire",
"patch.com" => "Patch",
"newsupdate.uk" => "News Update",
"mightygadget.co.uk" => "Mighty Gadget",
"www.winehq.org" => "WINE Project (Official)",
"nairobiwire.com" => "Nairobi Wire Media",
"blog.namangoel.com" => "Naman Goel",
"prose.nsood.in" => "Naman Sood",
"nmn.gl" => "Namanyay Goel",
"nate.mecca1.net" => "Nate",
"pointieststick.com" => "Nate Graham",
"www.volkerkrause.eu" => "Volker Krause",
"maximullaris.com" => "Volodymyr Gubarkov",
"voltrondata.com" => "Voltron Data",
"bower.sh" => "Eric Bower",
"erock.io" => "Eric Bower",
"intel471.com" => "Intel 471",
"internetfreedom.in" => "Internet Freedom Foundation",
"www.isc.org" => "Internet Systems Consortium",
"blogs.coreboot.org" => "Coreboot (Official)",
"techhq.com" => "TechHQ",
"techjury.net" => "TechJury",
"technologizer.com" => "Technologizer",
"tmb.apaopen.org" => "Technology, Mind, and Behavior",
"www.technologynetworks.com" => "Technology Networks",
"www.datamation.com" => "TechnologyAdvice",
"www.moneycontrol.com" => "MoneyControl",
"blogs.embarcadero.com" => "Embarcadero Inc",
"embeddedartistry.com" => "Embedded Artistry LLC",
"www.embedded.com" => "Embedded.com",
"content.dictionary.com" => "Dictionary.com LLC",
"www.dignited.com" => "Dignited",
"gnuworldorder.info" => "GNU World Order (Audio Show)",
"www.datasciencecentral.com" => "Tech Target Inc",
"techtea.io" => "TechTea",
"www.atechtown.com" => "Techtown",
"www.hecticgeek.com" => "Hectic Geek",
"www.openmandriva.org" => "OpenMandriva News",
"debugpointnews.com" => "DebugPoint",
"lpc.events" => "Linux Plumbers Conference (LPC)",
"www.lpi.org" => "Linux Professional Institute Inc",
"www.if-not-true-then-false.com" => "If Not True Then False",
"www.ifixit.com" => "iFixit",
"www.theserverside.com" => "The Server Side",
"4mlinux-releases.blogspot.com" => "4MLinux Blog",
"ipkitten.blogspot.com" => "IP Kat",
"www.unifiedpatents.com" => "Unified Patents",
"thettablog.blogspot.com" => "TTAB Blog",
"www.linuxtechi.com" => "LinuxTechi",
"www.linuxtuto.com" => "LinuxTuto",
"owlhowto.com" => "Own HowTo",
"blog.jabberhead.tk" => "Paul Schaub",
"mschlander.wordpress.com" => "The Blog is Hot",
"diffoscope.org" => "Diffoscope",
"lhspodcast.info" => "Linux in the Ham Shack",
"www.omglinux.com" => "OMG! Linux",
"kubernetes.io" => "Kubernetes Blog",
"lists.freedesktop.org" => "Free Desktop",
"freedos.org" => "FreeDOS",
"www.freedos.org" => "FreeDOS",
"store.steampowered.com" => "Steam",
"9to5mac.com" => "9to5Mac",
"www.a10networks.com" => "A10 Networks, Inc",
"aag-it.com" => "AAG",
"www.aarp.org" => "AARP",
"advances.sciencemag.org" => "AAAS",
"eurekalert.org" => "AAAS",
"science.sciencemag.org" => "AAAS",
"www.eurekalert.org" => "AAAS",
"www.sciencemag.org" => "AAAS",
"www.science.org" => "AAAS",
"blog.8bit.lol" => "Aadi Desai",
"cwa.omg.lol" => "Aaron Aiken",
"if50.substack.com" => "Aaron A Reed",
"www.brethorsting.com" => "Aaron Brethorst",
"redsymbol.net" => "Aaron Maxwell",
"aaronparecki.com" => "Aaron Parecki",
"lofi.limo" => "Aaron Parks",
"www.publicnotice.co" => "Aaron Rupar",
"www.aaronswartzday.org" => "Aaron Swartz Day",
"aatango.codeberg.page" => "Aatango",
"www.abareplace.com" => "Aba Search and Replace",
"www.abajournal.com" => "ABAJournal",
"6abc.com" => "ABC",
"abc7.com" => "ABC",
"abc7chicago.com" => "ABC",
"abc7news.com" => "ABC",
"abc7ny.com" => "ABC",
"abc11.com" => "ABC",
"abc13.com" => "ABC",
"abc17news.com" => "ABC",
"abc30.com" => "ABC",
"abcnews.go.com" => "ABC",
"abcnews4.com" => "ABC",
"newschannel9.com" => "ABC",
"www.abc27.com" => "ABC",
"www.klkntv.com" => "ABC",
"www.wkbw.com" => "ABC",
"www.finanznachrichten.de" => "ABC New Media AG",
"tuxdigital.com" => "Tux Digital",
"trendoceans.com" => "Trend Oceans",
"www.netfilter.org" => "Linux",
"www.linux.org" => "Linux.org",
"www.linuxcapable.com" => "Linux Capable",
"www.unix.dog" => "UNIX.Dog",
"drsaracco.wordpress.com" => "UNIX Log",
"unixdigest.com" => "UNIXdigest",
"unixcop.com" => "UNIX Cop",
"blog.irvingwb.com" => "IBM Old Timer",
"fivethirtyeight.com" => "ABC",
"kvia.com" => "ABC",
"projects.fivethirtyeight.com" => "ABC",
"www.abc12.com" => "ABC",
"www.abc15.com" => "ABC",
"www.abcactionnews.com" => "ABC",
"www.abc.net.au" => "ABC",
"www.denver7.com" => "ABC",
"www.news5cleveland.com" => "ABC",
"www.abetterinternet.org" => "ABetterInternet",
"abner.page" => "Abner Coimbre",
"aboutbsd.net" => "About BSD",
"www.aboutchromebooks.com" => "AboutChromebooks",
"aboutfeeds.com" => "AboutFeeds",
"aboutsignal.com" => "AboutSignal",
"www.seuros.com" => "Abdelkader Boudih",
"awjunaid.com" => "Abdul Wahad Junaid",
"www.abefehr.com" => "Abe Fehr",
"toroid.org" => "Abhijit Menon-Sen",
"www.abhinavomprakash.com" => "Abhinav Omprakash",
"www.akpain.net" => "Abigail Pain",
"abhinavsarkar.net" => "Abhinav Sarkar",
"blog.codingconfessions.com" => "Abhinav Upadhyay",
"codeconfessions.substack.com" => "Abhinav Upadhyay",
"notes.abhinavsarkar.net" => "Abhinav Sarkar",
"abilitymagazine.com" => "Ability Magzine",
"blog.meain.io" => "Abin Simon",
"arkoinad.com" => "Abhinav Gopalakrishnan",
"abishekmuthian.com" => "Abishek Muthian",
"news.abplive.com" => "ABP",
"abseil.io" => "Abseil",
"blog.absurdpirate.com" => "Absurd Pirate",
"www.access-info.org" => "Access Info Europe",
"www.acquired.fm" => "ACQ LLC",
"accessipos.com" => "Access IPOs",
"www.accessnow.org" => "AccessNow",
"www.activesustainability.com" => "Acciona S A",
"www.acjps.org" => "ACJPS",
"www.aclumich.org" => "ACLU",
"www.aclu-ky.org" => "ACLU",
"www.aclu.org" => "ACLU",
"awards.acm.org" => "ACM",
"cacm.acm.org" => "ACM",
"dl.acm.org" => "ACM",
"learning.acm.org" => "ACM",
"queue.acm.org" => "ACM",
"www.acm.org" => "ACM",
"www.sigops.org" => "ACM",
"2025.jcdl.org" => "ACM/IEEE Joint Conference on Digital Libraries",
"acn.lol" => "ACN",
"activitypub.blog" => "ActivityPub for WordPress",
"www.adbusters.org" => "Ad Busters Magazine",
"www.adexchanger.com" => "AdExchanger",
"blog.adacore.com" => "AdaCore",
"www.adacore.com" => "AdaCore",
"blog.adacore.com" => "AdaCore",
"www.adafruitdaily.com" => "Adafruit",
"adafruit-playground.com" => "Adafruit",
"blog.adafruit.com" => "Adafruit",
"learn.adafruit.com" => "Adafruit",
"www.adafruit.com" => "Adafruit",
"aaronson.org" => "Adam Aaronson",
"data4democracy.substack.com" => "Adam Bonica",
"adamfortuna.com" => "Adam Fortuna",
"adamj.eu" => "Adam Johnson",
"www.imperialviolet.org" => "Adam Langley",
"admccartney.mur.at" => "Adam McCartney",
"maxamillion.sh" => "Adam Miller",
"notes.neatnik.net" => "Adam Newbold",
"lubieniebieski.pl" => "Adam Nowak",
"blog.adamretter.org.uk" => "Adam Retter",
"www.rabbitfarm.com" => "Adam Russell",
"adamsilver.io" => "Adam Silver",
"www.adamsmith.org" => "Adam Smith",
"archaeologist.dev" => "Adam Thalhammer",
"adam.younglogic.com/" => "Adam Young",
"www.adamsdesk.com" => "Adamsdesk",
"addxorrol.blogspot.com" => "ADD / XOR / ROL",
"www.addictivetips.com" => "AddictiveTips",
"addisoncrump.info" => "Addison Crump",
"addyosmani.com" => "Addy Osmani",
"indaily.com.au" => "Adelaide",
"adele.pages.casa" => "Adële",
"uxpioneers.com" => "Adlin Inc",
"blog.adnansiddiqi.me" => "Adnan Siddiqi",
"ochagavia.nl" => "Adolfo Ochagavía",
"www.readtheline.ca" => "The Line",
"www.linuxinsider.com" => "LinuxInsider",
"www.laprensalatina.com" => "La Prensa Latina",
"www.laprensani.com" => "La Prensa",
"www.plenglish.com" => "La Prensa Latina",
"www.youtube.com" => "YouTube",
"www.thisiscolossal.com" => "Colossal",
"www.collabora.com" => "Collabora",
"www.sitepoint.com" => "SitePoint",
"knro.blogspot.com" => "KStar Development",
"kdenlive.org" => "Kdenlive",
"dot.kde.org" => "KDE Official",
"www.electropages.com" => "Electropages",
"technative.io" => "TechNative",
"blog.opensource.org" => "OSI Blog",
"www.figuiere.net" => "Hubert Figuière",
"www.southgatearc.org" => "Southgate",
"adtmag.com" => "ADTmag",
"www.rumble.run" => "Rumble Inc",
"blog.rust-lang.org" => "Rust Blog",
"initialcommit.com" => "Initial Commit",
"insideclimatenews.org" => "Inside Climate News",
"cultureofconsumerism.com" => "Inside Political Science",
"www.insideradio.com" => "Inside Radio",
"insidetowers.com" => "Inside Towers",
"www.markaicode.com" => "markaicode by Mark",
"www.influxdata.com" => "InfluxData Inc",
"www.telecoms.com" => "Informa PLC",
"www.informationweek.com" => "InformationWeek",
"fictiontalk.com" => "Fiction Talk",
"www.fiercevideo.com" => "Fierce Video",
"baronhk.wordpress.com" => "DaemonFC (Ryan Farmer)",
"www.slashgear.com" => "SlashGear",
"www.ubuntubuzz.com" => "Ade Malsasa Akbar",
"www.tecmint.com" => "TecMint",
"atechtown.com" => "Techtown",
"www.techrepublic.com" => "Tech Republic",
"www.kdab.com" => "KDAB",
"almalinux.org" => "AlmaLinux Official",
"lubuntu.me" => "Lubuntu",
"www.tuxedocomputers.com" => "TUXEDO Computers GmbH",
"tuxphones.com" => "TuxPhones",
"linuxsecurity.com" => "LinuxSecurity",
"www.bsdnow.tv" => "The BSD Now Podcast",
"www.tlltsarchive.org" => "The TLLTS Podcast",
"linuxopsys.com" => "LinuxOpSys",
"www.scummvm.org" => "ScummVM",
"linuxtechlab.com" => "LinuxTechLab",
"www.pclinuxos.com" => "PCLOS Official",
"www.the-diy-life.com" => "The DIY Life",
"this-week-in-rust.org" => "Rust Weekly Updates",
"www.cloudbooklet.com" => "Cloudbooklet",
"www.debugpoint.com" => "DebugPoint",
"linuxhostsupport.com" => "Linux Host Support",
"www.linuxcloudvps.com" => "Linux Cloud VPS",
"uapi-group.org" => "Linux Userspace API (UAPI) Group",
"9to5toys.com" => "9 to 5 Toys",
"www.suse.com" => "SUSE's Corporate Blog",
"www.toolbox.com" => "Toolbox",
"margin.re" => "Margin Research",
"memex.marginalia.nu" => "Marginalia",
"www.themarginalian.org" => "The Marginalian",
"blog.ploeh.dk" => "Mark Seeman",
"www.marketscreener.com" => "Market Screener",
"htmhell.dev" => "Markup from Hell",
"mhatta.substack.com" => "Masayuki Hatta",
"mhatta.medium.com" => "Masayuki Hatta",
"maskray.me" => "MaskRay",
"www.sammobile.com" => "SamMobile",
"fudzilla.com" => "FUDZilla",
"informationsecuritybuzz.com" => "Information Security Buzz",
"www.bankinfosecurity.com" => "Information Security Media Group, Corporation",
"www.spiceworks.com" => "Ziff Davis",
"zipcodefirst.com" => "Zip Code First",
"www.zdnet.com" => "ZDNet",
"www.faqforge.com" => "FAQForge",
"arcadeblogger.com" => "The Arcade Blogger",
"arcan-fe.com" => "Arcan",
"www.newhamrecorder.co.uk" => "Archant Community Media Ltd",
"arcolinux.com" => "Arco Linux",
"dev.arie.bovenberg.net" => "Arie Bovenberg",
"arpitbhayani.me" => "Arpit Bhayani",
"www.artnews.com" => "Art Media LLC",
"www.theartnewspaper.com" => "The Art Newspaper",
"artemis.sh" => "Artemiseverfree",
"quuxplusone.github.io" => "Arthur O'Dwyer",
"forum.artixlinux.org" => "Artix Linux Forum",
"news.artnet.com" => "Artnet Worldwide Corporation",
"aartaka.me" => "Artyom Bologov",
"and.aartaka.me" => "Artyom Bologov",
"en.as.com" => "AS",
"about.ascension.org" => "Ascension",
"podcast.asknoahshow.com" => "The Ask Noah Show",
"labnotes.org" => "Assaf Arkin",
"tecadmin.net" => "TecAdmin",
"www.bustle.com" => "BDG",
"www.inverse.com" => "BDG",
"bytecellar.com" => "Byte Cellar",
"bytexd.com" => "ByteXD",
"www.linuxshelltips.com" => "Linux Shell Tips",
"linuxbuz.com" => "LinuxBuz",
"blog.ipfire.org" => "IPFire Official Blog",
"communityblog.fedoraproject.org" => "Fedora Project",
"fedoraproject.org" => "Fedora Project",
"opensource.com" => "OpenSource.com",
"developers.redhat.com" => "Red Hat",
"blog.drogue.io" => "Red Hat",
"www.gadgets360.com" => "Red Pixels Ventures Ltd",
"redis.io" => "Redis",
"rednafi.com" => "Redowan Delowar",
"etbe.coker.com.au" => "Russell Coker",
"www.sevarg.net" => "Russell Graves",
"blogs.fsfe.org" => "FSFE",
"fsfe.org" => "FSFE",
"www.fosslife.org" => "FOSSLife",
"hub.fosstodon.org" => "The Fosstodon Hub",
"openssf.org" => "OpenSSF (Linux Foundation)",
"openjsf.org" => "OpenJS Foundation (Linux Foundation)",
"linuxformat.com" => "Linux Format Magazine",
"events.linuxfoundation.org" => "Linux Foundation",
"servo.org" => "Servo (Linux Foundation)",
"www.aswf.io" => "Linux Foundation",
"www.linux.com" => "Linux Foundation",
"www.r-consortium.org" => "Linux Foundation",
"www.linuxfoundation.org" => "Linux Foundation's Site/Blog",
"www.linuxfoundation.org" => "Linux Foundation's Site/Blog",
"linuxfoundation.org" => "Linux Foundation's Site/Blog",
"www.cncf.io" => "CNCF (Linux Foundation)",
"www.cf.org" => "CF.org",
"www.bleepingcomputer.com" => "Bleeping Computer",
"aaka.sh" => "Aakash Patel",
"aashvik.com" => "Aashvik",
"adf-magazine.com" => "ADF",
"www.adl.org" => "ADL",
"www.adminbyaccident.com" => "AdminByAccident",
"www.adn.com" => "ADN",
"euroquis.nl" => "Adriaan de Groot",
"alic.dev" => "Adrian Alic",
"www.holovaty.com" => "Adrian Holovaty",
"adrienplazas.com" => "Adrian Plazas",
"adriansieber.com" => "Adrian Sieber",
"www.adrianstoll.com" => "Adrian Stoll",
"adrianroselli.com" => "Adrian Roselli",
"blog.bithole.dev" => "Adrian Zhang",
"ariadnavigo.xyz" => "Adriadna Vigo",
"adriano.fyi" => "Adriano Caloiaro",
"aduros.com" => "Aduros",
"www.annarbor.com" => "Advance Local Media LLC",
"www.lonestarlive.com" => "Advance Local Media LLC",
"www.pennlive.com" => "Advance Local Media LLC",
"www.syracuse.com" => "Advance Local Media LLC",
"www.atsc.org" => "Advanced Television Systems Committee",
"advanced-television.com" => "AdvancedTelevision",
"adventofcode.com" => "AdventOfCode",
"www.wbiw.com" => "AdVenture Media",
"www.advrider.com" => "Adventure Rider",
"martypc.blogspot.com" => "Adventures in PC Emulation",
"www.advicegoddess.com" => "Advice Goddess",
"news.adobe.com" => "Adobe Inc",
"www.adweek.com" => "AdWeek",
"www.aei.org" => "AEI",
"www.economicliberties.us" => "AELP",
"www.windturbinestar.com" => "Aeolos Wind Energy Ltd",
"aeon.co" => "Aeon Media Group Ltd",
"areomagazine.com" => "Aero Magazine",
"aestheticsofphotography.com" => "Aesthetics of Photography",
"aethrvmn.gr" => "Aethrvmn",
"zone.dog" => "Aeva",
"unitedafa.org" => "AFA",
"www.afintl.com" => "Afghanistan International",
"afjc.media" => "Afghanistan Journalists Center",
"factcheck.afp.com" => "AFP",
"www.afp.com" => "AFP",
"afkgaming.com" => "AFK Gaming",
"www.afnic.fr" => "French Network Information Centre (Afnic)",
"www.afr.com" => "AFR",
"africacenter.org" => "Africa Center for Strategic Studies",
"africacheck.org" => "Africa Check",
"africahousingnews.com" => "Africa Housing News",
"www.africanews.com" => "Africa News",
"aftermath.site" => "Aftermath Site LLC",
"lists.ag-projects.com" => "AG Projects",
"agupubs.onlinelibrary.wiley.com" => "AGU",
"www.agweb.com" => "Ag Web",
"newsroom.heart.org" => "AHA",
"www.theahafoundation.org" => "AHA",
"healthjournalism.org" => "AHCJ",
"alfy.blog" => "Ahmad Alfy",
"ishadeed.com" => "Ahmad Shadeed",
"english.ahram.org.eg" => "Ahram Online",
"ahrefs.com" => "Ahrefs Pte Ltd",
"ahvalnews.com" => "Ahval",
"ai-2027.com" => "AI 2027",
"www.aitrends.com" => "AI Trends",
"www.aier.org" => "AIER",
"analyticsindiamag.com" => "AIM",
"aina.org" => "AINA",
"www.aina.org" => "AINA",
"artificialintelligence-news.com" => "AI News",
"aidancully.blogspot.com" => "Aidan Cully",
"howtodothingswithmemes.substack.com" => "Aidan Walker",
"aider.chat" => "Aider",
"aigarius.com" => "Aigars Mahinovs",
"www.airforcetimes.com" => "Air Force Times",
"airqualitynews.com" => "Air Quality News",
"blog.airsequel.com" => "Airsequel",
"aisle.com" => "Aisle",
"www.aithority.com" => "AIthority",
"aiven.io" => "Aiven",
"aj.bourg.family" => "AJ Bourg",
"www.andrewjvpowell.com" => "AJVP",
"www.akamai.com" => "Akamai",
"akselmo.dev" => "Akseli Lahtinen",
"www.akselmo.dev" => "Akseli Lahtinen",
"oppi.li" => "Akshay",
"peppe.rs" => "Akshay",
"www.al.com" => "Alabama",
"alabamareflector.com" => "Alabama Reflector",
"www.homeautomationguy.io" => "Alan Byrne",
"www.ajournalofmusicalthings.com" => "Alan Cross",
"www.labouseur.com" => "Alan G Labouseur",
"blog.ayjay.org" => "Alan Jacobs",
"alan.norbauer.com" => "Alan Norbauer",
"popey.com" => "Alan Pope",
"www.turing.ac.uk" => "The Alan Turing Institute",
"alaskabeacon.com" => "Alaska Beacon",
"bitsnpieces.dev" => "Alastair Roberts",
"www.alaraby.co.uk" => "Al Araby",
"www.albawaba.com" => "Al Bawaba",
"albertofortin.com" => "Alberto Fortin",
"threkk.medium.com" => "Alberto de Murga",
"www.thealgorithmicbridge.com" => "Alberto Romero",
"www.abqjournal.com" => "Albuquerque Journal",
"alchemists.io" => "Alchemists LLC",
"wiki.alcidesfonseca.com" => "Alcides Fonseca",
"alecmuffett.com" => "Alec Muffet",
"aplus.rs" => "Aleksandar Vacić",
"www.aleksandra.codes" => "Aleksandra Sikora",
"www.alternet.org" => "AlerNet",
"alediaferia.com" => "Alessandro Diaferia",
"apogliaghi.com" => "Alessandro Pogliaghi",
"aleteia.org" => "Aleteia",
"blog.apotenza.com" => "Alex",
"www.flu0r1ne.net" => "Alex",
"mango.pdf.zone" => "Alex",
"alexandmanu.com" => "Alex & Manu",
"alexalejandre.com" => "Alex Alejandre",
"alexba.in" => "Alex Bain",
"adjb.net" => "Alex Brown",
"alexcabal.com" => "Alex Cabal",
"alexwlchan.net" => "Alex Chan",
"alex.dzyoba.com" => "Alex Dzyoba",
"www.alexedwards.net" => "Alex Edwards",
"blog.alexellis.io" => "Alex Ellis",
"blog.alexewerlof.com" => "Alex Ewerlöf",
"alexgarcia.xyz" => "Alex Garcia",
"alexgaynor.net" => "Alex Gaynor",
"blog.alexgilleran.com" => "Alex Gilleran",
"blog.alexgleason.me" => "Alex Gleason",
"blog.infected.systems" => "Alex Haydock",
"alex.kleydints.com" => "Alex Kleydints",
"distantprovince.by" => "Alex Martsinovich",
"unplannedobsolescence.com" => "Alex Petros",
"mr-leshiy-blog.web.app" => "Alex Pozhylenkov",
"infrequently.org" => "Alex Russell",
"smallhacks.wordpress.com" => "Alex Samorukov",
"alexsirac.com" => "Alex Sirac",
"alexschroeder.ch" => "Alex Schroeder",
"alextheward.com" => "Alex Ward",
"moreati.org.uk" => "Alex Willmer",
"alexhwoods.com" => "Alex Woods",
"bluhm.genua.de" => "Alexander Bluhm",
"interfacecraft.online" => "Alexander Deplov",
"blog.aschoch.ch" => "Alexander Schoch",
"solovyov.net" => "Alexander Solovyov",
"alexwolfe.ca" => "Alexandra Wolfe",
"alexandrawolfe.ca" => "Alexandra Wolfe",
"alexink.micro.blog" => "Alexandra Wolfe",
"blog.lx.oliva.nom.br" => "Alexandre Oliva",
"xojoc.pw" => "Alexandru Cojocaru",
"alexn.org" => "Alexandru Nedelcu",
"scvalex.net" => "Alexandru Scvorțov",
"kb.databasedesignbook.com" => "Alexey Makhotkin",
"blog.cyrneko.eu" => "Alexia",
"www.algemeiner.com" => "Algemeiner",
"algorithmwatch.org" => "AlgorithmWatch",
"alice.boxhall.au" => "Alice Boxhall",
"blog.alicegoldfuss.com" => "Alice Goldfuss",
"hyti.org" => "Ali Reza Hayati",
"alirezahayati.com" => "Ali Reza Hayati",
"alavi.me" => "Ali Reza Hayati",
"purplesyringa.moe" => "Alisa Sireneva",
"www.aljazeera.com" => "Al Jazeera",
"alinpanaitiu.com" => "Alin Panaitiu",
"allafrica.com" => "All Africa",
"allea.org" => "All European Academies",
"www.gbnews.uk" => "All Perspectives Ltd",
"all-things-linux.blogspot.com" => "All Things Linux",
"www.allthingssecured.com" => "All Things Secured",
"allan.reyes.sh" => "Allan Reyes",
"www.notus.org" => "Allbritton Journalism Institute",
"www.allendowney.com" => "Allen Downey",
"allenpike.com" => "Allen Pike",
"browsergate.eu" => "Alliance for Digital Fairness eV",
"www.law.com" => "ALM",
"www.al-monitor.com" => "Al Monitor",
"alperenkeles.com" => "Alperen Keles",
"alpinelinux.org" => "Alpine Linux",
"wiki.alpinelinux.org" => "Alpine Linux",
"www.alpinelinux.org" => "Alpine Linux",
"alpr.watch" => "ALPR.watch",
"xenodium.com" => "Álvaro Ramírez",
"www.thetelegraph.com" => "Alton Telegraph",
"alvaromontoro.com" => "Alvaro Montoro",
"www.poeticoding.com" => "Alvise Susmel",
"rosenzweig.io" => "Alyssa Rosenzweig",
"amanhimself.dev" => "Aman Mittal",
"ambersettle.wordpress.com" => "Amber Settle",
"amberwilliams.io" => "Amber Williams",
"aws.amazon.com" => "Amazon Inc",
"community.aws" => "Amazon Inc",
"www.amazon.science" => "Amazon Inc",
"wattenberger.com" => "Amelia Wattenberger",
"help.aol.com" => "America Online",
"www.aol.com" => "America Online",
"www.americamagazine.org" => "America: The Jesuit Review",
"www.neurology.org" => "American Academy of Neurology",
"www.psychguides.com" => "American Addiction Centers Inc",
"americanaffairsjournal.org" => "American Affairs Journal",
"cen.acs.org" => "American Chemical Society",
"www.acsh.org" => "The American Council on Science and Health",
"americandialect.org" => "American Dialect Society",
"afsc.org" => "American Friends Service Committee",
"www.palladiummag.com" => "American Governance Foundation Inc",
"www.aha.org" => "American Hospital Association",
"acrl.ala.org" => "American Library Association",
"libguides.ala.org" => "American Library Association",
"www.ala.org" => "American Library Association",
"www.ams.org" => "American Mathematical Society",
"americanmilitarynews.com" => "American Military News",
"americanoversight.org" => "American Oversight",
"www.americanoversight.org" => "American Oversight",
"www.apa.org" => "American Psychological Association",
"www.americanrhetoric.com" => "American Rhetoric",
"www.americanrivers.org" => "American Rivers",
"www.americanthinker.com" => "American Thinker",
"www.amitgawande.com" => "Amit Gawande",
"www.amitgawande.com" => "Amit Gawande",
"www.redblobgames.com" => "Amit Patel",
"amiunique.org" => "AmIUnique",
"www.almasdarnews.com" => "AMN",
"www.amnestyusa.org" => "Amnesty International",
"amnesty.hosting.augure.com" => "Amnesty International",
"securitylab.amnesty.org" => "Amnesty International",
"www.amnesty.org" => "Amnesty International",
"amnesty.ca" => "Amnesty International",
"www.amnesty.org.uk" => "Amnesty International",
"media.amtrak.com" => "Amtrak",
"fasterthanli.me" => "Amos Wenger",
"cybercorsairs.com" => "Amply Insights LLC",
"blog.joinmeonmy.quest" => "Amras",
"amycastor.com" => "Amy Castor",
"www.electoralcommission.ie" => "An Coimisiún Toghcháin",
"www.inquiryintoislam.com" => "An Inquiry Into Islam",
"newsletter.anamariecox.com" => "Ana Marie Cox",
"ohhelloana.blog" => "Ana Rodrigues",
"www.anaconda.com" => "Anaconda Inc",
"analogoffice.net" => "Analog Office",
"www.anandtech.com" => "AnandTech",
"ananthakumaran.in" => "Anantha Kumaran",
"blog.anavi.technology" => "ANAVI",
"anchor.host" => "Anchor Hosting",
"blog.cyborch.com" => "Anders Borch",
"anderstrier.dk" => "Anders Trier",
"andrealmeid.com" => "André Almeida",
"machaddr.com" => "André Machado",
"machaddr.substack.com" => "André Machado",
"andreldm.com" => "André Miranda",
"staltz.com" => "André Staltz",
"gwtf.it" => "Andrea Contino",
"contino.com" => "Andrea Contino",
"www.andreinc.net" => "Andrei Ciobanu",
"www.technollama.co.uk" => "Andrés Guadamuz",
"andregarzia.com" => "Andre Alves Garzia",
"andre.arko.net" => "André Arko",
"abf.li" => "Andre Franca",
"afranca.com.br" => "Andre Franca",
"afhub.dev" => "Andre Franca",
"floooh.github.io" => "Andre Weissflog",
"andreinc.net" => "Andrei Nicolin Ciobanu",
"azmr.uk" => "Andrew",
"andrewblackman.net" => "Andrew Blackman",
"andrewkchan.dev" => "Andrew Chan",
"andrewdomain.com" => "Andrew Domain",
"www.andrewdoyle.org" => "Andrew Doyle",
"www.smokingonabike.com" => "Andrew Eikum",
"andrewkelley.me" => "Andrew Kelley",
"www.alilleybrinker.com" => "Andrew Lilley Brinker",
"marble.onl" => "Andrew Marble",
"andrewmurphy.io" => "Andrew Murphy",
"marble.onl" => "Andrew Marble",
"nesbitt.io" => "Andrew Nesbitt",
"hiandrewquinn.github.io" => "Andrew Quinn",
"andrewshell.org" => "Andrew Shell",
"sheep.horse" => "Andrew Stephens",
"andrewstiefel.com" => "Andrew Stiefel",
"andrej.sh" => "Andrej",
"thermalcircle.de" => "Andrej Stender",
"anagogistis.com" => "Andreas",
"blog.farre.se" => "Andreas Farre",
"andreasfertig.com" => "Andreas Fertig",
"beza1e1.tuxen.de" => "Andreas Zwinkau",
"blog.burntsushi.net" => "Andrew Gallant",
"healeycodes.com" => "Andrew Healey",
"ahelwer.ca" => "Andrew Helwer",
"linuxjedi.co.uk" => "Andrew Hutchings",
"huth.me" => "Andrew Huth",
"aj.codes" => "Andrew Jorgensen",
"matecha.net" => "Andrew Matecha",
"www.amoses.dev" => "Andrew Moses",
"blog.zarfhome.com" => "Andrew Plotkin",
"www.growse.com" => "Andrew Rowson",
"avittig.medium.com" => "Andrew Vittiglio",
"androidkenya.com" => "Android",
"androidnewstoday.com" => "Android",
"www.androidauthority.com" => "Android Authority",
"www.androidcentral.com" => "Android Central",
"www.androidheadlines.com" => "Android Headlines",
"source.android.com" => "Android Open Source Project",
"www.androidpit.com" => "Android Pit",
"www.androidpolice.com" => "Android Police",
"www.anildash.com" => "Anil Dash",
"anil.recoil.org" => "Anil Madhavapeddy",
"anirudh.fi" => "Anirudh Oppiliappan",
"waxy.org" => "Andy Baio",
"piccalil.li" => "Andy Bell",
"stuffandnonsense.co.uk" => "Andy Clarke",
"andydote.co.uk" => "Andy Dote",
"andysblog.uk" => "Andy Hawthorne",
"thedent.net" => "Andy Nicolaides",
"blog.koipond.org.uk" => "Andy Simpkins",
"wingolog.org" => "Andy Wingo",
"anfenglish.com" => "ANF News",
"anfenglishmobile.com" => "ANF News",
"english.anf-news.com" => "ANF News",
"triptico.com" => "Ángel Ortega",
"www.arscyni.cc" => "Angelino Desmet",
"angelusnews.com" => "Angelus",
"www.aninews.in" => "ANI News",
"en.annahar.com" => "An Nahar",
"ankursethi.com" => "Ankur Sethi",
"aadl.org" => "Ann Arbor District Library",
"annarborobserver.com" => "Ann Arbor Observer",
"anntelnaes.substack.com" => "Ann Telnaes",
"annas-archive.org" => "Anna’s Archive",
"annas-archive.li" => "Anna’s Archive",
"annamancini.substack.com" => "Anna Mancini",
"www.annefrank.org" => "Anne Frank House",
"annehelen.substack.com" => "Anne Helen Petersen",
"weblog.anniegreens.lol" => "Anne Sturdivant",
"anniemueller.com" => "Annie Mueller",
"www.ansa.it" => "ANSA",
"acco.io" => "Anthony Accomazzo",
"tonybox.net" => "Anthony Biondo",
"anthonyhobday.com" => "Anthony Hobday",
"anthony.som.codes" => "Anthony Som",
"atempleton.bearblog.dev" => "Anthony Templeton",
"a4kids.org" => "Anthropology for Kids",
"cohost.org" => "Anti Software Software Club LLC",
"acdatacollective.org" => "Anti Corruption Data Collective",
"antimaximalist.com" => "Antimaximalist",
"antirez.com" => "Antirez",
"antipolygraph.org" => "Anti Polygraph",
"antixlinux.com" => "antiX Linux",
"www.antipope.org" => "Antipope",
"news.antiwar.com" => "AntiWar",
"original.antiwar.com" => "AntiWar",
"www.antiwar.com" => "AntiWar",
"ane.iki.fi" => "Antoine Kalmbach",
"mrsuh.com" => "Anton Sukhachev",
"antonin.delpeuch.eu" => "Antonin Delpeuch",
"www.oftenpaper.net" => "Antonio Marquez Raygoza",
"martinovic.blog" => "Antonio Martinović",
"antonio.is" => "Antonio Rodrigues",
"a3nm.net" => "Antoine Amarilli",
"medv.io" => "Anton Medvedev",
"blog.sergeyev.info" => "Anton Sergeyev",
"newsletter.manager.dev" => "Anton Zaides",
"antonz.org" => "Anton Zhiyanov",
"antranigv.am" => "Antranig Vartanian",
"clubmate.fi" => "Antti Hiljá",
"www.anup.io" => "Anup Jadhav",
"www.anxiousgeneration.com" => "The Anxious Generation",
"www.petesh.com" => "Anya Shanahan",
"blog.pecar.me" => "Anže Pečar",
"www.aolium.com" => "Aolium",
"programming-journal.org" => "AOSA",
"blogs.apache.org" => "Apache Blog",
"logging.apache.org" => "Apache Foundation",
"news.apache.org" => "The Apache Foundation Blog",
"topicpartition.io" => "Apache Kafka",
"www.apalrd.net" => "Apalralrd",
"apenwarr.ca" => "Apenwarr",
"aphelis.net" => "Aphelis",
"blog.apnic.net" => "APNIC",
"www.apnic.net" => "APNIC",
"apollo-magazine.com" => "Apollo Magazine",
"www.apollo-magazine.com" => "Apollo Magazinex",
"toidiu.com" => "Apoorv Kothari",
"defaults.rknight.me" => "App Defaults",
"developer.apple.com" => "Apple Inc",
"discussions.apple.com" => "Apple Inc",
"www.apple.com" => "Apple Inc",
"www.apple2history.org" => "Apple II History",
"appleinsider.com" => "AppleInsider",
"forums.appleinsider.com" => "AppleInsider",
"appletrack.com" => "AppleTrack",
"appomni.com" => "AppOmni",
"www.approachwithalacrity.com" => "Approach with Alacrity",
"blog.appsignal.com" => "AppSignal BV",
"www.apraamcos.com.au" => "APRA AMCOS",
"www.april.org" => "April",
"grayduck.mn" => "April King",
"thearabdailynews.com" => "Arab Daily News",
"arablit.org" => "Arab Lit Quarterly",
"www.arabnews.com" => "Arab News",
"thearabweekly.com" => "Arab Weekly",
"ar.al" => "Aral Balkan",
"aramzs.xyz" => "Aram Zucker-Scharff",
"www.arcweb.com" => "ARC",
"www.arcanoae.com" => "Arca Noae",
"archie.macdomain.net" => "Archie FTP Search",
"www.architecturaldigest.com" => "Architectural Digest",
"arcticportal.org" => "Arctic Portal",
"archipylago.dev" => "Archipylago",
"www.architectsjournal.co.uk" => "Architects´ Journal",
"archive.is" => "Archive Today",
"archive.md" => "Archive Today",
"archive.ph" => "Archive Today",
"blog.arctype.com" => "Arctype",
"blog.arduino.cc" => "Arduino",
"content.arduino.cc" => "Arduino",
"ardupilot.org" => "ArduPilot",
"discover.hubpages.com" => "Arena Group",
"meidasnews.com" => "Arena Group",
"argon40.com" => "Argon 40 Technologies Ltd",
"www.theargumentmag.com" => "The Argument",
"housingsklave.at" => "Ari",
"ari-atori.dev" => "Ari Jaktløve Atori",
"ariadne.space" => "Ariadne Conill",
"0xrmrf.medium.com" => "Arif",
"www.americanbanker.com" => "Arizent",
"arizonadailyindependent.com" => "Arizona Independent LLC",
"arjenkamphuis.eu" => "Arjen Kamphuis",
"arjenwiersma.nl" => "Arjen Wiersma",
"www.arjenwiersma.nl" => "Arjen Wiersma",
"healthy.arkansas.gov" => "Arkansas",
"arkansasadvocate.com" => "Arkansas Advocate",
"arktimes.com" => "Arkansas Times",
"www.arkansasonline.com" => "Arkansas Democrat-Gazette Inc",
"www.arm.com" => "Arm Limited",
"armanckeser.com" => "Armanc Keser",
"armenpress.am" => "Armenpress",
"armenianweekly.com" => "Armenian Weekly",
"lucumr.pocoo.org" => "Armin Ronacher",
"www.arnnet.com.au" => "ARN",
"www.draketo.de" => "Arne Babenhauserheide",
"arne.me" => "Arne Bahlo",
"raku-musings.com" => "Arne Sommer",
"arnon.dk" => "Arnon Shimoni",
"www.aroged.com" => "Aroged",
"www.arrl.org" => "ARRL",
"artdaily.com" => "Art",
"nationaltoday.com" => "Art",
"www.artfixdaily.com" => "Art Fix Daily",
"theartofmachinery.com" => "Art Of Machinery",
"rushter.com" => "Artem Golubin",
"www.classicalite.com" => "Arts",
"www.artshub.com.au" => "ArtsHub",
"www.artsjournal.com" => "ArtsJournal",
"ral-arturo.org" => "Arturo Borrero",
"www.artshub.co.uk" => "ArtsHub and Screenhub",
" By Artyom Bologov " => "Artyom Bologov",
"arunraghavan.net" => "Arun Raghavan",
"arxiv.org" => "arXiv",
"www.asa.org.uk" => "Advertising Standards Authority Ltd",
"asahilinux.org" => "Asahi Linux",
"www.onlyoffice.com" => "Ascensio System SIA",
"www.asciiribbon.org" => "The ASCII Ribbon Campaign",
"ashfurrow.com" => "Ash Furrow",
"asharangappa.substack.com" => "Asha Rangappa",
"ashishb.net" => "Ashish Bhatia",
"amissing.link" => "Ashlen",
"apwctu.org" => "Ashokan-Pepacton Watershed Chapter of Trout Unlimited",
"multiline.co" => "Ashur Cabrera",
"www.asiae.co.kr" => "The Asia Business Daily",
"www.asiafinancial.com" => "Asia Financial",
"www.asianews.it" => "Asia News",
"www.asiaone.com" => "Asia One",
"asiapacificreport.nz" => "Asia Pacific Report",
"asiatimes.com" => "Asia Times",
"asindu.xyz" => "Asindu Drileba",
"www.aspeninstitute.org" => "Aspen Institute",
"inews.co.uk" => "Associated News Ltd",
"apnews.com" => "Associated Press",
"www.apnews.com" => "Associated Press",
"prologyear.logicprogramming.org" => "Association for Logic Programming",
"www.asmeascholars.org" => "Association for the Study of the Middle East and Africa",
"www.arl.org" => "Association of Research Libraries",
"aster.cloud" => "AsterCloud",
"asteriskmag.com" => "Asterisk Magazine",
"astrid.tech" => "Astrid Yu",
"www.aanda.org" => "Astronomy & Astrophysics",
"blog.astropad.com" => "Astropad",
"www.asus.com" => "ASUSTeK Computer Inc",
"atthis.link" => "At This Link",
"atharvaraykar.com" => "Atharva Raykar",
"drmowinckels.io" => "Athanasia Mo Mowinckel",
"atlantadailyworld.com" => "Atlanta Daily World",
"atlanticbusinesssystems.com" => "Atlantic Business Systems",
"www.atlanticcouncil.org" => "Atlantic Council",
"www.atlasobscura.com" => "Atlas Obscura",
"atlasvpn.com" => "Atlas VPN",
"community.atlassian.com" => "Atlassian",
"www.atlassian.com" => "Atlassian",
"www.atomic.computer" => "Atomic Computer Services LLC",
"www.lamborghini.com" => "Audi Group",
"www.audubon.org" => "Audubon Society",
"augmentedcode.io" => "Augmented Code",
"shapeof.com" => "August 'Gus' Mueller",
"agateau.com" => "Aurélien Gâteau",
"blog.aurel32.net" => "Aurélien Jarno",
"www.austinchronicle.com" => "Austin Chronicle",
"austingil.com" => "Austin Gil",
"austinkleon.com" => "Austin Kleon",
"austinkleon.substack.com" => "Austin Kleon",
"austinsnerdythings.com" => "Austin Pivarnik",
"austinwhite.org" => "Austin White",
"austinhenley.com" => "Austin Z Henley",
"www.greenleft.org.au" => "Australian Green Left",
"www.aspi.org.au" => "The Australian Strategic Policy Institute",
"ministers.ag.gov.au" => "Australia",
"www.aihw.gov.au" => "Australia",
"www.pm.gov.au" => "Australia",
"thenewdaily.com.au" => "Australia",
"www.aph.gov.au" => "Australia",
"www.dailytelegraph.com.au" => "Australia",
"www.brisbanetimes.com.au" => "Australia",
"www.cyber.gov.au" => "Australia",
"www.echo.net.au" => "Australia",
"www.liverpoolchampion.com.au" => "Australia",
"www.pc.gov.au" => "Australia",
"www.perthnow.com.au" => "Australia",
"www.themonthly.com.au" => "Australia",
"www.nma.gov.au" => "National Museum of Australia",
"www.authorsalliance.org" => "Authors Alliance Inc",
"authzed.com" => "AuthZed",
"www.autoevolution.com" => "Auto Evolution",
"www.theautopian.com" => "The Autopian",
"www.autodidacts.io" => "The Autodidacts",
"automaton-media.com" => "Automaton",
"www.automology.com" => "Automology",
"www.automotiveworld.com" => "Automotive World Ltd",
"www.autoriteitpersoonsgegevens.nl" => "Autoriteit Persoonsgegevens, NL",
"blog.avas.space" => "Ava",
"blog.avast.com" => "Avast",
"decoded.avast.io" => "Avast",
"avi-loeb.medium.com" => "Avi Loeb",
"www.aviationanalysis.net" => "Aviation Analysis",
"www.aviationtoday.com" => "Aviation Today",
"www.aviation24.be" => "Aviation24.be",
"www.avitrader.com" => "Avi Trader",
"avi.im" => "Avinash Sajjanshetty",
"awk.dev" => "AWK",
"a.wholelottanothing.org" => "A Whole Lotta Nothing",
"axcient.com" => "Axcient",
"noone.org" => "Axel Beckert",
"isolveproblems.substack.com" => "Axel Rietschin",
"www.axelspringer.com" => "Axel Springer",
"www.axios.com" => "Axios",
"www.agwa.name" => "Ayer",
"aylo6061.com" => "Aylo",
"johncarlosbaez.wordpress.com" => "Azimuth Project",
"backlightblog.com" => "Backlight",
"badluckhotrocks.com" => "Bad Luck, Hot Rocks",
"www.ranum.com" => "Badger Forge",
"badgerherald.com" => "The Badger Herald",
"thebaffler.com" => "The Baffler Foundation",
"gebna.gg" => "BahaaZidan",
"www.baldengineer.com" => "Bald Engineer",
"www.baldurbjarnason.com" => "Baldur Bjarnason",
"ballotpedia.org" => "Ballotpedia",
"thebalochistanpost.net" => "Balochistan Post",
"balochistantimes.com" => "Balochistan Times",
"blog.balthazar-rouberol.com" => "Balthazar Rouberol",
"balticguide.ee" => "The Baltic Guide",
"www.baltictimes.com" => "The Baltic Times",
"www.thebaltimorebanner.com" => "The Baltimore Banner",
"banfossilfuelads.org" => "Ban Fossil Fuel Ads",
"daily.bandcamp.com" => "Bandcamp",
"diejimcrow.bandcamp.com" => "Bandcamp",
"keleketla.bandcamp.com" => "Bandcamp",
"bdnews24.com" => "Bangladesh",
"bangordailynews.com" => "Bangor Daily News",
"www.bangordailynews.com" => "Bangor Daily News",
"www.boz.zm" => "Bank of Zambia",
"www.bankrate.com" => "Bankrate LLC",
"www.banklesstimes.com" => "Bankless Times",
"www.bangkokpost.com" => "Bankok Post",
"banteg.xyz" => "Bateg",
"baptistnews.com" => "Baptist News Global",
"www.baptistpress.com" => "Baptist Press",
"bariweiss.substack.com" => "Bari Weiss",
"www.barnabasaid.org" => "Barnabas Aid",
"barnabasfund.org" => "Barnabas Fund",
"www.barnabasfund.org" => "Barnabas Fund",
"news.barnabasfund.org" => "Barnabas Fund",
"www.barrons.com" => "Barrons",
"bkhome.org" => "Barry Kauler",
"pika.bjhess.com" => "Barry Hess",
"bjhess.pika.page" => "Barry Hess",
"bjhess.bearblog.dev" => "Barry Hess",
"bjhess.com" => "Barry Hess",
"www.brightball.com" => "Barry W Jones",
"barrysampson.net" => "Barry Sampson",
"bartwronski.com" => "Bart Wronski",
"ciechanow.ski" => "Bartosz Ciechanowski",
"bartoszmilewski.com" => "Bartosz Milewski",
"www.bartoszsypytkowski.com" => "Bartosz Sypytkowski",
"basicappleguy.com" => "Basic Apple Guy",
"bastiangruber.ca" => "Bastian Gruber",
"bastianallgeier.com" => "Bastian Allgeier",
"planetradio.co.uk" => "Bauer Media Group",
"www.bbc.com" => "BBC",
"www.bbc.co.uk" => "BBC",
"news.bbc.co.uk" => "BBC",
"www.historyextra.com" => "BBC",
"www.bcs.org" => "BCS",
"www.begiant.ca" => "Be Giant",
"beagleboard.org" => "BeagleBoard",
"www.comicsbeat.com" => "The Beat",
"www.thebeaverton.com" => "The Beaverton",
"www.beckershospitalreview.com" => "Becker's Hospital Review",
"raforall.blogspot.com" => "Becky Spratford",
"becomeawritertoday.com" => "Become A Writer Today",
"beebom.com" => "Beebom",
"beepb00p.xyz" => "BeepB00p",
"beej.us" => "Beej",
"beets.readthedocs.io" => "Beets",
"beforesandafters.com" => "Befores & Afters",
"behavioralscientist.org" => "Behavioral Scientist",
"www.belfasttelegraph.co.uk" => "Belfast Telegraph",
"www.bellingcat.com" => "Bellingcat",
"www.belowthefold.news" => "Below The Fold",
"benjamincongdon.me" => "Ben Congdon",
"bencrump.com" => "Ben Crump Law",
"3fx.ch" => "Ben Fiedler",
"benfrain.com" => "Ben Frain",
"www.benfrederickson.com" => "Ben Frederickson",
"hearsum.ca" => "Ben Hearsum",
"benedicthenshaw.com" => "Ben Henshaw",
"benholmen.com" => "Ben Holmen",
"benhoyt.com" => "Ben Hoyt",
"www.benjoffe.com" => "Ben Joffe",
"blog.benjojo.co.uk" => "Ben Jojo",
"www.benkuhn.net" => "Ben Kuhn",
"benricemccarthy.ghost.io" => "Ben McCarthy",
"brothke.medium.com" => "Ben Rothke",
"www.bentasker.co.uk" => "Ben Tasker",
"bentsai.pika.page" => "Ben Tsai",
"bentsai.org" => "Ben Tsai",
"bvisness.me" => "Ben Visness",
"werd.io" => "Ben Werdmuller",
"bgthompson.codeberg.page" => "Benjamin G Thompson",
"www.hardill.me.uk" => "Benjamin John Hardill",
"zoobab.wikidot.com" => "Benjamin Henrion",
"www.benjaminlipp.de" => "Benjamin Lipp",
"mako.cc" => "Benjamin Mako Hill",
"mental-reverb.com" => "Benjamin Richner",
"www.sandofsky.com" => "Benjamin Sandofsky",
"benjaminwil.info" => "Benjamin Wil",
"www.benji.dog" => "Benji Encalada Mora",
"www.ben-evans.com" => "Benedict Evans",
"www.timesnownews.com" => "Bennett, Coleman & Company Ltd",
"bentsukun.ch" => "Benny Siegert",
"eregon.me" => "Benoit Daloze",
"www.benton.org" => "Benton Institute",
"works.bepress.com" => "Bepress",
"berk.es" => "Bèr Kessels",
"www.noemamag.com" => "Berggruen Insitute",
"newscenter.lbl.gov" => "Berkeley Lab",
"www.berklix.com" => "Berklix",
"bernat.tech" => "Bernát Gábor",
"thinkingeek.com" => "Bernat Ràfales",
"berthub.eu" => "Bert Hubert",
"bertptrs.nl" => "Bert Peters",
"bert.org" => "Bertrand Fan",
"bertrandmeyer.com" => "Bertrand Meyer",
"bestgamingpro.com" => "Best Gaming Pro",
"www.bestgizindia.com" => "Best Of Giz India",
"betanews.com" => "Beta News",
"better.fyi" => "Better",
"www.better-simple.com" => "Better Simple",
"betterstack.com" => "Better Stack Inc",
"betterbird.eu" => "Betterbird",
"betterprogramming.pub" => "Better Programming",
"bgr.com" => "BGR",
"bhamnow.com" => "Bham Now",
"www.bhaskarenglish.in" => "Bhaskar English",
"bianet.org" => "BIA Net",
"m.bianet.org" => "BIA Net",
"static.bianet.org" => "BIA Net",
"www.bigbinary.com" => "Big Binary LLC",
"bigbluebutton.org" => "Big Blue Button",
"www.mynaparrot.com" => "Big Blue Button",
"www.roanokerambler.com" => "Big Blue Press LLC",
"www.bigcommerce.com" => "BigCommerce Pty Ltd",
"www.bigmessowires.com" => "Big Mess O Wires",
"www.bikeboom.info" => "Bike Boom",
"bikepacking.com" => "Bikepacking",
"bikeportland.org" => "BikePortland",
"www.bikobatanari.art" => "Bikobatanari",
"billandkeonne.org" => "Bill and Keonne",
"billglover.me" => "Bill Glover",
"billmckibben.substack.com" => "Bill McKibben",
"notes.billmill.org" => "Bill Mill",
"billmoyers.com" => "Bill Moyers",
"billwadge.com" => "Bill Wadge",
"billwillingham.substack.com" => "Bill Willingham",
"www.sunherald.com" => "Biloxi Sun Herald",
"blog.binarynights.com" => "BinaryNights LLC",
"binsh.dev" => "Binshdev",
"bmcmedethics.biomedcentral.com" => "Bio Med Central",
"globalizationandhealth.biomedcentral.com" => "Bio Med Central",
"blog.bioconductor.org" => "Bioconductor",
"bioone.org" => "BioOne Complete",
"www.biometricupdate.com" => "Biometric Update",
"www.biorxiv.org" => "BioRxiv",
"birdhouse.org" => "Birdhouse Arts Collective",
"birmingham.cmis.uk.com" => "Birmingham City Council",
"www.birminghammail.co.uk" => "Birmingham Live",
"bisco.org" => "Bisco",
"bishopfox.com" => "Bishop Fox",
"labs.bishopfox.com" => "Bishop Fox Labs",
"bismarcktribune.com" => "Bismarck Tribune",
"darkvisitors.com" => "Bit Flip LLC",
"www.bitchmedia.org" => "Bitch Media",
"www.bitdefender.com" => "Bitdefender",
"www.bitecode.dev" => "Bite code",
"news.bitcoin.com" => "Bitcoin",
"bitcoinmagazine.com" => "Bitcoin Magazine",
"businessinsights.bitdefender.com" => "Bitdefender",
"www.bitestring.com" => "Bitestring",
"bitmovin.com" => "Bitmovin Inc",
"www.bitsondisk.com" => "Bits On Disk",
"bitsavers.org" => "Bitsavers",
"bitterwinter.org" => "Bitter Winter",
"bix.blog" => "Bix Frankonis",
"bjango.com" => "Bjango",
"www.stroustrup.com" => "Bjarne Stroustrup",
"bjoern.brembs.net" => "Bjoern Brembs",
"borud.no" => "Björn Borud",
"www.ognibeni.de" => "Björn Ognibeni",
"warmedal.se" => "Björn Wärmedal",
"goblackcat.com" => "Black Cat",
"www.blackenterprise.com" => "Black Enterprise",
"www.blackhat.com" => "Black Hat",
"blogs.blackberry.com" => "BlackBerry",
"windsornewstoday.ca" => "Blackburn Media",
"blackwinghq.com" => "Blackwing Intelligence",
"blainsmith.com" => "Blain Smith",
"blakerain.com" => "Blake Rain",
"blakewatson.com" => "Blake Watson",
"code.blender.org" => "Blender",
"www.blender.org" => "Blender",
"blindsa.org.za" => "Blind SA",
"the-blindspot.com" => "The Blind Spot",
"docs.sipthor.net" => "Blink",
"www.blinkenlights.com" => "Blinkenlights",
"blinry.org" => "Blinry",
"blintzbase.com" => "Blintz Base",
"blog.blissos.org" => "BlissOS",
"blocksandfiles.com" => "Situation Publishing",
"blockclubchicago.org" => "Block Club Chicago",
"blogsystem5.substack.com" => "Blog System/5",
"blogsofwar.com" => "Blogs of War",
"blog.lyall.co" => "Blog.Lyall.Co",
"bloodyelbow.com" => "Bloody Elbow",
"www.bloodyelbow.com" => "Bloody Elbow",
"news.bloomberglaw.com" => "Bloomberg",
"news.bloombergtax.com" => "Bloomberg",
"www.bloomberg.com" => "Bloomberg",
"blog.bloonface.com" => "Bloonface",
"bloomingtonian.com" => "The Bloomingtonian",
"www.thesouthafrican.com" => "Blue Sky Publications",
"atproto.com" => "Bluesky Social PBC",
"cybermagazine.com" => "BMG",
"manufacturingdigital.com" => "BMG",
"www.bmj.com" => "BMJ",
"zacks.eu" => "BMK Informatika j.d.o.o.",
"www.bmjv.de" => "BMVJ",
"www.bnaibrith.ca" => "Bnai Brith",
"www.intellinews.com" => "BNE IntelliNews",
"www.bnnbloomberg.ca" => "BNN",
"cromwell-intl.com" => "Bob Cromwell",
"rmf.vc" => "Bob Frankston",
"www.bawbgale.com" => "Bob Gale",
"bobmonsour.com" => "Bob Monsour",
"www.bobmonsour.com" => "Bob Monsour",
"journal.stuffwithstuff.com" => "Bob Nystrom",
"bobbyhiltz.com" => "Bobby Hiltz",
"bobdahacker.com" => "BobDaHacker",
"www.bodhilinux.com" => "Bodhi Linux",
"bitboxer.de" => "Bodo Tasche",
"trysound.io" => "Bogdan Chadkin",
"www.bogieland.com" => "BogieLand",
"boilingsteam.com" => "Boiling Steam",
"boingboing.net" => "BoingBoing",
"bokwoon.com" => "Bokwoon",
"www.bollyinside.com" => "Bollyinside",
"bootcamp.uxdesign.cc" => "UX Collective",
"bonfirenetworks.org" => "Bonfire Networks",
"bookriot.com" => "Book Riot",
"bootlin.com" => "Bootlin",
"www.boredpanda.com" => "Bored Panda",
"borgenproject.org" => "Borgen Project",
"notso.boringsql.com" => "BoringSQL",
"www.boristhebrave.com" => "Boris The Brave",
"borncity.com" => "Born City",
"borneobulletin.com.bn" => "Borneo",
"www.boston.com" => "Boston Globe",
"www.bostonglobe.com" => "Boston Globe",
"www.bostonherald.com" => "Boston Herald",
"www.bostonreview.net" => "Boston Review",
"www.bu.edu" => "Boston University",
"www.csk.gov.in" => "Botnet Cleaning and Malware Analysis Centre, India",
"boucek.me" => "Marian Bouček",
"bbhtt.space" => "Boudhayan Bhattcharya",
"bowshock.nl" => "Bow Shock Systems Consulting",
"bowero.nl" => "Bowero",
"boydkane.com" => "Boyd Kane",
"www.bgca.org" => "Boys & Girls Clubs of America",
"batsov.com" => "Bozhidar Batsov",
"metaredux.com" => "Bozhidar Batsov",
"techblog.bozho.net" => "Bozhidar Bozhanov",
"www.bizpacreview.com" => "BPR",
"bra.se" => "BRÅ",
"bradfitz.com" => "Brad Fitzpatrick",
"bradfrost.com" => "Brad Frost",
"bt.ht" => "Brad Taunt",
"btxx.org" => "Brad Taunt",
"www.abortretry.fail" => "Bradford Morgan White",
"bradley.chatha.dev" => "Bradley Chatha",
"tdarb.org" => "Bradley Taunt",
"www.brainerddispatch.com" => "Brainerd Dispatch",
"thelittleengineerthatcould.blogspot.com" => "Bram Stolk",
"brandons-journal.com" => "Brandon",
"brandonwrites.xyz" => "Brandon",
"wand3r.net" => "Brandon",
"brandonli.net" => "Brandon Li",
"quakkels.com" => "Brandon Quakkelaar",
"www.brandonpugh.com" => "Brandon Pugh",
"brandonrozek.com" => "Brandon Rozek",
"brandon.si" => "Brandon Simmons",
"brandur.org" => "Branur Leach",
"www.brasildefato.com.br" => "Brasil de Fato",
"www.brasilwire.com" => "Brasil Wire",
"brave.com" => "Brave Browser",
"riotimesonline.com" => "Brazil",
"breachmedia.ca" => "Breach Media",
"breakingdefense.com" => "Breaking Defense",
"abovethelaw.com" => "Breaking Media Inc",
"breckyunits.com" => "Breck Yunits",
"brendangregg.com" => "Brendan Gregg",
"www.brendangregg.com" => "Brendan Gregg",
"www.brendanlong.com" => "Brendan Long",
"brennan.day" => "Brennan",
"netnewswire.blog" => "Brent Simmons",
"inessential.com" => "Brent Simmons",
"ranchero.com" => "Brent Simmons",
"byorgey.wordpress.com" => "Brent Yorgey",
"briancallahan.net" => "Brian Callahan",
"briandouglas.ie" => "Brian Douglas",
"bnet.substack.com" => "Brian Feldman",
"bytes.zone" => "Brian Hicks",
"brianlovin.com" => "Brian Lovin",
"www.bloodinthemachine.com" => "Brian Merchant",
"remotesynthesis.com" => "Brian Rinaldi",
"www.sholis.com" => "Brian Sholis",
"briansmith.org" => "Brian Smith",
"brica.de" => "BRICA",
"briefer.cloud" => "Briefer.cloud",
"www.michigan.gov" => "The State of Michigan",
"bridgemi.com" => "Bridge Michigan",
"www.bridgemi.com" => "Bridge Michigan",
"www.lansingcitypulse.com" => "Michigan",
"mijournalismhalloffame.org" => "The Michigan Journalism Hall of Fame",
"www.michiganreview.com" => "The Michigan Review",
"www.michiganpublic.org" => "Michigan Radio",
"www.michiganradio.org" => "Michigan Radio",
"www.wkar.org" => "Michigan State University",
"www.michbar.org" => "State Bar of Michigan",
"stateline.org" => "States Newsroom",
"bright-green.org" => "Bright Green",
"brightlinewatch.org" => "Bright LineWatch",
"brightly.eco" => "Brightly",
"www.brightonandhovenews.org" => "Brighton And Hove",
"brilliantmaps.com" => "Brilliant British Ltd",
"brioche.dev" => "Brioche",
"www.bristolpost.co.uk" => "Bristol UK",
"www.bristol247.com" => "Bristol UK",
"en.irinkwire.com" => "Brinkwire",
"www.britishasianchristians.org" => "British Christians",
"bccla.org" => "British Columbia Civil Liberties Association",
"www.comedy.co.uk" => "British Comedy Guide",
"blogs.bl.uk" => "British Library",
"www.bl.uk" => "British Library",
"www.britishpakistanichristians.org" => "British Pakistani Christian Association",
"learnenglish.britishcouncil.org" => "British Council",
"broadbandbreakfast.com" => "Broadband Breakfast",
"www.security.com" => "Broadcom Inc",
"www.brookings.edu" => "Brookings Institution",
"www.bklynlibrary.org" => "Brooklyn Public Library",
"www.browndailyherald.com" => "Brown Daily Herald",
"browserchoicealliance.org" => "Browser Choice Alliance",
"fingerprintjs.com" => "Browser Fingerprint JS",
"onlinetexttools.com" => "Browserling Inc",
"brr.fyi" => "Brr",
"bruceediger.com" => "Bruce Ediger",
"brucelawson.co.uk" => "Bruce Lawson",
"perens.com" => "Bruce Perens",
"www.schneier.com" => "Bruce Schneier",
"brodrigues.co" => "Bruno Rodrigues",
"www.brodrigues.co" => "Bruno Rodrigues",
"bryanapperson.com" => "Bryan Apperson",
"bryanapperson.com" => "Bryan Apperson",
"bcantrill.dtrace.org" => "Bryan Cantrill",
"lunduke.locals.com" => "Bryan Lunduke",
"lunduke.substack.com" => "Bryan Lunduke",
"www.bryanshalloway.com" => "Bryan Shalloway",
"blog.brycekerley.net" => "Bryce Kerley",
"brycevandegrift.xyz" => "Bryce Vandegrift",
"www.brycewray.com" => "Bryce Wray",
"lists.nycbug.org" => "NYC BUG",
"www.nycbug.org" => "NYC BUG",
"kristaps.bsd.lv" => "BSD",
"journal.bsd.cafe" => "The BSD Cafe Journal",
"www.asahi.com" => "The Asahi Shimbun Company",
"lists.asiabsdcon.org" => "AsiaBSDCon",
"2023.asiabsdcon.org" => "AsiaBSDCon",
"2024.asiabsdcon.org" => "AsiaBSDCon",
"2025.asiabsdcon.org" => "AsiaBSDCon",
"2026.asiabsdcon.org" => "AsiaBSDCon",
"bsdly.blogspot.com" => "BSDly",
"blog.bsdcan.org" => "BSDCan",
"lists.bsdcan.org" => "BSDCan",
"www.bsdcan.org" => "BSDCan",
"bsdnl.nl" => "BSD-NL",
"bsandro.tech" => "Bsandro",
"www.bucksfreepress.co.uk" => "Bucks Free Press",
"buffalonews.com" => "Buffalo News",
"builders.perk.com" => "The Builders",
"builtin.com" => "Built In",
"thebulletin.org" => "Bulletin",
"thebullshitmachines.com" => "The Bullshit Machines",
"www.thebulwark.com" => "Bulwark Media",
"www.bunniestudios.com" => "Bunnie Huang",
"www.thebureauinvestigates.com" => "The Bureau of Investigative Journalism",
"burakemir.ch" => "Burak Emir",
"stories.byburk.net" => "Burk",
"embeddeduse.com" => "Burkhard Stubert",
"www.businessworld.in" => "BW Businessworld Media Pvt Ltd",
"www.businessoffashion.com" => "The Business of Fashion",
"www.businessghana.com" => "Business Ghana",
"markets.businessinsider.com" => "Business Insider",
"www.businessinsider.com" => "Business Insider",
"www.businessinsider.com.au" => "Business Insider",
"www.businessinsider.de" => "Business Insider",
"www.businessinsider.fr" => "Business Insider",
"www.businessinsider.in" => "Business Insider",
"www.businessinsider.nl" => "Business Insider",
"www.businessinsider.co.za" => "Business Insider",
"www.insider.com" => "Business Insider",
"www.businesslive.co.za" => "Business Live",
"www.business-standard.com" => "Business Standard",
"businesstech.co.za" => "BusinessTech, South Africa",
"www.tbsnews.net" => "The Business Standard",
"www.businesstoday.in" => "Business Today",
"www.businesswire.com" => "Business Wire",
"bwcio.businessworld.in" => "Business World",
"businessworld.in" => "Business World",
"www.bworldonline.com" => "Business World",
"beesbuzz.biz" => "Busybee",
"www.rousette.org.uk" => "But she's a girl...",
"buttondown.email" => "Buttondown",
"buttondown.com" => "Buttondown LLC",
"www.huffpost.com" => "BuzzFeed Inc",
"www.buzzfeednews.com" => "Buzz Feed",
"bytesauna.com" => "ByteSauna",
"blog.code.horse" => "Bytewave",
"www.cppstories.com" => "C++ Stories",
"www.c0ffee.net" => "C0ffee",
"c3.handmade.network" => "C3",
"c3-lang.org" => "C3",
"www.c4isrnet.com" => "C4ISRNET",
"www.c64os.com" => "C64 OS",
"www.c-span.org" => "C-SPAN",
"cachyos.org" => "CachyOS",
"cado-nfs.gforge.inria.fr" => "CADONFS",
"www.caimito.net" => "Caimito Agile Life",
"caio.ca" => "Caio Bianchi",
"linksiwouldgchatyou.substack.com" => "Caitlin Dewey",
"caitlinjohnstone.com" => "Caitlin Johnstone",
"www.cajnewsafrica.com" => "CAJ News",
"www.cajnews.co.za" => "CAJ News",
"calnewport.com" => "Cal Newport",
"calpaterson.com" => "Cal Paterson",
"calebhearth.com" => "Caleb Hearth",
"www.calendarpedia.com" => "Calendarpedia",
"manual.calibre-ebook.com" => "Calibre",
"www.publicbooks.org" => "Public Books",
"anti-slapp.org" => "Public Participation Project",
"www.ppic.org" => "Public Policy Institute of California",
"public-inbox.org" => "Public-Inbox",
"www.pleasantonweekly.com" => "Pleasanton California",
"sf.gazetteer.co" => "Gazetteer, San Francisco, California",
"48hills.org" => "San Francisco, California",
"missionlocal.org" => "San Francisco, California",
"voiceofsandiego.org" => "Voice of San Diego",
"leginfo.legislature.ca.gov" => "California",
"californianewstimes.com" => "California",
"calmatters.org" => "California",
"sd15.senate.ca.gov" => "California",
"wildlife.ca.gov" => "California",
"www.independent.com" => "California",
"www.sacbee.com" => "California",
"www.gov.ca.gov" => "California",
"www.dir.ca.gov" => "California Department of Industrial Relations",
"california18.com" => "California18",
"www.calfac.org" => "California Faculty Association",
"www.californialawreview.org" => "California Law Review",
"sundial.csun.edu" => "California State University Northridge",
"calteches.library.caltech.edu" => "Caltech Magazine",
"magazine.caltech.edu" => "Caltech Magazine",
"www.calvin.edu" => "Calvin University",
"calyxos.org" => "Calyx Institute",
"www.cambra.dev" => "Cambra",
"dictionary.cambridge.org" => "Cambridge Dictionary",
"www.camg.me" => "Cameron Gaertner",
"schoonens.social" => "Camiel Schoonens",
"can-newsletter.org" => "CAN",
"campustechnology.com" => "1105 Media Inc",
"securitytoday.com" => "1105 Media Inc",
"news.gov.bc.ca" => "Canada",
"www.gov.nt.ca" => "Canada",
"bc.ctvnews.ca" => "Canada",
"barrie.ctvnews.ca" => "Canada",
"edmonton.ctvnews.ca" => "Canada",
"winnipeg.ctvnews.ca" => "Canada",
"canadianinquirer.net" => "Canada",
"www.pm.gc.ca" => "Canada",
"www.calgarylibrary.ca" => "Canada",
"www.winnipegfreepress.com" => "Canada",
"www.thespec.com" => "Canada",
"www.ugdsb.ca" => "Canada",
"www.canada.ca" => "Canada",
"canadatoday.news" => "Canada Today",
"www.yrp.ca" => "Canada",
"www.policyalternatives.ca" => "Canadian Centre for Policy Alternatives",
"www.cmaj.ca" => "Canadian Medical Association Journal",
"canion.blog" => "Canion dot Blog",
"canalys.com" => "Canalys",
"www.canberratimes.com.au" => "Canberra Times",
"canonical.com" => "Canonical",
"blog.can.ac" => "Can Bölük",
"www.canva.dev" => "Canva Engineering Blog",
"canvatechblog.com" => "Canva Engineering Blog",
"caolan.uk" => "Caolan",
"capwatkins.com" => "Cap Watikins",
"cap5.nl" => "Cap5 B V",
"www.capegazette.com" => "Cape Gazette",
"www.capetalk.co.za" => "Cape Talk",
"capitalaspower.com" => "Capital As Power",
"www.carandbike.com" => "Car And Bike",
"eletric-vehicles.com" => "CARBA",
"www.smartcard-hsm.com" => "CardContact Systems GmbH",
"www.edmunds.com" => "CarMax Inc",
"git.carcosa.net" => "Carcosa Git",
"www.carinsurance.org" => "Car Insurance",
"carlbarenbrug.com" => "Carl Barenbrug",
"carlchenet.com" => "Carl Chenet",
"carlhendrick.substack.com" => "Carl Hendrick",
"serc.carleton.edu" => "Carleton College",
"rabexc.org" => "Carlo Contavalli",
"carlo.zancanaro.id.au" => "Carlo Zancanaro",
"zottmann.org" => "Carlo Zottmann",
"ostwilkens.se" => "Carl Öst Wilkens",
"carlschwan.eu" => "Carl Schwan",
"datagubbe.se" => "Carl Svensson",
"www.datagubbe.se" => "Carl Svensson",
"tashian.com" => "Carl Tashian",
"carlosbecker.com" => "Carlos Becker",
"cfenollosa.com" => "Carlos Fenollosa",
"www.carscoops.com" => "Car Scoops",
"www.thedrum.com" => "Carnyx Group Ltd",
"www.cartoonbrew.com" => "Cartoon Brew",
"www.cartooningforpeace.org" => "Cartooning for Peace",
"cartoonistsrights.org" => "Cartooonists Rights Network International",
"www.caryinstitute.org" => "Cary Institute",
"csscade.com" => "The Cascade",
"conesible.de" => "Casey Kreer",
"caseyliss.com" => "Casey Liss",
"www.caseyliss.com" => "Casey Liss",
"www.platformer.news" => "Casey Newton",
"cprimozic.net" => "Casey Primozic",
"cassidoo.co" => "Cassidy Williams",
"catfox.life" => "The Cat Fox Life",
"www.catalyst.net.nz" => "Catalyst",
"catalystcloud.nz" => "Catalyst Cloud",
"blog.webpagetest.org" => "Catchpoint Systems",
"www.ninearrow.com" => "Catherine Geaney",
"catvalente.substack.com" => "Catherynne M Valente",
"blog.cathoderaydude.com" => "Cathode Ray Dude",
"cathoderayzone.com" => "Cathode Ray Zone",
"catholicdaily.com" => "Catholic Daily",
"catholicherald.co.uk" => "Catholic Herald",
"www.catholicnewsagency.com" => "Catholic NewsAgency",
"www.catholicregister.org" => "Catholic Register",
"www.catholicworldreport.com" => "Catholic World Report",
"humanprogress.org" => "The Cato Institute",
"www.cato.org" => "The Cato Institute",
"www.catonetworks.com" => "Cato Networks",
"cavendishlabs.org" => "Cavendish Labs Co",
"cbarrete.com" => "CBarrete",
"www.cbc.ca" => "CBC",
"www1.cbn.com" => "CBN",
"www.cbr.com" => "CBR",
"www.cbronline.com" => "CBR",
"boston.cbslocal.com" => "CBS",
"detroit.cbslocal.com" => "CBS",
"dfw.cbslocal.com" => "CBS",
"losangeles.cbslocal.com" => "CBS",
"miami.cbslocal.com" => "CBS",
"minnesota.cbslocal.com" => "CBS",
"newyork.cbslocal.com" => "CBS",
"sacramento.cbslocal.com" => "CBS",
"sanfrancisco.cbslocal.com" => "CBS",
"www.8newsnow.com" => "CBS",
"www.cbsnews.com" => "CBS",
"www.cbssports.com" => "CBS",
"www.wusa9.com" => "CBS",
"events.ccc.de" => "CCC",
"fahrplan.events.ccc.de" => "CCC",
"media.ccc.de" => "CCC",
"www.ccc.de" => "CCC",
"www.cdc.gov" => "CDC",
"cedardb.com" => "CedarDB",
"alienlebarge.ch" => "Cédric",
"www.cedricbonhomme.org" => "Cédric Bonhomme",
"www.cell.com" => "Cell Press",
"celso.io" => "Celso Martinho",
"cemrehancavdar.com" => "Cemrehan Çavdar",
"cendyne.dev" => "Cendyne Naga",
"www.americanprogress.org" => "The Center for American Progress",
"www.autosec.org" => "Center for Automotive Embedded Systems Security",
"climateintegrity.org" => "Center for Climate Integrity",
"www.computinghistory.org.uk" => "The Centre for Computing History",
"counterhate.com" => "Center for Countering Digital Hate (CCDH)",
"cdt.org" => "Center for Democracy & Technology",
"cepr.net" => "Center for Economic and Policy Research",
"ceh.org" => "Center for Environmental Health",
"cepa.org" => "Center for European Policy Analysis (CEPA)",
"www.cima.ned.org" => "Center for International Media Assistance",
"revealnews.org" => "The Center for Investigative Reporting",
"www.centreforsocialjustice.org.uk" => "The Centre for Social Justice",
"www.medialit.org" => "The Center for Media Literacy",
"www.systemicpeace.org" => "The Center for Systemic Peace",
"www.cnas.org" => "Center for a New American Security",
"democraticmedia.org" => "The Center for Digital Democracy",
"dl.ifip.org" => "Centre pour la Communication Scientifique Directe",
"blog.centos.org" => "CentOS",
"www.centos.org" => "CentOS",
"tibet.net" => "Central Tibetan Administration",
"centricular.com" => "Centricular Ltd",
"corporateeurope.org" => "CEO",
"www.cepsa.com" => "Cepsa",
"computinged.wordpress.com" => "CER",
"indico.cern.ch" => "CERN",
"ceur-ws.org" => "CEUR",
"centerforinquiry.org" => "CFI",
"womeninjournalism.org" => "CFWIJ",
"www.cgchannel.com" => "CG Channel",
"america.cgtn.com" => "CGTN America",
"mathr.co.uk" => "Claude Heiland-Allen",
"blog.genesmindsmachines.com" => "Claus Wilke",
"clawd.rip" => "Clawd",
"claytonerrington.com" => "Clayton Errington",
"txt.cohere.com" => "Cohere",
"www.makeworld.space" => "Cole",
"www.catapultnorth.com" => "Colleen Kranz",
"colton.dev" => "Colton Voege",
"assembly.coe.int" => "Council of Europe",
"www.cfr.org" => "Council on Foreign Relations",
"www.whio.com" => "Cox Media Group",
"www.wpxi.com" => "Cox Media Group",
"chadaustin.me" => "Chad Austin",
"openpath.quest" => "Chad Whitacre",
"openpath.chadwhitacre.com" => "Chad Whitacre",
"www.chainup.com" => "Chainup Pte Ltd",
"ny.chalkbeat.org" => "Chalkbeat",
"www.cse.chalmers.se" => "Chalmers",
"www.change.org" => "Change.org PBC",
"changelog.com" => "Changelog",
"sg.channelasia.tech" => "Channel Asia",
"www.channable.com" => "Channable",
"podcast.chaoss.community" => "CHAOSS",
"chapel-lang.org" => "The Chapel Parallel Programming Language",
"kettering.org" => "Charles F Kettering Foundation",
"charlesleifer.com" => "Charles Leifer",
"fishbowl.pastiche.org" => "Charles Miller",
"www.charlespetzold.com" => "Charles Petzold",
"researchoutput.csu.edu.au" => "Charles Sturt University",
"www.charlestonchronicle.net" => "Charleston Chronicle",
"nullsweep.com" => "Charlie",
"www.charlieharrington.com" => "Charlie Harrington",
"lottia.net" => "Charlotte",
"ettolrach.com" => "Charlotte Ausel",
"chartscss.org" => "ChartCSS",
"baynews9.com" => "Charter Communications",
"spectrumlocalnews.com" => "Charter Communications",
"chatcontrol.dk" => "ChatControl DK",
"www.tri-cityherald.com" => "Chatham Asset Management",
"chawan.net" => "Chawan",
"cheapskatesguide.org" => "Cheapskates Guide",
"blog.checkpoint.com" => "Check Point Software Technologies Ltd",
"blog.chef.io" => "Chef",
"chelseatroy.com" => "Chelsea Troy",
"chemospec.org" => "Chemometrics and Spectroscopy Using R",
"chenhuijing.com" => "Chen HuiJing",
"www.cheribsd.org" => "CheriBSD",
"www.cherokeephoenix.org" => "Cherokee Phoenix",
"www.chess.com" => "Chess.com",
"chisenires.design" => "Chi Señires",
"www.chiark.greenend.org.uk" => "Chiark",
"chicagoreader.com" => "Chicago Reader",
"www.ccsentinel.com" => "Chicago Sentinal",
"chicago.suntimes.com" => "Chicago Sun Times",
"www.chicagotribune.com" => "Chicago Tribune",
"www.cdomagazine.tech" => "Chief Data Officer Magazine",
"chiefwordofficer.substack.com" => "Chief Word Officer",
"www.chillybin.co" => "Chillybin Web Design",
"chimera-linux.org" => "Chimera Linux",
"monkeywrench.email" => "Chinlock Holdings LLC",
"www.chinaaid.org" => "China Aid",
"chinadigitaltimes.net" => "China Digital Times",
"news.cgtn.com" => "China Global Television Network",
"www.chinalawblog.com" => "China Law Blog",
"huyenchip.com" => "Chip Huyen",
"coverclock.blogspot.com" => "Chip Overclock",
"chipsandcheese.com" => "Chips and Cheese",
"chir.ag" => "Chirag Mehta",
"blog.chiselstrike.com" => "ChiselStrike",
"blog.toast.cafe" => "Chloé Vulquin",
"two-wrongs.com" => "Chris",
"entropicthoughts.com" => "Chris",
"boffosocko.com" => "Chris Aldrich",
"chrisamico.com" => "Chris Amico",
"www.christopherbiscardi.com" => "Chris Biscardi",
"www.programmax.net" => "Chris Blume",
"blog.untrod.com" => "Chris Clark",
"chriscoyier.net" => "Chris Coyier",
"chrisdone.com" => "Chris Done",
"chrisdown.name" => "Chris Down",
"chrisenns.com" => "Chris Enns",
"www.dlp.rip" => "Chris Fenner",
"gomakethings.com" => "Chris Ferdinandi",
"www.chrisfarris.com" => "Chris Ferris",
"chrisglass.com" => "Chris Glass",
"www.chrisgregori.dev" => "Chris Gregori",
"chrishannah.me" => "Chris Hannah",
"codeandculture.uk" => "Chris Hannah",
"journeysthroughglass.net" => "Chris Hannah",
"chrishedges.substack.com" => "The Chris Hedges Report",
"chrisholdgraf.com" => "Chris Holdgraf",
"substack.techreflect.org" => "Chris Hynes",
"quii.dev" => "Chris James",
"heather.cafe" => "Chris Jefferson",
"lesiw.dev" => "Chris Lesiw",
"chrismaiorana.com" => "Chris Maiorana",
"chrismcleod.dev" => "Chris McLeod",
"chrisnager.com" => "Chris Nager",
"odonnellweb.com" => "Chris O'Donnnell",
"tuzz.tech" => "Chris Patuzzo",
"chrispenner.ca" => "Chris Penner",
"pickard.cc" => "Chris Pickard",
"chrispinnock.com" => "Chris Pinnock",
"phanes.silogroup.org" => "Chris Punches",
"www.stochasticlifestyle.com" => "Chris Rackauckas",
"thoughts.uncountable.uk" => "Chris Shaw",
"blog.sinjakli.co.uk" => "Chris Sinjakli",
"chriswarrick.com" => "Chris Warrick",
"nullprogram.com" => "Chris Wellons",
"chipx86.blog" => "Christian Hammond",
"blog.haschek.at" => "Christian Haschek",
"blog.hofstede.it" => "Christian Hofstede-Kuhn",
"www.christian.org.uk" => "Christian Institute",
"christiannews.net" => "Christian News",
"www.christianitydaily.com" => "Christianity Daily",
"www.christiantoday.com" => "Christian Today",
"www.christiandaily.com" => "Christian Daily International",
"www.christianpost.com" => "Christian Post",
"www.christianpost.com" => "Christian Post",
"christiano.dev" => "Christiano Anderson",
"www.artmann.co" => "Christoffer Artmann",
"indiepixel.de" => "Christoph Mütze",
"blog.brocas.org" => "Christophe Brocas",
"cjd.weblog.lol" => "Christopher Downer",
"fleetwood.dev" => "Christopher Fleetwood",
"chriskw.xyz" => "Chris K W",
"christitus.com" => "Chris Titus",
"zietlow.io" => "Chris Zietlow",
"chromeunboxed.com" => "Chrome Uboxed",
"www.chronicle.com" => "Chronicle Of Higher Education",
"www.chronicle-express.com" => "Chronicle Of Higher Education",
"www.chronicle.ng" => "ChronicleNG, Nigeria",
"www.chroniclesmagazine.org" => "Chronicles",
"chuck.is" => "Chuck Carroll",
"cagrimmett.com" => "Chuck Grimmett",
"churchtechtoday.com" => "Church Tech Today",
"www.churchtimes.co.uk" => "Church Times",
"www.cia.gov" => "CIA",
"en.cibercuba.com" => "CiberCuba",
"www.cicadamania.com" => "www.cicadamania.com",
"www.cinia.fi" => "Cinia",
"www.cioapplications.com" => "CIO Applications",
"www.cioinsight.com" => "CIO Insight",
"cioj.org" => "CIOJ",
"notes.volution.ro" => "Ciprian Dorin Craciun",
"www.circle.com" => "Circle Technology Services LLC",
"www.circle-lang.org" => "Circle-Lang",
"circleid.com" => "CircleID",
"www.circleid.com" => "CircleID",
"circuitcellar.com" => "Circuit Cellar",
"cis.org" => "CIS",
"www.cisa.gov" => "CISA",
"www.splunk.com" => "Cisco Systems Inc",
"talosintelligence.com" => "Cisco Systems Inc",
"news.cision.com" => "Cision News",
"www.cisomag.com" => "CISO Mag",
"cissar.com" => "CISSAR",
"citizenlab.ca" => "Citizen Lab",
"www.citizensforethics.org" => "Citizens For Ethics",
"citizix.com" => "Citizix",
"toronto.citynews.ca" => "City News CA",
"www.hel.fi" => "City of Helsinki",
"www.cityofpensacola.com" => "City of Pensacola",
"civicspacewatch.eu" => "Civic Space Watch",
"www.liberties.eu" => "Civil Libeties Union",
"civileats.com" => "Civil Eats",
"knowledge.csc.gov.sg" => "Civil Service College, Singapore",
"cadeproject.org" => "Civil Society Alliances for Digital Empowerment",
"blog.discourse.org" => "Civilized Discourse Construction Kit Inc",
"curia.europa.eu" => "CJEU",
"www.cjr.org" => "CJR",
"clarionproject.org" => "Clarion Project",
"www.classaction.org" => "Class Action",
"www.classicpress.net" => "ClassicPress",
"www.cleanenergywire.org" => "Clean Energy Wire",
"cleanuptheweb.org" => "Clean Up The Web",
"cleantechnica.com" => "CleanTechnica",
"community.clearlinux.org" => "Clear Linux OS",
"clearpathrobotics.com" => "Clearpath Robotics",
"blog.ensko.at" => "Clemens Koza",
"clemenswinter.com" => "Clemens Winter",
"www.cleveland.com" => "Cleveland",
"blog.clew.se" => "Clew",
"www.clickondetroit.com" => "Click On Detroit",
"cliffle.com" => "Cliff L Biffle",
"www.climatechangenews.com" => "Climate Change News",
"climatenewsnetwork.net" => "Climate News Network",
"climbtheladder.com" => "CLIMB",
"dev.clintonblackburn.com" => "Clinton Blackburn",
"bitcraftonline.com" => "Clockwork Labs Inc",
"www.closertotheedge.net" => "Closer to the Edge",
"cloudfour.com" => "Cloud Four Inc",
"blog.cloudflare.com" => "Cloudflare",
"www.cloudflare.com" => "Cloudflare",
"clousebrown.com" => "Clouse Brown PLLC",
"www.farms.com" => "CME",
"www.channelnewsasia.com" => "CNA",
"www.cnbctv18.com" => "CNBC",
"fm.cnbc.com" => "CNBC",
"www.cnbc.com" => "CNBC",
"www.cnbcafrica.com" => "CNBC",
"www.cnet.com" => "CNET",
"edition.cnn.com" => "CNN",
"lite.cnn.com" => "CNN",
"money.cnn.com" => "CNN",
"us.cnn.com" => "CNN",
"www.cnn.com" => "CNN",
"www.cnx-software.com" => "CNX Software",
"c2pa.org" => "Coalition for Content Provenance and Authenticity",
"www.cni.org" => "Coalition for Networked Information",
"www.coastaldigest.com" => "Coastal Digest",
"www.cockroachlabs.com" => "Cockroach Labs",
"coconuts.co" => "Coconuts",
"www.codastory.com" => "Coda Media Inc",
"codeahoy.com" => "Code Ahoy",
"code.likeagirl.io" => "Code Like A Girl",
"www.codedonut.com" => "Code Donut",
"blog.codemagic.io" => "Code Magic",
"code-maven.com" => "Code Maven",
"anonimno.codeberg.page" => "Codeberg",
"codeberg.org" => "Codeberg",
"blog.codeberg.org" => "Codeberg",
"codemanship.wordpress.com" => "Codemanship Ltd",
"coderlegion.com" => "Coder Legion",
"www.coiled.io" => "Coiled Computing",
"www.coindesk.com" => "Coin Desk",
"www.coin-operated.com" => "Coin Operated",
"www.coinerella.com" => "Coinerella",
"coinmarketcal.com" => "CoinMarketCal",
"cointelegraph.com" => "Cointelegraph",
"coldstreams.com" => "Cold Streams",
"colincogle.name" => "Colin Cogle",
"www.colincornaby.me" => "Colin Cornaby",
"cdevroe.com" => "Colin Devroe",
"www.colino.net" => "Colin Leroy-Mira",
"www.beatworm.co.uk" => "Colin M Strickland",
"colinwalker.blog" => "Colin Walker",
"collider.com" => "Collider",
"www.mcmillen.dev" => "Collin McMillen",
"boulderweekly.com" => "Colorado",
"coloradosun.com" => "Colorado",
"coloradosupremecourt.com" => "Colorado",
"www.courts.state.co.us" => "Colorado",
"www.greeleytribune.com" => "Colorado",
"leg.colorado.gov" => "Colorado General Assembly",
"www.coloradopolitics.com" => "Colorado Politics",
"www.cpr.org" => "Colorado Public Radio",
"www.columbian.com" => "The Columbian",
"eu.dispatch.com" => "Columbus Ohio",
"iowa.gotthefacts.org" => "Comes v. Microsoft: Case No. CL 82311",
"comicbook.com" => "Comic Book",
"boundingintocomics.com" => "Comics",
"comicss.art" => "ComiCSS",
"www.commoncause.org" => "Common Cause",
"www.commondreams.org" => "Common Dreams",
"www.commonsensemedia.org" => "Common Sense Media",
"www.commonwealmagazine.org" => "Commonweal Magazine",
"www.commonwealthclub.org" => "Commonweatlh Club",
"www.commonwealthfund.org" => "The Commonweatlh Fund",
"www.communia-association.org" => "Communia",
"www.news-gazette.com" => "Community Media Group",
"www.comparitech.com" => "Comparitech Ltd",
"blog.computationalcomplexity.org" => "Computational Complexity",
"www.computerconservationsociety.org" => "Computer Conservation Society",
"computerhistory.org" => "Computer History",
"softwarepreservation.computerhistory.org" => "Computer History Museum",
"www.computerhistory.org" => "Computer History Museum",
"www.folklore.org" => "Computer History Museum",
"www.softwarepreservation.org" => "Computer History Museum",
"www.computerweekly.com" => "Computer Weekly",
"www.computerworld.com" => "Computer World",
"www2.computerworld.co.nz" => "Computer World",
"www.computing.co.uk" => "Computing UK",
"confused.ai" => "Confused AI",
"concurrencyfreaks.blogspot.com" => "Concurrency Freaks",
"pitchfork.com" => "Condé Nast",
"www.vogue.com" => "Condé Nast",
"conduition.io" => "Conduition",
"www.ctpost.com" => "Conneticut Post",
"www.ctpublic.org" => "Conneticut Public",
"www.connexionfrance.com" => "The Connexion",
"connortumbleson.com" => "Connor Tumbleson",
"theconsensus.dev" => "Consensus Labs LLC",
"consequence.net" => "Consequence",
"www.conservation.org" => "Conservation International",
"www.conservationinstitute.org" => "Conservation Institute",
"www.conservativewoman.co.uk" => "Conservative Woman",
"console.dev" => "Console Dev Tools",
"www.braincells.com" => "Consolidated Braincells Inc",
"consortiumnews.com" => "Consortium News",
"clpblog.citizen.org" => "Consumer Law & Policy Blog",
"advocacy.consumerreports.org" => "Consumer Reports",
"innovation.consumerreports.org" => "Consumer Reports",
"www.consumerreports.org" => "Consumer Reports",
"opensource.contentauthenticity.org" => "Content Authenticity Intiative",
"conversationalist.org" => "Conversationalist",
"stack.convex.dev" => "Convex Inc",
"cooltechzone.com" => "Cool Tech Zone",
"cphpost.dk" => "Copenhagen Post",
"visitorservice.kk.dk" => "Copenhagen Visitor Service",
"www.copticsolidarity.org" => "Coptic Solidarity",
"copyrightlately.com" => "CopyrightLately",
"cordcuttersnews.com" => "Cord Cutters News",
"corecursive.com" => "CoRecursive",
"www.coreystephan.com" => "Corey Stephan",
"www.zotero.org" => "Corporation for Digital Scholarship",
"cpb.org" => "Corporation for Public Broadcasting",
"correctiv.org" => "Correctiv",
"corrode.dev" => "Corrode.dev",
"www.corsix.org" => "Corsix",
"craphound.com" => "Cory Doctorow",
"doctorow.medium.com" => "Cory Doctorow",
"pluralistic.net" => "CoryDoctorow",
"coryd.dev" => "Cory Dransfeldt",
"www.coryd.dev" => "Cory Dransfeldt",
"www.cosmopolitan.com" => "Cosmopolitan",
"coss.fi" => "COSS ry",
"ticotimes.net" => "Cost Rica",
"rm.coe.int" => "Council Of Europe",
"www.coe.int" => "Council Of Europe",
"www.counterpunch.org" => "Counter Punch",
"counterview.org" => "Counterview",
"couragefound.org" => "Courage Found",
"couriernewsroom.com" => "Courier Newsroom",
"www.courthousenews.com" => "Court House News",
"www.courtlistener.com" => "Court Listener",
"storage.courtlistener.com" => "Free Law Project",
"www.insideprivacy.com" => "Covington & Burling LLP",
"am.covestro.com" => "Covestro",
"www.coveware.com" => "Coveware",
"osteophage.dreamwidth.org" => "Coyote",
"osteophage.neocities.org" => "Coyote",
"www.coyotemedia.org" => "COYOTE Media Collective",
"coywolf.com" => "Coywolf LLC",
"api.docs.cpanel.net" => "cPanel",
"www.competitionpolicyinternational.com" => "CPI",
"cpj.org" => "CPJ",
"www.cpomagazine.com" => "CPO Mag",
"research.checkpoint.com" => "CPR",
"cracked.com" => "Cracked",
"www.cracked.com" => "Cracked",
"craftofcoding.wordpress.com" => "Craft Of Coding",
"www.craigabbott.co.uk" => "Craig Abbott",
"www.focalcurve.com" => "Craig Cook",
"furbo.org" => "Craig Hockenberry",
"craigmod.com" => "Craig Mod",
"www.craigmurray.org.uk" => "Craig Murray",
"www.chicagobusiness.com" => "Crain Communications Inc",
"crazystupidtech.com" => "Crazy Stupid Tech",
"minerva.crocs.fi.muni.cz" => "CRCS",
"headrush.typepad.com" => "Creating Passionate Users",
"www.creativeboom.com" => "Creative Boom Ltd",
"creativecommons.org" => "Creative Commons",
"www.cltampa.com" => "Creative Loafing Tampa Bay",
"technicshistory.com" => "Creatures of Thought",
"blog.cretaria.com" => "Cretaria",
"techreflect.org" => "TechReflect",
"www.crikey.com.au" => "Crickey",
"www.cringely.com" => "I Cringely",
"deadserious.beehiiv.com" => "I'm Dead Serious",
"www.destinationcrm.com" => "CRM Mag",
"www.crn.com" => "CRN",
"crookedtimber.org" => "Crooked Timber",
"crooksandliars.com" => "Crooks and Liars",
"www.crossover-eng.it" => "Crossover",
"www.crowdsupply.com" => "Crowd Supply",
"www.crowdstrike.com" => "CrowdStrike",
"www.crownpeak.com" => "Crownpeak Technology Inc",
"www.cps.gov.uk" => "Crown Prosecution Service UK",
"www.crucialtracks.org" => "Crucial Tracks ",
"cruncher.ch" => "Cruncher",
"www.crunchydata.com" => "Crunchy Data Solutions Inc",
"safecurves.cr.yp.to" => "Crypto",
"www.cryptomuseum.com" => "Crypto Museum",
"cryptonewsbtc.org" => "Crypto News BTC",
"cryptography.dog" => "Cryptography.doc OÜ",
"eprint.iacr.org" => "Cryptology ePrints Archive",
"cryptonews.com" => "Cryptonews",
"the-crypto-syllabus.com" => "The Crypto [sic] Syllabus",
"joyofcryptography.com" => "Cryptography",
"blog.cryptographyengineering.com" => "Cryptography Engineering",
"blog.cryptohack.org" => "Cryptohack",
"cryptomoneyteam.co" => "CryptoMoney Team",
"www.csa.gov.sg" => "CSA Singapore",
"docs.csc.fi" => "CSC",
"www.csc.fi" => "CSC",
"www.csis.org" => "CSIS",
"ezorigin.csmonitor.com" => "CS Monitor",
"www.csmonitor.com" => "CS Monitor",
"www.csoonline.com" => "CSO",
"cssday.nl" => "CSS Day",
"css-irl.info" => "CSS In Real Life",
"css-tricks.com" => "CSS Tricks",
"csvbase.com" => "CSVbase",
"carbontracker.org" => "CTI",
"calgary.ctvnews.ca" => "CTV News",
"kitchener.ctvnews.ca" => "CTV News",
"montreal.ctvnews.ca" => "CTV News",
"www.ctvnews.ca" => "CTV News",
"havanatimes.org" => "Cuba",
"cubepath.com" => "CubePath",
"cubiclenate.com" => "CubicleNate",
"cujo.com" => "CUJOAI",
"veilid.com" => "Cult Of The Dead Cow",
"www.cultofmac.com" => "Cult Of Mac",
"culturalpropertynews.org" => "Cultural Property News",
"crumplab.com" => "CUNY",
"cupalo.substack.com" => "Cupalo",
"curl.se" => "cURL",
"curling.io" => "Curling IO",
"www.currentaffairs.org" => "Current Affairs",
"curtmerrill.com" => "Curt Merrill",
"www.cvbj.biz" => "CVBJ",
"www.cxotoday.com" => "CXO Today",
"cyber-itl.org" => "Cyber Independent Testing Lab",
"www.cshub.com" => "Cyber Security Hub",
"cybershow.uk" => "The Cyber Show",
"cybercultural.com" => "Cybercultural",
"cybergeeks.tech" => "Cybergeeks",
"cybergibbons.com" => "Cybergibbons",
"cyberinsider.com" => "CyberInsider",
"cybrkyd.com" => "Cyberkyd",
"cybernews.com" => "Cybernews",
"cyberprawn.net" => "Cyberprawn",
"www.scmagazine.com" => "CyberRisk Alliance LLC",
"www.cybertec-postgresql.com" => "Cybertec PostgreSQL International GmbH",
"cybersecuritynews.com" => "Cyber Security News",
"cyber.dabamos.de" => "The Cyber VanguarThe Cyber Vanguard",
"cyble.com" => "Cyble Inc",
"thecyberexpress.com" => "Cyble Inc",
"cybleinc.com" => "Cyble Inc",
"cyclonedx.org" => "CycloneDX",
"cydstumpel.nl" => "Cyd Stumpel",
"www.cyentia.com" => "Cyentia Institute LLC",
"www.cynet.com" => "Cynet Security Ltd",
"franklywrite.com" => "Cynthia Franks",
"writethatblog.substack.com" => "Cynthia Dunlop",
"blog.cynthia.re" => "Cynthias Blog",
"blog.cyplo.dev" => "Cyryl Płotnicki",
"czterycztery.pl" => "Czterycztery",
"0xda.de" => "Dade",
"www.daemonology.net" => "Daemonology",
"www.daemonology.net" => "Daemonology",
"dagger.io" => "Dagger",
"www.daghammarskjold.se" => "DagHammarskjöld",
"dailycoin.com" => "Daily Coin",
"www.dailydetroit.com" => "Daily Detroit",
"www.dailydot.com" => "Daily Dot",
"www.dailyherald.com" => "Daily Herald",
"dailyhive.com" => "Daily Hive",
"dailyinfographic.com" => "Daily Infographic",
"www.dailykos.com" => "Daily Kos",
"www.dailymail.co.uk" => "Daily Mail",
"www.dailymaverick.co.za" => "Daily Maverick",
"www.dailyo.in" => "Daily O",
"dailypost.ng" => "Daily Post",
"www.dailyrecord.co.uk" => "Daily Record",
"www.dailysabah.com" => "Daily Sabah",
"www.dailystar.co.uk" => "Daily Star",
"www.dailytarheel.com" => "Daily Tar Heel",
"dailytimes.com.pk" => "Daily Times",
"www.dailywire.com" => "Daily Wire",
"www.dailytrib.com" => "DailyTrib",
"www.dallasnews.com" => "Dallas News",
"dallincrump.com" => "Dallin Crump",
"the-dam.org" => "The Dam",
"www.damemagazine.com" => "Dame Media LLC",
"www.damiencharlotin.com" => "Damien Charlotin",
"desfontain.es" => "Damien Desfontaines",
"dmathieu.com" => "Damien Mathieu",
"www.damnsmalllinux.org" => "Damn Smalll Linux",
"blog.djhaskin.com" => "Dan",
"overreacted.io" => "Dan Abramov",
"www.bricklin.com" => "Dan Bricklin",
"www.bookstackapp.com" => "Dan Brown",
"danburzo.ro" => "Dan Cătălin Burzo",
"www.dancowell.com" => "Dan Cowell",
"www.erat.org" => "Dan Erat",
"blog.sunfishcode.online" => "Dan Gohman",
"geer.tinho.net" => "Dan Geer",
"hudlow.org" => "Dan Geer",
"dan.langille.org" => "Dan Langille",
"danluu.com" => "Dan Luu",
"www.danlynch.org" => "Dan Lynch",
"danmackinlay.name" => "Dan MacKinlay",
"mcfunley.com" => "Dan McKinley",
"www.danmcquillan.org" => "Dan McQuillan",
"letterstoanewdeveloper.com" => "Dan Moore",
"blog.nem.ec" => "Dan Nemec",
"danq.me" => "Dan Q",
"dansinker.com" => "Dan Sinker",
"blog.danslimmon.com" => "Dan Slimmon",
"sno.ws" => "Dan Snow",
"danabyerly.com" => "Dana Byerly",
"www.danfoss.com" => "Danfoss",
"www.ctrl.blog" => "Daniel Aleksandersen",
"www.andrlik.org" => "Daniel Andrlik",
"cr.yp.to" => "Daniel J. Bernstein,",
"blog.canta.com.ar" => "Daniel Cantarín",
"danielbmarkham.com" => "Daniel B Markham",
"blog.daniel-beskin.com" => "Daniel Beskin",
"danieldk.eu" => "Daniël de Kok",
"dgross.ca" => "Daniel P Gross",
"danielcompton.net" => "Daniel Compton",
"danieldelaney.net" => "Daniel De Laney",
"code.dblock.org" => "Daniel Doubrovkine",
"destevez.net" => "Daniel Estévez",
"lipu.dgold.eu" => "Daniel Goldsmith",
"theorangeduck.com" => "Daniel Holden",
"danielchasehooper.com" => "Daniel Hooper",
"chown.me" => "Daniel Jakots",
"bitsplitting.org" => "Daniel Jalkut",
"blog.danieljanus.pl" => "Daniel Janus",
"daniel-lange.com" => "Daniel Lange",
"lemire.me" => "Daniel Lemire",
"www.daniloaz.com" => "Daniel López Azañ",
"danielmiessler.com" => "Daniel Miessler",
"daniel.industries" => "Daniel Miller",
"www.daniel.industries" => "Daniel Miller",
"nechtan.io" => "Daniel Nechtan",
"www.danielpipes.org" => "Daniel Pipes",
"danielpocock.com" => "Daniel Pocock",
"danschmid.de" => "Daniel Schmid",
"daniel.haxx.se" => "Daniel Stenberg",
"lists.haxx.se" => "Daniel Stenberg",
"bagder.github.io" => "Daniel Stenberg",
"dxuuu.xyz" => "Daniel Xu",
"danilafe.com" => "Daniel Fedorin",
"ficd.sh" => "Daniel Fichtinger",
"goodbye.domains" => "Danielle Baskin",
"redeem-tomorrow.com" => "Danilo Campos",
"www.dannyguo.com" => "Danny Guo",
"blog.dmcc.io" => "Danny McClelland",
"www.oblomovka.com" => "Danny O'Brien",
"dannyvankooten.com" => "Danny van Kooten",
"blog.lambda.cx" => "Dante Catalfamo",
"danterobinson.dev" => "Dante Robinson",
"bigdanzblog.wordpress.com" => "DanTheMan",
"crumbles.blog" => "Daphne Preston-Kendal",
"darekkay.com" => "Darek Kay",
"www.darkreading.com" => "Dark Reading",
"blog.darksky.net" => "Dark Sky",
"rup12.net" => "Darko Mesaroš",
"www.darktable.org" => "Darktable",
"darrenburns.net" => "Darren Burns",
"darrengoossens.wordpress.com" => "Darren Goossens",
"notes.darrenhester.com" => "Darren Hester",
"dashbit.co" => "Dashbit",
"datasociety.net" => "Data & Society",
"www.databreaches.net" => "Data Breaches",
"www.databreachtoday.com" => "Data Breach Today",
"www.dataprotection.ie" => "Data Protection Commission Ireland",
"datasciencetut.com" => "Data Science Tutorials",
"dtinit.org" => "Data Transfer Initiative",
"thedatascientist.com" => "The Data Scientist",
"socviz.co" => "Data Visualization",
"datapopalliance.org" => "Data-Pop Alliance",
"databasearchitects.blogspot.com" => "Databases",
"databento.com" => "CME Group Inc",
"www.datacenterdynamics.com" => "DataCenter Dynamics",
"datageeek.com" => "DataGeeek",
"www.datanami.com" => "Datanami",
"dataschool.com" => "Data School",
"datastation.multiprocess.io" => "Data Station",
"dataswamp.org" => "Data Swamp",
"www.wgmd.com" => "DataTech Digital Inc",
"datto.engineering" => "Datto",
"airlied.blogspot.com" => "Dave Airlie",
"blog.dave.tf" => "Dave Anderson",
"www.dave.tf" => "Dave Anderson",
"davebarry.substack.com" => "Dave Barry",
"www.bennettnotes.com" => "Dave Bennett",
"s3kshun8.games" => "Dave Corley",
"tiobe.perlhacks.com" => "Dave Cross",
"catskull.net" => "Dave DeGraw",
"davedelong.com" => "Dave DeLong",
"ratfactor.com" => "Dave Gauer",
"www.johnsto.co.uk" => "Dave Johnston",
"davelane.nz" => "Dave Lane",
"davepeck.org" => "Dave Peck",
"daverupert.com" => "Dave Rupert",
"dave.recoil.org" => "Dave Scott",
"davestewart.co.uk" => "Dave Stewart",
"intuitivestories.com" => "Dave Taylor",
"forkingmad.blog" => "David",
"www.davidtinapple.com" => "David A Tinapple",
"dwheeler.com" => "David A Wheeler",
"davidamos.dev" => "David Amos",
"davidbau.com" => "David Bau",
"davidben.net" => "David Benjamin",
"davidbessis.substack.com" => "David Bessis",
"www.da.vidbuchanan.co.uk" => "David Buchanan",
"dbushell.com" => " David Bushell",
"davidcel.is" => " David Celis",
"betterwithout.ai" => "David Chapman",
"crawshaw.io" => "David Crawshaw",
"darn.es" => "David Darnes",
"blog.davidedmundson.co.uk" => "David Edmundson",
"blog.dnmfarrell.com" => "David Farrell",
"ironicsans.ghost.io" => "David Friedman",
"davidgerard.co.uk" => "David Gerard",
"dgerrells.com" => "David Gerrells",
"davidgraeber.org" => "David Graeber",
"notes.1705.net" => "David H",
"davidhamann.de" => "David Hamann",
"davidhampgonsalves.com" => "David Hamp-Gonsalves",
"dhh.dk" => "David Heinemeier Hansson",
"davidjrogersftw.com" => "David J Rogers",
"dfarq.homeip.net" => "David L Farquhar",
"dgl.cx" => "David Mead",
"davidjohnmead.com" => "David Mead",
"blog.davemo.com" => "David Mosher",
"www.djmurphy.net" => "David Murphy",
"www.dnorth.net" => "David North",
"davidoks.blog" => "David Oks",
"freebsd.uw.cz" => "David Pasek",
"pogueman.substack.com" => "David Pogue",
"www.davidrevoy.com" => "David Revoy",
"www.volts.wtf" => "David Roberts",
"blog.dshr.org" => "David Rosenthal",
"drmaciver.substack.com" => "David R MacIver",
"thecrow.uk" => "David Rutland",
"experimentalworks.net" => "David Soria Parra",
"www.macsparky.com" => "David Sparks",
"www.david-smith.org" => "David Smith",
"www.davd.io" => " David Stapp",
"davidsuzuki.org" => "David Suzuki Foundation",
"davidltran.com" => "David Tran",
"davidwalsh.name" => "David Walsh",
"davidyat.es" => "David Yates",
"dayvster.com" => "Dayvi Schuster",
"www.moczadlo.com" => "Dawid Moczadło",
"herald.dawn.com" => "Dawn Media",
"images.dawn.com" => "Dawn Media",
"www.dawn.com" => "Dawn Media",
"www.daytondailynews.com" => "Dayton Daily News",
"spreadprivacy.com" => "DDG",
"deadline.com" => "Deadline",
"www.deadlinedetroit.com" => "Deadline Detroit",
"www.deanwesleysmith.com" => "Dean Wesley Smith",
"www.deathpenaltyproject.org" => "Death Penalty Project",
"bits.debian.org" => "Debian",
"forums.debian.net" => "Debian",
"lists.debian.org" => "Debian",
"wiki.debian.org" => "Debian",
"www.debian.org" => "Debian",
"thedebrief.org" => "The Debrief",
"www.deccanchronicle.com" => "Deccan Chronicle",
"www.deccanherald.com" => "Deccan Herald",
"dt.gl" => "Decentralize Today",
"decisiondata.org" => "Decision Data",
"www.telecomtv.com" => "Decisive Media Limited",
"vale.rocks" => "Declan Chidlow",
"declassifieduk.org" => "Declassified UK",
"decoded.legal" => "Decoded Legal",
"decrypt.co" => "Decrypt",
"www.dedoimedo.com" => "Dedoimedo",
"defector.com" => "Defector",
"tdhj.org" => "The Defence Horizon Journal",
"www.defensenews.com" => "Defense News",
"defenceweb.co.za" => "Defence Web",
"www.defenceweb.co.za" => "Defence Web",
"www.defenseone.com" => "Defense One",
"www.deimos.io" => "Deimos Cloud",
"www.azabani.com" => "Delan Azabani",
"www.delawarepublic.org" => "Delaware Republic",
"www.delcotimes.com" => "Delco Times",
"www.autoblog.com" => "Arena Media Brands LLC",
"delishably.com" => "Arena Media Brands LLC",
"demandprogress.org" => "Demand Progress",
"dawnmena.org" => "Democracy for the Arab World Now",
"www.democracydocket.com" => "Democracy Docket",
"www.democracynow.org" => "Democracy Now",
"www.democratsabroad.org" => "Democrats Abroad",
"www.open-std.org" => "Technical University of Denmark",
"denodell.com" => "Den Odell",
"techtrenches.dev" => "Denis",
"easyperf.net" => "Denis Bakhvalov",
"dlants.me" => "Denis Lantsman",
"denise.dreamwidth.org" => "Denise",
"politiken.dk" => "Politiken, DK",
"denmarkification.com" => "Denmarkification",
"hookrace.net" => "Dennis Felsing",
"yurichev.com" => "Dennis Yurichev",
"deno.com" => "Deno Land Inc",
"deployer.org" => "The Deployer Times",
"denverite.com" => "Denver",
"www.denverpost.com" => "Denver",
"www.thedenverchannel.com" => "Denver",
"www.westword.com" => "Denver",
"denvergazette.com" => "Denver Gazette",
"denyspoltorak.medium.com" => "Denys Poltorak",
"metapatterns.io" => "Denys Poltorak",
"blog.deref.io" => "Deref",
"derekkedziora.com" => "Derek Kędziora",
"sive.rs" => "Derek Sivers",
"sivers.org" => "Derek Sivers",
"www.derekthompson.org" => "Derek Thompson",
"thescoop.org" => "Derek Willis",
"blog.desdelinux.net" => "Desde Linux",
"www.deseret.com" => "Deseret News",
"desertification.wordpress.com" => "Desertification",
"www.designboom.com" => "Designboom",
"www.desmogblog.com" => "DeSmog",
"www.desmog.com" => "DeSmog",
"labs.detectify.com" => "DetectifyLabs",
"www.onedetroitpbs.org" => "Detroit Public TV",
"www.dw.com" => "Deutsche Welle",
"devclass.com" => "Dev Class",
"dev.to" => "DEV Community",
"stack.int.mov" => "Dev Stack",
"dev.ua" => "Dev Ukraine",
"blog.devgenius.io" => "Dev Genius",
"www.artificialintelligencemadesimple.com" => "Devansh",
"devd.me" => "Devdatta Akhawe",
"www.devdiscourse.com" => "Dev Discourse",
"devansh.bearblog.dev" => " Devansh Batham",
"www.developer-tech.com" => "Developer Tech",
"www.devever.net" => "Devever",
"www.devex.com" => "Devex",
"www.devseccon.com" => "Dev Sec Con",
"devicetests.com" => "DeviceTests",
"devondundee.com" => "Devon Dundee",
"devuan.org" => "Devuan",
"files.devuan.org" => "Devuan",
"www.devuan.org" => "Devuan",
"dev1galaxy.org" => "Devuan",
"www.dfs.ny.gov" => "DFS NY",
"www.dhakatribune.com" => "Dhaka Tribune",
"soatok.blog" => "Dhole Moments",
"www.dhs.gov" => "DHS",
"www.diabettech.com" => "Diabet Tech",
"dianne.skoll.ca" => "Dianne Skoll",
"dianerehm.org" => "American University Radio",
"current.org" => "American University School of Communication",
"blog.didierstevens.com" => "Didier Stevens",
"flameeyes.blog" => "Diego Elio Pettenò",
"diem25.org" => "DiEM25",
"dieter.plaetinck.be" => "Dieter Plaetinck",
"digiday.com" => "Digi Day",
"www.modernretail.co" => "Digi Day",
"www.digikey.co.uk" => "Digi-key Electronics",
"www.digikey.com" => "Digi-key Electronics",
"www.winxdvd.com" => "Digiarty Software",
"www.digikam.org" => "digiKam",
"diginomica.com" => "Diginomica",
"www.digit.in" => "Digit.in",
"www.digitalcameraworld.com" => "Digital Camera World",
"digitalcontentnext.org" => "Digital Content Next",
"eu.detroitnews.com" => "Digital First Media",
"www.detroitnews.com" => "Digital First Media",
"dfrlab.org" => "Digital Forensic Research Lab",
"www.digitalhealth.net" => "Digital Health",
"www.digitaljournal.com" => "Digital Journal",
"digital-markets-act.ec.europa.eu" => "The Digital Markets Act",
"www.digitalmars.com" => "Digital Mars D",
"www.digitalmusicnews.com" => "Digital Music News",
"www.digitalocean.com" => "Digital Ocean",
"www.dpreview.com" => "Digital Photography Review",
"digitalprivacy.news" => "Digital Privacy News",
"www.digitaltrends.com" => "Digital Trends",
"www.oneindia.com" => "Digitech Media Pvt Ltd",
"dillo-browser.org" => "Dillo Browser",
"dillonmok.com" => "Dillon Mok",
"notes.secretsauce.net" => "Dima Kogan",
"ezhik.jp" => "Dima Konev",
"dimamoroz.com" => "Dima Moroz",
"dinesh.wiki" => "Dinesh Gowda",
"www.spinellis.gr" => "Diomidis Spinellis",
"dirk.eddelbuettel.com" => "Dirk Eddelbuettel",
"dirkriehle.com" => "Dirk Riehle",
"dismalswampwelcomecenter.com" => "Dismal Swamp Canal Welcome Center",
"discernibleinc.com" => "Discernible Inc",
"disconnect.blog" => "Disconnect.blog",
"discord.com" => "Discord",
"status.discordapp.com" => "Discord",
"www.discourseblog.com" => "Discourse Blog",
"www.disruptionist.com" => "Disruptionist",
"disroot.org" => "Disroot",
"copyright.gov" => "US Copyright Office",
"www.copyright.gov" => "US Copyright Office",
"www.consumerfinance.gov" => "US Consummer Financial Protection Bureau",
"www.cafc.uscourts.gov" => "US Court of Appeals for the Federal Circuit",
"www.opn.ca6.uscourts.gov" => "US Court of Appeals, 6th Circuit",
"cdn.ca9.uscourts.gov" => "US Court of Appeals, 9th Circuit",
"www.ca9.uscourts.gov" => "US Court of Appeals, 9th Circuit",
"media.cadc.uscourts.gov" => "US Court of Appeals, DC Circuit",
"www.cadc.uscourts.gov" => "US Court of Appeals, D C Circuit",
"www.govinfo.gov" => "US Government Publishing Office",
"www.dissentmagazine.org" => "Dissent Magazine",
"distrowatch.com" => "Distro Watch",
"shortdiv.com" => "Divya",
"www.diyphotography.net" => "DIY Phototgraphy",
"diziet.dreamwidth.org" => "Diziet",
"qmacro.org" => "DJ Adams",
"blog.cr.yp.to" => "DJ Bernstein",
"viewpoints.dji.com" => "DJI",
"www.linuxtechmore.com" => "Djalel Oukid",
"fwslc.blogspot.com" => "DL Wicksell",
"dbohdan.com" => "D Bohdan",
"www.dgriffinjones.com" => "D Griffin Jones",
"dlang.org" => "D Lang",
"www.dcrainmaker.com" => "DC Rainmaker",
"extra.ie" => "DMG Media",
"dkb.blog" => "Dmitri Brereton",
"chshersh.com" => "Dmitrii Kovanikov",
"whynot.fail" => "Dimitris Zervas",
"dmitrybrant.com" => "Dmitry Brant",
"zine.dev" => "Dmitry Chestnykh",
"dmitryfrank.com" => "Dmitry Frank",
"dmitry.gr" => "Dmitry Grinberg",
"dolzhenko.me" => "Dmitry Dolzhenko",
"dbarabashh.com" => "Dmytro Barabash",
"dn42.cc" => "DN42",
"www.dnaindia.com" => "DNA India",
"www.dnalounge.com" => "DNA Lounge",
"blog.darknedgy.net" => "DnE",
"root-servers.org" => "DNS",
"www.dns0.eu" => "DNS0.eu",
"lists.thekelleys.org.uk" => "DNSmasq",
"www.techzine.eu" => "Dolphin Publications B V",
"doc.searls.com" => "Doc Searls",
"docseuss.medium.com" => "Doc Burford",
"blog.dochia.dev" => "Dochia",
"s3.documentcloud.org" => "Document Cloud",
"blog.documentfoundation.org" => "Document Foundation",
"wiki.documentfoundation.org" => "Document Foundation",
"dlvhdr.me" => "Dolev Hadar",
"domainnamewire.com" => "Domain Namewire",
"www.domaintools.com" => "DomainTools",
"blog.domenic.me" => "Domenic Denicola",
"freeston.me" => "Dominic Freeston",
"lostfocus.de" => "Dominik Schwind",
"dominotheory.com" => "Domino Theory",
"www.donaldedavis.com" => "Don Davis",
"blog.zgp.org" => "Don Marti",
"www.donnfelker.com" => "Donn Felker",
"doisinkidney.com" => "Donnacha Oisín Kidney",
"dontextraditeassange.com" => "Don't Extradite Assange",
"www.dotcom.press" => "Dot Com Press LLC",
"dotesports.com" => "Dot Esports",
"www.dotmed.com" => "Dot Med",
"dotsrc.org" => "Dotsrc",
"doublefree.dev" => "Double Free Dev",
"dougbelshaw.com" => "Doug Bellshaw",
"www.downtowndougbrown.com" => "Doug Brown",
"doug.pub" => "Doug Jones",
"dgsq.net" => "Doug Square",
"softwaredoug.com" => "Doug Turnbull",
"dougallj.wordpress.com" => "Dougall J",
"archive.rushkoff.com" => "Douglas Rushkoff",
"www.downtoearth.org.in" => "Down to Earth",
"downtimeproject.com" => "Downtime Project",
"dpk.land" => "DPK.land",
"www.digitalresearch.biz" => "DR",
"chainsawriot.com" => "Dr Chung-hong Chan",
"leancrew.com" => "Dr Drang",
"drmollytov.bearblog.dev" => "Dr molly tov",
"wiki.dragino.com" => "Dragino Technology Company, Ltd",
"lists.dragonflybsd.org" => "DragonFly BSD",
"www.dragonflydigest.com" => "DragonFly BSD Digest",
"dram.page" => "Dramforever",
"www.dremeljunkie.com" => "DremelJunkie",
"openmoonray.org" => "DreamWorks Animation LLC",
"www.dbreunig.com" => "Drew Breunig",
"theprogressivecio.com" => "Drew D Saur",
"drewdevault.com" => "Drew DeVault",
"drewsh.com" => "Drew Jose",
"blog.drewolson.org" => "Drew Olson",
"drew.shoes" => "Drew Schuster",
"drexel.edu" => "Drexel University",
"droidgazette.com" => "DroidGazzette",
"www.thedronegirl.com" => "The Drone Girl",
"diydrones.com" => "Drones",
"dronedj.com" => "Drones",
"blog.dropbox.com" => "Dropbox",
"drwebdomain.blog" => "DrWeb",
"www.dsogaming.com" => "DSOG",
"szoftveralapcsomag.hu" => "DSSP",
"distincttoday.net" => "DT",
"dt.iki.fi" => "DT",
"dtrace.org" => "DTrace",
"duckalignment.academy" => "Duck Alignment Academy",
"duckdb.org" => "DuckDB Foundation",
"ducklake.select" => "DuckDB Foundation",
"duncanlock.net" => "Duncan Lock",
"duo.com" => "Duo",
"0xdstn.site" => "Dustin",
"dustinknopoff.dev" => "Dustin Knopoff",
"pa0rwe.nl" => "Dutch Amateur Radio Station PA0RWE",
"www.dutchnews.nl" => "Dutch News",
"www.duvarenglish.com" => "duvaR",
"www.lafoo.com" => "Dwayne Lafleur",
"dylan.gr" => "Dylan Araps",
"dylanbeattie.net" => "Dylan Beattie",
"www.dylanpaulus.com" => "Dylan Paulus",
"dylanatsmith.com" => "Dylan Smith",
"lists.dyne.org" => "Dyne",
"new.dyne.org" => "Dyne",
"dys2p.com" => "Itermann Wansing GbR",
"dzackgarza.com" => "DZack Garza",
"dzone.com" => "DZone",
"eblong.com" => "E-Blong",
"chiefio.wordpress.com" => "E M Smith",
"eamon.wiki" => "Eamon Wiki",
"text.eapl.mx" => "EAPL.mx",
"earthjustice.org" => "Earth Justice",
"earthly.dev" => "Earthly",
"earth.org" => "EarthOrg",
"earthsky.org" => "EarthSky",
"www.eastidahonews.com" => "EastIdahoNews.com LLC",
"eaton-works.com" => "Eaton Works",
"www.libreture.com" => "EBooks",
"www.ebu.ch" => "EBU",
"www.echo-news.co.uk" => "Echo News",
"eclecticlight.co" => "Eclectic Light Company",
"www.eclipse.org" => "Eclipse Foundation",
"mosquitto.org" => "Eclipse Mosquitto",
"eclypsium.com" => "Eclypsium",
"www.eco-business.com" => "Eco-Business",
"www.ecommercetimes.com" => "Ecommerce",
"www.econtalk.org" => "Econlib Inc",
"www.epi.org" => "Economic Policy Institute",
"economist.com.na" => "Economist",
"www.ecowatch.com" => "EcoWatch",
"www.ecstuff4u.com" => "ECStuff4U",
"www.technewsworld.com" => "ECT News Network Inc",
"www.britannica.com" => "Encyclopedia Britannica",
"www.theenergymix.com" => "Energy Mix Productions Inc",
"lightbytes.es.net" => "Energy Sciences Network",
"www.enterprisedb.com" => "EnterpriseDB Corporation",
"edps.europa.eu" => "EDPS",
"civicrm.edri.org" => "EDRI",
"edri.org" => "EDRI",
"www.edgrochowski.com" => "Ed Grochowski",
"kellett.im" => "Ed Kellett",
"www.wheresyoured.at" => "Ed Zitron",
"www.editorandpublisher.com" => "Editor and Publisher",
"blog.evacchi.dev" => "Edoardo Vacchi",
"edsource.org" => "EdSource",
"sizovs.net" => "Eduards Sizovs",
"edwardbetts.com" => "Edward Betts",
"hasbrouck.org" => "Edward Hasbrouck",
"blog.edward-li.com" => "Edward Li",
"blog.edwardloveall.com" => "Edward Loveall",
"edwardsnowden.substack.com" => "Edward Snowden",
"files.eric.ed.gov" => "Education Resources Information Center",
"eric.ed.gov" => "Education Resources Information Center",
"www.edweek.org" => "EducationWeek",
"theta.eu.org" => "Eeeeeta",
"www.eejournal.com" => "EE Journal",
"eerielinux.wordpress.com" => "Eerie Linux",
"news.err.ee" => "Eesti Rahvusringhääling",
"iot.eetimes.com" => "EE Times",
"www.eetimes.com" => "EE Times",
"www.eetimes.eu" => "EE Times",
"evangelicalfocus.com" => "EF",
"atlasofsurveillance.org" => "EFF",
"act.eff.org" => "EFF",
"coveryourtracks.eff.org" => "EFF",
"toruniversity.eff.org" => "EFF",
"w2.eff.org" => "EFF",
"www.eff.org" => "EFF",
"www.effectiveperlprogramming.com" => "The Effective Perler",
"eblog.fly.dev" => "Efron Licht",
"samizdat.dev" => "Egor Kovetskiy",
"pages.egress.com" => "Egress Software Technologies Ltd",
"www.egress.com" => "Egress Software Technologies Ltd",
"www.egypttoday.com" => "Egypt Today",
"emmahumphreys.org" => "EHMP",
"ehrintelligence.com" => "EHR",
"people.inf.ethz.ch" => "Eidgenössische Technische Hochschule Zürich",
"www.einnews.com" => "EIN Presswire",
"www.eisfunke.com" => "Eisefunke",
"www.ejinsight.com" => "EJI Insight",
"www.ekioh.com" => "Ekioh",
"www.ekora.io" => "EKORA",
"eldred.fr" => "Eldred Habert",
"blog.eldrid.ge" => "Eldridge Alexander",
"electrek.co" => "Electrek",
"electricliterature.com" => "Electric Lit",
"www.electricvehiclesnews.com" => "Electric Vehicles News",
"www.electrive.com" => "Electrive",
"www.rs-online.com" => "Electrocomponents PLC",
"electrodacus.com" => "ElectroDacus",
"www.electronicdesign.com" => "Electronic Design",
"www.electronicsweekly.com" => "Electronics Weekly",
"old.efn.no" => "Elektronisk Forpost Norge",
"dagster.io" => "Elementl Inc",
"eli.thegreenplace.net" => "Eli Bendersky",
"billauer.se" => "Eli Billauer",
"eli.li" => "Eli Mellen",
"ezhart.com" => "Elija Z Hart",
"element.io" => "Element",
"edw.is" => "Elias Daler",
"blog.dhsdevelopments.com" => "Elias Mårtenson",
"www.elinux.co.in" => "ELinux",
"elisehe.in" => "Elise Hein",
"www.eliseomartelli.it" => "Eliseo Martelli",
"elixir-lang.org" => "The Elixir Team",
"www.elixir-finland.org" => "ELIXIR",
"www.elysian.press" => "Elle Griffin",
"www.elliotcsmith.com" => "Elliot C Smith",
"www.econotimes.com" => "Elmin Media",
"eloydegen.com" => "Eloy Degen",
"english.elpais.com" => "El País",
"elpais.com" => "El País",
"elronnd.net" => "Elron ND",
"european-alternatives.eu" => "European Alternatives",
"www.acea.auto" => "The European Automobile Manufacturers’ Association",
"www.echr.coe.int" => "European Court of Human Rights",
"grandparentsforclimate.eu" => "European Grandparents for Climate",
"cdn-europeanmovementeu.b-cdn.net" => "European Movement Internationl",
"www.ombudsman.europa.eu" => "European Ombudsman",
"epd.eu" => "European Partnership for Democracy",
"europeanpurpose.com" => "European Purpose",
"www.esa.int" => "European Space Agency",
"www.ema.europa.eu" => "EMA",
"emacsconf.org" => "EmacsConf",
"ember-energy.org" => "Ember Energy Research CIC",
"www.emergency-live.com" => "Emergency Live",
"www.emerald.com" => "Emerald Publishing Ltd",
"emerg-in.co.uk" => "Emerging Risks",
"emaggiori.com" => "Emmanuel Maggiori",
"emilkowal.ski" => "Emil Kowalski",
"crisal.io" => " Emilio Cobos Álvarez ",
"emilymstark.com" => "Emily M Stark",
"www.emsisoft.com" => "Emisoft Ltd",
"www.en24.news" => "EN24 News",
"endof10.org" => "End of 10",
"endsoftwarepatents.org" => "End Software Patents",
"wiki.endsoftwarepatents.org" => "End Software Patents",
"www.microgridknowledge.com" => "Endeavor Business Media LLC",
"www.securityinfowatch.com" => "Endeavor Business Media LLC",
"forum.endeavouros.com" => "EndeavourOS",
"www.endnotes.net" => "Endnotes",
"www.endorlabs.com" => "Endor Labs",
"www.enea.com" => "Enea",
"www.pv-magazine.com" => "Energy",
"www.energystar.gov" => "Energy Star",
"enews.com.ng" => "Enews Nigeria",
"www.engadget.com" => "Engadget",
"engineerzero.blog" => "Engineer Zero",
"www.englishpen.org" => "English Pen",
"blog.yossarian.net" => "Eno Such",
"www.engprax.com" => "Engprax Ltd",
"enterprisersproject.com" => "Enterprisers Project",
"www.enterprisesecuritytech.com" => "Enterprise Security Tech",
"enterprisetalk.com" => "Enterprise Talk",
"ew.com" => "Entertainment Weekly",
"www.entrepreneur.com" => "Entrepeneur",
"www.entropicengineering.com" => "Entropic Engineering",
"entropytown.com" => "EntropyTown",
"env.fail" => "Env.Fail",
"www.environment911.org" => "Environment",
"www.theearthneedslove.com" => "Environment",
"business.edf.org" => "Environmental Defense Fund",
"www.ewg.org" => "Environmental Working Group",
"www.epaoig.gov" => "EPA",
"www.epa.gov" => "EPA",
"epic.org" => "EPIC",
"epicenter.works" => "epicenter.works",
"www.epicgames.com" => "Epic Games",
"www.europeanpharmaceuticalreview.com" => "EPR",
"www.tradesecretsandemployeemobility.com" => "Epstein Becker & Green, PC",
"www.equaltimes.org" => "Equal Times",
"ejona.ersoft.org" => "Eric Anderson",
"ericwbailey.design" => "Eric Bailey",
"ericwbailey.website" => "Eric Bailey",
"ericdaigle.ca" => "Eric Daigle",
"bloi.ericgoldman.org" => "Eric Goldman",
"alien.slackbook.org" => "Eric Hameleers",
"macadie.info" => "Eric MacAdie",
"www.mostlypython.com" => "Eric Matthes",
"erikmcclure.com" => "Eric McClure",
"ericphanson.com" => "Eric P Hanson",
"pauley.me" => "Eric Pauley",
"www.pement.org" => "Eric Pement",
"catb.org" => "Eric S Raymond",
"esr.ibiblio.org" => "Eric S Raymond",
"educatedguesswork.org" => "Eric Rescorla",
"ericbsd.com" => "Eric Turgeon",
"ericmwalk.blog" => "Eric Walker",
"mcuoneclipse.com" => "Erich Styger",
"erikaker.com" => "Erik Aker",
"erikbern.com" => "Erik Bernhardsson",
"techgnosis.com" => "Erik Davis",
"daedtech.com" => "Erik Dietrich",
"erikjohannes.no" => "Erik Johannes Husom",
"erik.itland.no" => "Erik Itland",
"ewintr.nl" => "Erik Wintr",
"erikarow.land" => "Erika Rowland",
"erinkissane.com" => "Erin Kissane",
"blog.erlend.sh" => "Erlend Sogge Heggen",
"blog.erlang.org" => "Erlang",
"www.erlang.org" => "Erlang",
"www.erlang-solutions.com" => "Erlang Solutions Ltd",
"garba.org" => "Ernesto Garbarino",
"blog.erratasec.com" => "Errata Security",
"ersei.net" => "Ersei",
"ergo.chat" => "Ergo IRC Chat Server",
"www.esecurityplanet.com" => "eSecurity Planet",
"hacks.esar.org.uk" => "Esar",
"www.eset.com" => "ESET spol s r o",
"eshelyaron.com" => "Eshel Yaron",
"hexos.com" => "Eshtek Inc",
"esportsinsider.com" => "ESI Media Inc",
"blog.zerodogg.org" => "Eskild Hustvedt",
"jesgemini.zerodogg.org" => "Eskild Hustvedt",
"esn.org" => "ESN",
"www.espn.com" => "ESPN",
"www.catb.org" => "ESR",
"www.espressif.com" => "Espressif Systems",
"www.esquire.com" => "Esquire",
"www.esrl.noaa.gov" => "ESRL",
"www.wionews.com" => "Essel Group",
"kapo.ee" => "Estonia",
"www.riigikogu.ee" => "Estonia",
"www.valisluureamet.ee" => "Estonian Foreign Intelligence Service",
"estonianworld.com" => "Estonian World",
"www.esveo.com" => "esveo GmbH",
"eta.st" => "Eta",
"www.eternitynews.com.au" => "Eternity News",
"etgarkeret.substack.com" => "Etgar Keret",
"www.ethanheilman.com" => "Ethan Heilman",
"www.ethanhein.com" => "Ethan Hein",
"ethanmarcotte.com" => "Ethan Marcotte",
"selfh.st" => "Ethan Sholly",
"thunderseethe.dev" => "Ethan Smith",
"mccue.dev" => "Ethan McCue",
"er4hn.info" => "Ethan Rahn",
"www.oneusefulthing.org" => "Prof Ethan Mollick",
"ethanzuckerman.com" => "Ethan Zuckerman",
"ethanzuckerman.com" => "Ethan Zuckerman",
"trustworthy.technology" => "The Ethical Computing Initiative",
"www.ethicalconsumer.org" => "Ethical Consumer Research Association Ltd",
"www.ethicaleditor.com" => "Ethical Editor",
"ethz.ch" => "ETH Zürich",
"comsec.ethz.ch" => "ETH Zürich",
"etienne.depar.is" => "Étienne Deparis",
"bleuje.com" => "Etienne Jacob",
"etienne.pflieger.bzh" => "Étienne Pflieger",
"etno.eu" => "ETNO",
"www.etuc.org" => "ETUC",
"eur-lex.europa.eu" => "EU",
"europa.eu" => "EU",
"www.eua.eu" => "EUA",
"eand.co" => "Eudaimonia",
"eugene-andrienko.com" => "Eugene Andrienko",
"spaf.cerias.purdue.edu" => "Eugene H Spafford",
"eugeneyan.com" => "Eugene Yan",
"euobserver.com" => "EU Observer",
"www.euractiv.com" => "Euractive",
"www.eurasiareview.com" => "Eurasia Review",
"2020.eurobsdcon.org" => "EuroBSDCon",
"2021.eurobsdcon.org" => "EuroBSDCon",
"2022.eurobsdcon.org" => "EuroBSDCon",
"2023.eurobsdcon.org" => "EuroBSDCon",
"2024.eurobsdcon.org" => "EuroBSDCon",
"2025.eurobsdcon.org" => "EuroBSDCon",
"2026.eurobsdcon.org" => "EuroBSDCon",
"events.eurobsdcon.org" => "EuroBSDCon",
"www.eurogamer.net" => "EuroGamer",
"www.euronews.com" => "EuroNews",
"frontex.europa.eu" => "European Border And Coast Guard Agency",
"www.ecpmf.eu" => "European Centre for Press and Media Freedom",
"commission.europa.eu" => "European Commission",
"digital-strategy.ec.europa.eu" => "European Commission",
"ec.europa.eu" => "European Commission",
"eci.ec.europa.eu" => "European Commission",
"home-affairs.ec.europa.eu" => "European Commission",
"intellectual-property-helpdesk.ec.europa.eu" => "European Commission",
"single-market-economy.ec.europa.eu" => "European Commission",
"www.consilium.europa.eu" => "European Council",
"www.edpb.europa.eu" => "European Data Protection Board",
"www.efsa.europa.eu" => "European Food Safety Authority",
"hudoc.echr.coe.int" => "European Court of Human Rights",
"www.eurofound.europa.eu" => "European Foundation for the Improvement of Living and Working Conditions",
"europarl.europa.eu" => "European Parliament",
"www.europarl.europa.eu" => "European Parliament",
"europeanpirates.eu" => "European Pirate Party",
"www.epc.eu" => "European Policy Centre",
"www.eso.org" => "European Southern Observatory",
"digital-skills-jobs.europa.eu" => "European Union",
"www.berec.europa.eu" => "European Union",
"www.eenewseurope.com" => "European Business Press SA",
"data.consilium.europa.eu" => "European Council",
"european-union.europa.eu" => "European Union",
"www.europol.europa.eu" => "Europol",
"www.euroweeklynews.com" => "Euro Weekly News",
"evanhahn.com" => "Evan Hahn",
"www.evanmiller.org" => "Evan Miller",
"verdagon.dev" => "Evan Ovadia",
"emschwartz.me" => "Evan Schwartz",
"etodd.io" => "Evan Todd",
"evanstonroundtable.com" => "Evanston RoundTable Media NFP",
"eev.ee" => "Evelyn Woods",
"www.standard.co.uk" => "Evening Standard UK",
"evertpot.com" => "Evert Pot",
"www.everylaststation.co.uk" => "Every Last Station",
"everythingsmarthome.co.uk" => "Everything Smart Home",
"evgeniipendragon.com" => "Evgenii Pendragon",
"evilmartians.com" => "Evil Martians",
"tesk.page" => "TheEvilSkeleton",
"evrone.com" => "Evrone GmbH",
"www.eweek.com" => "EWeek",
"ewontfix.com" => "EWONTFIX",
"news.exeter.ac.uk" => "University of Exeter",
"global-tipping-points.org" => "University of Exeter",
"blog.exe.dev" => "Exe.dev",
"expertain.net" => "Expertain",
"explainextended.com" => "Explain Extended",
"www.exponential-e.com" => "Exponential-e Ltd",
"research.exoticsilicon.com" => "Exotic Silicon",
"exple.tive.org" => "Exple.Tive.Org",
"explained-from-first-principles.com" => "Explained from First Principles",
"www.explica.co" => "Explica",
"expel.com" => "Expel Inc",
"explorersweb.com" => "Explorersweb",
"www.exposedbycmd.org" => "Exposed By CMD",
"www.express.co.uk" => "Express",
"www.expressandstar.com" => "Express And Star",
"www.expresspharma.in" => "Express Pharma",
"www.expressvpn.com" => "ExpressVPN",
"floridapolitics.com" => "Extensive-Enterprises",
"www.extremeelectronics.co.uk" => "Extreme Electronics",
"www.extremetech.com" => "Extreme Tech",
"eyg.run" => "EYG",
"beuke.org" => "Fabian Beuke",
"fgiesen.wordpress.com" => "Fabian “ryg” Giesen",
"fabianlindfors.se" => "Fabian Lindfors",
"fabiensanglard.net" => "Fabian Sanglard",
"blog.fabiomanganiello.com" => "Fabio Manganiello",
"passo.uno" => "Fabrizio Ferri Benedetti",
"about.instagram.com" => "Facebook",
"factmyth.com" => "Fact / Myth",
"www.facultyfocus.com" => "Faculty Focus",
"olano.dev" => "Facundo Olano",
"re-factor.blogspot.com" => "Factor",
"facts.net" => "FactsNet",
"faineg.com" => "Faine Greenwood",
"fair.org" => "FAIR",
"www.fairobserver.com" => "Fair Observer",
"www.fairtrials.org" => "Fair Trials International",
"fair.work" => "Fair Work",
"www.faithfreedom.org" => "Faith Freedom",
"www.familyminded.com" => "FamilyMinded",
"www.gamespot.com" => "Fandom Inc",
"www.fao.org" => "FAO",
"faroutmagazine.co.uk" => "Far Out Mag",
"fzakaria.com" => "Farid Zakaria",
"fs.blog" => "Farnam Street Media Inc",
"road.cc" => "Farrelly Atkinson",
"www.farsightsecurity.com" => "FarsightSecurity",
"www.ficlaw.com" => "Faruki PLL",
"sgp.fas.org" => "Federation of American Scientists",
"fas.org" => "Federation of American Scientists",
"uk.fashionnetwork.com" => "Fashion Network",
"www.fastcompany.com" => "Fast Company",
"www.fastly.com" => "Fastly",
"www.fastmail.com" => "Fastmail",
"www.fastpix.io" => "FastPix Inc",
"www.fatherly.com" => "Fatherly",
"arslan.io" => "Fatih Arslan",
"fatsquirrel.org" => "FatSquirrel",
"f-droid.org" => "F-Droid",
"www.ic3.gov" => "Federal Bureau of Investigation",
"federalnewsnetwork.com" => "Federal News Network",
"interiornewswire.com" => "Federal Newswire",
"fcw.com" => "Government Media Executive Group LLC",
"www.washingtontechnology.com" => "Government Media Executive Group LLC",
"www.federaltimes.com" => "Federal Times",
"consumer.ftc.gov" => "Federal Trade Commission",
"www.ftc.gov" => "Federal Trade Commission",
"irp.fas.org" => "Federation of American Scientists",
"fediversereport.com" => "The Fediverse Report",
"distro.f-91w.club" => "Fedizine",
"darksi.de" => "Fedor Indutny",
"fedoramagazine.org" => "Fedora Magazine",
"www.feistyduck.com" => "Feisty Duck",
"blog.feld.me" => "Feld",
"www.feldera.com" => "Feldera",
"felix.dognebula.com" => "Felix",
"www.p4m.dev" => "Felix",
"felixcrux.com" => "Felix Crux",
"feldspaten.org" => "Felix Feldspaten",
"www.feltpresence.com" => "Felt Presence LLC",
"felix-knorr.net" => "Knorr",
"krausefx.com" => "Felix Krause",
"femtejuli.se" => "Femte Juli",
"borretti.me" => "Fernando Borretti",
"ferrous-systems.com" => "Ferrous Systems",
"www.faylawfirm.com" => "FFA",
"fiatjaf.com" => "Fiatjaf",
"fidoalliance.org" => "FIDO Alliance",
"fi-le.net" => "The Fiefdom of Files",
"www.fiercepharma.com" => "Fierce Pharma",
"www.fifthdomain.com" => "Fifth Domain",
"figbert.com" => "Figbert",
"fightchatcontrol.eu" => "Fight Chat Control",
"www.fightforthefuture.org" => "Fight For The Future",
"www.fightforthehuman.com" => "Fight For The Human",
"filebrowserquantum.com" => "FileBrowser Quantum",
"0x46.net" => "Filip Borkiewicz",
"filipfila.wordpress.com" => "Filip Fila",
"filipe.kiss.ink" => "Filipe Kiss",
"words.filippo.io" => "Filippo Valsorda",
"filmdaily.co" => "Film Daily",
"filmfreakcentral.net" => "Film Freak Central",
"filter.watch" => "FilterWatch",
"www.financialexpress.com" => "Financial Express",
"today.thefinancialexpress.com.bd" => "Financial Express, Bangladesh",
"financialpost.com" => "Financial Post",
"www.fsb.org" => "Financial Stability Board",
"www.financialstandard.com.au" => "Financial Standard",
"www.ft.com" => "Financial Times",
"supreme.findlaw.com" => "Find Law",
"fingerprint.com" => "FingerprintJS Inc",
"www.finextra.com" => "Finextra Research",
"www.kansalliskirjasto.fi" => "The National Library of Finland",
"um.fi" => "Finland",
"poliisi.fi" => "Finland",
"stuk.fi" => "Finland",
"www.posti.fi" => "Finland",
"valtioneuvosto.fi" => "Finland",
"www.presidentti.fi" => "Finland",
"www.ymparisto.fi" => "Finland",
"raja.fi" => "Finnish Border Guard",
"tulli.fi" => "Finnish Customs Agency",
"www.traficom.fi" => "Finnish Transport and Communications Agency",
"blog.finnix.org" => "Finnix",
"finnstats.com" => "Finnstats",
"fintechzoom.com" => "FinTech Zoom",
"fokus.cool" => "Fiona Fokus",
"runjak.codes" => "Fiona Runge",
"fireborn.mataroa.blog" => "Fireborn",
"www.fireeye.com" => "FireEye",
"www.fsmatters.com" => "Fire Saftey Matters",
"firstmonday.org" => "First Monday",
"www.firstpost.com" => "Firstpost",
"www.fr.com" => "Fish & Richardson",
"fishshell.com" => "Fish Shell",
"flaky.build" => "Flaky Build",
"flamedfury.com" => "Flamed Fury",
"www.flatpanelshd.com" => "FlatpanelsHD",
"fleetstack.io" => "Fleetstack",
"theflintcouriernews.com" => "The Flint Courier News",
"floridanewstimes.com" => "Florida",
"fh4ntke.medium.com" => "Florian Hantke",
"fpgmaas.com" => "Florian Maas",
"jaxtrib.org" => "Florida",
"www.floridabulldog.org" => "Florida Bulldog",
"floridaphoenix.com" => "The Florida Pheonix",
"blog.floydhub.com" => "Floyd Hub",
"fly.io" => "Fly",
"www.flyingpenguin.com" => "Flyngpenguin",
"www.surfacemag.com" => "FMG Inc",
"www.freemalaysiatoday.com" => "FMT",
"www.cfoi.org.uk" => "FOI",
"www.followthecrypto.org" => "Follow The Crypto",
"www.ftm.eu" => "Follow The Money",
"blog.fontawesome.com" => "Font Awesome",
"www.foodandwaterwatch.org" => "Food & Water Watch",
"www.foodandwine.com" => "Food & Wine",
"www.foodnotlawns.com" => "Food Not Lawns",
"foodtank.com" => "FoodTank",
"infosec-jobs.com" => "Foorilla LLC",
"forwomen.scot" => "For Women Scotland",
"www.forbes.com" => "Forbes",
"storage02.forbrukerradet.no" => "Forbrukerrådet",
"www.forbrukerradet.no" => "Forbrukerrådet",
"www.foreignaffairs.com" => "Foreign Affairs",
"foreignpolicy.com" => "Foreign Policy",
"forensicnews.net" => "Forensic News",
"www.forescout.com" => "Forescout",
"www.forever-wars.com" => "Forever Wars",
"foreverwars.substack.com" => "Forever Wars",
"forgefriends.org" => "Forge Friends",
"forum.forgefriends.org" => "Forge Friends",
"forgejo.org" => "Forgejo",
"newsletter.goodtechthings.com" => "Forrest Brazeal",
"www.fortmcmurraytoday.com" => "Fort McMurray Today",
"www.fortmorgantimes.com" => "The Fort Morgan Times",
"fortran-lang.org" => "Fortran Lang",
"fortranbsd.sourceforge.io" => "FortranBSD",
"forward.com" => "Forward",
"archive.fosdem.org" => "FOSDEM",
"fosdem.org" => "FOSDEM",
"blog.fossasia.org" => "FOSSASIA",
"fossbytes.com" => "FOSSBytes",
"fossi-foundation.org" => "FOSSi Foundation",
"foss-north.se" => "FOSS North",
"fosspost.org" => "FOSS Post",
"www.fdd.org" => "Foundation for Defense of Democracies",
"feps-europe.eu" => "Foundation for European Progressive Studies",
"fee.org" => "Foundation for Economic Education",
"ffii.org" => "Foundation for a Free Information Infrastructure",
"www.fourmilab.ch" => "Fourmilab",
"location.foursquare.com" => "Foursquare",
"www.foxglove.org.uk" => "Foxglove",
"freedom.press" => "FPF",
"www.thefpsreview.com" => "FPS Review",
"frame.work" => "Framework Computer BV",
"www.autoritedelaconcurrence.fr" => "France",
"www.cert.ssi.gouv.fr" => "France",
"cyber.gouv.fr" => "France",
"www.tribunal-de-paris.justice.fr" => "France",
"www.diplomatie.gouv.fr" => "France",
"observers.france24.com" => "France24",
"www.france24.com" => "France24",
"iamfran.com" => "Francesco",
"ariis.it" => "Francesco Ariis",
"mazzo.li" => "Francesco Mazzoli",
"webtechie.be" => "Frank Delporte",
"eponymouspickle.blogspot.com" => "Franz Dill",
"www.franziskuskiefer.de" => "Franziskus Kiefer",
"frankmeeuwsen.com" => "Frank Meeuwsen",
"fransskarman.com" => "Frans Skarman",
"www.frc.org" => "FRC",
"freakingrectangle.wordpress.com" => "Freaking Rectangle",
"www.cambus.net" => "Frederic Cambus",
"frederickvanbrabant.com" => "Frederick Vanbrabant",
"blog.fredrb.com" => "Frederico Bittencourt",
"frederik-braun.com" => "Frederik Braun",
"frederikbraun.de" => "Frederik Braun",
"ferd.ca" => "Fred Herbert",
"madhadron.com" => "Frederick J Ross",
"www.thefp.com" => "Substack Inc",
"www.freerangekids.com" => "Free-Range Kids",
"freeourfeeds.com" => "Free Our Feeds",
"www.freepress.net" => "Free Press",
"www.freepressjournal.in" => "Free Press Journal",
"freerangestats.info" => "Free Range Statistics",
"www.defectivebydesign.org" => "Free Software Foundation",
"magazine.fsf.org" => "Free Software Foundation",
"action.freespeechcoalition.com" => "Free Speech Coalition",
"docs-archive.freebsd.org" => "FreeBSD",
"cgit.freebsd.org" => "FreeBSD",
"docs.freebsd.org" => "FreeBSD",
"freebsdfoundation.org" => "FreeBSD",
"kernelnomicon.org" => "FreeBSD",
"lists.freebsd.org" => "FreeBSD",
"reviews.freebsd.org" => "FreeBSD",
"wiki.freebsd.org" => "FreeBSD",
"www.freebsdfoundation.org" => "FreeBSD",
"www.freebsd.org" => "FreeBSD",
"wiki.lazarus.freepascal.org" => "Free Pascal",
"www.freecodecamp.org" => "freeCodeCamp",
"ffrf.org" => "Freedom From Religion Foundation",
"freedomhouse.org" => "Freedom House",
"www.freedomonthenet.org" => "Freedom House",
"freesharing.eu" => "Freedom To Share",
"freedom-to-tinker.com" => "Freedom To Tinker",
"freem-blog.coherent-logic.com" => "FreeM",
"freemarketdaily.com" => "Freemarket Daily",
"freenetafrica.com" => "Freenet Africa",
"docs.freeplane.org" => "Freeplane",
"bigthink.com" => "Freethink Media Inc",
"www.cs1.tf.fau.de" => "Friedrich-Alexander-Universität",
"frills.dev" => "Frills",
"fritzenlab.net" => "FritzenLab Electronics",
"french75.net" => "French75",
"news.cnrs.fr" => "French National Center for Scientific Research",
"www.fresnobee.com" => "Fresno Bee",
"blog.afoolishmanifesto.com" => "fREW Schmidt",
"friendlyatheist.patheos.com" => "Friendly Atheist",
"friendly-router.org" => "Friendly Router",
"foe.org" => "Friends of Earth",
"www.frommers.com" => "FrommerMedia LLC",
"frontendmasters.com" => "Frontend Masters",
"frontiergroup.org" => "Frontier Group",
"www.frontiersin.org" => "Frontiers",
"frontpageafricaonline.com" => "Front Page Africa",
"www.frontpagemag.com" => "Frontpage Magazine",
"www.fsdaily.com" => "FS Daily",
"labs.f-secure.com" => "FSecure",
"my.fsf.org" => "FSF",
"www.fsf.org" => "FSF",
"fset.common-lisp.dev" => "FSet",
"fudosecurity.com" => "Fudo Security",
"www.fudzilla.com" => "Fudzilla",
"fullcirclemagazine.org" => "Full Circle Magazine",
"fullfact.org" => "Full Fact",
"bounties.fulu.org" => "FULU Foundation",
"patternsinfp.wordpress.com" => "Functional Programming",
"functionalsoftware.se" => "Functional Software Stockholm AB",
"fundingthecommons.io" => "Funding the Commons",
"fundor333.com" => "Fundor 333",
"www.furkantokac.com" => "Furkan Tokaç",
"futhark-lang.org" => "Futhark Programming Language",
"futo.org" => "FUTO",
"www.futurecar.com" => "Future Car",
"futurefreespeech.org" => "The Future of Free Speech",
"artificialintelligenceact.eu" => "Future of Life Institute",
"www.mixonline.com" => "Future PLC",
"www.t3.com" => "Future Publishing Limited",
"www.loudersound.com" => "Future Publishing Limited",
"www.theweek.co.uk" => "Future Publishing Limited",
"www.tvtechnology.com" => "Future US Inc",
"futurism.com" => "Futurism",
"fuzzix.org" => "Fuzzix",
"g8rwg.uk" => "G8RWG",
"radio.g4hsk.co.uk" => "G8GKA",
"news.gab.com" => "Gab",
"gabevenberg.com" => "Gabe Venberg",
"quotenil.com" => "Gábor Melis",
"blog.gabornyeki.com" => "Gábor Nyéki",
"gabz.blog" => "Gabriel",
"www.gabriel.urdhr.fr" => "Gabriel Corona",
"garrido.io" => "Gabriel Garrido",
"gabrielsieben.tech" => "Gabriel Sieben",
"gabrielsimmer.com" => "Gabriel Simmer",
"www.gadgetsnow.com" => "Gadgets Now",
"gadgettendency.com" => "Gadget Tendency",
"www.gainesvilletimes.com" => "Gainesville Times",
"www.galacticstudios.org" => "Bob Alexander",
"ikrima.dev" => "Gamedev Guide",
"newsletter.gamediscover.co" => "Game Discover Co",
"www.gameinformer.com" => "Game Informer",
"game-news24.com" => "Game-News24",
"gamerant.com" => "Game Rant",
"gameworldobserver.com" => "Game World Observer",
"gameoftrees.org" => "Game Of Trees",
"www.gameoftrees.org" => "Game Of Trees",
"www.thegamer.com" => "The Gamer",
"www.thegamefox.net" => "The Game Fox",
"www.rockpapershotgun.com" => "Gamer Network Limited",
"www.gamesindustry.biz" => "Games",
"www.gamesradar.com" => "Future US Inc",
"www.kiplinger.com" => "Future US Inc",
"www.gamingbible.co.uk" => "GAMINGbible",
"www.gamingonlinux.com" => "GamingOnLinux",
"eu.blueridgenow.com" => "Gannett",
"eu.buckscountycouriertimes.com" => "Gannett",
"eu.caller.com" => "Gannett",
"eu.cincinnati.com" => "Gannett",
"eu.commercialappeal.com" => "Gannett",
"eu.delawareonline.com" => "Gannett",
"eu.desertsun.com" => "Gannett",
"eu.fayobserver.com" => "Gannett",
"eu.galesburg.com" => "Gannett",
"eu.gainesville.com" => "Gannett",
"eu.heraldtimesonline.com" => "Gannett",
"eu.hollandsentinel.com" => "Gannett",
"eu.jacksonville.com" => "Gannett",
"eu.jconline.com" => "Gannett",
"eu.jsonline.com" => "Gannett",
"eu.lcsun-news.com" => "Gannett",
"eu.news-journalonline.com" => "Gannett",
"eu.njherald.com" => "Gannett",
"eu.oklahoman.com" => "Gannett",
"eu.petoskeynews.com" => "Gannett",
"eu.providencejournal.com" => "Gannett",
"eu.sentinel-standard.com" => "Gannett",
"eu.southcoasttoday.com" => "Gannett",
"eu.statesman.com" => "Gannett",
"eu.vcstar.com" => "Gannett",
"www.irvinetimes.com" => "Gannet",
"detroit.cbslocal.com" => "Gannett",
"eu.app.com" => "Gannett",
"eu.augustachronicle.com" => "Gannett",
"eu.azcentral.com" => "Gannett",
"eu.clarionledger.com" => "Gannett",
"eu.courier-journal.com" => "Gannett",
"eu.democratandchronicle.com" => "Gannett",
"eu.desmoinesregister.com" => "Gannett",
"eu.freep.com" => "Gannett",
"eu.indystar.com" => "Gannett",
"eu.knoxnews.com" => "Gannett",
"eu.lansingstatejournal.com" => "Gannett",
"eu.northjersey.com" => "Gannett",
"eu.tallahassee.com" => "Gannett",
"eu.tennessean.com" => "Gannett",
"eu.theledger.com" => "Gannett",
"eu.usatoday.com" => "Gannett",
"www.freep.com" => "Gannett",
"www.usatoday.com" => "Gannett",
"www.garbageday.email" => "Garbage Day",
"thewhitepages.net" => "Garrett Bucks",
"www.doomsdayscenario.co" => "Garrett M Graff",
"garrit.xyz" => "Garrit Franke",
"thenextmove.substack.com" => "Garry Kasparov",
"www.thenextmove.org" => "The Next Move",
"garyfouse.blogspot.com" => "Gary Fouse",
"garymarcus.substack.com" => "Gary Marcus",
"cuddly-octo-palm-tree.com" => "Gary Verhaegen",
"gatesofvienna.net" => "Gates Of Vienna",
"www.gatestoneinstitute.org" => "Gatestone Institute",
"www.thegatewaypundit.com" => "The Gateway Pundit",
"gaiwan.co" => "Gaiwan GmbH",
"computoid.com" => "Gavin Hayes",
"gavinhoward.com" => "Gavin Howard",
"www.wgbh.org" => "GBH",
"greenchristian.org.uk" => "GC",
"gcc.gnu.org" => "GCC",
"connect.geant.org" => "GÉANT",
"www.gearnews.com" => "Remise 3 Medienservice Agentur GmbH",
"www.geeklan.co.uk" => "Geek LAN",
"www.geeksforgeeks.org" => "Geeks For Geeks",
"www.geekwire.com" => "GeekWire",
"www.geeky-gadgets.com" => "Geeky Gadgets",
"askmeaboutlinux.com" => "Geetu R Vaswani",
"isene.org" => "Geir Isene",
"gellerreport.com" => "Geller Report",
"geminiprotocol.net" => "Project Gemini",
"geminiquickst.art" => "Gemini",
"portal.mozz.us" => "Gemini",
"builders.genagorlin.com" => "Dr Gena Gorlin",
"genodians.org" => "Genode Operating System",
"blogs.gentoo.org" => "Gentoo",
"forums.gentoo.org" => "Gentoo",
"www.gentoo.org" => "Gentoo",
"www.getlamp.com" => "Get Lamp",
"getoutofmyhead.dev" => "GetOutOfMyHead.dev",
"app.engage.gettyimages.com" => "Getty Images",
"asylum.madhouse-project.org" => "Gergely Nagy",
"chronicles.mad-scientist.club" => "Gergely Nagy",
"blog.pragmaticengineer.com" => "Gergely Orosz",
"geocar.sdf1.org" => "Geo Carncross",
"geocompx.org" => "Geocompx",
"www.geoffchappell.com" => "Geoff Chappell",
"geoffgraham.me" => "Geoff Graham",
"ghuntley.com" => "Geoff Huntley",
"www.potaroo.net" => "Geoff Huston",
"bldgblog.com" => "Geoff Manaugh",
"blog.sylver.dev" => "Geoffrey Copin",
"www.geoffreylitt.com" => "Geoffrey Litt",
"www.geomar.de" => "Hinweise zur Internetpräsenz des Helmholtz-Zentrum für Ozeanforschung Kiel (GEOMAR)",
"www.fultoncountyga.gov" => "Fulton County, GA, USA",
"www.epistem.ink" => "George",
"blog.cerebralab.com" => "George Hosu",
"cerebralab.com" => "George Hosu",
"shapeshed.com" => "George Ornbo",
"www.48k.ca" => "George Phillips",
"www.grobinson.net" => "George Robinson",
"berkleycenter.georgetown.edu" => "Georgetown University",
"gjia.georgetown.edu" => "Georgetown University",
"www.georgetown.edu" => "Georgetown University",
"americandragnet.org" => "Georgetown Law",
"georgiarecorder.com" => "The Georgia Recorder",
"www.geospatialworld.net" => "Geospatial Media and Communications",
"www.fordlibrarymuseum.gov" => "Gerald Ford Presidential Foundation",
"www.germanvelasco.com" => "Germán Velasco",
"www.berliner-zeitung.de" => "Germany",
"www.iamexpat.de" => "Germany",
"www.wien.info" => "Germany",
"www.gtai.de" => "Germany Trade & Invest",
"geshan.com.np" => "Geshan",
"stealthoptional.com" => "GFinity",
"www.greenfinanceplatform.org" => "GFP",
"www.ghacks.net" => "Ghacks",
"newsghana.com.gh" => "Ghana",
"www.ghanaweb.com" => "Ghana",
"www.ghananews.co.uk" => "Ghana",
"ghanasoccernet.com" => "Ghana Soccer Net",
"ghostbsd.org" => "Ghost BSD",
"www.ghostbsd.org" => "Ghost BSD",
"ghost.org" => "Ghost Foundation",
"ghostinfluence.com" => "Ghost Influence",
"ghostty.org" => "GhosTTY",
"giacomocavalieri.me" => "Giacomo Cavalieri",
"giansegato.com" => "Gian Segato",
"gigaom.com" => "GigaOm",
"gigazine.net" => "GigaZine",
"dergigi.com" => "Gigi",
"gigi.nullneuron.net" => "Gigi Labs",
"gilest.org" => "Giles Turnbull",
"castel.dev" => "Gilles Castel",
"poolp.org" => "Gilles Chehade",
"www.poolp.org" => "Gilles Chehade",
"gillettnews.com" => "Gillett News",
"gineersnow.com" => "GineersNow",
"www.gingerbill.org" => "Ginger Bill",
"gcollazo.com" => "Giovanni Collazo",
"giodicanio.com" => "Giovanni Dicanio",
"engineering.giphy.com" => "GIPHY",
"blog.gitguardian.com" => "Git Guardian",
"gitlearn.io" => "Git Simulator",
"legacy.gitbook.com" => "GitBook",
"www.gitbook.com" => "GitBook",
"blog.gitea.io" => "Gitea",
"about.gitlab.com" => "GitLab",
"docs.gitlab.com" => "GitLab",
"framagit.org" => "GitLab",
"gitlab.com" => "GitLab",
"www.gizchina.com" => "Giz China",
"www.gizmochina.com" => "Gizmo China",
"earther.gizmodo.com" => "Gizmodo",
"www.gizmodo.com.au" => "Gizmodo Australia",
"gizmodo.com" => "Gizmodo",
"io9.gizmodo.com" => "Gizmodo",
"gizmoposts24.com" => "Gizmo Posts 24",
"glama.ai" => "Glama",
"www.glasgowtimes.co.uk" => "Glasgow Times",
"glaubercosta-11125.medium.com" => "Glauber Costa",
"gleam.run" => "Gleam",
"sportsnation.org.uk" => "Glencroft Ltd",
"can-mex-usa-sec.org" => "Global Affairs Canada",
"user-agent.globalcode.info" => "Global Code",
"www.globalconstructionreview.com" => "Global Construction Review",
"ged.globalencryption.org" => "Global Encryption Day",
"www.footprintnetwork.org" => "Global Footprint Network",
"globalnews.ca" => "Global News CA",
"theglobalscholars.com" => "Global Scholars",
"www.globalsign.com" => "GlobalSign",
"www.globenewswire.com" => "Globe Newswire",
"gluer.org" => "Victor Freire",
"moodysbnn.blogspot.com" => "Glyn Moody",
"opendotdotdot.blogspot.com" => "Glyn Moody",
"blog.glyph.im" => "Glyph",
"glyph.twistedmatrix.com" => "Glyph Lefkowitz",
"blogs.gnome.org" => "GNOME",
"thisweek.gnome.org" => "This Week in GNOME",
"wiki.gnome.org" => "GNOME",
"www.gnome.org" => "GNOME",
"guix.gnu.org" => "GNU",
"lists.gnu.org" => "GNU",
"lists.nongnu.org" => "GNU",
"savannah.gnu.org" => "GNU",
"www.gnu.org" => "GNU",
"octave.org" => "Gnu Octave",
"dev.gnupg.org" => "GnuPG",
"lists.gnupg.org" => "GnuPG",
"wiki.gnupg.org" => "GnuPG",
"www.nongnu.org" => "GNU Savannah",
"www.gocertify.com" => "Go Certify",
"www.gomponents.com" => "Go Components",
"jalopnik.com" => "GO Media",
"www.jalopnik.com" => "GO Media",
"jezebel.com" => "GO Media",
"kotaku.com" => "GO Media",
"lifehacker.com" => "GO Media",
"theslot.jezebel.com" => "GO Media",
"thetakeout.com" => "GO Media",
"www.avclub.com" => "GO Media",
"www.theroot.com" => "GO Media",
"go.dev" => "Go Programming Language",
"gobolinux.org" => "GoboLinux",
"politicalwire.com" => "Goddard Media LLC",
"godotengine.org" => "Godot Engine",
"www.gofundme.com" => "GoFundMe",
"goinglinux.com" => "Going Linux",
"www.goldderby.com" => "Gold Derby",
"blog.golioth.io" => "Golioth",
"goncalomb.com" => "Gonçalo MB",
"blog.ovalerio.net" => "Gonçalo Valério",
"x61.sh" => "GonzaloR",
"www.good.is" => "Good",
"goodereader.com" => "Good E Reader",
"goodinternetmagazine.com" => "Good Internet",
"goodjobsfirst.org" => "Good Jobs First",
"goodmenproject.com" => "Good Men Project",
"www.goodolddays.net" => "Good Old Days",
"goodresearch.dev" => "The Good Research Code Handbook",
"goodness-exchange.com" => "Goodness Exchange",
"www.goodreads.com" => "Goodreads LLC (Amazon)",
"www.goodwinlaw.com" => "Goodwin Law",
"ai.google" => "Google",
"blog.youtube" => "Google",
"blog.chromium.org" => "Google",
"blog.google" => "Google",
"cloud.google.com" => "Google",
"chromereleases.googleblog.com" => "Google",
"developers.google.com" => "Google",
"developer.chrome.com" => "Google",
"developers.googleblog.com" => "Google",
"fuchsia.dev" => "Google",
"googleprojectzero.blogspot.com" => "Google",
"opensource.googleblog.com" => "Google",
"patents.google.com" => "Google",
"security.googleblog.com" => "Google",
"sites.google.com" => "Google",
"notes.kateva.org" => "Gordon's Notes",
"webmasters.googleblog.com" => "Google",
"www.google.com" => "Google",
"blog.shotwell.ca" => "Gordon Shotwell",
"gothamist.com" => "Gothamist",
"goughlui.com" => "Gough Lui",
"www.governmentattic.org" => "Government Attic",
"governmentciomedia.com" => "Government CIO Magazine",
"www.governmentcomputing.com" => "Government Computing",
"www.govexec.com" => "Government Executive",
"www.cityandstateny.com" => "Government Media Executive Group LLC",
"www.govtech.com" => "Government Technology",
"www.govinfosecurity.com" => "Gov Info Sec News",
"gddr.fail" => "GPU Memory Exploits",
"www.gq.com" => "GQ",
"www.gq-magazine.co.uk" => "GQ",
"gqrx.dk" => "Gqrx",
"thegradient.pub" => "The Gradient",
"grafana.com" => "Grafana",
"grain.org" => "GRAIN",
"graphika.com" => "Graphika",
"grahamcluley.com" => "Graham Cluley",
"www.grahamcluley.com" => "Graham Cluley",
"grahamhelton.com" => "Graham Helton",
"blog.poly.nomial.co.uk" => "Graham Sutherland",
"gram.liten.app" => "Gram",
"www.grandforksherald.com" => "Grand Forks Herald",
"grantslatton.com" => "Grant Slatton",
"granta.com" => "Granta",
"www.azfamily.com" => "Gray Local Media",
"www.firstalert4.com" => "Gray Local Media",
"www.hawaiinewsnow.com" => "Gray Local Media",
"www.kkco11news.com" => "Gray Local Media",
"www.wfsb.com" => "Gray Local Media",
"www.wifr.com" => "Gray Local Media",
"www.wlbt.com" => "Gray Local Media",
"www.atlantanewsfirst.com" => "Gray Media Group",
"www.dakotanewsnow.com" => "Gray Media Group",
"www.kktv.com" => "Gray Media Group",
"www.nbc12.com" => "Gray Media Group",
"www.wafb.com" => "Gray Local Media",
"www.wctv.tv" => "Gray Media Group",
"www.wect.com" => "Gray Media Group",
"www.weau.com" => "Gray Media Group",
"www.witn.com" => "Gray Media Group",
"www.wsfa.com" => "Gray Media Group",
"www.wtvy.com" => "Gray Media Group",
"www.wvva.com" => "Gray Media Group",
"www.hackread.com" => "Gray Dot Media Group",
"graydon2.dreamwidth.org" => "Graydon2",
"gfw.report" => "Great Firewall Report",
"blog.glcs.io" => "Great Lakes Consulting Services Inc",
"greatlakesecho.org" => "Great Lakes Echo",
"www.ekathimerini.com" => "Greece",
"greekcitytimes.com" => "Greek City Times",
"greekreporter.com" => "Greek Reporter",
"www.greenbiz.com" => "Green Biz",
"www.greenmatters.com" => "Green Matters",
"greenparty.org.uk" => "Green Party UK",
"www.greenparty.org.uk" => "Green Party UK",
"greenteapress.com" => "Green Tea Press",
"www.greenpeace.org" => "Greenpeace",
"www.greenpeace.org.uk" => "Greenpeace",
"www.greenqueen.com.hk" => "GreenQueen",
"www.greens-efa.eu" => "The Greens / EFA",
"www.greenwich-mercantile.com" => "Greenwich Mercantile",
"gpanders.com" => "Gregory Anders",
"gregoryhammond.ca" => "Gregory Hammond",
"micro.gregorypittman.net" => "Gregory Pittman",
"www.igregious.com" => "Greg Fawcett",
"www.gkogan.co" => "Greg Kogan",
"www.kroah.com" => "Greg Kroah-Hartman",
"gregmorris.co.uk" => "Greg Morris",
"www.gr36.com" => "Greg Morris",
"gregnewman.io" => "Greg Newman",
"brilliantcrank.com" => "Greg Storey",
"games.greggman.com" => "Gregg Tavares",
"greptime.com" => "Greptime Inc",
"greycoder.com" => "GreyCoder",
"www.gresearch.co.uk" => "G Research",
"gdprhub.eu" => "GDPRhub",
"gridlochgames.itch.io" => "Gridloch",
"griffin.com" => "Griffin Bank Ltd",
"news.griffith.edu.au" => "Griffith University",
"www.grimsbytelegraph.co.uk" => "Grimsby UK",
"grist.org" => "Grist Magazine Inc",
"grizzlygazette.bearblog.dev" => "Grizzly Gazette",
"www.thegrocer.co.uk" => "The Grocer",
"www.groklaw.net" => "Groklaw",
"curiouscoding.nl" => "Groot Koerkamp",
"geopolitique.eu" => "Le Groupe d’études géopolitiques",
"data.gsmaintelligence.com" => "GSMA Advisory Services Ltd",
"www.gsmarena.com" => "GSM Arena",
"www.goodthingsguy.com" => "GTG",
"guardian.ng" => "Guardian",
"blog.guillaume-gomez.fr" => "Guillaume Gomez",
"glthr.com" => "Guillaume Lethuillier",
"www.errno.fr" => "Guillaume Quéré",
"www.garron.blog" => "Guillermo Garron",
"guillermolatorre.com" => "Guillermo Latorre",
"www.guinnessworldrecords.com" => "Guiness World Records",
"gulfnews.com" => "Gulf News",
"www.gulftoday.ae" => "GulfToday",
"blog.unhu.fr" => "Gunhu",
"gunnar.se" => "Gunnar",
"www.morling.dev" => "Gunnar Morling",
"www.magnusson.io" => "Gunnar Þór Magnússon",
"gwolf.org" => "Gunnar Wolf",
"gerikson.com" => "Gustaf Erikson",
"www.gutenberg.org" => "Project Gutenberg",
"www.guylawrence.com.au" => "Guy Lawrence",
"loudpoet.com" => "Guy LeCharles Gonzalez",
"www.lockedinspace.com" => "Gvid",
"glfmn.io" => "Gwen Lofman",
"gwern.net" => "Gwern Branwen",
"gyrovague.com" => "Gyrovague",
"www.how2shout.com" => "H2S Media",
"www.h2-view.com" => "H2 View",
"h3artbl33d.nl" => "H3artbl33d",
"www.haaretz.com" => "Haaretz",
"www.chamline.net" => "Habib Cham",
"habr.com" => "Habr",
"hack.org" => "Hack",
"hackeducation.com" => "Hack Education",
"hackaday.com" => "Hackaday",
"hackaday.io" => "Hackaday",
"hacked.com" => "Hacked",
"www.hackerfactor.com" => "HackerFactor",
"thehackernews.com" => "Hacker News",
"hackernoon.com" => "Hacker Noon",
"www.hackernoon.com" => "Hacker Noon",
"hackerpublicradio.org" => "Hacker Public Radio",
"hackers.pub" => "Hackers' Pub",
"hackread.com" => "HackRead",
"www.hackster.io" => "Hackster",
"www.hagen-bauer.de" => "Hagen Bauer",
"isometricleaves.wordpress.com" => "HaikuOS",
"discuss.haiku-os.org" => "HaikuOS",
"www.haiku-os.org" => "HaikuOS",
"hakaimagazine.com" => "Hakai Magazine",
"hakibenita.com" => "Haki Benita",
"hallofdreams.org" => "Hall of Impossible Dreams",
"www.wiumlie.no" => "Håkon Wium Lie",
"handy.computer" => "Handy",
"www.thatprivacyguy.com" => "Hanff & Co AB",
"hannahilea.com" => "Hannah Robertson",
"blog.hboeck.de" => "Hanno Boeck",
"hanno.codes" => "Hanno Embregts",
"hamvocke.com" => "Ham Vocke",
"hamel.dev" => "Hamel Husain",
"probuildermag.co.uk" => "Hamerville Media Group",
"www.hamiltonnolan.com" => "Hamilton Nolan",
"hannuhartikainen.fi" => "Hannu Hartikainen",
"humanrightsdefenders.blog" => "Hans Thoolen",
"www.hanshq.net" => "Hans Wennborg",
"themaister.net" => "Hans-Kristian Arntzen",
"www.drheap.nl" => "Hans-Dieter Hiep",
"www.hansdieterhiep.nl" => "Hans-Dieter Hiep",
"happymag.tv" => "Happy Mag",
"www.haproxy.com" => "HAProxy Technologies LLC",
"apachelog.wordpress.com" => "Harald Sitter",
"kde.haraldsitter.eu" => "Harald Sitter",
"hard-drive.net" => "Hard Drive",
"www.hardwarezone.com.sg" => "The Hardware Zone",
"hardenedbsd.org" => "HardenedBSD",
"harelang.org" => "The Hare Programming Language",
"theevilskeleton.gitlab.io" => "Hari Rana",
"blog.trieoflogs.com" => "Hariharan",
"harishpillay.com" => "Harish Pillay",
"stoppels.ch" => "Harmen Stoppels",
"www.harpersbazaar.com" => "Harpers Baazar",
"harpers.org" => "Harpers Magazine",
"harrisoncramer.me" => "Harrison Cramer",
"harrisonsand.com" => "Harrison Sand",
"harrycresswell.com" => "Harry Cresswell",
"hmarr.com" => "Harry Marr",
"www.harsh17.in" => "Harshvardhan",
"woodpecker.com" => "Harvey Reid",
"learnyouahaskell.com" => "Learn You a Haskell for Great Good",
"blog.haskell.org" => "Haskell",
"wiki.haskell.org" => "Haskell",
"discourse.haskell.org" => "Haskell",
"haskellforall.com" => "Haskell For All",
"www.haskellforallwww.haskellforall.com.com" => "Haskell For All",
"havce.it" => "Havce CTF",
"challahscript.com" => "Hazel Bachrach",
"hrussman.neocities.org" => "Hazel Russman",
"hazelweakly.me" => "Hazel Weakly",
"headtopics.com" => "Head Topics",
"www.env-health.org" => "HEAL",
"www.healthaffairs.org" => "Health Affairs",
"www.healthdatamanagement.com" => "Health Data Managment",
"h-isac.org" => "Health-ISAC",
"www.healthnewsreview.org" => "Health News Review",
"www.healthcarefinancenews.com" => "Healthcare Finance",
"www.healthcareitnews.com" => "Healthcare IT News",
"www.healthline.com" => "Healthline Media",
"www.medicalnewstoday.com" => "Healthline Media",
"www.hearingreview.com" => "Hearing Review",
"www.roadandtrack.com" => "Hearst Digital Media, Inc",
"www.bicycling.com" => "Hearst Magazine Media, Inc",
"www.elle.com" => "Hearst Magazine Media, Inc",
"www.womenshealthmag.com" => "Hearst Magazine Media, Inc",
"www.expressnews.com" => "Hearst Communications",
"www.timesunion.com" => "Hearst Communications",
"heatherburns.tech" => "Heather Burns",
"heathercoxrichardson.substack.com" => "Heather Cox Richardson",
"heathermeeker.com" => "Heather J Meeker",
"www.heathkit-museum.com" => "Heathkit Virtual Museum",
"heavy.com" => "Heavy",
"heimdalsecurity.com" => "Heimdal Security",
"blog.tmm.cx" => "Hein-Pieter van Braam",
"www.heise.de" => "Heise",
"www.h-online.com" => "Heise",
"heliomass.com" => "Heliomass",
"hellgatenyc.com" => "Hell Gate NYC",
"notes.hella.cheap" => "Hellacheap",
"hellas.postsen.com" => "Hellas Posts English",
"blog.hellbeast.eu.org" => "Hellbeast",
"www.hellenicshippingnews.com" => "Hellenic Shipping News",
"www.ufz.de" => "UFZ Helmholtz Centre for Environmental Research",
"www.helpnetsecurity.com" => "Help Net Security",
"www.helpguide.org" => "HelpGuide.org Intl",
"old.hiit.fi" => "Helsinki Institute for Information Technology",
"jyx.jyu.fi" => "Digital Archive of the University of Jyväskylä",
"375humanistia.helsinki.fi" => "The University of Helsinki",
"helda.helsinki.fi" => "The University of Helsinki",
"www.cs.helsinki.fi" => "The University of Helsinki",
"www.helsinkitimes.fi" => "Helsinki Times",
"hengaw.net" => "Hengaw Organization for Human Rights Hengaw Organization for Human Rights",
"bergie.iki.fi" => "Henri Bergius",
"hsivonen.fi" => "Henri Sivonen",
"hacdias.com" => "Henrique Dias",
"hforsten.com" => "Henrik Forstén",
"www.henrikkarlsson.xyz" => "Henrik Karlsson",
"henrikwarne.com" => "Henrik Warne",
"www.hmpcabral.com" => "Henrique Cabral",
"henry.codes" => "Henry Desroches",
"iscinumpy.dev" => "Henry Schreiner",
"www.hercampus.com" => "Her Campus Media LLC",
"www.heraldmalaysia.com" => "Herald Malaysia",
"www.heraldsun.com.au" => "Herald Sun",
"herbsutter.com" => "Herb Sutter",
"www.dailysignal.com" => "Heritage Foundation",
"herman.bearblog.dev" => "Herman Martinus",
"ounapuu.ee" => "Herman Õunapuu",
"herrbischoff.com" => "Herr Bischoff",
"hexus.net" => "Hexus",
"briefs.video" => "Heydon Pickering",
"heydonworks.com" => "Heydon Pickering",
"thehftguy.com" => "HFT",
"www.healthit.gov" => "HHS",
"hicks.design" => "Hicks Design",
"hidde.blog" => "Hidde de Vries",
"www.hcn.org" => "High Country News",
"www.highnorthnews.com" => "High North News",
"thehighlandtimes.com" => "The Highland Times",
"hiiraan.com" => "Hiiraan Online",
"www.hiiraan.com" => "Hiiraan Online",
"hilaryburrage.com" => "Hilary Burrage",
"www.hillelwayne.com" => "Hillel Wayne",
"hillreporter.com" => "Hill Reporter",
"hindupost.in" => "Hindu Post",
"thehindustangazette.com" => "The Hindustan Gazette",
"tech.hindustantimes.com" => "Hindustan Times",
"www.hindustantimes.com" => "Hindustan Times",
"www.hipaajournal.com" => "HIPAA",
"www.h-i-r.net" => "HiR",
"www.hiro.report" => "Hiro",
"www.interdb.jp" => "Hironobu Suzuki",
"hisham.hm" => "Hisham",
"hister.org" => "Hister",
"www.historyonthenet.com" => "History",
"www.history.com" => "History AE",
"history-computer.com" => "History Computer",
"unixhist.crys.site" => "History of UNIX",
"thehistoryoftheweb.com" => "The History of the Web",
"www.historylink.org" => "HistoryLink.Org",
"www.hivemq.com" => "HiveMQ Gmbh",
"ln.hixie.ch" => "Hixie",
"security.humanativaspa.it" => "HN",
"oshub.org" => "Hobby OS Development Hub",
"holdtherobot.com" => "Hold The Robot LLC",
"hollie.eilloh.net" => "Hollie",
"www.hollywoodreporter.com" => "Hollywood Reporter",
"www.home-assistant.io" => "Home Assistant",
"home-assistant-guide.com" => "Home Assistant Guide",
"blog.bembel.net" => "Home of Ebbelwoi and IT",
"homehack.nl" => "Home Hack",
"brew.sh" => "Homebrew",
"hooby.blog" => "Hooby",
"www.hoover.org" => "The Hoover Instituion",
"honeyryderchuck.gitlab.io" => "HoneyryderChuck",
"honeytreelabs.com" => "HoneytreeLabs",
"www.thestandard.com.hk" => "The Standard, Hong Kong",
"hongkongfp.com" => "Hong Kong Free Press",
"www.hongkongfp.com" => "Hong Kong Free Press",
"writings.hongminhee.org" => "HOPE",
"scheduler.hope.net" => "HOPE",
"hopeinsource.com" => "Hope in Source",
"hopkintonindependent.com" => "Hopkinton Independent",
"blog.katanaquant.com" => "Hōrōshi バガボンド",
"zerokspot.com" => "Horst Gutmann",
"backreaction.blogspot.com" => "Sabine Hossenfelder",
"admin.hostpoint.ch" => "Hostpoint",
"carbuzz.com" => "Valnet Inc",
"www.hotcars.com" => "Valnet Inc",
"hothardware.com" => "Hot Hardware",
"www.hothardware.com" => "Hot Hardware",
"www.hotrod.com" => "Hot Rod LLC",
"thehouseofmoth.com" => "The House of Moth",
"www.honeycomb.io" => "Hound Technology Inc",
"uh.edu" => "University of Houston",
"www.houstonchronicle.com" => "Houston Chronicle",
"www.houstonpublicmedia.org" => "Houston Public Media",
"howbrowserswork.com" => "How Browsers Work",
"eclecticlight.co" => "Howard Oakley",
"howlround.com" => "Howl Round",
"www.howtoforge.com" => "HowTo Forge",
"www.howtogeek.com" => "HowTo Geek",
"www.hpl.hp.com" => "HP",
"www.hpcwire.com" => "HPC Wire",
"www.hrw.org" => "HRW",
"www.hse.ie" => "HSE",
"ascopost.com" => "HSP News Service LLC",
"www.livemint.com" => "HT Digital Streams Ltd",
"html.energy" => "HTML Energy",
"html-first.com" => "HTML First",
"htmlforpeople.com" => "HTML For People",
"www.html-tidy.org" => "HTML Tidy",
"htmx.org" => "HTMX",
"httptoolkit.com" => "HTTP Toolkit",
"httptoolkit.tech" => "HTTP Toolkit",
"blog.huadeity.com" => "HuaDeity",
"www.tnhh.net" => "Huan Truong",
"consumer.huawei.com" => "Huawei",
"thehustle.co" => "The HubSpot Inc",
"www.kob.com" => "Hubbard Broadcasting",
"www.wdio.com" => "Hubbard Broadcasting",
"www.whec.com" => "Hubbard Broadcasting",
"www.hudson.org" => "Hudson Institute",
"hugovk.dev" => "Hugo van Kemenade",
"hugodaniel.com" => "Hugo Daniel",
"whynothugo.nl" => "Hugo Osvaldo Barrera",
"www.en-hrana.org" => "Human rights Activists News Agency",
"www.hr.com" => "Human Resources Social Network",
"humane.com" => "Humane Inc",
"humanists.international" => "Humanists International",
"huggingface.co" => "Hugging Face, Inc",
"www.hughrundle.net" => "Hugh Rundle",
"blog.izissise.net" => "Hugues",
"www.hungarianconservative.com" => "Hungarian Conservative",
"insighthungary.444.hu" => "Insight Hungary",
"telex.hu" => "Telex (Hungary)",
"svg-tutorial.com" => "Hunor Márton Borbély",
"www.huntonprivacyblog.com" => "Hunton Andrews Kurth",
"www.huntress.com" => "Huntress",
"html.com" => "HTML.com",
"www.hurriyetdailynews.com" => "Hürriyet Daily News",
"lazybear.io" => "Hyde Stevenson",
"hypha.pub" => "Hypha",
"www.rsinc.com" => "Hztime LLC",
"hyperallergic.com" => "HyperAllergic",
"www.hyperbola.info" => "Hyperbola",
"www.recall.ai" => "Hyperdoc Inc",
"hyperflask.dev" => "Hyperflask",
"www.hytradboi.com" => "HYTRADBOI",
"talk.hyvor.com" => "Hyvor Talk",
"www.iafrikan.com" => "iAfrikan",
"ia.net" => "iA Writer",
"www.insideradvantagegeorgia.com" => "IAG",
"iagoleal.com" => "Iago Leal de Freitas",
"technovia.co.uk" => "Ian Betteridge",
"ianbetteridge.com" => "Ian Betteridge",
"idallen.com" => "Ian D Allen",
"www.iandick.com" => "Ian Dick",
"www.iankduncan.com" => "Ian Duncan",
"iev.ee" => "Ian Erik Varatalu",
"ianthehenry.com" => "Ian Henry",
"iapp.org" => "IAPP",
"www.iatp.org" => "IATP",
"www.ibiblio.org" => "Ibiblio",
"research.ibm.com" => "IBM",
"securityintelligence.com" => "IBM",
"developer.ibm.com" => "IBM Developer",
"idiallo.com" => "Ibrahim Diallo",
"www.ibtimes.com.au" => "IBT Media",
"www.icann.org" => "ICANN",
"www.persecution.org" => "ICC",
"www.icij.org" => "ICIJ",
"english.hi.is" => "University of Iceland",
"grapevine.is" => "Iceland",
"icelandmonitor.mbl.is" => "Iceland",
"www.icelandreview.com" => "Iceland",
"www.icheme.org" => "IChemE",
"www.icirnigeria.org" => "ICIR",
"www.indcatholicnews.com" => "ICN",
"blog.iconfactory.com" => "Iconfactory",
"ico.org.uk" => "ICOUK",
"icrowdnewswire.com" => "iCrowdNewswire",
"idroot.us" => "ID Root",
"www.darksky.org" => "IDA",
"www.idemia.com" => "IDEMIA France SAS",
"idahocapitalsun.com" => "Idaho Capital Sun",
"inl.gov" => "Idaho National Laboratory",
"identicalsoftware.com" => "Identical Games",
"identityweek.net" => "Identity Week",
"www.identity4.com" => "Identity4",
"www.channelasia.tech" => "IDG",
"www.cio.com" => "IDG Communications Inc",
"www.computerwoche.de" => "IDG Communications Inc",
"www.idginsiderpro.com" => "IDG",
"www.pcworld.idg.com.au" => "IDG",
"www.reseller.co.nz" => "IDG",
"idiomdrottning.org" => "Idiomdrottning",
"www.idiomdrottning.org" => "Idiomdrottning",
"idlewords.com" => "Idle Words",
"www.idownloadblog.com" => "iDownloadBlog",
"idrw.org" => "IDRW",
"www.iea.org" => "IEA",
"spectrum.ieee.org" => "IEEE",
"smartgrid.ieee.org" => "IEEE",
"datatracker.ietf.org" => "IETF",
"mailarchive.ietf.org" => "IETF",
"tools.ietf.org" => "IETF",
"ifex.org" => "IFEX",
"www.ificlaims.com" => "IFI Claims",
"www.ifj.org" => "IFJ",
"iflas.blogspot.com" => "IFLAS",
"www.iflscience.com" => "IFLS",
"ifstudies.org" => "IFS",
"blogs.igalia.com" => "Igalia",
"www.ign.com" => "IGN",
"blog.ignaciobrasca.com" => "Ignacio Brasca",
"discourse.igniterealtime.org" => "Ignite Realtime",
"binaryigor.com" => "Igor Roztropiński",
"ij.org" => "IJ",
"sur.conectas.org" => "IJHR",
"infojustice.org" => "IJIP",
"www.ilfattoquotidiano.it" => "Il Fatto Quotidiano",
"iliana.fyi" => "Iliana Etaoin",
"www.stamfordmercury.co.uk" => "Iliffe Media Publishing Ltd",
"guides.library.illinois.edu" => "The University of Illinois",
"news.illinois.edu" => "The University of Illinois",
"www.ncsa.illinois.edu" => "The University of Illinois",
"www.illinois.gov" => "Illinois",
"illinoisnewstoday.com" => "Illinois",
"www.countryherald.com" => "Illinois",
"quic.xargs.org" => "Illustrated QUIC",
"www.ilyameerovich.com" => "Ilya Meerovich",
"getimageview.net" => "Image View",
"blogs.imf.org" => "IMF",
"www.imf.org" => "IMF",
"immich.app" => "Immich",
"www.imore.com" => "iMore",
"www.doc.ic.ac.uk" => "Imperial College London",
"incognitocat.me" => "Incognito Cat",
"increment.com" => "Increment Magazine",
"independentaustralia.net" => "Independent AU",
"tiv.today" => "The Independent Variable",
"www.theindex.media" => "The Index",
"www.indexoncensorship.org" => "Index On Censorship",
"deccanrepublic.com" => "India",
"frontline.thehindu.com" => "India",
"indiatribune.com" => "India Tribune",
"indianews.in" => "India",
"news24online.com" => "India",
"odishatv.in" => "India",
"trai.gov.in" => "India",
"pib.gov.in" => "India",
"silverscreenindia.com" => "India",
"telanganatoday.com" => "India",
"thegoaspotlight.com" => "India",
"www.bloombergquint.com" => "India",
"www.dailypioneer.com" => "India",
"www.daily-sun.com" => "India",
"www.indiandefencereview.com" => "India",
"www.newagebd.net" => "India",
"www.news18.com" => "India",
"www.republicworld.com" => "India",
"www.sundayguardianlive.com" => "India",
"zeenews.india.com" => "India Dot Com Pvt Ltd",
"indiaeducationdiary.in" => "India Education Diary",
"www.indialegallive.com" => "India Legal Live",
"www.india.com" => "India News",
"indiancountrytoday.com" => "Indian Country Today",
"indianexpress.com" => "Indian Express",
"www.indiapost.com" => "India Post",
"auto.economictimes.indiatimes.com" => "India Times",
"cio.economictimes.indiatimes.com" => "India Times",
"ciso.economictimes.indiatimes.com" => "India Times",
"economictimes.indiatimes.com" => "India Times",
"energy.economictimes.indiatimes.com" => "India Times",
"government.economictimes.indiatimes.com" => "India Times",
"health.economictimes.indiatimes.com" => "India Times",
"telecom.economictimes.indiatimes.com" => "India Times",
"timesofindia.indiatimes.com" => "India Times",
"www.indiatimes.com" => "India Times",
"www.indiatoday.in" => "India Today",
"indicator.media" => "Indicator",
"www.indiewire.com" => "Indie Wire",
"www.cybersecuritydive.com" => "Industry Dive",
"www.socialmediatoday.com" => "Industry Dive",
"www.infoq.com" => "InfoQ",
"www.lightreading.com" => "Informa PLC",
"www.networkcomputing.com" => "Informa PLC",
"energy-utilities.com" => "Informa PLC",
"www.informationng.com" => "Information Nigeria",
"www.bankinfosecurity.asia" => "Information Security Media Group Corporation",
"ital.corejournals.org" => "Information Technologies and Libraries",
"infosec-handbook.eu" => "InfoSec Handbook",
"www.infosecmatter.com" => "InfoSec Matter",
"www.infosecurity-magazine.com" => "InfoSecurity Magazine",
"infosurhoy.com" => "Infosurhoy",
"www.infoworld.com" => "InfoWorld",
"the-infrastructure-mindset.ghost.io" => "The Infrastructure Mindset",
"ing.dk" => "Ingeniøren",
"www.version2.dk" => "Ingeniøren",
"blog.windfluechter.net" => "Ingo Jürgensmann",
"www.inkl.com" => "Inkl",
"inkscape.org" => "Inkscape",
"www.innovationaus.com" => "InnovationAus",
"www.inputmag.com" => "Input Magazine",
"www.inria.fr" => "La Fondation Inria",
"insidebigdata.com" => "Inside Big Data",
"www.insidehighered.com" => "Inside Higer Ed",
"www.insidehook.com" => "Inside Hook",
"inside.lighting" => "Inside.lighting",
"www.insidetelecom.com" => "Inside Telecom",
"insidesources.com" => "InsideSources LLC",
"www.ifn.se" => "Research Institute of Industrial Economics",
"discourse.imfreedom.org" => " Instant Messaging Freedom",
"gnu.ist.utl.pt" => "Instituto Superior Técnico",
"www.ifs.org" => "Institute for Free Speech",
"www.instituteforgovernment.org.uk" => "Institute for Government",
"ips-dc.org" => "Institute for Policy Studies",
"www.construction-physics.com" => "Institute for Progress",
"www.isdglobal.org" => "Institute for Strategic Dialogue",
"www.instructables.com" => "Instructables",
"www.businessinsurance.com" => "Insurance",
"www.profrisk.com" => "Insurance",
"www.insurancebusinessmag.com" => "Insurance Business UK",
"www.iihs.org" => "Insurance Institute for Highway Safety, Highway Loss Data Institute",
"www.insurancejournal.com" => "Insurance Journal",
"community.intel.com" => "Intel",
"www.intel471.com" => "Intel471",
"ifcomp.org" => "The Interactive Fiction Competition",
"ifdb.org" => "The Interactive Fiction Database",
"intfiction.org" => "The Interactive Fiction Community",
"interestingengineering.com" => "Interesting Engineering",
"internationalaffairs.co" => "International Affairs",
"www.ibanet.org" => "International Bar Association",
"www.ibtimes.co.in" => "International Business Times",
"www.ibtimes.com" => "International Business Times",
"www.ibtimes.co.uk" => "International Business Times",
"www.ibtimes.sg" => "International Business Times",
"laweconcenter.org" => "International Center for Law and Economics",
"www.icrc.org" => "International Committee of the Red Cross",
"theicct.org" => "International Council on Clean Transportation",
"www.earthday.org" => "International Earth Day Network",
"www.idc.com" => "International Data Corporation",
"doi.org" => "International Digital Object Identifier (DOI) Foundation",
"blogs.ifla.org" => "International Federation of Library Assocations and Institutions",
"www.ikea.com" => "Inter IKEA Systgems B V",
"www.ifarchive.org" => "The Interactive Fiction Archive",
"www.mathunion.org" => "International Mathematical Union",
"imemc.org" => "International Middfle East Media Center",
"fistsna.org" => "The International Morse Preservation Society",
"www.pascalcongress.com" => "International Pascal Congress",
"www.ips-planetarium.org" => "International Planetarium Society",
"intpolicydigest.org" => "International Policy Digest",
"www.pressenza.com" => "International Press Agency",
"www.internationalscienceediting.com" => "International Science Editing",
"www.inta.org" => "International Trademark Association",
"iucn.org" => "International Union for Conservation of Nature and Natural Resources",
"iwp9.org" => "International Workshop on Plan 9",
"archive.org" => "Internet Archive",
"web.archive.org" => "Internet Archive",
"blog.archive.org" => "Internet Archive",
"internetphonebook.net" => "Internet Phone Book",
"www.ndss-symposium.org" => "Internet Society",
"www.internetsociety.org" => "Internet Society",
"internetingishard.netlify.app" => "InternetingIsHard",
"interoperable-europe.ec.europa.eu" => "Interoperable Europe Portal",
"www.interpol.int" => "INTERPOL",
"intuitionlabs.ai" => "Intuition Labs",
"www.intheblack.com" => "In The Black",
"inventingthefuture.ghost.io" => "Inventing The Future",
"inventree.org" => "InvenTree",
"www.investopedia.com" => "Investopedia",
"ih.advfn.com" => "Investors Hub",
"www.yewtu.be" => "Invidious",
"inv.nadeko.net" => "Invidious",
"invisv.com" => "INVISV",
"www.ioccc.org" => "IOCCC",
"www.iol.co.za" => "IOL",
"www.ionos.com" => "IONOS Inc",
"iopscience.iop.org" => "IOP Publishing",
"www.rcreader.com" => "Iowa",
"iowacapitaldispatch.com" => "Iowa Capital Dispatch",
"www.news.iastate.edu" => "Iowa State University",
"www.iphonehacks.com" => "iPhone Hacks",
"www.iphoneincanada.ca" => "iPhone In Canada",
"ipfsfoundation.org" => "IPFS Foundation",
"www.ipcc.ch" => "IPCC",
"ipi.media" => "IPI",
"indigenouspeoples-sdg.org" => "IPMG-SDG",
"www.ipsos.com" => "Ipsos",
"www.ipswich.co.uk" => "Ipswich News",
"www.investigativeproject.org" => "IPT",
"www.i-programmer.info" => "I Programmer",
"www.iqair.com" => "IQAir",
"iranhr.net" => "Iran Human Rights",
"iranpresswatch.org" => "Iran Press Watch",
"iranwire.com" => "IranWire",
"connachttribune.ie" => "Ireland",
"www.dublinlive.ie" => "Ireland",
"www.gov.ie" => "Ireland",
"www.irishcentral.com" => "Irish Central",
"www.iccl.ie" => "Irish Council for Civil Liberties",
"www.irishexaminer.com" => "Irish Examiner",
"www.independent.ie" => "Irish Independent",
"www.irishlegal.com" => "Irish Legal News Ltd",
"www.irishmirror.ie" => "Irish Mirror",
"www.irishtimes.com" => "Irish Times",
"blog.ironclad-os.org" => "The Ironclad Project",
"ironclad-os.org" => "Ironclad",
"irregulators.org" => "The Irregulators",
"www.iru.org" => "IRU",
"isitreallyfoss.com" => "Is It Really FOSS",
"www.isthiswhatwewant.com" => "Is This What We Want",
"dshield.org" => "ISC",
"lists.isc.org" => "ISC",
"sysadmin-journal.com" => "Ish Sookun",
"scilly.gov.uk" => "Isles of Scilly",
"www.countypress.co.uk" => "Isle of Wight",
"www.isocfoundation.org" => "ISOC",
"blog.isosceles.com" => "Isosceles Blog",
"www.ispreview.co.uk" => "ISPreview",
"www.israelnationalnews.com" => "Israel National News",
"securityandtechnology.org" => "IST",
"istlsfastyet.com" => "Is TLS Fast Yet",
"www.italianpost.news" => "Italian Post News",
"www.unionesarda.it" => "Italy",
"www.italy24news.com" => "Italy 24 News",
"codewithoutrules.com" => "Itamar Turner Trauring",
"itbrief.com.au" => "IT Brief Australia",
"itbrief.co.nz" => "IT Brief NZ",
"www.itjungle.com" => "IT Jungle",
"www.itprotoday.com" => "IT Pro Today",
"techblog.nz" => "IT Professionals NZ Inc",
"ittavern.com" => "IT Tavern",
"itch.io" => "Itch Corp",
"sr.ithaka.org" => "Ithaka S+R",
"iterativewonders.com" => "Iterative Wonders",
"itif.org" => "ITIF",
"insidethemagic.net" => "ITM",
"itmunch.com" => "ITM",
"itnext.io" => "ITNEXT",
"www.itnews.com.au" => "IT News AU",
"www.itpro.com" => "IT Pro",
"www.itpro.co.uk" => "IT Pro",
"www.itproportal.com" => "IT Pro Portal",
"itsfoss.com" => "It's FOSS",
"itsfoss.community" => "It's FOSS",
"news.itsfoss.com" => "It's FOSS",
"www.itsnicethat.com" => "It's Nice That",
"itsgoingdown.org" => "ItsGoingDown",
"it-online.co.za" => "IT-Online",
"www.itv.com" => "ITV",
"www.itweb.co.za" => "IT Web",
"itwire.com" => "IT Wire",
"www.itwire.com" => "IT Wire",
"www.itworldcanada.com" => "IT World CA",
"crescentro.se" => "Ivan",
"mnt.io" => "Ivan Enderlin",
"uplab.pro" => "Ivan Kuleshov",
"softwaremaniacs.org" => "Ivan Sagalaev",
"www.tomica.net" => "Ivan Tomica",
"www.ivanturkovic.com" => "Ivan Turkovic",
"iximiuz.com" => "Ivan Velichko",
"www.ivir.nl" => "IVIR",
"www.iwf.org" => "IWF",
"www.ixsystems.com" => "ix Systems",
"blog.jchw.io" => "Jchw",
"jhalderm.com" => "J Alex Halderman",
"computer.rip" => "J B Crawford",
"www.jdsupra.com" => "J D Supra LLC",
"jwgoerlich.com" => "J Wolfgang Goerlich",
"agentultra.com" => "J Kenneth King",
"gmi.skyjake.fi" => "Jaakko Keränen",
"baty.blog" => "Jack Baty",
"baty.net" => "Jack Baty",
"scribbles.baty.net" => "Jack Baty",
"daily.baty.net" => "Jack Baty",
"www.jackfranklin.co.uk" => "Jack Franklin",
"jackkelly.name" => "Jack Kelly",
"jmcph4.dev" => "Jack McPherson",
"wormsandviruses.com" => "Jack Wellborn",
"www.hackingbutlegal.com" => "Jackie Singh",
"jacky.wtf" => "Jacky Alciné",
"www.jacky.wtf" => "Jacky Alciné",
"tookmund.com" => "Jacob Adams Tookmund",
"tech.davis-hansson.com" => "Jacob Davis Hansson",
"jacobharr.is" => "Jacob Harris",
"jacobian.org" => "Jacob Kaplan Moss",
"jakubnowosad.com" => "Jacob Nowosad",
"blog.jacobstoner.com" => "Jacob Stoner",
"jacobtomlinson.dev" => "Jacob Tomlinson",
"jacobin.com" => "Jacobin Magazine",
"jacobinmag.com" => "Jacobin Magazine",
"www.jacobinmag.com" => "Jacobin Magazine",
"www.travelweekly.co.uk" => "Jacobs Media",
"adminblog.foucry.net" => "Jacques Foucry",
"777.tf" => "Jae Lo Presti",
"jaggedplanet.com" => "Jagged Planet",
"jahed.dev" => "Jahed",
"www.jakartadaily.id" => "Jakarta Daily",
"jakearchibald.com" => "Jake Archibald",
"www.paritybit.ca" => "Jake Bauer",
"theorangeone.net" => "Jake Howard",
"jakelazaroff.com" => "Jake Lazaroff",
"www.jakerobins.com" => "Jake Robins",
"blog.jakesaunders.dev" => "Jake Saunders",
"jakob.space" => "Jakob L Kreuze",
"viralinstruction.com" => "Jakob Nybo Nissen",
"blog.jakuba.net" => "Jakub Arnold",
"ciolek.dev" => "Jakub Ciolek",
"jarosz.dev" => "Jakub Jarosz",
"blog.jimmac.eu" => "Jakub Steiner",
"jamanetwork.com" => "JAMA",
"www.jamesreeves.co" => "James A Reeves",
"jamesabley.com" => "James Abley",
"james.belchamber.com" => "James Belchamber",
"www.b-list.org" => "James Bennett",
"blog.hansenpartnership.com" => "James Bottomley",
"www.roguelazer.com" => "James Brown",
"jamesclear.com" => "James Clear",
"www.emacs.dyerdwelling.family" => "James Dyer",
"fallows.substack.com" => "James Fallows",
"jamesg.blog" => "James G",
"james.grimmelmann.net" => "James Grimmelmann",
"prog21.dadgum.com" => "James Hague",
"formularsumo.co.uk" => "James Heppell",
"www.jameskerr.blog" => "James Kerr",
"www.pathsensitive.com" => "James Koppel",
"www.jameskupke.com" => "James Kupke",
"www.jamesleighton.com" => "James Leighton",
"no-bull.sh" => "James Liu",
"www.jamesdrandall.com" => "James Randall",
"incoherency.co.uk" => "James Stanley",
"scattered-thoughts.net" => "Jamie Brandon",
"lord.technology" => "Jamie Lord",
"www.scattered-thoughts.net" => "Jamie Brandon",
"longest.voyage" => "Jamie Crisman",
"jamie.ideasasylum.com" => "Jamie Lawrence",
"current.workingdirectory.net" => "Jamie McClelland",
"www.blog.montgomerie.net" => "Jamie Montgomerie",
"jrsinclair.com" => "James Sinclair",
"jamestown.org" => "The Jamestown Foundation",
"jami.net" => "Jami",
"www.jvt.me" => "Jamie Tanna",
"www.jwz.org" => "Jamie Zawinski",
"www.jampa.dev" => "Jampa Uchoa",
"stevens.netmeister.org" => "Jan Schaumann",
"monzool.net" => "Jan Skriver Sørensen",
"www.noa-s.org" => "Jan Nowa",
"jpmens.net" => "Jan Piet Mens",
"www.netmeister.org" => "Jan Schaumann",
"jan.wildeboer.net" => "Jan Wildeboer",
"janlukas.blog" => "Jan-Lukas Else",
"jlelse.blog" => "Jan-Lukas Else",
"jsteuernagel.de" => "Jana",
"www.characterworks.co" => "Jane Ruffino",
"blog.janestreet.com" => "Jane Street",
"www.janes.com" => "Janes",
"jangafx.com" => "JangaFX",
"jnboehm.com" => "JanNiklas Böhm",
"www.japantimes.co.jp" => "Japan",
"www.nippon.com" => "Japan",
"www.jftc.go.jp" => "Japan Fair Trade Commission",
"www.jareddiamond.org" => "Jared Diamond",
"www.jarednelsen.dev" => "Jared Nelsen",
"www.spicyweb.dev" => "Jared White",
"solhsa.com" => "Jari Komppa",
"heydingus.net" => "Jarrod Blundy",
"blog.jabid.in" => "Jaseem Abid",
"jagsworkshop.com" => "Jason Anthony Guy",
"json.blog" => "Jason Becker",
"bryer.org" => "Jason Bryer",
"grepjason.sh" => "Jason Burk",
"bluerenga.blog" => "Jason Dyer",
"jasonfry.co.uk" => "Jason Fry",
"writing.jasonheppler.org" => "Jason Heppler",
"social.jasonheppler.org" => "Jason Heppler",
"jasonhunyar.substack.com" => "Jason Hunyar",
"blog.jasonkratz.me" => "Jason Kratz",
"echoville.blog" => "Jason Kratz",
"jxnl.co" => "Jason Liu",
"nochlin.com" => "Jason Nochlin",
"jro.io" => "Jason Rose",
"jasontucker.blog" => "Jason Tucker",
"www.joshwcomeau.com" => "Jason W Comeau",
"kottke.org" => "Jason Kottke",
"jasonlefkowitz.net" => "Jason Lefkowitz",
"ascii.textfiles.com" => "Jason Scott",
"www.codewithjason.com" => "Jason Swett",
"www.fromjason.xyz" => "Jason Velazquez",
"esp32-open-mac.be" => "Jasper Devreker",
"jasper.tandy.is" => "Jasper Tandy",
"jasper.la" => "Jasper Lievisse Adriaanse",
"thoughts.jatan.space" => "Jatan Mehta",
"blog.dowhile0.org" => "Javier Martinez Canillas",
"jaxenter.com" => "JAXenter",
"jayconrod.com" => "Jay Conrad",
"jaydaigle.net" => "Jay Daigle",
"jaylittle.com" => "Jay Little",
"thejaymo.net" => "Jay Springett",
"heyjaywilson.com" => "Jay Wilson",
"jazzband.co" => "Jazzband",
"www.jbklutse.com" => "JB Klutse",
"start.jcolemorrison.com" => "J Cole Morrison",
"jcpa.org" => "JCPA",
"jcs.org" => "JCS",
"blog.jdpfu.com" => "JDPFu",
"hypirion.com" => "Jean Niklas",
"fortintam.com" => "Jean-François Fortin Tam",
"jaywhy13.hashnode.dev" => "Jean-Mark Wright",
"thephd.dev" => "JeanHeyd Meneide",
"jneen.ca" => "Jeanine Adkisson",
"lgug2z.com" => "Jeezy",
"fffej.substack.com" => "Jeff",
"jeffbridgforth.com" => "Jeff Bridgforth",
"jdx.dev" => "Jeff Dickey",
"overeducated-redneck.net" => "Jeff Frasca",
"www.jeffgeerling.com" => "Jeff Geerling",
"jeffhuang.com" => "Jeff Huang",
"jeffkreeftmeijer.com" => "Jeff Kreeftmeijer",
"www.jeffquast.com" => "Jeff Quast",
"pdx.su" => "Jeff Sandberg",
"sheetsj.com" => "Jeff Sheets",
"micro.webology.dev" => "Jeff Triplett",
"staticmade.com" => "Jeffrey Inscho",
"pure-systems.org" => "Jeffrey M Young",
"sneak.berlin" => "Jeffrey Paul",
"www.jsnover.com" => "Jeffrey Snover",
"jeffreywong.ca" => "Jeffrey Wong",
"www.jelmer.uk" => "Jelmer Vernooij",
"jemma.dev" => "Jemma Issroff",
"jenniferplusplus.com" => "Jennifer Moore",
"jens.mooseyard.com" => "Jens Alfke",
"gustedt.wordpress.com" => "Jens Gustedt",
"techlog.jenslink.net" => "Jens Link",
"jepsen.io" => "Jepsen",
"moddedbear.com" => "Jeremy",
"jeremy.bicha.net" => "Jeremy Bicha",
"www.jeremyblum.com" => "Jeremy Blum",
"jerf.org" => "Jeremy Bowers",
"www.jerf.org" => "Jeremy Bowers",
"jeremyburge.com" => "Jeremy Burge",
"www.jeremycherfas.net" => "Jeremy Cherfas",
"adactio.com" => "Jeremy Keith",
"www.jeremykun.com" => "Jeremy Kun",
"jeremymikkola.com" => "Jeremy Mikkola",
"www.jeremymorgan.com" => "Jeremy Morgan",
"www.historyofinformation.com" => "Jeremy Norman",
"ardentperf.com" => "Jeremy Schneider",
"securitydatacommons.substack.com" => "Jeremy Williams",
"nullptr.club" => "Jeroen DeHaas",
"jfmengels.net" => "Jeroen Engels",
"jeroensangers.com" => "Jeroen Sangers",
"cafetechinenglish.substack.com" => "Jérôme Marin",
"jerseyeveningpost.com" => "Jersey Evening Post",
"www.jpost.com" => "Jerusalem Post",
"abyss.fish" => "Jes Olson",
"j3s.sh" => "Jes Olson",
"jesper.sikanda.be" => "Jesper Cockx",
"man.ifconfig.se" => "Jesper Wallin",
"jezs00.medium.com" => "Jess Farber",
"www.librarian.net" => "Jessamyn West",
"blog.jesse-anderson.net" => "Jesse Anderson",
"jesseduffield.com" => "Jesse Duffield",
"jessewarden.com" => "Jesse Warden",
"blog.jse.li" => "Jesse Li",
"jessesingal.substack.com" => "Jesse Singal",
"ospi.fi" => "Jesse Sandberg",
"jessitron.com" => "Jessica Kerr",
"discombobulated.co.nz" => "Jessica Nickelsen",
"blog.jessfraz.com" => "Jessie Frazelle",
"jetgirl.art" => "JetGirlArt",
"www.jetnet.com" => "JETNET",
"jewishjournal.com" => "Jewish Journal",
"www.jewishnews.co.uk" => "Jewish News",
"www.jweekly.com" => "Jewish News",
"www.jewishpress.com" => "Jewish Press",
"www.jezebel.com" => "Paste Media Group",
"jezenthomas.com" => "Jezen Thomas",
"jezper.se" => "Jezper Lorné",
"jfrog.com" => "JFrog",
"www.jihadwatch.org" => "Jihad Watch",
"jilliancyork.com" => "Jillian C York",
"jillwohlner.com" => "Jill Wohlner",
"jlelliotton.blogspot.com" => "Jim Elliott",
"internetperdition.wordpress.com" => "Jim Garrett",
"blog.jimgrey.net" => "Jim Grey",
"dev.jimgrey.net" => "Jim Grey",
"jimmitchell.org" => "Jim Mitchell",
"blog.jim-nielsen.com" => "Jim Nielsen",
"www.jipitec.eu" => "JIPITEC",
"jpospisil.com" => "Jiri Pospisil",
"jishu.bearblog.dev" => "Jishu",
"jitsi.org" => "Jitsi",
"jitsi.support" => "Jitsi-Meet",
"www.jkrowling.com" => "JK Rowling",
"blog.jmp.chat" => "JMP",
"www.jns.org" => "JNS",
"www.joabj.com" => "Joab Jackson",
"joanwestenberg.com" => "Joan Westenberg",
"jobgether.com" => "Jopgether SRL",
"artlung.com" => "Joe Crawford",
"jo.ie" => "Joe Davis",
"bitworking.org" => "Joe Gregorio",
"rhonabwy.com" => "Joe Heck",
"crowprose.com" => "Joe McKenney",
"joelchrono.xyz" => "Joel Chrono",
"joeldueck.com" => "Joel Dueck",
"jgoguen.ca" => "Joel Goguen",
"joelgustafson.com" => "Joel Gustafson",
"www.millersbookreview.com" => "Joel J Miller",
"www.idatum.net" => "Joel P",
"nerderati.com" => "Joël Perras",
"www.joelonsoftware.com" => "Joel Spolsky",
"blog.joemag.dev" => "Joe Magerramov",
"joemorrison.substack.com" => "Joe Morrison",
"blog.krakjoe.ninja" => "Joe Watkins",
"joeyehand.com" => "Joey Einerhand",
"joeyh.name" => "Joey Hess",
"www.johanbleuzen.fr" => "Johan Bleuzen",
"johan.hal.se" => "Johan Halse",
"www.johanl.se" => "Johan Larsson",
"blog.johannes-mittendorfer.com" => "Johannes Mittendorfer",
"weberblog.net" => "Johannes Weber",
"jwillbold.com" => "Johannes Willbold",
"john.ankarstrom.se" => "John Ankarström",
"www.engineersneedart.com" => "John Calhoun",
"www.johndcook.com" => "John D Cook",
"changelog.complete.org" => "John Goerzen",
"www.complete.org" => "John Goerzen",
"blog.jgc.org" => "John Graham Cumming",
"www.jrgsystems.com" => "John Grafton",
"daringfireball.net" => "John Gruber",
"www.dirtyfeed.org" => "John J Hoare",
"johnlian.net" => "John Lian",
"john.measey.com" => "John Measey",
"johnmenadue.com" => "John Menadue",
"lindbakk.com" => "John Mikael Lindbakk",
"www.ke5fx.com" => "John Miles, KE5FX",
"memex.naughtons.org" => "John Naughton",
"notgull.net" => "John Nunley",
"ghost.onolan.org" => "John O'Nolan",
"john.onolan.org" => "John O'Nolan",
"blog.johnozbay.com" => "John Ozbay",
"computeradsfromthepast.substack.com" => "John Paul Wohlscheid",
"johnpilger.com" => "John Pilger",
"genehack.blog" => "John S J Anderson",
"www.quadibloc.com" => "John Savard",
"nachtimwald.com" => "John Schember",
"johnstawinski.com" => "John Stawinski IV",
"johnnydecimal.com" => "Johnny Decimal",
"joinup.ec.europa.eu" => "Joinup",
"jon.chrt.dev" => "Jon Charter",
"blog.jonudell.net" => "Jon Udell",
"jnsgr.uk" => "Jon Seager",
"jonwillia.ms" => "Jon Williams",
"blog.jonlu.ca" => "Jon Luca DeCaro",
"jbb.ghsq.ga" => "Jonah Brüchert",
"jonas.brusman.se" => "Jonas Brusman",
"jonashaslbeck.com" => "Jonas Haslbeck",
"www.jonashietala.se" => "Jonas Hietala",
"jssfr.de" => "Jonas Schäfer",
"jcarroll.com.au" => "Dr Jonathan Carroll",
"professional-troublemaker.com" => "Jonathan Corbett",
"jmtd.net" => "Jonathan Dowland",
"www.terracrypt.net" => "Jonathan Frederickson",
"jonathan-frere.com" => "Jonathan Frere",
"jonathanhaidt.com" => "Jonathan Haidt",
"blog.kamens.us" => "Jonathan Kamens",
"yonkeltron.com" => "Jonathan E Magen",
"thejpster.org.uk" => "Jonathan Pallant",
"jriddell.org" => "Jonathan Riddell",
"jonathanturley.org" => "Jonathan Turley",
"xyinn.org" => "Jonathan Vasquez",
"www.jonathanychan.com" => "Jonathan Y Chan",
"rightofpublicity.com" => "Jonathan Faber",
"www.jonoalderson.com" => "Jono Alderson",
"memorici.de" => "Jons Mostovojs",
"gekkio.fi" => "Joonas Javanainen",
"joonas.fi" => "Joonas Loppi",
"joost.blog" => "Joost de Valk",
"jordancooks.net" => "Jordan CookCooks",
"geoghegan.ca" => "Jordan Geoghegan",
"jordankaye.dev" => "Jordan Kaye",
"blog.jordan.matelsky.com" => "Jordan Matelsky",
"jordanreger.com" => "Jordan Reger",
"www.worldofreel.com" => "Jordan Ruimy",
"www.jordantimes.com" => "The Jordan Times",
"jordan-wright.com" => "Jordan Write",
"www.zeropartydata.es" => "Jorge García Herrero",
"jorgemorais.gitlab.io" => "Jorge Morais",
"jorgesanz.net" => "Jorge Sanz",
"jorin.me" => "Jorin",
"josvisser.substack.com" => "Jos Visser",
"www.josemunozmatos.com" => "Jose Munoz",
"josezarazua.com" => "Jose Zarazua",
"jointhefreeworld.org" => "Josep Bigorra",
"www.saverilawfirm.com" => "Joseph Saveri Law Firm",
"githubcopilotinvestigation.com" => "Joseph Saveri Law Firm",
"llmlitigation.com" => "Joseph Saveri Law Firm",
"githubcopilotlitigation.com" => "Joseph Saveri Law Firm",
"joshallan.com" => "Josh Allan Dykstra",
"joshaustin.tech" => "Josh Austin",
"joshbersin.com" => "Josh Bersin",
"josh.blog" => "Josh Betz",
"bersinjosh.blog" => "Josh Betz",
"commaok.xyz" => "Josh Bleecher Snyder",
"josh.is-cool.dev" => "Josh Byrd",
"joshldavis.com" => "Josh Davis",
"cyberb.space" => "Josh Erb",
"codingitwrong.com" => "Josh Justice",
"www.joshmcguigan.com" => "Josh Mcguigan",
"causality.blog" => "Josh Segall",
"thingswemake.com" => "Josh Sucher",
"joshwithers.blog" => "Josh Withers",
"joshblais.com" => "Joshua Blais",
"kennedn.com" => "Joshua Kennedy",
"joshua-laughner.io" => "Dr Joshua Laughner",
"joshuapsteele.com" => "Joshua P Steele",
"joshua.hu" => "Joshua Rogers",
"www.journee-mondiale.com" => "Journées Mondiales",
"freedomnews.org.uk" => "Journal of Anarchist Socialism",
"www.journaloffreespeechlaw.org" => "Journal of Free Speech Law",
"jpegxl.io" => "JPEG XL Converter",
"jpieper.com" => "J Pieper",
"jrs-s.net" => "JRS Systems",
"jrswab.com" => "JR Swab",
"kernelpanic.life" => "Jsf0",
"daily.jstor.org" => "JSTOR",
"www.jstor.org" => "JSTOR",
"judecnelson.blogspot.com" => "Jude C Nelson",
"www.jntrnr.com" => "JT",
"jbrio.net" => "Juan B Rodriguez",
"www.jernesto.com" => "Juan Ernesto",
"www.usebox.net" => "Juan J Martínez",
"juerd.nl" => "Juerd Waalboer",
"hamatti.org" => "Juha-Matti Santala",
"www.syntaxerror.tech" => "Juha-Matti Santala",
"lehtimaeki.medium.com" => "Juhani Lehtimäki",
"cetaceanneeded.com" => "Julia Freeman",
"juliadatascience.io" => "Julia Programming Language",
"juliacon.org" => "Julia Programming Language",
"info.juliahub.com" => "Julia Programming Language",
"julialang.org" => "Julia Programming Language",
"www.juliabloggers.com" => "Julia Language Blog Aggregator",
"jvns.ca" => "Julia Evans",
"blog.jak-linux.org" => "Julian Andres Klode",
"jupe.studio" => "Julian Peters",
"www.cartoongravity.com" => "Julian Simpson",
"juliareda.eu" => "Julia Reda",
"jub0bs.com" => "Julien Cretel",
"julsimon.medium.com" => "Julien Simon",
"blog.cr0.org" => "Julien Tinnes",
"dustri.org" => "Julien Voisin",
"juliette.zone" => "The Juliette Zone",
"blog.julik.nl" => "Julik Tarkhanov",
"jumpcloud.com" => "Jump Cloud",
"www.jumpingrivers.com" => "Jumping Rivers",
"blogs.juniper.net" => "Juniper Networks",
"www.jupiterbroadcasting.com" => "Jupiter Broadcasting",
"tante.cc" => "Jürgen Geuter",
"www.jurist.org" => "JURIST",
"nibblestew.blogspot.com" => "Jussi Pakkanen",
"justenergy.com" => "Just Energy Texas LP",
"www.justsecurity.org" => "Just Security",
"patents.justia.com" => "Justia",
"justinblank.com" => "Justin Blank",
"jmduke.com" => "Justin Duke",
"www.jmduke.com" => "Justin Duke",
"justingarrison.com" => "Justin Garrison",
"www.justinmklam.com" => "Justin Lam",
"blog.jle.im" => "Justin Le",
"www.jmeiners.com" => "Justin Meiners",
"justinmiller.io" => "Justin Miller",
"justinvollmer.com" => "Justin Vollmer",
"www.justinvollmer.com" => "Justin Vollmer",
"justin.searls.co" => "Justin Searls",
"justine.lol" => "Justine Tunney",
"blog.jutty.dev" => "Jutty.dev",
"blog.bdw.li" => "JWB",
"jyn.dev" => "JYN",
"k3tan.com" => "K3tan",
"blog.kagi.com" => "Kagi",
"blog.xiaket.org" => "夏恺/Kai Xia",
"blog.broulik.de" => "Kai Uwe",
"nadh.in" => "Kailash Nadh",
"kaiwenwang.com" => "Kaiwen Wang",
"www.kali.org" => "Kali Linux",
"www.discovermagazine.com" => "Kalmback Media Co",
"blog.kalvad.com" => "Kalvad",
"www.bitsaboutmoney.com" => "Kalzumeus Software LLC",
"palaiologos.rocks" => "Kamila Szewczyk",
"kanenarraway.com" => "Kane Narraway",
"www.kansascity.com" => "Kansas City",
"www.kansaslegalservices.org" => "Kansas Legal Services",
"kansasreflector.com" => "Kansas Reflector",
"securelist.com" => "Kapersky",
"mrkaran.dev" => "Karan Sharma",
"kcoyle.blogspot.com" => "Karen Coyle",
"kcoyle.net" => "Karen Coyle",
"semaphore.substack.com" => "Karina Nguyen",
"www.karl.berlin" => "Karl Bartel",
"karlbode.com" => "Karl Bode",
"dbdemon.com" => "Karl Levik",
"www.openmymind.net" => "Karl Seguin",
"www.technicalsourcery.net" => "Karl Stenerud",
"www.karlsutt.com" => "Karl Sutt",
"karl-voit.at" => "Karl Voit",
"www.karl-voit.at" => "Karl Voit",
"kasiin.top" => "Kasiin",
"kaspth.com" => "Kasper Timm Hansen",
"www.kaspersky.com" => "Kaspersky",
"www.talkingclimate.ca" => "Katharine Hayhoe",
"mysweetdumbbrain.substack.com" => "Katie Hawkins-Gaar",
"blog.kaving.me" => "Kavin Gnanapandithan",
"technicalwriting.dev" => "Kayce Basques",
"www.biodigitaljazz.net" => "Kayce Basques",
"justanerds.site" => "KLD",
"kmx.io" => "KMX.io",
"neal-photography.jimdoweb.com" => "Neal McQueen",
"nealstephenson.substack.com" => "Neal Stephenson",
"english.khabarhub.com" => "Nepal",
"kathmandupost.com" => "Nepal",
"www.nepalitimes.com" => "Nepal Times",
"blog.kraken.com" => "KDAE",
"blogs.kde.org" => "KDE",
"community.kde.org" => "KDE",
"eco.kde.org" => "KDE",
"mail.kde.org" => "KDE",
"gkeenan.co" => "Keenan",
"keepandroidopen.org" => "Keep Android Open",
"keepassxc.org" => "KeePassXC",
"www.keithcirkel.co.uk" => "Keith Cirkel",
"useyourloaf.com" => "Keith Harrison",
"keithlovesmovies.com" => "Keith Loves Movies",
"keivan.io" => "Keivan Beigi",
"argemma.com" => "Kelby Ludwig",
"lightroomkillertips.com" => "KelbyOne",
"laughingmeme.org" => "Kellan Elliott-McCrea",
"blog.kellybrazil.com" => "Kelly Brazil",
"organizingmythoughts.org" => "Kelly Hayes",
"kellyshortridge.com" => "Kelly Shortridge",
"www.stuff.tv" => "Kelsey Media",
"hyperborea.org" => "Kelson Vibber",
"journal.kvibber.com" => "Kelson Vibber",
"blog.kemonine.info" => "KemoNine",
"kenkantzer.com" => "Ken Kantzer",
"www.kenklippenstein.com" => "Ken Klippenstein",
"www.righto.com" => "Ken Shirriff",
"www.kenkoonwong.com" => "Ken Koon Wong",
"kozume.neocities.org" => "Kenma",
"blog.thelifeofkenneth.com" => "Kenneth Finnegan",
"kennethreitz.org" => "Kenneth Reitz",
"www.kentonline.co.uk" => "Kent UK",
"kentwired.com" => "The Kent Stater",
"kentuckylantern.com" => "Kentucky Lantern",
"www.k24tv.co.ke" => "Kenya",
"www.the-star.co.ke" => "Kenya",
"kenyan-post.com" => "Kenya",
"datareportal.com" => "Kepios",
"kerrick.blog" => "Kerrick Long",
"ketanjoshi.co" => "Ketan Joshi",
"vowel.space" => "Kevin B McGowan",
"doublepulsar.com" => "Kevin Beaumont",
"kevinboone.me" => "Kevin Boone",
"kevin.burke.dev" => "Kevin Burke",
"myconscious.stream" => "Kevin C Tofel",
"kevincox.ca" => "Kevin Cox",
"kk.org" => "Kevin Kelly",
"lawver.net" => "Kevin Lawver",
"kliu.io" => "Kevin Liu",
"kmcd.dev" => "Kevin McDonald",
"kn100.me" => "Kevin Norman",
"www.loweringthebar.net" => "Kevin Underhill",
"cliophate.wtf" => "Kevin Wammer",
"overkill.wtf" => "Kevin Wammer",
"interconnected.blog" => "Kevin Xu",
"kevq.uk" => "Kev Quirk",
"kevquirk.com" => "Kev Quirk",
"keymaterial.net" => "Key Material",
"www.canadianlawyermag.com" => "Key Media",
"keygen.sh" => "Keygen LLC",
"kffhealthnews.org" => "KFF Health News",
"www.kff.org" => "KFF",
"khn.org" => "KFF",
"kfgo.com" => "KFGO Radio",
"kgab.com" => "KGAB Radio",
"www.kjzz.org" => "KJZZ Radio",
"www.khaama.com" => "Khaama Press",
"www.khaosodenglish.com" => "Khaosod",
"sciops.net" => "KHM",
"www.kianryan.co.uk" => "Kian Ryan",
"www.kickstarter.com" => "Kicksterter PBC",
"www.uni-kiel.de" => "Kiel University",
"kieranhealy.org" => "Kieran Healy",
"kdhnews.com" => "Killeen Daily Herald, Texas",
"www.komando.com" => "Kim Kommando",
"www.insideedition.com" => "King World Productions Inc",
"chauhankiran.blogspot.com" => "Kiran Chauhan",
"kirby.kevinson.org" => "Kirby Kevinson",
"kirill.korins.ky" => "Kirill A Korinsky",
"nocto.com" => "Kirsty Darbyshire",
"www.kirupa.com" => "Kirupa",
"kittenlabs.de" => "KittenLabs",
"kivikakk.ee" => "Kivikakk",
"klarasystems.com" => "Klara",
"www.kleefeldoncomics.com" => "Kleefeld on Comics",
"copyrightblog.kluweriplaw.com" => "Kluwer Law",
"debugging.works" => "Kmille",
"www.kmx.io" => "Kmx.io",
"blog.knoldus.com" => "Knoldus",
"blog.knowbe4.com" => "KnowBe4",
"knownhosts.net" => "KnownHosts",
"kmaasrud.com" => "Knut Magnus Aasrud",
"kodi.tv" => "Kodi Foundation",
"simone.org" => "Kōdō Simone",
"kodsnack.se" => "Kodsnack",
"blog.koehntopp.info" => "Koehntopp",
"www.koi.ai" => "Koi Security Ltd",
"s8297.pcdn.co" => "Kojo Nnamdi",
"kokada.dev" => "Kokada",
"koliasa.com" => "Koliasa",
"www.kolide.com" => "Kolide Inc",
"www.1011now.com" => "KOLN TV",
"www.1011now.com" => "KOLN TV",
"www.komu.com" => "KOMU TV",
"blog.khinsen.net" => "Konrad Hinsen",
"konstantintutsch.com" => "Konstantin Tutsch",
"www.kooslooijesteijn.net" => "Koos Looijesteijn",
"korcenji.neocities.org" => "Korcenji",
"www.koreaherald.com" => "Korea Herald",
"koreatimes.co.kr" => "The Korea Times",
"www.koreatimes.co.kr" => "The Korea Times",
"interplayoflight.wordpress.com" => "Kostas Anagnostou",
"sw.kovidgoyal.net" => "Kovid Goyal",
"kowabit.de" => "Kowabit",
"www.kpbs.org" => "KPBS TV",
"advisory.kpmg.us" => "KPMG",
"kpmg.com" => "KPMG International",
"www.kqed.org" => "KQED TV",
"kqx.io" => "KQX",
"krdo.com" => "KRDO TC",
"krfnd.org" => "KR Foundation",
"krebsonsecurity.com" => "Krebs On Security",
"krisshrishak.de" => "Dr Kris Shrishak",
"kristiedegaris.substack.com" => "Kristie De Garis",
"kiko.io" => "Kristof Zerbe",
"krita.org" => "Krita",
"www.whmi.com" => "Krol Communications Inc",
"www.kroll.com" => "Kroll",
"krzysztofjankowski.com" => "Krzysztof Krystian Jankowski",
"blog.kowalczyk.info" => "Krzysztof Kowalczyk",
"www.ksat.com" => "KSAT TV",
"www.kshb.com" => "KSHB TC",
"www.ksl.com" => "Deseret Media",
"kstp.com" => "KSTP TV",
"ktar.com" => "KTAR Radio",
"www.ktnv.com" => "KTNV TV",
"kunnamon.io" => "Kunnamon",
"www.kunc.org" => "KUNC Radio",
"kuow.org" => "KUOW Radio",
"www.kuow.org" => "KUOW TV",
"krabf.com" => "Kushaiah Felisilda",
"kvoa.com" => "KVOA TV",
"kurtmckee.org" => "Kurt McKee",
"ky.fyi" => "Ky Decker",
"kyefox.com" => "Kye Fox",
"downloads.kemitchell.com" => "Kyle E Mitchell",
"writing.kemitchell.com" => "Kyle E Mitchell",
"houseofkyle.com" => "Kyle Ford",
"aphyr.com" => "Kyle Kingsbury",
"kcimc.medium.com" => "Kyle McDonald",
"kylemcdonald.net" => "Kyle McDonald",
"www.kylereddoch.me" => "Kyle Reddoch",
"kyivindependent.com" => "The Kyiv Independent",
"kyrylo.org" => "Kyrylo Silin",
"tia.mat.br" => "L A F Pereira",
"ldstephens.net" => "L D Stephens",
"lab6.com" => "Lab6",
"labzilla.io" => "LabZilla",
"mydbanotebook.org" => "Lætitia Avrot",
"ladybird.org" => "The Ladybird Browser Initiative",
"www.lagerdata.com" => "Lager",
"lalitm.com" => "Lalit Maganti",
"lambdaland.org" => "Lambda Land",
"lambdacreate.com" => "(λ (x) (create x) '(knowledge))",
"www.lambiek.net" => "Lambiek Comix-Strips",
"lantian.pub" => "Lan Tian",
"www.lep.co.uk" => "Lancashire",
"landreport.com" => "Land Report",
"lapcatsoftware.com" => "Lap Cat Software",
"www.laphamsquarterly.org" => "Laphams Quarterly",
"www.laprogressive.com" => "LA Progressive",
"www.laptopmag.com" => "Laptop Magazine",
"www.laquadrature.net" => "La Quadature Du Net",
"www.repubblica.it" => "la Repubblica",
"lakepowellchronicle.com" => "Lake Powell Chronicle",
"laker.tech" => "Laker Turner",
"www.huttu.net" => "Lari Huttunen",
"bitbanksoftware.blogspot.com" => "Larry Bank",
"larsfaye.com" => "Lars Faye",
"lars.ingebrigtsen.no" => "Lars Ingrebrigtsen",
"larslofgren.com" => "Lars Lofgren",
"larstofus.com" => "Lars Thießen",
"blog.liw.fi" => "Lars Wirzenius",
"doc.liw.fi" => "Lars Wirzenius",
"liw.fi" => "Lars Wirzenius",
"lars-christian.com" => "Lars-Christian Simonsen",
"las.rs" => "Las Safin",
"blog.lastpass.com" => "LastPass",
"lastrealindians.com" => "Last Real Indians",
"lastrealindians.com" => "Last Real Indians",
"www.lastweekinaws.com" => "Last Week In AWS",
"www.reviewjournal.com" => "Las Vegas Review Journal",
"lasvegassun.com" => "Las Vegas Sun",
"lasans.blog" => "Lasan",
"www.biobits.be" => "László Kupcsik",
"latacora.micro.blog" => "Latacora LLC",
"www.latacora.com" => "Latacora LLC",
"latestherald.com" => "Latest Herald",
"latenightsw.com" => "Late Night Software Ltd",
"www.latinpost.com" => "Latin Post",
"www.latintimes.com" => "Latin Times",
"eng.lsm.lv" => "Latvia",
"www.lvrtc.lv" => "Latvia State Radio and Television Center",
"mitten.lol" => "Laura Fisher",
"liberda.nl" => "Lauren N Liberda",
"blog.dend.ro" => "Laurențiu Nicola",
"lawandcrime.com" => "Law And Crime",
"www.lawsociety.org.uk" => "Law Society",
"www.lawsociety.ie" => "Law Society of Ireland",
"www.lawliberty.org" => "Law And Liberty",
"www.lawfareblog.com" => "Lawfare",
"www.lawfaremedia.org" => "The Lawfare Institute",
"www.lawgazette.co.uk" => "Law Society Gazette",
"blog.gripdev.xyz" => "Lawrence Gripper",
"www.teamten.com" => "Lawrence Kesteloot",
"tratt.net" => "Lawrence Tratt",
"forum.lazarus.freepascal.org" => "Lazarus and Free Pascal Team",
"lazyfoo.net" => "Lazy Foo",
"www.lbc.co.uk" => "LBC",
"www.lbjlibrary.org" => "LBJ Presidential Library",
"lcamtuf.substack.com" => "Lcamtuf",
"lea.verou.me" => "Lea Verou",
"www.leadedsolder.com" => "Leadedsolder",
"contrachrome.com" => "Leah Elliott",
"leahneukirchen.org" => "Leah Neukirchen",
"leah.is" => "Leah Oswald",
"learnxinyminutes.com" => "Learn X in Y minutes",
"learnlinuxandlibreoffice.org" => "LearnLinuxAndLibreOffice",
"www.ledgerinsights.com" => "Ledger Insights",
"www.ledger.com" => "Ledger SAS",
"leanrada.com" => "Lean Rada",
"leandronsp.com" => "Leandro Proença",
"leanpub.com" => "Ruboss Technology Corp",
"leebriggs.co.uk" => "Lee Briggs",
"ljpuk.net" => "Lee Peterson",
"yingtongli.me" => "Lee Yingtong Li",
"lefred.be" => "Lefred",
"www.legacy.com" => "Legacy",
"lasclev.org" => "The Legal Aid Society of Cleveland",
"legallayer.substack.com" => "Legal Layer",
"knsiradio.com" => "Leighton Broadcasting",
"www.lelanthran.com" => "Lelanthran Manickum",
"len.falken.ink" => "Len Falken",
"www.alevsk.com" => "Lenin Alevski",
"leolabs.org" => "Leo Bernard",
"theleo.zone" => "Leo Robinovitch",
"leonfurze.com" => "Leon Furze",
"lmika.org" => "Leon Mika",
"www.thedigitalcatonline.com" => "Leonardo Giordani",
"www.leoniemonigatti.com" => "Leonie Monigatti",
"leontrolski.github.io" => "Leontrolski",
"lesleylai.info" => "Lesley Lai",
"www.lesswrong.com" => "Less Wrong",
"letsencrypt.org" => "Let's Encrypt",
"lettersofnote.com" => "Letters of Note",
"levlaz.org" => "Lev Lazinskiy",
"levelup.gitconnected.com" => "Level Up Coding",
"lewiscampbell.tech" => "Lewis Campbell",
"www.lewis8s.codes" => "Lewis Codes",
"lewisdale.dev" => "Lewis Dale",
"lexfridman.com" => "Lex Fridman",
"www.lexology.com" => "Lexology",
"lia.mg" => "Liam Galvin",
"liam-on-linux.dreamwidth.org" => "Liam Proven",
"liam-on-linux.livejournal.com" => "Liam Proven",
"planb.nicecupoftea.org" => "Libby Miller",
"libcom.org" => "Libcom",
"cpucycles.cr.yp.to" => "Libcpucycles",
"libereurope.eu" => "LIBER",
"libera.chat" => "Libera Chat",
"www.liberalcurrents.com" => "Liberal Currents",
"www.econlib.org" => "Liberty Fund Inc",
"liblouis.org" => "Liblouis",
"bibliotekettarsaka.com" => "Library Case",
"blog.librarything.com" => "Library Thing",
"libreboot.org" => "LibreBoot",
"libreelec.tv" => "LibreELEC",
"thelibre.news" => "LibreNews",
"extensions.libreoffice.org" => "LibreOffice",
"help.libreoffice.org" => "LibreOffice",
"libreoffice-dev.blogspot.com" => "LibreOffice",
"media.libreplanet.org" => "Libre Planet",
"blog.libtorrent.org" => "Libtorrent",
"www.libyanexpress.com" => "Libya",
"licenseuse.org" => "Licensing",
"lichen.sensorstation.co" => "Lichen CMS",
"www.lieffcabraser.com" => "Lieff Cabraser Hiemann and Bernstein",
"www.lifehack.org" => "Lifehack",
"www.reviewgeek.com" => "LifeSavvy Media",
"www.lifewire.com" => "Lifewire",
"www.lightbluetouchpaper.org" => "Light Blue Touchpaper",
"liliputing.com" => "Liliputing",
"lina.sh" => "Lina",
"www.linaro.org" => "Linaro",
"robotmoon.com" => "Linmiao Xu",
"www.linode.com" => "Linode",
"linusakesson.net" => "Linus Åkesson",
"www.linusakesson.net" => "Linus Åkesson",
"linus.schreibt.jetzt" => "Linus Heckemann",
"lkml.org" => "Linux",
"www.lkml.org" => "Linux",
"wiki.nftables.org" => "Linux",
"lore.kernel.org" => "Linux mailing lists",
"people.kernel.org" => "Linux",
"mirror.linux.org.au" => "Linux Australia",
"www.linuxbabe.com" => "Linux Babe",
"linuxcapable.com" => "Linux Capable",
"linuxgizmos.com" => "Linux Gizmos",
"linuxhandbook.com" => "Linux Handbook",
"linuxhint.com" => "Linux Hint",
"linuxiac.com" => "Linuxiac",
"linuxinsider.com" => "Linux Insider",
"www.linux.it" => "Linux IT",
"www.linuxjournal.com" => "Linux Journal",
"www.linuxlinks.com" => "Linux Links",
"www.linuxmadesimple.info" => "Linux Made Simple",
"www.linux-magazine.com" => "Linux Magazine",
"blog.linuxmint.com" => "Linux Mint",
"forums.linuxmint.com" => "Linux Mint",
"linmob.net" => "Linux On Mobile",
"linuxphoneapps.org" => "Linux Phone Apps",
"www.linuxpromagazine.com" => "Linux Pro Magazine",
"www.linuxquestions.org" => "Linux Questions",
"ploum.be" => "Lionel Dricot",
"ploum.net" => "Lionel Dricot",
"lionsos.org" => "The Lions Operating System",
"lithub.com" => "Literary Hub",
"www.livelaw.in" => "Live Law",
"liverungrow.medium.com" => "LiveRunGrow",
"discourse.llvm.org" => "LLVM Discussion Forums",
"blog.llvm.org" => "LLVM Project",
"blogs.loc.gov" => "US Library of Congress",
"digitalpreservation.gov" => "US Library of Congress",
"www.loc.gov" => "US Library of Congress",
"thelocalstack.eu" => "The Local Stack",
"www.cornwalllive.com" => "Local World",
"www.gloucestershirelive.co.uk" => "Local World",
"www.lockss.org" => "LOCKSS Program",
"ipv4a-5539ad.gitlab.io" => "Lockywolf",
"locusmag.com" => "Locus Magazine",
"loganius.org" => "Loganius",
"loggingsucks.com" => "Logging Sucks",
"logicmag.io" => "Logic Magazine",
"www.logikalsolutions.com" => "Logikal Solutions",
"blog.logrocket.com" => "LogRocket Inc",
"lonami.dev" => "Lonami",
"londonnewstime.com" => "London",
"dimtion.fr" => "Loïc Carr",
"islingtontribune.com" => "London",
"www.the-londoner.co.uk" => "The Londoner",
"www.lonelyplanet.com" => "Lonely Planet",
"thelongcontext.com" => "The Long Context",
"loomcom.com" => "Loom Communications, LLC",
"www.loper-os.org" => "LoperOS",
"surfingcomplexity.blog" => "Lorin Hochstein",
"kristoff.it" => "Loris Cro",
"www.lamag.com" => "Los Angeles Magazine",
"highschool.latimes.com" => "Los Angeles Times",
"www.latimes.com" => "Los Angeles Times",
"loscampesinos.com" => "Los Campesinos",
"louderthanwar.com" => "Louder Than War",
"louplummer.lol" => "Lou Plummer",
"amerpie.lol" => "Lou Plummer",
"lmnt.me" => "Louie Mantia",
"blog.dureuill.net" => "Louis Dureuil",
"far.computer" => "Louis Merlin",
"lailluminator.com" => "Louisiana Illuminator",
"loup-vaillant.fr" => "Loup Vaillant",
"heyloura.com" => "Loura",
"louwrentius.com" => "Louwrentius",
"lowlevel.fun" => "Low Level Fun",
"loworbitsecurity.com" => "Low Orbit Security",
"solar.lowtechmagazine.com" => "Low Tech Mag",
"www.lowtechmagazine.com" => "Low Tech Mag",
"www.lowpass.cc" => "Lowpass Media LLC",
"www.lowyinstitute.org" => "Lowy Institute",
"cs.lmu.edu" => "Loyola Marymount University",
"blogs.luc.edu" => "Loyola University Chicago",
"www.lrt.lt" => "LRT",
"lowerraritanwatershed.org" => "LRWP",
"blogs.lse.ac.uk" => "LSE",
"blog.lenot.re" => "Luc Lenôtre",
"lukefleed.xyz" => "Luca Lombardo",
"ageinghacker.net" => "Luca Saiu",
"lucas.art" => "Lucas da Silva",
"lucasgroup.com.au" => "Lucas Group",
"lucasfcosta.com" => "Lucas F Costa",
"scharenbroch.dev" => "Lucas Scharebroch",
"lucianonooijen.com" => "Luciano Nooijen",
"ludic.mataroa.blog" => "Lucidity",
"blog.phundrak.com" => "Lucien Cartier-Tilet",
"livefreeordichotomize.com" => "Lucy D'Agostino McGowan & Nick Strayer",
"nbtv.substack.com" => "Ludlow Institute",
"ludovic.hirlimann.net" => "Ludovic Hirlimann",
"mzll.it" => "Luigi Mozzillo",
"lqdev.me" => "Luis Quintanilla",
"www.luisquintanilla.me" => "Luis Quintanilla",
"lalinsky.com" => "Lukáš Lalinský",
"hauleth.dev" => "Łukasz Niemier",
"blog.lukaszolejnik.com" => "Lukasz Olejnik",
"www.unterminated.com" => "Luke",
"www.lkhrs.com" => "Luke Harris",
"lukelau.me" => "Luke Lau",
"lukeplant.me.uk" => "Luke Plant",
"lukerissacher.com" => "Luke Rissacher",
"luke8086.dev" => "Luke S",
"blog.luke.wf" => "Luke W Faraone",
"blog.lumen.com" => "Lumen Technologies",
"www.lumi-supercomputer.eu" => "LUMI",
"blog.foxtrotluna.social" => "Luna Winters",
"www.lusakatimes.com" => "Lusaka ZM",
"www.lustre.org" => "Lustre",
"www.lut.fi" => "LUT University",
"lwn.net" => "LWN",
"lxer.com" => "LXer",
"blog.lyokolux.space" => "Lykolux",
"lyra.horse" => "Lyra",
"lytagold.substack.com" => "Lyta Gold",
"tales.mbivert.com" => "Mbivert",
"spyglass.org" => "M G Siegler",
"genius.com" => "ML Genius Holdings LLC",
"mlq.ai" => "MLQ",
"www.filmvanalledag.nl" => "Maarten",
"cheerful.nl" => "Maarten Janssen",
"www.mcls.io" => "Maarten Claes",
"vanemden.wordpress.com" => "Maarten van Emden",
"proycon.anaproy.nl" => "Maarten van Gompel",
"www.macchaffee.com" => "Mac Chaffee",
"www.macobserver.com" => "Mac Observer",
"ports.macports.org" => "Mac Ports",
"macprotricks.com" => "Mac Pro Tricks",
"www.macaubusiness.com" => "Macau Business",
"macaudailytimes.com.mo" => "Macau Daily Times",
"macleans.ca" => "Maclean's",
"macdailynews.com" => "MacDailyNews",
"machielreyneke.com" => "Machiel Reyneke",
"www.macrotrends.net" => "Macrotrends",
"forums.macrumors.com" => "MacRumors",
"www.macrumors.com" => "MacRumors",
"www.macstories.net" => "MacStories Inc",
"www.macworld.com" => "Macworld",
"madisoncollege.edu" => "Madison Area Technical College",
"adtechmadness.wordpress.com" => "Madtech",
"maggieappleton.com" => "Maggie Appleton",
"maheshba.bitbucket.io" => "Mahesh Balakrishnan",
"marc.info" => "Mailing list ARChives",
"www.mail-archive.com" => "Mailing List Archives",
"malisper.me" => "Mailisper",
"www.mailpile.is" => "Mailpile",
"www.majavantila.fi" => "Majavan tila osk",
"maitriyana.com" => "Maitriyana",
"mainichi.jp" => "The Mainchi Newspapers",
"apps.web.maine.gov" => "Maine",
"www.maine.gov" => "Maine",
"www.maineruleoflaw.org" => "Maine Lawyers for the Rule of Law",
"mainemorningstar.com" => "Maine Morning Star",
"makezine.com" => "Make",
"makemyday.free.fr" => "Make My Day Records",
"www.makery.info" => "Makery",
"www.maketecheasier.com" => "Make Tech Easier",
"www.makeuseof.com" => "Make Use Of",
"makoism.com" => "Makoism",
"www.malaymail.com" => "Malay Mail",
"paultan.org" => "Malaysia",
"malcolmcoles.com" => "Malcom Coles",
"pid1.dev" => "Malcom Coles",
"blog.malwarebytes.com" => "Malwarebytes Labs",
"www.malwarebytes.com" => "Malwarebytes Labs",
"www.industrialempathy.com" => "Malte Ubl",
"www.seat61.com" => "The Man in Seat Sixty-One",
"manofmany.com" => "Man of Many Pty Ltd",
"aworkinglibrary.com" => "Mandy Brown",
"everythingchanges.us" => "Mandy Brown",
"managedtechservices.com" => "Managed Technology Services",
"www.manchestereveningnews.co.uk" => "Manchester Evening News",
"themanchestermirror.com" => "The Manchester Mirror",
"mandarismoore.com" => "Mandaris Moore",
"www.mandiant.com" => "Mandiant",
"manishrjain.com" => "Manish R Jain",
"english.manoramaonline.com" => "Manorama Online",
"www.inc.com" => "Mansueto Ventures",
"www.manton.org" => "Manton Reece",
"manualredeye.com" => "Manual High School",
"manuelmoreale.com" => "Manuel Moreale",
"www.htmhell.dev" => "Manuel Matuzović",
"www.matuzo.at" => "Manuel Matuzović",
"manypossibilities.net" => "Many Possibilities",
"blog.mapotofu.org" => "Mapotofu",
"marcamos.com" => "Marc Amos",
"brooker.co.za" => "Marc Brooker",
"marc.merlins.org" => "Marc Merlin",
"www.mrochkind.com" => "Marc Rochkind",
"www.coding2learn.org" => "Marc Scott",
"huphtur.nl" => "Marcel Appelman",
"mmk2410.org" => "Marcel Kapfer",
"www.kolaja.eu" => "Marcel Kolaja",
"blog.metaobject.com" => "Marcel Weiher",
"marcin.juszkiewicz.com.pl" => "Marcin Juszkiewicz",
"aresluna.org" => "Marcin Wichary",
"unsung.aresluna.org" => "Marcin Wichary",
"m4c.pl" => "Marcin Szewczyk-Wilgan",
"marcocetica.com" => "Marco Cetica",
"mb.esamecar.net" => "Marco F",
"marcoeg.medium.com" => "Marco Graziano",
"blog.bofh.it" => "Marco d'Itri",
"marcoroth.dev" => "Marco Roth",
"marcozehe.de" => "Marco Zehe",
"www.marcozehe.de" => "Marco Zehe",
"marcosmagueta.com" => "Marcos Magueta",
"mbuffett.com" => "Marcus Buffett",
"prefetch.eu" => "Marcus R A Newman",
"blog.mro.name" => "Marcus Rohrmoser",
"emptywheel.net" => "Marcy Wheeler",
"www.emptywheel.net" => "Marcy Wheeler",
"margaretstorey.com" => "Margaret-Anne Storey",
"www.boucek.me" => "Marian Bouček",
"emariete.com" => "eMariete",
"marijkeluttekes.dev" => "Marijke Luttekes",
"mariocervera.com" => "Mario Cervera",
"rmpr.xyz" => "Mario Rufus",
"mariozechner.at" => "Mario Zechner",
"marionrecord.com" => "Marion County Record",
"www.thehandbasket.co" => "Marisa Kabas",
"marisabel.nl" => "Marisabel Munoz",
"ship.energy" => "Maritime",
"www.rivieramm.com" => "Maritime",
"maritime-executive.com" => "The Maritime Executive LLC",
"blog.xaner.dev" => "Marius",
"gexp.no" => "Marius Bakke",
"chorasimilarity.wordpress.com" => "Marius Buliga",
"www.oshogbo.com" => "Mariusz Zaborski",
"www.oshogbo.vexillium.org" => "Mariusz Zaborski",
"aggressivelyparaphrasing.me" => "Mark",
"www.theengineer.co.uk" => "Mark Allen Group",
"markcurtis.info" => "Mark Curtis",
"www.markround.com" => "Mark Dastmalchi-Round",
"markjames.dev" => "Mark-James McDougall",
"blog.plover.com" => "Mark-Jason Dominus",
"marksrpicluster.blogspot.com" => "Mark G James",
"phoenixtrap.com" => "Mark Gardner",
"www.markhansen.co.nz" => "Mark Hansen",
"hysted.com" => "Mark Hysted",
"mark.hysted.com" => "Mark Hysted",
"jamsek.dev" => "Mark Jamsek",
"tech.marksblogg.com" => "Mark Litwintschik",
"www.mnot.net" => "Mark Nottingham",
"probably.co.uk" => "Mark Phillips",
"www.marksimonson.com" => "Mark Simonson",
"www.judy.co.uk" => "Mark Smith",
"www.marktechpost.com" => "Mark Tech Post",
"www.marketplace.org" => "Marketplace",
"marketresearchbase.com" => "Market Research Base",
"www.marketwatch.com" => "Market Watch",
"markosaric.com" => "Marko Saric",
"www.markozivanovic.com" => "Marko Živanović",
"www.metalevel.at" => "Markus Triska",
"unterwaditzer.net" => "Markus Unterwaditzer",
"wandel.ca" => "Markus Wandel",
"martechseries.com" => "Mar Tech Series",
"blog.brixit.nl" => "Martijn Braam",
"martinalderson.com" => "Martin Alderson",
"clehaxze.tw" => "Martin Chang",
"blog.startifact.com" => "Martijn Faassen",
"martincmartin.com" => "Martin C Martin ",
"martinfowler.com" => "Martin Fowler",
"www.martingunnarsson.com" => "Martin Gunnarsson",
"blog.martin-haehnel.de" => "Martin Hähne",
"martinheinz.dev" => "Martin Heinz",
"martin.kleppmann.com" => "Martin Kleppmann",
"www.matecdev.com" => "Martin D Maas",
"martinxpn.medium.com" => "Martin Mirakyan",
"www.martinrowan.co.uk" => "Martin Rowan",
"mastransky.wordpress.com" => "Martin Stransky",
"mht.wtf" => "Martin Thoresen",
"www.arp242.net" => "Martin Tournoij",
"martin-ueding.de" => "Martin Ueding",
"blast-o-rama.com" => "Marty Day",
"www.blast-o-rama.com" => "Marty Day",
"mclare.blog" => "Maryanne Wachter",
"in.mashable.com" => "Mashable",
"mashable.com" => "Mashable",
"sea.mashable.com" => "Mashable",
"mashpeewampanoagtribe-nsn.gov" => "Mashpee Wampanoag Tribe",
"investor.masimo.com" => "Masimo",
"www.themassblackout.com" => "Mass Blackout",
"www.massnews.com" => "Mass News",
"www.masswerk.at" => "Mass:Werk",
"commonwealthbeacon.org" => "CommonWealth Beacon, Massachusetts",
"www.mass.gov" => "Massachusetts",
"www.masslive.com" => "Massachusetts News",
"www.masslivemedia.com" => "Mass Live",
"www.masteringemacs.org" => "Mastering Emacs",
"blog.joinmastodon.org" => "Mastodon",
"matduggan.com" => "Mat Duggan",
"matanabudy.com" => "Matan Abudy",
"telefoncek.si" => "Matej Kovacic",
"terriblesoftware.org" => "Matheus Lima",
"www.matheusmoreira.com" => "Matheus Moreira",
"blog.mathieui.net" => "Mathieu",
"mathieu.comandon.org" => "Mathieu Comandon",
"aumont.fr" => "Mathieu Aumont",
"papers.mathyvanhoef.com" => "Mathy Vanhoef",
"matrix.org" => "Matrix",
"www.wyrd.systems" => "Matt",
"basta.substack.com" => "Matt Basta",
"bessey.dev" => "Matt Bessey",
"birchtree.me" => "Matt Birchler",
"www.mattblaze.org" => "Matt Blaze",
"matt.blwt.io" => "Matt Blewitt",
"blog.matthewbrunelle.com" => "Matthew Brunelle",
"mattcool.tech" => "Matt Cool",
"mrehler.com" => "Matt Ehler",
"axio.ms" => "Matt Evans",
"fantinel.dev" => "Matt Fantinel",
"www.over-yonder.net" => "Matt Fuller",
"mattgemmell.scot" => "Matt Gemmell",
"xania.org" => "Matt Godbolt",
"matt.life" => "Matt Holt",
"theoatmeal.com" => "Matthew Inman",
"www.mattkeeter.com" => "Matt Keeter",
"bitbashing.io" => "Matt Kline",
"www.mattmahoney.net" => "Matt Mahoney",
"ma.tt" => "Matt Mullenweg",
"amattn.com" => "Matt Nunogawa",
"www.hezmatt.org" => "Matt Palmer",
"pharr.org" => "Matt Pharr",
"blog.get-nerve.com" => "Matt Prast",
"matt.routleynet.org" => "Matt Routley",
"mattstein.com" => "Matt Stein",
"blog.gingerbeardman.com" => "Matt Sephton",
"interconnected.org" => "Matt Webb",
"svpow.com" => "Matt Wedel",
"mdwdotla.medium.com" => "Matt Welsh",
"xnacly.me" => "Matteo",
"lpar.ath0.com" => "Matthew",
"matthewbutterick.com" => "Matthew Butterick",
"mjg59.dreamwidth.org" => "Matthew Garrett",
"www.going-flying.com" => "Matthew J Ernisse",
"thedesk.matthewkeys.net" => "Matthew Keys",
"mattnite.net" => "Matthew Knight",
"matthewrocklin.com" => "Matthew Rocklin",
"matthewsanabria.dev" => "Matthew Sanabria",
"mtwb.blog" => "Matthew Weber",
"www.slowboring.com" => "Matthew Yglesias",
"blog.tenstral.net" => "Matthias",
"endler.dev" => "Matthias Endler",
"openwebcraft.com" => "Matthias Geisler",
"newsletter.ownyourweb.site" => "Matthias Ott",
"netbsd-cells.petermann-digital.de" => "Matthias Petermann",
"xosc.org" => "Matthias Schmidt",
"cssence.com" => "Matthias Zöchling",
"www.mrlacey.com" => "Matt Lacey",
"mattlangford.com" => "Matt Langford",
"matt.might.net" => "Matt Might",
"www.mattmillman.com" => "Matt Millman",
"matt-rickard.com" => "Matt Rickard",
"www.zagaja.com" => "Matt Zagaja",
"mavenroundtable.io" => "Maven",
"spacecoastdaily.com" => "Maverick Multimedia Inc",
"maxadamski.com" => "Max Adamski ",
"bernsteinbear.com" => "Max Bernstein",
"maxlangenkamp.me" => "Max Langenkamp",
"www.overmorrow.tech" => "Max Leibman",
"maxleiter.com" => "Max Leiter",
"max.levch.in" => "Max Levchin",
"dirtypipe.cm4all.com" => "Max Kellermann",
"macguru.dev" => "Max Seelemann",
"maxsommer.de" => "Max Sommer",
"maxim.tips" => "Maxim Tips",
"www.mripard.dev" => "Maxime Ripard",
"maximevaillancourt.com" => "Maxime Vaillancourt",
"maya.land" => "Maya Land",
"www.mayoclinic.org" => "Mayo Clinic",
"jarunmb.com" => "MB",
"mcb.org.uk" => "MCB",
"www.charlotteobserver.com" => "McClatchy Media Network",
"www.idahostatesman.com" => "McClatchy Media Network",
"bullandbearmcgill.com" => "McGill University",
"www.mcsweeneys.net" => "McSweeney’s",
"bullenweg.com" => "Matt Mullenweg’s Bull",
"maureenholland.ca" => "Maureen Holland",
"roughdraftatlanta.com" => "Maurice Media Group LLC",
"pacha.dev" => "Mauricio “Pachá” Vargas S",
"maurycyz.com" => "Maury",
"www.mckinsey.com" => "McKinsey and Company",
"gld.mcphail.uk" => "McPhail",
"murrayblackburnmackenzie.org" => "MBM",
"www.mdpi.com" => "MDPI",
"www.mdsec.co.uk" => "MD Sec",
"meatfighter.com" => "Meat Fighter",
"www.ueber.net" => "Mechiel Lukkien",
"medcitynews.com" => "Med City News",
"medevel.com" => "Medevel",
"medforth.biz" => "Medforth",
"medforth.blog" => "Medforth",
"www.videogameschronicle.com" => "1981 Media Ltd",
"www.screendaily.com" => "Media Business Insight Ltd",
"www.rcmediafreedom.eu" => "Media Freedom Rapid Response",
"www.grid.news" => "Media Investment Projects OpCo LLC",
"medialab.sciencespo.fr" => "Médialab Sciences Po",
"www.mediapost.com" => "MediaPost Communications",
"windowsreport.com" => "MediaReflector",
"www.mediaite.com" => "Mediaite",
"www.mediamatters.org" => "Media Matters",
"www.medianama.com" => "Media Nama",
"mediatemple.net" => "Media Temple",
"dailytrust.com" => "Media Trust Limited",
"www.mediawiki.org" => "Media Wiki",
"www.medicaleconomics.com" => "Medical Economics",
"www.news-medical.net" => "Medical News",
"www.medievalists.net" => "Medievalists.net",
"mediocregopher.com" => "Mediocregopher",
"coronavirus.medium.com" => "Medium",
"blog.medium.com" => "Medium",
"medium.com" => "Medium",
"onezero.medium.com" => "Medium",
"www.medpagetoday.com" => "MedPage Today",
"meduza.io" => "Meduza",
"www.meforum.org" => "ME Forum",
"www.meed.com" => "MEED Media FZ LLC",
"meeksfamily.uk" => "Meeks Family",
"megelison.com" => "Meg Elison",
"spectreattack.com" => "Meltdown and Spectre",
"meltdownattack.com" => "Meltdown and Spectre",
"www.memphisflyer.com" => "Memphis Flyer",
"www.memesita.com" => "Memesita",
"www.memri.org" => "MEMRI",
"code.mendhak.com" => "Mendhak",
"www.mentalfloss.com" => "Mental Floss",
"middle-east-online.com" => "MEO",
"www.mercatornet.com" => "MercatorNet",
"www.merchantsofdoubt.org" => "Merchants of Doubt",
"www.mercurynews.com" => "Mercury News",
"merecivilian.com" => "Mere Civilian",
"www.meritalk.com" => "Meritalk",
"www.merriam-webster.com" => "Merriam-Webster",
"aimode.substack.com" => "Mert Deveci",
"mertek.eu" => "Mérték Médiaelemző Műhely",
"meshedinsights.com" => "Meshed Insights",
"www.metabase.com" => "Metabase",
"blog.metabrainz.org" => "Meta Brainz",
"metr.org" => "METR",
"www.metro.us" => "Metro",
"www.metrotimes.com" => "Metro Times",
"metro.co.uk" => "Metro UK",
"metroselskabet.dk" => "Metroselskabet",
"mexiconewsdaily.com" => "Mexico News Daily",
"militaryfamilieslearningnetwork.org" => "MFLN",
"500ish.com" => "MG Siegler",
"www.glasgowlive.co.uk" => "MGN Ltd",
"www.mi5.gov.uk" => "MI5",
"www.miamiherald.com" => "Miami Herald",
"micahflee.com" => "Micah F Lee",
"me.micahrl.com" => "Micah R Ledbetter",
"r.iresmi.net" => "Michaël",
"curiouslab.dev" => "Michail Zarečenskij",
"karboosx.net" => "Michał Karbowiak",
"www.lexiconista.com" => "Michal Měchura",
"michalpitr.substack.com" => "Michal Pitr",
"mgorny.pl" => "Michał Górny",
"michal.sapka.me" => "Michał Sapka",
"michal.sapka.pl" => "Michał Sapka",
"www.michalzelazny.com" => "Michal Zelazny",
"lorentzen.ch" => "Michael's and Christian's blog",
"www.brutman.com" => "Michael B Brutman",
"blog.vbang.dk" => "Michael Bang",
"mihobu.lol" => "Michael Burkhardt",
"mihobu.net" => "Michael Burkhardt",
"ai5.mx" => "Michael Burkhardt",
"michaeldehaan.substack.com" => "Michael DeHaan",
"curves.ulfheim.net" => "Michael Driscoll",
"curves.xargs.org" => "Michael Driscoll",
"tls13.xargs.org" => "Michael Driscoll",
"mek.fyi" => "Michael E Karpeles",
"mekarpeles.medium.com" => "Michael E Karpeles",
"blog.greenberg.science" => "Michael Greenberg",
"citizen428.net" => "Michael Kohl",
"michael.kjorling.se" => "Michael Kjörling",
"michaelfeathers.silvrback.com" => "Michael Feathers",
"www.michaelgale.dev" => "Michael Gale",
"www.michaelgeist.ca" => "Michael Geist",
"www.yesigiveafig.com" => "Michael Green",
"mh9.codes" => "Michael Hausenblas",
"michenriksen.com" => "Michael Henriksen",
"www.michaelhorowitz.com" => "Michael Horowitz",
"michael-hudson.com" => "Michael Hudson",
"blog.ikuamike.io" => "Michael Ikua",
"mkennedy.codes" => "Michael Kennedy",
"mtlynch.io" => "Michael Lynch",
"refactoringenglish.com" => "Michael Lynch",
"bumbershootsoft.wordpress.com" => "Michael Martin",
"michaelochurch.wordpress.com" => "Michael O Church",
"www.michaelperrin.fr" => "Michaël Perrin",
"michael-prokop.at" => "Michael Prokop",
"justmarkup.com" => "Michael Scharnagl",
"michael.stapelberg.ch" => "Michael Stapelberg",
"taggart-tech.com" => "Michael Taggart",
"rip-van-webble.blogspot.com" => "Michael Thomas",
"mjtsai.com" => "Michael Tsai",
"www.uplawski.eu" => "Michael Uplawski",
"www.urspringer.de" => "Michael Urspringer",
"www.ecliptik.com" => "Michael Waltz",
"psychocod3r.wordpress.com" => "Michael Warren",
"michaelweinberg.org" => "Michael Weinberg",
"michaelwest.com.au" => "Michael West Media",
"www.michaelwest.com.au" => "Michael West Media",
"digitalflapjack.com" => "Michael Winston Dales",
"crys.site" => "Michał Sapka",
"rys.io" => "Michał Woźniak",
"lcamtuf.coredump.cx" => "Michal Zalewski",
"michel-slm.name" => "Michel Alexandre Salim",
"maique.eu" => "Micro Maique",
"michiganadvance.com" => "Michigan Advance",
"www.mlive.com" => "Michigan News",
"midrange.tedium.co" => "Midrange",
"menafn.com" => "Middle East North Africa Financial Network, Inc.",
"www.middleeasteye.net" => "Middle East Eye",
"www.mei.edu" => "Middle East Institute",
"www.middleeastmonitor.com" => "Middle East Monitor",
"www.middleeastobserver.org" => "Middle East Observer",
"wtvbam.com" => "Midwest Communications",
"migrantinsider.com" => "Migrant Insider LLC",
"www.testingbranch.com" => "Miguel Batista",
"blog.miguelgrinberg.com" => "Miguel Grinberg",
"mcyoung.xyz" => "Miguel Young de la Sota",
"mihaiolteanu.me" => "Mihai Olteanu",
"oxcrag.net" => "Mikael Hansson ",
"zayenz.se" => "Mikael Zayenz Lagerkvist",
"mikemikeb.com" => "Mike Belousov",
"www.notesfromthecircus.com" => "Mike Brock",
"hapgood.us" => "Mike Caulfield",
"dominickm.com" => "Mike Dominick",
"imapenguin.com" => "Mike Doornbos",
"crashthearcade.com" => "Mike Haynes",
"mikelovesrobots.substack.com" => "Mike Judge",
"mikekaganski.wordpress.com" => "Mike Kaganski",
"mikemcquaid.com" => "Mike McQuaid",
"robotspacer.software" => "Mike Piontek",
"initialcharge.net" => "Mike Rockwell",
"reorchestrate.com" => "Mike Seddon",
"www.piratewires.com" => "Mike Solana",
"mikestone.me" => "Mike Stone",
"blog.mikeswanson.com" => "Mike Swanson",
"www.militarytimes.com" => "Military Times",
"www.military.com" => "Military.com",
"mill-build.org" => "The Mill Build Engineering Blog",
"manchestermill.co.uk" => "The Mill",
"millichronicle.com" => "Milli Chronicle",
"www.milwaukeeindependent.com" => "Milwaukee Independent",
"mindmatters.ai" => "Mind Matters",
"www.mining-technology.com" => "Mining Technology",
"www.health.govt.nz" => "Ministry Of Health NZ",
"www.mintpressnews.com" => "Mint Press News",
"minnechaugsmokesignal.com" => "Minnechaug Regional High School",
"www.minnpost.com" => "MinnPost",
"blog.mnus.de" => "Minus",
"miod.online.fr" => "Miod Vallat",
"mirawelner.com" => "Mira Welner",
"mirandaheath.website" => "Miranda Heath",
"www.mirror.co.uk" => "Mirror UK",
"missionlibre.org" => "Mission:Libre Ltd",
"www.mississippifreepress.org" => "Mississippi Journalism and Education Group",
"www.jacksongov.org" => "Missouri",
"missouriindependent.com" => "Missouri",
"www.mistys-internet.website" => "Misty De Méo",
"airisk.mit.edu" => "MIT",
"climate.mit.edu" => "MIT",
"groups.csail.mit.edu" => "MIT",
"missing.csail.mit.edu" => "MIT",
"telecom.csail.mit.edu" => "MIT",
"www.csail.mit.edu" => "MIT",
"www.media.mit.edu" => "MIT",
"web.mit.edu" => "MIT",
"www.technologyreview.com" => "MIT Technology Review",
"mitpress.mit.edu" => "MIT Press",
"wtfmitchel.medium.com" => "Mitchel Lewis",
"mitchellh.com" => "Mitchell Hashimoto",
"www.mitchellsoftwareengineering.com" => "Mitchell Software Engineering",
"miteshjlinuxtips.wordpress.com" => "Mitesh Singh Jat",
"cwe.mitre.org" => "MITRE Corporation",
"www.mitre.org" => "MITRE Corporation",
"mitxela.com" => "Mixterla",
"box.matto.nl" => "MJ Fransen",
"pooladkhay.com" => "MJ Pooladkhay",
"www.chiefhealthcareexecutive.com" => "MJH Life Sciences",
"s.mkws.sh" => "MKWS",
"www.mnnonline.org" => "MNN",
"atmoio.substack.com" => "Mo",
"mobiledevmemo.com" => "Mobile Dev Memo",
"www.mobileindustryreview.com" => "Mobile Industry Review",
"mobilesyrup.com" => "MobileSyrup",
"www.mobileworldlive.com" => "Mobile World Live",
"mbird.com" => "Mockingbird",
"modal.com" => "Modal Labs",
"modelcontextprotocol.io" => "Model Context Protocol",
"moderndiplomacy.eu" => "Modern Diplomacy",
"www.modernghana.com" => "Modern Ghana",
"modulovalue.com" => "Modestas Valauskas",
"www.tweag.io" => "Modus Create LLC",
"moldstud.com" => "MoldStud",
"drmollytov.dev" => "Dr Molly Tov",
"drmollytov.smol.pub" => "Dr Molly Tov",
"blog.mollywhite.net" => "Molly White",
"citationneeded.news" => "Molly White",
"www.citationneeded.news" => "Molly White",
"www.moment.dev" => "Moment",
"herecomesthemoon.net" => "Mond",
"www.mondaq.com" => "Mondaq",
"mondaynote.com" => "Monday Note",
"www.lemonde.fr" => "Le Monde",
"www.mondo2000.com" => "Mondo2000",
"news.mongabay.com" => "Mongabay",
"www.mongodb.com" => "MongoDB",
"www.monitor.co.ug" => "Monitor UG",
"monroeclinton.com" => "Monroe Clinton",
"mon0.substack.com" => "Mon0",
"www.monolithicpower.com" => "Monolithic Power Systems Inc",
"billingsgazette.com" => "Montana",
"www.montelnews.com" => "Montel",
"montrealgazette.com" => "Montreal Gazette",
"monzo.com" => "Monzo Bank Limited",
"moodle.com" => "Moodle",
"www.lmspulse.com" => "MoodleNews LLC",
"moolist.com" => "MOOList.com",
"www.morningadvertiser.co.uk" => "The Morning Advertiser",
"morningconsult.com" => "Morning Consult",
"morningstarnews.org" => "Morning Star News",
"morningstaronline.co.uk" => "Morning Star UK",
"www.morningstar.com" => "Morningstar US",
"morsewalker.com" => "Morse Walker",
"linderud.dev" => "Morten Linderud",
"www.techcircle.in" => "Mosaic Media Ventures Pvt Ltd",
"www.motorauthority.com" => "MH Sub I LLC",
"www.motortrend.com" => "Motor Trend Group LLC",
"motorolanews.com" => "Motorola",
"www.motorious.com" => "Motorius",
"front.moveon.org" => "MoveOn",
"www.movieguide.org" => "Movie Guide",
"try.popho.be" => "Moviuro",
"moxie.org" => "Moxie Marlinspike",
"last-chance-for-eidas.org" => "Mozilla",
"addons.mozilla.org" => "Mozilla",
"blog.mozilla.org" => "Mozilla",
"developer.mozilla.org" => "Mozilla",
"developer.mozilla.org" => "Mozilla",
"research.mozilla.org" => "Mozilla",
"foundation.mozilla.org" => "Mozilla",
"hacks.mozilla.org" => "Mozilla",
"internethealthreport.org" => "Mozilla",
"support.mozilla.org" => "Mozilla",
"www.mozillafestival.org" => "Mozilla",
"mozillapetition.com" => "Mozilla Petition",
"www.mprnews.org" => "MPR News",
"mrbrownthumb.blogspot.com" => "Mr Brownthumb",
"mrpogson.com" => "Mr Pogson",
"marketresearchtelecast.com" => "MRT",
"msfaccess.org" => "MSF",
"www.msn.com" => "MSN",
"mspoweruser.com" => "MS Poweruser",
"www.muckrock.com" => "Muckrock",
"mulloverthing.com" => "MullOverThing",
"www.mulle-kybernetik.com" => "Mulle kybernetiK",
"multicians.org" => "Multics",
"multimedia.cx" => "Multimedia",
"mullvad.net" => "Mullvad VPN",
"blog.muni.town" => "Muni Blog",
"muninetworks.org" => "Municipal Broadband",
"muratbuffalo.blogspot.com" => "Murat Demirbas",
"syntackle.com" => "Murtuzaali Surti",
"syntackle.live" => "Murtuzaali Surti",
"www.musee-orsay.fr" => "musées d'Orsay et de l'Orangerie",
"www.museoreinasofia.es" => "el Museo Nacional Centro de Arte Reina Sofía",
"library.xandra.cc" => "Museum of Alexandra",
"musically.com" => "Music Ally Ltd",
"www.musicgateway.com" => "Music Gateway Ltd",
"musictech.com" => "MusicTech",
"www.musicbusinessworldwide.com" => "Music Business Worldwide",
"muted.io" => "Muted.IO",
"mux.com" => "Mux",
"muxup.com" => "Muxup",
"mwl.io" => "MWL",
"mxb.dev" => "MXB",
"mxlinux.org" => "MX Linux",
"cyberriskleaders.com" => "My Security Media",
"www.mmtimes.com" => "Myanmar Times",
"mycroft.ai" => "Mycroft",
"www.mythic-beasts.com" => "Mythic Beasts Ltd`",
"nrposner.com" => "N R Posner",
"nrecursions.blogspot.com" => "N Recursions",
"n3wjack.net" => "N3wjack",
"naeemnur.com" => "Naeem Noor",
"modern-css.com" => "Naeem Noor",
"cloudbsd.xyz" => "Naguam",
"www.nakedcapitalism.com" => "Naked Capitalism",
"nakedsecurity.sophos.com" => "Naked Security",
"www.nango.dev" => "Nango",
"thenarwhal.ca" => "The Narwhal",
"apod.nasa.gov" => "NASA",
"blogs.nasa.gov" => "NASA",
"earthobservatory.nasa.gov" => "NASA",
"mars.nasa.gov" => "NASA",
"oig.nasa.gov" => "NASA Office of Inspector General",
"www.jpl.nasa.gov" => "NASA",
"www.nasa.gov" => "NASA",
"www.nasdaq.com" => "Nasdaq",
"www.nashvillecomputer.com" => "Nashville Computer Inc",
"www.simplermachines.com" => "Nat Bennett",
"natkr.com" => "Natalie Klestrup Röijezon",
"www.thenexus.media" => "Natalie Pang",
"natyliesbaldwin.com" => "Natalyie Baldwin",
"natanyellin.com" => "Natan Yellin",
"natemoo.re" => "Nate Moore",
"nathanbrixius.wordpress.com" => "Nathan Brixius",
"nathandyer.me" => "Nathan Dyer",
"knowler.dev" => "Nathan Knowler",
"toastytech.com" => "Nathan Lineback",
"haleynahman.substack.com" => "Haley Nahman",
"www.nfsmith.ca" => "Nathan Smith",
"nathanupchurch.com" => "Nathan Upchurch",
"endtimes.dev" => "Nathaniel",
"guppylake.com" => "Nathaniel Borenstein",
"theviewfromguppylake.blogspot.com" => "Nathaniel Borenstein",
"daught.me" => "Nathaniel Daught",
"nathanielfishel.substack.com" => "Nathaniel Fishel",
"nathansnelgrove.com" => "Nathaniel Snelgrove",
"www.citizensadvice.org.uk" => "National Association of Citizens Advice Bureaux",
"www.ncregister.com" => "National Catholic Register",
"nationalcoalitionforliteracy.org" => "National Coalition for Literacy",
"www.ncsc.gov.uk" => "The National Cyber Security Centre, UK",
"nationalflagfoundation.org" => "National Flag Foundation",
"www.nationalgeographic.com" => "National Geographic",
"www.nationalheraldindia.com" => "National Herald IN",
"nationalinterest.org" => "National Interest",
"www.maanmittauslaitos.fi" => "National Land Survey of Finland",
"natlawreview.com" => "National Law Review US",
"www.natlawreview.com" => "National Law Review US",
"www.nationalobserver.com" => "National Observer CA",
"nationalpost.com" => "National Post",
"www.rephrain.ac.uk" => "National Research Centre on Privacy, Harm Reduction and Adversarial Influence Online",
"www.nationalreview.com" => "National Review US",
"new.nsf.gov" => "National Science Foundation",
"www.nsf.gov" => "National Science Foundation",
"www.secularism.org.uk" => "National Secular Society",
"nsarchive.gwu.edu" => "The National Security Archive",
"native-land.ca" => "Native Land Digital",
"www.edinburghnews.scotsman.com" => "National World Publishing Ltd",
"www.nationalworld.com" => "National World Publishing Ltd",
"nativenewsonline.net" => "NativeNews Online",
"nhqc3s.hq.nato.int" => "NATO",
"www.nato.int" => "NATO",
"burgeonlab.com" => "Naty S",
"nayadaur.tv" => "Nayadaur",
"www.nhm.ac.uk" => "The Natural History Museum, London",
"www.nature.com" => "Nature",
"www.nature.org" => "The Nature Conservancy",
"nazhamid.com" => "Naz Hamid",
"markuta.com" => "Naz Markuta",
"www.nba.com" => "NBA",
"www.msnbc.com" => "NBC",
"www.nbcbayarea.com" => "NBC",
"www.nbclosangeles.com" => "NBC",
"nbcpalmsprings.com" => "NBC",
"www.nbcboston.com" => "NBC",
"www.nbcchicago.com" => "NBC",
"www.nbcdfw.com" => "NBC",
"www.nbcnews.com" => "NBC",
"www.nbcnewyork.com" => "NBC",
"www.nbcphiladelphia.com" => "NBC",
"www.nbcmiami.com" => "NBCUniversal Media LLC",
"www.nbcsandiego.com" => "NBCUniversal Media LLC",
"www.nbcwashington.com" => "NBC",
"ncac.org" => "NCAC",
"research.nccgroup.com" => "NCC Group Research",
"www.nccgroup.com" => "NCC Group Security Services Inc",
"www.ncr-iran.org" => "NCRI",
"nationalcybersecuritynews.today" => "NCSNT",
"food.ndtv.com" => "NDTV",
"gadgets360.com" => "NDTV",
"gadgets.ndtv.com" => "NDTV",
"sports.ndtv.com" => "NDTV",
"www.ndtv.com" => "NDTV",
"nebraskaexaminer.com" => "Nebraska Examiner",
"nedbatchelder.com" => "Ned Batchelder",
"madned.substack.com" => "NedUtzig",
"nee.lv" => "Nee",
"www.neelc.org" => "Neel Chauhan",
"neighbourhood.ie" => "The Neighbourhoodie Software GmbH",
"neil-clarke.com" => "Neil Clarke",
"neilkakkar.com" => "Neil Kakkar",
"www.neilmacy.co.uk" => "Neil Macy",
"neil.computer" => "Neil Panchal",
"criticaledtech.com" => "Neil Selwyn",
"www.nejm.org" => "NEJM",
"blog.nelhage.com" => "Nelson Elhage",
"ninkovic.dev" => "Nemanja Ninković",
"nemanjatrifunovic.substack.com" => "Nemanja Trifunovic",
"grammaticus.blog" => "Nenad Knezevic",
"neosmart.net" => "Neo Smart",
"blog.neocities.org" => "Neocities",
"housefresh.com" => "NeoMam Studios LtNeoMam Studios Ltd",
"neoslab.com" => "Neos Lab",
"packbat.neocities.org" => "Neopackbats",
"neodyme.io" => "Neodyme AG",
"www.neowin.net" => "Neowin",
"digitalenvironment.org" => "NERC UK",
"www.thenerdreich.com" => "The Nerd Reich",
"en.neritam.com" => "Neritam",
"neritam.wordpress.com" => "Neritam",
"nesslabs.com" => "Ness Labs",
"net2.com" => "Net2",
"netblocks.org" => "Netblocks",
"mail-index.netbsd.org" => "NetBSD",
"netbsd0.blogspot.com" => "NetBSD",
"blog.netbsd.org" => "NetBSD",
"www.netbsd.org" => "NetBSD",
"www.netdata.cloud" => "Netdata Inc",
"netdevconf.info" => "NetDev Society",
"netflixtechblog.com" => "Netflix",
"www.netgate.com" => "Netgate",
"www.acm.nl" => "Netherlands",
"netherlands.postsen.com" => "Netherlands Posts English",
"blog.netlab.360.com" => "Netlab",
"www.silicon.co.uk" => "Net Media Europe",
"www.netnod.se" => "Netnod",
"linux-training.be" => "NetSec BVBA",
"www.forbesindia.com" => "Network 18 Media and Investments Ltd",
"networkupstools.org" => "Network UPS Tools",
"www.networkworld.com" => "Network World",
"networthpick.com" => "Networth Pick",
"cdn.netzpolitik.org" => "Netzpolitik",
"netzpolitik.org" => "Netzpolitik",
"nevadacurrent.com" => "Nevada Current",
"newatlas.com" => "New Atlas",
"www.thenewlede.org" => "The New Lede",
"newleftreview.org" => "New Left Review Ltd",
"www.newcastleherald.com.au" => "Newcastle Herald AU",
"www.newcastlestar.com.au" => "Newcastle Star AU",
"www.newdelhitimes.com" => "New Delhi Times IN",
"newdesigncongress.org" => "New Design Congress",
"neweasterneurope.eu" => "New Eastern Europe",
"www.newelectronics.co.uk" => "New Electronics",
"www.newenglishreview.org" => "New English Review",
"www.neweurope.eu" => "New Europe",
"www.nhpr.org" => "New Hampshire Public Radio",
"newhumanist.org.uk" => "New Humanist",
"cms.newindianexpress.com" => "New Indian Express",
"www.newindianexpress.com" => "New Indian Express",
"www.co.burlington.nj.us" => "Burlington County, New Jersey",
"newjerseymonitor.com" => "New Jersey Montitor",
"www.nj.com" => "New Jersey News",
"newmatilda.com" => "New Matilda",
"newnaratif.com" => "New Naratif",
"newnetworks.com" => "New Networks",
"newrepublic.com" => "New Republic",
"www.newweather.org" => "New Weather Institue",
"www.anchor.com.au" => "Newfold Digital Inc",
"www.ledburyreporter.co.uk" => "Newquest Media Group Ltd",
"www.news.com.au" => "News AU",
"thenewshawks.com" => "The NewsHawks",
"www.newgrounds.com" => "Newgrounds Inc",
"www.newspapers.com" => "Newspapers.com",
"thenewsprint.co" => "The Newsprint",
"www.newsguardtech.com" => "NewsGuard Technologies Inc",
"www.newsroomrobots.com" => "Substack Inc",
"www.eastlothiancourier.com" => "Newsquest Media Group Ltd",
"www.enfieldindependent.co.uk" => "Newsquest Media Group Ltd",
"www.hackneygazette.co.uk" => "Newsquest Media Group Ltd",
"www.hampshirechronicle.co.uk" => "Newsquest Media Group Ltd",
"www.greenocktelegraph.co.uk" => "Newsquest Media Group Ltd",
"www.salisburyjournal.co.uk" => "Newsquest Media Group Ltd",
"www.thenorthernecho.co.uk" => "Newsquest Media Group Ltd",
"www.thenational.wales" => "Newsquest Media Group Ltd",
"www.oxfordmail.co.uk" => "Newsquest Media Group Ltd",
"www.newscientist.com" => "New Scientist",
"newsocialist.org.uk" => "New Socialist",
"www.newsmax.com" => "Newsmax",
"www.newstatesman.com" => "New Statesman",
"www.newsweek.com" => "Newsweek",
"newvirginiapress.com" => "New Virginia Press",
"www.nycbar.org" => "New York City Bar",
"www.nydailynews.com" => "New York Daily News",
"nystateparks.blog" => "New York State Parks & HIstoric Sites Blog",
"www.nysun.com" => "New York Sun",
"dfs.ny.gov" => "New York State",
"www.nysenate.gov" => "New York State Senate",
"archive.nytimes.com" => "New York Times",
"nytco-assets.nytimes.com" => "New York Times",
"static01.nyt.com" => "New York Times",
"www.nytco.com" => "New York Times",
"www.nytimes.com" => "New York Times",
"firstamendmentwatch.org" => "New York University",
"www.newyorker.com" => "New Yorker",
"www.hastingsdc.govt.nz" => "Hastsings Distric Council, New Zealand",
"legislation.govt.nz" => "New Zealand",
"comcom.govt.nz" => "Commerce Commission of New Zealand",
"nzhistory.govt.nz" => "New Zealand",
"thespinoff.co.nz" => "New Zealand",
"www.odt.co.nz" => "New Zealand",
"fij.ng" => "Foundation for Investigative Journalism Nigeria",
"www.newstimes.com.ng" => "News Times Nigeria",
"www.nzherald.co.nz" => "New Zealand Herald",
"kfor.com" => "Nexstar Media Group Inc",
"www.klfy.com" => "Nexstar Media Group Inc",
"www.koin.com" => "Nexstar Media Group Inc",
"www.kron4.com" => "Nexstar Media Group Inc",
"wgno.com" => "Nexstar Media Group Inc",
"www.wpri.com" => "Nexstar Media Group Inc",
"www.krqe.com" => "Nexstar Media Inc",
"www.wkrn.com" => "Nexstar Media Group Inc",
"www.wfla.com" => "Nexstar Media Inc",
"wreg.com" => "Nexstar Media Inc",
"www.valleycentral.com" => "Nexstar Media Inc",
"wgntv.com" => "Nexstar Media Inc",
"nextcloud.com" => "Next Cloud",
"www.nextgames.com" => "Next Games",
"www.nextinnonprofits.com" => "Next in Nonprofits",
"tech.nextroll.com" => "Next Roll",
"www.nexttv.com" => "Next TV",
"www.nextgov.com" => "Nextgov",
"nextitsecurity.com" => "Next IT Security",
"blog.nfreak.tv" => "NFreak",
"nfu.org" => "NFU",
"www.nhs.uk" => "National Health Service UK",
"blog.nginx.org" => "Nginx",
"mailman.nginx.org" => "Nginx",
"trac.nginx.org" => "Nginx",
"nguyen.cincinnati.oh.us" => "Nguyễn",
"www.rechargenews.com" => "NHST Media Group",
"blog.relyabilit.ie" => "Niall Murphy",
"thenib.com" => "The Nib",
"www.nicchan.me" => "Nic Chan",
"blog.nicco.love" => "Niccolò Venerandi",
"www.ncameron.org" => "Nicholas Cameron",
"www.newcartographies.com" => "Nicholas Carr",
"ludocode.com" => "Nicholas Fraser",
"ntietz.com" => "Nicholas Tietz-Sokolsky",
"nickvsnetworking.com" => "Nick",
"pointlessramblings.com" => "Nick Barrett",
"nick.groenen.me" => "Nick Groenen",
"www.ncartron.org" => "Nico Cartron",
"nicochilla.com" => "Nico Chilla",
"koolinus.wordpress.com" => "Nicola Losito",
"nicolalosito.i" => "Nicola Losito",
"cropp.blog" => "Nicolas Cropp",
"nfraprado.net" => "Nícolas F R A Prado",
"nicolasfella.de" => "Nicolas Fella",
"nmattia.com" => "Nicolas Mattia",
"fratti.ch" => "Nicolas F",
"blog.frankel.ch" => "Nicolas Fränkel",
"thejollyteapot.com" => "Nicolas Magand",
"niconiconi.neocities.org" => "Niconiconi",
"nicole.express" => "Nicole Express",
"neilzone.co.uk" => "Niel Brown",
"neilmadden.blog" => "Niel Madden",
"nielscautaerts.xyz" => "Niels Cautaerts",
"provos.org" => "Niels Provos",
"www.provos.org" => "Niels Provos",
"www.niemanlab.org" => "Nieman Lab",
"businessamlive.com" => "Business A M, Nigeria",
"thenigerialawyer.com" => "Nigeria",
"www.thecable.ng" => "Nigeria",
"www.thetimes.com.ng" => "Nigeria",
"independent.ng" => "Nigeria",
"thenationonlineng.net" => "Nigeria",
"gazettengr.com" => "Nigeria",
"nationaldailyng.com" => "Nigeria",
"www.thenigerianvoice.com" => "Nigeria",
"pmnewsnigeria.com" => "Nigeria",
"www.premiumtimesng.com" => "Nigeria",
"www.pulse.ng" => "Nigeria",
"tribuneonlineng.com" => "Nigerian Tribune",
"thenightgallery.wordpress.com" => "Night Gallery",
"www.nightwish.com" => "Nightwish",
"www.nih.gov" => "NIH",
"pubmed.ncbi.nlm.nih.gov" => "NIH",
"www.ncbi.nlm.nih.gov" => "NIH",
"niketpatel.com" => "Niket Patel",
"nikhiljha.com" => "Nikhil Jha",
"nikhilism.com" => "Nikhil Marathe",
"nikitagill.substack.com" => "Nikita Gill",
"laplab.me" => "Nikita Lapkov",
"tonsky.me" => "Nikita Prokopov",
"sobolevn.me" => "Nikita Sobolev",
"nikita-volkov.github.io" => "Nikita Volkov",
"asia.nikkei.com" => "Nikkei",
"obrhubr.org" => "Niklas Oberhuber",
"nikokultalahti.com" => "Niko Kultalahti",
"pragmaticpineapple.com" => "Nikola Đuza",
"nikola.kotur.org" => "Nikola Kotur",
"nilcoalescing.com" => "Nil Coalescing",
"blog.nilenso.com" => "the nilenso blog",
"ninazumel.com" => "Nina B Zumel",
"nl.usembassy.gov" => "US Embassy and Consulate",
"www.niso.org" => "NISO",
"unravelweb.dev" => "Nishu Goel",
"www.nationalguard.mil" => "US National Guard",
"pmc.ncbi.nlm.nih.gov" => "US National Library of Medicine",
"csrc.nist.gov" => "US NIST",
"nvd.nist.gov" => "US NIST",
"nvlpubs.nist.gov" => "US NIST",
"pages.nist.gov" => "US NIST",
"www.nist.gov" => "US NIST",
"nxos.org" => "Nitrux",
"www.cyberciti.biz" => "nixCraft",
"blog.nix-ci.com" => "NixCI",
"nixos.wiki" => "NixOS",
"nltimes.nl" => "NL Times",
"ncatlab.org" => "nLab",
"blog.nlnetlabs.nl" => "NLNet Foundation",
"nlnet.nl" => "NLNet Foundation",
"guitar.com" => "Guitar (NME Networks)",
"www.nme.com" => "NME Networks",
"www.nokings.org" => "No Kings",
"blog.noredink.com" => "No Red Ink",
"nooneshappy.com" => "No One's Happy",
"nosystemd.org" => "No Systemd",
"blog.noip.com" => "No-IP",
"arctic.noaa.gov" => "NOAA",
"oceanservice.noaa.gov" => "NOAA",
"www.noaa.gov" => "NOAA",
"www.fisheries.noaa.gov" => "NOAA Fisheries",
"codeofhonor.substack.com" => "Noah",
"nbailey.ca" => "Noah Bailey",
"codefol.io" => "Noah Gibbs",
"thetechenabler.substack.com" => "Noah Hall",
"www.noahjacob.us" => "Noah Jacobus",
"noahliebman.net" => "Noah Liebman",
"www.kirsle.net" => "Noah Petherbridge",
"noahpinion.substack.com" => "Noah Smith",
"chomsky.info" => "Noam Chomsky",
"noamzeise.com" => "Noam Zeise",
"bitecode.substack.com" => "Nobody has time for Python",
"nflatrea.bearblog.dev" => "Noë Flatreaud",
"thesmallbusinesscybersecurityguy.co.uk" => "Noel Bradford",
"noelrappin.com" => "Noel Rappin",
"www.noip.com" => "NoIP",
"www.nokia.com" => "Nokia",
"nokiamob.net" => "Nokia Mob",
"www.nola.com" => "NOLA",
"nolanlawson.com" => "Nolan Lawson",
"eieio.games" => "Nolen Royalty",
"mississippitoday.org" => "Nonprofit Mississippi News",
"nonstrict.eu" => "Nonstrict B V",
"noratrieb.dev" => "Noratrieb",
"www.preining.info" => "Norbert Preining",
"nris.journal.fi" => "Nordic Review of International Studies",
"nordicmonitor.com" => "Nordic Research and Monitoring Network",
"nordvpn.com" => "NordVPN",
"presse.no" => "Norsk Presseforbund",
"www.ncsbe.gov" => "North Carolina",
"wilmingtonjournal.com" => "North Carolina",
"northdakotamonitor.com" => "North Dakota Monitor",
"www.nipolicingboard.org.uk" => "Northern Ireland Policing Board UK",
"www.nsnews.com" => "North Shore News",
"northeastnews.net" => "Northeast News",
"northerntimes.nl" => "The Northern Times",
"digital.library.unt.edu" => "The University of North Texas",
"courses.cs.northwestern.edu" => "Northwestern University",
"localnewsinitiative.northwestern.edu" => "Northwestern University",
"copyright.nova.edu" => "uni Nova Southeastern",
"now.northropgrumman.com" => "Northrop Grumman",
"www.insidetechlaw.com" => "Norton Rose Fulbright LLP",
"us.norton.com" => "Gen Digital Inc",
"www.medietilsynet.no" => "Norway",
"www.norway.no" => "Norway",
"www.pst.no" => "Norway",
"www.politiet.no" => "Norway",
"www.regjeringen.no" => "Norway",
"digitalpreservation-blog.nb.no" => "Norway",
"www.nrk.no" => "Norway",
"www.aftenposten.no" => "Norway",
"norwaytoday.info" => "Norway",
"www.notebookcheck.net" => "Notebook Check",
"blog.notryan.com" => "Not Ryan",
"magazine.nd.edu" => "Notre Dame Magazine",
"www.nottinghampost.com" => "Nottinghamshire Post",
"nowtoronto.com" => "Now Toronto",
"trynova.dev" => "Nova",
"novaramedia.com" => "Novara Media",
"ktvz.com" => "NPG of Oregon",
"alaskapublic.org" => "NPR",
"indianapublicmedia.org" => "NPR",
"text.npr.org" => "NPR",
"www.npr.org" => "NPR",
"www.wosu.org" => "NPR",
"wysu.org" => "NPR",
"www.kut.org" => "NPR",
"nrb.org" => "NRB",
"www.nrdc.org" => "NRDC",
"www.nsa.gov" => "NSA",
"www.nasaspaceflight.com" => "NSF",
"www.nmedia.net" => "NSH",
"nshipster.com" => "NSHipster",
"www.nsta.org" => "NSTA",
"wrt.nth.io" => "NTH",
"support.ntp.org" => "NTP",
"www.ntpsec.org" => "NTPsec",
"nubificus.co.uk" => "Nubificus Ltd",
"blog.nuclearsecrecy.com" => "Nuclear Secrecy",
"www.nuj.org.uk" => "NUJ",
"nulltx.com" => "Null TX",
"nullr0ute.com" => "Nullr0ute",
"blog.numericcitizen.me" => "Numeric Citizen",
"nusenu.medium.com" => "Nusenu",
"www.nushell.sh" => "Nushell",
"www.nutsvolts.com" => "Nuts And Volts",
"www.nuug.no" => "NUUG",
"blogs.nvidia.com" => "NVIDIA Corporation",
"developer.nvidia.com" => "NVIDIA Corporation",
"blog.nviso.eu" => "NVISO Labs",
"nycbug1.nycbug.org" => "NYCBUG",
"nymag.com" => "NYMag",
"noyb.eu" => "NYOB",
"decider.com" => "NYP Holdings Inc",
"nypost.com" => "NYPost",
"www.nzyme.org" => "Nzyme.org",
"nyxspace.com" => "Nyx Space",
"oaklandcountyblog.com" => "Oakland County MI",
"www.netlib.org" => "Oak Ridge National Laboratory",
"www.oasis-open.org" => "OASIS",
"obeli.sk" => "Obelisk",
"oberlinreview.org" => "Oberlin College",
"obdev.at" => "Objective Development Software GmbH",
"objective-see.org" => "Objective-See",
"obnam.org" => "Obnam",
"observer.com" => "Observer Media",
"www.orfonline.org" => "Observer Research Foundation",
"observervoice.com" => "Observer Voice",
"preservation.tylerthorsted.com" => "Tyler Thorsted",
"blog.rlwinm.de" => "Occasionally Useful Notes",
"reliefweb.int" => "OCHA",
"www.omct.org" => "OCMT",
"opencovidpledge.org" => "OCP",
"home.octetfont.com" => "Octet Font",
"www.oddbird.net" => "OddBird",
"odysee.com" => "Odysee Inc",
"otavio.cc" => "Otávio C",
"adepts.of0x.cc" => "Of0x",
"www.ofcom.org.uk" => "OFCOM",
"off-guardian.org" => "Off Guardian",
"office-watch.com" => "Office Watch",
"www.legislature.ohio.gov" => "Ohio",
"oicanadian.com" => "OI Canadian",
"oilprice.com" => "Oil Price",
"oils.pub" => "Oil Shell",
"www.oilshell.org" => "Oil Shell",
"oisinmoran.com" => "Oisín Moran",
"tulsaworld.com" => "TulsaWorld",
"www.okenergytoday.com" => "Oklahoma Energy Today",
"okpolicy.org" => "Oklahoma Policy Institute",
"www.olafalders.com" => "Olaf Alders",
"oldvcr.blogspot.com" => "Old VCR",
"ipv6.hanazo.no" => "Ole Trøan",
"olimex.wordpress.com" => "Olimex",
"www.olimex.com" => "Olimex",
"www.theolivepress.es" => "The Olive Press",
"oliver.st" => "Oliver",
"ols.wtf" => "Oliver Leaver Smith",
"fullystacked.net" => "Ollie Williams",
"madebyoll.in" => "Ollin Boer Bohan",
"www.palmefonden.se" => "The Olof Palme Memorial Fund",
"onemileatatime.com" => "OMAAT",
"sandbox.bio" => "OMGenomics Labs LLC",
"gmid.omarpolo.com" => "Omar Polo",
"www.omarpolo.com" => "Omar Polo",
"omar.website" => "Omar Rizwan",
"omar.yt" => "Omar Roth",
"www.omeronsecurity.com" => "Omer Singer",
"www.omgubuntu.co.uk" => "OMG Ubuntu",
"phys.org" => "Omicron Limited",
"om.co" => "Om Malik",
"blog.om.co" => "Om Malik",
"ondrejcertik.com" => "Ondřej Čertík",
"ondrejsevcik.com" => "Ondrej Sevcik",
"blog.happyfellow.dev" => "One Happy Fellow",
"happyfellow.bearblog.dev" => "One Happy Fellow",
"www.sleepfoundation.org" => "OneCare Media LLC",
"linux.oneandoneis2.org" => "OneAndOneIs2",
"onelawforall.org.uk" => "One Law For All UK",
"oneuptime.com" => "OneUptime",
"theonion.com" => "The Onion",
"www.theonion.com" => "The Onion",
"www.online-tech-tips.com" => "Online Tech Tips",
"onlykey.io" => "OnlyKey",
"blog.aiono.dev" => "Onur Sahin",
"ooh.directory" => "Ooh.Directory",
"www.windytan.com" => "Oona Räisänen",
"ooni.org" => "OONI",
"www.priv.gc.ca" => "OPCCA",
"www.o3de.org" => "Open 3D Engine",
"openai.com" => "Open AI",
"eu-stf.openforumeurope.org" => "Open Forum Europe",
"ojs.weizenbaum-institut.de" => "Open Journal Systems",
"letter.open-web-advocacy.org" => "Open Letter to Tim Cook",
"csa-scientist-open-letter.org" => "Open Letter to EC",
"ftp.openbsd.org" => "OpenBSD",
"www.openbsd.org" => "OpenBSD",
"xenocara.org" => "OpenBSD",
"www.openbsdfoundation.org" => "The OpenBSD Foundation",
"openbsdjumpstart.org" => "OpenBSD Jumpstart",
"webzine.puffy.cafe" => "OpenBSD Webzine",
"www.opendemocracy.net" => "Open Democracy",
"oc-media.org" => "Open Caucasus Media",
"opencollective.com" => "Open Collective",
"www.openculture.com" => "Open Culture LLC",
"en.odfoundation.eu" => "Open Dialog Foundation",
"pubs.opengroup.org" => "The Open Group Library",
"abopen.com" => "Open Hardware Consultancy",
"www.openlogic.com" => "Open Logic",
"www.openpr.com" => "open PR",
"openradar.appspot.com" => "Open Radar",
"www.opengrep.dev" => "Opengrep",
"openpgp.dev" => "OpenPGP",
"openpgp.foo" => "OpenPGP.foo",
"www.openranpolicy.org" => "OpenRAN",
"www.openreach.co.uk" => "OpenRreach Ltd",
"www.openrightsgroup.org" => "OpenRightsGroup",
"www.openssl.org" => "OpenSSL",
"www.openttd.org" => "OpenTTD",
"www.ouvrirlascience.fr" => "Open Science",
"www.opensecrets.org" => "Open Secrets",
"www.opensource-experience.com" => "Open Source Experience",
"www.osfc.io" => "Open Source Firmware Conference",
"www.opensourceforu.com" => "Open Source For U",
"opensourcepledge.com" => "Open Source Pledge",
"opensourceproperty.org" => "Open Source Property",
"grsecurity.net" => "Open Source Security Inc",
"opensourcesecurity.io" => "Open Source Security (Audio Show)",
"ossmalta.eu" => "Open Source Society Malta",
"anchor.fm" => "Open Source Startup Podcast",
"ostif.org" => "Open Source Technology Improvement Fund",
"opensource.org" => "Open Source Initiative",
"openeveryone.substack.com" => "Open Source For Everyone",
"lists.mindrot.org" => "OpenSSH",
"www.openssh.com" => "OpenSSH",
"www.openssh.org" => "OpenSSH",
"openstandards.nz" => "Open Standards NZ",
"community.openstreetmap.org" => "OpenStreetMap",
"www.openstreetmap.org" => "OpenStreetMap",
"openvpn.net" => "OpenVPN",
"www.openwall.com" => "Openwall",
"forum.openwrt.org" => "OpenWRT",
"openzfs.org" => "OpenZFS",
"opguides.info" => "Op Guides",
"forum.opnsense.org" => "OPNSense",
"sslmate.com" => "Opsmate Inc",
"www.optoutproject.net" => "The Opt Out Project",
"opus-codec.org" => "Opus Interactive Audio Codec",
"respectfulinsolence.com" => "Orac",
"openjdk.org" => "Oracle Corporation",
"dbg.re" => "Ordinal0",
"www.oecd.org" => "Organisation for Economic Co-operation and Development",
"www.socialmediasafety.org" => "Organization for Social Media Safety",
"www.transformativeworks.org" => "Organization for Transformative Works",
"www.o-ran.org" => "O-RAN",
"www.oc-breeze.com" => "Orange County Breeze",
"www.ocregister.com" => "Orange County Register",
"lists.orbitalfox.eu" => "Orbital Fox",
"www.oreilly.com" => "OReilly",
"blog.orhun.dev" => "Orhun Parmaksız",
"orib.dev" => "Ori Bernstein",
"www.orlandoweekly.com" => "Orlando Weekly",
"orlp.net" => "Orson R L Peters",
"www.osnews.com" => "OS News",
"nanochess.org" => "Óscar Toledo G",
"ovr.today" => "Oskar van Rijswijk",
"wickstrom.tech" => "Oskar Wickström",
"osnote.com" => "OSNote",
"osshistory.org" => "OSS History",
"osservatorionessuno.org" => "Osservatorio Nessuno",
"cippic.ca" => "University of Ottawa",
"ottawacitizen.com" => "Ottawa",
"osec.io" => "OtterSec",
"ottertune.com" => "OtterTune",
"www.drijf.net" => "Otto Moerbeek",
"ourworldindata.org" => "Our World in Data",
"ourbigbook.com" => "OurBigBook",
"softwarecrisis.dev" => "Out of the Software Crisis",
"www.outlookindia.com" => "Outlook Publishing India Pvy Ltd",
"www.outlookbusiness.com" => "Outlook Publishing India Pvy Ltd",
"velo.outsideonline.com" => "Outside Interactive Inc",
"www.outsideonline.com" => "Outside Interactive Inc",
"outsidethebeltway.com" => "Outside The Beltway",
"www.outsidethebeltway.com" => "Outside The Beltway",
"overpopulation-project.com" => "Overpopulation",
"www.overthinkingit.com" => "Overthinking It",
"www.ovh.ie" => "OVH",
"owengage.com" => "Owen Gage",
"owlcation.com" => "Owlcation",
"theowp.org" => "OWP",
"policy-practice.oxfam.org" => "Oxfam",
"www.oxfam.org" => "Oxfam",
"academic.oup.com" => "Oxford University Press",
"oxide.computer" => "Oxide",
"www.ozy.com" => "OZY",
"www.legis.state.pa.us" => "PA General Assembly",
"morepablo.com" => "Pablo Meier",
"www.pacifict.com" => "Pacific Tech",
"giacomofolli.com" => "Paco",
"paddy.carvers.com" => "Paddy Carver",
"www.pixelbeat.org" => "Pádraig Brady",
"blog.trends.tf" => "Pair of Pared Pears",
"blog.packagecloud.io" => "Computology LLC",
"pagedout.institute" => "Paged Out!!",
"pagosadailypost.com" => "Pagosa Daily Post",
"pakobserver.net" => "Pakistan",
"www.thefridaytimes.com" => "Pakistan",
"www.geo.tv" => "Pakistan",
"propakistani.pk" => "Pakistan",
"www.pakistantoday.com.pk" => "Pakistan",
"forum.palemoon.org" => "Palemoon",
"palladiummag.com" => "Palladium Magazine",
"padailypost.com" => "Palo Alto Daily Post",
"unit42.paloaltonetworks.com" => "Palo Alto Networks",
"www.cityofpaloalto.org" => "Palo Alto, California",
"blog.vrypan.net" => "Panagiotis Vryonis",
"www.pandasecurity.com" => "Panda Security SLU",
"www.paulox.net" => "Paolo Melchiorre",
"pscanf.com" => "Paolo Scanferla",
"docs.paperless-ngx.com" => "Paperless-ngx",
"papersplease.org" => "Papers Please",
"paperswithcode.com" => "Papers With Code",
"www.papuansbehindbars.org" => "Papuans Behind Bars",
"blog.paradedb.com" => "ParadeDB",
"www.parallelmirror.com" => "Parallel Mirror",
"hey.paris" => "Paris Buttfield-Addison",
"www.parisbeacon.com" => "Paris Beacon News",
"www.disconnect.blog" => "Paris Marx",
"www.readtpa.com" => "Parker Molloy",
"parkerortolani.blog" => "Parker Ortolani",
"parker.micro.blog" => "Parker Ortolani",
"informatimago.free.fr" => "Pascal Bourguignon",
"jumplink.eu" => "Pascal Garber",
"www.passiveradar.com" => "PassiveRadar",
"www.patagonia.com" => "Patagonia",
"www.patentlyapple.com" => "Patently Apple",
"patentpandas.org" => "Patent Pandas",
"www.againstmonopoly.org" => "Patents",
"www.patheos.com" => "Patheos",
"blog.patreon.com" => "Patreon",
"news.patreon.com" => "Patreon",
"www.patreon.com" => "Patreon",
"www.patrick-breyer.de" => "Patrick Breyer",
"paedubucher.ch" => "Patrick Bucher",
"200sc.dev" => "Patrick D Stephen",
"pubby.games" => "Patrick Jordan Bene",
"venam.net" => "Patrick Louis",
"venam.nixers.net" => "Patrick Louis",
"www.kalzumeus.com" => "Patrick McKenzie",
"patricia.no" => "Patricia Aas",
"pnewman.org" => "Partick Newman",
"esham.io" => "Benjamin Esham",
"benjaminhollon.com" => "Benjamin Hollon",
"www.hardill.me.uk" => "Benjamin John Hardill",
"astro-gr.org" => "Pau Amaro Seoane",
"www.paubox.com" => "Paubox Inc",
"www.strassmann.com" => "Paul A Strassmann",
"pboyd.io" => "Paul Boyd",
"peateasea.de" => "Paul Chochrane",
"www.paulcraigroberts.org" => "Paul Craig Roberts",
"pdfernhout.net" => "Paul D Fernhout",
"www.pfrazee.com" => "Paul Frazee",
"libertysys.com.au" => "Paul Gear",
"www.paulgraham.com" => "Paul Graham",
"www.pgrs.net" => "Paul Gross",
"www.madboa.com" => "Paul Heinlein",
"phinze.com" => "Paul Hinze",
"paulkrugman.substack.com" => "Paul Krugman",
"paulrobertlloyd.com" => "Paul Robert Lloyd",
"katexochen.aro.bz" => "Paul Meyer",
"pauladamsmith.com" => "Paul Smith",
"www.pauladamsmith.com" => "Paul Smith",
"paulstamatiou.com" => "Paul Stamatiou",
"koronkevi.ch" => "Paulette Koronkevich",
"www.paulosyibelo.com" => "Paulos Yibelo",
"pavpanchekha.com" => "Pavel Panchekha",
"fxgn.dev" => "Pavel Zolotarevskiy",
"thepavlovictoday.com" => "The Pavlovic Today",
"pawelgrzybek.com" => "Paweł Grzybek",
"pawel.orzech.me" => "Paweł Orzech",
"katafrakt.me" => " Paweł Świątkowski",
"www.greatlakesnow.org" => "PBS",
"www.pbump.net" => "PBump",
"www.pbs.org" => "PBS",
"www.pbsutah.org" => "PBS",
"www.pcengines.ch" => "PC Engines",
"www.pcgamer.com" => "PC Gamer",
"www.pcgamesn.com" => "PCGamesN",
"pclosmag.com" => "PCLinuxOS Magazine",
"au.pcmag.com" => "PC Mag",
"uk.pcmag.com" => "PC Mag",
"www.pcmag.com" => "PC Mag",
"pcper.com" => "PC Perspective",
"pc-tablet.com" => "PC-Tablet",
"www.pcworld.com" => "PC World",
"www.pcbway.com" => "PCBWay",
"www.lifehacker.com.au" => "Pedestrian Group",
"predr.ag" => "Predrag Gruevski",
"blog.pcora.eu" => "Pedro",
"ordep.dev" => "Pedro Tavares",
"blog.peerdb.io" => "PeerDB",
"blog.peerverse.space" => "Peerverse",
"pretendtypewriter.net" => "Peige",
"penberg.org" => "Pekka Enberg",
"30fps.net" => "Pekka Väänänen",
"www.pmail.com" => "Pengasus Mail",
"pen.org" => "Pen America",
"www.penguin.co.uk" => "Penguin Books",
"www.artforum.com" => "Penske Media Corporation",
"www.billboard.com" => "Penske Media Corporation",
"people.com" => "People Magazine",
"peoplevsbig.tech" => "People vs Big Tech",
"peoplesdispatch.org" => "Peoples Dispatch",
"peppermintos.com" => "PeppermintOS",
"wwm.percona.com" => "Percona",
"periferiesurbanes.org" => "Perifèries Urbanes",
"science.perlcommunity.org" => "The Science Perl Journal",
"metacpan.org" => "Perl",
"security.metacpan.org" => "Perl",
"tprc.us" => "Perl",
"act.yapc.eu" => "Perl",
"yapcjapan.org" => "Perl",
"perladvent.org" => "Perl",
"perldoc.perl.org" => "Perl",
"blogs.perl.org" => "Perl",
"log.perl.org" => "Perl",
"perlconference.us" => "Perl",
"perlmaven.com" => "Perl",
"perlmonks.org" => "PerlMonks",
"www.perlmonks.org" => "PerlMonks",
"perlweeklychallenge.org" => "Perl",
"news.perlfoundation.org" => "Perl",
"perlweekly.com" => "Perl",
"squareperl.com" => "Perl",
"www.perl.com" => "Perl",
"pdl.perl.org" => "Perl Data Language",
"perlhacks.com" => "Perl Hacks",
"prma.dev" => "Perma",
"www.permaculturenews.org" => "Permaculture Research Institute",
"peroty.micro.blog" => "Peroty",
"petapixel.com" => "Peta Pixel",
"lotech.co.uk" => "Pete",
"explodingcomma.com" => "Pete Brown",
"petewarden.com" => "Pete Warden",
"peterbabic.dev" => "Peter Babic",
"www.more-magic.net" => "Peter Bex",
"peter.czanik.hu" => "Peter 'CzP' Czanik",
"peter.eisentraut.org" => "Peter Eisentraut",
"bad.network" => "Peter Hessler",
"movq.de" => "Peter Hofmann",
"boredzo.org" => "Peter Hosey",
"petermalmgren.com" => "Peter Malmgren",
"nxdomain.no" => "Peter N M Hansteen",
"petermoulding.com" => "Peter Moulding",
"peterdn.com" => "Peter Nelson",
"norvig.com" => "Peter Norvig",
"www.peteronion.org.uk" => "Peter Onion",
"ruk.ca" => "Peter Rukavina",
"crowdhailer.me" => "Peter Sax",
"www.snamellit.com" => "Peter Tillemans",
"www.peterboroughtoday.co.uk" => "Peterborough Telegraph",
"blog.peterruppel.de" => "PeterRuppel",
"pitr.ca" => "Peter Vernigorov",
"catonmat.net" => "Peteris Krumins",
"petrovday.com" => "Petrov Day",
"www.pewtrusts.org" => "Pew Charitable Trusts",
"www.pewresearch.org" => "Pew Reseach Center",
"philarcher.org" => "Phil Archer",
"philbooth.me" => "Phil Booth",
"philbull.wordpress.com" => "Phil Bull",
"notes.eatonphil.com" => "Phil Eaton",
"www.gyford.com" => "Phil Gyford",
"technomancy.us" => "Phil Hagelberg",
"search.technomancy.us" => "Phil Hagelberg",
"stollerys.co.uk" => "Phil Stollerys",
"philzimmermann.com" => "Phil Zimmermann",
"philip.greenspun.com" => "Philip Greenspun",
"ruzkuku.com" => "Philip Kaludercic",
"philiplaine.com" => "Philip Laine",
"www.philipotoole.com" => "Philip O'Toole",
"www.philipzucker.com" => "Philip Zucker",
"philipphagenlocher.de" => "Philipp Hagenlocher",
"globalnation.inquirer.net" => "Phillippine Daily Inquirer",
"news.abs-cbn.com" => "Phillippines",
"www.cnnphilippines.com" => "Phillippines",
"phildini.dev" => "Philip James",
"phillipspobrien.substack.com" => "Phillips P OBrien",
"philosophynow.org" => "Philosophy Now",
"phirephoenix.com" => "Phirephoenix",
"blog.pkh.me" => "Bµg",
"petal.blog" => "Phoebe",
"www.phonearena.com" => "Phone Arena",
"openbenchmarking.org" => "Phoronix Media",
"www.phoronix.com" => "Phoronix",
"blog.jetbrains.com" => "PHP",
"externals.io" => "PHP",
"wiki.php.net" => "PHP",
"www.php.net" => "PHP",
"thephp.foundation" => "The PHP Foundation",
"phr.org" => "PHR",
"phrack.org" => "Phrack",
"pi-hole.net" => "Pi-Hole",
"pimylifeup.com" => "Pi My Life Up",
"blog.pitest.org" => "Pi Test",
"pipe.pico.sh" => "pico.sh LLC",
"docs.pikvm.org" => "PiKVM Handbook",
"www.privateinternetaccess.com" => "PIA",
"plbrault.com" => "Pier‑Luc Brault",
"pierce.dev" => "Pierre 'delroth' Bourdoerce Freemann",
"delroth.net" => "Pierre 'delroth' Bourdon",
"pierre.equoy.fr" => "Pierre Equoy",
"ambrevar.xyz" => "Pierre Neidhardt",
"slugcat.systems" => "Pieter-Jan Briers",
"pijul.org" => "Pijul",
"www.pillarcatholic.com" => "The Pillar",
"blog.pimoroni.com" => "Pimoroni",
"pine64.org" => "Pine64",
"www.pine64.org" => "Pine64",
"www.thepinknews.com" => "PinkNews",
"european-pirateparty.eu" => "Pirate Party",
"calpirg.org" => "PIRG",
"pirg.org" => "PIRG",
"uspirg.org" => "PIRG",
"uspirgedfund.org" => "PIRG",
"pitcherlist.com" => "Pitcher List",
"pivot-to-ai.com" => "Pivot to AI",
"pivotnine.com" => "PivotNine Pty Ltd",
"pixel-gallery.co.uk" => "Pixel Gallery",
"www.pixelstech.net" => "Pixels Tech",
"orgnizedmess.net" => "Piya Gehi",
"pjg1.site" => "Piya Gehi",
"pjmedia.com" => "PJ Media",
"www.plagiarismtoday.com" => "Plagiarism Today",
"planetplanet.net" => "PlanetPlanet",
"planetscale.com" => "PlanetScale",
"planetsmarts.com" => "Planet Smarts",
"www.planetary.org" => "The Planetary Society",
"www.planetizen.com" => "Planetizen",
"en.epicenter.works" => "Plattform Grundrechtspolitik",
"platform.sh" => "Platform.sh GmbH",
"plausible.io" => "Plausible",
"2025.ploneconf.org" => "Plone Conf 2025",
"journals.plos.org" => "PLOS",
"plumconsulting.co.uk" => "Plumb Consulting",
"www.pmnewsnigeria.com" => "PM News NG",
"www.pnas.org" => "PNAS",
"www.pocket-lint.com" => "Pocket Lint",
"pocketnow.com" => "Pocket Now",
"podiboq.micro.blog" => "Podiboq",
"pointc.co" => "The Point C Collective LLC",
"scienceinpoland.pap.pl" => "Poland",
"www.gov.pl" => "Poland",
"notesfrompoland.com" => "Poland",
"poland.postsen.com" => "Poland",
"polandin.com" => "Poland In",
"polarjournal.ch" => "Polar Journal",
"polarhive.net" => "Polarhive",
"docs.pola.rs" => "Polars",
"news.met.police.uk" => "Police UK",
"www.lapoliticaonline.com" => "La Política Online S A",
"www.politico.eu" => "Politico",
"www.politico.com" => "Politico LLC",
"www.eenews.net" => "Politico LLC",
"www.politicususa.com" => "PoliticusUSA LLC",
"polypane.app" => "Polypane B V",
"wolfgirl.dev" => "PolyWolf",
"pomed.org" => "POMED",
"poniesandlight.co.uk" => "Ponies and Light Ltd",
"blog.popcorncomputer.com" => "Popcorn Computer",
"popular.info" => "Popular Information LLC",
"www.popularmechanics.com" => "Popular Mechanics",
"www.popsci.com" => "Popular Science",
"www.pressherald.com" => "Portland Press Herald",
"portswigger.net" => "Port Swigger",
"www.getport.io" => "Port.io",
"law360.com" => "Portfolio Media Inc",
"www.law360.com" => "Portfolio Media Inc",
"portswigger.net" => "Port Swigger",
"www.positech.co.uk" => "Positech Games",
"positivemoney.org" => "Positive Money",
"blog.ptsecurity.com" => "Positive Technologies",
"www.ptsecurity.com" => "Positive Technologies",
"thepostmillennial.com" => "Post Millennial",
"www.postnord.dk" => "PostiNord A/S",
"postopen.org" => "Post-Open",
"www.postgresql.org" => "PostgreSQL",
"postmarketos.org" => "postmarketOS",
"www.pik-potsdam.de" => "Potsdam Institute for Climate Impact Research",
"phk.freebsd.dk" => "Poul-Henning Kamp",
"www.powazek.com" => "Derek Powazek",
"blog.powerdns.com" => "PowerDNS",
"www.powerpc-notebook.org" => "GNU Linux PowerPC Notebook",
"www.politifact.com" => "Poynter Institute",
"www.poynter.org" => "Poynter Institute",
"manpages.bsd.lv" => "Practical UNIX Manuals",
"www.thepragmaticcto.com" => "The Pragmatic CTO",
"www.pragmaticlinux.com" => "Pragmatic Linux",
"microblog.pratikmhatre.com" => "Pratik",
"www.pravda.com.ua" => "Ukrainska Pravda",
"praveshkoirala.com" => "Pravesh Koirala",
"pretalx.com" => "Pretalx",
"misfra.me" => "Preetam Jinka",
"www.premierchristianity.com" => "Premier Christianty",
"community.element14.com" => "Premier Farnell Ltd",
"concordia.at" => "Presseclub Concordia",
"pressgazette.co.uk" => "Press Gazette",
"www.pressgazette.co.uk" => "Press Gazette",
"pthorpe92.dev" => "Preston Thorpe",
"www.pri.org" => "PRI",
"priceofoil.org" => "Price Of Oil",
"priceonomics.com" => "Priceonomics",
"www.princewilliamtimes.com" => "Prince William Times",
"blog.citp.princeton.edu" => "Princeton University",
"principia-softwarica.org" => "Principia Softwarica",
"www.prisonlegalnews.org" => "Prison Legal News",
"gdpr.report" => "Priv Sec Global",
"theprivacydad.com" => "The Privacy Dad",
"petsymposium.org" => "Privacy Enhancing Technologies Symposium",
"www.petsymposium.org" => "Privacy Enhancing Technologies Symposium",
"privacyfirst.nl" => "Privacy First",
"blog.privacyguides.org" => "Privacy Guides",
"www.privacyguides.org" => "Privacy Guides",
"privacytests.org" => "PrivacyTests.org",
"gigeconomy.privacyinternational.org" => "Privacy International",
"www.privacyinternational.org" => "Privacy International",
"privacyinternational.org" => "Privacy International",
"blog.privacytools.io" => "Privacy Tools",
"www.smartcompany.com.au" => "Private Media Pty Ltd",
"blog.prizrak.me" => "Prizak",
"www.prnewswire.com" => "PR Newswire",
"www.globalcement.com" => "Pro Global Media",
"probablydance.com" => "Probably Dance",
"www.process-one.net" => "ProcessOne",
"productiongap.org" => "Production Gap Report",
"www.programmableweb.com" => "Programmable Web",
"pldb.com" => "Programming Language DataBase",
"www.dtnpf.com" => "Progressive Farmer DTN",
"www.projectcensored.org" => "Project Censored",
"muse.jhu.edu" => "Project MUSE",
"www.nayuki.io" => "Project Nayuki",
"runeberg.org" => "Project Runeberg",
"www.project-syndicate.org" => "Project Syndicate",
"project-trident.org" => "Project Trident",
"features.propublica.org" => "Pro Publica",
"www.propublica.org" => "Pro Publica",
"www.proofpoint.com" => "Proofpoint",
"www.prospectmagazine.co.uk" => "Prospect",
"www.prosus.com" => "Prosus",
"protectdemocracy.org" => "Protect Democracy",
"protesilaos.com" => "Protesilaos Stavrou",
"www.protocol.com" => "Protocol",
"proton.me" => "Proton A G",
"protonmail.com" => "Proton A G",
"protonvpn.com" => "ProtonVPN",
"en.protothema.gr" => "Protothema",
"blog.prototypr.io" => "Prototypr",
"providencemag.com" => "Provedence Magagzine",
"www.prri.org" => "PRRI",
"www.prwatch.org" => "PR Watch",
"www.prweb.com" => "PR Web",
"www.psypost.org" => "PsyPost",
"cdn.aaai.org" => "The Association for the Advancement of Artificial Intelligence (AAAI)",
"www.psychologicalscience.org" => "Association for Psychological Science",
"www.psychologytoday.com" => "Psychology Today",
"www.publictechnology.net" => "PT",
"www.citizen.org" => "Public Citizen",
"publicdomainmovie.net" => "Public Domain Movies",
"publicdomainreview.org" => "Public Domain Review",
"publicintegrity.org" => "Public Integrity",
"publicinterestnetwork.org" => "Public Interest Network",
"publickey.directory" => "Public Key Directory",
"publicknowledge.org" => "Public Knowledge",
"www.publicmediaalliance.org" => "Public Media Alliance",
"publicseminar.org" => "Public Seminar",
"www.publish0x.com" => "Publish0x",
"www.publishersweekly.com" => "Publishers Weekly",
"publishingperspectives.com" => "Publishing Perspectives",
"pudding.cool" => "The Pudding",
"www.pugetsoundinstitute.org" => "Puget Sound Institute",
"www.pulseitmagazine.com.au" => "Pulse IT AU",
"pulsesecurity.co.nz" => "Pulse Security Ltd",
"pulitzerarts.org" => "The Pulitzer Arts Foundation",
"www.pulumi.com" => "Pulumi",
"punchng.com" => "Punch NG",
"punkx.org" => "Punkx",
"politicalviolenceataglance.org" => "PVAG",
"www.cerias.purdue.edu" => "Purdue University",
"blog.purestorage.com" => "Pure Storage Inc",
"puri.sm" => "Purism",
"pwnies.com" => "The Pwnie Awards",
"pycon.blogspot.com" => "PyCon US",
"us.pycon.org" => "PyCon US",
"docs.python.org" => "Python",
"llm.datasette.io" => "Python",
"peps.python.org" => "Python",
"www.djangoproject.com" => "Python",
"www.pythonmorsels.com" => "Python",
"pip.pypa.io" => "Python",
"python.plainenglish.io" => "Python in Plain English",
"blog.pypi.org" => "Python Package Index",
"pyfound.blogspot.com" => "Python Software Foundation",
"pythonspeed.com" => "Python Speed",
"q4os.org" => "Q4OS",
"engineering.q42.nl" => "Q42 Engineering",
"www.qemu.org" => "Qemu",
"qemu-advent-calendar.org" => "Qemu",
"responsiblestatecraft.org" => "Quincy Institute for Responsible Statecraft Inc",
"www.quintessenz.org" => "Quintessenz",
"rexarski.com" => "Qiū Ruì",
"qorg11.net" => "Qorg",
"qrp-popcorn.blogspot.com" => "QRP HomeBuilder",
"www.qt.io" => "Qt",
"quadrant.org.au" => "Quadrant",
"www.qualcomm.com" => "Qualcomm",
"blog.qualys.com" => "Qualys",
"cdn2.qualys.com" => "Qualys",
"www.qualys.com" => "Qualys",
"labs.quansight.org" => "Quansight",
"www.quantamagazine.org" => "Quanta Magazine",
"quantixed.org" => "Quantixed",
"blog.quarkslab.com" => "Quarkslab",
"qz.com" => "Quartz",
"eprints.qut.edu.au" => "Queensland University of Technology",
"www.qhrc.qld.gov.au" => "Queensland Human Rights Commission AU",
"qsantos.fr" => "Quentin Santos",
"questdb.com" => "QuestDB",
"qsapp.com" => "Quicksilver",
"quillette.com" => "Quillette",
"quindarius.com" => "Quin Ali Lyles-Wood",
"www.quirksmode.org" => "Quirks Mode",
"quoteinvestigator.com" => "Quote Investigator",
"r2c.dev" => "R2C",
"rjfaas.com" => "R J Faas",
"r-graph-gallery.com" => "The R Graph Gallery",
"rscottjones.com" => "R Scott Jones",
"www.rstreet.org" => "R Street Institute",
"ryxcommar.com" => "R Y X R",
"rmkit.dev" => "Rmkit",
"www.railtarget.eu" => "RT Publishing s r o",
"rabbitictranslator.com" => "RabbiticTranslator",
"rachsmith.com" => "Rach Smith",
"rachelbythebay.com" => "Rachel",
"www.readwriterachel.com" => "Rachel Kaufman",
"rachelandrew.co.uk" => "Rachel Andrew",
"rachelbythebay.gumroad.com" => "Rachel Kroll",
"kwon.nyc" => "Rachel J Kwon",
"rachbelaid.com" => "Rachid Belaid",
"www.rkoucha.fr" => "Rachid Koucha",
"docs.racket-lang.org" => "Racket",
"programmingwithstyle.com" => "Radek Koziel",
"radiant.computer" => "The Radiant Computer Team",
"radfordneal.wordpress.com" => "Radford Neal",
"www.radical-elements.com" => "Radical Elements",
"www.radiofree.org" => "Radio Free",
"radioink.com" => "Radio Ink",
"www.radioworld.com" => "Radio World",
"forum.radxa.com" => "Radxa Community",
"rsadowski.de" => "Rafael Sadowski",
"www.sizeofvoid.org" => "Rafael Sadowski",
"www.therage.co" => "The Rage",
"rahul.gopinath.org" => "Rahul Gopinath",
"rakhim.exotext.com" => "Rakhim",
"rakuforprediction.wordpress.com" => "Raku for Prediction",
"www.railtech.com" => "RailTech",
"poisel.info" => "Rainer Poisel",
"rainforestfoundation.org" => "Rainforest Foundation US",
"www.rainforest-alliance.org" => "Rainforest Alliance",
"rairfoundation.com" => "RAIR Foundation",
"rakhesh.com" => "Rakhesh Sasidharan",
"course.raku.org" => "Rakulang",
"docs.raku.org" => "Rakulang",
"raku-advent.blog" => "Rakulang",
"rakudoweekly.blog" => "Rakulang",
"www.newsobserver.com" => "Raleigh News And Observer",
"ramble.pw" => "Ramble",
"rtpg.co" => "Raphael",
"rapha.land" => "Raphael Amorim",
"www.rappler.com" => "Rappler",
"www.raptitude.com" => "Raptitude",
"projects.raspberrypi.org" => "Raspberry Pi",
"datasheets.raspberrypi.com" => "Raspberry Pi",
"forums.raspberrypi.com" => "Raspberry Pi",
"hackspace.raspberrypi.org" => "Raspberry Pi",
"magazine.raspberrypi.com" => "Raspberry Pi",
"magpi.raspberrypi.com" => "Raspberry Pi",
"magpi.raspberrypi.org" => "Raspberry Pi",
"pip.raspberrypi.com" => "Raspberry Pi",
"sheets.raspberrypi.com" => "Raspberry Pi",
"picockpit.com" => "Raspberry Pi",
"www.raspberrypi.com" => "Raspberry Pi",
"www.raspberrypi.org" => "Raspberry Pi",
"helloworld.raspberrypi.org" => "Raspberry Pi Foundation",
"www.raspberrypi-spy.co.uk" => "Raspberry Pi Spy",
"raspberrytips.com" => "Raspberry Pi Tips",
"chavanniclass.wordpress.com" => "Ratika Deshpande",
"rationalwiki.org" => "RationalWiki",
"rauljordan.com" => "Raul Jordan",
"www.rawstory.com" => "Raw Story",
"www.raygard.net" => "Ray Gardner",
"www.raymondcamden.com" => "Raymond Camden",
"www.raymondibrahim.com" => "Raymond Ibrahim",
"ansari.sh" => "Rayyan Ansari",
"www.rcfp.org" => "RCFP",
"reactos.org" => "ReactOS",
"react.dev" => "Meta Platforms Inc",
"about.readthedocs.com" => "Read the Docs Inc",
"realkm.com" => "RealKM Cooperative Ltd",
"therealnews.com" => "The Real News Network",
"realitycircuit.com" => "Reality Circuit",
"www.devonlive.com" => "Reach PLC",
"www.edinburghlive.co.uk" => "Reach PLC",
"www.leicestermercury.co.uk" => "Reach PLC",
"www.businesstoday.com.my" => "Reach Publishing",
"reason.com" => "Reason",
"blog.rebased.pl" => "Rebased",
"beccais.online" => "Rebecca Owen",
"www.meditationsinanemergency.com" => "Rebecca Solnit",
"rebeccawilliams.info" => "Rebecca Williams",
"joinreboot.org" => "Reboot",
"smayze.com" => "Rebooting Electronics",
"www.netfunny.com" => "Rec.Humor.Funny",
"www.twz.com" => "Reccurrent Ventures",
"reclaimthenet.org" => "Reclaim The Net",
"blog.reds.ch" => "Reconfigurable and embedded Digital Systems",
"go.recordedfuture.com" => "The Recorded Future",
"www.recordedfuture.com" => "The Recorded Future",
"www.addictioncenter.com" => "Recovery Worldwide LLC",
"www.rei.com" => "Recreational Equipment Inc",
"simblob.blogspot.com" => "Red Blob Games",
"redhat.com" => "Red Hat Official",
"www.redhat.com" => "Red Hat Official",
"www.bestcolleges.com" => "Red Ventures",
"felixreda.eu" => "Reda",
"redmondmag.com" => "Redmond Magazine",
"redmonk.com" => "RedMonk",
"reduxx.info" => "Reduxx",
"www.fighttorepair.org" => "Reflow",
"fighttorepair.substack.com" => "Reflow",
"mexicotoday.com" => "REFORMA",
"refuge.org.uk" => "Refuge",
"en.refund4freedom.org" => "Refund4Freedom",
"www.rrnews.co.uk" => "Refurb Renovation News",
"www.regenstrief.org" => "Regenstrief Institute",
"tuckersiemens.com" => "Reilly Tucker Siemens",
"www.reillywood.com" => "Reilly Wood",
"reinout.vanrees.org" => "Reinout VanRees",
"rietta.com" => "Rietta",
"rovarma.com" => "Ritesh Oedayrajsingh Varma",
"river.cat" => "River MacLeod",
"kokorobot.ca" => "Rek Bell",
"relational-pipes.globalcode.info" => "Relational Pipes",
"www.edrants.com" => "Reluctant Habits",
"remarkable.com" => "reMarkable",
"brusselssignal.eu" => "Remedia Europe",
"remkusdevries.com" => "Remkus de Vries",
"raymii.org" => "Remy Van Elst",
"remy.wang" => "Remy Wang",
"lecaro.me" => "Renan",
"rhardih.io" => "René Hansen",
"reneweconomy.com.au" => "Renew Economy AU",
"www.renewableenergyworld.com" => "Renewable Energy World",
"www.therepository.email" => "The Repository",
"reproof.app" => "Reproof",
"www.researchgate.net" => "Research Gate",
"www.resilience.org" => "Resilience",
"resist-ai.sh" => "Resist AI",
"restofworld.org" => "Rest of World",
"retailwire.com" => "RetailWire",
"retractionwatch.com" => "Retraction Watch",
"retrocomputingforum.com" => "Retro Computing",
"fingfx.thomsonreuters.com" => "Thompson Reuters Foundation",
"www.context.news" => "Thompson Reuters Foundation",
"in.reuters.com" => "Reuters",
"mobile.reuters.com" => "Reuters",
"uk.reuters.com" => "Reuters",
"www.reuters.com" => "Reuters",
"www.reuseabox.co.uk" => "ReuseABox",
"lerner.co.il" => "Reuven Lerner",
"www.reviewed.com" => "Reviewed",
"www.revk.uk" => "RevK",
"rewilding.org" => "Rewilding",
"www.rfa.org" => "RFA",
"www.rfc-editor.org" => "RFC",
"gandhara.rferl.org" => "RFERL",
"www.rferl.org" => "RFERL",
"en.rfi.fr" => "RFI",
"www.rfi.fr" => "RFI",
"governor.ri.gov" => "Rhode Island",
"www.rhyswynne.co.uk" => "Rhys Wynne",
"rg3.name" => "Ricardo García",
"rgsilva.com" => "Ricardo Gomes da Silva",
"blog.rgsilva.com" => "Ricardo Gomes da Silva",
"morrick.me" => "Riccardo Mori",
"derflounder.wordpress.com" => "Rich Trouton",
"darnassus.sceen.net" => "Richard Braun",
"redalder.org" => "Richard Brežák",
"www.rdwolff.com" => "Richard D Wolff",
"www.richarddawkins.net" => "Richard Dawkins",
"www.ragman.net" => "Richard Green",
"writingslowly.com" => "Richard Griffiths",
"directaccess.richardhicks.com" => "Richard M Hicks",
"stallman.org" => "Richard M Stallman",
"www.incompleteideas.net" => "Richard S Sutton",
"shred.zone" => "Richard “Shred” Körber",
"aschmann.net" => "Rick Aschmann",
"rickcarlino.com" => "Rick Carlino",
"falkvinge.net" => "Rick Falkvinge",
"linuxmafia.com" => "Rick Moen",
"www.repair.org" => "Right to Repair",
"righttowarn.ai" => "Right to Warn About Advanced Artificial Intelligence",
"www.rightchannelradios.com" => "Right Channel Radios",
"www.rightscon.org" => "RightsCon",
"huijzer.xyz" => "Rik Huijzer",
"www.riksbank.se" => "Riksbanken",
"riki.house" => "Riki Moe",
"rileytestut.com" => "Riley Testut",
"www.ringsidenews.com" => "Ringside News",
"rinici.de" => "Rini",
"labs.ripe.net" => "RIPE",
"ripe80.ripe.net" => "RIPE",
"www.ripe.net" => "RIPE",
"riscv.org" => "RISCV",
"rishi.baldawa.com" => "Rishi Baldawa",
"risky.biz" => "RiskyBiz",
"news.risky.biz" => "RiskyBiz",
"riskybiznews.substack.com" => "RiskyBiz",
"srslyriskybiz.substack.com" => "RiskyBiz",
"www.riverfronttimes.com" => "River Front Times",
"rivet.gg" => "Rivet Gaming Inc",
"developer.r-project.org" => "Rlang",
"r-posts.com" => "Rlang",
"www.r-bloggers.com" => "Rlang",
"rmoff.net" => "Rmoff",
"www.rnz.co.nz" => "RNZ",
"roarmag.org" => "ROAR Magazine",
"blog.robbowley.net" => "Rob Bowley",
"rknight.me" => "Rob Knight",
"www.landley.net" => "Rob Landley",
"robm.me.uk" => "Rob Miller",
"despairlabs.com" => "Rob Norris",
"commandcenter.blogspot.com" => "Rob Pike",
"www.computerglitch.net" => "Robbie Reese",
"v7.robweychert.com" => "Rob Weychert",
"www.zolkos.com" => "Rob Zolkos",
"alexsci.com" => "Robert Alexander",
"birming.com" => "Robert Birming",
"robertbirming.com" => "Robert Birming",
"robertbreen.com" => "Robert Breen",
"robertbryce.substack.com" => "Robert Bryce",
"blog.cleancoder.com" => "Robert C Martin",
"blog.robertelder.org" => "Robert Elder",
"cybersect.substack.com" => "Robert Graham",
"robertgreiner.com" => "Robert Greiner",
"rhaas.blogspot.com" => "Robert Haas",
"robertheaton.com" => "Robert Heaton",
"sixdemonbag.org" => "Robert J Hansen",
"sfwriter.com" => "Robert J Sawyer",
"robert.ocallahan.org" => "Robert OCallahan",
"frittiert.es" => "Robert Pfotenhauer",
"robertrehak.com" => "Robert Rehak",
"www.datafantic.com" => "Robert Ritz",
"robertspencer.org" => "Robert Spencer",
"www.stylewarning.com" => "Robert Smith",
"rob-turner.net" => "Robert Turner",
"rbf.dev" => "Roberto Frenna",
"betounix.substack.com" => "Roberto Sánchez",
"robertovaccari.com" => "Roberto Vaccari",
"robertoviola.cloud" => "Roberto Viola",
"robertovitillo.com" => "Roberto Vitillo",
"robertreich.org" => "Robert Reich",
"robertreich.substack.com" => "Robert Reich",
"robertwinkler.com" => "Robert Winkler",
"robert.winter.ink" => "Robert Winter",
"berjon.com" => "Robin Berjon",
"gazoche.xyz" => "Robin Lange",
"robinrendle.com" => "Robin Rendle",
"blog.sulami.xyz" => "Robin Schroer",
"www.robinsloan.com" => "Robin Sloan",
"sherwood.news" => "Robinhood Europe UAB",
"robinhood.com" => "Robinhood Europe UAB",
"blog.mjbots.com" => "Robotic Systems LLC",
"ftp.rodents-montreal.org" => "Rodents-Montreal",
"www.rodsbooks.com" => "Roderick W Smith",
"rodneybrooks.com" => "Rodney Brooks",
"manualdousuario.net" => "Rodrigo Ghedin",
"notes.ghed.in" => "Rodrigo Ghedin",
"trofire.com" => "ROF",
"sgadrat.itch.io" => "Roger Bidon",
"blog.paranoidpenguin.net" => "Roger Comply",
"softhandover.wordpress.com" => "Roger Piqueras Jover",
"weblog.rogueamoeba.com" => "Rogue Amoeba",
"rohanrd.xyz" => "Rohan D",
"grohan.co" => "Rohan Gupta",
"seirdy.one" => "Rohan Kumar",
"rolisz.ro" => "Rolisz",
"www.rollcall.com" => "Rollcall",
"www.rollingstone.com" => "Rolling Stone",
"empt1e.blogspot.com" => "Roman Bogorodskiy",
"mmapped.blog" => "Roman Kashitsyn",
"kizu.dev" => "Roman Komarov",
"highimpactengineering.substack.com" => "Roman NikolaeRoman Nikolaev",
"romanzipp.com" => "Roman Zipp",
"romchip.org" => "ROMchip",
"blog.rareschool.com" => "Romilly Cocking",
"flgov.com" => "Ron DeSantis",
"www.reaganlibrary.gov" => "Ronald Reagan Presidential Library & Museum",
"thelinerproject.com" => "Ronnie Lutes",
"undeleted.ronsor.com" => "Ronsor Labs",
"rooseveltinstitute.org" => "Roosevelt Institute",
"read-only.net" => "rootCompute",
"rootkid.me" => "RootKid",
"docs.ropensci.org" => "rOpenSci",
"ropensci.org" => "rOpenSci",
"rosindustrial.org" => "ROS Industrial",
"knotbin.leaflet.pub" => "Roscoe Rubin-Rottenberg",
"rojospinks.substack.com" => "Rosie Spinks",
"www.rossp.org" => "Ross Poulton",
"rosswintle.uk" => "Ross Wintle",
"wiki.rossmanngroup.com" => "Rossmann Repair Group Inc",
"www.rottentomatoes.com" => "Rotten Tomatoes",
"pricepoint.substack.com" => "Roy Price",
"roytang.net" => "Roy Tang",
"thoughtleadership.rbc.com" => "Royal Bank of Canada",
"www.postofficetrial.com" => "Royal Mail UK",
"royalsociety.org" => "The Royal Society UK",
"www.chemistryworld.com" => "Royal Society Of Chemistry",
"royalsocietypublishing.org" => "Royal Society UK",
"www.royalsblue.com" => "Royals Blue",
"www.pcloadletter.dev" => "Rnb37",
"www.rsaconference.com" => "RSA",
"rsf.org" => "RSF",
"www.rt.com" => "RT",
"about.rte.ie" => "RTE",
"www.rte.ie" => "RTE",
"news.rthk.hk" => "RTHK",
"today.rtl.lu" => "RTL",
"www.rtl-sdr.com" => "RTL-SDR",
"brokenco.de" => "R Tyler Croy",
"retro.rubenerd.au" => "Ruben Schade",
"rubenerd.com" => "Ruben Schade",
"www.rubenerd.au" => "Ruben Schade",
"kedara.eu" => "Ruben Verweij",
"leanpub.medium.com" => "Ruboss Technology Corp",
"www.ruby-lang.org" => "Ruby",
"www.ruby.or.jp" => "Ruby Association",
"rubycentral.org" => "Ruby Central",
"blog.rubygems.org" => "RubyGems",
"rudism.com" => "Rudis Muiznieks",
"web-in-security.blogspot.com" => "Ruhr University Bochum",
"taoofmac.com" => "Rui Carmo",
"ruky.me" => "Rukshan",
"untidy.substack.com" => "Runa Sandvik",
"runbsd.info" => "RunBSD",
"runxiyu.org" => "Runxi Yu",
"www.runzero.com" => "runZero Inc",
"rosipov.com" => "Ruslan Osipov",
"ruslanspivak.com" => "Ruslan Spivak",
"ruudvanasseldonk.com" => "Ruud van Asseldonk",
"www.ruv.is" => "RÚV",
"www.rwjf.org" => "RWJF",
"rxdb.info" => "RxDB",
"ryan.freumh.org" => "Ryan Gibb",
"rygoldstein.com" => "Ryan Goldstein",
"ryanmulligan.dev" => "Ryan Mulligan",
"ryantrimble.com" => "Ryan Trimble",
"ryan.himmelwright.net" => "Ryan Himmelwright",
"zinascii.com" => "Ryan Zezeski",
"ryelang.org" => "Ryelang",
"www.spglobal.com" => "S & P Global",
"srcreigh.ca" => "S R Creigh",
"www.s-config.com" => "S-Config",
"www.scienceboard.net" => "SAB",
"www.sacredheartsc.com" => "Sacred Heart SC",
"sachachua.com" => "Sacha Chua",
"safcei.org" => "SAFCEI",
"saferchemicals.org" => "Safer Chemicals",
"journals.sagepub.com" => "Sage Journal",
"sagi.io" => "Sagi Kedmi",
"saharareporters.com" => "Sahara Reporters",
"blog.sahilister.in" => "Sahilister",
"www.stltoday.com" => "Saint Louis Post-Dispatch",
"saket.me" => "Saket Narayan",
"sals.place" => "Sal",
"www.christianheadlines.com" => "Salem Web Network",
"lr0.org" => "Salih Muhammed",
"sallylait.com" => "Sally Lait",
"whitep4nth3r.com" => "Salma Alam-Naylor",
"www.salon.com" => "Salon",
"code.foo.no" => "Salve J Nilsen",
"sambleckley.com" => "Sam Bleckley",
"samcurry.net" => "Sam Curry",
"samwho.dev" => "Sam Rose",
"samsaffron.com" => "Sam Saffron",
"samexpert.com" => "SAMexpert",
"news.samsung.com" => "Samsung",
"httpster.io" => "Sami",
"0x44.cc" => "Sami Alaoui Kendil",
"www.sami-lehtinen.net" => "Sami Lehtinen",
"www.saminiir.com" => "Sami Niiranen",
"samueloph.dev" => "Samuel Henrique",
"sam-jaques.appspot.com" => "Samuel Jaques",
"blog.samuelmaddock.com" => "Samuel Maddock",
"tulach.cc" => "Samuel Tulach",
"samy.pl" => "Samy Kamkar",
"www.sacurrent.com" => "San Antonio",
"www.sandiegouniontribune.com" => "San Diego",
"www.sfchronicle.com" => "San Fancisco",
"sfstandard.com" => "The San Fancisco Standard",
"www.sfexaminer.com" => "San Fancisco",
"sjvsun.com" => "The San Joaquin Valley Sun",
"ischool.sjsu.edu" => "San José State University",
"www.uscopyrightattorneys.com" => "Sanders Law Group",
"www.sandordargo.com" => "Sandor Dargo",
"reasonablypolymorphic.com" => "Sandy Maguire",
"saneef.com" => "Saneef H Ansari",
"sanixdk.xyz" => "Sanix-Darker",
"www.dshield.org" => "SANS",
"isc.sans.edu" => "SANS",
"www.sans.org" => "SANS",
"www.santacruzsentinel.com" => "Santa Cruz",
"smdp.com" => "Santa Monica Daily Press",
"blog.lusito.info" => "Santo Pfingsten",
"without.boats" => "Saoirse",
"community.sap.com" => "SAP",
"toao.com" => "Sadiq Jaffer",
"sarajaksa.eu" => "Sara Jakša",
"www.sarasoueidan.com" => "Sara Soueidan",
"sarajoy.dev" => "Sarah Joy",
"therealsarahmiller.substack.com" => "Sarah Miller",
"sarajevotimes.com" => "Sarajevo Times",
"www.saturdayeveningpost.com" => "Saturday Evening Post Society",
"www.smbc-comics.com" => "Saturday Morning Breakfast Cereal",
"english.alarabiya.net" => "Saudi Arabia",
"saudigazette.com.sa" => "Saudi Gazette",
"samkhawase.com" => "Saurabh \"Sam\" Khawase",
"hanukkah.bluebird.sh" => "BlueBird Shell",
"savageminds.org" => "Savage Minds",
"savetibet.org" => "Save Tibet",
"www.savethechildren.org" => "Save the Children",
"www.sbs.com.au" => "SBS",
"smartbitchestrashybooks.com" => "SBTB",
"www.scalevp.com" => "Scale Venture Partners",
"scheatkode.com" => "Scheatkode",
"scheerpost.com" => "Scheerpost",
"schengen.news" => "Schengen.News",
"schillerinstitute.com" => "Schiller Institute",
"schwarztech.net" => "SchwarzTech",
"www.schneems.com" => "Richard Schneeman",
"www.agensir.it" => "Società per l’Informazione Religiosa",
"www.spagmag.org" => "Society for the Promotion of Adventure Games",
"scholarlykitchen.sspnet.org" => "Society for Scholarly Publishing",
"scifiinterfaces.com" => "Sci-fi Interfaces",
"www.hubermanlab.com" => "Scicomm Media LLC",
"www.scienceabc.com" => "Science ABC",
"sciencealert.com" => "Science Alert",
"www.sciencealert.com" => "Science Alert",
"sciencebusiness.net" => "Science Business",
"www.sciencedaily.com" => "Science Daily",
"www.sciencefocus.com" => "Science Focus",
"www.sciencenews.org" => "Science News",
"sciencenigeria.com" => "Science Nigeria",
"medicalxpress.com" => "Science X Network",
"blogs.scientificamerican.com" => "Scientific American",
"www.scientificamerican.com" => "Scientific American",
"blog.scientific-python.org" => "Scientific Python Blog",
"scitechdaily.com" => "Sci Tech Daily",
"sciml.ai" => "SciML",
"ihodl.com" => "SCMC",
"www.scmagazineuk.com" => "SC Media UK",
"www.scmp.com" => "SCMP",
"www.scmp.com" => "SCMP",
"www.scoop.co.nz" => "Scoop Media",
"statescoop.com" => "Scoop News Group",
"cyberscoop.com" => "Scoop News Group",
"defensescoop.com" => "Scoop News Group",
"fedscoop.com" => "Scoop News Group",
"www.cyberscoop.com" => "Scoop News Group",
"www.fedscoop.com" => "Scoop News Group",
"www.scopeofwork.net" => "Scope of Work",
"scorpil.com" => "Scorpil",
"scottandrew.com" => "Scott Andrew",
"scottrichmond.me" => "Scott C Richmond",
"www.scottcalonico.com" => "Scott Calonico",
"blog.gitbutler.com" => "Scott Chacon",
"sdubinsky.com" => "Scott Dubinsky",
"scott.mn" => "Scott Feeney",
"scot.tg" => "Scott Graham",
"blog.simplejustice.us" => "Scott H Greenfield",
"www.hanselman.com" => "Scott Hanselman",
"scotthelme.co.uk" => "Scott Helme",
"www.scottohara.me" => "Scott O'Hara",
"scottjehl.com" => "Scott Jehl",
"scottstuff.net" => "Scott Laird",
"scottlawsonbc.com" => "Scott Lawson",
"moral.net.au" => "Scott Percival",
"www.scottredig.com" => "Scott Redig",
"scottreinhardmaps.com" => "Scott Reinhard",
"theshamblog.com" => "Scott Shambaugh",
"www.scott-a-s.com" => "Scott Schneider",
"scottsexton.co" => "Scott Sexton",
"www.scottsmitelli.com" => "Scott Smitelli",
"scottwillsey.com" => "Scott Willsey",
"www.scl.org" => "Scottish Society for Computers and Law",
"www.scottishdailyexpress.co.uk" => "Scottish Daily Express",
"www.supremecourt.gov" => "SCOTUS",
"www.scotusblog.com" => "SCOTUSblog",
"obsd.solutions" => "Scqr Inc",
"www.scrapingbee.com" => "ScrapingBee API",
"scrapsfromtheloft.com" => "Scraps from the Loft",
"screenrant.com" => "Screen Rant",
"www.screenslate.com" => "Screen Slate",
"graphite.dev" => "Screenplay Studios Inc dba Graphite",
"scribbles.page" => "Scribbles",
"scribe.rip" => "Scribe",
"www.wmar2news.com" => "Scripps Local Media Inc",
"www.wtkr.com" => "Scripps Media Inc",
"www.wtvr.com" => "Scripps Media Inc",
"www.10news.com" => "Scripps Media Inc",
"www.newschannel5.com" => "Scripps Media Inc",
"www.koaa.com" => "Scripps Media Inc",
"www.kristv.com" => "Scripps Media Inc",
"www.kxlf.com" => "Scripps Media Inc",
"www.wrtv.com" => "Scripps Media Inc",
"www.wxyz.com" => "Scripps Media Inc",
"scripting.com" => "Scripting News",
"blog.scrt.ch" => "SCRT",
"www.scylladb.com" => "ScyllaDB Inc",
"sdomi.pl" => "Sdomi",
"blog.sdn.clinic" => "SDN Clinic",
"sdtimes.com" => "SDTimes",
"www.sdxcentral.com" => "SDx Central",
"sboots.ca" => "Sean Boots",
"www.seancassidy.me" => "Sean Cassidy",
"seancoates.com" => "Sean Coates",
"boston.conman.org" => "Sean Conner",
"xobs.io" => "Sean Cross",
"seanfobbe.com" => "Seán Fobbe",
"www.seangoedecke.com" => "Sean Goedecke",
"sean.heelan.io" => "Sean Heelan",
"www.seanmcp.com" => "Sean McPherson",
"www.8ball.report" => "Sean Monahan",
"deadsuperhero.com" => "Sean Tilley",
"seanvoisen.com" => "Sean Voisen",
"sean.voisen.org" => "Sean Voisen",
"archive.seattletimes.com" => "Seattle Times",
"www.seattletimes.com" => "Seattle Times",
"seblog.nl" => "Sebastiaan Andeweg",
"www.sebastianbuza.com" => "Sebastian Buza",
"kapouay.eu.org" => "Sebastian Marie",
"sebastianmihai.com" => "Sebastian Mihai",
"site.sebasmonia.com" => "Sebastián Monía",
"www.ruder.io" => "Sebastian Ruder",
"www.sebastiansylvan.com" => "Sebastian Sylvan",
"sebastiano.tronto.net" => "Sebastian Tronto",
"blog.sebastianwick.net" => "Sebastian Wick",
"www.sebastopoltimes.com" => "Sebastopol Times",
"blog.sebin-nyshkim.net" => "Sebin",
"www.sec.gov" => "SEC",
"sec-consult.com" => "SEC Consule`",
"seclists.org" => "Sec Lists",
"secpy.medium.com" => "SecPy",
"www.secret-bases.co.uk" => "Secret Bases",
"secretnyc.co" => "Secret Media Network",
"securepairs.org" => "Securepairs",
"www.secureworks.com" => "Secureworks",
"securepractice.co" => "Secure Practice",
"securedrop.org" => "SecureDrop",
"securityaffairs.com" => "Security Affairs",
"securityaffairs.co" => "Security Affairs",
"securityboulevard.com" => "Security Boulevard",
"www.securitysales.com" => "Security Sales",
"www.securityweek.com" => "Security Week",
"www.sedaa.org" => "Sedaa",
"www.seeedstudio.com" => "Seeed Studio",
"seekingalpha.com" => "Seeking Alpha",
"segmentnext.com" => "Segment Next",
"seiya.me" => "Seiya Nuta",
"www.searchenginejournal.com" => "SEJ",
"southeastlinuxfest.org" => "SELF",
"www.semafor.com" => "Semafor Inc",
"semiengineering.com" => "Semi Engineering",
"semiaccurate.com" => "SemiAccurate",
"labs.sentinelone.com" => "Sentinel Labs",
"www.sentinelone.com" => "Sentinel One",
"blog.sentry.io" => "Sentry",
"www.sepa.org.uk" => "SEPA UK",
"josephg.com" => "Seph",
"septentrio.uit.no" => "Septentrio Academic Publishing",
"sequoia-pgp.org" => "SequoiaPGP",
"lists.sequoia-pgp.org" => "SequoiaPGP",
"sfgate.com" => "SFGate",
"zserge.com" => "Serge Zaitsev",
"blog.serghei.pl" => "Serghei Iakovlev",
"makemeacto.substack.com" => "Sergio Visinoni",
"rasbora.dev" => "Sergiy Usatyuk",
"serhack.me" => "SerHack",
"serpentos.com" => "Serpent OS",
"getsession.org" => "Session",
"www.seti.org" => "SETI Intsitute",
"seths.blog" => "Seth Godin",
"sethmlarson.dev" => "Seth Michael Larson",
"www.sfgate.com" => "SFGate",
"sfist.com" => "SFist",
"www.softwarefreedom.org" => "SFLC",
"insights.uksg.org" => "SGJournal UK",
"www.shacknews.com" => "Shacknews",
"www.shadaj.me" => "Shadaj Laddad",
"www.shadowcat.co.uk" => "Shadowcat Systems Ltd",
"shadowproof.com" => "Shadowproof",
"www.scannedinavian.com" => "Shae Ericsson",
"debugagent.com" => "Shai Almog",
"blog.webjeda.com" => "Sharath",
"sharefoundation.info" => "SHARE Fondacija",
"noteflakes.com" => "Sharon Rosner",
"www.shayon.dev" => "Shayon Mukherjee",
"www.thestar.co.uk" => "Sheffield",
"sheridancomputers.co.uk" => "Sheridan Computers",
"cosmicqbit.dev" => "Shariq Raza Qadri",
"www.shetnews.co.uk" => "Shetland News",
"actualbudget.com" => "Shift Reset LLC",
"www.shippax.com" => "Shippax",
"www.shippingandfreightresource.com" => "Shipping and Freight Resource",
"code.openark.org" => "Shlomi Noach",
"www.shmoocon.org" => "ShmooCon",
"www.shopify.com" => "Shopify",
"sharats.me" => "Shrikant Sharat Kandula",
"parentheticallyspeaking.org" => "Shriram Krishnamurthi",
"blog.sshh.io" => "Shrivu Shankar",
"www.shropshirestar.com" => "Shropshire Star",
"thatshubham.com" => "Shubham Bose",
"shujisado.org" => "Shuji Sado",
"www.sianberry.org.uk" => "Siân Berry",
"siberiantimes.com" => "Siberian Times",
"sick.codes" => "Sick Codes",
"www.sicpers.info" => "SICP",
"countvajhula.com" => " Siddhartha Kasivajhula",
"www.sidnlabs.nl" => "SIDN",
"www.sierraclub.org" => "Sierra Club",
"sigfrid-lundberg.se" => "Sigfrid Lundberg",
"sigma-star.at" => "Sigma Star gmbh",
"signmyrocket.com" => "Sign My Rocket",
"www.signal.org" => "Signal",
"signal.org" => "Signal",
"blog.sigstore.dev" => "Sigstore",
"www.armytimes.com" => "Sightline Media Group",
"sjmulder.nl" => "Sijmen Mulder",
"www.siliconrepublic.com" => "Silcon Republic",
"siliconangle.com" => "Silicon Angle",
"theglobalherald.com" => "Silicon Dales Ltd",
"www.silvestar.codes" => "Silvestar Bistrović",
"blog.vortan.dev" => "David Rubin",
"www.simchafisher.com" => "Simcha Fisher",
"xn--ime-zza.eu" => "Šime",
"šime.eu" => "Šime",
"simplesite.ayra.ch" => "A Simple Website",
"kaizo.org" => "Simon B",
"simonbs.dev" => "Simon B Støvring",
"simonandrews.ca" => "Simon Andrews",
"colly.com" => "Simon Collison",
"sirupsen.com" => "Simon Hørup Eskildsen",
"simonhartcher.com" => "Simon Hartcher",
"blog.josefsson.org" => "Simon Josefsson",
"simonlermen.substack.com" => "Simon Lermen",
"soc.me" => "Simon Ochsenreither",
"www.simonpcouch.com" => "Simon P Couch",
"simonsafar.com" => "Simon Safar",
"emersion.fr" => "Simon Ser",
"www.ssp.sh" => "Simon Späti",
"simonwillison.net" => "Simon Willison",
"til.simonwillison.net" => "Simon Willison",
"minutestomidnight.co.uk" => "Simone Silvestroni",
"simonevellei.com" => "Simone Vellei",
"www.simpleanalytics.com" => "Simple Analytics BV",
"simplelogin.io" => "Simple Login",
"simpleobservability.com" => "Simple Observability",
"www.simplypsychology.org" => "Simply Scholar Ltd",
"simson.net" => "Simson Garfinkel",
"katu.com" => "Sinclair Inc",
"kpic.com" => "Sinclair Inc",
"ktul.com" => "Sinclair Inc",
"news3lv.com" => "Sinclair Inc",
"wjla.com" => "Sinclair Inc",
"wpde.com" => "Sinclair Inc",
"sinclairtarget.com" => "Sinclair Target",
"singjupost.com" => "Singju Post",
"singularityhub.com" => "Singularity Education Group",
"www.sisvel.com" => "Sisvel",
"www.sita.aero" => "SITA",
"digit.site36.net" => "Site36",
"www.sitra.fi" => "Sitra",
"sixcolors.com" => "Six Colors",
"sizeof.cat" => "SizeOf(Cat)",
"opensourcewatch.beehiiv.com" => "SJVN",
"skarnet.org" => "Skarnet",
"skyandtelescope.org" => "Sky and Telescope",
"news.sky.com" => "Sky News",
"slashpages.net" => "Slash Pages",
"www.slant.co" => "Slant",
"slate.com" => "Slate",
"www.thesleepjudge.com" => "The Sleep Judge",
"slimbook.com" => "Slimbook",
"devlog.hexops.com" => "Slimsag",
"www.schoollibraryjournal.com" => "SLJ",
"slophole.net" => "SlopHole",
"slovenia.postsen.com" => "Slovenia",
"www.slowfood.com" => "Slow Food Foundation",
"smallcypress.bearblog.dev" => "Small Cypress",
"www.smartcitiesworld.net" => "Smart Cities World",
"smartlogic.io" => "SmartLogic",
"www.smashingmagazine.com" => "Smashing Magazine",
"www.smithsonianmag.com" => "Smithsonian Magazine",
"nmaahc.si.edu" => "Smithsonian Institute",
"www.si.edu" => "Smithsonian Institute",
"iter.ca" => "Smitop",
"world-playground-deceit.net" => ">Smug Lisp Weenie",
"home.snafu.de" => "snafu Gesellschaft für interaktive Netzwerke mbH",
"www.snopes.com" => "Snopes",
"datagirl.xyz" => "Snow flurry",
"www.socallinuxexpo.org" => "SoCal Linux Expo",
"socket.dev" => "Socket Inc",
"socialdhara.com" => "Social Dhara",
"socialeconomicslab.org" => "Social Economics Lab",
"www.social-engineer.com" => "Social Engineer",
"socialwebfoundation.org" => "The Social Web Foundation",
"sggsc.blog" => "Societe Generale India",
"documents.saa.org" => "Society for American Archaeology",
"www.saa.org" => "Society for American Archaeology",
"gluecko.se" => "Soeren",
"en.softonic.com" => "Softonic",
"www.softpanorama.org" => "Softpanorama",
"news.softpedia.com" => "Softpedia",
"2023.fossy.us" => "Software Freedom Conservancy",
"sfconservancy.org" => "Software Freedom Conservancy",
"www.softandhardware.com" => "Software And Hardware",
"www.softwareatscale.dev" => "Software At Scale",
"softwareengineeringdaily.com" => "Software Engineering Daily",
"davmac.org" => "Software Is Crap",
"davmac.wordpress.com" => "Software Is Crap",
"www.thesoftwareguild.com" => "Software Guild",
"docs.softwareheritage.org" => "Software Heritage",
"www.softwareheritage.org" => "Software Heritage",
"thedesk.net" => "Solano Media LLC",
"blog.cofree.coffee" => "Solomon Bothwell",
"somedudesays.com" => "Some Dude Says",
"archives.somnolescent.net" => "The Somnolescent Archives",
"sluongng.substack.com" => "Son Luong Ngoc",
"www.songfacts.com" => "Songfacts",
"blog.playstation.com" => "Sony",
"www.playstation.com" => "Sony",
"sophiabits.com" => "Sophia Willows",
"localghost.dev" => "Sophie Koonin",
"assets.sophos.com" => "Sophos",
"news.sophos.com" => "Sophos",
"soranews24.com" => "Sora News 24",
"soeren.one" => "Søren",
"www.yoursoundmatters.com" => "Sound Matters",
"sourceforge.net" => "Sourceforge",
"git.sr.ht" => "Sourcehut",
"man.sr.ht" => "Sourcehut",
"mybroadband.co.za" => "South Africa",
"www.capeindependent.com" => "South Africa",
"www.citizen.co.za" => "South Africa",
"southeastohiomagazine.com" => "Southeast Ohio",
"laist.com" => "Southern California Public Radio",
"www.soscip.org" => "Southern Ontario Smart News",
"www.southeastasianews.net" => "Big News Network FZ LLC",
"southsidepride.com" => "Southside Pride",
"soylentnews.org" => "Soylent News",
"www.space.com" => "Space",
"www.spacebar.news" => "Spacebar.News",
"spacenews.com" => "SpaceNews",
"spaceraccoon.dev" => "Spaceraccoon",
"spaceweather.com" => "Spaceweather.com",
"www.thespacereview.com" => "The Space Review",
"learn.sparkfun.com" => "SparkFun Electronics",
"news.sparkfun.com" => "SparkFun Electronics",
"www.sparkfun.com" => "SparkFun Electronics",
"sparktoro.com" => "Spark Toro",
"sparrowmedia.net" => "Sparrow Media",
"sparrowdo.wordpress.com" => "Sparrowdo",
"spectator.org" => "Spectator",
"spectator.com" => "The Spectator Ltd",
"spectator.us" => "Spectator US",
"www.spectator.com.au" => "Spectator AU",
"www.speedcurve.com" => "SpeedCurve Ltd",
"catern.com" => "Spencer Baugh",
"www.spencerharston.com" => "Spencer Harston",
"spencer.wtf" => "Spencer Lloyd DixoLloyd Dixon",
"spencermortensen.com" => "Spencer Mortensen",
"spheres-journal.org" => "Spheres",
"www.spiegel.de" => "Spiegel",
"supaiku.com" => "Spikedoanz",
"spinroot.com" => "Spin",
"www.splicetoday.com" => "Splice Today",
"www.spin.com" => "Next Management Partners",
"spookbench.net" => "Spook",
"www.si.com" => "Sports Illustrated",
"www.sportsnhobbies.org" => "Sports n' Hobbies",
"www.sportspolitika.news" => "Sports Politika",
"www.sportskeeda.com" => "Sportskeeda",
"www.spottinghistory.com" => "SpottingHistory",
"engineering.atspotify.com" => "Spotify Inc",
"www.theringer.com" => "Spotify Inc",
"springmag.ca" => "Spring Magazine",
"link.springer.com" => "Springer Nature",
"researchintegrityjournal.biomedcentral.com" => "Springer-Verlag GmbH",
"sputniknews.com" => "Sputnik News",
"static1.squarespace.com" => "Squarespace",
"sqlite.org" => "SQLite",
"www.sqlite.org" => "SQLite",
"sqmagazine.co.uk" => "SQ Magazine",
"sverigesradio.se" => "SR",
"www.sverigesradio.se" => "SR",
"www.sr2.uk" => "SR2 Commmunications Limited",
"sourcehut.org" => "Srht",
"srid.ca" => "Sridhar Ratnakumar",
"srlabs.de" => "SR Labs",
"www.sscce.org" => "The SSCCE",
"www.ssh.com" => "SSH Communications Security Corporation",
"lists.rutschle.net" => "SSLH",
"ssplisbad.com" => "SSPL is Bad",
"papers.ssrn.com" => "SSRN",
"thestack.technology" => "The Stack",
"www.thestack.technology" => "The Stack",
"stackdiary.com" => "Stack Diary",
"stackoverflow.blog" => "Stack Overflow",
"stack-auth.com" => "Stackframe Inc",
"staceyoniot.com" => "Stacey on IoT",
"www.thebookseller.com" => "Stage Media Company Limited",
"www.stamfordadvocate.com" => "Stamford Advocate",
"stanbright.com" => "Stan Bright",
"www.standict.eu" => "StandICT",
"standpointmag.co.uk" => "Standpoint UK",
"bigdata.2minutestreaming.com" => "Stanislav Kozlovski",
"fi.starlabs.systems" => "Star Labs",
"www.startribune.com" => "Star Tribune",
"blog.thea.codes" => "Stargirl Flowers",
"www.stargrave.org" => "Stargrave",
"www.stripes.com" => "Stars And Stripes",
"www.statnews.com" => "Stat",
"statenews.com" => "State News",
"2025.stateofcss.com" => "State of CSS 2025",
"2024.stateofcss.com" => "State of CSS 2024",
"2025.stateofhtml.com" => "State of HTML 2025",
"2023.stateofhtml.com" => "State of HTML 2023",
"www.vsd.lt" => "State Security Department Of Lithuania",
"www.statewatch.org" => "State Watch",
"www.slashfilm.com" => "Static Media",
"www.statista.com" => "Statista",
"www.status.news" => "Status News LLC",
"www.stavros.io" => "Stavros Korokithakis",
"steelcake.com" => "Steelcake",
"stefan-gloor.ch" => "Stefan Gloor",
"eay.cc" => "Stefan Grund",
"eissing.org" => "Stefan Eissing",
"www.stefanjudis.com" => "Stefan Judis",
"skanthak.homepage.t-online.de" => "Stefan Kanthak",
"stefan-marr.de" => " Stefan Marr",
"www.stefantheard.com" => "Stefan Theard",
"blog.vmsplice.net" => "Stefan Hajnoczi",
"stefanzweifel.dev" => "Stefan Zweifel",
"steflan-security.com" => "Stefano Lanaro",
"my-notes.dragas.net" => "Stefano Marinelli",
"it-notes.dragas.net" => "Stefano Marinelli",
"squeaki.sh" => "Stefano Verna",
"0l.de" => "Steffen Vogel",
"blog.sesse.net" => "Steinar H Gunderson",
"www.ancient-origins.net" => "Stella Novus",
"www.stencilled.me" => "Senthil Thyagarajan",
"www.stepsecurity.io" => "Step Security",
"stephango.com" => "Steph Ango",
"svrooij.io" => "Stephan van Rooij",
"www.bortzmeyer.org" => "Stéphane Bortzmeyer",
"doc.huc.fr.eu.org" => "Stéphane Huc",
"blog.stephaniestimac.com" => "Stephanie Stimac",
"www.scd31.com" => "Stephen D",
"www.stephendiehl.com" => "Stephen Diehl",
"stephenfollows.com" => "Stephen Follows",
"stephenfry.substack.com" => "Stephen Fry",
"512pixels.net" => "Stephen Hackett",
"www.humprog.org" => "Stephen Kell",
"buildingjerusalem.blog" => "Stephen Kneale",
"blog.stephenmarz.com" => "Stephen Marz",
"smist08.wordpress.com" => "Stephen Smith",
"blog.stephenturner.us" => "Stephen Turner",
"writings.stephenwolfram.com" => "Stephen Wolfram",
"www.steves-internet-guide.com" => "Steve Cope",
"unixwiz.net" => "Steve Friedl",
"www.sjgames.com" => "Steve Jackson Games",
"stevejobsarchive.com" => "The Steve Jobs Archive",
"steveklabnik.com" => "Steve Klabnik",
"blog.steve.fi" => "Steve Kemp",
"blog.val.town" => "Steve Krouse",
"tangiblelife.net" => "Steve Ledlow",
"www.troubleshooters.com" => "Steve Litt",
"troubleshooters.com" => "Steve Litt",
"blog.einval.com" => "Steve McIntyre",
"visitmy.website" => "Steve Messer",
"secondthoughts.ai" => "Steve Newman",
"www.stevevladeck.com" => "Steve Vladeck",
"steve-yegge.medium.com" => "Steve Yegge",
"abnml.com" => "Steven Anderson",
"www.deobald.ca" => "Steven Deobald",
"stevengharms.com" => "Steven G Harms",
"www.stvn.sh" => "Steven Langbroek",
"srcincite.io" => "Steven Seeley",
"scruss.com" => "Stewart C Russell",
"www.servethehome.com" => "STH",
"stiankri.substack.com" => "Stian Kristoffersen",
"frivarld.se" => "Stiftelsen Fritt Näringsliv/Frivärld",
"www.brautaset.org" => "Stig Brautaset",
"www.stimson.org" => "Stimson",
"stockholmcf.org" => "Stockholm Center For Freedom",
"www.stokesentinel.co.uk" => "StokeonTrentLive",
"www.stonehenge.com" => "Stonehenge Consulting Services",
"www.hacklore.org" => "Stop Hacklore",
"iamstoxe.com" => "Stoxe",
"strn.cat" => "Strcat",
"strandconsult.dk" => "Strand Consult",
"stratechery.com" => "Stratechery",
"www.strawberrymusicplayer.org" => "Strawberry Music Player",
"www.streamingmedia.com" => "Streaming Media",
"usa.streetsblog.org" => "Streetsblog USA",
"streetinsider.com" => "StreetInsider",
"www.streetinsider.com" => "StreetInsider",
"www.lighthousereports.com" => "Stichting Lighthouse Reports",
"stripe.com" => "Stripe",
"tomassetti.me" => "Strumenta",
"www.sttinfo.fi" => "STT Viestintäpalvelut Oy",
"stuartbreckenridge.net" => "Stuart Breckenridge",
"www.stuartellis.name" => "Stuart Ellis",
"stuartl.longlandclan.id.au" => "Stuart Longland",
"www.alwaystwisted.com" => "Stuart Robson",
"stuartschechter.org" => "Stuart Schechter",
"www.thecollegefix.com" => "Student Free Press Association",
"studyfinds.org" => "Study Finds",
"i.stuff.co.nz" => "Stuff",
"stundin.is" => "Stundin",
"stylestage.dev" => "Style Stage",
"subethasoftware.com" => "Sub-Etha Software",
"www.subnetspider.com" => "Subnetspider",
"subplot.tech" => "Subplot",
"www.systemverilog.io" => "Subramani Ganesh",
"www.brennancenter.org" => "Brennan Center for Justice at NYU Law",
"snarky.ca" => "Brett Cannon",
"www.asomo.co" => "Brett Scott",
"suckless.org" => "Suckless",
"sudantribune.com" => "Sudan",
"www.sudanspost.com" => "Sudan",
"www.sudo.ws" => "Sudo",
"www.stuff.co.nz" => "Suff NZ",
"suchir.net" => "Suchir Balaji",
"harihareswara.net" => "Sumana Harihareswara",
"www.harihareswara.net" => "Sumana Harihareswara",
"battlepenguin.com" => "Sumit Khanna",
"thesuntimesnews.com" => "The Sun Times",
"sunainapai.in" => "Sunaina Pai",
"www.sundayobserver.lk" => "Sunday Observer",
"www.timeslive.co.za" => "Sunday Times",
"learnbyexample.github.io" => "Sundeep Agarwal",
"sundogbaelt.dk" => "Sund & Bælt",
"www.sundialservices.com" => "Sundial Services International LLC",
"sny.sh" => "Sunny",
"supabase.com" => "Supabase Inc",
"superdavey.com" => "Superdavey",
"superserverhero.com" => "Super Server Hero",
"www.superhighway98.com" => "Superhighway 98",
"superkuh.com" => "Superkuh",
"stallmansupport.org" => "Support Stallman",
"www.surfertoday.com" => "Surfer Today",
"gearsco.de" => "Surya Rose",
"suricrasia.online" => "Suricrasia Online",
"susam.net" => "SusamPal",
"www.susps.org" => "SUSPS",
"www.sussexlive.co.uk" => "Sussex Live UK",
"nondoc.com" => "Sustainable Journalism Foundation",
"svalboard.com" => "Svalboard",
"svenluijten.com" => "Sven Luijten",
"blog.siphos.be" => "Sven Vermeulen",
"www.svd.se" => "Svenska Dagbladet",
"www.svtplay.se" => "Sveriges Television AB",
"m.signalvnoise.com" => "SVN",
"fsf.org.in" => "Swatantra",
"sweden.postsen.com" => "Postsen, Sweden",
"www.government.se" => "Sweden",
"www.sakerhetspolisen.se" => "Swedish Security Service",
"www.jamstalldhetsmyndigheten.se" => "Sweden",
"www.imy.se" => "Swedish Authority for Privacy Protection",
"www.sweet-juniper.com" => "Sweet Juniper",
"www.swissinfo.ch" => "SWI",
"www.summitdaily.com" => "Swift Communications Inc",
"forums.swift.org" => "Swift Programming Language",
"www.swift.org" => "Swift Programming Language",
"www.swlondoner.co.uk" => "SW Londoner UK",
"www.smh.com.au" => "Sydney Morning Herald",
"www.syfy.com" => "SYFY",
"blog.sygnia.co" => "Sygnia",
"kerkour.com" => "Sylvain Kerkour",
"sylvestre.ledru.info" => "Sylvestre Ledru",
"www.synacktiv.com" => "Syncactiv",
"blog.syncpup.com" => "Syncpup",
"www.synthtopia.com" => "Synthtopia",
"hacklog.in" => "Sys Admin Journal",
"sysdig.com" => "Sysdig Inc",
"blog.system76.com" => "System76",
"support.system76.com" => "Systemd 76",
"sysdfree.wordpress.com" => "Systemd Free",
"systemtek.co.uk" => "SystemTeK",
"www.thenewstribune.com" => "Tacoma News Tribune",
"www.tahirih.org" => "Tahirih Justice Center",
"timep.org" => "The Tahrir Institute",
"tails.boum.org" => "Tails",
"tails.net" => "Tails",
"tailscale.com" => "Tailscale",
"www.taipeitimes.com" => "Taipei Times",
"www.taiwannews.com.tw" => "Taiwan News",
"www.takahe.org.nz" => "Takahē Magazine",
"takebackourtech.org" => "TakeBack Our Tech",
"www.takeda-foundation.jp" => "The Takeda Foundation",
"taler.net" => "GNU Taler",
"www.taler.net" => "GNU Taler",
"thedorkweb.substack.com" => "Tales From The DorkWeb",
"tallahasseereports.com" => "Tallahassee Reports",
"www.talospace.com" => "Talospace",
"www.tampabay.com" => "Tampa Bay",
"projects.tampabay.com" => "Tampa Bay Times",
"blog.tangled.org" => "Tangled Labs Oy",
"www.taniarascia.com" => "Tania Rascia",
"www.tanyagoodin.com" => "Tanya Goodin",
"www.thecitizen.co.tz" => "Tanzania",
"btao.org" => "Tao Bojlén",
"taosecurity.blogspot.com" => "Tao Security Blog",
"www.tara.sh" => "Tara",
"tarakiyee.com" => "Tara Tarakiyee",
"taranis.ie" => "Taranis",
"tariosultan.com" => "Tario Sultan",
"www.tarlogic.com" => "Tarlogic",
"www.baeldung.com" => "Tarnum Java SRL",
"mail.tarsnap.com" => "Tarsnap",
"taskandpurpose.com" => "Task And Purpose",
"tass.com" => "TASS",
"pgsqlpgpool.blogspot.com" => "Tatsuo Ishii",
"tautvilas.lt" => "Tautvilas Mečinskas",
"tautvilas.medium.com" => "Tautvilas Mečinskas",
"tavianator.com" => "Tavian Barnes",
"lock.cmpxchg8b.com" => "Tavis Ormandy",
"www.tandfonline.com" => "Taylor Francis Group",
"taylor.town" => "Taylor Troesh",
"tboteproject.com" => "TBOTE Project",
"tearsheet.co" => "Tearsheet",
"text.tchncs.de" => "Tchncs",
"www.techadvisor.com" => "Tech Advisor",
"www.techcentral.ie" => "Tech Central (Ireland)",
"techcentral.co.za" => "Tech Central (South Africa)",
"www.techlawjournal.com" => "Tech Law Journal",
"technewsinc.com" => "Tech News Inc",
"technewsinc.com" => "Tech News Inc",
"www.techpolicy.press" => "Tech Policy Press",
"techreflect.net" => "Tech Reflect",
"www.techtransparencyproject.org" => "Tech Transparency Project",
"techcrunch.com" => "TechCrunch",
"techdator.net" => "TechDator",
"channellife.co.nz" => "Techday",
"www.techdirt.com" => "Techdirt",
"tech.eu" => "Tech EU",
"techeconomy.ng" => "TechEconomy.ng",
"techexec.com.au" => "Tech Exec",
"techgage.com" => "Techgage",
"www.techhive.com" => "Tech Hive",
"techiemag.com" => "Techie Magazine",
"thetechiesenior.com" => "Techie Senior",
"www.technadu.com" => "TechNadu",
"technode.com" => "TechNode",
"www.techradar.com" => "TechRadar",
"www.techrepublic.com" => "TechRepublic",
"www.techslang.com" => "Techslang",
"cloudnativenow.com" => "Techstrong Group Inc",
"www.techspot.com" => "TechSpot",
"techstory.in" => "TechStory Media",
"devops.com" => "Techstrong Group",
"searchcloudcomputing.techtarget.com" => "TechTarget",
"searchdatamanagement.techtarget.com" => "TechTarget",
"searchhealthit.techtarget.com" => "TechTarget",
"www.techtarget.com" => "TechTarget",
"www.techtimes.com" => "Tech Times",
"www.techtricksworld.com" => "Tech Tricks World",
"techunwrapped.com" => "Tech Unwrapped",
"www.techworm.net" => "Techworm",
"techxplore.com" => "TechXplore",
"www.ted.com" => "TED",
"tedium.co" => "Tedium",
"edwardbenson.com" => "Ted Benson",
"www.honest-broker.com" => "Ted Gioia",
"www.tedinski.com" => "Ted Kaminski",
"gitperf.com" => "Ted Nyman",
"flak.tedunangst.com" => "Ted Unangst",
"teejeetech.com" => "Teejee Tech",
"teemu.online" => "Teemu Vidgren",
"www.teenvogue.com" => "Teen Vogue",
"css-tip.com" => "Temani Afif",
"www.blog.techraj156.com" => "Teja Swaroop",
"tekin.co.uk" => "Tekin Süleyman",
"blog.telegeography.com" => "TeleGeography",
"telegra.ph" => "Telegraph PH",
"goteleport.com" => "Teleport",
"gravitational.com" => "Teleport",
"www.telesurenglish.net" => "teleSUR",
"tenfourfox.blogspot.com" => "Ten Four Fox",
"www.tenable.com" => "Tenable Inc",
"terathon.com" => "Terathon",
"shkspr.mobi" => "Terence Eden",
"edent.codeberg.page" => "Terence Eden",
"terminalwire.com" => "Terminalwire",
"terminusdb.com" => "TerminusDB",
"www.terracenetworks.com" => "Terrace Networks",
"terrastruct.com" => "Terrastruct Inc",
"www.tesi.fi" => "Tesi",
"retire.test-ipv6.com" => "Test-IPv6",
"texs.org" => "Tex Jernigan",
"www.texasattorneygeneral.gov" => "Texas",
"texasnewstoday.com" => "Texas",
"www.chron.com" => "Texas",
"www.mysanantonio.com" => "Texas",
"www.texasobserver.org" => "Texas Observer",
"www.tpr.org" => "Texas Public Radio",
"textual.textualize.io" => "Textualize Inc",
"techfinancials.co.za" => "TFS",
"www.theadvocate.com" => "The Advocate",
"www.hepburnadvocate.com.au" => "The Advocate AU",
"www.theafricareport.com" => "The Africa Report",
"www.theage.com.au" => "The Age AU",
"www.theamericanconservative.com" => "The American Conservative",
"prospect.org" => "The American Prospect",
"anarc.at" => "The Anarcat",
"theappeal.org" => "The Appeal",
"archpaper.com" => "The Architects Newspaper",
"asianage.com" => "The Asian Age",
"www.asianage.com" => "The Asian Age",
"www.theatlantic.com" => "The Atlantic",
"thebarentsobserver.com" => "The Barents Observer",
"www.thebarentsobserver.com" => "The Barents Observer",
"www.theblockcrypto.com" => "The Block",
"www.broadbandtvnews.com" => "Broadband TV News LLP",
"www.thebroadsblog.co.uk" => "Broads Authority",
"brusselsmorning.com" => "Brussels Morning Newspaper",
"www.brusselstimes.com" => "The Brussels Times",
"www.theburnin.com" => "The Burn In",
"www.bizjournals.com" => "The Business Journals",
"www.businesstimes.com.sg" => "TheBusiness Times",
"www.thecanary.co" => "The Canary",
"www.thechronicle.com.au" => "The Chronicle AU",
"www.thecitizen.co.tz" => "The Citizen",
"thecinemaholic.com" => "The Cinemaholic",
"thecodist.com" => "The Codist",
"theconversation.com" => "The Conversation",
"thecorrespondent.com" => "The Correpsondent",
"thecritic.co.uk" => "The Critic",
"www.thedailybeast.com" => "The Daily Beast",
"www.thedailystar.net" => "The Daily Star",
"the-decoder.com" => "Deep Content GbR",
"piunikaweb.com" => "DeepSeaGem Technologies India",
"pavilion.dinfos.edu" => "Defense Information School",
"www.thedefensepost.com" => "The Defense Post",
"www.filfre.net" => "The Digital Antiquarian",
"www.the-digital-life.com" => "The Digital Life",
"thediplomat.com" => "The Diplomat",
"thedispatch.com" => "The Dispatch",
"dissenter.substack.com" => "The Dissenter",
"thedissenter.org" => "The Dissenter",
"www.thedrive.com" => "The Drive",
"www.drive.com.au" => "The Drive Network",
"www.theeastafrican.co.ke" => "The East African KE",
"theecologist.org" => "The Ecologist",
"impact.economist.com" => "The Economist",
"www.economist.com" => "The Economist",
"www.theepochtimes.com" => "The Epoch Times",
"blogs.tribune.com.pk" => "The Express Tribune",
"tribune.com.pk" => "The Express Tribune",
"www.thefastmode.com" => "The Fast Mode",
"thefederalist.com" => "The Federalist",
"www.thefire.org" => "The Fire",
"www.theglobeandmail.com" => "The Globe And Mail CA",
"theglobepost.com" => "The Globe Post",
"thegrayzone.com" => "The Gray Zone",
"gru.gq" => "TheGrugq",
"www.postguam.com" => "The Guam Daily Post",
"www.theguardian.com" => "The Guardian UK",
"thehayride.com" => "The Hayride",
"www.heraldscotland.com" => "The Herald",
"thehill.com" => "The Hill",
"thehimalayantimes.com" => "The Himalayan Times",
"www.thehindu.com" => "The Hindu",
"www.thehindubusinessline.com" => "TheHinduBusinessLine",
"www.thehour.com" => "The Hour",
"thehumanist.com" => "The Humanist",
"m.independent.ie" => "The Independent IE",
"www.independent.co.ug" => "The Independent UG",
"www.independent.co.uk" => "The Independent UK",
"www.the-independent.com" => "The Independent US",
"indieweb.org" => "IndieWeb",
"indianacapitalchronicle.com" => "The Indiana Capital Chronicle",
"www.theindianalawyer.com" => "The Indiana Lawyer",
"theinformant.co.nz" => "The Informant",
"www.theinfostride.com" => "The InfoStride",
"www.theinquirer.net" => "The Inquirer UK",
"www.irishnews.com" => "The Irish News",
"www.thejakartapost.com" => "The Jakarta Post ID",
"www.thejc.com" => "The Jewish Chronicle",
"thejewishvoice.com" => "The Jewish Voice",
"thejewishweekly.com" => "The Jewish Weekly",
"www.thejournal.ie" => "The Journal",
"www.thekashmirmonitor.net" => "The Kashmir Monitor",
"thekingdominsider.com" => "The Kingdom Insider",
"www.thelancet.com" => "The Lancet",
"www.thelegaldescription.com" => "The Legal Description",
"thelocal.to" => "The Local",
"www.thelocal.dk" => "The Local DK",
"www.thelocal.es" => "The Local ES",
"www.thelocal.se" => "The Local SE",
"www.thelondoneconomic.com" => "The London Economic",
"themaritimepost.com" => "The Maritime Post",
"themarkup.org" => "The Markup",
"www.themoscowtimes.com" => "The Moscow Times",
"www.fool.com" => "The Motley Fool",
"www.thenation.com" => "The Nation",
"www.thenational.ae" => "The National AE",
"www.thenationalnews.com" => "The National AE",
"www.thenational.scot" => "The National UK",
"www.newarab.com" => "The New Arab",
"english.alaraby.co.uk" => "TheNewArab",
"www.thenewatlantis.com" => "The New Atlantis",
"www.theneweuropean.co.uk" => "The New European UK",
"www.thenewhumanitarian.org" => "The New Humanitarian",
"then24.com" => "The News 24",
"www.thenews.com.pk" => "The News PK",
"thenewleafjournal.com" => "The New Leaf Journal",
"thenewstack.io" => "The New Stack",
"engineering.nyu.edu" => "New York University",
"www.nyu.edu" => "New York University",
"www.nybooks.com" => "The New York Review",
"www.nextplatform.com" => "The Next Platform",
"thenextweb.com" => "The Next Web",
"northafricapost.com" => "The North Africa Post",
"thenorthlines.com" => "The North Lines IN",
"www.thenorthlines.com" => "The North Lines IN",
"www.theolympian.com" => "The Olympian",
"klamathalerts.com" => "Oregon",
"oregoncapitalchronicle.com" => "Oregon",
"www.opb.org" => "Oregon Public Broadcasting",
"today.oregonstate.edu" => "Oregon State University",
"www.oregonzoo.org" => "The Oregon Zoo",
"www.oregonlive.com" => "The Oregonian",
"www.inquirer.com" => "The Philadelphia Inquirer",
"theprint.in" => "The Print",
"programminghistorian.org" => "The Programming Historian",
"www.thequint.com" => "The Quint",
"theraven.substack.com" => "The Raven",
"thereboot.com" => "The Reboot",
"therecord.media" => "The Record",
"www.recordedfuture.com" => "The Recorded Future Inc",
"regmedia.co.uk" => "The Register UK",
"www.theregister.com" => "The Register UK",
"www.theregister.co.uk" => "The Register UK",
"therevelator.org" => "The Revelator",
"www.sltrib.com" => "The Salt Lake Tribune",
"www.sciencetimes.com" => "The Science Times",
"www.the-scientist.com" => "LabX Media Group",
"www.scotsman.com" => "The Scotsman",
"www.thescottishfarmer.co.uk" => "The Scottish Farmer UK",
"www.gov.scot" => "The Scottish Government",
"www.sparrowmedia.net" => "The Sparrow Project",
"www.spectator.co.uk" => "The Spectator UK",
"www.spokesman.com" => "The Spokesman Review",
"sporks.space" => "The Sporks Space",
"www.standardmedia.co.ke" => "The Standard KE",
"www.thestar.com.my" => "The Star MY",
"www.thestatesman.com" => "The Statesman",
"www.straitstimes.com" => "The Straits Times",
"www.aspistrategist.org.au" => "The Strategist",
"www.thestreet.com" => "The Street",
"www.the-sun.com" => "The Sun",
"www.thesun.co.uk" => "The Sun",
"www.thesundaily.my" => "The SunDaily MY",
"www.thetimes.co.uk" => "The Sunday Times UK",
"www.thetablet.co.uk" => "The Tablet",
"www.thetechnobee.com" => "The Techno Bee",
"www.thetelegraphandargus.co.uk" => "The Telegraph And Argus UK",
"www.telegraphindia.com" => "The Telegraph IN",
"www.telegraph.co.uk" => "The Telegraph UK",
"www.texastribune.org" => "The Texas Tribune",
"www.timesgazette.com" => "The Times Gazette",
"www.timesofisrael.com" => "The Times Of Israel",
"www.nwitimes.com" => "The Times Of Northwest Indiana",
"www.thetimestribune.com" => "The Times Tribune",
"www.thestar.com" => "The Toronto Star",
"www.thetrace.org" => "The Trace",
"www.tribuneindia.com" => "The Tribune IN",
"researchbriefings.files.parliament.uk" => "The United Kingdom",
"www.contractsfinder.service.gov.uk" => "The United Kingdom",
"committees.parliament.uk" => "The United Kingdom Parliament",
"ccrc.gov.uk" => "The United Kingdom Criminal Cases Review Commission",
"news.npcc.police.uk" => "The United Kingdom",
"www.gov.uk" => "The United Kingdom",
"thevaluable.dev" => "The Valuable Dev",
"www.r-type.org" => "The Valve Museum",
"www.theverge.com" => "The Verge",
"www.thevintagenews.com" => "The Vintage News",
"www.wsj.com" => "The Wall Street Journal",
"www.washingtonpost.com" => "The Washington Post",
"www.washingtontimes.com" => "The Washington Times",
"theweek.com" => "The Week",
"www.theweek.in" => "The Week",
"thewire.in" => "The Wire",
"thewirecutter.com" => "The Wirecutter",
"www.thewrap.com" => "The Wrap",
"thezerohack.com" => "The Zero Hack",
"thasso.xyz" => "Thassilo Schulze",
"theor.xyz" => "Theor",
"blog.thereallo.dev" => "Thereallo",
"blog.thibaut-rousseau.com" => "Thibaut Rousseau",
"thierrymoudiki.github.io" => "Thierry Moudiki",
"thinkrealstate.com" => "Think Real State",
"blog.thinkst.com" => "Thinkst",
"thinksustainabilityblog.com" => "Think Sustainability",
"searchengineland.com" => "Third Door Media LLC",
"sockpuppet.org" => "Thomas & Erin Ptacek",
"www.xythobuz.de" => "Thomas Buck",
"www.softwaremaxims.com" => "Thomas Depierre",
"medienbaecker.com" => "Thomas Günther",
"blog.habets.se" => "Thomas Habets",
"www.monticello.org" => "Thomas Jefferson Foundation",
"blog.cavelab.dev" => "Thomas Jensen",
"www.cavelab.dev" => "Thomas Jensen",
"thomask.sdf.org" => "Thomas Karpiniec",
"www.database-doctor.com" => "Thomas Kejser",
"domm.plix.at" => "Thomas Klausner",
"roscidus.com" => "Thomas Leondard",
"thomasrigby.com" => "Thomas Rigby",
"th0mas.nl" => "Thomas Rinsma",
"thomasward.com" => "Thomas Ward",
"muffin.ink" => "Thomas Weber",
"thomasorus.com" => "Thomasorus",
"tomaztsql.wordpress.com" => "Tomaž Kaštrun",
"kramkow.ski" => "Tomasz Kramkowski",
"twdev.blog" => "Tomasz Wisniewski",
"thoughtbot.com" => "Thoughtbot Inc",
"www.thoughtworks.com" => "Thoughtworks Inc",
"bored.horse" => "Thord D Hedengren",
"blog.alteholz.eu" => "Thorsten Alteholz",
"thorstenball.com" => "Thorsten Ball",
"registerspill.thorstenball.com" => "Thorsten Ball",
"threatpost.com" => "Threat Post",
"threema.ch" => "Threema GmbH",
"blog.talosintelligence.com" => "Threat Source",
"www.threatspike.com" => "Threat SpikeLabs",
"djmag.com" => "Thrust Publishing Ltd",
"theholytachanka.com" => "THT",
"thumbwind.com" => "Thumbwind Publications LLC",
"blog.thunderbird.net" => "Thunderbird",
"notes.pault.ag" => "Paul Tagliamonte",
"programmingsimplicity.substack.com" => "Paul Tarvydas",
"www.thurrott.com" => "Paul Thurrott",
"freetibet.org" => "Tibet",
"www.contactmagazine.net" => "Tibet",
"www.phayul.com" => "Tibet",
"www.thetibetpost.com" => "Tibet",
"www.tibetanjournal.com" => "Tibet",
"www.tibetanreview.net" => "Tibet",
"tidbits.com" => "TidBITS",
"tidepool.leaflet.pub" => "Tidepool Heavy Industries",
"tigerbeetle.com" => "TigerBeetle Inc",
"tilde.club" => "Tilde",
"www.tillitis.se" => "Tilitis AB",
"timbornholdt.com" => "Tim Bornholdt",
"www.timbornholdt.com" => "Tim Bornholdt",
"www.tfeb.org" => "Tim Bradshaw",
"www.tbray.org" => "Tim Bray",
"blog.timcappalli.me" => "Tim Cappalli",
"blog.thechases.com" => "Tim Chase",
"timcoatesinsights.wordpress.com" => "Tim Coates",
"timcolwill.com" => "Tim Colwill",
"blog.cotten.io" => "Tim Cotten",
"tim.dierks.org" => "Tim Dierks",
"oylenshpeegul.gitlab.io" => "Tim Heaney",
"timkadlec.com" => "Tim Kadlec",
"timkellogg.me" => "Tim Kellogg",
"www.timdbg.com" => "Tim Misiak",
"time.com" => "Time",
"content.time.com" => "Time",
"www.timeanddate.com" => "Time and Date AS",
"www.timeout.com" => "Time Out England Limited",
"www.thetimes.com" => "Times Media Limited",
"www.timeshighereducation.com" => "Times Higher Education",
"blogs.timesofisrael.com" => "Times Of Israel",
"jewishnews.timesofisrael.com" => "Times Of Israel",
"timesofsandiego.com" => "Times Of San Diego",
"timmyomahony.com" => "Timmy OMahony",
"timotijhof.net" => "Timo Tijhof",
"www.understandingai.org" => "Timothy B Lee",
"www.timothychambers.net" => "Timothy Chambers",
"snyder.substack.com" => "Timothy Snyder",
"timvisee.com" => "Tim Visee",
"timur.hu" => "Timur Kristóf",
"telecominfraproject.com" => "TIP",
"www.tirereview.com" => "Tire Review",
"www.titledrops.net" => "Title Drops",
"tittlepress.com" => "TittlePress",
"www.barik.net" => "Titus Barik",
"tla.systems" => "TLA Systems",
"tldraw.dev" => "Tldraw",
"www.tmz.com" => "TMZ",
"tnc.news" => "TNC",
"tnsr.org" => "TNSR",
"tbspace.de" => "Tobias Mädel",
"blog.ce9e.org" => "Tobias Bengfort",
"tobykurien.com" => "Toby Kurien",
"www.today.com" => "Today",
"www.todayifoundout.com" => "Today I Found Out",
"www.todayintabs.com" => "Today in Tabs",
"www.together.xyz" => "Together",
"tokenpost.com" => "Token Post",
"tolkiengateway.net" => "Tolkien Gateway",
"pertho.net" => "Tom",
"tomcritchlow.com" => "Tom Critchlow",
"tomgamon.com" => "Tom Gamon",
"tomgreenwood.substack.com" => "Tom Greenwood",
"thod.dev" => "Tom Hodson",
"adventurist.me" => "Tom Jones",
"tomlehrersongs.com" => "Tom Lehrer Songs",
"macwright.com" => "Tom MacWright",
"macwright.org" => "Tom MacWright",
"wheybags.com" => "Tom Mason",
"tom7.org" => "Tom Murphy VII",
"tshafer.com" => "Tom Shafer",
"tomscii.sig7.se" => "Tom Szilagyi",
"cholla.mmto.org" => "Tom Trebisky",
"eagain.net" => "Tommi Virtanen",
"tommyp.org" => "Tommy Palmer",
"www.tommyp.org" => "Tommy Palmer",
"tomrenner.com" => "Tom Renner",
"sanctum.geek.nz" => "Tom Ryder",
"blog.sanctum.geek.nz" => "Tom Ryder",
"mloduchowski.com" => "Tomasz Mloduchowski",
"tomdispatch.com" => "TomDispatch",
"www.tomsguide.com" => "Tom's Guide",
"www.tomshardware.com" => "Tom's Hardware",
"communities-dominate.blogs.com" => "Tomi Ahonen",
"www.zylstra.org" => "Ton Zijlstra",
"matangitonga.to" => "Tonga",
"dotat.at" => "Tony Finch",
"eighty-twenty.org" => "Tony Garnock-Jones",
"0xsid.com" => "Tony Sundharam",
"tontinton.com" => "Tony Solomonik",
"it.toolbox.com" => "Toolbox Tech",
"toolspond.com" => "Tools Pond",
"top500.org" => "Top 500",
"www.top500.org" => "Top 500",
"toptechwire.com" => "Top TechWire",
"toptechwire.com" => "Top TechWire",
"topslakr.com" => "Topslakr",
"kettunen.io" => "Topi Kettunen",
"blog.torproject.org" => "Tor",
"forum.torproject.net" => "Tor",
"forum.torproject.org" => "Tor",
"gitlab.torproject.org" => "Tor",
"lists.torproject.org" => "Tor",
"status.torproject.org" => "Tor",
"torment-nexus.mathewingram.com" => "The Torment Nexus",
"torontosun.com" => "Toronto Sun",
"torrentfreak.com" => "Torrent Freak",
"observer.co.uk" => "Tortoise Media",
"towardsdatascience.com" => "Towards Data Science",
"towardsdev.com" => "Towards Dev",
"talkingpointsmemo.com" => "TPM Media LLC",
"tracydurnell.com" => "Tracy Durnell",
"www.thecurrent.com" => "The Trade Desk",
"blog.trailofbits.com" => "Trail of Bits",
"www.railwaypro.com" => "Trains",
"www.translinkcf.fi" => "Trans Link",
"transactional.blog" => "Transactional Blog",
"site.transitapp.com" => "TransitApp",
"www.transalt.org" => "Transportation",
"treefoundation.org" => "TREE",
"blog.trendmicro.com" => "Trend Micro",
"www.trendmicro.com" => "Trend Micro",
"www.trentonian.com" => "Trentonian",
"www.trovster.com" => "Trevor Morris",
"triblive.com" => "Trib",
"tribunetimes.co.uk" => "Tribune Times",
"www.musclecarsandtrucks.com" => "Tri-Power Media LLC",
"www.trickster.dev" => "Trickster Dev",
"trifectatech.org" => "Trifecta Tech Foundation",
"trigger.dev" => "Trigger",
"www.chroniclelive.co.uk" => "Trinity Mirror North East",
"www.tripplite.com" => "Tripp Lite",
"www.tripwire.com" => "Tripwire",
"www.troyhunt.com" => "Troy Hunt",
"troypatterson.me" => "Troy Patterson",
"troypress.com" => "Troy Press",
"www.trtworld.com" => "TRT World",
"www.truenas.com" => "TrueNAS",
"true-tech.net" => "TrueTech",
"trufflesecurity.com" => "Truffle Security Co",
"news.trust.org" => "Trust",
"www.truthandtransparency.org" => "Truth and Transparency",
"www.truthdig.com" => "Truthdig",
"truthout.org" => "TruthOut",
"tuananh.net" => "Tuan-Anh",
"www.tubefilter.com" => "Tubfilter Inc",
"www.tubsta.com" => "Tubsta",
"tudorr.ro" => "Tudor Roman",
"now.tufts.edu" => "Tufts University",
"tukaani.org" => "The Tukaani Project",
"www.tuko.co.ke" => "TUKOKE",
"tumfatig.net" => "TuMFatig",
"www.tumfatig.net" => "TuMFatig",
"www.tumblr.com" => "Tumblr",
"turgaykivrak.medium.com" => "Turgay Kivrak",
"turingpi.com" => "Turing Pi",
"www.aa.com.tr" => "Turkey",
"www.turkishminute.com" => "Turkish Minute",
"blog.turso.tech" => "Turso",
"turso.tech" => "Turso",
"www.turtlesai.com" => "Turtle's AI",
"www.tusacentral.com" => "Tusa Central",
"www.tucsonsentinel.com" => "Tuscon Sentinel",
"tuta.com" => "Tutao GmbH",
"tutanota.com" => "Tutao GmbH",
"b.tuxes.uk" => "Tuxes UK",
"tvier.net" => "Tvier",
"tweedegolf.nl" => "Tweed Golf",
"www.twilio.com" => "Twilio Inc",
"www.twincities.com" => "TwinCities Pioneer Press",
"twitgoo.com" => "Twitgoo",
"blog.twitter.com" => "Twitter",
"www.twitterandteargas.org" => "Twitter And Tear Gas",
"musings.tychi.me" => "Ty Chi",
"www.ty-penguin.org.uk" => "Ty Penguin",
"thetyee.ca" => "The Tyee",
"codefaster.substack.com" => "Tyler Adams",
"tylercipriani.com" => "Tyler Cipriani",
"tkte.ch" => "Tyler Kennedy",
"tylerrussell.dev" => "Tyler Russell",
"tylersticka.com" => "Tyler Sticka",
"blog.tymscar.com" => "Tymscar",
"typeable.io" => "Typeable",
"typst.app" => "Typst",
"www.tyreextinguishers.com" => "Tyr Extinguishers",
"discourse.ubuntu.com" => "Ubuntu",
"documentation.ubuntu.com" => "Ubuntu",
"kubuntu.org" => "Ubuntu",
"ubuntucinnamon.org" => "Ubuntu",
"pages.ubuntu.com" => "Ubuntu",
"ubuntu.com" => "Ubuntu",
"askubuntu.com" => "Ubuntu",
"manpages.ubuntu.com" => "Ubuntu",
"ubuntuhandbook.org" => "Ubuntu Handbook",
"www.ubuntukylin.com" => "Ubuntu Kylin",
"www.ubuntupit.com" => "Ubuntu Pit",
"www.ubuntubuzz.com" => "Ubuntubuzz",
"businessfocus.co.ug" => "Uganda",
"www.ugchristiannews.com" => "Uganda Christian News",
"rugu.dev" => "Uğur Erdem Seyfi",
"www.rugu.dev" => "Uğur Erdem Seyfi",
"www.northwalespioneer.co.uk" => "North Wales Pioneer",
"www.nationalcrimeagency.gov.uk" => "National Crime Agency UK",
"www.npcc-msoicu.co.uk" => "National Police Chief's Council UK",
"www.england.nhs.uk" => "National Health Service UK",
"assets.publishing.service.gov.uk" => "UK",
"www.judiciary.uk" => "UK",
"www.ons.gov.uk" => "UK",
"publications.parliament.uk" => "UK",
"science.food.gov.uk" => "UK",
"www.ukri.org" => "UK Research and Innovation",
"ouci.dntb.gov.ua" => "Ukraine",
"www.chathamhouse.org" => "UKRIIA",
"orangejuiceliberationfront.com" => "Uli Kusterer",
"ullajordan.wordpress.com" => "Ulla Jordan",
"ultrasciencelabs.com" => "Ultrascience Labs",
"docs.ultralytics.com" => "Ultralytics Inc",
"www.ufcw.org" => "The United Food and Commercial Workers International Union",
"wedocs.unep.org" => "United Nations Environment Programme",
"unu.edu" => "United Nations University",
"unitar.org" => "United Nations Institute for Training and Research",
"desapublications.un.org" => "UN",
"inweh.unu.edu" => "UN",
"news.un.org" => "UN",
"ohchr.org" => "UN",
"treaties.un.org" => "UN",
"unfccc.int" => "UN",
"unric.org" => "UN",
"until.un.org" => "UN",
"www.un.org" => "UN",
"www.unccd.int" => "UNCCD",
"unicri.org" => "UNICRI",
"www.unep.org" => "UN",
"www.unesco.org" => "UNESCO",
"www3.astronomicalheritage.net" => "UNESCO",
"www.genevaenvironmentnetwork.org" => "UN Environment Programme",
"www.unchainedatlast.org" => "Unchained At Last",
"undark.org" => "Undark",
"undeadly.org" => "Undeadly",
"www.undeadly.org" => "Undeadly",
"underjord.io" => "Lars Wikman",
"www.unfpa.org" => "UNFPA",
"unfriendlygrinch.info" => "Unfriendly Grinch",
"www.unfriendlygrinch.info" => "Unfriendly Grinch",
"unherd.com" => "UnHerd",
"www.ohchr.org" => "UN Human Rights",
"www.tuhs.org" => "The Unix Heritage Society",
"unmitigatedrisk.com" => "Unmitigated Risk",
"www.aalto.fi" => "Aalto University",
"lib.tkk.fi" => "Aalto University",
"acris.aalto.fi" => "Aalto University",
"www.adelaide.edu.au" => "University of Adelaide",
"news.ubc.ca" => "The University of British Columbia",
"sites.ubc.ca" => "The University of British Columbia",
"sites.uab.edu" => "The University of Alibama at Birmingham",
"journals.library.ualberta.ca" => "The University of Alberta",
"www.supsi.ch" => "University of Applied Sciences and Arts of Southern Switzerland",
"people.idsia.ch" => "Dalle Molle Institute for Artificial Intelligence USI-SUPSI",
"www.universalhub.com" => "Universal Hub",
"www.uafsunstar.com" => "University of Alaska",
"news.arizona.edu" => "University of Arizona",
"www2.cs.arizona.edu" => "University of Arizona",
"asunow.asu.edu" => "uni Arizona State",
"azpbs.org" => "uni Arizona State",
"news.asu.edu" => "uni Arizona State",
"usenate.asu.edu" => "uni Arizona State",
"news.uark.edu" => "uni Arkansas",
"besacenter.org" => "uni Bar-Ilan",
"www.bath.ac.uk" => "uni Bath",
"scet.berkeley.edu" => "University of California, Berkeley",
"btlj.org" => "University of California, Berkeley",
"www.ocf.berkeley.edu" => "University of California, Berkeley",
"health.ucdavis.edu" => "University of California, Davis",
"www.ioes.ucla.edu" => "University of California, Los Angeles",
"satcom.sysnet.ucsd.edu" => "University of California, San Diego",
"scholarship.law.bu.edu" => "uni Boston",
"oceans.ubc.ca" => "University of British Columbia",
"blog.cs.brown.edu" => "uni Brown",
"www.southampton.ac.uk" => "University of Southhampton",
"dornsife.usc.edu" => "University of Southern California",
"bair.berkeley.edu" => "uni California",
"cseweb.ucsd.edu" => "uni California",
"today.ucsd.edu" => "uni California",
"dailybruin.com" => "uni California",
"library.ucsd.edu" => "uni California",
"www.caida.org" => "uni California",
"ucnet.universityofcalifornia.edu" => "uni California",
"ucsdguardian.org" => "uni California",
"www.dailycal.org" => "uni California",
"www.highlandernews.org" => "uni California",
"www.ucdavis.edu" => "uni California",
"www.cst.cam.ac.uk" => "The University of Cambridge",
"www.jbs.cam.ac.uk" => "The University of Cambridge",
"ccaf.io" => "The University of Cambridge",
"plus.maths.org" => "uni Cambridge",
"www.cambridge.org" => "uni Cambridge",
"www.varsity.co.uk" => "uni Cambridge",
"www.cl.cam.ac.uk" => "uni Cambridge",
"carnegieendowment.org" => "Carnegie Endowment for International Peace",
"kb.cert.org" => "Carnegie Mellon University",
"www.cs.cmu.edu" => "Carnegie Mellon University",
"www.scs.cmu.edu" => "Carnegie Mellon University",
"broligarchy.substack.com" => "Carole Cadwalladr",
"www.carolinecrampton.com" => "Caroline Crampton",
"observer.case.edu" => "Case Western Reserve University",
"elmc.at" => "Cat Scraps",
"www.unicef.org" => "UNICEF",
"www.cmich.edu" => "uni Central Michigan",
"www.journals.uchicago.edu" => "The University of Chicago Press",
"bfi.uchicago.edu" => "The University of Chicago",
"harris.uchicago.edu" => "The University of Chicago",
"news.uchicago.edu" => "The University of Chicago",
"www.chibus.com" => "The University of Chicago",
"www2.lib.uchicago.edu" => "The University of Chicago",
"www.promarket.org" => "The University of Chicago",
"www.ucl.ac.uk" => "uni College London",
"cires.colorado.edu" => "University of Colorado Boulder",
"curc.readthedocs.io" => "University of Colorado Boulder",
"www.colorado.edu" => "University of Colorado Boulder",
"csuglobal.edu" => "uni Colorado State",
"moglen.law.columbia.edu" => "Eben Moglen, Columbia University",
"journals.library.columbia.edu" => "Columbia University",
"journalism.columbia.edu" => "Columbia University",
"news.climate.columbia.edu" => "Columbia University",
"president.columbia.edu" => "Columbia University",
"columbianewsservice.com" => "Columbia University",
"www.publichealth.columbia.edu" => "Columbia University",
"dc.alumni.columbia.edu" => "Columbia University",
"knightcolumbia.org" => "Columbia University",
"www.cs.columbia.edu" => "Columbia University",
"cornellfreespeech.com" => "Cornell Free Speech Alliance",
"www.allaboutbirds.org" => "Cornell University",
"www.cornellsun.com" => "Cornell University",
"news.cornell.edu" => "Cornell Unviersity",
"www.law.cornell.edu" => "Cornell Unviersity",
"blog.unicode.org" => "Unicode",
"fossforce.com" => "Unicorn Media",
"blogs.library.duke.edu" => "Duke University",
"library.duke.edu" => "Duke University",
"techpolicy.sanford.duke.edu" => "Duke University",
"sites.duke.edu" => "Duke University",
"sites.law.duke.edu" => "Duke University",
"today.duke.edu" => "Duke University",
"web.law.duke.edu" => "Duke University",
"www.uef.fi" => "uni Eastern Finland",
"pure.tue.nl" => "Eindhoven University of Technology",
"research.tue.nl" => "Eindhoven University of Technology",
"emorywheel.com" => "Emory University",
"www.emorywheel.com" => "Emory University",
"www.fau.edu" => "uni Florida Atlantic University",
"zeus.ugent.be" => "uni Ghent",
"www.harvardpress.com" => "Harvard Press LLC",
"clje.law.harvard.edu" => "Harvard University",
"cyber.harvard.edu" => "Harvard University",
"cscie28.dce.harvard.edu" => "Harvard University",
"lil.law.harvard.edu" => "Harvard University",
"misinforeview.hks.harvard.edu" => "Harvard University",
"hls.harvard.edu" => "Harvard University",
"news.harvard.edu" => "Harvard University",
"niemanreports.org" => "Harvard University",
"clinic.cyber.harvard.edu" => "Harvard University",
"gking.harvard.edu" => "Harvard University",
"hbr.org" => "Harvard University",
"seas.harvard.edu" => "Harvard University",
"www.belfercenter.org" => "Harvard University",
"www.harvard.edu" => "Harvard University",
"www.harvardmagazine.com" => "Harvard University",
"www.hsph.harvard.edu" => "Harvard University",
"www.library.hbs.edu" => "Harvard University",
"www.thecrimson.com" => "Harvard University",
"www.health.harvard.edu" => "Harvard University",
"beatofhawaii.com" => "Hawaii",
"manoa.hawaii.edu" => "University of Hawaii",
"scholarspace.manoa.hawaii.edu" => "University of Hawaii",
"www.hawaii.edu" => "University of Hawaii",
"carey.jhu.edu" => "John Hopkins University",
"hub.jhu.edu" => "John Hopkins University",
"publichealth.jhu.edu" => "John Hopkins University",
"www.cs.jhu.edu" => "John Hopkins University",
"www.jhuapl.edu" => "John Hopkins University",
"lkml.iu.edu" => "uni Indiana",
"kb.iu.edu" => "uni Indiana",
"ebeowulf.uky.edu" => "University of Kentucky",
"www.kcl.ac.uk" => "uni King's College London",
"www.unileverusa.com" => "unilever",
"www.leeds.ac.uk" => "The University of Leeds",
"www.nsc.liu.se" => "uni Linköping",
"www.staff.lu.se" => "Lund University",
"www.lunduniversity.lu.se" => "Lund University",
"umbc.edu" => "University of Maryland Baltimore County",
"blogs.umass.edu" => "The University of Massachusetts",
"openpublishing.library.umass.edu" => "The University of Massachusetts",
"peri.umass.edu" => "The University of Massachusetts",
"www.umass.edu" => "The University of Massachusetts",
"repository.law.miami.edu" => "University of Miami",
"quadrangle.michigan.law.umich.edu" => "University of Michigan",
"press.umich.edu" => "University of Michigan",
"www.citi.umich.edu" => "University of Michigan",
"umdearborn.edu" => "University of Michigan",
"heritage.umich.edu" => "University of Michigan",
"impact.govrel.umich.edu" => "University of Michigan",
"it.umich.edu" => "University of Michigan",
"lib.umich.edu" => "University of Michigan",
"michigan.it.umich.edu" => "University of Michigan",
"quod.lib.umich.edu" => "University of Michigan",
"www.lib.umich.edu" => "University of Michigan",
"news.engin.umich.edu" => "University of Michigan",
"web.eecs.umich.edu" => "University of Michigan",
"news.umich.edu" => "University of Michigan",
"president.umich.edu" => "University of Michigan",
"record.umich.edu" => "University of Michigan",
"repository.law.umich.edu" => "University of Michigan",
"publicaffairs.vpcomm.umich.edu" => "University of Michigan",
"www.michigandaily.com" => "University of Michigan",
"wallacehouse.umich.edu" => "University of Michigan",
"www.cidrap.umn.edu" => "University of Minnesota",
"news.mit.edu" => "uni MIT",
"thereader.mitpress.mit.edu" => "uni MIT",
"onlinedegrees.unr.edu" => "uni Nevada",
"carsey.unh.edu" => "University of New Hampshire",
"www.cs.unm.edu" => "uni New Mexico",
"news.unm.edu" => "uni New Mexico",
"blog.jipel.law.nyu.edu" => "uni New York",
"wagner.nyu.edu" => "uni New York",
"citap.unc.edu" => "uni North Carolina",
"newspaperownership.com" => "uni North Carolina",
"www.cs.unc.edu" => "uni North Carolina",
"scholarship.law.unc.edu" => "uni North Carolina",
"huntnewsnu.com" => "uni Northeastern",
"agcrops.osu.edu" => "Ohio State University",
"library.osu.edu" => "Ohio State University",
"news.osu.edu" => "Ohio State University",
"www.ucanews.com" => "Union Of Catholic Asian News",
"www.otago.ac.nz" => "University of Otago",
"www.cs.otago.ac.nz" => "University of Otago",
"www.critic.co.nz" => "University of Otago",
"www.oulu.fi" => "University of Oulu",
"reutersinstitute.politics.ox.ac.uk" => "uni Oxford",
"people.maths.ox.ac.uk" => "uni Oxford",
"www.blopig.com" => "uni Oxford",
"ento.psu.edu" => "uni Pennsylvania State",
"www.thetimes-tribune.com" => "The Times-Tribue, Scranton, PA",
"events.seas.upenn.edu" => "University of Pennsylvania",
"knowledge.wharton.upenn.edu" => "University of Pennsylvania",
"mackinstitute.wharton.upenn.edu" => "University of Pennsylvania",
"pitt.libguides.com" => "University of Pittsburgh",
"www.cs.princeton.edu" => "Prineceton University",
"fossilfueldissociation.princeton.edu" => "Prineceton University",
"tv-watches-you.princeton.edu" => "Prineceton University",
"you.have.fail" => "UniQMG",
"homepage.cs.uri.edu" => "uni Rhode Island",
"kjzz.org" => "uni Rio Salado College",
"www.uni-rostock.de" => "uni Rostock",
"rutgershonorsblog.wordpress.com" => "uni Rutgers",
"www.rutgers.edu" => "uni Rutgers",
"www.stmarytx.edu" => "uni Saint Mary",
"www.sheffield.ac.uk" => "uni Sheffield",
"the-peak.ca" => "uni Simon Frase",
"people.math.sc.edu" => "uni South Carolina",
"www.ijpr.org" => "uni Southern Oregon",
"betterbench.stanford.edu" => "Stanford University",
"cs.stanford.edu" => "Stanford University",
"hai.stanford.edu" => "Stanford University",
"law.stanford.edu" => "Stanford University",
"www-cs-faculty.stanford.edu" => "Stanford University",
"www-formal.stanford.edu" => "Stanford University",
"crfm.stanford.edu" => "Stanford University",
"cyber.fsi.stanford.edu" => "Stanford University",
"news.stanford.edu" => "Stanford University",
"pacscenter.stanford.edu" => "Stanford University",
"seclab.stanford.edu" => "Stanford University",
"stacks.stanford.edu" => "Stanford University",
"stanforddaily.com" => "Stanford University",
"cyberlaw.stanford.edu" => "Stanford University",
"mahb.stanford.edu" => "Stanford University",
"web.stanford.edu" => "Stanford University",
"pcl.stanford.edu" => "Stanford University",
"www.americanyawp.com" => "Stanford University",
"www.stanforddaily.com" => "Stanford University",
"www.scs.stanford.edu" => "Stanford University",
"bitsavers.informatik.uni-stuttgart.de" => "uni Stuttgart",
"www.sydney.edu.au" => "uni Sydney",
"news.syr.edu" => "uni Syracuse",
"thecollege.syr.edu" => "uni Syracuse",
"www.unitedforpeace.org" => "United For Peace",
"trepo.tuni.fi" => "uni Tampere",
"ache.one" => "Ache",
"www.zeileis.org" => "Achim Zeileis",
"osg.tuhh.de" => "Technische Universität Hamburg",
"www.tum.de" => "Technische Universität München",
"read.thecoder.cafe" => "Teiva Harsanyi",
"www.thecoder.cafe" => "Teiva Harsanyi",
"www.tn.gov" => "Tennessee",
"tennesseelookout.com" => "Tennessee Lookout",
"www.mtsu.edu" => "Middle Tennessee State University",
"news.utk.edu" => "University of Tennessee",
"web.eecs.utk.edu" => "University of Tennessee",
"www.cs.utexas.edu" => "University of Texas",
"www.jsg.utexas.edu" => "University of Texas",
"radionavlab.ae.utexas.edu" => "University of Texas",
"www.universityworldnews.com" => "University World News",
"utcc.utoronto.ca" => "University of Toronto",
"www.scss.tcd.ie" => "uni Trinity College Dublin",
"www.utu.fi" => "uni Turku",
"www.universetoday.com" => "Universe Today",
"www.dre.vanderbilt.edu" => "uni Vanderbilt",
"dspace.library.uvic.ca" => "University of Victoria",
"engineering.virginia.edu" => "University of Virginia",
"www.cs.virginia.edu" => "University of Virginia",
"vtx.vt.edu" => "uni Virginia Polytechnic Institute and State",
"blog.communitydata.science" => "uni Washington",
"com.uw.edu" => "uni Washington",
"www.whitman.edu" => "uni Whitman",
"whitmanwire.com" => "uni Whitman",
"www.unixmen.com" => "Unix Men",
"unixsheikh.com" => "Unix Sheikh",
"www.unixsheikh.com" => "Unix Sheikh",
"unixwinbsd.site" => "UnixBSDSHell",
"news.wisc.edu" => "The University of Wisconsin",
"wiscprivacy.com" => "The University of Wisconsin",
"newsletter.danielmiessler.com" => "Unsupervised Learning",
"yaak.app" => "Yaak",
"blog.yaakov.online" => "Yaakov",
"avalon.law.yale.edu" => "Yale University",
"e360.yale.edu" => "Yale University",
"law.yale.edu" => "Yale University",
"yaleclimateconnections.org" => "Yale University",
"yashgarg.dev" => "Yash Garg",
"blog.yaymukund.com" => "Yaymukund",
"www.yardbarker.com" => "YB Media LLC",
"investors.unity.com" => "Unity Technologies",
"www.univision.com" => "Univision Communications Inc",
"unnamed.website" => "Unnamed Website",
"www.upguard.com" => "UpGuard",
"www.upi.com" => "UPI",
"www.upworthy.com" => "Upworthy",
"blog.urara.pl" => "Urara",
"popovicu.com" => "Uros Popovic",
"www.ursulakleguin.com" => "Ursula K Le Guin",
"www.bls.gov" => "US Bureau of Labor Statistics",
"www.dni.gov" => "US Director of National Intelligence",
"www.whitehouse.gov" => "USA",
"public-inspection.federalregister.gov" => "USA",
"www.amc.af.mil" => "USAF",
"www.usagm.gov" => "USAGM",
"aspr.hhs.gov" => "US Administration for Strategic Preparedness and Response",
"www.mcs.anl.gov" => "US Argonne National Laboratory",
"www.army.mil" => "USARMY",
"www.atf.gov" => "USATF",
"files.gao.gov" => "USGAO",
"www.gao.gov" => "USGAO",
"www.usbr.gov" => "USBR",
"us-cert.cisa.gov" => "USCERT",
"www.us-cert.gov" => "USCERT",
"www.uscirf.gov" => "USCIRF",
"crsreports.congress.gov" => "US Congress",
"www.congress.gov" => "US Congress",
"www.cbp.gov" => "USCBP",
"www.solarium.gov" => "USCSC",
"www.aphis.usda.gov" => "USDA",
"www.fas.usda.gov" => "USDA",
"www.state.gov" => "US Dept Of State",
"www.transportation.gov" => "US Dept Of State",
"www.hhs.gov" => "US Dept Of Health and Human Services",
"www.dvidshub.net" => "US DOD",
"dodcio.defense.gov" => "US DOD",
"media.defense.gov" => "US DOD",
"www.defense.gov" => "US DOD",
"www.doi.gov" => "USDOI",
"www.justice.gov" => "USDOJ",
"www.eia.gov" => "US EIA",
"docs.fcc.gov" => "US FCC",
"www.fcc.gov" => "US FCC",
"www.fda.gov" => "US FDA",
"www.federalreservehistory.org" => "US Federal Reserve",
"www.usgs.gov" => "US Geological Survey",
"home.treasury.gov" => "US Treasury",
"www.tigta.gov" => "US Treasury Inspector General",
"www.armyupress.army.mil" => "US Army",
"www.marines.mil" => "USMC",
"www.marinecorpstimes.com" => "USMC",
"www.marcorsyscom.marines.mil" => "USMC",
"useplaintext.email" => "Use plaintext email",
"groups.google.com" => "Usenet Archive at Google",
"www.usenix.org" => "USENIX",
"user2025.r-project.org" => "userR! 2025",
"www.federalregister.gov" => "US Federal Register",
"www.fincen.gov" => "US Financial Crimes Enforcement Network",
"blakemoore.house.gov" => "US House Of Representatives",
"docs.house.gov" => "US House Of Representatives",
"energycommerce.house.gov" => "US House Of Representatives",
"gottheimer.house.gov" => "US House Of Representatives",
"judiciary.house.gov" => "US House Of Representatives",
"lofgren.house.gov" => "US House Of Representatives",
"mcgovern.house.gov" => "US House Of Representatives",
"morelle.house.gov" => "US House Of Representatives",
"oversight.house.gov" => "US House Of Representatives",
"oversightdemocrats.house.gov" => "US House Of Representatives",
"schiff.house.gov" => "US House Of Representatives",
"www.weather.gov" => "US National Weather Service",
"www.navytimes.com" => "US Navy Times",
"creditcards.usnews.com" => "US News",
"money.usnews.com" => "US News And World Report",
"www.usnews.com" => "US News And World Report",
"www.history.navy.mil" => "US Navy",
"www.navair.navy.mil" => "US Navy",
"news.usni.org" => "USNI",
"www.nps.gov" => "USNPS",
"www.stateoig.gov" => "USOIG",
"sd11.senate.ca.gov" => "US Senate",
"www.banking.senate.gov" => "US Senate",
"www.blackburn.senate.gov" => "US Senate",
"www.budget.senate.gov" => "US Senate",
"www.commerce.senate.gov" => "US Senate",
"www.foreign.senate.gov" => "US Senate",
"www.hawley.senate.gov" => "US Senate",
"www.hsgac.senate.gov" => "US Senate",
"www.judiciary.senate.gov" => "US Senate",
"www.klobuchar.senate.gov" => "US Senate",
"www.markey.senate.gov" => "US Senate",
"www.merkley.senate.gov" => "US Senate",
"www.sanders.senate.gov" => "US Senate",
"www.schmitt.senate.gov" => "US Senate",
"www.warner.senate.gov" => "US Senate",
"www.warren.senate.gov" => "US Senate",
"www.wyden.senate.gov" => "US Senate",
"www.sigar.mil" => "US SIGAR",
"ustr.gov" => "USTR",
"www.uswitch.com" => "USwitch",
"www.userlandia.com" => "Userlandia",
"le.utah.gov" => "Utah",
"www.uen.org" => "Utah Education Network",
"utahnewsdispatch.com" => "Utah News Dispatch",
"www.utilitydive.com" => "Utility Dive",
"utkuufuk.com" => "Utku",
"uusikielemme.fi" => "Uusi kielemme",
"www.ufried.com" => "Uwe Friedrichsen",
"uxdesign.cc" => "UXCollective",
"www.uxtigers.com" => "UX Tigers",
"vmac.ch" => "V Chris",
"vhbelvadi.com" => "V H Belvadi",
"www.v68k.org" => "V68k",
"vadimkravcenko.com" => "Vadim Kravcenko",
"valentin.willscher.de" => "Valentin Willscher",
"www.valerionappi.it" => "Valerio Nappi",
"www.thevalleypost.com" => "Valley Post",
"movieweb.com" => "Valnet",
"valorinternational.globo.com" => "Valor Econômico",
"vkoskiv.com" => "Valtteri Koskivuori",
"shufflingbytes.com" => "Valtteri Lehtinen",
"www.valuewalk.com" => "Value Walk",
"vancouversun.com" => "Vancouver Sun",
"www.vanguardngr.com" => "Vanguard NG",
"www.vanityfair.com" => "Vanity Fair",
"www.v-dem.net" => "Varieties of Democracy",
"variety.com" => "Variety",
"varnish-cache.org" => "Varnish HTTP Cache",
"www.varonis.com" => "Varonis",
"tech.stonecharioteer.com" => "Vinay Keerthi",
"vinyl-cache.org" => "Vinyl HTTP Cache",
"typesanitizer.com" => "Varun Gandhi",
"www.vatican.va" => "The Vatican",
"www.vaticannews.va" => "Vatican News",
"www.vatupdate.com" => "VATupdate",
"blog.vaxry.net" => "Vaxry",
"vegard.blog.engen.priv.no" => "Vegard",
"www.ribbonfarm.com" => "Venkatesh Rao",
"venturebeat.com" => "Venture Beat",
"www.railway-technology.com" => "GlobalData plc",
"www.veracode.com" => "Veracode",
"vereis.com" => "Vereis",
"verfassungsblog.de" => "Verfassungsblog",
"verietyinfo.com" => "Verietyinfo",
"vermaden.wordpress.com" => "Vermaden",
"www.reformer.com" => "Brattleboro Reformer, Vermont",
"vtdigger.org" => "Vermont Journalism Trust Ltd",
"verschwoerhaus.de" => "Verschwörhaus",
"www.vertiv.com" => "Vertiv Group Corporation",
"vesa.org" => "VESA",
"talkingbiznews.com" => "Vested LLC",
"scrollprize.org" => "Vesuvius Challenge",
"news.va.gov" => "US Department of Veterans Affairs",
"vldb.org" => "VLDB Endowment Inc",
"vez.mrsk.me" => "Vez.mrsk.me",
"www.vibilagare.se" => "Vi Bilägare",
"vic.demuzere.be" => "Vic Demuzere",
"www.refinery29.com" => "Vice Media Group",
"www.vice.com" => "Vice Media Group",
"vickiboykis.com" => "Vicki Boykis",
"vicki.substack.com" => "Vicki Boykis",
"vicksburgnews.com" => "Vickburg Daily News",
"victor.kropp.name" => "Victor Kropp",
"zverok.space" => "Victor Shepelev",
"tenthousandmeters.com" => " Victor Skvortsov",
"vitaut.net" => "Victor Zverovich",
"www.vidarholen.net" => "Vidarholen",
"blog.videah.net" => "Videah",
"yewtu.be" => "Video",
"videocardz.com" => "Video Cardz",
"gamehistory.org" => "Video Game History Foundation Inc",
"www.videolan.org" => "VideoLAN",
"www.thevietnamese.org" => "The Vietnamese Magazine",
"blog.viditb.com" => "Vidit Bhargava",
"vijayprema.com" => "Vijay Prema",
"www.vikash.nl" => "Vikash",
"lorbic.com" => "Vikash Patel",
"productmint.com" => "Viktor",
"www.marginalia.nu" => "Viktor Löfgren",
"vimtricks.com" => "Vim Newsletter",
"vincent.bernat.ch" => "Vincent Bernat",
"vincentdelft.be" => "Vincent Delft",
"www.vincentlammens.be" => "Vincent Lammens",
"nvie.com" => "Vincent Driessen",
"vincents.dev" => "Vincent Sgherzi",
"www.vinchin.com" => "Vinchin.com",
"www.vincentdelft.be" => "Vincent Delft",
"latex.now.sh" => "Vincent Dörig",
"vintageapple.org" => "Vintage Apple",
"vcfmw.org" => "Vintage Computer Festival Midwest",
"www.vintagecomputing.com" => "Vintage Computing And Gaming",
"www.vintag.es" => "Vintage Everyday",
"www.vintageisthenewold.com" => "Vintage Is The New Old",
"blog.viraptor.info" => "Viraptor",
"www.virginiamercury.com" => "Virginia Mercury",
"www.virginiaroberts.com" => "Virginia Roberts",
"news.vt.edu" => "Virginia Tech",
"lis.virginia.gov" => "Virginia USA",
"www.governor.virginia.gov" => "Virginia USA",
"virtualizationreview.com" => "Virtualization",
"virtuallyfun.com" => "Virtualization",
"www.virusbulletin.com" => "Virus Bulletin",
"iamvishnu.com" => "Vishnu Haridas",
"www.tpgi.com" => "Vispero",
"www.hardhats.org" => "VistA",
"www.visualcapitalist.com" => "Visual Capitalist",
"www.visualmode.dev" => "VisualMode LLC",
"vitonsky.net" => "Robert Vitonsky",
"vittorioromeo.com" => "Vittorio Romeo",
"vitux.com" => "Vitux",
"vivaldi.com" => "Vivaldi",
"www.vifindia.org" => "Vivekananda International Foundation",
"vmssoftware.com" => "VMS Software",
"vlad.website" => "Vlad-Stefan Harbuz",
"blog.vladzahorodnii.com" => "Vlad Zahorodnii",
"www.polygraph.info" => "VOA News",
"projects.voanews.com" => "VOA News",
"www.voanews.com" => "VOA News",
"www.insidevoa.com" => "VOA News",
"www.voicendata.com" => "Voice And Data",
"voicebot.ai" => "Voicebot AI",
"www.voiceofsandiego.org" => "Voice Of San Diego",
"voidlinux.org" => "Void Linux",
"vole.wtf" => "VOLE.wtf",
"www.votebeat.org" => "Votebeat",
"www.vox.com" => "Vox",
"www.mmafighting.com" => "Vox Media LLC",
"www.thecut.com" => "Vox Media Network",
"www.polygon.com" => "Vox Media",
"vpnpro.com" => "VPN Pro",
"blog.vpntracker.com" => "VPN Tracker",
"www.cs.vu.nl" => "Vrije Universiteit",
"vu.nl" => "Vrije Universiteit",
"www.vusec.net" => "Vrije Universiteit",
"vulpinecitrus.info" => "VulpineCitrus",
"docs.vultr.com" => "Vultr",
"www.vulture.com" => "Vulture",
"w3techs.com" => "W3 Techs",
"wacotrib.com" => "Waco Tribune-Herald",
"www.iwader.co.uk" => "Wade Urry",
"wagtail.org" => "Wagtail",
"sigwait.org" => "Wait for a Signal",
"blog.waleedkhan.name" => "Waleed Khan",
"www.walesonline.co.uk" => "Wales UK",
"www.wall.org" => "The Wall Family",
"wallabag.nixnet.services" => "Wallanag",
"walledculture.org" => "Walled Culture",
"thewalrus.ca" => "The Walrus",
"thewaroncars.org" => "The War on Cars",
"www.warhistoryonline.com" => "War History Online",
"www.warhammer-community.com" => "Warhammer",
"bsdimp.blogspot.com" => "Warner Losh",
"www.warp.dev" => "Warp",
"www.warwickshire.gov.uk" => "Warwickshie County Council, UK",
"www.wasaline.com" => "Wasaline",
"washbear.neocities.org" => "Washbear",
"wbng.org" => "Washingon-Baltimore News Guild",
"www.washingtonexaminer.com" => "Washington Examiner",
"washingtonspectator.org" => "The Washington Spectator",
"stateofsalmon.wa.gov" => "Washington State",
"www.psp.wa.gov" => "Washington State",
"app.leg.wa.gov" => "The Washington State Legislature",
"washingtontimes.com" => "Washingon Times",
"www.washingtonian.com" => "Washingtonian",
"washingtonmonthly.com" => "Washington Monthly",
"washingtonpress.com" => "Washington Press",
"uwaterloo.ca" => "University of Waterloo",
"www.watereducation.org" => "Water Education Foundation",
"www.waterfox.com" => "Waterfox",
"waterkeeper.org" => "Waterkeeper Alliance",
"coyotetracks.org" => "Watts Martin",
"www.watoday.com.au" => "WA Today",
"www.wabe.org" => "WABE Radio",
"www.wbaltv.com" => "WBAL TV",
"www.wbez.org" => "WBEZ Radio",
"www.wbur.org" => "WBUR Radio",
"www.wgacontract2023.org" => "WGA Contract 2023",
"www.wcax.com" => "WCAX TV",
"wccftech.com" => "WCCF Tech",
"wccoradio.radio.com" => "WCCO Radio",
"equitablegrowth.org" => "WCEG",
"www.wcvb.com" => "WCVB",
"news.wgcu.org" => "WGCU",
"www.wglt.org" => "WGLT Radio",
"www.wlrn.org" => "WLRN Radio",
"www.wmuk.org" => "WMUK Radio",
"weaintbuyingit.com" => "We Ain’t Buying It",
"wedistribute.org" => "We Distribute",
"www.weareteachers.com" => "WeAreTeachers",
"webdevelopmenthistory.com" => "Web Development History",
"calendar.perfplanet.com" => "Web Performance Calendar",
"www.vpnmentor.com" => "Webselenese Ltd",
"websockets.readthedocs.io" => "Websockets",
"www.websitecarbon.com" => "Website Carbon Calculator",
"theweeklychallenge.org" => "The Weekly Challenge",
"www.wemu.org" => "WEMU FM",
"build.typogram.co" => "Wentin",
"www.weny.com" => "WENY",
"www.wevolver.com" => "Wevolver",
"www.wunc.org" => "WUNC North Carolina Public Radio",
"webkit.org" => "WebKit",
"www.webmd.com" => "WebMD",
"www.webpronews.com" => "Web Pro News",
"www.websiteoptimization.com" => "Web Site Optimization",
"downloads.webis.de" => "Webis Group",
"weis2021.econinfosec.org" => "WEIS 2021",
"www.well-typed.com" => "Well-Typed LLP",
"wellcome.ac.uk" => "Wellcome",
"wellcome.org" => "Wellcome",
"wernerantweiler.ca" => "Prof. Werner Antweiler",
"warnercrocker.com" => "Werner Crocker",
"www.allthingsdistributed.com" => "Dr Werner Vogels",
"werwolv.net" => "WerWolv",
"blog.wesleyac.com" => "Wesley Aptekar Cassels",
"notebook.wesleyac.com" => "Wesley Aptekar Cassels",
"www.wezm.net" => "Wesley Moore",
"www.wctrib.com" => "West Central Tribune",
"ctc.westpoint.edu" => "West Point",
"www.joanwestenberg.com" => "Westenberg",
"westernresourceadvocates.org" => "Western Resource Advocates",
"www.western-water.com" => "Western Water",
"wfin.com" => "WFIN Radio",
"www.wfmz.com" => "WFMZ TV",
"www.wftv.com" => "WFTV TV",
"www.wfyi.org" => "WFYI Radio",
"whbl.com" => "WHBL Radio",
"whdh.com" => "WHDH TV",
"www.wheelchairdriver.com" => "Wheel Chair Driver",
"blog.whenhen.com" => "Whenhen",
"www.which.co.uk" => "WhichUK",
"www.wietzebeukema.nl" => "Wietze Beukema",
"qogrisys.medium.com" => "WIFI 7 Module manufacturer",
"www.foodtimes.eu" => "WIISE srl benefit company",
"en.wikibooks.org" => "WikiBooks",
"www.wikihow.com" => "WikiHow",
"diff.wikimedia.org" => "Wikimedia",
"meta.wikimedia.org" => "Wikimedia",
"techblog.wikimedia.org" => "Wikimedia",
"wikimediafoundation.org" => "Wikimedia Foundation",
"en.wikipedia.org" => "Wikipedia",
"onlinelibrary.wiley.com" => "Wiley",
"www.whizzy.org" => "Will Cooke",
"www.highonscience.com" => "Will High",
"will-keleher.com" => "Will Keleher",
"lethain.com" => "Will Larson",
"willmorrison.net" => "Will Morrison",
"fy.blackhats.net.au" => "William",
"retrohacker.substack.com" => "William Blankenship",
"www.willsroot.io" => "William Liu",
"yossarian.net" => "William Woodruff",
"www.wweek.com" => "Williamette Week",
"www.conveniencestore.co.uk" => "William Reed Business Media",
"www.wilsoncenter.org" => "The Wilson Center",
"blog.wilsonl.in" => "Wilson Lin",
"www.wiltshiremuseum.org.uk" => "Wiltshire Archaeological and Natural History Society",
"limited.systems" => "Wim Vanderbauwhede",
"wimvanderbauwhede.codeberg.page" => "Wim Vanderbauwhede",
"www.windriver.com" => "Wind River Systems Inc",
"www.windowscentral.com" => "Windows Central",
"www.windowscentral.com" => "Windows Central",
"community.windy.com" => "Windy Community",
"www.winespectator.com" => "Wine Spectator",
"winther.sysctl.dk" => "Winther Blog",
"winnielim.org" => "Winnie Lim",
"wired.me" => "Wired",
"www.wired.com" => "Wired",
"www.wired.co.uk" => "Wired",
"blog.wireshark.org" => "Wireshark",
"www.wireshark.org" => "Wireshark",
"thecountyline.net" => "Wisconsin",
"www.wpr.org" => "Wisconsin Public Radio",
"www.wise-geek.com" => "WiseGEEK",
"www.whiskeytangohotel.com" => "WhiskeyTangoHotel",
"www.withguitars.com" => "WithGuitars",
"without-systemd.org" => "Without Systemd",
"zuckgotmefor.wixsite.com" => "Wix",
"www.wiz.io" => "Wiz Inc",
"maker.wiznet.io" => "WIZNet",
"www.wksu.org" => "WKSU Radio",
"palant.info" => "Wladimir Palant",
"blog.frost.kiwi" => "Wladislav Artsimovich",
"darthmall.net" => "W Evan Sheehan",
"wleusch.wordpress.com" => "W Leusch",
"public.wmo.int" => "WMO",
"www.wnd.com" => "WND",
"wng.org" => "WNG",
"www.world-nuclear-news.org" => "WNN",
"www.sigwinch.xyz" => "Wolfgang",
"www.wolfssl.com" => "WolfSSL",
"wolfstreet.com" => "Wolfstreet",
"www.womenarehuman.com" => "Women Are Human",
"www.militarypoisons.org" => "Women’s International League for Peace and Freedom",
"www.wonkette.com" => "Wonkette",
"mywiki.wooledge.org" => "Greg Wooledge",
"wbk.one" => "Woongbin Kang",
"wordfinderx.com" => "WordFinderX",
"xwp8users.com" => "WordPerfect on Linux",
"automattic.com" => "WordPress",
"wordpress.org" => "WordPress",
"wpbuilderhelper.com" => "WordPress",
"wptavern.com" => "WordPress",
"wordsandbuttons.online" => "Words and Buttons Online",
"www.workers.org" => "Workers World",
"worksinprogress.co" => "Works in Progress Magazine",
"blogs.worldbank.org" => "World Bank",
"data.worldbank.org" => "World Bank",
"www.worldbank.org" => "World Bank",
"www.weforum.org" => "World Economic Forum",
"www.worldfinance.com" => "World Finance",
"whn.global" => "World Health Network",
"www.who.int" => "World Health Organization",
"webfoundation.org" => "World Wide Web Foundation",
"wmo.int" => "World Meteorological Organization",
"www.w3.org" => "World Wide Web Consortium",
"worldcrunch.com" => "Worldcrunch",
"rpms.worldvista.org" => "WorldVistA",
"worstofbreed.net" => "Worst of Breed",
"brainbaking.com" => "Wouter Groeneveld",
"grep.be" => "Wouter Verhelst",
"www.advancedcustomfields.com" => "WPEngine Inc",
"wppool.dev" => "WPPool",
"wraltechwire.com" => "WRAL Techwire",
"www.wraltechwire.com" => "WRAL Techwire",
"www.wral.com" => "Capitol Broadcasting Company Inc",
"write.as" => "Write.as",
"wrla.ch" => "Wrlach",
"wryl.tech" => "Wyrl",
"worldrepublicnews.com" => "WRN",
"wrongthink.link" => "Wrongthink",
"wsau.com" => "WSAU Radio",
"www.wsls.com" => "WSLS TV",
"www.wsws.org" => "WSWS",
"wtop.com" => "WTOP Radio",
"news.wttw.com" => "WTTW TV",
"wwfint.awsassets.panda.org" => "WWF",
"www.worldwildlife.org" => "WWF",
"www.wwf.org.uk" => "WWF",
"wwf.fi" => "WWF",
"x25519.ulfheim.net" => "X25519 Key Exchange",
"x41-dsec.de" => "X41 D-Sec GmbH",
"x61.ar" => "X61",
"satyrs.eu" => "Xanthe",
"xavi.privatedns.org" => "Xavi92",
"xavierleroy.org" => "Xavier Leroy",
"www.xbill.org" => "XBill",
"www.xbiz.com" => "XBiz",
"www.xda-developers.com" => "XDA",
"xeiaso.net" => "Xe's Blog",
"christine.website" => "Xe",
"xuanwo.io" => "Xuanwo",
"www.fuzzygrim.com" => "Xila",
"www.xinhuanet.com" => "Xinhua",
"xiph.org" => "The Xiph.org Foundation",
"www.explainxkcd.com" => "XKCD",
"xoxofest.com" => "XOXO",
"healthitsecurity.com" => "Xtelligent Healthcare Media",
"www.xyte.ch" => "XueYao",
"xayax.net" => "XAYAX",
"finance.yahoo.com" => "Yahoo News",
"in.news.yahoo.com" => "Yahoo News",
"news.yahoo.com" => "Yahoo News",
"sg.news.yahoo.com" => "Yahoo News",
"www.yahoo.com" => "Yahoo News",
"www.yakimaherald.com" => "Yakima Herald",
"www.ystrickler.com" => "Yancey Strickler",
"reyammer.io" => "Yanick Fratantonio",
"www.yanisvaroufakis.eu" => "Yanis Varoufakis",
"her.esy.fun" => "Yann Esposito",
"yarmo.eu" => "Yarmo Machenbach",
"yarnspinner.dev" => "Yarn Spinner Pty Ltd",
"ykarroum.com" => "Yassir Karroum",
"mangoumbrella.com" => "Yilei Yang",
"yinan.me" => "Yinan",
"bytes.yingw787.com" => "Ying787",
"arenan.yle.fi" => "Yle",
"yle.fi" => "Yle",
"tinyhack.com" => "Yohanes Nugroho",
"ygashu.dev" => "Yonathan Gashu",
"yonkerstimes.com" => "Yonkers Times",
"yordi.me" => "Yordi Verkroost",
"yorickpeterse.com" => "Yorick Peterse",
"yorkshirebylines.co.uk" => "Yorkshire Bylines",
"www.yorkshireeveningpost.co.uk" => "Yorkshire Evening Post",
"www.examinerlive.co.uk" => "Yorkshire Live",
"yosefk.com" => "Yossi Kreinin",
"docs.yottadb.com" => "YottaDB",
"docs.yottadb.net" => "YottaDB",
"yottadb.com" => "YottaDB",
"yourstory.com" => "Your Story",
"youtu.be" => "Youtube",
"blog.yoshuawuyts.com" => "Yoshua Wuyts",
"ypte.org.uk" => "YPTE",
"yuanchuan.dev" => "Yuan Chuan",
"www.yubico.com" => "Yubico AB",
"yuexun.me" => "Yuexun",
"yukinu.com" => "Yukinu",
"norikitech.com" => "Yuri Karabatov",
"molodtsov.me" => "Yury Molodtsov",
"yusuf.fyi" => "Yusuf Bouzekri",
"omaera.org" => "Z411",
"zach.bloomqu.ist" => "Zach Bloomquist",
"www.zachdaniel.dev" => "Zach Daniel",
"zach.se" => "Zach Denton",
"flower.codes" => "Zach Flower",
"notes.zachmanson.com" => "Zach Manson",
"tinkering.xyz" => "Zach Mitchell",
"www.dolthub.com" => "Zach Musgrave",
"zackproser.com" => "Zach Proser",
"ideolalia.com" => "Zach Tellman",
"www.zachseward.com" => "Zach Seward",
"explaining.software" => "Zach Tellman",
"vatthikorn.com" => "Zack Apiratitham",
"zackoverflow.dev" => "Zack Radisic",
"blog.zakkemble.net" => "Zak Kemble",
"zakaria.org" => "Zakaria",
"zambianobserver.com" => "The Zambian Observer",
"zed.dev" => "Zed",
"zedshaw.com" => "Zed A Shaw",
"www.zeit.de" => "Zeit Online GmbH",
"zellyn.com" => "Zellyn Hunter",
"repo.zenk-security.com" => "Zenk-Security",
"zenodo.org" => "Zenodo",
"zerforschung.org" => "Zerforschung",
"www.zetter-zeroday.com" => "Zero Day",
"zerodayengineering.com" => "Zero Day Engineering",
"floss.fund" => "Zerodha Broking Ltd",
"zerodha.tech" => "Zerodha Broking Ltd",
"www.zerohedge.com" => "ZeroHedge",
"zettelkasten.de" => "Zettlekasten",
"ziglang.org" => "Zig",
"zigtools.org" => "Zigtools",
"hararelive.com" => "Zimbabwe",
"www.techzim.co.zw" => "Zimbabwe",
"zimzi.substack.com" => "Zimzi",
"zitseng.com" => "Zit Seng",
"kron.fi" => "Zoë Finja Emilia Kron",
"www.zombiezen.com" => "Zombie Zen",
"www.architectmagazine.com" => "Zonda Media",
"www.builderonline.com" => "Zonda Media",
"www.zsl.org" => "The Zoological Society of London",
"blog.zoom.us" => "Zoom",
"www.blogto.com" => "ZoomerMedia Limited",
"www.zoommeetingsclassaction.com" => "Zoom",
"www.getzola.org" => "Zola",
"blog.zorin.com" => "Zorin Group",
"blog.hyperknot.com" => "Zsolt Ero",
"serversfor.dev" => "Zsolt Kacsandi",
"blog.zulip.com" => "Zulip",
"ztoz.blog" => "Z to Z",
"blog.zdsmith.com" => "Z D Smith",
"lists.zx2c4.com" => "Zx2c4",
);
state %queryLookup = (
"www.csmonitor.com" => '\?icid=rss$',
"www.dw.com" => '\?maca=.*$',
"www.h2-view.com" => '\?utm.*$',
"www.truthdig.com" => '\?utm.*$',
);
sub camelCase {
my ($site) = (@_);
# CamelCase makes "tags" easier for screen readers
return(exists($siteLookup{$site}) ? $siteLookup{$site} : 0);
}
sub cleanQuery {
my ($site, $url) = (@_);
if (exists($queryLookup{$site})) {
$url =~ s/$queryLookup{$site}//;
}
return($url);
}
Links/lib/Links/SpamSites.pm
package Links::SpamSites 0.04;
use strict;
use warnings;
use feature qw(state);
our $VERSION = '0.4';
our @ISA = qw(Exporter); # inherit all of Exporter's methods
our @EXPORT_OK = qw(KnownSpamSite);
# see Git regarding update history
sub KnownSpamSite {
my ($site) = (@_);
# define the hash just once and thereafter just reuse it
state %junksite = (
"androidgram.com" => 1,
"annarbortimes.com" => 1,
"blogdot.tv" => 1,
"bollyinside.com" => 1,
"bullenweg.com" => 1,
"cybersecuritynews.com" => 1,
"d1softballnews.com" => 1,
"dealmakerz.co.uk" => 1,
"foxinterviewer.com" => 1,
"freenetafrica.com" => 'slop',
"hspiratepress.org" => 1,
"it-online.co.za" => 1,
"itsubuntu.com" => 1,
"liverpoolstudentmedia.com" => 1,
"lvhspiratepress.org" => 1,
"nation.lk" => 1,
"nerds.xyz" => 1,
"newsazi.com" => 1,
"newsconcerns.com" => 1,
"newsnationusa.com" => 1,
"persiadigest.com" => 1,
"pro.europeana.eu" => 1,
"securityboulevard.com" => 1,
"swiftheadline.com" => 1,
"thegoaspotlight.com" => 1,
"then24.com" => 1,
"thenationroar.com" => 1,
"thenewstrace.com" => 1,
"todayuknews.com" => 1,
"venturebeat.com" => 1,
"vervetimes.com" => 1,
"voonze.com" => 1,
"worldtrademarkreview.com" => 1,
"www.aviationanalysis.net" => 1,
"www.bollyinside.com" => 1,
"www.cengnews.com" => 1,
"www.cvbj.biz" => 1,
"www.dailyfinland.fi" => 1,
"www.gearrice.com" => 1,
"www.jalopnik.com" => 'slop',
"www.juve-patent.com" => 1,
"www.marketscreener.com" => 1,
"www.marktechpost.com" => 1,
"www.miragenews.com" => 1,
"www.newspatrolling.com" => 1,
"www.perild.com" => 1,
"www.servethehome.com" => 1,
"www.socialpost.news" => 1,
"www.sporttechie.com" => 1,
"www.techgamingreport.com" => 1,
"www.thebharatexpressnews.com" => 1,
"www.thetoughtackle.com" => 1,
"www.uktech.news" => 1,
"www.webpronews.com" => 'slop', # AI slop
"www.which.co.uk" => 1,
"www.worldtrademarkreview.com" => 1,
"www.zdnet.com" => 1,
"zdnet.com" => 1,
);
return( exists($junksite{$site}) ? $junksite{$site} : 0 );
}
1;
__END__
Links/lib/.directory-listing-ok
Links/dedupe-filtered.sh
./links-multi-file-link-deduplicator.pl --input ~/rss-tools/filtered.html ~/Desktop/Text_Workspace/all-db.txt > ~/rss-tools/filtered-deduped.html
Links/tr-feed-finder.sh
#!/bin/sh
# 2025-01-28 more complicated would need Perl
PATH=/usr/local/bin:/usr/bin:/bin
base=$1 || exit 1
finished () {
feed=$1
echo $feed
exit 0
}
base=$(echo $base | sed -e 's|/$||')
echo "Searching $base"
# paths based on quick survey of main OPML file
for path in /feed/ /feed /feed.xml /rss.xml /index.xml /rss /atom.xml \
/posts/index.xml /feeds/posts/default /blog/index.xml \
/feed.rss /blog/feed /blog/rss.xml /blog/feed.xml \
/feed.atom /posts_feed;
do
url=$base$path
wget -q $url && finished $url
sleep 1
done
echo "Nothing found for $base."
exit 1
Links/finalise-feedlist.sh
#!/bin/sh
#Licence: Public Domain, feel free to share as you see fit
#
#Author: Roy Schestowitz
sort_feedlist() {
SEARHFTERM=$1
echo >> ~/rss-tools/RSS3.html
echo " ====================================== Input string: $1" \
>> ~/rss-tools/RSS3.html
echo " <li><h3>$1</h3><ul>" >> ~/rss-tools/RSS3.html
echo >> ~/rss-tools/RSS3.html
awk 'tolower($0) ~ /'$SEARHFTERM'/' RS= RSS-cut.html \
>> RSS3.html
}
echo '' > RSS3.html # empty the file
for w in 'tiktok' 'bytedance' 'smartphone' 'suicide' \
'corona' 'covid' 'pandemic' 'lockdown' 'booster' \
'fossforce' 'podcast' 'episode' 'mp3' 'soundcloud' 'upiter.zone' \
'putin' 'wagner' 'ukrai' 'russia' 'kyiv' 'crimea' 'kherson' \
'belaru' 'moscow' \
'copyright' 'trademark' 'tradesec' 'Godot' \
'documentfoundation' 'LibreOffice' 'opendocument' 'openoffice' \
'idroot' 'linuxcapa' 'howtofor' 'how-to' 'howto' 'linuxhint' \
'gemini' 'gemtext' 'geminispa' 'openssl' 'libressl' 'torrent' 'eff.org' \
'opensource' 'youtube' 'invidious' \
'linux' 'gnu' 'tecadmin' 'ubuntu' 'canonical' \
'creativecommons' 'openrightsgroup' 'gsoc' 'tedium' \
'baronhk' 'bkhome' 'easyos' 'netflix' 'drm' 'android' \
'spyware' 'apache' 'malware' 'accessnow' 'strike' 'privacy' \
'osmc' 'surveillance' 'IPv4' 'IPv6' 'cloudnativenow' \
'rhel' 'coreos' 'centos' 'fedora' 'redhat' 'apnic' 'tortur' \
'mwl.io' 'ruby' 'laravel' 'golang' 'bailout' 'medevel' \
'bsd' 'scripting' 'programming' 'java' 'debug' 'open-sour' \
'coding' 'emacs' 'compiler' 'rakudoweekly' 'vulkan' 'clang' \
'ultimateedition' 'banking' 'banks' \
'patent' 'epo.org' 'kluwer' 'craigmurray' 'Istio' \
'techrights' 'gnome' 'Gedit' 'noyb' 'libeeboot' 'coreboot' \
'speech' 'censor' 'suse' 'mozil' 'firefox' 'gaming' 'ESP32' \
'steam' 'wordpress.org' 'bash' 'python' 'two-wrong' \
'sans.edu' 'photo' 'revoy' 'commondream' 'kdenlive' \
'schne' 'sches' 'gimp' 'server' 'cnx-software.com' 'GitLab'\
'postgresql' 'apple' 'microsoft' 'google' 'istleblow' \
'wikileaks' 'assange' 'chrom' 'slackwa' 'twitter' \
'facebook' 'debian' 'kde' 'ardui' 'raspb' 'phoronix' \
'publicdomainreview' 'security' 'amd' 'aws' 'intel' \
'internet' 'perl' 'rubene' 'qt.io' 'libel' 'thenewstack' \
'infla' 'hackaday' 'meduza' 'techdi' 'itsfoss' \
'china' 'malays' 'korea' 'health' 'science' \
'sport' 'game' 'climate' 'energy' 'player' 'tennis' \
'athlete' 'score' 'baseball' 'football' 'germa' 'syria' \
'drone' 'saudi' 'mexic' 'turkey' 'canada' 'africa' \
'france' 'ncaa' 'twincities' 'sox' 'cubs' 'yankee' \
'basketball' 'golf' 'singapo' 'japan' \
'iran' 'afghan' 'drought' 'wildfire' 'lgb' 'trump' \
'biden' 'funding' 'cloud' 'finland' 'sweden' 'refug' \
'migra' 'pakist' 'india' 'americ' 'greece' 'itali' \
'italy' 'denmark' 'tibet' 'taiwan' 'nigeria' 'egypt' \
'congo'
do
sort_feedlist ${w}
done
echo ' ====================================== THE REST' >> RSS3.html
cat RSS-cut.html >> RSS3.html
awk '!seen[$0]++ {
sub(/█████ http/, "\n\n\n\n█████ http");
sub(/======================================/,
" \n\n\n\n\n\n\n\n ████████████████ SECTION");
print $0;
} ' RSS3.html \
> RSS-final.html
exit 0
Links/combine-rss-sources.sh
sed -z -e 's/\n <blockquote>\n /<blockquote>/g' \
-e 's/<li>\n <h5><a/<li><h5><a/g' \
-e 's/\n <\/blockquote>\n <\/li>/<\/blockquote><\/li>/g' \
~/Desktop/Text_Workspace/links.html >> ~/rss-tools/RSS-cut.html
cat ~/rss-tools/RSS-final.html >> ~/rss-tools/RSS-cut.html
./finalise-feedlist.sh
Links/.directory-listing-ok
Links/rrrrrr-de-duplicate.pl
#!/usr/bin/perl
# 2023-03-04
# scan files for links, and skip nodes with duplicate links
#
use utf8;
use Getopt::Long;
use File::Glob ':bsd_glob';
use HTML::TreeBuilder::XPath;
use File::Temp qw(tempfile tempdir);
use File::Copy qw(move);
use Cwd qw(abs_path);
use open qw(:std :utf8);
use English;
use warnings;
use strict;
our %opt = (
'h' => 0,
'v' => 0,
'w' => 0,
);
GetOptions ("help|h" => \$opt{'h'},
"write|w" => \$opt{'w'},
"verbose|v" => \$opt{'v'});
&usage if ($opt{'h'});
my @filenames;
while (my $file = shift) {
my @files = bsd_glob($file);
foreach my $f (@files) {
# absolute path needed to identify unique file names later
push(@filenames, abs_path($f));
}
}
&usage if($#filenames < 1);
if ($opt{'v'}) {
print "F = ", join("\n", @filenames),qq(\n);
}
my %oldlinks;
my $newfile = shift(@filenames);
# deduplicate file names
@filenames = grep(!/$newfile$/, @filenames);
while (my $infile = shift(@filenames)) {
next if ($infile eq $newfile);
next if ($infile=~/~$/);
%oldlinks = &oldfiles($infile, %oldlinks);
}
my $result = &readnewfile($newfile, %oldlinks);
# trim probable trackers
# see also http://jkorpela.fi/chars/spaces.html
# $result =~ s/\p{Whitespace}/ /gm; #
# $result =~ s/[\x{00AD}]//gm; #
# $result =~ s/[\x{200B}]//gm; #
# $result =~ s/[\x{2060}]//gm; #
if($opt{'w'}) {
my ($fh, $filename) = tempfile();
print $fh $result;
close($fh);
rename($newfile,"$newfile.old")
or die("$!\n");
move($filename, $newfile)
or die("$!\n");
} else {
print $result;
}
exit(0);
sub usage {
$0 =~ s/^.*\///;
print qq($0: new_file old_file [oldfile...]\n);
print qq(Check links in a file for possible duplicates in other files.\n);
print qq(Send output to stdout by default.\n);
print qq( -v increase debugging verbosity.\n);
print qq( -w overwrite the original first file after comparison.\n);
print qq( -h print this message.\n);
exit(1);
}
sub oldfiles {
my ($file, %newlinks) = ( @_ );
my $xhtml = HTML::TreeBuilder::XPath->new;
$xhtml->implicit_tags(1);
# force input to be read in as UTF-8
my $filehandle;
open ($filehandle, "<", $file)
or die("Could not open file '$file' : error: $!\n");
# parse UTF-8
$xhtml->parse_file($filehandle)
or die("Could not parse file handle for '$file' : $!\n");
for my $link ($xhtml->findnodes('//a')) {
my $href = $link->attr('href');
next unless($href);
next if($href=~/^#/);
$newlinks{$href}++;
}
$xhtml->delete;
return(%newlinks);
}
sub readnewfile {
my ($file, %oldlinks)= (@_);
my $xhtml = HTML::TreeBuilder::XPath->new;
$xhtml->implicit_tags(1);
# force input to be read in as UTF-8
my $filehandle;
open ($filehandle, "<", $file)
or die("Could not open file '$file' : error: $!\n");
# parse UTF-8
$xhtml->parse_file($filehandle)
or die("Could not parse file handle for '$file' : $!\n");
for my $li ($xhtml->findnodes('//li[a[@href]]')) {
for my $anchor ($li->findnodes('./a[@href]')) {
my $href = $anchor->attr('href');
next unless($href);
if ($oldlinks{$href}++) {
$li->delete;
}
}
}
# get rid of repeated <hr /> elements
for my $node ($xhtml->findnodes('//body/hr[preceding-sibling::hr]')) {
# print STDERR "hr removed\n";
$node->delete;
}
my $result = $xhtml->as_XML_indented || 0;
$xhtml->delete;
return ($result);
}
Links/tr-rss-since-scraper.pl
#!/usr/bin/perl -T
# 2021-05-16
# XML RSS and Atom feed web scraper,
# feed it URLs for feeds plus a date-time stamp
# entries will be parsed and can saved in a file
# local times will be converted to UTC
use utf8;
use Getopt::Long;
use Time::ParseDate;
use Time::Piece;
use XML::Feed;
use URI;
use LWP::UserAgent;
use HTTP::Response::Encoding;
use HTML::TreeBuilder::XPath;
use HTML::Entities;
use English;
use strict;
use warnings;
our $VERBOSE = 0;
$OUTPUT_AUTOFLUSH=1;
# work-arounds for 'wide character' error from wrong UTF8
binmode(STDIN, ":encoding(utf8)");
binmode(STDOUT, ":encoding(utf8)");
our %opt = ('a' => 0,
'd' => 0,
'h' => 0,
'o' => 0,
't' => 0,
'u' => 0,
'v' => 0,
'L' => 0, );
GetOptions ("append|a" => \$opt{'a'},
"date|d=s" => \$opt{'d'},
"help" => \$opt{'h'},
"output=s" => \$opt{'o'},
"title" => \$opt{'t'},
"utc" => \$opt{'u'},
"verbose+" => \$opt{'v'},
"list" => \$opt{'L'},
);
my $script = $0;
if ($opt{'h'}) {
&usage($script);
}
if ($opt{'v'}) {
$VERBOSE = $opt{'v'};
}
my ($output);
if ($opt{'o'}) {
# XXX needs proper sanity checking for path and filename at least
$output = $opt{'o'};
$output =~ s/[\0-\x1f]//g;
if ($output =~ /^([-\/\w\.]+)$/) {
$output = $1;
} else {
die("Bad path or file name: '$output'\n");
}
} else {
$output = '/dev/stdout';
}
my $utc = 0; # treat date input as a local time by default
if ($opt{'u'}) {
$utc = 1; # treat date input as UTC without conversion
}
my $sdts;
if ($opt{'d'}) {
$sdts = parsedate($opt{'d'}, GMT=>$utc)
or die("Invalid date\n");
} else {
$sdts = parsedate('yesterday');
}
print STDERR qq(S=$sdts\n) if ($VERBOSE >1);
my $t = Time::Piece->strptime($sdts, '%s');
print STDERR qq(D=),$t->strftime("%a, %d %b %Y %H:%M:%S %Z"),qq(\n)
if ($VERBOSE);
my $count = 0;
my $errors = 0;
while (my $url = shift) {
next if ($url =~ /^\s*#/u); # skip comments
print STDERR qq(\nU=$url\n)
if ($VERBOSE);
my $r = &get_feed($t,$url,$output);
if ($r) {
$count++;
} else {
$errors++;
print STDERR qq(Could not find feed at URL: "$url"\n);
}
}
&usage($script) unless ($count || $errors);
exit(0);
sub usage {
my ($script) = (@_);
$script =~ s/^.*\///;
print <<EOH;
USAGE:
$script [-ahtuvL] [-o file] [-d date/date-time] feed-url [feed-url...]
-a appends the file specified by -o instead of the default of
overwriting it.
-d is the date-time stamp before which feed entries published prior
to that will be ignored. Default is "yesterday" at the
current time. The format is yyyy-mm-dd or yyyy-mm-ddThh:mm
-o points to the file for collecting output, it is stdout by default.
-t print title
-u treats start date as UTC, default is to use the local time zone.
-v show debugging output on stderr.
-L suppress use of <li> elements but leave the others.
-h shows this message.
Multiple feed URLs can be specified.
Queries and fragments are trimmed from the URIs.
Broken or malformed feeds will be skipped completely.
EXAMPLES:
$script -u -d 2019-08-01T00:00 http://example.com/ https://example.org/
$script -o /tmp/foo.html http://example.com/
$script -a -o /tmp/foo.html -d 2019-08-01 https://example.com/
The date for the -d option can be made using command substitution
and the date(1) utility.
$script -d \$(date -d '2 days ago' +'%Y-%m-%d') https://example.com/
KNOWN BUGS:
As a work-around for UTF-8 in Chromium and Firefox, meta elements
declaring UTF-8 explicitly are peppered through the output. The
placement cannot really be helped and the result is not valid XHTML
because these are in the wrong part of the document.
And it goes without saying that scraping sites is very brittle and
can stop working with even minor changes to the page structure.
EOH
exit(0);
}
sub get_feed {
my ($t,$url,$output) = (@_);
my $uri = $url;
my $feed;
eval {
$feed = XML::Feed->parse(URI->new($uri));
};
if ($@) {
print STDERR $@,qq(\n);
print STDERR qq( Failed feed for '$uri'\n);
return(0);
} elsif (! defined($feed)) {
return(0);
}
my $feed_title;
eval {
$feed_title = $feed->title;
};
if ($@) {
print STDERR $@,qq(\n);
print STDERR qq( Failed title for '$uri'\n);
return(0);
}
my $feed_modified = encode_entities($feed->modified); # unsupported
my $feed_format = encode_entities($feed->format);
print STDERR qq(\tT=$feed_title\n)
if ($VERBOSE);
print STDERR qq(\tF=$feed_format\n)
if ($VERBOSE);
my @entries = ();
if ($feed->link =~ m|https?://cybershow.uk|) {
@entries = &read_feed_instead($t,$feed,$output);
} else {
@entries = &read_entries($t,$feed,$output);
}
if(@entries) {
my $mode;
if ($opt{'a'}) {
$mode = '>>';
} else {
$mode = '>';
}
# print STDERR Dumper($feed);
open(my $out, $mode, $output)
or die("Could not open '$output' for appending: $!\n");
# work-around for browser not recognizing UTF-8 automatically
# print $out qq(<meta charset="utf-8" />\n);
binmode($out, ":encoding(utf8)");
if ($opt{'t'}) {
print $out qq(<h3><a href="$url">$feed_title</a></h3>\n);
}
print $out join("", @entries);
close($out);
}
return(1);
}
sub read_entries {
my ($t,$feed,$output) = (@_);
$t = parsedate($t);
my @entries = ();
my $count = 0;
foreach my $entry ($feed->entries) {
# print STDERR Dumper($entry),qq(\n\n)
# if($VERBOSE);
# entry time
my $ft = $entry->{entry}{pubDate}
|| $entry->issued
|| $entry->modified;
# entry time in seconds
my $et = parsedate($ft) || 0;
next unless($et =~ /^\d+$/ && $et >= $t );
# these links are sometimes redirections from proxies
my ($base, $content) = &fetch_page($entry->link)
or die("Missing content from '",$entry->link,"'\n");
next if ($base eq -1 || $content eq -1);
next if ($base =~ /^\d+/ && $base<0);
print STDERR qq(Fetched:),substr($base,0,30),qq(\n)
if ($VERBOSE);
my $uri = URI->new($base)
or die("Bad address, '$base', could not form URI\n");
$uri->query(undef);
$uri->fragment(undef);
my $site = $uri->authority;
# many sites are under feedburner
if ($site eq 'feeds.feedburner.com') {
if ($VERBOSE) {
print STDERR qq(A=Feed Burner\n);
}
if($uri->path =~ /^projectcensored/) {
$site = 'www.projectcensored.org';
} elsif($uri->path =~ /^johnpilger/) {
$site = 'johnpilger.com';
} elsif($uri->path =~ /^cubexyz.blogspot.com/) {
$site = 'cubexyz.blogspot.com';
} elsif($uri->path =~ /^LnuxTech-lb/) {
$site = 'linuxtechlab.com';
} elsif($uri->path =~ /^www.privateinternetaccess.com/) {
$site = 'www.privateinternetaccess.com';
} elsif($uri->path =~ /^original.antiwar.com/) {
$site = 'original.antiwar.com';
} elsif($uri->path =~ /^\~r\/MichaelGeistsBlog/) {
$site = 'www.michaelgeist.ca';
} elsif($uri->path =~ /^EliveLinuxWebsiteUpdates/) {
$site = 'www.elivecd.org';
} elsif($uri->path =~ /^www.tecmint.com/) {
$site = 'www.tecmint.com';
}
}
print STDERR qq(A=$site\n)
if ($VERBOSE);
# remove spammy, paid-for press releases
if ($site eq 'www.commondreams.org') {
# LLL - todo
}
&scan_for_scripts($site, $content);
my $o = &choose_parser($site, $uri->canonical, $content);
if ($o) {
$count++;
push(@entries, $o);
} else {
# identify the feed which had the error
print STDERR qq(\t),$feed->title,qq(\n);
}
print STDERR qq(\t\t),$base,qq(\n)
if ($VERBOSE);
}
if ($count) {
push(@entries, qq(\n<hr />\n\n));
}
return(@entries);
}
sub fetch_page {
my ($uri) = (@_);
my $ua = LWP::UserAgent->new;
$ua->agent("NotRSS0day/0.1");
my $request = HTTP::Request->new(GET => $uri);
my $result = $ua->request($request);
if ($result->is_success) {
return($result->base, $result->decoded_content);
} else {
warn("Could not open '$uri' : ", $result->status_line, "\n");
return(-1,-1);
}
return(0,0);
}
sub scan_for_scripts {
my ($site, $content) = (@_);
my $ent = HTML::TreeBuilder::XPath->new_from_content($content);
for my $t ($ent->findnodes('script')) {
print STDERR qq(script payload found in $site !\n);
exit(2);
}
$ent->delete;
return(1);
}
sub choose_parser {
my ($site, $url, $content) = (@_);
my ($xpath_title, $xpath_description) = (0,0);
my ($title, $description) = (0,0);
print STDERR qq(S=$site\n)
if ($VERBOSE);
my $ent = HTML::TreeBuilder::XPath->new_from_content($content);
if ($site eq '9to5linux.com') {
$xpath_title = '//h1[@class="entry-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="entry-content"]/p[position()<3]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.aclu.org') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div/div[@class="panel-pane pane-aclu-components-description description"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'anniemachon.ch') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="entry-content"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'original.antiwar.com') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$title =~ s/\s+\W\s+Antiwar.com Original//u;
$xpath_description = '//div[@class="entry-content"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'ar.al') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//body/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'archlinux.org') {
$xpath_title = '//h2[@itemprop="headline"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="article-content"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'blog.arduino.cc') {
$xpath_title = '//div[@class="post"]/h3[1]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="entry"]/p[position()<3]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'blog.benjojo.co.uk') {
$xpath_title = '//head/title';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//h1/following-sibling::p[position()<3]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.bunniestudios.com') {
$xpath_title = '//h2[1]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//h2/following-sibling::div[1]/p[position()<3]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'kb.cert.org') {
$xpath_title = '//div/div/div/div[@class="large-12 columns"]/h2';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//head/meta[@name="Description"]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.commondreams.org') {
return(0) if ($url =~/\/newswire\//);
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
# $xpath_description = '//head/meta[@name="description"]';
$xpath_description = '//div[3]/div[@class="body-description"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.counterpunch.org') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$title =~ s/\s+-\s+CounterPunch.org//u;
# $xpath_description = '//div[@class="story-header-area"]/p[1]';
$xpath_description = '//div[@class="story-header-area"]/p[position()<3 and not(contains(text(),"Subscribers content"))]';
$description = parse_description($ent, $xpath_description);
$description = 0 if($description =~ /We don't shake our/);
unless($description) {
$xpath_description = '//div[@class="post_content"]/p[position()<3 and not(contains(text(),"Subscribers content"))]';
$description = parse_description($ent, $xpath_description);
}
} elsif ($site eq 'couragefound.org') {
$xpath_title = '//html/head/meta[@name="twitter:title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="entry-content"]/p[2]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'cpj.org') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
# .col-sm-7 > article:nth-child(1) > p:nth-child(3)
$xpath_description = '//div[@class="col-sm-7"]/p[1]';
$description = parse_description($ent, $xpath_description);
$description =~ s/>[^>]*—/>/;
} elsif ($site eq 'climatenewsnetwork.net') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$title =~ s/\s+\W\s+Climate News Network//u;
$xpath_description = '//div[@class="entry-content-post"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.craigmurray.org.uk') {
$xpath_title = '//html/head/meta[@name="twitter:title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//h1/following-sibling::p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'creativecommons.org') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$title =~ s/\s+\W\s+Creative Commons//u;
$xpath_description = '//div[@class="entry-content"]/p[1]';
$description = parse_description($ent, $xpath_description);
unless($description eq '<blockquote><p></p></blockquote>') {
$xpath_description = '//div[@class="entry-content"]/p[2]';
$description = parse_description($ent, $xpath_description);
}
} elsif ($site eq 'cubexyz.blogspot.com') {
$xpath_title = '//html/head/title';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@id="mainClm"]/div[@class="blogPost"]';
$description = parse_description($ent, $xpath_description);
$description =~ s/\s+//u;
# $description =~ s/\s\s+.*<\/blockquote>/<\/blockquote>/mu;
} elsif ($site eq 'danielmiessler.com') {
$xpath_title = '//h1[@class="entry-title"]';
$title = parse_title($ent, $xpath_title);
# remove podcasts
return(0) if ($title =~ m/Unsupervised Learning: No\./);
$xpath_description = '//div[@class="entry-content"]/p[position()>=last()-1]';
$description = parse_description($ent, $xpath_description);
# remove adverts for social control media
# my $de = HTML::TreeBuilder::XPath->new_from_content($description);
# for my $p ($de->findnodes('//p')) {
# if($p->as_text =~ m/^Discuss on Tw/) {
# $p->delete;
# }
# }
# $description = $de->as_XML_compact;
# $de->delete();
$description =~ s/^.*(<blockquote>)/$1/;
$description =~ s/(<\/blockquote>).*$/$1/;
} elsif ($site eq 'dataswamp.org') {
$xpath_title = '//h1[1]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//h1/following-sibling::p[position()>1 and position()<4]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.democracynow.org') {
$xpath_title = '//h1[1]';
$title = parse_title($ent, $xpath_title);
return(0) if ($title =~ m/recent shows/i);
return(0) if ($title =~ m/^headlines/i);
$xpath_description = '(//div[@class="headline_body"]/div[@class="headline_summary"]/p[1])[1]';
$description = parse_description($ent, $xpath_description);
unless($description) {
$xpath_description = '(//div[@class="text"]/p[1])[1]';
$description = parse_description($ent, $xpath_description);
}
} elsif ($site eq 'www.digitalmusicnews.com') {
$xpath_title = '//html/head/title';
$title = parse_title($xpath_title, $content);
$title = failed_utf($title);
$xpath_description = '//div[@id="main"]//h2';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.desmog.com') {
$xpath_title = '//div[@class="elementor-widget-container"]/h1';
$title = parse_title($ent, $xpath_title);
# $xpath_description = '//div[@class="elementor-widget-container"]/div/p[position()<3]';
$xpath_description = '(//div[@class="elementor-widget-container"]/div/p)[position()<3]';
$description = parse_description($ent, $xpath_description);
# xxx work-around to eliminate site signature :(
$description =~ s/<p>Website by.*//ms;
} elsif ($site eq 'www.desmogblog.com') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="field-items"]/div[1]/p[2]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'thedissenter.org') {
$xpath_title = '//h1[1]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="content"]/p[position()<3]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'dontextraditeassange.com') {
$xpath_title = '//div[@class="entry-categories"]/following-sibling::h1[@class="entry-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="entry-content"]/p[position()>1 and position()<3]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.dw.com') {
$xpath_title = '//div[1]/h1[1]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[1]/h1[1]/following-sibling::p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.elivecd.org') {
$xpath_title = '//h1[@class="post-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="post-content"]/h5[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.theenergymix.com') {
# lll
$xpath_title = '//h1[@class="jeg_post_title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="content-inner"]/p[position()<3]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.eff.org') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
# work-around for something broken with p[1]
$xpath_description = '//div[@class="field__items"]/div[1]/p[position()>1 and position()<=4]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.exposedbycmd.org') {
$xpath_title = '//h1[@class="entry-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="entry-content"]/p[position()<=2]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'fair.org') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
# .entry-content > p:nth-child(4)
$xpath_description = '//div[@class="entry-content"]/p[2]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'femtejuli.se') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//html/head/meta[@property="og:description"]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'ferd.ca') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//h2/following-sibling::p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'fortran-lang.org') {
$xpath_title = '//div[@class="newsletter col-wide"]/h1[1]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="newsletter col-wide"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'fossforce.com') {
$xpath_title = '//div//h1[@class="post-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="post-content"]/p[position()<3]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.fossmint.com') {
$xpath_title = '//h1[@class="entry-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="entry-content"]/p[position()<3]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.france24.com') {
$xpath_title = '//html/head/title';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="t-content t-content--article"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.gamingonlinux.com') {
$xpath_title = '//div/h1[@class="title full-article p-name"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="content group e-content"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'godotengine.org') {
# lll
$xpath_title = '//div[@class="info"]/h1[1]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="info"]/following-sibling::p[position()<3]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'thegrayzone.com') {
$xpath_title = '//h1[@class="entry-title" and 1]';
unless($title) {
$xpath_title = '//h1[1]';
$title = parse_title($ent, $xpath_title);
}
$xpath_description = '//div[@class="entry-content"]/h3[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'greenparty.org.uk' or
$site eq 'www.greenparty.org.uk') {
# LLL fix this above with $et, does not currently get this far
$xpath_title = '//div[@class="container"]/h1[1]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@id="news"]/div[position()<6]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'hackaday.com') {
$xpath_title = '//h1[@class="entry-title"]';
$title = parse_title($ent, $xpath_title);
# $xpath_description = '//html/head/meta[@property="og:description"]';
$xpath_description = '//div[@class="entry-content"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.hrw.org') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
# $xpath_description = '//html/head/meta[@property="og:description"]';
$xpath_description = '//div[@class="article-body article-body--contained"]/p[position()<3]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'infojustice.org') {
$xpath_title = '//h1[@class="entry-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="post-content entry-content"]/p[position()>1 and position()<4]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'insighthungary.444.hu' or $site eq '444.hu') {
$xpath_title = '//div[@id="headline"]/h1';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//p[position()<3]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.itwire.com') {
$xpath_title = '//h2[@class="itemTitle"]';
$title = parse_title($ent, $xpath_title);
$title =~ s/\s+Featured.*//u; # should have been in XPath instead
$xpath_description = '//div[@class="itemIntroText"]/p';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'jacobinmag.com') {
$xpath_title = '//body/h1[@class="po-hr-cn__title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//h1/following-sibling::p[@class="po-hr-cn__dek"]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'johnpilger.com') {
$xpath_title = '//html/head/title';
$title = parse_title($ent, $xpath_title);
$title = &title_case($title);
$xpath_description = '//div[@class="text book last full" and position()=1]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'krebsonsecurity.com') {
$xpath_title = '//div/h1[@class="entry-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="entry-content"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'kubernetes.io') {
$xpath_title = '//div[@class="content"]/h1';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="td-content"]/p[position()>1 and position() < 5 and not(preceding-sibling::h2)]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.laquadrature.net') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="entry-content entry-content-single"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.lightbluetouchpaper.org') {
$xpath_title = '//h1[@class="entry-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="entry-content"]/p[position()<=2]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.linuxandubuntu.com') {
$xpath_title = '//div/h1[@class="alignwide wp-block-post-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[contains(@class, "entry-content")]/p[position() < 5 and not(preceding-sibling::h2)]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.linuxbuzz.com') {
$xpath_title = '//div[@class="inside-article"]/h1[@class="entry-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="entry-content"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.linuxcloudvps.com') {
$xpath_title = '//h2[1]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//p[position()>1 and position()<3]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'linuxhandbook.com') {
$xpath_title = '//div/h1[@class="hero__title text-center"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="content js-toc-content"]/p[1]';
$description = parse_description($ent, $xpath_description);
# skip newsletters and such
if(!$description) {
return(0);
}
} elsif ($site eq 'www.linuxtechi.com') {
$xpath_title = '//div/h1[@class="entry-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="nv-content-wrap entry-content"]/p[position()<3]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'linuxgizmos.com') {
$xpath_title = '//div[@class="post"]/h2';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="entrytext"]/p[position()<3]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'linuxtechlab.com') {
$xpath_title = '//h1[1]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="text"]/p[position()<3]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'lunduke.com') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//html/head/meta[@property="og:description"]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'markcurtis.info') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$title =~ s/\s+\W\s+Meduza//u;
$xpath_description = '//div[@class="entry-content"]/p[position()>=3 and position()<=4]';
$description = parse_description($ent, $xpath_description);
unless($description) {
# some do not have the extra byline
# but it is hard to parse which do:
$xpath_description = '//div[@class="entry-content"]/p[position()>=2 and position()<=3]';
$description = parse_description($ent, $xpath_description);
}
} elsif ($site eq 'meduza.io') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$title =~ s/\s+\W\s+Meduza//u;
$xpath_description = '//div[@class="GeneralMaterial-article"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.michaelgeist.ca') {
$xpath_title = '//h1[@class="title"]';
$title = parse_title($ent, $xpath_title);
return(0) if($title=~/^The LawBytes Podcast/);
$xpath_description = '//div[@class="entry"]/p[last()]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'michaelwest.com.au') {
$xpath_title = '//html/head/title';
$title = parse_title($ent, $xpath_title);
$title =~ s/\s+\W\s+Michael West.*//u;
$xpath_description = '//div[@class="et_pb_title_container"]/p[@class="et_pb_title_meta_container"]';
$description = parse_description($ent, $xpath_description);
if ($description =~ m/\bAAP\b/) {
return(0);
}
$xpath_description = '//div[@id="old-post"]/p[position()<3]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.michaelwest.com.au') {
$xpath_title = '//html/head/title';
$title = parse_title($ent, $xpath_title);
$title =~ s/\s+\W\s+Michael West.*//u;
$xpath_description = '//head/meta[@property="og:description"]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.mintpressnews.com') {
$xpath_title = '//head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="entry-content"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'blog.mozilla.org') {
$xpath_title = '//div[1]/h1[1]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="ft-c-single-post__body"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.thenation.com') {
$xpath_title = '//div[@class="article-header-content"]/h1[@class="title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="article-body-inner"]/p[position()<3 and @class!="caption"]';
$description = parse_description($ent, $xpath_description);
$description =~ s/[\d\s]*Ad Policy.*$//i;
} elsif ($site eq 'newmatilda.com') {
$xpath_title = '//html/head/title';
$title = parse_title($ent, $xpath_title);
$title =~ s/\s+\W\s+New Matilda.*//u;
$xpath_description = '//div/div[@class="post-content text-font description"]/p[2]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'oceanservice.noaa.gov') {
$xpath_title = '//html/head/title';
$title = parse_title($ent, $xpath_title);
$title =~ s/\s+\W\s+Michael West.*//u;
$xpath_description = '//head/meta[@property="og:description"]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'off-guardian.org') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//h6/following-sibling::p[@class="dropcap"]';
$description = parse_description($ent, $xpath_description);
unless($description) {
$xpath_description = '//div[@class="transcript"]/p[1]';
$description = parse_description($ent, $xpath_description);
}
} elsif ($site eq 'papersplease.org') {
$xpath_title = '//h1[@class="post-title entry-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="entry-content"]/p[position()<4]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'news.opensuse.org') {
$xpath_title = '//h1[@class="decorated-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="col-md-7 col-12 mx-auto text-justify"]/p[position() <3]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'opensource.com') {
$xpath_title = '//h1[@class="published page-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@id="article_content"]//div[@class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"]/p[not(preceding-sibling::h2) and position() < 5]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'opensourcesecurity.io') {
$xpath_title = '//h1[@class="entry-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="entry-content"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'ostechnix.com') {
$xpath_title = '//div/h1[@class="post-title single-post-title entry-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="inner-post-entry entry-content"]/div/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.pclinuxos.com') {
$xpath_title = '//div[@class="title"]/h2[1]';
$title = parse_title($ent, $xpath_title);
$title =~ s/^\s+//u;
$xpath_description = '//div[@class="entry"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'perens.com') {
# header.entry-header h1.entry-title
$xpath_title = '//h1[@class="entry-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="entry-content"]/p[1]';
$description = parse_description($ent, $xpath_description);
unless($description) {
$xpath_description = '//div[@class="entry-content"]/descendant::p[1]';
$description = parse_description($ent, $xpath_description);
}
} elsif ($site eq 'perlweeklychallenge.org') {
$xpath_title = '//html/head/title';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="post-content"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.projectcensored.org') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="inner-post-entry entry-content"]/p[2]';
$description = parse_description($ent, $xpath_description);
if(!$description || $description =~ /Listen to all of our previous/) {
$xpath_description = '//div[@id="penci-post-entry-inner"]/div/div/div[1]';
$description = parse_description($ent, $xpath_description);
}
if(!$description || $description =~ /Listen to all of our previous/) {
$xpath_description = '//div[@id="penci-post-entry-inner"]/p[1]';
$description = parse_description($ent, $xpath_description);
}
if(!$description || $description =~ /Listen to all of our previous/) {
$xpath_description = '//div[@id="penci-post-entry-inner"]/div/div[1]';
$description = parse_description($ent, $xpath_description);
}
if(!$description || $description =~ /Listen to all of our previous/) {
$xpath_description = '//div[@id="penci-post-entry-inner"]/div[1]';
$description = parse_description($ent, $xpath_description);
}
} elsif ($site eq 'pluralistic.net') {
1;
# placeholder
} elsif ($site eq 'www.privateinternetaccess.com') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="detail-ct"]/p[2]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'projects.propublica.org') {
$xpath_title = '//html/head/title';
$title = parse_title($ent, $xpath_title);
$title =~ s/\s*\|.*$//u;
$xpath_description = '//html/head/meta[@property="og:description"]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'features.propublica.org') {
$xpath_title = '//html/head/title';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//html/head/meta[@property="og:description"]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.propublica.org') {
# $xpath_title = '//html/head/meta[@name="dcterms.Title"]';
$xpath_title = '//html/head/meta[@property="headline"]';
$title = parse_title($ent, $xpath_title);
unless($title) {
$xpath_title = '//h2[@class="hed"]';
$title = parse_title($ent, $xpath_title);
}
$xpath_description = '//div[@class="article-body"]/p[position()<=2]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.openrightsgroup.org') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="sixteen columns"]/*/p[1]';
$description = parse_description($ent, $xpath_description);
unless ($description) {
$xpath_description = '//div[@class="sixteen columns"]/p[1]';
$description = parse_description($ent, $xpath_description);
}
} elsif ($site eq 'puri.sm') {
$xpath_title = '//div[@class="container"]/h1[1]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="blog-entry e-content"]/p[not(preceding-sibling::h1) and position() < 4]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.qt.io') {
$xpath_title = '//div[@class="h-wysiwyg-html/h1"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//span[@id="hs_cos_wrapper_post_body"]/p[position()<3]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'rakudoweekly.blog') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '(//div[@class="entry-content"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.raspberrypi.org') {
$xpath_title = '//h1[2]';
$title = parse_title($ent, $xpath_title);
unless ($title) {
$xpath_title = '//h1[1]';
$title = parse_title($ent, $xpath_title);
}
$xpath_description = '//html/head/meta[@property="og:description"]';
$description = parse_description($ent, $xpath_description);
unless($description) {
$xpath_description = '//div[contains(@class,"c-post-content__wysiwyg")]/p[1]';
$description = parse_description($ent, $xpath_description);
}
} elsif ($site eq 'www.redhat.com') {
$xpath_title = '//div[@class="rh-article-teaser--component"]/h1';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[starts-with(@class,"rh-generic")]//p[not(preceding-sibling::h3) and position() < 3]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'respectfulinsolence.com'
|| $site eq 'www.respectfulinsolence.com') {
$xpath_title = '//h1[@class="entry-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '(//div[@class="entry-content"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'therevelator.org') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$title =~ s/\s+.bull\;.*//u;
$title =~ s/\s+•.*//u;
$xpath_description = '(//div[@id="entry-content"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.rferl.org') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '(//div[@id="article-content"]/div[1]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'robertreich.org') {
$xpath_title = '//div[@class="caption"]/h2/b';
$title = parse_title($ent, $xpath_title);
if (!$title) {
$xpath_title = '//li[@class="post"]/a/h2';
$title = parse_title($ent, $xpath_title);
$xpath_description = '(//div[@class="caption"])/p[2]';
$description = parse_description($ent, $xpath_description);
} else {
$xpath_description = '(//div[@class="caption"])[last()]/p[last()]';
$description = parse_description($ent, $xpath_description);
}
} elsif ($site eq 'robert.ocallahan.org') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '(//div[@class="post-body entry-content"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.rosehosting.com') {
$xpath_title = '//div/h1[@class="entry-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '(//div[@class="entry-content"]/p[not(preceding-sibling::h3) and position() < 3]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'shadowproof.com') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
# div.vw-post-content.clearfix p
$xpath_description = '//div[@class="vw-post-content clearfix"]/p[position()<=2]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'scheerpost.com') {
$xpath_title = '//h1[contains(@class,"entry-title")]';
$title = parse_title($ent, $xpath_title);
$title =~ s/\s+-\s+CounterPunch.org//u;
$xpath_description = '//head/meta[@property="og:description"]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.spiegel.de') {
$xpath_title = '//h2[@class="article-title lp-article-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div/h2/following-sibling::p[@class="article-intro"]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'digit.site36.net') {
$xpath_title = '//h3[@class="wp-block-post-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="has-global-padding is-layout-constrained entry-content cat-links entry-meta tag-links entry-content edit-link page-links wp-block-post-content"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'blog.steve.fi') {
$xpath_title = '//html/head/title';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="entry-content"]/p[position()>=last()-1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'techcrunch.com') {
$xpath_title = '//html/head/meta[@name="sailthru.title"]';
$title = parse_title($ent, $xpath_title);
$title = failed_utf($title);
$xpath_description = '//html/head/meta[@name="sailthru.description"]';
$description = parse_description($ent, $xpath_description);
$description = failed_utf($description);
$url =~ s/\?[^\?]*$//;
} elsif ($site eq 'www.techdirt.com') {
$xpath_title = '//h1[@class="posttitle"]';
$title = parse_title($ent, $xpath_title);
# remove Daily Deals
return (0) if ($title =~ m/^Daily Deal/);
# remove Funniest
return (0) if ($title =~ m/^Funniest/i);
# skip recaps
return(0) if ($title =~ m/^This Week In Techdirt History/i);
$xpath_description = '//div[@class="byline"]/following-sibling::p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.tecmint.com') {
$xpath_title = '//h1[@class="entry-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="entry-content"]/p[position()<3]';
$description = parse_description($ent, $xpath_description);
# lll
} elsif ($site eq 'www.technologyreview.com') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[1]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.tedunangst.com') {
# http://www.tedunangst.com/flak/rss
$xpath_title = '//html/head/title';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="byline"]/following-sibling::p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'threatpost.com') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="c-article__intro"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'telex.hu') {
$xpath_title = '//div[1]/div[1]/h1';
$title = parse_title($ent, $xpath_title);
# $xpath_description = '//div[@class="top-section"]/following-sibling::p[1]';
$xpath_description = '//div[@class="article-html-content"]/div/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'blog.torproject.org') {
$xpath_title = '//h1[@class="title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="body"]/p[position()<3]';
$description = parse_description($ent, $xpath_description);
unless($description) {
$xpath_description = '(//p)[2]';
$description = parse_description($ent, $xpath_description);
}
} elsif ($site eq 'torrentfreak.com') {
$xpath_title = '//html/head/title';
$title = parse_title($ent, $xpath_title);
$title =~ s/\s[\-\*]\sTorrentFreak$//u;
return (0) if ($title =~ /Most Torrented Movie of The Week/i);
# '//div[@class="entry-summary"]/p[@class="entry-lead"]'
$xpath_description = '//p[@class="article__excerpt"]';
$description = parse_description($ent, $xpath_description);
$url =~ s/\?.*$//;
} elsif ($site eq 'blog.trailofbits.com') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="entry-content"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.truthdig.com') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
unless($title) {
$xpath_title = '//html/head/meta[@name="twitter:title"]';
$title = parse_title($ent, $xpath_title);
}
$xpath_description = '//div[@class="article-item__content am2-content"]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'truthout.org') {
$xpath_title = '//h1[1]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@id="article-content"]/p[1]';
$description = parse_description($ent, $xpath_description);
unless($description) {
$xpath_description = '//p[@data-pp-id="1.0"]';
$description = parse_description($ent, $xpath_description);
}
# LLL - truthout's XHTML has multiple fatal validation errors
# cannot be processed, yet
} elsif ($site eq 'ubuntu.com') {
$xpath_title = '//html/head/title';
$title = parse_title($ent, $xpath_title);
$title =~ s/\s+\|.*$//u;
$xpath_description = '//div[@class="p-post__content"]//p[not(preceding-sibling::h2) and position() < 3]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.ubuntubuzz.com') {
$xpath_title = '//div[@class="title"]/h1';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="entry"]/p[2]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.unixmen.com') {
$xpath_title = '//div/h1[@class="entry-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="td-post-content"]//p[not(preceding-sibling::h2) and position() < 4]';
$description = parse_description($ent, $xpath_description);
unless($description) {
$xpath_description = '//div[@class="td-post-content"]/p[position()>2 and position()<5]';
$description = parse_description($xpath_description, $content);
}
} elsif ($site eq 'vitux.com') {
$xpath_title = '//div[@class="post-title-wrapper"]/h1';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="entry-content clearfix"]/p[not(preceding-sibling::h2) and position() < 3]';
$description = parse_description($ent, $xpath_description);
unless($description) {
$xpath_description = '//div[@class="entry-content clearfix"]/p[1]';
$description = parse_description($xpath_description, $content);
}
unless($description) {
$xpath_description = '//div[@class="entry-content clearfix"]/p[2]';
$description = parse_description($xpath_description, $content);
}
} elsif ($site eq 'yottadb.com') {
$xpath_title = '//html/head/meta[@property="og:title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div/div[@class="col-sm-20" and position()=3]/p[1]';
$description = parse_description($ent, $xpath_description);
} elsif ($site eq 'www.zenwalk.org') {
$xpath_title = '//h3[@class="post-title entry-title"]';
$title = parse_title($ent, $xpath_title);
$xpath_description = '//div[@class="post-body entry-content"]';
$description = parse_description($ent, $xpath_description);
} else {
# the site does not yet have XPaths, return with an error
print STDERR qq(Site "$site" is not yet configured,);
print STDERR qq(\tSee "$url"\n);
$ent->delete;
return(0);
}
# LLL - should print warning if no title or description is found
if ( $description !~ /<p>/ ) {
$description = "<blockquote><p>$description</p></blockquote>";
}
$ent->delete;
return( &print_item($title, $url, $description) );
}
sub parse_title {
my ($ent, $xpath_title) = (@_);
my $title = 0;
for my $t ($ent->findnodes($xpath_title)) {
if($t->tag eq 'meta') {
$title = $t->attr('content') || 0;
} else {
$title = $t->as_text || 0;
}
}
$title =~ s/\x{A0}/ /mg;
$title =~ s/\s+$//mu;
$title =~ s/^\s+//mgu;
$title = encode_entities($title);
return($title);
}
sub parse_description {
my ($ent, $xpath_description) = (@_);
my $description = '';
for my $d ($ent->findnodes($xpath_description)) {
if($d->tag eq 'meta') {
my $desc = encode_entities($d->attr('content'));
$description .= '<p>'.$desc."</p>\n" || 0;
} elsif($d->tag eq 'p') {
if($d->as_trimmed_text) {
my $desc = encode_entities($d->as_trimmed_text);
$description .= '<p>'.$desc."</p>\n";
}
} else {
$description .= encode_entities($d->as_trimmed_text).qq(\n);
}
}
if ($description) {
$description =~ s/>\s+/>/gmu;
$description = qq(<blockquote>$description</blockquote>\n);
}
# delete hidden soft-hyphen and zero-width space trackers
$description =~ s/[\x{A0}\x{00AD}\x{200B}]//mg;
return($description);
}
sub failed_utf {
my ($text) = (@_);
# crude work-arounds for failed utf-8 / unicode
# $text =~ s/â/'/g;
$text =~ s/\x{2060}//g;
return($text);
}
sub print_item {
my ($title, $url, $description) = (@_);
my $output;
if(!$opt{'L'}) {
$output .= qq(<li>);
}
$output .= qq(<h5><a href="$url">$title</a></h5>\n);
if($description) {
$output .= qq($description);
} else {
$output .= qq(<blockquote>\n</blockquote>\n);
}
if(!$opt{'L'}) {
$output .= qq(</li>\n\n);
}
return($output);
}
sub title_case {
my ($title) = (@_);
# based on Chapter 1.14.2, Perl Cookbook, 2nd ed.
our %nocap;
unless(keys %nocap) {
foreach my $w (qw(a an the and but or as at but by for
from in into of off on onto per to with)) {
$nocap{$w}++;
}
}
# put into lowercase if on stop list, else titlecase
$title =~ s/(\pL[\pL']*)/$nocap{$1} ? lc($1) : ucfirst(lc($1))/ge;
# last word guaranteed to cap
$title =~ s/^(\pL[\pL']*) /\u\L$1/x;
# first word guaranteed to cap
$title =~ s/ (\pL[\pL']*)$/\u\L$1/x;
# treat parenthesized portion as a complete title
$title =~ s/\( (\pL[\pL']*) /(\u\L$1/x;
$title =~ s/(\pL[\pL']*) \) /\u\L$1)/x;
# capitalize first word following colon or semi-colon
$title =~ s/ ( [:;] \s+ ) (\pL[\pL']* ) /$1\u\L$2/xu;
return ($title);
}
sub read_feed_instead {
my ($t,$feed,$output) = (@_);
# use feed metadata instead of parsing fetched articles
$t = parsedate($t);
my @entries = ();
my $count = 0;
foreach my $entry ($feed->entries) {
# print STDERR Dumper($entry),qq(\n\n)
# if($VERBOSE);
# entry time
my $ft = $entry->{entry}{pubDate}
|| $entry->issued
|| $entry->modified;
# entry time in seconds
my $et = parsedate($ft) || 0;
next unless($et =~ /^\d+$/ && $et >= $t );
my $title = $entry->title || 0;
my $url = $entry->link || 0;
my $description = $entry->{entry}{description} || 0;
if ($description) {
$description = "<p>". $description. "</p>";
}
my $o = &print_item($title, $url, $description);
push(@entries, $o);
}
if ($count) {
push(@entries, qq(\n<hr />\n\n));
}
return(@entries);
}
Links/tr-links-check-spam-sites.pl
#!/usr/bin/perl
# see Git for Version
# find links and make sure they are not junk sites
# use utf8;
use Getopt::Std;
use File::Glob ':bsd_glob';
use HTML::TreeBuilder::XPath;
use URI;
use open qw(:std :utf8);
use Term::ANSIColor qw(:constants);
use lib "$ENV{HOME}/lib/";
use Links::SpamSites qw(KnownSpamSite);
use English;
use warnings;
use strict;
our %opt;
getopts('h', \%opt);
&usage if ($opt{'h'});
my @filenames;
while (my $file = shift) {
my @files = bsd_glob($file);
foreach my $f (@files) {
push(@filenames, $f);
}
}
&usage if($#filenames < 0);
my $error = 0;
while (my $infile = shift(@filenames)) {
next if ($infile=~/~$/);
my %results = &interleave($infile);
# if spam sites were detected in this file, show them
if(keys %results) {
$error = 1;
# use colored text on colored background, sent to stderr
print STDERR BRIGHT_RED ON_BLUE
"Check these probably junk sites from $infile: \n ";
# list the specific domains, with possibel annotations
foreach my $site (sort keys %results) {
my $annotation = '';
if (length($results{$site}) > 2) {
$annotation = ' ('.$results{$site}.')';
}
print STDERR qq( $site$annotation\n);
}
# restore the original text and background colors
print STDERR RESET, qq(\n);
}
}
if ($error) {
exit(1);
}
exit(0);
sub usage {
print qq(Check URLs and verify that they are not junk sites.\n);
$0 =~ s/^.*\///;
print qq($0: new_file old_file [oldfile...]\n);
exit(1);
}
sub interleave {
my ($file)= (@_);
my $xhtml = HTML::TreeBuilder::XPath->new;
$xhtml->implicit_tags(1);
$xhtml->parse_file($file)
or die("Could not parse '$file' : $!\n");
my %spammers = ();
for my $node ($xhtml->findnodes('//li[h5]')) {
for my $anchor ($node->findnodes('./h5/a[@href]')) {
my $href = $anchor->attr('href');
next unless($href);
my $hostname = hostname($href);
if (my $status = KnownSpamSite($hostname)) {
$spammers{$hostname} = $status;
}
}
}
$xhtml->delete;
return (%spammers);
}
sub hostname {
my ($href) = (@_);
my $uri = URI->new($href);
return(0) unless(defined $uri->scheme && $uri->scheme =~ /^http/);
my $domain = $uri->host || 0;
return($domain);
}
Links/finalise-daily-links.sh
# Prepare and finalise Daily Links (News Roundup) for Techrights
#
# Licence: Public domain
# Author: Roy Schestowitz
# Date: 2018-2022
# Bring tags up to date
~/sync-camelcase.sh
# Remove empty bits
sed 's/<li><h5><a href=""><\/a><\/h5><\/li>/ /g' links-before.html > \
links-clean.html && perl ./links-cull-empty.pl links-clean.html | \
perl ./links-toc.pl > links-after.html
# Add tags
# cp links-after.html links-clean.html
perl ~/Git/Links/links-interleave-social-control-media.pl \
links-after.html > links-clean.html
# Invalid tags
sed 's/\[\[\[\[\[0\]\]\]\]\] //g' links-clean.html > links-after.html
# Trim the ends (WordPress post isn't a full page)
head -n -1 links-after.html > links-clean.html
tail -n +6 links-clean.html > links-after.html
# Body is irrelevant to WordPress in this context
sed 's/<body>/ /g' links-after.html > links-clean.html
sed 's/<\/body>/ /g' links-clean.html > links-after.html
sed 's/<ul><\/ul>/ /g' links-after.html > links-clean.html
sed 's/<\/head>/ /g' links-clean.html > links-after.html
# Make fancier site tags with basic style
sed 's/\[\[\[\[\[/<b><em>/g' links-after.html > links-clean.html
sed 's/\]\]\]\]\]/<\/em><\/b> ☛/g' links-clean.html > links-after.html
# Open to present the output (editor of choice here is KDE's Kate)
kate links-after.html
# Run some sanity checks (common errors), leave them visible for
# ~5 seconds, let it self-terminate after that
echo "========== QUOTES (missing URL possible)"
grep \"\" links-after.html
echo "========== NO ANCHOR (probably missing title)"
grep "><\/a" links-after.html
echo "========== TM (tuxmachines.org URLs)"
grep "tuxmachines" links-after.html
# Alter the template to make unique IDs
todaydate=`date '+%d\/%m\/%Y'`
yesterdaydate=`date --date="yesterday" '+%d\/%m\/%Y'`
sed "s/$yesterdaydate/$todaydate/" /home/roy/Desktop/Text_Workspace/template.html > /home/roy/Desktop/Text_Workspace/template_last.html
sed 's/id=\"/id=\"_/g' /home/roy/Desktop/Text_Workspace/template_last.html \
> /home/roy/Desktop/Text_Workspace/template.html
rm /home/roy/Desktop/Text_Workspace/template_last.html
cat links-before.html >> /home/roy/Desktop/Text_Workspace/all-db.txt
sleep 5
Links/daily.feeds
# 2020-08-15 # keep uptodate in Git! # todo: https://feeds.feedburner.com/NiemanJournalismLab https://cybershow.uk/feed.php # https://www.thenation.com/feed/?post_type=article https://www.greenparty.org.uk/news2.rss # ACLU seems blocked by Javascript and malformed feeds # https://www.aclu.org/taxonomy/feed-term/936/feed # https://www.aclu.org/taxonomy/feed-term/2152/feed # https://www.aclu.org/taxonomy/channel-term/1/feed # https://www.aclu.org/taxonomy/feed-term/8/feed # https://www.aclu.org/taxonomy/feed-term/362/feed # http://www.craigmurray.org.uk/rss http://fair.org/feed/ http://www.laquadrature.net/en/rss.xml # http://www.openrightsgroup.org/feed https://shadowproof.com/feed/ https://creativecommons.org/blog/feed/ # https://www.truthdig.com/feed/ # https://www.commondreams.org/rss.xml # http://robertreich.org/rss # https://feeds.feedburner.com/MichaelGeistsBlog https://meduza.io/rss/en/all # https://www.eff.org/rss/updates.xml # https://ar.al/index.xml # https://www.techdirt.com/techdirt_rss.xml # https://www.propublica.org/feeds/54Ghome # https://anniemachon.ch/feed # https://fossforce.com/feed/ # http://feeds.feedburner.com/projectcensored/gEpu # https://www.projectcensored.org/feed/ # captured by CAIR # http://feeds.feedburner.com/johnpilger # https://www.desmogblog.com/rss.xml https://therevelator.org/feed/ https://thegrayzone.com/feed # https://freeassange.org/feed/ https://papersplease.org/wp/feed/ # https://www.mintpressnews.com/feed/ # use sheer instead # https://scheerpost.com/feed/ https://telex.hu/rss/archivum?filters=%7B%22flags%22%3A%5B%22english%22%5D%2C%22parentId%22%3A%5B%22null%22%5D%7D https://insighthungary.444.hu/feed # https://couragefound.org/feed 403 Forbidden # https://www.theenergymix.com/feed/ questionable # https://climatenewsnetwork.net/feed/ rebranded as TheEnergyMix # https://www.privateinternetaccess.com/blog/feed/ defunct feed # https://www.truth-out.org/feed?format=feed # https://newmatilda.com/feed/ # https://www.technologyreview.com/stories.rss https://respectfulinsolence.com/feed/ # https://danielmiessler.com/feed/ https://digit.site36.net/feed/ # https://www.itwire.com/journalist/sam-varghese.html?format=feed https://thedissenter.org/rss/ # https://torrentfreak.com/feed/ # https://rakudoweekly.blog/feed/ https://www.raspberrypi.org/feed/ # http://perlsphere.net/atom.xml # https://perlweeklychallenge.org/rss.xml # http://lunduke.com/index.xml # https://www.democracynow.org/podcast.xml # https://www.democracynow.org/democracynow.rss https://blog.torproject.org/rss.xml https://krebsonsecurity.com/feed/ # https://fortran-lang.org/en/news/atom.xml https://hackaday.com/feed/ # cover manually: # https://www.digitalmusicnews.com/feed/ # https://9to5linux.com/feed/ # avoid: # https://www.truthdig.com/articles/human-rights-watch-accepted-money-from-a-saudi-billionaire-it-investigated-for-worker-abuse/ # https://www.hrw.org/rss/news # http://www.counterpunch.org/feed/
Links/tr-links-toc.pl
#!/usr/bin/perl
# Parse a lean hierarchy and generate a table of contents with internal links
use utf8;
use Getopt::Long;
use HTML::TreeBuilder::XPath;
use HTML::Entities;
use open qw(:std :utf8);
use English;
use warnings;
use strict;
our %opt = ( 'h' => 0, 'v' => 0, );
GetOptions ('verbose+' => \$opt{'v'},
'help|h' => \$opt{'h'},
);
&usage if ($opt{'h'});
# read directly from stdin or else get a list of file names
push(@ARGV, '/dev/stdin') if ($#ARGV < 0);
while (my $infile = shift) {
&readthefile($infile, $opt{'w'});
}
exit(0);
sub readthefile {
my ($file) = (@_);
my $xhtml = HTML::TreeBuilder::XPath->new;
$xhtml->implicit_tags(1);
$xhtml->no_space_compacting(1);
# force input to be read in as UTF-8
my $filehandle;
open ($filehandle, "<", $file)
or die("Could not open file '$file' : error: $!\n");
# parse UTF-8
$xhtml->parse_file($filehandle)
or die("Could not parse file handle for '$file' : $!\n");
close ($filehandle);
open (OUT, ">", "/dev/stdout")
or die("Could not open file 'stdout' : error: $!\n");
# unique id attributes are needed, even when files are combined
my ($second, $minute, $hour, $day) = gmtime(time);
my $stamp = sprintf("%02d%02d%02d%02d", $day, $hour, $minute, $second);
my $id = 0;
for my $h3 ($xhtml->findnodes('//h3')) {
$h3->attr('id',sprintf("m%08d%02d", $stamp, $id++));
}
my $toc = $xhtml->clone();
for my $h5 ($toc->findnodes('//ul[li[h5]]')) {
$h5->delete();
}
for my $h3 ($toc->findnodes('//h3')) {
my $id = $h3->attr('id');
my $c = $h3->detach_content();
my $new = HTML::Element->new('a');
$new->push_content($c);
$new->attr('href',"#$id");
$h3->replace_with($new);
}
my $t = HTML::Element->new('ul');;
for my $ul ($toc->findnodes('/html/body/div/ul')) {
$t->push_content($ul->detach_content());
}
$toc->delete;
for $toc ($xhtml->findnodes('//div/div/ul[1]')) {
$toc->replace_with($t);
last;
}
for $toc ($xhtml->findnodes('//body/div/div[contains(@id,"contents")]')) {
$toc->attr('id', 'contents'.$stamp);
}
# print OUT $t->as_XML_indented;
# print OUT $toc->as_XML_indented;
print OUT $xhtml->as_XML_indented;
$xhtml->delete;
return (1);
}
sub usage {
my $script = $PROGRAM_NAME;
$script =~ s/^.*\///;
print qq(Usage: $script [hv] filename [filename...] \n);
print qq(\t-h\tthis output\n);
print qq(\t-v\tincrease verbosity\n);
exit 0;
}
sub trim_white_space {
my $element = shift;
# see: HTML::Element and HTML::Element::traverse
for my $itemref ($element->content_refs_list) {
if($element->starttag =~ m/^<pre/) {
next;
} elsif (ref ${$itemref}) {
&trim_white_space(${$itemref});
} else {
${$itemref} =~ s/^\s+//g;
${$itemref} =~ s/\s+$//g;
}
}
return(1);
}
Links/sort-feedlist.sh
#!/bin/bash #Licence: Public Domain, feel free to share as you see fit # #Author: Roy Schestowitz echo >> ~/rss-tools/RSS3.html echo ====================================== Input string: $1 >> ~/rss-tools/RSS3.html echo >> ~/rss-tools/RSS3.html SEARHFTERM=$1 awk 'tolower($0) ~ /'$SEARHFTERM'/' RS= RSS2.html >> RSS3.html
Links/tr-links-de-duplicate.pl
#!/usr/bin/perl
# 2023-03-26
use Cwd qw(abs_path);
use DBI qw(:sql_types);
use File::Basename qw(fileparse);
use File::Copy qw(move);
use File::Glob ':bsd_glob';
use File::Path qw(make_path);
use File::Path::Expand qw(expand_filename);
use File::Temp qw(tempfile tempdir);
use Date::Calc qw(Gmtime);
use Getopt::Long;
use HTML::TreeBuilder::XPath;
use URI;
use autodie;
use open qw(:std :encoding(UTF-8));
use strict;
use warnings;
use English;
# default database file
our $dbfile="~/.local/links-de-duplicate/tr.urls.sqlite3";
my $script = $0;
our %opt = (
'clear' => 0,
'decruftify' => 0,
'ignore' => 0,
'verbose' => 0,
'write' => 0,
'help' => 0,
);
GetOptions (
"clear|c" => \$opt{'clear'}, # flag
"decruftify|d" => \$opt{'decruftify'}, # flag
"file|f=s" => \$opt{'dbfile'}, # string
"help|h" => \$opt{'help'}, # flag
"ignore|i" => \$opt{'ignore'}, # flag
"list|l:i" => \$opt{'list'}, # integer
"undo|u" => \$opt{'undo'}, # flag
"verbose|v+" => \$opt{'verbose'}, # flag, multiple settings
"write|w" => \$opt{'write'}, # flag
);
if ($opt{'help'}) {
&help($script);
}
my $dbpath = &prepare_dbpath($dbfile);
my $result = &prepare_db($dbfile);
if (defined($opt{'list'})) {
&list_latest_culls($opt{'list'});
exit(0);
}
# erase the table's contents first if requested
if ($opt{'clear'}) {
$result = &clear_db($dbfile);
print qq(Cleared '$dbfile' successfully\n);
} elsif ($opt{'undo'}) {
$result = &clear_latest_batch($dbfile);
print qq(Rolled back '$dbfile' one step\n);
exit(0);
}
# read the file names from the runtime arguments
my @filenames;
while (my $file = shift) {
my @files = bsd_glob($file);
foreach my $f (@files) {
push(@filenames, abs_path($f));
}
}
# remove any repeated file names but keep the sequence
my %ff;
my @tmp;
foreach my $f (@filenames) {
if ($ff{$f}++) {
next;
}
push(@tmp, $f);
}
@filenames = @tmp;
undef(@tmp);
if ($#filenames < 0) {
print qq(Target file missing\n);
&list_latest_culls();
&help($script);
}
if ($opt{'verbose'}) {
print "Attempting to read these files:\n\t";
print join("\n\t", @filenames),qq(\n);
}
# use the same time stamp for all transactions
our $epoch = time();
# check each file in sequence
foreach my $file (@filenames) {
my $xhtml_result = &get_urls_from_file($file);
# overwrite if requested
if ($opt{'write'}) {
# use a temporary file first, save the original as a backup
# then rename the temporary file to the original name
my ($fh, $filename) = tempfile();
print $fh $xhtml_result;
close($fh);
rename($file,"$file.old")
or die("$!\n");
move($filename, $file)
or die("$!\n");
} else {
print $xhtml_result;
}
}
exit(0);
sub list_latest_culls {
my ($limit) = (@_);
if (!$limit) {
$limit = 1;
} elsif ($limit<0) {
$limit = 1;
}
my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile", undef, undef,
{ AutoCommit => 0, RaiseError => 1 })
or die("Could not open database '$dbfile': $!\n");
my $searchquery = qq(SELECT firstseen FROM links
GROUP BY firstseen
ORDER by firstseen DESC
LIMIT ?);
my $sthsearch = $dbh->prepare($searchquery)
or die("prep for search for latest culls failed: $dbh->errstr()\n");
eval {
$sthsearch->execute($limit);
};
if ($@) {
$sthsearch->finish;
$dbh->rollback;
$dbh->disconnect;
die("search for latest culls failed: $dbh->errstr()\n");
}
while (my $row = $sthsearch->fetchrow_hashref) {
my $epoch = $row->{'firstseen'};
my ($year,$month,$day, $hour,$min,$sec, $doy,$dow,$dst)
= Gmtime($epoch);
printf("Culled on: %04d-%02d-%02d %02d:%02d GMT\t%d\n",
$year,$month,$day, $hour,$min, $epoch);
}
$sthsearch->finish;
$dbh->disconnect;
return(1);
}
sub get_urls_from_file {
my ($file) = (@_);
# force input to be read in as UTF-8
my $linkfile;
open ($linkfile, "<", $file)
or die("Could not open file '$file' : error: $!\n");
# use this pattern to find the start of URLs in the text
my $scheme = qr/gemini|https|http|ftp|sftp|ssh|rtsp|rsync|gopher/x;
# go through the file a line at a time, looking for URL patterns
my %urls;
my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile", undef, undef,
{ AutoCommit => 0, RaiseError => 1 })
or die("Could not open database '$dbfile': $!\n");
my $searchquery = qq(SELECT url FROM links WHERE url = ?);
my $sthsearch = $dbh->prepare($searchquery)
or die("prepare statement failed: $dbh->errstr()\n");
my $insertquery = qq(INSERT INTO links (firstseen, url) VALUES (?,?));
my $sthinsert = $dbh->prepare($insertquery)
or die("prepare statement failed: $dbh->errstr()\n");
my $xhtml = HTML::TreeBuilder::XPath->new;
$xhtml->implicit_tags(1);
# parse UTF-8
$xhtml->parse_file($linkfile)
or die("Could not parse file handle for '$file' : $!\n");
close($linkfile);
my $redundant = HTML::Element->new('div', 'class'=> 'duplicates');
my $redundant_ul = HTML::Element->new('ul', 'class'=> 'duplicates');
$redundant->insert_element($redundant_ul);
for my $node ($xhtml->findnodes('//li[h5]')) {
for my $anchor ($node->findnodes('./h5/a[@href]')) {
my $href = $anchor->attr('href');
next unless($href);
if($opt{'decruftify'}) {
my $cleaned_href = &decruftify($href);
if ($cleaned_href) {
$anchor->attr('href', $cleaned_href);
$href = $cleaned_href;
}
}
if ($opt{'verbose'} > 1) {
print qq($href\n);
}
eval {
$sthsearch->execute($href);
};
if ($@) {
$sthsearch->finish;
$dbh->rollback;
$dbh->disconnect;
die("execute statement failed: $dbh->errstr()\n");
}
my $hash_ref = $sthsearch->fetchall_hashref('url');
my $rv = $sthsearch->rows;
if ($rv > 0) {
# duplicate exists
if ($opt{'verbose'}) {
print "Deleting: $href\n";
}
if (!$opt{'ignore'}) {
my $copy = $node->clone();
$copy->attr('class','duplicate');
$redundant_ul->postinsert($copy);
$node->delete;
}
} else {
eval {
$sthinsert->execute($epoch, $href);
};
if ($@) {
$sthinsert->finish;
$dbh->rollback;
$dbh->disconnect;
die("execute statement failed: $dbh->errstr()\n");
}
}
}
}
# get rid of repeated <hr /> elements
for my $node ($xhtml->findnodes('//body/hr[preceding-sibling::hr]')) {
# print STDERR "hr removed\n";
$node->delete;
}
# only add these elements if there were any duplicates
if ($redundant_ul->descendants()) {
# add the division containing the list of duplicates inside the end of body
for my $node ($xhtml->findnodes('//body[1]')) {
$node->insert_element($redundant);
last;
}
}
$dbh->commit;
$sthinsert->finish;
$dbh->disconnect;
my $result = $xhtml->as_XML_indented || 0;
$redundant->delete;
$xhtml->delete;
return ($result);
}
sub prepare_dbpath {
my ($dbpath) = (@_);
$dbfile = expand_filename($dbfile);
my ($filename, $dirs, $suffix) = fileparse($dbpath);
$dirs = expand_filename($dirs);
if (! -e $dirs) {
my @created = make_path($dirs, { verbose => $opt{'verbose'}, chmod => 0755, })
or die("Could not create path '$dirs' : $!\n");
if ($opt{'verbose'} > 1) {
print "Directory ",join(',', @created), " added\n";
}
} elsif (! -d $dirs) {
die("'$dbpath' exists but is not a directory.\n");
} elsif (! -w $dirs) {
die("Directory '$dbpath' is not writable.\n");
}
return($dirs);
}
sub prepare_db {
my ($dbfile) = (@_);
my $schema = qq(CREATE TABLE IF NOT EXISTS
links (firstseen INTEGER DEFAULT 0,
url TEXT NOT NULL UNIQUE));
my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile", undef, undef,
{ AutoCommit => 0, RaiseError => 1 })
or die("Could not open database '$dbfile': $!\n");
my $sth = $dbh->prepare($schema)
or die("prepare statement failed: $dbh->errstr()\n");
eval {
$sth->execute();
};
if ($@) {
$sth->finish;
$dbh->rollback;
$dbh->disconnect;
die("execute statement failed: $dbh->errstr()\n");
}
my $query = qq(SELECT url FROM links LIMIT 1);
eval {
$sth = $dbh->prepare($query)
};
if ($@) {
$dbh->disconnect;
die("prepare statement failed: $dbh->errstr()\n");
}
eval {
$sth->execute();
};
if ($@) {
$sth->finish;
$dbh->rollback;
$dbh->disconnect;
die("execute statement failed: $dbh->errstr()\n");
}
$dbh->commit;
$sth->finish;
$dbh->disconnect;
return(1);
}
sub clear_db {
my ($dbfile) = (@_);
my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile", undef, undef,
{ AutoCommit => 0, RaiseError => 1 })
or die("Could not open database '$dbfile': $!\n");
my $deletequery = qq(DELETE FROM links);
my $sthdelete = $dbh->prepare($deletequery)
or die("prepare statement failed: $dbh->errstr()\n");
eval {
$sthdelete->execute();
};
if ($@) {
$sthdelete->finish;
$dbh->rollback;
$dbh->disconnect;
die("execute statement failed: $dbh->errstr()\n");
}
$dbh->commit;
$sthdelete->finish;
$dbh->disconnect;
return(1);
}
sub clear_latest_batch {
my ($dbfile) = (@_);
my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile", undef, undef,
{ AutoCommit => 0, RaiseError => 1 })
or die("Could not open database '$dbfile': $!\n");
my $deletequery = qq(DELETE FROM links WHERE
firstseen = (SELECT max(firstseen) FROM links));
my $sthdelete = $dbh->prepare($deletequery)
or die("prepare statement failed: $dbh->errstr()\n");
eval {
$sthdelete->execute();
};
if ($@) {
$sthdelete->finish;
$dbh->rollback;
$dbh->disconnect;
die("execute statement failed: $dbh->errstr()\n");
}
$dbh->commit;
$deletequery = qq(SELECT max(firstseen) AS firstseen FROM links);
$sthdelete = $dbh->prepare($deletequery)
or die("prepare statement failed: $dbh->errstr()\n");
eval {
$sthdelete->execute();
};
if ($@) {
$sthdelete->finish;
$dbh->rollback;
$dbh->disconnect;
die("execute statement failed: $dbh->errstr()\n");
}
my $firstseen;
my $rv = $sthdelete->bind_columns(\$firstseen);
if ($rv) {
$sthdelete->fetch;
my ($year,$month,$day, $hour,$min,$sec, $doy,$dow,$dst) =
Gmtime($firstseen);
printf "Rolled back to %04d-%02d-%02d %02d:%02d\n",
$year,$month,$day, $hour,$min,$sec;
}
$sthdelete->finish;
$dbh->disconnect;
return(1);
}
sub decruftify {
my ($href) = (@_);
my $uri = URI->new($href);
my $host;
eval {
$host = $uri->host;
};
if ($@) {
return(0);
}
if ($host eq 'www.cnet.com') {
$uri->fragment(undef);
} elsif ($host eq 'www.thenation.com') {
$uri->query(undef);
} elsif ($host eq 'www.csmonitor.com') {
$uri->query(undef);
} elsif ($host eq 'www.theatlantic.com/') {
$uri->query(undef);
} elsif ($host eq 'emorywheel.com') {
$uri->query(undef);
} elsif ($host eq 'scheerpost.com') {
$uri->query(undef);
} elsif ($host eq 'www.michaelgeist.ca') {
$uri->query(undef);
} elsif ($host eq 'www.engadget.com') {
$uri->query(undef);
} elsif ($host eq 'www.cbc.ca') {
$uri->query(undef);
} elsif ($host eq 'www.theage.com.au') {
$uri->query(undef);
} elsif ($host eq 'www.spiegel.de') {
$uri->fragment(undef);
} elsif ($host eq 'www.dw.com') {
$uri->query(undef);
} elsif ($host eq 'eng.lsm.lv') {
$uri->query(undef);
} elsif ($host eq 'yle.fi') {
$uri->query(undef);
} else {
return(0);
}
$href=$uri->canonical;
if ($opt{'verbose'} > 1) {
print qq(D = $href\n);
}
return($href);
}
sub help {
my ($script) = (@_);
$script =~ s|.*/||;
print <<EOT;
Usage: $script [OPTION] file [files]
Read a Daily Links file or files to extract the URLs and check them
for duplicates against a SQLite3 table. Send result to stdout if
the -w option is not used to overwrite the original file.
-c, --clear empty the URL table and start fresh in the database
-d, --decruftify remove cruft like query strings and fragments
from selected sites
-f, --file override default database file location
-i, --ignore ignore what's in the database and append only
-l, --list list latest cull, if a number is given list that many
-u, --undo remove the most recent set of URLs
-v, --verbose display extra debugging info while running
-w, --write overwrite file, leaving a backup copy of the old one
-h, --help show this output
EOT
exit(0);
}