Compare commits

..

10 commits

Author SHA1 Message Date
Devon Campbell
fd5fbc2541 Add YouTube channel list automation post 2024-11-22 23:20:01 -05:00
Devon Campbell
c37a322648 Add Netlify CLI as dev dependency 2024-11-22 23:19:35 -05:00
Devon Campbell
f665396d55 Sort channel names
I thought the channel names were already sorted in the source data file,
but it turns out they aren't. I now sort them after sorting the category
names.
2024-11-22 12:32:44 -05:00
Devon Campbell
fc92223b23 Automate YouTube channel list
This was becoming tedious to maintain, so I wrote some code that will
maintain it for me
2024-11-22 12:07:09 -05:00
Devon Campbell
c806c12dd9 Upgrade to Eleventy 3 2024-11-06 18:27:59 -05:00
Devon Campbell
88f90cdd02 Add Rideshare Renegades announcement 2024-08-12 19:54:26 -04:00
Devon Campbell
71f08c2927 Add Gum post 2024-06-24 09:11:09 -04:00
Devon Campbell
fa056712d1 Add gifs for Gum post 2024-06-24 00:22:59 -04:00
Devon Campbell
9d493413c8 Add syntax highlighting 2024-06-24 00:22:24 -04:00
Devon Campbell
ae0487886b Restructure for animated gifs
Animated gifs can't go through the asset pipeline since they come out as
a single frame of the original animation. Previously, I had only a
couple of them and didn't have my assets structured very well. I had the
assets that needed to be passthrough copied alongside those that could
go through the pipeline. It wasn't bad since there weren't many
animations. I mapped just those to passthrough copy to go to a single
directory. This will become more fraught as I add more since there's
more opportunity for collisions. When mapping to an output directory, I
can't maintain the inner structure of that directory. The files are
flattened. I moved everything around, both to separate images that can
go through the pipeline from those which can't and to allow for a simple
passthrough copy that will maintain the directory structure so that each
blog post can have its own directory of passthrough copied animated gifs
in the build.
2024-06-24 00:21:09 -04:00
85 changed files with 20043 additions and 2300 deletions

View file

@ -8,6 +8,7 @@ const markdownItEleventyImg = require("markdown-it-eleventy-img");
const pluginRss = require("@11ty/eleventy-plugin-rss");
const embedYouTube = require("eleventy-plugin-youtube-embed");
const sanitizeHtml = require("sanitize-html");
const syntaxHighlight = require("@11ty/eleventy-plugin-syntaxhighlight");
const metadata = require("./src/_data/metadata.json");
const sanitize = (html) => {
@ -20,16 +21,16 @@ const sanitize = (html) => {
module.exports = function(eleventyConfig) {
eleventyConfig.addPlugin(embedYouTube);
eleventyConfig.addPlugin(pluginRss);
eleventyConfig.addPlugin(syntaxHighlight);
eleventyConfig.addPassthroughCopy({ "assets/css": "css" });
eleventyConfig.addPassthroughCopy({ "assets/fonts": "fonts" });
eleventyConfig.addPassthroughCopy({ "assets/images/*": "images" });
eleventyConfig.addPassthroughCopy({ "assets/favicon": "/" });
eleventyConfig.addPassthroughCopy("css");
eleventyConfig.addPassthroughCopy("fonts");
eleventyConfig.addPassthroughCopy("images/**/*.{gif,png,jpg,jpeg}");
eleventyConfig.addPassthroughCopy({ "favicon": "/" });
eleventyConfig.addPassthroughCopy({
"node_modules/simpledotcss/simple.css": "css/simple.css",
});
eleventyConfig.addPassthroughCopy({ "src/robots.txt": "robots.txt" });
eleventyConfig.addPassthroughCopy({ "assets/images/about/devon.lol-button-03.gif": "images/devon.lol-button-03.gif" });
eleventyConfig.addFilter("buildPageTitle", function(title) {
if (this.page.url === '/') {
@ -109,6 +110,17 @@ module.exports = function(eleventyConfig) {
return sortedMentions;
});
eleventyConfig.addTransform('includePrismTheme', function(content, outputPath) {
// Automatically inject the Prism theme CSS, but only in HTML files that need it.
if (outputPath.endsWith('.html') && content.includes('<pre class="language-')) {
return content.replace(
'</head>',
'<link rel="stylesheet" href="/css/prism-synthwave84.css"></head>'
);
}
return content;
});
const markdownLibrary = markdownIt({ html: true })
.use(markdownItAnchor, { slugify })
.use(

2
.nvmrc
View file

@ -1 +1 @@
14
18

View file

@ -1,16 +0,0 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<link rel="stylesheet" type="text/css"
href="style.css"/>
</head>
<body>
<h1>Generated from: http://www.cufonfonts.com</h1><br/>
<h1 style="font-family:'BitBold';font-weight:normal;font-size:42px">AaBbCcDdEeFfGgHhŞşIıİi Example</h1>
</body>
</html>

View file

@ -1,29 +1,40 @@
#!/bin/bash
check_existing_file() {
if [ -e "$1/$2.md" ]; then
echo "Error: A file with the name '$2.md' already exists in the '$1' directory."
check_existing_blog_file() {
if [ -e "src/blog/$1/index.md" ]; then
echo "Error: A file with the name 'index.md' already exists in the 'src/blog/$1' directory."
exit 1
fi
}
read -p "Enter the title for the new blog post: " title
check_existing_feed_file() {
if [ -e "src/feed/$1.md" ]; then
echo "Error: A file with the name '$1.md' already exists in the 'src/feed' directory."
exit 1
fi
}
if [ -n "$1" ]; then
title=$1
else
read -p "Enter the title for the new blog post: " title
fi
kebab_title=$(echo "$title" | tr '[:upper:]' '[:lower:]' | tr ' ' '-')
check_existing_file "src/blog" "$kebab_title"
check_existing_file "src/feed" "$kebab_title"
check_existing_blog_file "$kebab_title"
check_existing_feed_file "$kebab_title"
# Create a new blog post file with the appropriate frontmatter and content
echo "---" > "src/blog/$kebab_title.md"
echo "title: $title" >> "src/blog/$kebab_title.md"
echo "layout: article.njk" >> "src/blog/$kebab_title.md"
echo "date: git Last Modified" >> "src/blog/$kebab_title.md"
echo "tags: post" >> "src/blog/$kebab_title.md"
echo "excerpt: Placeholder text for excerpt" >> "src/blog/$kebab_title.md"
echo "---" >> "src/blog/$kebab_title.md"
echo -e "\nThis is the content of the new blog post." >> "src/blog/$kebab_title.md"
mkdir -p "src/blog/$kebab_title"
echo "---" > "src/blog/$kebab_title/index.md"
echo "title: $title" >> "src/blog/$kebab_title/index.md"
echo "layout: article.njk" >> "src/blog/$kebab_title/index.md"
echo "date: git Last Modified" >> "src/blog/$kebab_title/index.md"
echo "tags: post" >> "src/blog/$kebab_title/index.md"
echo "excerpt: Placeholder text for excerpt" >> "src/blog/$kebab_title/index.md"
echo "---" >> "src/blog/$kebab_title/index.md"
echo -e "\nThis is the content of the new blog post." >> "src/blog/$kebab_title/index.md"
# Create a new feed file with the appropriate frontmatter
echo "---" > "src/feed/$kebab_title.md"
echo "title: $title" >> "src/feed/$kebab_title.md"
echo "relativeUrl: /blog/$kebab_title" >> "src/feed/$kebab_title.md"
@ -32,4 +43,4 @@ echo "tags: feed" >> "src/feed/$kebab_title.md"
echo "---" >> "src/feed/$kebab_title.md"
echo -e "\nThis is the content of the new blog post." >> "src/feed/$kebab_title.md"
$EDITOR "src/blog/$kebab_title.md"
$EDITOR "src/blog/$kebab_title/index.md"

140
css/prism-synthwave84.css Normal file
View file

@ -0,0 +1,140 @@
/*
* Synthwave '84 Theme originally by Robb Owen [@Robb0wen] for Visual Studio Code
* Demo: https://marc.dev/demo/prism-synthwave84
*
* Ported for PrismJS by Marc Backes [@themarcba]
*/
code[class*="language-"],
pre[class*="language-"] {
color: #f92aad;
text-shadow: 0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3;
background: none;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
font-size: 1em;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
}
:not(pre) > code[class*="language-"],
pre[class*="language-"] {
background-color: transparent !important;
background-image: linear-gradient(to bottom, #2a2139 75%, #34294f);
}
/* Inline code */
:not(pre) > code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
}
.token.comment,
.token.block-comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: #8e8e8e;
}
.token.punctuation {
color: #ccc;
}
.token.tag,
.token.attr-name,
.token.namespace,
.token.number,
.token.unit,
.token.hexcode,
.token.deleted {
color: #e2777a;
}
.token.property,
.token.selector {
color: #72f1b8;
text-shadow: 0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475;
}
.token.function-name {
color: #6196cc;
}
.token.boolean,
.token.selector .token.id,
.token.function {
color: #fdfdfd;
text-shadow: 0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975;
}
.token.class-name {
color: #fff5f6;
text-shadow: 0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75;
}
.token.constant,
.token.symbol {
color: #f92aad;
text-shadow: 0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3;
}
.token.important,
.token.atrule,
.token.keyword,
.token.selector .token.class,
.token.builtin {
color: #f4eee4;
text-shadow: 0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575;
}
.token.string,
.token.char,
.token.attr-value,
.token.regex,
.token.variable {
color: #f87c32;
}
.token.operator,
.token.entity,
.token.url {
color: #67cdcc;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}
.token.inserted {
color: green;
}

View file

Before

Width:  |  Height:  |  Size: 8 KiB

After

Width:  |  Height:  |  Size: 8 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 716 B

After

Width:  |  Height:  |  Size: 716 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

View file

@ -0,0 +1,17 @@
function donpm() {
if [ ! -f "package.json" ]; then
gum log --level error "package.json not found in the current directory"
return 1
fi
OPTIONS=$(jq -r '.scripts|to_entries[]|((.key))' package.json)
OPTIONS+="\n🛑 Cancel"
SELECTION=$(echo $OPTIONS | gum choose --header "Choose a script to run")
if [[ "$SELECTION" == "🛑 Cancel" ]]; then
gum log --level info "Execution was cancelled"
return 1
else
npm run $SELECTION
fi
}

View file

@ -0,0 +1,16 @@
# Run `vhs` from project root to get the correct output
Output images/blog/outsourcing-my-memory-to-gum/donpm.gif
Set Shell "zsh"
Set FontSize 32
Set Width 1100
Set Height 600
Hide
Type "source images/blog/outsourcing-my-memory-to-gum/donpm.sh && clear" Enter
Show
Type "donpm" Sleep 500ms Enter
Sleep 1.5s
Down Sleep 150ms Down Sleep 300ms Enter
Sleep 3s

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

View file

@ -0,0 +1,13 @@
# Run `vhs` from project root to get the correct output
Output images/blog/outsourcing-my-memory-to-gum/script-discovery.gif
Set Shell "zsh"
Set FontSize 32
Set Width 1100
Set Height 900
Type "npm run" Sleep 500ms Enter
Sleep 4s
Type "npm run start"
Sleep 3s

View file

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 153 KiB

After

Width:  |  Height:  |  Size: 153 KiB

Before After
Before After

21039
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -7,8 +7,8 @@
"start": "npx @11ty/eleventy --serve",
"createBlogPost": "bash create-blog-post.sh",
"build": "npx @11ty/eleventy",
"deploy": "netlify deploy --build",
"deploy:prod": "netlify deploy --prod --build",
"deploy": "npx netlify deploy --build",
"deploy:prod": "npx netlify deploy --prod --build",
"postdeploy:prod": "webmention dist/feed.xml --send",
"test": "echo \"Error: no test specified\" && exit 1"
},
@ -16,9 +16,10 @@
"author": "",
"license": "ISC",
"devDependencies": {
"@11ty/eleventy": "^2.0.1",
"@11ty/eleventy": "^3.0.0",
"@11ty/eleventy-fetch": "^4.0.1",
"@11ty/eleventy-plugin-rss": "^1.2.0",
"@11ty/eleventy-plugin-syntaxhighlight": "^5.0.0",
"@remy/webmention": "^1.5.0",
"@sindresorhus/slugify": "^1.1.0",
"eleventy-plugin-youtube-embed": "^1.8.0",
@ -26,6 +27,7 @@
"markdown-it-attrs": "^4.1.4",
"markdown-it-eleventy-img": "^0.9.0",
"markdown-it-obsidian": "github:raddevon/markdown-it-obsidian",
"netlify-cli": "^17.37.2",
"sanitize-html": "^2.13.0",
"simpledotcss": "^2.1.0"
}

View file

@ -0,0 +1,125 @@
// Finds your FreeTube profiles.db and adds the channel objects divided by profile to global data
// Access this anywhere via `freetubeCategories`, which will return an array of profile objects
// Note: I refer to 'profiles' as 'categories' since that naming makes more sense given how I'm using them in this automation and on my site. In this documentation, a "category" is the same thing as a FreeTube "Profile."
//
// Category object structure:
// - `name`: string - The name of the category/profile as assigned in FreeTube
// - 'subscriptions': array of subscription objects - The channels added to this category. See below for the subscription object structure. Note that channels added to multiple categories are distinct objects, so making a change to a channel object in one category does not affect that same channel's object if it appears in another category.
// - `bgColor`: string - The background color chosen for the category in FreeTube as a hexidecimal string with leading `#`
// - `textColor`: string - The foreground color chosen for the category in FreeTube as a hexidecimal string with leading `#`
// - `_id`: string - A unique ID generated by FreeTube to track the category. This is generally a seemingly random string of alphanumeric characters, but in the case of the "All Channels" category, the `_id` value is `"allChannels"`.
// - `$$deleted`: boolean - This property only exists on categories that have been deleted. Deleted categories seem to only persist in profiles.db while the app is still running and are removed when the app is closed.
// Note: You may see multiple instances of each category while the app is still running. Make sure to close it before you generate anything from this data.
//
// Subscription object structure:
// - `id`: string - The YouTube channel ID. You can build a URL to this channel by using this format: https://www.youtube.com/channel/{id}
// - `name`: string - The channel's name
// - `thumbnail`: string - A URI pointing to the channel's thumbnail
// - `tags`: string - For any channels assigned to tag categories, this property will contain a string with all of that channel's emoji tags
// - `selected`: boolean - Not entirely sure what this is to be perfectly honest.
//
// This would be more generally useful if I parameterized some things like the tag categories, the config location, and some others, but I won't bother with that for now.
// Maybe in a future revision… or maybe someone would like to submit that as a pull request!
const fs = require('fs');
const fsPromises = fs.promises;
const path = require('path');
const os = require('os');
const homeDir = os.homedir();
const flatpakConfigPath = path.join(homeDir, '.var', 'app', 'io.freetubeapp.FreeTube', 'config', 'FreeTube');
const nonFlatpakConfigPath = path.join(homeDir, '.config', 'FreeTube');
const freetubeConfigLocationByOS = {
linux: () => fs.existsSync(flatpakConfigPath) ? flatpakConfigPath : nonFlatpakConfigPath,
darwin: () => path.join(homeDir, 'Library', 'Application Support', 'FreeTube'),
win32: () => path.join(process.env.APPDATA, 'FreeTube'),
};
module.exports = async function getSubscriptions() {
const osName = os.platform();
if (!(osName in freetubeConfigLocationByOS)) {
console.warn(`Unsupported OS: ${osName}`);
return [];
}
const configLocation = freetubeConfigLocationByOS[osName]();
const subsLocation = path.join(configLocation, 'profiles.db');
// Instead of creating a new channel category, tag categories will add an emoji to a channel's `tag` property.
// Add your own categories to this object.
// The key should be the full name of the category in FreeTube.
// The value should be the emoji (or any unicode character, for that matter) that the channels should be prepended with.
// Channels in one or more tag category will have a `tags` property containing a string with all of that channel's tags.
// If the channel is in multiple categories, each instance of it will receive the `tags` property with the same value.
const tagCategories = {
'Instant Watch': '👀',
Virtuosic: '🤌',
Relaxing: '😌',
};
const categories = [];
const privateSubscriptionIds = new Set();
const subscriptionTags = {};
let allChannels;
try {
await fsPromises.access(subsLocation);
} catch (error) {
console.warn(`Subscriptions file not found at ${subsLocation}`, error);
return [];
}
try {
const data = await fsPromises.readFile(subsLocation, { encoding: 'utf8' });
const lines = data.split('\n');
for (const line of lines) {
if (line.trim()) {
let category;
try {
category = JSON.parse(line);
} catch (error) {
console.error(`Error parsing line: ${line}`, error);
}
if (category.name === 'Private') {
category.subscriptions?.forEach(sub => privateSubscriptionIds.add(sub.id));
} else if (category._id === 'allChannels') {
allChannels = category.subscriptions || [];
} else if (tagCategories.hasOwnProperty(category.name)) {
const tagEmoji = tagCategories[category.name];
category.subscriptions?.forEach(channel => subscriptionTags[channel.id] = (subscriptionTags[channel.id] || '') + tagEmoji);
} else if (!category.$$deleted) {
categories.push(category);
}
}
}
} catch (error) {
console.error(`Error reading file: ${subsLocation}`, error);
return [];
}
const channelsInCategory = new Set(categories.flatMap(category => category.subscriptions.map(channel => channel.id)));
const othersCategory = {
name: "Others",
subscriptions: allChannels.filter(channel =>
!privateSubscriptionIds.has(channel.id) &&
!channelsInCategory.has(channel.id)
)
};
// Categories are sorted alphabetically.
const sortedCategories = categories.sort((a, b) => a.name.localeCompare(b.name));
sortedCategories.push(othersCategory);
// Subscriptions are sorted alphabetically.
sortedCategories.forEach(category => {
category.subscriptions.sort((a, b) => a.name.localeCompare(b.name));
});
sortedCategories.forEach(category => {
category.subscriptions?.forEach(channel => channel.tags = subscriptionTags[channel.id])
});
return sortedCategories;
};

View file

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Before After
Before After

View file

@ -6,7 +6,7 @@ date: git Last Modified
This site exists because I got sick of what the web has become. I wanted to return to the web I remember from the late 90s and early 2000s, before every web site and every search results page were just trying to sell you something. I went searching to find if that web still existed.
![Animation of Futurama character Professor Farnsworth saying "good news, everyone!"](./assets/images/about/good-news-everyone.gif)
<img src="/images/about/good-news-everyone.gif" alt='Animation of Futurama character Professor Farnsworth saying "good news, everyone!"' />
[It does](/blog/the-old-web)!
@ -24,8 +24,8 @@ You can follow me [on Mastodon](https://techhub.social/@RadDevon). I tend to be
If you want to link to my site, you can use these buttons!
![A button with "Devon.Lol" in green text giving off a neon glow on top of a purple background with shapes on top of it in green, a lighter purple, pink, and blue. The background is inspired by the funky carpeting at the arcades of the 90s.](./assets/images/about/devon.lol-button-01.png)
![A button with a purple border and a character from Earthbound glowing green on top of a black background. To his right, "Devon.Lol" is written in pink and glows blue.](./assets/images/about/devon.lol-button-02.png)
<img src="/images/devon.lol-button-03.gif" alt='A button resembling a dialog box from the SNES RPG Earthbound. "Devon.LoL" is written inside in white.' />
![A button with "Devon.Lol" in green text giving off a neon glow on top of a purple background with shapes on top of it in green, a lighter purple, pink, and blue. The background is inspired by the funky carpeting at the arcades of the 90s.](./src/about/images/devon.lol-button-01.png)
![A button with a purple border and a character from Earthbound glowing green on top of a black background. To his right, "Devon.Lol" is written in pink and glows blue.](./src/about/images/devon.lol-button-02.png)
<img src="/images/about/devon.lol-button-03.gif" alt='A button resembling a dialog box from the SNES RPG Earthbound. "Devon.LoL" is written inside in white.' />
Feel free to skip the buttons too if you prefer. I personally prefer when links to other sites have some context, so text links are even better. Any link is appreciated.

View file

@ -0,0 +1,37 @@
---
title: Automating My YouTube Channel List
layout: article.njk
date: git Last Modified
tags: post
excerpt: I was tired of manually tracking my YouTube subscriptions and updating my list, so I built a solution to automate it in Eleventy.
---
Up until now, I maintained my [YouTube channel list](/lists/youtube-channels) by manually tracking any new channels I subscribed to and any channels I unsubscribed from. I would then, when I felt up to it, update a markdown file with the changes. This was a flexible way to share my subscriptions with people, but it was error prone and required more babysitting than I'd like.
Today, I'm launching a new list that will be updated without any intervention on my part, any time I build my site. Every time I build, Eleventy will use the actual data from my [FreeTube](https://freetubeapp.io/) subscriptions.
Let's take a quick detour to bring anyone not currently using FreeTube up to speed. FreeTube is a desktop application that has become the only way I engage with YouTube. In the same way the web is largely unusable without [uBlock Origin](https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/) (switch to Firefox or a Firefox fork, kids, to keep using the full-fat uBlock Origin after Chrome turns off extension manifest v2; I'm liking [Zen Browser](https://zen-browser.app/) at the moment), YouTube has become a nightmarish advertising and surveillance platform, with preroll ads, postroll ads, and several ad breaks in between just for good measure. Either that or you can subscribe to their premium service for the privilege of only having to endure the ads embedded in videos and a substantial monthly fee.
If surveillance and constant bombardment with ads don't match up to the way you like to watch videos on the internet, FreeTube is a way to enjoy YouTube while avoiding all the psychic damage… at least, until Peertube or other more humane solutions are able to catch up. It's so good that, even though when I discovered it, I primarily consumed videos on a mobile device, I've changed my consumption patterns entirely because the experience it offers is so vastly improved. I would rather not watch a video at all than watch it directly on YouTube. Some features that make FreeTube great:
- YouTube ads are gone
- Support for SponsorBlock to skip embedded ads if you want
- Support for DeArrow to replace clickbait video titles with more accurate ones
- Proxy YouTube through a privacy-focused YouTube frontend
- Import your YouTube subscriptions for easy migration
One great thing about FreeTube is that all of my subscriptions are local. This means I have a file on my system that outlines all the channels I'm subscribed to. I leveraged this to automate my list. Here's how it works:
1. I subscribe to a channel in FreeTube.
2. That channel gets added to my subscriptions file.
3. When Eleventy builds, it parses that file and builds the YouTube channel list from it.
Actually, that's not 100% accurate. Instead of parsing the subscriptions file, I'm parsing a file called `profiles.db`. This file, like the subscriptions file, also contains all my subscriptions, but it is used for another FreeTube feature: profiles. With profiles, I can create different sets of subscriptions. By default, all of my subscriptions go into the "All Channels" profile, but I can create as many other profiles as I want. If I'm interested in only watching videos about Linux today, I can switch to my "Linux" profile and see content pulled only from the subscriptions I've added to it. This makes it convenient for parsing since I can use the profiles to mirror the categories I had on my manually maintained list. I benefit in FreeTube with better organization and you benefit… well, also with better organization. The point is I get to double-dip. I do the work once, and it helps all of us.
Like I said before, the manually maintained markdown version of the list gave me infinite flexibility. I was limited only by the work I was willing to do. As a result, my list had a few nice features to make it more usable. As part of this transition, I wanted to make my list easier to maintain while also keeping as much of the fidelity I had in the manual list. Aside from the channel links and the category organization, I had two more pieces of metadata that made my list more useful: emoji tags that denoted attributes of a channel, like "I watch this channel's videos as soon as they're released" (👀) or "This channel's videos are relaxing" (😌), and a description for some channels, where the channel name doesn't make the content clear. With this new automated list, I was able to preserve one of those, but the other one didn't make the transition… at least for now.
Emoji tags are still around. For anyone interested in the implementation, I used FreeTube's profiles not only for category separation but also for emoji tagging. In my algorithm, I define special profiles which do not correspond to categories but instead to emoji tags. Any channels within those special categories will get an additional `tags` attribute containing all emoji tags that apply to them.
Descriptions sadly are gone. If I could have designed FreeTube from the ground up just to fit my use case, I would have added a way to make personal notes about a channel. Then I could have transferred my description into that notes field, pulled it out alongside my profile/subscription data, and displayed it in the list. Sadly, that feature doesn't exist. It's not the only way I could have implemented this, but it's the cleanest, best I can tell. I considered pulling the channel descriptions directly from YouTube, but I'm not wild about the idea of making 300+ HTTP requests each time I want to build my site. I wasn't willing to make any of the compromises an alternative would require, so I let that feature go in favor of easier maintenance.
My entire site is open source, so you're welcome to check out the implementation — I use [a universal data file to grab the data](https://codeberg.org/RadDevon/devon.lol/src/commit/f665396d558fca3e53513000270f13a5341c9d81/src/_data/freetubeCategories.js) and then [display it in my list](https://codeberg.org/RadDevon/devon.lol/src/commit/fc92223b23e48de843613eae9034d1cf9d15607e/src/lists/youtube-channels.md?display=source) — and use it for your own Eleventy site. You could probably even repurpose it to work with your own site on another static site generator or platform. I'd like to someday parameterize it better, but I've commented it pretty well to make it easier to understand how you might use it. You can also take a look at [the previous implementation](https://codeberg.org/RadDevon/devon.lol/src/commit/c9ffa7b9916bd5f0468057a54c3c9bbf32ac18f8/src/lists/youtube-channels.md) if you want to see the descriptions or are just curious about how I was maintaining the list before.

View file

Before

Width:  |  Height:  |  Size: 2.6 MiB

After

Width:  |  Height:  |  Size: 2.6 MiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.7 MiB

After

Width:  |  Height:  |  Size: 1.7 MiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2.4 MiB

After

Width:  |  Height:  |  Size: 2.4 MiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2.3 MiB

After

Width:  |  Height:  |  Size: 2.3 MiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2.2 MiB

After

Width:  |  Height:  |  Size: 2.2 MiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 3.1 MiB

After

Width:  |  Height:  |  Size: 3.1 MiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2.5 MiB

After

Width:  |  Height:  |  Size: 2.5 MiB

Before After
Before After

View file

@ -1,7 +1,7 @@
---
title: Covid Comfort Report Card, October, 2023
layout: article.njk
date: git Last Modified
date: 2023-10-22 # Revert to `git Last Modified` after next modification
tags: post
excerpt: If you travel as a Covid-cautious person, you'll find it more or less comfortable to exist in some cities based on a number of factors. Here's my roundup of the cities I've visited.
---
@ -16,7 +16,7 @@ I'll be looking at some subjective factors like my own experiences existing in t
## Braga, Portugal
![A pedestrian square in Braga, Portugal. It is a sunny day with blue skies. Two birds are flying off the left side of the photo. Mid-rise mixed use buildings line the right side of the photo. The square consist of a couple of raised beds of grass and rows of flowers — pink, orange, red, white, and purple. A pedestrian path runs down the middle of the beds and to the right, against the buildings. Trees are planted in the middle of the right portion of the walking path. Many people are walking and sitting around the square.](./assets/images/blog/covid-comfort-report-card-october-2023/braga.jpg)
![A pedestrian square in Braga, Portugal. It is a sunny day with blue skies. Two birds are flying off the left side of the photo. Mid-rise mixed use buildings line the right side of the photo. The square consist of a couple of raised beds of grass and rows of flowers — pink, orange, red, white, and purple. A pedestrian path runs down the middle of the beds and to the right, against the buildings. Trees are planted in the middle of the right portion of the walking path. Many people are walking and sitting around the square.](./src/blog/covid-comfort-report-card-october-2023/images/braga.jpg)
No one here was anything but nice to me. I never got a sideways glance and no one ever accosted me — at least, not in English! 😅
@ -24,7 +24,7 @@ I don't have per-city vaccination data on Portugal, but [86.1% of the country is
## Chicago, Illinois
![The Chicago River lined with buildings on either side. The water is a greenish-blue with a maroon bridge crossing it and a boat that has just passed under the bridge, moving away from the camera. The sky is cloudy and overcast, with a bird flying just right of center. Two tall glass buildings are in the center of the photo in the distance.](./assets/images/blog/covid-comfort-report-card-october-2023/chicago.jpg)
![The Chicago River lined with buildings on either side. The water is a greenish-blue with a maroon bridge crossing it and a boat that has just passed under the bridge, moving away from the camera. The sky is cloudy and overcast, with a bird flying just right of center. Two tall glass buildings are in the center of the photo in the distance.](./src/blog/covid-comfort-report-card-october-2023/images/chicago.jpg)
Chicago is one of the friendliest US cities I've been to for the Covid-conscious. Masking is relatively common, especially on public transit. Lots of masking in the airport which is great to see.
@ -32,13 +32,13 @@ Chicago is one of the friendliest US cities I've been to for the Covid-conscious
## Knoxville, Tennessee
![A rendition of the Henley Street Bridge in Lego at a Lego convention in Knoxville, Tennessee](./assets/images/blog/covid-comfort-report-card-october-2023/knoxville.jpg)
![A rendition of the Henley Street Bridge in Lego at a Lego convention in Knoxville, Tennessee](./src/blog/covid-comfort-report-card-october-2023/images/knoxville.jpg)
The South maintains its reputation of being friendly… as long as you're exactly like them. In this case, that means that you are anti-vax and certainly not masked. I was accosted no less than three times in a few weeks in Knoxville while masked. If you're wearing a mask here, even in a crowded public area, you'll very likely be the only one. Moving around in downtown, I would see a handful of people in a given week who were also masked.
Knoxville has a site for Covid vaccination data… but unless there's something wrong with my browser or internet connection, that site is literally empty. I see boxes with labels where data should be, yet those boxes have no numbers in them. I thought the site was just broken and maybe I could [download Knoxville's data as a CSV](https://www.tn.gov/content/dam/tn/health/documents/cedep/novel-coronavirus/datasets/COVID_VACCINE_COUNTY_SUMMARY.CSV), but, again, unless there's a weird problem on my end, this link produces a CSV with only column headers and no actual data.
![A Tennessee Covid vaccination data page with several boxes for data… but all of the boxes are empty.](./assets/images/blog/covid-comfort-report-card-october-2023/knoxville-tn-covid-vaccination-page.png)
![A Tennessee Covid vaccination data page with several boxes for data… but all of the boxes are empty.](./src/blog/covid-comfort-report-card-october-2023/images/knoxville-tn-covid-vaccination-page.png)
It's safe to assume this means the number is embarrassingly low — so low, in fact, Knoxville is willing to literally kill people by giving them insufficient information about whether or not they should visit in order to avoid sharing it. We can extrapolate from the [CDC's data on Tennessee as a whole](https://covid.cdc.gov/covid-data-tracker/#vaccinations_vacc-people-booster-percent-total): only 56.4% have received the full series and an abysmal 10.6% have received a bivalent booster. Maybe not worth killing people over — that problem will take care of itself — but certainly worth getting embarrassed over.
@ -46,7 +46,7 @@ So, if your path happens to intersect with Knoxville and assuming you value your
## Milwaukee, Wisconsin
![A photo of Lake Michigan in Milwaukee. The sky is bright blue with wispy clouds. The lake water is blue green and dominates the right side of the picture, but there is a small peninsula jutting out into it, covered with grass and trees. On the left side of the photo, a walking path runs along the lakefront. Several people are walking and running on the path. In the distance on the left side of the photo, you can see the city skyline.](./assets/images/blog/covid-comfort-report-card-october-2023/milwaukee.jpg)
![A photo of Lake Michigan in Milwaukee. The sky is bright blue with wispy clouds. The lake water is blue green and dominates the right side of the picture, but there is a small peninsula jutting out into it, covered with grass and trees. On the left side of the photo, a walking path runs along the lakefront. Several people are walking and running on the path. In the distance on the left side of the photo, you can see the city skyline.](./src/blog/covid-comfort-report-card-october-2023/images/milwaukee.jpg)
Milwaukee seemed generally accepting of masking. I was shouted at once out of a moving mini-van — a great way to be taken seriously when delivering medical advice. I didn't see many other people masking. Perhaps more than a town like Knoxville, but not by much. Comfort level in general was still much higher though.
@ -64,7 +64,7 @@ In a moment of weakness, I allowed myself to be convinced I should visit the Mal
I made my way through the mall. It was relatively uneventful. It was about like I thought it would be. I did think that, since it's the Mall of America, it would probably be packed to the brim with cool stores. Instead, it seems to be suffering like most malls, with lots of empty storefronts and stores that almost certainly couldn't have afforded the rent in the mall's heyday. Anti-vaxxers though can thrive in even the most downtrodden shopping mall.
![The “Got Kilt?” storefront in the Mall of America in Minneapolis. A cardboard standup of a kilt-wearing man greets you at the entrance. Through the glass, you can see some Funkopops, several items of clothing, and a few plushies.](./assets/images/blog/covid-comfort-report-card-october-2023/minneapolis.jpg)
![The “Got Kilt?” storefront in the Mall of America in Minneapolis. A cardboard standup of a kilt-wearing man greets you at the entrance. Through the glass, you can see some Funkopops, several items of clothing, and a few plushies.](./src/blog/covid-comfort-report-card-october-2023/images/minneapolis.jpg)
I was walking through the mall, masked, minding my own business, when a man called out to me, "nice mask." I felt the corners of my mouth turned up. "A compliment! How nice," I though to myself, but this was a Trojan horse. Now that my guard was down, the guy dropped his bomb: "THE PANDEMIC IS OVER, YA KNOW!" It's the last time I ever drop my guard and expose my soft underbelly to a man wearing a camo t-shirt and a baseball cap to cover up a "business in the front" haircut while leaving his luscious "party in the back" exposed.
@ -76,7 +76,7 @@ If I had to guess, I'd say we're hovering around the 55% mark with some of the o
## Montreal, Quebec, Canada
![A gray stone cathedral in Montreal, Quebec. Several people are walking in a pedestrian square in the foreground of the frame. Cars drive past the cathedral, just beyond the square. One of the cathedral's two towers (the one on the right side of the frame) has scaffolding built up on it. The sky is mostly overcast, but the light of the sun illuminates through the clouds behind that same tower.](./assets/images/blog/covid-comfort-report-card-october-2023/montreal.jpg)
![A gray stone cathedral in Montreal, Quebec. Several people are walking in a pedestrian square in the foreground of the frame. Cars drive past the cathedral, just beyond the square. One of the cathedral's two towers (the one on the right side of the frame) has scaffolding built up on it. The sky is mostly overcast, but the light of the sun illuminates through the clouds behind that same tower.](./src/blog/covid-comfort-report-card-october-2023/images/montreal.jpg)
Montreal was lovely and everyone there was lovely to me. No one blinked twice at my mask, and if they delivered any Minneapolis-style sick burns, they were in a language I did not understand.
@ -86,7 +86,7 @@ What I can see though is that the adult age grouping that surely represents a la
## Philadelphia, Pennsylvania
![Looking down Elfreth's Alley, a historic street in Philadelphia, Pennsylvania. The sky is bright blue with wispy clouds. The center of the street is cobblestones, and to either side of the stones, the street is brick. The cobbled section is lined with red bollards. The street is narrow and lined with early American homes on either side. The homes are all red brick, some with off-white (yellow-ish) wooden trim. The first home on the left has a green door and a bicentennial flag on a pole.](./assets/images/blog/covid-comfort-report-card-october-2023/philadelphia.jpg)
![Looking down Elfreth's Alley, a historic street in Philadelphia, Pennsylvania. The sky is bright blue with wispy clouds. The center of the street is cobblestones, and to either side of the stones, the street is brick. The cobbled section is lined with red bollards. The street is narrow and lined with early American homes on either side. The homes are all red brick, some with off-white (yellow-ish) wooden trim. The first home on the left has a green door and a bicentennial flag on a pole.](./src/blog/covid-comfort-report-card-october-2023/images/philadelphia.jpg)
No one has ever said anything to me or treated me differently in Philadelphia because I was wearing a mask. In fact, I've had quite a few lovely interactions while masked. Lots of people are still masking in the city, especially on public transit. I didn't notice quite the same levels of masking at the airport as I did at O'Hare, but it's still a very comfortable place to be Covid-conscious, at least on this "feel" metric. Let's see how it compares on the more metric-y metrics.
@ -98,7 +98,7 @@ Sadly, I don't see any data about uptake of the bivalent booster. Unless Philade
## Pittsburgh, Pennsylvania
![A panorama of the former Pittsburgh Glass Company. In the center is a square with small trees in planters. All around are castle-like buildings made entirely of glass. The sky is partly cloudy and blue and is reflected in the buildings. A street lies in the foreground, with an armored vehicle to the left and some cars on the right. People are walking around and enjoying the square.](./assets/images/blog/covid-comfort-report-card-october-2023/pittsburgh.jpg)
![A panorama of the former Pittsburgh Glass Company. In the center is a square with small trees in planters. All around are castle-like buildings made entirely of glass. The sky is partly cloudy and blue and is reflected in the buildings. A street lies in the foreground, with an armored vehicle to the left and some cars on the right. People are walking around and enjoying the square.](./src/blog/covid-comfort-report-card-october-2023/images/pittsburgh.jpg)
By the time I got to Pittsburgh, I was on a bit of a hair trigger after having been harassed for masking in so many American cities. My head was on a bit of a swivel. I was out one evening getting bubble tea, and a frat bro shouted at me out of a car. Aside from that, people were very nice. My experience was colored more by the accrued psychic damage from months of harassment up to that point than it was by Pittsburgh itself.
@ -106,7 +106,7 @@ By the time I got to Pittsburgh, I was on a bit of a hair trigger after having b
## Portland, Oregon
![Multi-colored houses near downtown Portland, Oregon. The photo looks down a sidewalk. On the left, a few cars are parked on the street. On the right, you see three brightly colored Victorian houses, each a unique mix of various shades of blue, pink, red, green, purple, and yellow. The sky is blue, and the sun shines brightly from behind one of the houses.](./assets/images/blog/covid-comfort-report-card-october-2023/portland.jpg)
![Multi-colored houses near downtown Portland, Oregon. The photo looks down a sidewalk. On the left, a few cars are parked on the street. On the right, you see three brightly colored Victorian houses, each a unique mix of various shades of blue, pink, red, green, purple, and yellow. The sky is blue, and the sun shines brightly from behind one of the houses.](./src/blog/covid-comfort-report-card-october-2023/images/portland.jpg)
I always felt comfortable masking in Portland. It seems people mask at a higher rate than in other cities — comparable to Chicago and Seattle. I can't recall ever being harassed about it.
@ -114,13 +114,13 @@ Portland does not, best I can tell, publish its own data, but [the Oregon Health
## Porto, Portugal
![A cloudy day in Porto showing a street in the touristy part of town. The ground is wet, and a couple walks toward the camera carrying folded umbrellas. On the right of the frame, we see outdoor seating for a couple of restaurants. on the left, buildings each about seven stories high. The ground level has a series of arches. Further down, the street is lined on both sides by buildings of a similar height, and the street begins to curve left and go up a hill. A dozen or so people are walking the streets and surrounding areas in the shot.](./assets/images/blog/covid-comfort-report-card-october-2023/porto.jpg)
![A cloudy day in Porto showing a street in the touristy part of town. The ground is wet, and a couple walks toward the camera carrying folded umbrellas. On the right of the frame, we see outdoor seating for a couple of restaurants. on the left, buildings each about seven stories high. The ground level has a series of arches. Further down, the street is lined on both sides by buildings of a similar height, and the street begins to curve left and go up a hill. A dozen or so people are walking the streets and surrounding areas in the shot.](./src/blog/covid-comfort-report-card-october-2023/images/porto.jpg)
I don't have much to say about Porto that I didn't already say about Braga. People were kind and no one hassled me during my time here.
## Salt Lake City, Utah
![A sea of concrete running through downtown Salt Lake City: this shot is taken from a center of a six-lane plus turning lane monstrosity gouging through the center of downtown Salt Lake City. You can see the traffic lights faced to the lane carrying traffic going away from the camera. The pole holds four signals, all red. There are very few cars in the frame. Further in the distance, you can see some highrise buildings. On the left, a glass building with some yellow accents. On the right, a building currently under construction along with an orange construction crane.](./assets/images/blog/covid-comfort-report-card-october-2023/slc.jpg)
![A sea of concrete running through downtown Salt Lake City: this shot is taken from a center of a six-lane plus turning lane monstrosity gouging through the center of downtown Salt Lake City. You can see the traffic lights faced to the lane carrying traffic going away from the camera. The pole holds four signals, all red. There are very few cars in the frame. Further in the distance, you can see some highrise buildings. On the left, a glass building with some yellow accents. On the right, a building currently under construction along with an orange construction crane.](./src/blog/covid-comfort-report-card-october-2023/images/slc.jpg)
Salt Lake City wasn't my favorite place to be — their downtown is made up primarily of endless criss-crossing highways — but I wasn't accosted a single time about my mask. I even got a haircut here while masked, and the barber was very friendly. I was here for a conference, and the conference required masking which was awesome! That led to SLC being one of my most comfortable places, along with Philly, Chicago, Portland, Seattle… and anywhere that *isn't* the US. 😅
@ -128,7 +128,7 @@ Salt Lake City wasn't my favorite place to be — their downtown is made up prim
## Seattle, Washington
![The most nineties car you have ever seen, parked on a street in Seattle, Washington. It is a Subaru, Baja — a car with a truck bed. The car is painted teal, pink, grey, red, and yellow. It is apparently a delivery car for a restaurant called Un Bien Caribbean and Latin Food.](./assets/images/blog/covid-comfort-report-card-october-2023/seattle.jpg)
![The most nineties car you have ever seen, parked on a street in Seattle, Washington. It is a Subaru, Baja — a car with a truck bed. The car is painted teal, pink, grey, red, and yellow. It is apparently a delivery car for a restaurant called Un Bien Caribbean and Latin Food.](./src/blog/covid-comfort-report-card-october-2023/images/seattle.jpg)
I love Seattle. I've spent a lot of time here, and I've never felt uncomfortable masking. Masking is still relatively common, and I know from my time living there that vaccination rates are sky-high… but let's see exactly *how* sky-high they are.

View file

Before

Width:  |  Height:  |  Size: 252 KiB

After

Width:  |  Height:  |  Size: 252 KiB

Before After
Before After

View file

@ -1,14 +1,14 @@
---
title: Curses Ain't All Bad
layout: article.njk
date: git Last Modified
date: 2022-12-03 # Revert to `git Last Modified` after next modification
tags: post
excerpt: Curse of the Dead Gods taught me something about life while I was learning that curses don't really need to be avoided at all costs. Sometimes, they can even be a good thing.
---
I was very bad at the video game Curse of the Dead Gods at first because "curses" were, in my mind, something to be avoided at all costs. I thought of them as punishments for doing poorly, and I didn't want to be punished.
![The main character of Curse of the Dead Gods getting a curse](./assets/images/blog/curses-aint-all-bad/getting-a-curse.jpg)
![The main character of Curse of the Dead Gods getting a curse](./src/blog/curses-aint-all-bad/images/getting-a-curse.jpg)
You can't avoid them, though, and once you've played a few times, you realize curses aren't all that bad. In fact, the rewards you get by making blood offerings generally outweigh the problems the curses introduce. The curses usually even have a tiny upside.

View file

@ -1,7 +1,7 @@
---
title: What If "Good Enough" Is Actually Great?
layout: article.njk
date: git Last Modified
date: 2024-03-31 # Revert to `git Last Modified` after next modification
tags: post
excerpt: I make the argument that maybe "good enough" is better than we think.
---

View file

@ -1,7 +1,7 @@
---
title: How to Stop Feeding AI
layout: article.njk
date: git Last Modified
date: 2023-08-14 # Revert to `git Last Modified` after next modification
tags: post
excerpt: It's now possible to tell OpenAI's bot not to crawl your web site, so I did it.
---

View file

@ -1,7 +1,7 @@
---
title: I'm on YouTube (Hurray, I guess?)
layout: article.njk
date: git Last Modified
date: 2024-02-19 # Revert to `git Last Modified` after next modification
tags: post
excerpt: I launched a video game channel where I try out and share new (to me) games. It's on YouTube because the alternatives aren't great.
---

View file

@ -1,7 +1,7 @@
---
title: Implementing webmentions is a pain
layout: article.njk
date: git Last Modified
date: 2024-06-20 # Revert to `git Last Modified` after next modification
tags: post
excerpt: Facebook, Twitter, and the others have taken control of the web by making it easy for regular people to interact online. Our answer for interactions people can own is Webmentions, but they have an Achilles' heel…
---

View file

@ -0,0 +1,128 @@
---
title: Outsourcing My Memory to Gum
layout: article.njk
date: git Last Modified
tags: post
excerpt: For years, I've been peeking at package.json to see how to use projects I've been away from. Now, I've built a better method that's held together with gum…
---
My memory is notoriously bad. I forgot what I ate today or whether I washed my hair. I walk into rooms and forget why. I tell friends stories they were themselves involved in.
You better believe that, when I return to some sort of web development project after several months, I've long since forgotten how to do anything with it. This is compounded by the fact that every tech stack has their own default way of doing things. For example, some npm project bootstrappers will create a script called `start` while others will create one called `develop`, both of which are used to start a local development server. I will sometimes add scripts for various types of deployment, which are different depending on the project, the tech stack it's on, where it's deployed, and how good I am at naming things on that day. 😅
## My Crappy Workaround
I usually work around these problems on Node-based projects by starting with `npm run` when I return to a project to get an overview of the project's scripts so I can understand how to jump in.
<img src="/images/blog/outsourcing-my-memory-to-gum/script-discovery.gif" alt='An animation of a terminal session. The user runs `npm run` to get a list of the available scripts in an npm project. The user then examines the output and types `npm run start` having chosen the script they want to run.' />
(Confession time: in truth, I `cat package.json`, but `npm run` is what I _should_ have been doing instead.)
This is cumbersome and clunky though. I'm manually looking at a file or at some output based on a file to figure out what options I have. Then, I manually run the option that does what I'm trying to do. The data that I'm looking at is already nicely structured in JSON, so it seems like a natural fit for the computer to handle the first part for me and just present me with options I can run directly. Now, let's see how to make that happen…
## A Cleaner Approach with Gum
That's when I stumbled upon [Charm's](https://charm.sh/blog/) [Gum](https://github.com/charmbracelet/gum). Gum is basically a UI component library for shell scripts. Gum has [a `choose` command](https://github.com/charmbracelet/gum?tab=readme-ov-file#choose) that outputs a handy option chooser component. This would be a great UI for my use case. I will need to pipe the available options into it and then run the result. Let's start putting the pieces together.
I would like a single command I can run from any npm project. To accomplish this, I'll write a function into my shell's config. In my case, that's `~/.zshrc`. I call the function `donpm` which you can interpret as either "do npm" or "Don P.M." who I imagine as a cool person with aviator shades who only comes out at night (yes, even with the shades; they're _that_ cool) and can figure out exactly how all your npm projects work. 😎
```bash
# loads of other stuff
function donpm() {
$SELECTION=(jq -r '.scripts|to_entries[]|((.key))' package.json | gum choose)
npm run $SELECTION
}
# loads more stuff
```
This function has a dependency on `jq`. I could probably do this with `sed`, but it's easier with `jq` and this is just for me to run on my system so I'm going to use it. With `jq`, I'm reading the contents of `package.json` and parsing out the scripts. I pipe that over to `gum choose` to display the chooser component.
`gum` will spit back the selection. I need to capture that so I can run the selected command, hence assigning the result to a variable (`SELECTION`).
Once I have that captured, I can then run `npm run $SELECTION` to interpolate the selected command into my `npm run`. (I tried piping to this, but that didn't seem to work. Maybe there's a fancier, better way, but this one seems to work well enough… well, almost. 😉)
## Adding an Option
This is cool and it (mostly) works, but I want to add a few features. First, I'd like to add a "Cancel" option to make it easy for a user (i.e., me) to change their mind and do nothing.
```bash
# loads of other stuff
function donpm() {
OPTIONS=$(jq -r '.scripts|to_entries[]|((.key))' package.json)
OPTIONS+="\n🛑 Cancel"
SELECTION=$(echo $OPTIONS | gum choose --header "Choose a script to run")
if [[ "$SELECTION" == "🛑 Cancel" ]]; then
gum log --level info "Execution was cancelled"
return 1
else
npm run $SELECTION
fi
}
# loads more stuff
```
Now, I've split things up a bit differently. I need to separate the steps of grabbing the scripts from `package.json` and piping them into `gum choose`. I'm doing this to give me the opportunity to add an option of my own. I capture to the `OPTIONS` variable and then add my "Cancel" option to that variable. Then I can echo the whole thing back to pipe it into `gum choose`.
This also requires me to make a special case: if the selection is the "Cancel" option, I log out a message (using `gum log`) and exit with a 1 since nothing was executed here. Not sure if that's the right move since the command was actually "successful" in doing what the user wanted, which happened to be nothing, but it should be fine. In any other case, I run the selection through `npm run` just like before.
## Yeah, but What Happens When I REALLY Forget?
It's mostly good at this point, but there's one more key piece I want to get in here. This whole thing is about me forgetting. So, what happens if I think a project is an npm project and try to run `donpm` even though it isn't? Maybe it's a Python project or maybe I'm just in the directory where I keep scans of old video game magazines. Let's handle that.
```bash
# loads of other stuff
function donpm() {
if [ ! -f "package.json" ]; then
gum log --level error "package.json not found in the current directory"
return 1
fi
OPTIONS=$(jq -r '.scripts|to_entries[]|((.key))' package.json)
OPTIONS+="\n🛑 Cancel"
SELECTION=$(echo $OPTIONS | gum choose --header "Choose a script to run")
if [[ "$SELECTION" == "🛑 Cancel" ]]; then
gum log --level info "Execution was cancelled"
return 1
else
npm run $SELECTION
fi
}
# loads more stuff
```
This gives me some safety so I can fully forget almost everything I know and still at least get a solid error message out of this function.
## The Final Product
After all of these improvements, here's what my workflow looks like when I come back to a project I've forgotten everything I ever knew about:
<img src="/images/blog/outsourcing-my-memory-to-gum/donpm.gif" alt='An animation of a terminal session. The user runs `donpm` to get a list of the available scripts in an npm project with a caret pointing at the top option (`start`). The user examines the output and arrows down to the `build` command, pressing enter. The build command starts with some preliminary output.' />
## Can it Get Any Better Than This?
Well, yes, of course it can! What you're looking at is the function I'm using now, but I have some ideas for improvements I may make someday if motivation strikes:
- Add "descriptions" to each script in the form of the commands being run.
- Filter out the `pre` and `post` lifecycle hook scripts since these aren't usually invoked manually.
- Accept an optional argument of the script name. This would allow Don to entirely take the place of `npm run`, saving me two characters per script invocation if I happen to recall the script name I want to run! If the function gets an argument, just run the npm script named by that argument. If not, show the choices just like it does now.
Feel free to take those on yourself if you're one of those "students surpassing the teacher" types.
## Bonus: VHS
I spend a lot of time in the terminal, and since that's Charm's whole game, I poked around to see all the tools they have available. Another one I found intriguing aside from `gum` was [VHS](https://github.com/charmbracelet/vhs).
VHS lets you build programmatic GIF animations of terminal activity. No more screen recording the terminal emulator. Cool! So cool, in fact, I used it for the GIFs you've seen in this post.
If you want to see how these are defined, check out the code for the two that appear here:
- [`npm run` script discovery method `.tape`](https://codeberg.org/RadDevon/devon.lol/src/commit/fa056712d1d3f169c2f37b61b48bd628f753562e/images/blog/outsourcing-my-memory-to-gum/script-discovery.tape)
- [New method `.tape`](https://codeberg.org/RadDevon/devon.lol/src/commit/fa056712d1d3f169c2f37b61b48bd628f753562e/images/blog/outsourcing-my-memory-to-gum/donpm.tape)

View file

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 790 KiB

After

Width:  |  Height:  |  Size: 790 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 617 KiB

After

Width:  |  Height:  |  Size: 617 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2 MiB

After

Width:  |  Height:  |  Size: 2 MiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.7 MiB

After

Width:  |  Height:  |  Size: 1.7 MiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 1.4 MiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 677 KiB

After

Width:  |  Height:  |  Size: 677 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 157 KiB

After

Width:  |  Height:  |  Size: 157 KiB

Before After
Before After

View file

@ -1,7 +1,7 @@
---
title: Rapid Fire Game Reviews Holiday 2022
layout: article.njk
date: git Last Modified
date: 2022-12-27 # Revert to `git Last Modified` after next modification
tags: post
excerpt: I give my thoughts on some games I got to try recently including Spookware, Neon White, Timespinner, Delta Manifold, Dread Delusion, Lunacid, Immortality, Astalon, and Phoenotopia, among others.
---
@ -10,25 +10,25 @@ These are my thoughts on some games I've played over the last few months, in no
## Spookware
![Screenshot of Spookware featuring the three skeleton player characters standing on the deck of a cruise ship](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/spookware.jpg)
![Screenshot of Spookware featuring the three skeleton player characters standing on the deck of a cruise ship](./src/blog/rapid-fire-game-reviews-holiday-2022/images/spookware.jpg)
The microgames of [WarioWare](https://www.igdb.com/games/warioware-inc-mega-microgames) paired with the cute and self-aware irreverence of [Undertale](https://www.igdb.com/games/undertale) (featuring skeletons just to complete the analogy). I really like the vibe here. The one surprising thing about the game is that a lot of it _isn't_ the WarioWare-style microgames. There's a old style adventure game bridging between the somewhat rare microgame segments. That part can be tedious. I'd like to see a sequel that de-emphasizes this aspect of the game and leans harder into the microgames. Still a lot of fun though. It had me laughing out loud.
## Neon White
![Screenshot of Neon White featuring the player character's first-person perspective on a giant bust statue on the left, a dark gray treasure chest with gold trim on the right, a spider-like demon standing next to a potted tree center, and a large white building just behind the demon with a red breakable wall on one of its faces](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/neon-white.jpg)
![Screenshot of Neon White featuring the player character's first-person perspective on a giant bust statue on the left, a dark gray treasure chest with gold trim on the right, a spider-like demon standing next to a potted tree center, and a large white building just behind the demon with a red breakable wall on one of its faces](./src/blog/rapid-fire-game-reviews-holiday-2022/images/neon-white.jpg)
One of my favorite things to do in a game is to refine my skill. I like to throw myself against a challenge over and over until I finally overcome it. I think a lot about an old PS2 game that I never hear anyone talk about anymore: [Stuntman](https://www.igdb.com/games/stuntman). You played a stunt driver going from movie to movie taking on-the-fly direction as you pulled the stunts needed for various movie scenes. I don't hear people talking about that game, but it was a favorite of mine. This is that but with an art style that screams "Japanese video game!" I'm pretty sure this _isn't_ Japanese, but it could pass. Lots of fun to be had here. I look forward to getting deeper into it and refining my times!
## Timespinner
![Screenshot of Timespinner featuring the player character at the bottom of stairs, backed by her small green dragon familiar, hitting a red enemy with a sword](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/timespinner.jpg)
![Screenshot of Timespinner featuring the player character at the bottom of stairs, backed by her small green dragon familiar, hitting a red enemy with a sword](./src/blog/rapid-fire-game-reviews-holiday-2022/images/timespinner.jpg)
More than any game I've tried, this game reminds me of [Symphony of the Night](https://www.igdb.com/games/castlevania-symphony-of-the-night). That's one of my favorites, so I'm excited to play more of this. It feels right in all the ways Symphony did.
## Teardown
![Screenshot of Teardown featuring a large yellow piece of construction machinery with a red arm being driven through the side of a red building. A light can be seen through the hole in the side of the building. A car is parked on the right and a truck with trailer on the left.](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/teardown.jpg)
![Screenshot of Teardown featuring a large yellow piece of construction machinery with a red arm being driven through the side of a red building. A light can be seen through the hole in the side of the building. A car is parked on the right and a truck with trailer on the left.](./src/blog/rapid-fire-game-reviews-holiday-2022/images/teardown.jpg)
The destruction is so cool. Not too sure about the game they've wrapped around it. It's neat, but setting up a route to race out of a level once I start destroying stuff wouldn't be my first choice of activity. I want to take my time and bask in the destruction.
@ -46,29 +46,29 @@ I just finished [Dark Pictures: Little Hope](https://www.igdb.com/games/the-dark
## Persona 5 Royal
![Screenshot of Person 5 Royal featuring the player character standing just inside the turnstiles in a Japanese train station. A group of three young women are standing and talking a few feet away.](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/persona-5.jpg)
![Screenshot of Person 5 Royal featuring the player character standing just inside the turnstiles in a Japanese train station. A group of three young women are standing and talking a few feet away.](./src/blog/rapid-fire-game-reviews-holiday-2022/images/persona-5.jpg)
Slick, stylish, and beautiful. Tedious and not very fun to play. A soundtrack that parks itself in your head well after the meter runs out.
## Delta Manifold
![Screenshot of Delta Manifold from the player character's perspective, looking down the barrel of a rectangular flat-shaded gun, aiming and firing at a large black humanoid figure with a triangular torso in a green environment covered with vines](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/delta-manifold.jpg)
![Screenshot of Delta Manifold from the player character's perspective, looking down the barrel of a rectangular flat-shaded gun, aiming and firing at a large black humanoid figure with a triangular torso in a green environment covered with vines](./src/blog/rapid-fire-game-reviews-holiday-2022/images/delta-manifold.jpg)
I wish I liked this one more, but it needs a lot of polish. Some better sign-posting would be nice too. I don't want literal signposts, but I need something more than the game is giving me to tell me what to do next. The levels are just random hallways and rooms connected together with tons of dead-ends. I can't tell if I'm missing something or if someone just banged these out really quick in Unity and left all the parts where they landed. The description on the game's Steam page says it wants to be [Metroid Prime](https://www.igdb.com/games/metroid-prime). I want it to be too, but it's not there yet.
## Dread Delusion and Lunacid
![Screenshot of Dread Delusion from the player character's perspective, at the top of steps approaching a doorway to a buiding. A tree is directly in front, and to the right, a giant pink moon with red wisps coming out of it, behind mountains and evergreen trees in the distance.](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/dread-delusion.jpg)
![Screenshot of Dread Delusion from the player character's perspective, at the top of steps approaching a doorway to a buiding. A tree is directly in front, and to the right, a giant pink moon with red wisps coming out of it, behind mountains and evergreen trees in the distance.](./src/blog/rapid-fire-game-reviews-holiday-2022/images/dread-delusion.jpg)
I'm lumping these together because they're both first-person RPGs that call out [King's Field](https://www.igdb.com/games/king-s-field) as an influence. Dread Delusion has a fun surreal art style but feels a bit more aimless. Both games have you wondering around a fair bit, but I felt the pain of it more in Dread Delusion. Something about the sparseness of the world and the same-ness of the environments I've been going through so far makes me feel this game is the thinner of the two, even though I'm pretty sure it's the one that has been "released" while Lunacid is still in early access. It's cool and I want to play more, but I'm not in love.
![Screenshot of Lunacid from the player character's perspective as they hold a sword, in a hallway in a tight catacomb with a slime-covered skeleton in front. Just beyond the skeleton, a bright yellow-green light floods in from a grate on the ceiling.](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/lunacid.jpg)
![Screenshot of Lunacid from the player character's perspective as they hold a sword, in a hallway in a tight catacomb with a slime-covered skeleton in front. Just beyond the skeleton, a bright yellow-green light floods in from a grate on the ceiling.](./src/blog/rapid-fire-game-reviews-holiday-2022/images/lunacid.jpg)
Lunacid feels different. There's something about the darkness of it. Everything is darker. I'm spending a lot of time in tight corridors. It's a lot different from the bright environments of Dread Delusion, and I like it. I feel like I'm really discovering in this game. I'm poking at walls and finding things the game wants me to think I wasn't supposed to find. Yesterday, I found an item that was very surprising, and I'm exciting to see how it fits into this game. When I level up in Dread Delusion, it doesn't really feel like anything has changed. In Lunacid, I feel like my character is actually progressing. There's a lot I'm excited about here.
## Immortality
![Screenshot of Immortality showing an actress on the left with large hoop earrings twirling her hair and looking at the clapper loader who stands at the right edge of the frame. The clapper loader is about to clap the clapper board which has the following text: "Minsky. Gino DeGiorgio Entertainment. Dir. John DURICK. INT/NIGHT. 7-20-70. 44A. 2." Three other actors stand just behind the clapper board looking at the actress on the left. The caption reads "Scene 44A, take two."](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/immortality.jpg)
![Screenshot of Immortality showing an actress on the left with large hoop earrings twirling her hair and looking at the clapper loader who stands at the right edge of the frame. The clapper loader is about to clap the clapper board which has the following text: "Minsky. Gino DeGiorgio Entertainment. Dir. John DURICK. INT/NIGHT. 7-20-70. 44A. 2." Three other actors stand just behind the clapper board looking at the actress on the left. The caption reads "Scene 44A, take two."](./src/blog/rapid-fire-game-reviews-holiday-2022/images/immortality.jpg)
I love what this game is in my head, but I'm not sold yet on what it is in reality. Because of the way I play games, I'm scared to death about the prospect of trying to come back to this game in four months when I remember I want to play more of it but _don't_ remember anything that happened in it. I hope the game has a mechanism to ease me back in at that point, but very few games actually do have something like that. When that day comes, I'm probably going to feel like I need to restart... and there's zero chance I actually do that. The anxiety about the way this game will fit into my life fills me with dread even while I've enjoyed my time with the game so far.
@ -76,13 +76,13 @@ I love what this game is in my head, but I'm not sold yet on what it is in reali
## Haak
![Screenshot of Haak showing the player character, a black figure with a round head and oblong oblique-angled yellow eyes. The character wears a blue cape and stands on a concrete interstate bridge in front of a large soldier wearing a uniform jumpsuit and a single-piece goggle and holding a large firearm. The soldier guards a hollowed-out bus that has been fashioned as a continuation of the bridge, with spikes on top and a sign that says "NEO." The bridge has spikes in the near background. Further in the background, we see a dilapidated billboard with a woman holding a drink and smiling next to foreign text, a watch tower, and a large building in disrepair. The sky is a pink orange.](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/haak.jpg)
![Screenshot of Haak showing the player character, a black figure with a round head and oblong oblique-angled yellow eyes. The character wears a blue cape and stands on a concrete interstate bridge in front of a large soldier wearing a uniform jumpsuit and a single-piece goggle and holding a large firearm. The soldier guards a hollowed-out bus that has been fashioned as a continuation of the bridge, with spikes on top and a sign that says "NEO." The bridge has spikes in the near background. Further in the background, we see a dilapidated billboard with a woman holding a drink and smiling next to foreign text, a watch tower, and a large building in disrepair. The sky is a pink orange.](./src/blog/rapid-fire-game-reviews-holiday-2022/images/haak.jpg)
This Metroidvania is just really well executed. Moving around feels great. The unlockable abilities are paced well, and I haven't felt stuck so far. Just a nice experience with fun art and a cute cat helping you find your way, at least in the early parts.
## Midnight Fight Express
![Screenshot of Midnight Fight Express showing the main character wearing black pants, black shoes, a black jacket, and a white shirt. He stands on top of a train running next to an empty track. He reaches back to punch one of several opponents dressed in colorful outfits as another group approaches from behind, one baring a knife.](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/midnight-fight-express.jpg)
![Screenshot of Midnight Fight Express showing the main character wearing black pants, black shoes, a black jacket, and a white shirt. He stands on top of a train running next to an empty track. He reaches back to punch one of several opponents dressed in colorful outfits as another group approaches from behind, one baring a knife.](./src/blog/rapid-fire-game-reviews-holiday-2022/images/midnight-fight-express.jpg)
The [Arkham Asylum](https://www.igdb.com/games/batman-arkham-asylum) combat works in an isometric game. I thought this was going to be great, but I think it will be ultimately forgettable. I nearly forgot to include it here!
@ -96,7 +96,7 @@ A flashy action game that's a bit awkward to play. Maybe it would get better if
## Pentiment
![Screenshot of Pentiment showing the main character Andreas with long light-brown hair wearing a red cap, a red tunic over an off-white shirt and blue pants. He is speaking to a man with gray hair, mustache, and beard wearing an off-white shirt, gray pants, and a maroon apron, standing with his sheep next to a blacksmith's anvil and forge. Tongs and horseshoes hang on a rack in front of the forge. The man's text box says, "Do you have a moment to lend me a hand?" in a casual script. Andreas's text box shows two response options written in a more formal font: "Of course" and "I'm already late to the abbey"](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/pentiment.jpg)
![Screenshot of Pentiment showing the main character Andreas with long light-brown hair wearing a red cap, a red tunic over an off-white shirt and blue pants. He is speaking to a man with gray hair, mustache, and beard wearing an off-white shirt, gray pants, and a maroon apron, standing with his sheep next to a blacksmith's anvil and forge. Tongs and horseshoes hang on a rack in front of the forge. The man's text box says, "Do you have a moment to lend me a hand?" in a casual script. Andreas's text box shows two response options written in a more formal font: "Of course" and "I'm already late to the abbey"](./src/blog/rapid-fire-game-reviews-holiday-2022/images/pentiment.jpg)
This is another one that I'm in love with the idea of but not yet the game. I'll give it some more time. I've just played a few minutes at this point.
@ -112,6 +112,6 @@ The worst thing about Phoenotopia is that I can neither pronounce nor spell its
## Betrayal at Club Low
![Screenshot of Betrayal at Club Low showing the main character — a blue man with glowing blue eyes wearing a pink and gray flannel over a yellow button-up shirt with orange collar, tan denim pants, and black shoes. He has a red hat with a slice of pizza on it and a red pizza bag on his back. He stands in a room with purple walls and wood flooring. On one wall hangs a blue glowing shovel in a red frame. On another wall, tusks of a large animal that glow blue and have lights on each of the tusks' tips. To the main character's right is a bin of yellow tennis balls. To his left, a series of security monitors on a desk, all showing a tennis match. A man wearing a brown jacket, black pants, and brown shoes sits at the desk with two empty drink cans in front of him along with a tennis racket and a custom computer keyboard with green, red, orange, yellow, and brown keys.](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/betrayal.jpg)
![Screenshot of Betrayal at Club Low showing the main character — a blue man with glowing blue eyes wearing a pink and gray flannel over a yellow button-up shirt with orange collar, tan denim pants, and black shoes. He has a red hat with a slice of pizza on it and a red pizza bag on his back. He stands in a room with purple walls and wood flooring. On one wall hangs a blue glowing shovel in a red frame. On another wall, tusks of a large animal that glow blue and have lights on each of the tusks' tips. To the main character's right is a bin of yellow tennis balls. To his left, a series of security monitors on a desk, all showing a tennis match. A man wearing a brown jacket, black pants, and brown shoes sits at the desk with two empty drink cans in front of him along with a tennis racket and a custom computer keyboard with green, red, orange, yellow, and brown keys.](./src/blog/rapid-fire-game-reviews-holiday-2022/images/betrayal.jpg)
This one was a surprise. I went in expecting nothing. Actually, based on the... scrappiness of the interface, I expected this to be janky. It isn't. It's simple but polished. It's a point-and-click adventure with some tabletop RPG-style dice-rolling mechanics laid on top. The dice rolling is surprisingly deep. You're allowed two re-rolls per action, and you can select which dice to re-roll. Outcomes on the dice can add other rules as well like allowing you to re-roll opponent dice or swap results with your opponent. The art style is funky. It almost looks like it doesn't all belong together, but it works. If you want something quirky and charming as heck, this is a good choice.

View file

@ -0,0 +1,13 @@
---
title: "Rideshare Renegades: My One-Page RPG Jam 2024 Entry"
layout: article.njk
date: git Last Modified
tags: post
excerpt: Rideshare Renegades is my entry for 2024's One-Page RPG Jam. It's a game that has you play as a rideshare driver who doesn't own a car.
---
<a href="https://raddevon.itch.io/rideshare-renegades">Rideshare Renegades</a> is my first ever TTRPG. It's an entry for <a href="https://itch.io/jam/one-page-rpg-jam-2024">2024's One-Page RPG Jam</a>. In it, you play as someone who needs to make a living with ridesharing but doesn't own a car. Instead, you'll ferry your passengers around via bus while trying to figure out what level and kind of social interaction they would like. It's a very light story game and won't be great for long-term play. (Not a ton here in the way of long-term progression.) That said, my partner and I still had a fun time playing it. Maybe you will too!
<iframe src="https://itch.io/embed/2876627?bg_color=222222&amp;fg_color=eeeeee&amp;border_color=363636" width="552" height="167" frameborder="0"><a href="https://raddevon.itch.io/rideshare-renegades">Rideshare Renegades by raddevon</a></iframe>
Like I said, this is my first TTRPG, so I welcome your constructive feedback, either through the itch.io comments or <a href="https://techhub.social/@raddevon">on Mastodon</a>.

View file

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 63 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 71 KiB

Before After
Before After

View file

@ -1,7 +1,7 @@
---
title: The Most Influential Game in History
layout: article.njk
date: git Last Modified
date: 2023-01-18 # Revert to `git Last Modified` after next modification
tags: post
excerpt: The most influential game is not Fortnite or Minecraft or Mario 64 or the original Super Mario Brothers. It's not any of the usual suspects, but it's fingerprints can be found all over modding, Twitch streaming, speedrunning, machinima, the keyboard + mouse control scheme, and online multiplayer gaming.
---
@ -10,13 +10,13 @@ It's hard to overstate the influence of [Minecraft](https://www.igdb.com/games/m
You could make a case for plenty of other games being the most influential too. [Super Mario Brothers](https://www.igdb.com/games/super-mario-bros) showed games could be more than just score chases. [Pitfall](https://www.igdb.com/games/pitfall) opened the door for developers not employed by the console maker to make games. [Mario 64](https://www.igdb.com/games/super-mario-64) was the template for 3D platforming. [Rogue](https://www.igdb.com/games/rogue) has a whole modern genre named after it! But in spite of everything these games and Minecraft brought to the table, none of them is the most influential game ever. Instead, that title belongs to another game with Minecraft's pixelly graphics and a first-person perspective. It's a game that, like Minecraft, was PC-first and created incredible longevity by fostering an enthusiastic modding community. It's a game that planted the seeds for some of the innovations Minecraft brought forward.
![The Quake box art consisting of the title at the top written in white with the stylized 'Q' above a large brown stylized 'Q' logo, all on black](./assets/images/blog/the-most-influential-game-in-history/quake-box.png)
![The Quake box art consisting of the title at the top written in white with the stylized 'Q' above a large brown stylized 'Q' logo, all on black](./src/blog/the-most-influential-game-in-history/images/quake-box.png)
[Quake](https://www.igdb.com/games/quake) was the Minecraft of its day, and its day was about 15 years before the release of Minecraft. Let's take a look at the staggering number of innovations Quake brought gamers in the mid 90s.
## Modding
![A screenshot of the Arcane Dimensions Quake mode showing a red brick wall on the left with an arch cut into it. Beyond the arch is a tall and narrow yellow stained glass window with repeated divided circles and to the right of that, another archway made of a tan colored concrete. Directly ahead in the image is a white broken archway leading to a churchy-looking room containing a portal. There is a torch on the right side wall.](./assets/images/blog/the-most-influential-game-in-history/arcane-dimensions.jpg)
![A screenshot of the Arcane Dimensions Quake mode showing a red brick wall on the left with an arch cut into it. Beyond the arch is a tall and narrow yellow stained glass window with repeated divided circles and to the right of that, another archway made of a tan colored concrete. Directly ahead in the image is a white broken archway leading to a churchy-looking room containing a portal. There is a torch on the right side wall.](./src/blog/the-most-influential-game-in-history/images/arcane-dimensions.jpg)
Modding was around before Quake, but it came of age with Quake. Many community map and mod makers were ultimately hired as level designers and game developers. Valve recruited early employees out of the community and brought the team behind Quake mod Team Fortress in-house to build its sequel on Half-Life… which was itself built on the Quake 2 engine.
@ -40,7 +40,7 @@ Since the game included a few demos, you could run your benchmark against one of
## Speedrunning
![The Quake Done Quick logo consisting of an overhead wireframe of a Quake map with an arrow drawn through it to indicate a run path starting at an 'X' and terminating at another 'X'. Superimposed on the map are actual in-game rocket launcher graphics showing the location of rocket launcher pickups in the map. A shambler graphic is overlaid near the end of the run path, presumably showing the location of a shambler enemy in the level. The “Quake guy” is shown in the lower right of the logo holding a stopwatch in his right hand and a trophy in his left. The words “Quake done Quick” with stylized 'Q's appear to his left.](./assets/images/blog/the-most-influential-game-in-history/quake-done-quick.jpg)
![The Quake Done Quick logo consisting of an overhead wireframe of a Quake map with an arrow drawn through it to indicate a run path starting at an 'X' and terminating at another 'X'. Superimposed on the map are actual in-game rocket launcher graphics showing the location of rocket launcher pickups in the map. A shambler graphic is overlaid near the end of the run path, presumably showing the location of a shambler enemy in the level. The “Quake guy” is shown in the lower right of the logo holding a stopwatch in his right hand and a trophy in his left. The words “Quake done Quick” with stylized 'Q's appear to his left.](./src/blog/the-most-influential-game-in-history/images/quake-done-quick.jpg)
Quakes demo file format was great for watching others compete in deathmatch or capture the flag matches, but it was also used to records speedruns through the games levels.
@ -68,7 +68,7 @@ This was the dawn of the WASD + mouse control scheme that is standard among firs
Before Quake, multiplayer gameplay on PC required either a game client that could dial up directly to another users modem or entering another players IP address in the game client. Enter QSpy, a Quake server browser that made it easier to find and connect to multiplayer games.
![Screenshot of the QuakeSpy application showing the menubar and toolbar on top, a list of source categories on the left (including id official servers divided by game mode, PlanetQuake servers, best.com, and Australian servers), a series of tabs just below the toolbar and right of the sidebar (with options “All Servers,” “Passed Filters,” “Filtered Out,” “Favorites,” and “Never Ping”), a list of servers below the tabs (with columns for server name, ping, address, player count/capacity, and game), a list of the selected server's players on the left side below the server list, and a list of the server's options to the right of that](./assets/images/blog/the-most-influential-game-in-history/quakespy.jpg)
![Screenshot of the QuakeSpy application showing the menubar and toolbar on top, a list of source categories on the left (including id official servers divided by game mode, PlanetQuake servers, best.com, and Australian servers), a series of tabs just below the toolbar and right of the sidebar (with options “All Servers,” “Passed Filters,” “Filtered Out,” “Favorites,” and “Never Ping”), a list of servers below the tabs (with columns for server name, ping, address, player count/capacity, and game), a list of the selected server's players on the left side below the server list, and a list of the server's options to the right of that](./src/blog/the-most-influential-game-in-history/images/quakespy.jpg)
Side note: QSpy later became QuakeSpy and then [GameSpy](https://en.wikipedia.org/wiki/GameSpy), which eventually became an editorial site that operated until 2013.

View file

@ -1,7 +1,7 @@
---
title: The Old Web
layout: article.njk
date: git Last Modified
date: 2023-10-01 # Revert to `git Last Modified` after next modification
tags: post
excerpt: I got tired of the commercial web, so I went looking for the Old Web. I'm talking about the web where people made pages just because they wanted to share something, not because they wanted to sell something. Fortunately, I found it. A lot of it.
---

View file

@ -1,7 +1,7 @@
---
title: Web Browser Review, June 2024
layout: article.njk
date: git Last Modified
date: 2024-06-10 # Revert to `git Last Modified` after next modification
tags: post
excerpt: I love the Arc Browser, but every time they add new AI features of refer to me as a "member," I feel like I'm teetering over a cliff. I decided to look for a replacement.
---

View file

@ -1,7 +1,7 @@
---
title: Which Dominoes Fall After Reddit?
layout: article.njk
date: git Last Modified
date: 2023-07-01 # Revert to `git Last Modified` after next modification
tags: post
excerpt: Twitter and Reddit have started their decline in usefulness in favor of what they hope is an ascent to profitability. Which sites will be the next to follow in their footsteps?
---

View file

@ -0,0 +1,36 @@
---
title: Automating My YouTube Channel List
relativeUrl: /blog/automating-my-youtube-channel-list
date: git Created
tags: feed
---
Up until now, I maintained my [YouTube channel list](/lists/youtube-channels) by manually tracking any new channels I subscribed to and any channels I unsubscribed from. I would then, when I felt up to it, update a markdown file with the changes. This was a flexible way to share my subscriptions with people, but it was error prone and required more babysitting than I'd like.
Today, I'm launching a new list that will be updated without any intervention on my part, any time I build my site. Every time I build, Eleventy will use the actual data from my [FreeTube](https://freetubeapp.io/) subscriptions.
Let's take a quick detour to bring anyone not currently using FreeTube up to speed. FreeTube is a desktop application that has become the only way I engage with YouTube. In the same way the web is largely unusable without [uBlock Origin](https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/) (switch to Firefox or a Firefox fork, kids, to keep using the full-fat uBlock Origin after Chrome turns off extension manifest v2; I'm liking [Zen Browser](https://zen-browser.app/) at the moment), YouTube has become a nightmarish advertising and surveillance platform, with preroll ads, postroll ads, and several ad breaks in between just for good measure. Either that or you can subscribe to their premium service for the privilege of only having to endure the ads embedded in videos and a substantial monthly fee.
If surveillance and constant bombardment with ads don't match up to the way you like to watch videos on the internet, FreeTube is a way to enjoy YouTube while avoiding all the psychic damage… at least, until Peertube or other more humane solutions are able to catch up. It's so good that, even though when I discovered it, I primarily consumed videos on a mobile device, I've changed my consumption patterns entirely because the experience it offers is so vastly improved. I would rather not watch a video at all than watch it directly on YouTube. Some features that make FreeTube great:
- YouTube ads are gone
- Support for SponsorBlock to skip embedded ads if you want
- Support for DeArrow to replace clickbait video titles with more accurate ones
- Proxy YouTube through a privacy-focused YouTube frontend
- Import your YouTube subscriptions for easy migration
One great thing about FreeTube is that all of my subscriptions are local. This means I have a file on my system that outlines all the channels I'm subscribed to. I leveraged this to automate my list. Here's how it works:
1. I subscribe to a channel in FreeTube.
2. That channel gets added to my subscriptions file.
3. When Eleventy builds, it parses that file and builds the YouTube channel list from it.
Actually, that's not 100% accurate. Instead of parsing the subscriptions file, I'm parsing a file called `profiles.db`. This file, like the subscriptions file, also contains all my subscriptions, but it is used for another FreeTube feature: profiles. With profiles, I can create different sets of subscriptions. By default, all of my subscriptions go into the "All Channels" profile, but I can create as many other profiles as I want. If I'm interested in only watching videos about Linux today, I can switch to my "Linux" profile and see content pulled only from the subscriptions I've added to it. This makes it convenient for parsing since I can use the profiles to mirror the categories I had on my manually maintained list. I benefit in FreeTube with better organization and you benefit… well, also with better organization. The point is I get to double-dip. I do the work once, and it helps all of us.
Like I said before, the manually maintained markdown version of the list gave me infinite flexibility. I was limited only by the work I was willing to do. As a result, my list had a few nice features to make it more usable. As part of this transition, I wanted to make my list easier to maintain while also keeping as much of the fidelity I had in the manual list. Aside from the channel links and the category organization, I had two more pieces of metadata that made my list more useful: emoji tags that denoted attributes of a channel, like "I watch this channel's videos as soon as they're released" (👀) or "This channel's videos are relaxing" (😌), and a description for some channels, where the channel name doesn't make the content clear. With this new automated list, I was able to preserve one of those, but the other one didn't make the transition… at least for now.
Emoji tags are still around. For anyone interested in the implementation, I used FreeTube's profiles not only for category separation but also for emoji tagging. In my algorithm, I define special profiles which do not correspond to categories but instead to emoji tags. Any channels within those special categories will get an additional `tags` attribute containing all emoji tags that apply to them.
Descriptions sadly are gone. If I could have designed FreeTube from the ground up just to fit my use case, I would have added a way to make personal notes about a channel. Then I could have transferred my description into that notes field, pulled it out alongside my profile/subscription data, and displayed it in the list. Sadly, that feature doesn't exist. It's not the only way I could have implemented this, but it's the cleanest, best I can tell. I considered pulling the channel descriptions directly from YouTube, but I'm not wild about the idea of making 300+ HTTP requests each time I want to build my site. I wasn't willing to make any of the compromises an alternative would require, so I let that feature go in favor of easier maintenance.
My entire site is open source, so you're welcome to check out the implementation — I use [a universal data file to grab the data](https://codeberg.org/RadDevon/devon.lol/src/commit/f665396d558fca3e53513000270f13a5341c9d81/src/_data/freetubeCategories.js) and then [display it in my list](https://codeberg.org/RadDevon/devon.lol/src/commit/fc92223b23e48de843613eae9034d1cf9d15607e/src/lists/youtube-channels.md?display=source) — and use it for your own Eleventy site. You could probably even repurpose it to work with your own site on another static site generator or platform. I'd like to someday parameterize it better, but I've commented it pretty well to make it easier to understand how you might use it. You can also take a look at [the previous implementation](https://codeberg.org/RadDevon/devon.lol/src/commit/c9ffa7b9916bd5f0468057a54c3c9bbf32ac18f8/src/lists/youtube-channels.md) if you want to see the descriptions or are just curious about how I was maintaining the list before.

View file

@ -15,7 +15,7 @@ I'll be looking at some subjective factors like my own experiences existing in t
# Braga, Portugal
![A pedestrian square in Braga, Portugal. It is a sunny day with blue skies. Two birds are flying off the left side of the photo. Mid-rise mixed use buildings line the right side of the photo. The square consist of a couple of raised beds of grass and rows of flowers — pink, orange, red, white, and purple. A pedestrian path runs down the middle of the beds and to the right, against the buildings. Trees are planted in the middle of the right portion of the walking path. Many people are walking and sitting around the square.](./assets/images/blog/covid-comfort-report-card-october-2023/braga.jpg)
![A pedestrian square in Braga, Portugal. It is a sunny day with blue skies. Two birds are flying off the left side of the photo. Mid-rise mixed use buildings line the right side of the photo. The square consist of a couple of raised beds of grass and rows of flowers — pink, orange, red, white, and purple. A pedestrian path runs down the middle of the beds and to the right, against the buildings. Trees are planted in the middle of the right portion of the walking path. Many people are walking and sitting around the square.](./src/blog/covid-comfort-report-card-october-2023/images/braga.jpg)
No one here was anything but nice to me. I never got a sideways glance and no one ever accosted me — at least, not in English! 😅
@ -23,7 +23,7 @@ I don't have per-city vaccination data on Portugal, but [86.1% of the country is
# Chicago, Illinois
![The Chicago River lined with buildings on either side. The water is a greenish-blue with a maroon bridge crossing it and a boat that has just passed under the bridge, moving away from the camera. The sky is cloudy and overcast, with a bird flying just right of center. Two tall glass buildings are in the center of the photo in the distance.](./assets/images/blog/covid-comfort-report-card-october-2023/chicago.jpg)
![The Chicago River lined with buildings on either side. The water is a greenish-blue with a maroon bridge crossing it and a boat that has just passed under the bridge, moving away from the camera. The sky is cloudy and overcast, with a bird flying just right of center. Two tall glass buildings are in the center of the photo in the distance.](./src/blog/covid-comfort-report-card-october-2023/images/chicago.jpg)
Chicago is one of the friendliest US cities I've been to for the Covid-conscious. Masking is relatively common, especially on public transit. Lots of masking in the airport which is great to see.
@ -31,13 +31,13 @@ Chicago is one of the friendliest US cities I've been to for the Covid-conscious
# Knoxville, Tennessee
![A rendition of the Henley Street Bridge in Lego at a Lego convention in Knoxville, Tennessee](./assets/images/blog/covid-comfort-report-card-october-2023/knoxville.jpg)
![A rendition of the Henley Street Bridge in Lego at a Lego convention in Knoxville, Tennessee](./src/blog/covid-comfort-report-card-october-2023/images/knoxville.jpg)
The South maintains its reputation of being friendly… as long as you're exactly like them. In this case, that means that you are anti-vax and certainly not masked. I was accosted no less than three times in a few weeks in Knoxville while masked. If you're wearing a mask here, even in a crowded public area, you'll very likely be the only one. Moving around in downtown, I would see a handful of people in a given week who were also masked.
Knoxville has a site for Covid vaccination data… but unless there's something wrong with my browser or internet connection, that site is literally empty. I see boxes with labels where data should be, yet those boxes have no numbers in them. I thought the site was just broken and maybe I could [download Knoxville's data as a CSV](https://www.tn.gov/content/dam/tn/health/documents/cedep/novel-coronavirus/datasets/COVID_VACCINE_COUNTY_SUMMARY.CSV), but, again, unless there's a weird problem on my end, this link produces a CSV with only column headers and no actual data.
![A Tennessee Covid vaccination data page with several boxes for data… but all of the boxes are empty.](./assets/images/blog/covid-comfort-report-card-october-2023/knoxville-tn-covid-vaccination-page.png)
![A Tennessee Covid vaccination data page with several boxes for data… but all of the boxes are empty.](./src/blog/covid-comfort-report-card-october-2023/images/knoxville-tn-covid-vaccination-page.png)
It's safe to assume this means the number is embarrassingly low — so low, in fact, Knoxville is willing to literally kill people by giving them insufficient information about whether or not they should visit in order to avoid sharing it. We can extrapolate from the [CDC's data on Tennessee as a whole](https://covid.cdc.gov/covid-data-tracker/#vaccinations_vacc-people-booster-percent-total): only 56.4% have received the full series and an abysmal 10.6% have received a bivalent booster. Maybe not worth killing people over — that problem will take care of itself — but certainly worth getting embarrassed over.
@ -45,7 +45,7 @@ So, if your path happens to intersect with Knoxville and assuming you value your
# Milwaukee, Wisconsin
![A photo of Lake Michigan in Milwaukee. The sky is bright blue with wispy clouds. The lake water is blue green and dominates the right side of the picture, but there is a small peninsula jutting out into it, covered with grass and trees. On the left side of the photo, a walking path runs along the lakefront. Several people are walking and running on the path. In the distance on the left side of the photo, you can see the city skyline.](./assets/images/blog/covid-comfort-report-card-october-2023/milwaukee.jpg)
![A photo of Lake Michigan in Milwaukee. The sky is bright blue with wispy clouds. The lake water is blue green and dominates the right side of the picture, but there is a small peninsula jutting out into it, covered with grass and trees. On the left side of the photo, a walking path runs along the lakefront. Several people are walking and running on the path. In the distance on the left side of the photo, you can see the city skyline.](./src/blog/covid-comfort-report-card-october-2023/images/milwaukee.jpg)
Milwaukee seemed generally accepting of masking. I was shouted at once out of a moving mini-van — a great way to be taken seriously when delivering medical advice. I didn't see many other people masking. Perhaps more than a town like Knoxville, but not by much. Comfort level in general was still much higher though.
@ -63,7 +63,7 @@ In a moment of weakness, I allowed myself to be convinced I should visit the Mal
I made my way through the mall. It was relatively uneventful. It was about like I thought it would be. I did think that, since it's the Mall of America, it would probably be packed to the brim with cool stores. Instead, it seems to be suffering like most malls, with lots of empty storefronts and stores that almost certainly couldn't have afforded the rent in the mall's heyday. Anti-vaxxers though can thrive in even the most downtrodden shopping mall.
![The “Got Kilt?” storefront in the Mall of America in Minneapolis. A cardboard standup of a kilt-wearing man greets you at the entrance. Through the glass, you can see some Funkopops, several items of clothing, and a few plushies.](./assets/images/blog/covid-comfort-report-card-october-2023/minneapolis.jpg)
![The “Got Kilt?” storefront in the Mall of America in Minneapolis. A cardboard standup of a kilt-wearing man greets you at the entrance. Through the glass, you can see some Funkopops, several items of clothing, and a few plushies.](./src/blog/covid-comfort-report-card-october-2023/images/minneapolis.jpg)
I was walking through the mall, masked, minding my own business, when a man called out to me, "nice mask." I felt the corners of my mouth turned up. "A compliment! How nice," I though to myself, but this was a Trojan horse. Now that my guard was down, the guy dropped his bomb: "THE PANDEMIC IS OVER, YA KNOW!" It's the last time I ever drop my guard and expose my soft underbelly to a man wearing a camo t-shirt and a baseball cap to cover up a "business in the front" haircut while leaving his luscious "party in the back" exposed.
@ -75,7 +75,7 @@ If I had to guess, I'd say we're hovering around the 55% mark with some of the o
# Montreal, Quebec, Canada
![A gray stone cathedral in Montreal, Quebec. Several people are walking in a pedestrian square in the foreground of the frame. Cars drive past the cathedral, just beyond the square. One of the cathedral's two towers (the one on the right side of the frame) has scaffolding built up on it. The sky is mostly overcast, but the light of the sun illuminates through the clouds behind that same tower.](./assets/images/blog/covid-comfort-report-card-october-2023/montreal.jpg)
![A gray stone cathedral in Montreal, Quebec. Several people are walking in a pedestrian square in the foreground of the frame. Cars drive past the cathedral, just beyond the square. One of the cathedral's two towers (the one on the right side of the frame) has scaffolding built up on it. The sky is mostly overcast, but the light of the sun illuminates through the clouds behind that same tower.](./src/blog/covid-comfort-report-card-october-2023/images/montreal.jpg)
Montreal was lovely and everyone there was lovely to me. No one blinked twice at my mask, and if they delivered any Minneapolis-style sick burns, they were in a language I did not understand.
@ -85,7 +85,7 @@ What I can see though is that the adult age grouping that surely represents a la
# Philadelphia, Pennsylvania
![Looking down Elfreth's Alley, a historic street in Philadelphia, Pennsylvania. The sky is bright blue with wispy clouds. The center of the street is cobblestones, and to either side of the stones, the street is brick. The cobbled section is lined with red bollards. The street is narrow and lined with early American homes on either side. The homes are all red brick, some with off-white (yellow-ish) wooden trim. The first home on the left has a green door and a bicentennial flag on a pole.](./assets/images/blog/covid-comfort-report-card-october-2023/philadelphia.jpg)
![Looking down Elfreth's Alley, a historic street in Philadelphia, Pennsylvania. The sky is bright blue with wispy clouds. The center of the street is cobblestones, and to either side of the stones, the street is brick. The cobbled section is lined with red bollards. The street is narrow and lined with early American homes on either side. The homes are all red brick, some with off-white (yellow-ish) wooden trim. The first home on the left has a green door and a bicentennial flag on a pole.](./src/blog/covid-comfort-report-card-october-2023/images/philadelphia.jpg)
No one has ever said anything to me or treated me differently in Philadelphia because I was wearing a mask. In fast, I've had quite a few lovely interactions while masked. Lots of people are still masking in the city, especially on public transit. I didn't notice quite the same levels of masking at the airport as I did at O'Hare, but it's still a very comfortable place to be Covid-conscious, at least on this "feel" metric. Let's see how it compares on the more metric-y metrics.
@ -97,7 +97,7 @@ Sadly, I don't see any data about uptake of the bivalent booster. Unless Philade
# Pittsburgh, Pennsylvania
![A panorama of the former Pittsburgh Glass Company. In the center is a square with small trees in planters. All around are castle-like buildings made entirely of glass. The sky is partly cloudy and blue and is reflected in the buildings. A street lies in the foreground, with an armored vehicle to the left and some cars on the right. People are walking around and enjoying the square.](./assets/images/blog/covid-comfort-report-card-october-2023/pittsburgh.jpg)
![A panorama of the former Pittsburgh Glass Company. In the center is a square with small trees in planters. All around are castle-like buildings made entirely of glass. The sky is partly cloudy and blue and is reflected in the buildings. A street lies in the foreground, with an armored vehicle to the left and some cars on the right. People are walking around and enjoying the square.](./src/blog/covid-comfort-report-card-october-2023/images/pittsburgh.jpg)
By the time I got to Pittsburgh, I was on a bit of a hair trigger after having been harassed for masking in so many American cities. My head was on a bit of a swivel. I was out one evening getting bubble tea, and a frat bro shouted at me out of a car. Aside from that, people were very nice. My experience was colored more by the accrued psychic damage from months of harassment up to that point than it was by Pittsburgh itself.
@ -105,7 +105,7 @@ By the time I got to Pittsburgh, I was on a bit of a hair trigger after having b
# Portland, Oregon
![Multi-colored houses near downtown Portland, Oregon. The photo looks down a sidewalk. On the left, a few cars are parked on the street. On the right, you see three brightly colored houses, each a unique mix of various shades of blue, pink, red, green, purple, and yellow. The sky is blue, and the sun shines brightly from behind one of the houses.](./assets/images/blog/covid-comfort-report-card-october-2023/portland.jpg)
![Multi-colored houses near downtown Portland, Oregon. The photo looks down a sidewalk. On the left, a few cars are parked on the street. On the right, you see three brightly colored houses, each a unique mix of various shades of blue, pink, red, green, purple, and yellow. The sky is blue, and the sun shines brightly from behind one of the houses.](./src/blog/covid-comfort-report-card-october-2023/images/portland.jpg)
I always felt comfortable masking in Portland. It seems people mask at a higher rate than in other cities — comparable to Chicago and Seattle. I can't recall ever being harassed about it.
@ -113,13 +113,13 @@ Portland does not, best I can tell, publish its own data, but [the Oregon Health
# Porto, Portugal
![A cloudy day in Porto showing a street in the touristy part of town. The ground is wet, and a couple walks toward the camera carrying folded umbrellas. On the right of the frame, we see outdoor seating for a couple of restaurants. on the left, buildings each about seven stories high. The ground level has a series of arches. Further down, the street is lined on both sides by buildings of a similar height, and the street begins to curve left and go up a hill. A dozen or so people are walking the streets and surrounding areas in the shot.](./assets/images/blog/covid-comfort-report-card-october-2023/porto.jpg)
![A cloudy day in Porto showing a street in the touristy part of town. The ground is wet, and a couple walks toward the camera carrying folded umbrellas. On the right of the frame, we see outdoor seating for a couple of restaurants. on the left, buildings each about seven stories high. The ground level has a series of arches. Further down, the street is lined on both sides by buildings of a similar height, and the street begins to curve left and go up a hill. A dozen or so people are walking the streets and surrounding areas in the shot.](./src/blog/covid-comfort-report-card-october-2023/images/porto.jpg)
I don't have much to say about Porto that I didn't already say about Braga. People were kind and no one hassled me during my time here.
# Salt Lake City, Utah
![A sea of concrete running through downtown Salt Lake City: this shot is taken from a center of a six-lane plus turning lane monstrosity gouging through the center of downtown Salt Lake City. You can see the traffic lights faced to the lane carrying traffic going away from the camera. The pole holds four signals, all red. There are very few cars in the frame. Further in the distance, you can see some highrise buildings. On the left, a glass building with some yellow accents. On the right, a building currently under construction along with an orange construction crane.](./assets/images/blog/covid-comfort-report-card-october-2023/slc.jpg)
![A sea of concrete running through downtown Salt Lake City: this shot is taken from a center of a six-lane plus turning lane monstrosity gouging through the center of downtown Salt Lake City. You can see the traffic lights faced to the lane carrying traffic going away from the camera. The pole holds four signals, all red. There are very few cars in the frame. Further in the distance, you can see some highrise buildings. On the left, a glass building with some yellow accents. On the right, a building currently under construction along with an orange construction crane.](./src/blog/covid-comfort-report-card-october-2023/images/slc.jpg)
Salt Lake City wasn't my favorite place to be — their downtown is made up primarily of endless criss-crossing highways — but I wasn't accosted a single time about my mask. I even got a haircut here while masked, and the barber was very friendly. I was here for a conference, and the conference required masking which was awesome! That led to SLC being one of my most comfortable places, along with Philly, Chicago, Portland, Seattle… and anywhere that *isn't* the US. 😅
@ -127,7 +127,7 @@ Salt Lake City wasn't my favorite place to be — their downtown is made up prim
# Seattle, Washington
![The most nineties car you have ever seen, parked on a street in Seattle, Washington. It is a Subaru, Baja — a car with a truck bed. The car is painted teal, pink, grey, red, and yellow. It is apparently a delivery car for a restaurant called Un Bien Caribbean and Latin Food.](./assets/images/blog/covid-comfort-report-card-october-2023/seattle.jpg)
![The most nineties car you have ever seen, parked on a street in Seattle, Washington. It is a Subaru, Baja — a car with a truck bed. The car is painted teal, pink, grey, red, and yellow. It is apparently a delivery car for a restaurant called Un Bien Caribbean and Latin Food.](./src/blog/covid-comfort-report-card-october-2023/images/seattle.jpg)
I love Seattle. I've spent a lot of time here, and I've never felt uncomfortable masking. Masking is still relatively common, and I know from my time living there that vaccination rates are sky-high… but let's see exactly *how* sky-high they are.

View file

@ -7,7 +7,7 @@ tags: feed
I was very bad at the video game Curse of the Dead Gods at first because "curses" were, in my mind, something to be avoided at all costs. I thought of them as punishments for doing poorly, and I didn't want to be punished.
![The main character of Curse of the Dead Gods getting a curse](./assets/images/blog/curses-aint-all-bad/getting-a-curse.jpg)
![The main character of Curse of the Dead Gods getting a curse](./src/blog/curses-aint-all-bad/images/getting-a-curse.jpg)
You can't avoid them, though, and once you've played a few times, you realize curses aren't all that bad. In fact, the rewards you get by making blood offerings generally outweigh the problems the curses introduce. The curses usually even have a tiny upside.

View file

@ -0,0 +1,127 @@
---
title: Outsourcing my memory to Gum
relativeUrl: /blog/outsourcing-my-memory-to-gum
date: git Created
tags: feed
---
My memory is notoriously bad. I forgot what I ate today or whether I washed my hair. I walk into rooms and forget why. I tell friends stories they were themselves involved in.
You better believe that, when I return to some sort of web development project after several months, I've long since forgotten how to do anything with it. This is compounded by the fact that every tech stack has their own default way of doing things. For example, some npm project bootstrappers will create a script called `start` while others will create one called `develop`, both of which are used to start a local development server. I will sometimes add scripts for various types of deployment, which are different depending on the project, the tech stack it's on, where it's deployed, and how good I am at naming things on that day. 😅
# My Crappy Workaround
I usually work around these problems on Node-based projects by starting with `npm run` when I return to a project to get an overview of the project's scripts so I can understand how to jump in.
<img src="/images/blog/outsourcing-my-memory-to-gum/script-discovery.gif" alt='An animation of a terminal session. The user runs `npm run` to get a list of the available scripts in an npm project. The user then examines the output and types `npm run start` having chosen the script they want to run.' />
(Confession time: in truth, I `cat package.json`, but `npm run` is what I _should_ have been doing instead.)
This is cumbersome and clunky though. I'm manually looking at a file or at some output based on a file to figure out what options I have. Then, I manually run the option that does what I'm trying to do. The data that I'm looking at is already nicely structured in JSON, so it seems like a natural fit for the computer to handle the first part for me and just present me with options I can run directly. Now, let's see how to make that happen…
# A Cleaner Approach with Gum
That's when I stumbled upon [Charm's](https://charm.sh/blog/) [Gum](https://github.com/charmbracelet/gum). Gum is basically a UI component library for shell scripts. Gum has [a `choose` command](https://github.com/charmbracelet/gum?tab=readme-ov-file#choose) that outputs a handy option chooser component. This would be a great UI for my use case. I will need to pipe the available options into it and then run the result. Let's start putting the pieces together.
I would like a single command I can run from any npm project. To accomplish this, I'll write a function into my shell's config. In my case, that's `~/.zshrc`. I call the function `donpm` which you can interpret as either "do npm" or "Don P.M." who I imagine as a cool person with aviator shades who only comes out at night (yes, even with the shades; they're _that_ cool) and can figure out exactly how all your npm projects work. 😎
```bash
# loads of other stuff
function donpm() {
$SELECTION=(jq -r '.scripts|to_entries[]|((.key))' package.json | gum choose)
npm run $SELECTION
}
# loads more stuff
```
This function has a dependency on `jq`. I could probably do this with `sed`, but it's easier with `jq` and this is just for me to run on my system so I'm going to use it. With `jq`, I'm reading the contents of `package.json` and parsing out the scripts. I pipe that over to `gum choose` to display the chooser component.
`gum` will spit back the selection. I need to capture that so I can run the selected command, hence assigning the result to a variable (`SELECTION`).
Once I have that captured, I can then run `npm run $SELECTION` to interpolate the selected command into my `npm run`. (I tried piping to this, but that didn't seem to work. Maybe there's a fancier, better way, but this one seems to work well enough… well, almost. 😉)
# Adding an Option
This is cool and it (mostly) works, but I want to add a few features. First, I'd like to add a "Cancel" option to make it easy for a user (i.e., me) to change their mind and do nothing.
```bash
# loads of other stuff
function donpm() {
OPTIONS=$(jq -r '.scripts|to_entries[]|((.key))' package.json)
OPTIONS+="\n🛑 Cancel"
SELECTION=$(echo $OPTIONS | gum choose --header "Choose a script to run")
if [[ "$SELECTION" == "🛑 Cancel" ]]; then
gum log --level info "Execution was cancelled"
return 1
else
npm run $SELECTION
fi
}
# loads more stuff
```
Now, I've split things up a bit differently. I need to separate the steps of grabbing the scripts from `package.json` and piping them into `gum choose`. I'm doing this to give me the opportunity to add an option of my own. I capture to the `OPTIONS` variable and then add my "Cancel" option to that variable. Then I can echo the whole thing back to pipe it into `gum choose`.
This also requires me to make a special case: if the selection is the "Cancel" option, I log out a message (using `gum log`) and exit with a 1 since nothing was executed here. Not sure if that's the right move since the command was actually "successful" in doing what the user wanted, which happened to be nothing, but it should be fine. In any other case, I run the selection through `npm run` just like before.
# Yeah, but What Happens When I REALLY Forget?
It's mostly good at this point, but there's one more key piece I want to get in here. This whole thing is about me forgetting. So, what happens if I think a project is an npm project and try to run `donpm` even though it isn't? Maybe it's a Python project or maybe I'm just in the directory where I keep scans of old video game magazines. Let's handle that.
```bash
# loads of other stuff
function donpm() {
if [ ! -f "package.json" ]; then
gum log --level error "package.json not found in the current directory"
return 1
fi
OPTIONS=$(jq -r '.scripts|to_entries[]|((.key))' package.json)
OPTIONS+="\n🛑 Cancel"
SELECTION=$(echo $OPTIONS | gum choose --header "Choose a script to run")
if [[ "$SELECTION" == "🛑 Cancel" ]]; then
gum log --level info "Execution was cancelled"
return 1
else
npm run $SELECTION
fi
}
# loads more stuff
```
This gives me some safety so I can fully forget almost everything I know and still at least get a solid error message out of this function.
# The Final Product
After all of these improvements, here's what my workflow looks like when I come back to a project I've forgotten everything I ever knew about:
<img src="/images/blog/outsourcing-my-memory-to-gum/donpm.gif" alt='An animation of a terminal session. The user runs `donpm` to get a list of the available scripts in an npm project with a caret pointing at the top option (`start`). The user examines the output and arrows down to the `build` command, pressing enter. The build command starts with some preliminary output.' />
# Can it Get Any Better Than This?
Well, yes, of course it can! What you're looking at is the function I'm using now, but I have some ideas for improvements I may make someday if motivation strikes:
- Add "descriptions" to each script in the form of the commands being run.
- Filter out the `pre` and `post` lifecycle hook scripts since these aren't usually invoked manually.
- Accept an optional argument of the script name. This would allow Don to entirely take the place of `npm run`, saving me two characters per script invocation if I happen to recall the script name I want to run! If the function gets an argument, just run the npm script named by that argument. If not, show the choices just like it does now.
Feel free to take those on yourself if you're one of those "students surpassing the teacher" types.
# Bonus: VHS
I spend a lot of time in the terminal, and since that's Charm's whole game, I poked around to see all the tools they have available. Another one I found intriguing aside from `gum` was [VHS](https://github.com/charmbracelet/vhs).
VHS lets you build programmatic GIF animations of terminal activity. No more screen recording the terminal emulator. Cool! So cool, in fact, I used it for the GIFs you've seen in this post.
If you want to see how these are defined, check out the code for the two that appear here:
- [`npm run` script discovery method `.tape`](https://codeberg.org/RadDevon/devon.lol/src/commit/fa056712d1d3f169c2f37b61b48bd628f753562e/images/blog/outsourcing-my-memory-to-gum/script-discovery.tape)
- [New method `.tape`](https://codeberg.org/RadDevon/devon.lol/src/commit/fa056712d1d3f169c2f37b61b48bd628f753562e/images/blog/outsourcing-my-memory-to-gum/donpm.tape)

View file

@ -9,25 +9,25 @@ These are my thoughts on some games I've played over the last few months, in no
# Spookware
![Screenshot of Spookware featuring the three skeleton player characters standing on the deck of a cruise ship](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/spookware.jpg)
![Screenshot of Spookware featuring the three skeleton player characters standing on the deck of a cruise ship](./src/blog/rapid-fire-game-reviews-holiday-2022/images/spookware.jpg)
The microgames of [WarioWare](https://www.igdb.com/games/warioware-inc-mega-microgames) paired with the cute and self-aware irreverence of [Undertale](https://www.igdb.com/games/undertale) (featuring skeletons just to complete the analogy). I really like the vibe here. The one surprising thing about the game is that a lot of it _isn't_ the WarioWare-style microgames. There's a old style adventure game bridging between the somewhat rare microgame segments. That part can be tedious. I'd like to see a sequel that de-emphasizes this aspect of the game and leans harder into the microgames. Still a lot of fun though. It had me laughing out loud.
# Neon White
![Screenshot of Neon White featuring the player character's first-person perspective on a giant bust statue on the left, a dark gray treasure chest with gold trim on the right, a spider-like demon standing next to a potted tree center, and a large white building just behind the demon with a red breakable wall on one of its faces](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/neon-white.jpg)
![Screenshot of Neon White featuring the player character's first-person perspective on a giant bust statue on the left, a dark gray treasure chest with gold trim on the right, a spider-like demon standing next to a potted tree center, and a large white building just behind the demon with a red breakable wall on one of its faces](./src/blog/rapid-fire-game-reviews-holiday-2022/images/neon-white.jpg)
One of my favorite things to do in a game is to refine my skill. I like to throw myself against a challenge over and over until I finally overcome it. I think a lot about an old PS2 game that I never hear anyone talk about anymore: [Stuntman](https://www.igdb.com/games/stuntman). You played a stunt driver going from movie to movie taking on-the-fly direction as you pulled the stunts needed for various movie scenes. I don't hear people talking about that game, but it was a favorite of mine. This is that but with an art style that screams "Japanese video game!" I'm pretty sure this _isn't_ Japanese, but it could pass. Lots of fun to be had here. I look forward to getting deeper into it and refining my times!
# Timespinner
![Screenshot of Timespinner featuring the player character at the bottom of stairs, backed by her small green dragon familiar, hitting a red enemy with a sword](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/timespinner.jpg)
![Screenshot of Timespinner featuring the player character at the bottom of stairs, backed by her small green dragon familiar, hitting a red enemy with a sword](./src/blog/rapid-fire-game-reviews-holiday-2022/images/timespinner.jpg)
More than any game I've tried, this game reminds me of [Symphony of the Night](https://www.igdb.com/games/castlevania-symphony-of-the-night). That's one of my favorites, so I'm excited to play more of this. It feels right in all the ways Symphony did.
# Teardown
![Screenshot of Teardown featuring a large yellow piece of construction machinery with a red arm being driven through the side of a red building. A light can be seen through the hole in the side of the building. A car is parked on the right and a truck with trailer on the left.](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/teardown.jpg)
![Screenshot of Teardown featuring a large yellow piece of construction machinery with a red arm being driven through the side of a red building. A light can be seen through the hole in the side of the building. A car is parked on the right and a truck with trailer on the left.](./src/blog/rapid-fire-game-reviews-holiday-2022/images/teardown.jpg)
The destruction is so cool. Not too sure about the game they've wrapped around it. It's neat, but setting up a route to race out of a level once I start destroying stuff wouldn't be my first choice of activity. I want to take my time and bask in the destruction.
@ -45,29 +45,29 @@ I just finished [Dark Pictures: Little Hope](https://www.igdb.com/games/the-dark
# Persona 5 Royal
![Screenshot of Person 5 Royal featuring the player character standing just inside the turnstiles in a Japanese train station. A group of three young women are standing and talking a few feet away.](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/persona-5.jpg)
![Screenshot of Person 5 Royal featuring the player character standing just inside the turnstiles in a Japanese train station. A group of three young women are standing and talking a few feet away.](./src/blog/rapid-fire-game-reviews-holiday-2022/images/persona-5.jpg)
Slick, stylish, and beautiful. Tedious and not very fun to play. A soundtrack that parks itself in your head well after the meter runs out.
# Delta Manifold
![Screenshot of Delta Manifold from the player character's perspective, looking down the barrel of a rectangular flat-shaded gun, aiming and firing at a large black humanoid figure with a triangular torso in a green environment covered with vines](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/delta-manifold.jpg)
![Screenshot of Delta Manifold from the player character's perspective, looking down the barrel of a rectangular flat-shaded gun, aiming and firing at a large black humanoid figure with a triangular torso in a green environment covered with vines](./src/blog/rapid-fire-game-reviews-holiday-2022/images/delta-manifold.jpg)
I wish I liked this one more, but it needs a lot of polish. Some better sign-posting would be nice too. I don't want literal signposts, but I need something more than the game is giving me to tell me what to do next. The levels are just random hallways and rooms connected together with tons of dead-ends. I can't tell if I'm missing something or if someone just banged these out really quick in Unity and left all the parts where they landed. The description on the game's Steam page says it wants to be [Metroid Prime](https://www.igdb.com/games/metroid-prime). I want it to be too, but it's not there yet.
# Dread Delusion and Lunacid
![Screenshot of Dread Delusion from the player character's perspective, at the top of steps approaching a doorway to a buiding. A tree is directly in front, and to the right, a giant pink moon with red wisps coming out of it, behind mountains and evergreen trees in the distance.](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/dread-delusion.jpg)
![Screenshot of Dread Delusion from the player character's perspective, at the top of steps approaching a doorway to a buiding. A tree is directly in front, and to the right, a giant pink moon with red wisps coming out of it, behind mountains and evergreen trees in the distance.](./src/blog/rapid-fire-game-reviews-holiday-2022/images/dread-delusion.jpg)
I'm lumping these together because they're both first-person RPGs that call out [King's Field](https://www.igdb.com/games/king-s-field) as an influence. Dread Delusion has a fun surreal art style but feels a bit more aimless. Both games have you wondering around a fair bit, but I felt the pain of it more in Dread Delusion. Something about the sparseness of the world and the same-ness of the environments I've been going through so far makes me feel this game is the thinner of the two, even though I'm pretty sure it's the one that has been "released" while Lunacid is still in early access. It's cool and I want to play more, but I'm not in love.
![Screenshot of Lunacid from the player character's perspective as they hold a sword, in a hallway in a tight catacomb with a slime-covered skeleton in front. Just beyond the skeleton, a bright yellow-green light floods in from a grate on the ceiling.](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/lunacid.jpg)
![Screenshot of Lunacid from the player character's perspective as they hold a sword, in a hallway in a tight catacomb with a slime-covered skeleton in front. Just beyond the skeleton, a bright yellow-green light floods in from a grate on the ceiling.](./src/blog/rapid-fire-game-reviews-holiday-2022/images/lunacid.jpg)
Lunacid feels different. There's something about the darkness of it. Everything is darker. I'm spending a lot of time in tight corridors. It's a lot different from the bright environments of Dread Delusion, and I like it. I feel like I'm really discovering in this game. I'm poking at walls and finding things the game wants me to think I wasn't supposed to find. Yesterday, I found an item that was very surprising, and I'm exciting to see how it fits into this game. When I level up in Dread Delusion, it doesn't really feel like anything has changed. In Lunacid, I feel like my character is actually progressing. There's a lot I'm excited about here.
# Immortality
![Screenshot of Immortality showing an actress on the left with large hoop earrings twirling her hair and looking at the clapper loader who stands at the right edge of the frame. The clapper loader is about to clap the clapper board which has the following text: "Minsky. Gino DeGiorgio Entertainment. Dir. John DURICK. INT/NIGHT. 7-20-70. 44A. 2." Three other actors stand just behind the clapper board looking at the actress on the left. The caption reads "Scene 44A, take two."](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/immortality.jpg)
![Screenshot of Immortality showing an actress on the left with large hoop earrings twirling her hair and looking at the clapper loader who stands at the right edge of the frame. The clapper loader is about to clap the clapper board which has the following text: "Minsky. Gino DeGiorgio Entertainment. Dir. John DURICK. INT/NIGHT. 7-20-70. 44A. 2." Three other actors stand just behind the clapper board looking at the actress on the left. The caption reads "Scene 44A, take two."](./src/blog/rapid-fire-game-reviews-holiday-2022/images/immortality.jpg)
I love what this game is in my head, but I'm not sold yet on what it is in reality. Because of the way I play games, I'm scared to death about the prospect of trying to come back to this game in four months when I remember I want to play more of it but _don't_ remember anything that happened in it. I hope the game has a mechanism to ease me back in at that point, but very few games actually do have something like that. When that day comes, I'm probably going to feel like I need to restart... and there's zero chance I actually do that. The anxiety about the way this game will fit into my life fills me with dread even while I've enjoyed my time with the game so far.
@ -75,13 +75,13 @@ I love what this game is in my head, but I'm not sold yet on what it is in reali
# Haak
![Screenshot of Haak showing the player character, a black figure with a round head and oblong oblique-angled yellow eyes. The character wears a blue cape and stands on a concrete interstate bridge in front of a large soldier wearing a uniform jumpsuit and a single-piece goggle and holding a large firearm. The soldier guards a hollowed-out bus that has been fashioned as a continuation of the bridge, with spikes on top and a sign that says "NEO." The bridge has spikes in the near background. Further in the background, we see a dilapidated billboard with a woman holding a drink and smiling next to foreign text, a watch tower, and a large building in disrepair. The sky is a pink orange.](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/haak.jpg)
![Screenshot of Haak showing the player character, a black figure with a round head and oblong oblique-angled yellow eyes. The character wears a blue cape and stands on a concrete interstate bridge in front of a large soldier wearing a uniform jumpsuit and a single-piece goggle and holding a large firearm. The soldier guards a hollowed-out bus that has been fashioned as a continuation of the bridge, with spikes on top and a sign that says "NEO." The bridge has spikes in the near background. Further in the background, we see a dilapidated billboard with a woman holding a drink and smiling next to foreign text, a watch tower, and a large building in disrepair. The sky is a pink orange.](./src/blog/rapid-fire-game-reviews-holiday-2022/images/haak.jpg)
This Metroidvania is just really well executed. Moving around feels great. The unlockable abilities are paced well, and I haven't felt stuck so far. Just a nice experience with fun art and a cute cat helping you find your way, at least in the early parts.
# Midnight Fight Express
![Screenshot of Midnight Fight Express showing the main character wearing black pants, black shoes, a black jacket, and a white shirt. He stands on top of a train running next to an empty track. He reaches back to punch one of several opponents dressed in colorful outfits as another group approaches from behind, one baring a knife.](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/midnight-fight-express.jpg)
![Screenshot of Midnight Fight Express showing the main character wearing black pants, black shoes, a black jacket, and a white shirt. He stands on top of a train running next to an empty track. He reaches back to punch one of several opponents dressed in colorful outfits as another group approaches from behind, one baring a knife.](./src/blog/rapid-fire-game-reviews-holiday-2022/images/midnight-fight-express.jpg)
The [Arkham Asylum](https://www.igdb.com/games/batman-arkham-asylum) combat works in an isometric game. I thought this was going to be great, but I think it will be ultimately forgettable. I nearly forgot to include it here!
@ -95,7 +95,7 @@ A flashy action game that's a bit awkward to play. Maybe it would get better if
# Pentiment
![Screenshot of Pentiment showing the main character Andreas with long light-brown hair wearing a red cap, a red tunic over an off-white shirt and blue pants. He is speaking to a man with gray hair, mustache, and beard wearing an off-white shirt, gray pants, and a maroon apron, standing with his sheep next to a blacksmith's anvil and forge. Tongs and horseshoes hang on a rack in front of the forge. The man's text box says, "Do you have a moment to lend me a hand?" in a casual script. Andreas's text box shows two response options written in a more formal font: "Of course" and "I'm already late to the abbey"](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/pentiment.jpg)
![Screenshot of Pentiment showing the main character Andreas with long light-brown hair wearing a red cap, a red tunic over an off-white shirt and blue pants. He is speaking to a man with gray hair, mustache, and beard wearing an off-white shirt, gray pants, and a maroon apron, standing with his sheep next to a blacksmith's anvil and forge. Tongs and horseshoes hang on a rack in front of the forge. The man's text box says, "Do you have a moment to lend me a hand?" in a casual script. Andreas's text box shows two response options written in a more formal font: "Of course" and "I'm already late to the abbey"](./src/blog/rapid-fire-game-reviews-holiday-2022/images/pentiment.jpg)
This is another one that I'm in love with the idea of but not yet the game. I'll give it some more time. I've just played a few minutes at this point.
@ -111,6 +111,6 @@ The worst thing about Phoenotopia is that I can neither pronounce nor spell its
# Betrayal at Club Low
![Screenshot of Betrayal at Club Low showing the main character — a blue man with glowing blue eyes wearing a pink and gray flannel over a yellow button-up shirt with orange collar, tan denim pants, and black shoes. He has a red hat with a slice of pizza on it and a red pizza bag on his back. He stands in a room with purple walls and wood flooring. On one wall hangs a blue glowing shovel in a red frame. On another wall, tusks of a large animal that glow blue and have lights on each of the tusks' tips. To the main character's right is a bin of yellow tennis balls. To his left, a series of security monitors on a desk, all showing a tennis match. A man wearing a brown jacket, black pants, and brown shoes sits at the desk with two empty drink cans in front of him along with a tennis racket and a custom computer keyboard with green, red, orange, yellow, and brown keys.](./assets/images/blog/rapid-fire-game-reviews-holiday-2022/betrayal.jpg)
![Screenshot of Betrayal at Club Low showing the main character — a blue man with glowing blue eyes wearing a pink and gray flannel over a yellow button-up shirt with orange collar, tan denim pants, and black shoes. He has a red hat with a slice of pizza on it and a red pizza bag on his back. He stands in a room with purple walls and wood flooring. On one wall hangs a blue glowing shovel in a red frame. On another wall, tusks of a large animal that glow blue and have lights on each of the tusks' tips. To the main character's right is a bin of yellow tennis balls. To his left, a series of security monitors on a desk, all showing a tennis match. A man wearing a brown jacket, black pants, and brown shoes sits at the desk with two empty drink cans in front of him along with a tennis racket and a custom computer keyboard with green, red, orange, yellow, and brown keys.](./src/blog/rapid-fire-game-reviews-holiday-2022/images/betrayal.jpg)
This one was a surprise. I went in expecting nothing. Actually, based on the... scrappiness of the interface, I expected this to be janky. It isn't. It's simple but polished. It's a point-and-click adventure with some tabletop RPG-style dice-rolling mechanics laid on top. The dice rolling is surprisingly deep. You're allowed two re-rolls per action, and you can select which dice to re-roll. Outcomes on the dice can add other rules as well like allowing you to re-roll opponent dice or swap results with your opponent. The art style is funky. It almost looks like it doesn't all belong together, but it works. If you want something quirky and charming as heck, this is a good choice.

View file

@ -0,0 +1,12 @@
---
title: "Rideshare Renegades: My One-Page RPG Jam 2024 Entry"
relativeUrl: /blog/rideshare-renegades
date: git Created
tags: feed
---
<a href="https://raddevon.itch.io/rideshare-renegades">Rideshare Renegades</a> is my first ever TTRPG. It's an entry for <a href="https://itch.io/jam/one-page-rpg-jam-2024">2024's One-Page RPG Jam</a>. In it, you play as someone who needs to make a living with ridesharing but doesn't own a car. Instead, you'll ferry your passengers around via bus while trying to figure out what level and kind of social interaction they would like. It's a very light story game and won't be great for long-term play. (Not a ton here in the way of long-term progression.) That said, my partner and I still had a fun time playing it. Maybe you will too!
<iframe src="https://itch.io/embed/2876627?bg_color=222222&amp;fg_color=eeeeee&amp;border_color=363636" width="552" height="167" frameborder="0"><a href="https://raddevon.itch.io/rideshare-renegades">Rideshare Renegades by raddevon</a></iframe>
Like I said, this is my first TTRPG, so I welcome your constructive feedback, either through the itch.io comments or <a href="https://techhub.social/@raddevon">on Mastodon</a>.

View file

@ -10,13 +10,13 @@ It's hard to overstate the influence of [Minecraft](https://www.igdb.com/games/m
You could make a case for plenty of other games being the most influential too. [Super Mario Brothers](https://www.igdb.com/games/super-mario-bros) showed games could be more than just score chases. [Pitfall](https://www.igdb.com/games/pitfall) opened the door for developers not employed by the console maker to make games. [Mario 64](https://www.igdb.com/games/super-mario-64) was the template for 3D platforming. [Rogue](https://www.igdb.com/games/rogue) has a whole modern genre named after it! But in spite of everything these games and Minecraft brought to the table, none of them is the most influential game ever. Instead, that title belongs to another game with Minecraft's pixelly graphics and a first-person perspective. It's a game that, like Minecraft, was PC-first and created incredible longevity by fostering an enthusiastic modding community. It's a game that planted the seeds for some of the innovations Minecraft brought forward.
![The Quake box art consisting of the title at the top written in white with the stylized 'Q' above a large brown stylized 'Q' logo, all on black](./assets/images/blog/the-most-influential-game-in-history/quake-box.png)
![The Quake box art consisting of the title at the top written in white with the stylized 'Q' above a large brown stylized 'Q' logo, all on black](./src/blog/the-most-influential-game-in-history/images/quake-box.png)
[Quake](https://www.igdb.com/games/quake) was the Minecraft of its day, and its day was about 15 years before the release of Minecraft. Let's take a look at the staggering number of innovations Quake brought gamers in the mid 90s.
# Modding
![A screenshot of the Arcane Dimensions Quake mode showing a red brick wall on the left with an arch cut into it. Beyond the arch is a tall and narrow yellow stained glass window with repeated divided circles and to the right of that, another archway made of a tan colored concrete. Directly ahead in the image is a white broken archway leading to a churchy-looking room containing a portal. There is a torch on the right side wall.](./assets/images/blog/the-most-influential-game-in-history/arcane-dimensions.jpg)
![A screenshot of the Arcane Dimensions Quake mode showing a red brick wall on the left with an arch cut into it. Beyond the arch is a tall and narrow yellow stained glass window with repeated divided circles and to the right of that, another archway made of a tan colored concrete. Directly ahead in the image is a white broken archway leading to a churchy-looking room containing a portal. There is a torch on the right side wall.](./src/blog/the-most-influential-game-in-history/images/arcane-dimensions.jpg)
Modding was around before Quake, but it came of age with Quake. Many community map and mod makers were ultimately hired as level designers and game developers. Valve recruited early employees out of the community and brought the team behind Quake mod Team Fortress in-house to build its sequel on Half-Life… which was itself built on the Quake 2 engine.
@ -40,7 +40,7 @@ Since the game included a few demos, you could run your benchmark against one of
# Speedrunning
![The Quake Done Quick logo consisting of an overhead wireframe of a Quake map with an arrow drawn through it to indicate a run path starting at an 'X' and terminating at another 'X'. Superimposed on the map are actual in-game rocket launcher graphics showing the location of rocket launcher pickups in the map. A shambler graphic is overlaid near the end of the run path, presumably showing the location of a shambler enemy in the level. The “Quake guy” is shown in the lower right of the logo holding a stopwatch in his right hand and a trophy in his left. The words “Quake done Quick” with stylized 'Q's appear to his left.](./assets/images/blog/the-most-influential-game-in-history/quake-done-quick.jpg)
![The Quake Done Quick logo consisting of an overhead wireframe of a Quake map with an arrow drawn through it to indicate a run path starting at an 'X' and terminating at another 'X'. Superimposed on the map are actual in-game rocket launcher graphics showing the location of rocket launcher pickups in the map. A shambler graphic is overlaid near the end of the run path, presumably showing the location of a shambler enemy in the level. The “Quake guy” is shown in the lower right of the logo holding a stopwatch in his right hand and a trophy in his left. The words “Quake done Quick” with stylized 'Q's appear to his left.](./src/blog/the-most-influential-game-in-history/images/quake-done-quick.jpg)
Quakes demo file format was great for watching others compete in deathmatch or capture the flag matches, but it was also used to records speedruns through the games levels.
@ -68,7 +68,7 @@ This was the dawn of the WASD + mouse control scheme that is standard among firs
Before Quake, multiplayer gameplay on PC required either a game client that could dial up directly to another users modem or entering another players IP address in the game client. Enter QSpy, a Quake server browser that made it easier to find and connect to multiplayer games.
![Screenshot of the QuakeSpy application showing the menubar and toolbar on top, a list of source categories on the left (including id official servers divided by game mode, PlanetQuake servers, best.com, and Australian servers), a series of tabs just below the toolbar and right of the sidebar (with options “All Servers,” “Passed Filters,” “Filtered Out,” “Favorites,” and “Never Ping”), a list of servers below the tabs (with columns for server name, ping, address, player count/capacity, and game), a list of the selected server's players on the left side below the server list, and a list of the server's options to the right of that](./assets/images/blog/the-most-influential-game-in-history/quakespy.jpg)
![Screenshot of the QuakeSpy application showing the menubar and toolbar on top, a list of source categories on the left (including id official servers divided by game mode, PlanetQuake servers, best.com, and Australian servers), a series of tabs just below the toolbar and right of the sidebar (with options “All Servers,” “Passed Filters,” “Filtered Out,” “Favorites,” and “Never Ping”), a list of servers below the tabs (with columns for server name, ping, address, player count/capacity, and game), a list of the selected server's players on the left side below the server list, and a list of the server's options to the right of that](./src/blog/the-most-influential-game-in-history/images/quakespy.jpg)
Side note: QSpy later became QuakeSpy and then [GameSpy](https://en.wikipedia.org/wiki/GameSpy), which eventually became an editorial site that operated until 2013.

View file

@ -7,6 +7,6 @@ date: git Last Modified
**Last updated {{ page.date | formatDatetimeForHumans }}**
This site now both [sends and receives WebMentions](/blog/implementing-webmentions-is-a-pain)!
Maintaining my [YouTube channel list](/lists/youtube-channels) was getting too tedious, so I wrote some code to [maintain it automatically for me](/blog/automating-my-youtube-channel-list)!
The Arc browser scares me. All the AI features and their insistence on referring to users as "members" just makes me feel like they're poised to make changes I couldn't live with. I decided to get ahead of them and [find an alternative browser](/blog/web-browser-review-06-2024).
I'm still planning to write a series of posts on how to enjoy different things in 2024 (likely 2025 since I'll post them in or near that year), but I decided to take this little detour first just to get that repetitive task off my plate.

View file

@ -3,386 +3,27 @@ title: YouTube Channels
layout: article.njk
date: git Last Modified
tags: list
templateEngineOverride: njk,md
---
Most of the YouTube channels I subscribe to, categorized. I'll provide descriptions of channels that need it.
Most of the YouTube channels I subscribe to, categorized. This list is now automated! You can [learn how it's implemented](/blog/automating-my-youtube-channel-list/) and use the code yourself if you use FreeTube and have an Eleventy site.
Recent updates reflect some changes in my obsessions. I'm pretty much always interested in video games, but other interests like tabletop games, anime, cycling, etc are very cyclical for me. This update reflects lost enthusiasm for cycling after I failed miserably to own an ebike in an apartment with stairs and with tabletop RPGs after I just burned out on them for the time being.
I took a long, hard look at some of my other subscriptions and pruned many of the aspirational subscriptions (i.e., channels I subscribed to thinking, "I should really be watching this…" but then I never actually did 😅). I also got rid of a few channels that haven't added videos in a while, although I kept some others, my boundless optimism convincing me they might be revived someday.
## Key
- 🆕- New addition
- 👀- Instant watch
- 🤌- Online video virtuoso
- 😿- Seemingly (and sadly) defunct
- 😴- Good for sleepytime (This doesn't mean the content is bad, just that it's relaxing.)
- ⏱️- Quick hits
- ☠️- Removed (I'll keep removed channels here for one update cycle after removing.)
- 😌- Good for sleepytime (This doesn't mean the content is bad, just that it's relaxing.)
## Bikes
- [Bike Shop Girl](https://www.youtube.com/channel/UCoga_NxydHxLWszipSWfJsA)- Teaches you about bike shopping and recommends accessories.
- [Shifter](https://www.youtube.com/channel/UC9-ZlLTioqMZowRLZHscozw)- Issues around biking for transportation.
- [ElectricBikeReview.com](https://www.youtube.com/channel/UCcJGe_WM6xKnB_J8ynIYx2A)
- [The New Wheel Electric Bikes](https://www.youtube.com/channel/UCP7dp9QxGSNvk3vRjlkHfWw)- Reviews of electric bikes by charming people.
{% for category in freetubeCategories %}
## {{ category.name }}
## Crafting
- 🤌😴 [52 Miniatures](https://www.youtube.com/channel/UCEVCtQ1hTAhbyL8--6vyaHw)- Makes magic with miniature models.
- [Bobby Fingers](https://www.youtube.com/channel/UCXKCiTquPMavBqgXgrM9mBg)- Makes detailed dioramas and buries them for viewers to find.
- 😴 [Boylei Hobby Time](https://www.youtube.com/channel/UCLLHnS6pKU4GdGEZjysogqQ)- Makes cool diaoramas.
- [ClayClaim](https://www.youtube.com/channel/UCCotQ9x_MPdw3fwEpCxlbnQ)- Watch a cool dude with great energy make incredible clay models of Fortnite characters or other pop culture characters and scenes.
- 🤌😴 [TheCrafsMan SteadyCraftin](https://www.youtube.com/channel/UCzsjHlc0WRwZYwlinsmtM4w)- Love this guy's voice, and he's an extremely talented crafter too. You get a feeling you're getting the real person in videos even though he obviously pays a lot of attention to the craft of the videos themselves.
- 🤌😴 [Craftastrophe](https://www.youtube.com/channel/UCkoIXAz16GztHi1kbGzm6Cw)- Makes all sorts of things and walks you through them. It's not quite that straightforward though: more surprises within.
<ul>
{% for subscription in category.subscriptions %}
<li><a href="https://www.youtube.com/channel/{{ subscription.id }}">{% if subscription.tags %}{{ subscription.tags }} {% endif %}{{ subscription.name }}</a></li>
{% endfor %}
</ul>
## Funny
- 😿 [Abby Dearest](https://www.youtube.com/channel/UCjvgGPQjIkBvxGiAO6yYipQ)- Like a children's show that grew up slightly damaged.
- [brian david gilbert](https://www.youtube.com/channel/UCakAg8hC_RFJm4RI3DlD7SA)- Funny songs (and occasionally other things).
- ☠️ [The Daily Show](https://www.youtube.com/channel/UCwWhs_6x42TyRM4Wstoq8HA) News, but it's funny because it's sad… also because it's funny.
- [Dan Ryckert](https://www.youtube.com/channel/UCoZnm-beM69I2Vcz3LtdXUQ)- This guy is a real goofball and he plays video games. The humor is really the thing though, so it goes here instead of in "Video Games."
- ☠️ [DeepBlueInk](https://www.youtube.com/channel/UCNxrB1_wm8FCy_-VFB91UmQ)- I subscribe for the *My Brother, My Brother, and Me* animations.
- [The McElroy Family](https://www.youtube.com/channel/UC6k_GngLDtxbkUlZOq6_h5g)- The Monster Factory series is a laugh a minute… maybe even more frequently.
## Japan
- 🤌 [Abroad in Japan](https://www.youtube.com/channel/UCHL9bfHTxCMi-7vfxQ-AYtg)- This guy shows you cool things about Japan, but he does it with an artistry that is pretty incredible. He's hilarious and a natural storyteller. Production value is off the charts!
- ☠️ [Life Where I'm From](https://www.youtube.com/channel/UCqwxJts-6yF33rupyF_DCsA)- Man and his family share what family life is like in Japan.
- [Matt vs Japan](https://www.youtube.com/channel/UCpf4BknRWAjb_oYIHoMDGVg)- This guy learned to speak Japanese while in the US mostly by watching anime.
- [Micaela ミカエラ](https://www.youtube.com/channel/UCLi8qtd3QLvXCZLyobiodiw)- A fun English-speaking vlogger in Japan.
- [Rachel & Jun's Adventures!](https://www.youtube.com/channel/UCSzHO_V894KyTDw3UgZS7gg)- A cute couple living in Japan and sharing bits of their life there.
- [Sharmeleon](https://www.youtube.com/channel/UCm8xNi3kuBHE99QH-N_VJVg)- A charming English-speaking vlogger living in Japan.
## Pop Culture
- [12tone](https://www.youtube.com/channel/UCTUtqcDkzw7bisadh6AOx5w)- Explains why popular songs work in an accessible way.
- [Afterthoughts](https://www.youtube.com/channel/UCt9zpXoM1RqiC9u4YYuVP5Q)- Media critiques.
- 🤌 [Anthony Vincent](https://www.youtube.com/channel/UCm6r_b2K5jn1JGkwDcwJXrQ)- Talented musician who plays popular songs in the styles of different artists.
- [Big Joel](https://www.youtube.com/channel/UCaN8DZdc8EHo5y1LsQWMiig)- Critiques of TV and movies.
- [The Cursed Judge](https://www.youtube.com/channel/UCTDWASrT-T6wMBcZU4IXCKQ)- Critiques of popular media including video games and TV.
- [Defunctland](https://www.youtube.com/channel/UCVo63lbKHjC04KqYhwSZ_Pg)- Features theme parks, TV shows, and products that used to be but are no longer.
- [Eddache](https://www.youtube.com/channel/UC1jyFTfku6mjXIXL_HwRtlA)- Essays about popular media — mostly retro children's media.
- 😿 [Get In The Robot](https://www.youtube.com/channel/UCcU3qwLQ4E4t1AeCCkZg5dw)- Fun anime videos.
- [Good Blood](https://www.youtube.com/channel/UC55OV4HSSKJEthG4ulsKkyw)- Infrequent pop culture essays.
- [GTV Japan](https://www.youtube.com/channel/UCmpaIXvID-FsN5xsUNolYAw)- Videos about Japanese video games and other media.
- 👀 [In Praise of Shadows](https://www.youtube.com/channel/UCdPPmAd9qlG80qeSm74-eww)- Thoughtful criticism of horror media.
- 👀 [Izzzyzzz](https://www.youtube.com/channel/UCWyRlMktpKbfefqBQk8U6Nw)- Explores 2000s youth and teen culture. Their series on The Sims is great!
- 🤌 [Mother's Basement](https://www.youtube.com/channel/UCBs2Y3i14e1NWQxOGliatmg)- Anime reviews. Really good stuff!
- [Michael Saba](https://www.youtube.com/channel/UCJQbC48bgZIVq2oklvofKMg)- Essays about games, TV, movies, anime, and sometimes where those intersect with the rest of the world.
- [PostmodernJukebox](https://www.youtube.com/channel/UCORIeT1hk6tYBuntEXsguLg)- Popular music remade in older styles.
- [PushingUpRoses](https://www.youtube.com/channel/UCCTNXqhWPba9Xh8gx0EKOtQ)- A lovely person who reviews episodes of *Murder She Wrote* and *Are You Afraid of the Dark*, and occasionally, point-and-click adventure games. Also sometimes ventures into mental health topics.
- [Ray Mona](https://www.youtube.com/channel/UC7GWq_TBvJKWLFIb2eLp-bw)- Searches for lost media and shares the story of the search.
- 😿 [Screen Therapy](https://www.youtube.com/channel/UCc4RYZ47ZT4CB9w5GomTjpA)- Media criticism from a perspective of psychology.
- 🤌 [Secret Galaxy](https://www.youtube.com/channel/UCjoe3Qo_DymYyBR6X9VxFjQ)- If you were a child in the 80s or 90s, there's plenty of nostalgia for you here. Documentaries of children's toys and TV from the era.
- [Stoked](https://www.youtube.com/channel/UCP7u8CHMISOGkHqyTOdr-Tg)- Video games, TV, movies, and tech from around Y2K.
- 👀🤌 [Super Eyepatch Wolf](https://www.youtube.com/channel/UCtGoikgbxP4F3rgI9PldI9g)- Every video has a compelling angle, and he tells the story deftly. Wrestling, video games, TV, anime… he will make you fall in love with all of them.
- [TyFrom99](https://www.youtube.com/channel/UClqS6uUWCZRgA8hacOKRjLA)- Media analysis from a Gen Z perspective.
- [Under The Scope](https://www.youtube.com/channel/UCI91jQdeMzuQRgg4VOSZZmw)- Videos about anime.
- [What's So Great About That?](https://www.youtube.com/channel/UC3g8YdblbqlUAKEeAJbzMYw)- Essays centered around games, TV, and movies.
- [Wisecrack](https://www.youtube.com/channel/UC6-ymYjG0SU0jUWnWh9ZzEQ)- Pop culture + philosophy.
## Software
- [Curtis McHale](https://www.youtube.com/channel/UCRaKe2vkmTyTT8lG4lbkInA)- Productivity videos, with a focus on personal knowledge management with [Obsidian](https://obsidian.md).
- [A Better Computer](https://www.youtube.com/channel/UCGYdWR8QUYn88lG0PBeJQ_g)- Loads of channels cover productivity software, but this is the only one who consistently shows me things I didn't know about.
- [The Browser Company](https://www.youtube.com/channel/UCT5qXmLacW_a4DE-3EgeOiQ)- Makers of the Arc web browser. They seem to love the web, and their videos reflect that. They also give updates on their browser here.
- ☠️ [DistroTube](https://www.youtube.com/channel/UCVls1GmFKf6WlTraIb_IaJg)- Entertaining videos about Linux, including explorations of distros.
- [InfinitelyGalactic](https://www.youtube.com/channel/UC3jSNmKWYA04R47fDcc1ImA)- Linux how-tos and explorations of distros.
- [The Linux Experiment](https://www.youtube.com/channel/UC5UAwBUum7CPN5buc-_N1Fw)- News and commentary about Linux.
- [Linux For Everyone](https://www.youtube.com/channel/UCd4XwUn2Lure2NHHjukoCwA)- Linux hot-to videos.
## Tabletop Games
- [A.A. Voigt](https://www.youtube.com/channel/UChNydqier_ae-EfveCrGy7w)- Tabletop RPG reviews with rich context.
- [Actualol](https://www.youtube.com/channel/UCO-hn9MJOu7pOUdGSabKGvA)- Solid videos for discovering board games. Most videos share a number of different games around a single theme.
- [Dave Thaumavore RPG Reviews](https://www.youtube.com/channel/UCbIl96w4kNeK_5HZrQWS9oA)
- [Dicebreaker](https://www.youtube.com/channel/UC0jMXccxfvnwXvTpngFwbNA)- A bunch of affable British folks tell you about new and upcoming board games and tabletop RPGs.
- [The Gaming Table](https://www.youtube.com/channel/UC3slaCerLxTV6EdfqM7lxXw)- Tabletop RPG reviews.
- [geek gamers](https://www.youtube.com/channel/UCLnDxuZE6qWwWxZCN9y8JQA)- Focuses on solo tabletop RPG play, which I find fascinating.
- 🤌 [No Pun Included](https://www.youtube.com/channel/UCtU-oQXFKUMFvhunPrx7U-w)- Wonderful, funny reviews of tabletop games.
- [Polyhedron](https://www.youtube.com/channel/UCHN5XTgW2biSG9pBuRZKbTQ)- Reviews of tabletop RPGs.
- 🤌 [Shut Up & Sit Down](https://www.youtube.com/channel/UCyRhIGDUKdIOw07Pd8pHxCw)- More funny tabletop game reviews.
- 😴 [Stoneaxe Tabletop Gaming](https://www.youtube.com/channel/UCgkaAultW434mSjjAcKoVJw)- Plays RPGs solo
- [Zee Bashew](https://www.youtube.com/channel/UCCXR2kCo7Lcw_BKwWxo09kw)- Animated stories from and explainers about tabletop role playing.
## Tech
- [The 8-Bit Guy](https://www.youtube.com/channel/UC8uT9cgJorJPWu7ITLGo9Ww)- Fun videos about old technology. Sometimes does restorations.
- [Cathode Ray Dude [CRD]](https://www.youtube.com/channel/UCXnNibvR_YIdyPs8PZIBoEw)- Deep dives on retro tech.
- [Christopher Lawley](https://www.youtube.com/channel/UC8raOG7HXJoCUygx219fU4A)- Tech videos with an Apple focus.
- 🤌 [Dave2D](https://www.youtube.com/channel/UCVYamHliCI9rw1tHR1xbkfw)- Tech reviewer with a focus on gaming laptops. Insightful and has great charisma.
- [ETA PRIME](https://www.youtube.com/channel/UC_0CVCfC_3iuHqmyClu59Uw)- Tests hardware performance with emulators, with a focus on handhelds and small form-factor PCs and SBCs (single-board computers).
- [LGR](https://www.youtube.com/channel/UCLx053rWZxCiYWsBETgdKrQ)- Retro tech channel. His mailbag videos are great because you get to see and learn about lots of obscure retro hardware.
- 🆕 [Michael MJD](https://www.youtube.com/channel/UCS-WzPVpAAli-1IfEG2lN8A)- Retro technology, software, and web.
- 🤌 [MKBHD](https://www.youtube.com/channel/UCBJycsmduvYEL83R_U4JriQ)- Smart analysis of gadgets.
- [Rene Ritchie](https://www.youtube.com/channel/UCLBHPoY3NugnZYURxln3fKQ)- Tech videos with a focus on Apple.
- [Retro Recipes](https://www.youtube.com/channel/UC6gARF3ICgaLfs3o2znuqXA)- Retro tech videos.
- [Straszfilms](https://www.youtube.com/channel/UCOYLfW5Mi-1Iwdt7B1hB4pw)- Videos about VR and the metaverse.
- 👀 [suckerpinch](https://www.youtube.com/channel/UC3azLjQuz9s5qk76KEXaTvA)- Does things with computers and technology that you really aren't supposed to do… but I'm really glad they do it anyway.
- [TechDweeb](https://www.youtube.com/channel/UCgRaK4A7yi4ZELCLUjdP_pg)- Retro gaming handhelds and other gaming hardware. They have quite a distinctive voice.
- [TechHut](https://www.youtube.com/channel/UCjSEJkpGbcZhvo0lr-44X_w)- Videos about Linux, self-hosting, and gaming.
- [Techkhamun](https://www.youtube.com/channel/UCxaHhiSy9I6pce8JKafh3Sw)- Tech reviews with an Apple focus.
- [Techmoan](https://www.youtube.com/channel/UC5I2hjZYiW9gZPVkvzM8_Cw)- If learning about old gadgets sounds like fun, this is your guy.
- [The Verge](https://www.youtube.com/channel/UCddiUEpeqJcYeBxX1IVBKvQ)- Technology and the culture that orbits around it.
- [VWestlife](https://www.youtube.com/channel/UC1ydE9gDHTdvbNVIgEKIKzw)- Retro tech videos.
## Urbanism
- [Adam Something](https://www.youtube.com/channel/UCcvfHa-GHSOHFAjU0-Ie57A)- Critiques of modern society, particularly urban planning.
- [Alan Fisher](https://www.youtube.com/channel/UC-LM91jkqJdWFvm9B5G-w7Q)- Focuses on transportation.
- [Cities 4 People](https://www.youtube.com/channel/UCPGPv4DYBevHMe6NSEdbv8w)- Shares good examples of urbanism in North America.
- [City Beautiful](https://www.youtube.com/channel/UCGc8ZVCsrR3dAuhvUbkbToQ)- High quality videos about urban planning. He goes around the country and shows great examples.
- [City Geek](https://www.youtube.com/channel/UCthIMTYTAH45pH9BgVZEY0w)- Each video gives a quick overview of a city.
- 👀🤌 [CityNerd](https://www.youtube.com/channel/UCfgtNfWCtsLKutY-BHzIb9Q)- Great themed lists of North American cities. His delivery, as if he's been swimming up the urban planning stream for 40 years, is perfect.
- 👀 [Not Just Bikes](https://www.youtube.com/channel/UC0intLFzLaudFG-xAvUEO-A)- He hated North American urban planning so much that he moved his family to the Netherlands. Now, he makes videos about urbanism.
- [Oh The Urbanity!](https://www.youtube.com/channel/UCN5CBM1NkqDYAHgS-AbgGHA)- Canadian duo exploring good urbanism in North America.
- [Peter Davies](https://www.youtube.com/channel/UCVo8Tg95k8NmmlOBf-GwvJA)- Has started a series around building a city in Cities Skylines without car traffic. Cool premise!
- [Strong Towns](https://www.youtube.com/channel/UCTeYrzSQ3YCp3RovGH4y8Ew)- A movement to support "a model of development that allows America's cities, towns and neighborhoods to become financially strong and resilient."
- [Thomas Y](https://www.youtube.com/channel/UCpwbkZqdyROeDMy40CPshsg)- Videos pushing back against North American urban planning.
## Video Games
- ⏱️ [60 Minutes in 60 Seconds](https://www.youtube.com/channel/UCgy43c3YLaRKo_fiW6_tFUw)- One minute videos, each covering the first hour of a game. Cool concept, and full of fun puns. I could do without the "you know what to do" at the end of each video.
- 👀 [A Critical Hit! | "Critical Kate" Willært](https://www.youtube.com/channel/UCPqeWdb-LGtPXeVXNoh-iqA)- Documentaries with a wonderfully unique perspective. Just reading the video titles makes my eyes go big with excitement.
- 👀🤌 [Action Button](https://www.youtube.com/channel/UCjKSoJlPgcK6BmoSqXpj5xQ)- His reviews are many hours long… and I will watch every second of them, starting as soon as they are released. He's hilarious, but not the way a stand-up comedian is hilarious, and his reviews are filtered heavily through his life experience. Incredible stuff. I hope I someday create something as awesome as any one of his reviews.
- [Adam Millard - The Architect of Games](https://www.youtube.com/channel/UCY3A_5R_m3PXCn5XDhvBBsg)- Thoughtful essays about game design.
- [AesirAesthetics](https://www.youtube.com/channel/UC3gqsroAUrKCaeK0Eu3iWBg)- Retrospectives on CRPGs, ARPGs, and some other games.
- 👀🤌 [Ahoy](https://www.youtube.com/channel/UCE1jXbVAGJQEORz9nZqb5bQ)- Incredibly well-produced documentaries that are all too rare.
- [AI and Games](https://www.youtube.com/channel/UCov_51F0betb6hJ6Gumxg3Q)
- [ambiguousamphibian](https://www.youtube.com/channel/UCSDiMahT5qDCjoWtzruztkw)- Makes their own fun in sandbox games by adding their own wild restrictions.
- [Arcade Archive](https://www.youtube.com/channel/UCaD33Qv_9UICqsW1aYKxRAA)- This person is building an arcade.
- 😿 [Arcadology](https://www.youtube.com/channel/UCL3pKToB6ER8N6TK6ZMueUw)- Essays about gaming with really good topics.
- [Ars Technica](https://www.youtube.com/channel/UCCDU1fsmgvWljcW2aodfJsA)- A weird mix of videos here, mostly centered around tech and gaming but with quite a few videos of YouTubers in those areas reading their comments. I've put them here because their "War Stories" series is the standout for me.
- [Atari Archive](https://www.youtube.com/channel/UCo_f7y6sBDmFnGbZoq1Ce_w)- Focuses on Atari 2600/VCS games.
- [Basement Brothers](https://www.youtube.com/channel/UC802ToE2k2VA2TgaOPQlwkg)- Learn about cool games for old Japanese computers.
- [Bismuth](https://www.youtube.com/channel/UCQ9STd0zeHrrQGJQEuvhuTw)- Cool speedrunning documentaries.
- [Blast Processing](https://www.youtube.com/channel/UC1fkms84ecHysOOz9TU6zig)- Video essays with a concentration on Sega consoles.
- [Bluesuit](https://www.youtube.com/channel/UCbU_1OrX67hNDv2huvRUAJg)- Reviews of indie games.
- [Boulder Punch](https://www.youtube.com/channel/UCUe2AK0iirPfXcDkYu5dWow)- Essays on and reviews of games with horror and other heavy themes.
- [Bowl of Lentils](https://www.youtube.com/channel/UCY22VVoFxKRQa2eWgWeznLQ)- Shows off Japanese RPGs and visual novels.
- 😴 [Britta Food4Dogs](https://www.youtube.com/channel/UCtGoffNx1f6IHR5LEH0D6tQ)- A charming woman in New Zealand shares her love of collecting games.
- [Chariot Rider](https://www.youtube.com/channel/UCRpDbrcXS-giiD0PkZLC5Kw)- Interesting video essays.
- [Chris Davis](https://www.youtube.com/channel/UCgnPgGFT3fRVkXKL59iFDzQ)- Focuses on CRPGs and immersive sims.
- [Cinnacal](https://www.youtube.com/channel/UC1XD-Cbw5jUnfwJpnAWH-rQ)- Infrequent video game analysis.
- 👀 [Classic Gaming Quarterly](https://www.youtube.com/channel/UC2i64jLboyVFZwwO6UCKZ6g)- I love watching this guy flip through old video game magazines. He talks about the games and edits video footage of the games in. It's a lot of fun.
- [CGQ+](https://www.youtube.com/channel/UC3r91ONU7i0Qp_i9Lj5sD9A)- An offshoot of ☝️ .
- 😿👀🤌 [Cloth Map](https://www.youtube.com/channel/UCs_6gVNVQOgq6MGDdt3h8HQ)- Wonderful videos about the places in games and the gaming culture of places. By everyone's favorite blinking white guy.
- [codex](https://www.youtube.com/channel/UCLDRuN9duu-IV4BWj05rh0w)- Documentaries about gaming secrets and cheat codes.
- 😿 [Coding Secrets](https://www.youtube.com/channel/UCkY047vYjF92-8HcoVTXAOg)- The technical feats used to achieve "impossible" effects in Sega Genesis games. I'm calling this one defunct because the most recent video is an ad for a Funko Pop game and is nothing like the videos that got me to subscribe. The last one of those was in 2021.
- 😿👀🤌 [Cool Ghosts](https://www.youtube.com/channel/UCsYwjeII1w6oWd4eHP29SuQ)- This seems to be defunct and it makes me sad. It gave me the feeling of an old video game magazine because episodes were released infrequently and each one was an event that would teach me about cool new video games.
- 😿 [Corrupted Save](https://www.youtube.com/channel/UCcutrECjQKuhTVL7cLgy4kQ)- Game reviews and essays.
- [Critical Path](https://www.youtube.com/channel/UCaX9ZIG9oL0bocymR64u_rQ)- Interviews with game designers.
- [Cult of the CyberSkull](https://www.youtube.com/channel/UCrlzDiryfIdaLk-ARuojU-A)- Game reviews.
- [Dan Waterfield](https://www.youtube.com/channel/UCZ6FRuw9DMY6dQYmR7MM0-w)- Game reviews.
- [Darkfry](https://www.youtube.com/channel/UCXUPDybKG7nqIxEeKS8fi5w)- Video essays with a quirky sense of humor.
- 👀🤌 [Daryl Talks Games](https://www.youtube.com/channel/UCJfJWct8jN1RpCuVWk3zHTA)- Games through the lens of psychology. Great storyteller and great editing. All his videos are day-one viewing for me.
- [Design Doc](https://www.youtube.com/channel/UCNOVwMpD-5A1xzcQGbIHNeA)
- 👀 [Errant Signal](https://www.youtube.com/channel/UCm4JnxTxtvItQecKUc4zRhQ)- Great reviews and documentaries. I like the "Children of Doom" series quite a bit.
- 👀😴 [eurothug4000](https://www.youtube.com/channel/UCxddeIv7GdHNcVPZI9JvGXQ)- Wonderful and thoughtful game essays by a person who has a taste for cozy games, among others.
- [Face Full of Eyes](https://www.youtube.com/channel/UCynR0lsG_UuatTomB_U4GWQ)- Deep dives on games' aesthetics.
- [First Five](https://www.youtube.com/channel/UCtBssYWSCRgz9O42Ok44lNg)- Bite-sized reviews.
- [FrameRater](https://www.youtube.com/channel/UCCgG9KExe3OEOLcHO4z1B3g)- Retro gaming news and information plus historical documentaries.
- [FUNKe](https://www.youtube.com/channel/UCd-qVRcjoK9zjtDs_LRxSmw)- Video essays with gorgeous animation.
- [GC Vazquez](https://www.youtube.com/channel/UCIUex9Rd8YqVAbJgVO2CtYg)- Video essays with a heavy focus on the Yakuza series and adjacent games.
- 😿 [Game Brain](https://www.youtube.com/channel/UCXCrsfQCfba7DLciVsky4Ug)- Documentaries about the making of video games.
- 😿 [Game Design Foundry](https://www.youtube.com/channel/UClF4wRP8OHhxIkB2-woAyEA)- Explorations of game design.
- 👀🤌 [Game Maker's Toolkit](https://www.youtube.com/channel/UCqJ-Xo29CKyLTjn6z2XwYAw)- Awesome videos about game design and development.
- 😴 [Game Sack](https://www.youtube.com/channel/UCT6LaAC9VckZYJUzutUW3PQ)- Themed lists of retro games.
- 😿 [Game Score Fanfare](https://www.youtube.com/channel/UC8P_raHQ4EoWTSH2GMESMQA)- Great videos on video game music.
- [Gamedev Adventures](https://www.youtube.com/channel/UCfENDyL3zFLqJjTO8fQeVOQ)- Essays about game design.
- [Gamers' Garden Retro](https://www.youtube.com/channel/UC905icX5K7ioGbFuebmyTOg)- Retro game videos, mostly on the Sega Saturn.
- [Gameumentary](https://www.youtube.com/channel/UCJS-pvsdN8JBnyPpV47gLSg)
- 👀🤌 [Gaming Historian](https://www.youtube.com/channel/UCnbvPS_rXp4PC21PG2k1UVg)- Incredible documentaries on old games and hardware.
- [The Geek Critique](https://www.youtube.com/channel/UCxgx4EwuYDYMZFhjo1dC7SA)- Video essays focused on retro games.
- [Giant Bomb](https://www.youtube.com/channel/UCmeds0MLhjfkjD_5acPnFlQ)- Its best days are behind it, but even so, it's still good. Tune in to get the latest scoops from Jeff Grubb or to be shocked by what normal everyday concepts Dan Ryckert doesn't understand.
- [gillythekid](https://www.youtube.com/channel/UCwq9JpB9EEyXG7JouLQLuIg)- Video essays.
- [Graythorn](https://www.youtube.com/channel/UCDFghROk9t0fdXLppfn0gRw)- Video essays with a unique perspective.
- [Grim Beard](https://www.youtube.com/channel/UCNmv1Cmjm3Hk8Vc9kIgv0AQ)- Stylish, fun "reviews" that are half review/half documentary. A lot of the games featured contain horror themes.
- [GVMERS](https://www.youtube.com/channel/UCSuhUzpdXg9jme6eN6HA_IA)- Gaming documentaries that are seemingly read by a voice actor. Maybe I'm wrong, but I find the style of delivery a bit off-putting, like I'm watching an A&E documentary or something. Content is somewhat pedestrian but sometimes interesting.
- [Hard4Games](https://www.youtube.com/channel/UCacYHKoNLHrVoN1L9uup86A)- Mostly short documentaries about classic games. Not sure about the channel name though…
- [HeavyEyed](https://www.youtube.com/channel/UCutGiN7c5-CEFwm_ccixR3g)- Video essays.
- [History Respawned](https://www.youtube.com/channel/UCyx1mPZXobOxCyzO2CwmDZA)- History in and through video games.
- [hotcyder](https://www.youtube.com/channel/UC_r8gFeezEBZVnazvbv75pQ)- Nice videos with a concentration in Rare and Nintendo.
- [Hungry Goriya](https://www.youtube.com/channel/UCrqaOPLC4_LTWCdJIvXvWTg)- Reviews of NES games.
- [i am error](https://www.youtube.com/channel/UCguiL4FjaAKM5b_nFlrOfGw)- Smart video essays.
- [I Dream of Indie Games](https://www.youtube.com/channel/UC_HX1n5iojK-xjy9WxfxXhg)- Indie game reviews with great personality.
- 🆕🤌 [I Finished A Video Game](https://www.youtube.com/channel/UCVdDUN69YsAXPxh2y71sMtQ)- Long and exhaustive retrospectives on game series.
- [Indigo Gaming](https://www.youtube.com/channel/UCTRohxutThBffdcP3H6O0Zg)- Documentaries and essays. They seem to like the cyberpunk milieu, so a lot of the videos are about that.
- [Iron Pineapple](https://www.youtube.com/channel/UC477Kvszl9JivqOxN1dFgPQ)- Plays all of the obscure Soulslikes they can find on Steam. Seems to give each one a fair shake and has smart criticism of them.
- 🤌 [Jacob Geller](https://www.youtube.com/channel/UCeTfBygNb1TahcNpZyELO8g)- Great video essays.
- [The Jeff Gerstmann Show](https://www.youtube.com/channel/UCR9R2ARN74dCebn1kv06UhA)- Founder of Giant Bomb. Really funny guy who has been covering video games forever.
- [JennDjinn](https://www.youtube.com/channel/UCihvmkoh5QgHHonfAAjxkmw)- Reviews of indie games and round-ups of Steam Next Fest demos.
- [Jenovi](https://www.youtube.com/channel/UCNjPh_sUUWCezOfYPopY9_A)- Great retro gaming content with an emphasis Sega and somewhat grating newscaster-style delivery.
- 👀 [Jeremy Parish | Video Works](https://www.youtube.com/channel/UCrIttXi0WgLXHI1poCk0D6g)- Walking through the history of game releases for various retro consoles. Production is fairly poor but content is great.
- [John Learned](https://www.youtube.com/channel/UCz565bjSN9kpkGPX6Mo2zNg)- Annotated playthroughs of video games, giving you all sorts of interesting extra context.
- [Joseph Anderson](https://www.youtube.com/channel/UCyhnYIvIKK_--PiJXCMKxQQ)- Infrequent video essays.
- [Josh Strife Hayes](https://www.youtube.com/channel/UCRWyPm7MrfotIYF8A8MGV3g)- Videos about MMOs.
- [Kester's Forest](https://www.youtube.com/channel/UCv4hzZ0ebbux7S4PrNQgBww)- Repairs gaming hardware and flips through old magazines.
- [The Killer Bits](https://www.youtube.com/channel/UC-Jj82o8Iuv_wOYHfsAmrTA)- Reviews of games that aren't the major mainstream hits. This channel recently came out of a few years of dormancy. Seems like they're doing some tabletop content now too.
- [KingK](https://www.youtube.com/channel/UC18YhnNvyrU2kTwCyj9p5ag)- Video essays with a focus on Japanese mega hits like Mario, Sonic, and Pokemon.
- [Kruggsmash](https://www.youtube.com/channel/UCaifrB5IrvGNPJmPeVOcqBA)- Tells and illustrates stories from Dwarf Fortress. Fascinating that a game can generate these stories!
- 👀 [TheLazyPeon](https://www.youtube.com/channel/UCE-f0sqi-H7kuLT0YiW9rcA)- Really good MMO videos. Keeps you up to date on the current state of long-running MMOs and reviews new MMOs too. I love the WoW Hardcore series he recently started.
- [LambHoot](https://www.youtube.com/channel/UCWSh_j8f0G9P-c1NTnOPyVA)- I'm not sure what else to say about these channels that do video essays. Please don't take that to mean any of them are worse than the others. I like them all. That's why they're on this list.
- [Leon Massey](https://www.youtube.com/channel/UCo8186mZYAY49flt6HkbqlQ)- Essays about game design.
- 😿 [Leonardo Da Sidci](https://www.youtube.com/channel/UCujjLOPLW92zVBlhaL8wxPg)- Essays with pretty cool perspectives.
- [Liam Robertson - Game History Guy](https://www.youtube.com/channel/UCanmNTwIegw9sjD9gzBlupQ)- Teaches you about games that were never released.
- [Liam Triforce](https://www.youtube.com/channel/UCWQfbcMGyrPDlIU7wV7aAOQ)- Lots of Legend of Zelda videos with some other Japanese games and the occasional Western game thrown in for good measure.
- ☠️ [Lucky Ghost](https://www.youtube.com/channel/UCyeXkOdGbwveA-EtwQLeTYA)- MMO review and guide videos. (I want to explain my unsub here. This channel frequently produces advertorial videos and buries the disclosure. I was watching a video that sure seemed like an ad. Looked at the comments and discovered the disclosure was 2 minutes into the video. If they haven't already, the FTC should more strictly define what constitutes proper disclosure of a sponsored video.)
- [MandaloreGaming](https://www.youtube.com/channel/UClOGLGPOqlAiLmOvXW5lKbw)- Smart reviews of games that might have 20 years ago been thought of as PC games, back before console gaming gobbled up everything. Lots of strategy games here, but there's other stuff too.
- [Maraganger](https://www.youtube.com/channel/UCI9eybCgmaFtbhCdBy8q62Q)- Video essays exploring some odd corners of gaming.
- [Mark Flynn](https://www.youtube.com/channel/UCEi5bJ5J0dnbbL_SWyKQm1g)- Deep dives into character designs.
- [MashTec](https://www.youtube.com/channel/UC8c9cH_XB7JMEGInq1-LWLg)- Reviews of retro gaming devices. May be defunct. Hasn't released a video for a while.
- [Matt Barton](https://www.youtube.com/channel/UCE98xefVUXmbvQfe-wNS8oA)- Interviews around and playthroughs of CRPGs.
- [Matthewmatosis](https://www.youtube.com/channel/UCb_sF2m3-2azOqeNEdMwQPw)- Video essays and reviews.
- [Mega Drive Profile](https://www.youtube.com/channel/UCicmo3OzAmaul-lGc5ghV9Q)- Reviews of Mega Drive (or Genesis if you're in the US) games.
- [MetalJesusRocks](https://www.youtube.com/channel/UCEFymXY4eFCo_AchSpxwyrg)- Retro game collector who loves to show his collection and take you along to cool retro game stores. I saw him once at a festival on my street when I lived in Seattle.
- [Modern Vintage Gamer](https://www.youtube.com/channel/UCjFaPUcJU1vwk193mnW_w1w)- Technical deep dives on retro games.
- [Mortismal Gaming](https://www.youtube.com/channel/UCEQ7KR9enYdQsB6kcMnw0NA)- Lots of reviews of CRPGs and adjacent genres.
- 😿 [Mr. Gentleman](https://www.youtube.com/channel/UCH0fH_3lhJtgHK3bsBFx3_Q)- Home of the History of RPGs series.
- [MrEdders123](https://www.youtube.com/channel/UCu5caf11uRNc_M0zDgrGo1Q)- Long retrospectives and reviews on a variety of retro games.
- [mrixrt](https://www.youtube.com/channel/UCEqX3NzHsxP9MV7YIdq2JzA)- Video essays slanting toward the negative (e.g., this or that game "sucks," "what's wrong with" a game, etc.)
- [My Life in Gaming](https://www.youtube.com/channel/UCpvtp7mH0Cdq8FQUxcjDq0Q)- They play retro games and will show you the best ways to do it too!
- 😿 [N64 Glenn Plant](https://www.youtube.com/channel/UCwKkLApeClMpi44fd8vJdDA)- Game reviews, themed lists, and magazine look-throughs.
- [Nerrel](https://www.youtube.com/channel/UCZKyj7wDE51SMbkrRBT6SdA)- Game reviews.
- [NESComplex](https://www.youtube.com/channel/UCVLZpevtoTl30xEFH7muVsg)- Videos covering games of the 8- and 16-bit eras. My favorites are the "Declassified" series: deep dives into the secrets of a particular game.
- [NES Friend](https://www.youtube.com/channel/UCT0lO6g_BRAxREyMh6xWjpw)- Short videos describing NES games.
- [NeverKnowsBest](https://www.youtube.com/channel/UC1fKT0wuhchtclPqpdWEnHw)- Mostly interesting video essays. Their recent ["Entire History of Video Games"](https://youtu.be/argpSxB1NQE) is pretty great.
- [New Frame Plus](https://www.youtube.com/channel/UCxO_ya-RmAXCXJCU54AxYFw)- Explores animation in games.
- [Next Level Narrative](https://www.youtube.com/channel/UCGq6XdadjoW21KMNKit3CAQ)- Essays about storytelling in popular media — primarily games.
- [Nextlander](https://www.youtube.com/channel/UCO0gHyqLNeIrCAjwlO2BmiA)- Giant Bomb alums Vinnie Caravella, Brad Shoemaker, and Alex Navarro play games together. Great if you want to see new releases played by good people.
- [Noah Caldwell-Gervais](https://www.youtube.com/channel/UC5CYeHPLer3lbEhgonvbbAA)- Epic video game essays, along with some occasional travel content.
- [Noclip](https://www.youtube.com/channel/UC0fDG3byEcMtbOqPMymDNbw)- Video game documentaries. This guy used to work for GameSpot and has loads of access as a result. Great dude too.
- [Noclip Game History Archive](https://www.youtube.com/channel/UCfAvImNHaevXE7cAmHSOQDQ)- Danny ended up with a bunch of old tapes of historical significance and is digitizing them to this channel.
- [Noclip Crew](https://www.youtube.com/channel/UCdievj3szPeYJzqqOjsLnfQ)- Same crew as proper Noclip, but these aren't really documentaries. More freeform but still enjoyable.
- [Noisy Pixel](https://www.youtube.com/channel/UCYtuVAsWV5wTITaLgEGqqZg)- Reviews of indie games. The reviews aren't great, but they make this list because they review games not many others do.
- [Noodle](https://www.youtube.com/channel/UCj74rJ9Lgl3WTngq675wxKg)- Fun gaming essays backed by original animation.
- [Now in the 90s](https://www.youtube.com/channel/UC4kFqZTgEz9fB0SNNrFaqeQ)- Which games came out 30 years ago?
- 😿 [On Doubt](https://www.youtube.com/channel/UCR0SIzN1XnqQfHMoSXGWxlQ)- Stories about people who make video games
- [onaretrotip](https://www.youtube.com/channel/UCTrirxpoj8GkrUl7pAqq7YQ)- A wide variety of retro game videos. There are several about Lucasarts adventure games.
- [PandaMonium Reviews Every U.S. Saturn Game](https://www.youtube.com/channel/UC9pDNUuabc9QVAm-WzXUe_A)
- [Parallax Abstraction](https://www.youtube.com/channel/UCasJmGOTdyBUNC5y96_0NQw)- Reviews indie games and modern retro games
- [PatricianTV](https://www.youtube.com/channel/UCnw3aIEiz60S6O3XcztCVkQ)- Extensive retrospectives and analysis, in many cases of CRPGs.
- [PC Gamer](https://www.youtube.com/channel/UCgaPRP68bbyHnfkPhWWBrNw)
- [Penney Pixels](https://www.youtube.com/channel/UCpzHE1Jo-_Igft69WVschaA)- Creates fake de-makes of modern games or retro game adaptations of modern media.
- [Pepp's Picks](https://www.youtube.com/channel/UCmkCPjKpngDHZp0orr7GuGA)- Reviews of indie games.
- 😴 [PeteDorr](https://www.youtube.com/channel/UCeTvRtfRFyWXdO_ZbyArPjA)- Videos about game collecting.
- 👀🤌 [People Make Games](https://www.youtube.com/channel/UCZB6V9fUov0Mx_us3MWWILg)- The best games journalism going. These people are exposing the dark underbelly of gaming.
- 😴 [Pixel Architect](https://www.youtube.com/channel/UCo57r5geuOTZzu1CoHbGbtQ)- Demonstrates pixel art techniques. Also logs development of their RPG.
- [Polygon](https://www.youtube.com/channel/UCuVxaQDraOja6xKidcmoufA)- Major game site with videos that often skew silly. Still pretty good though.
- [PostMesmeric](https://www.youtube.com/channel/UCkEa7jTrubo2mvdoHXz38zw)- Video essays.
- [Press Start To Continue](https://www.youtube.com/channel/UCFVnZyTWXFdxXsVydKUIpQg)- Explorations of creepy or mysterious aspects of games… plus several Mother videos.
- [PrimeHylian](https://www.youtube.com/channel/UCAcdbQxXCbu1752-ocGWYEA)- Lots of game essays about Metroid, among others.
- [ProbablyJacob](https://www.youtube.com/channel/UCc36N0TXR5YjqyGBwM-DBGQ)- Game reviews and a few videos about paranormal stuff.
- [Quest Marker](https://www.youtube.com/channel/UCH6gsbnwEM76Jn-HrBI6Syg)- Cool gaming essays and reviews of indie games.
- [quwebs](https://www.youtube.com/channel/UCKq7PptA7Izc3VTLUS-swkw)- Quick reviews of 8-bit and 16-bit games.
- [Raycevick](https://www.youtube.com/channel/UC1JTQBa5QxZCpXrFSkMxmPw)- Cool video essays.
- [Razbuten](https://www.youtube.com/channel/UCfHmyqCntYHQ81ZukNu66rg)- All of his stuff is good, but I particularly enjoy the videos that analyze games from the non-gamer perspective.
- [RemovableSanity](https://www.youtube.com/channel/UCedxZ7IOAuZZ1PlfudvsLUQ)- Indie game reviews.
- [Retro Dodo](https://www.youtube.com/channel/UCRg2tBkpKYDxOKtX3GvLZcQ)- Retro hardware and games.
- 🤌 [Retro Game Corps](https://www.youtube.com/channel/UCoZQiN0o7f36H7PaW4fVhFw)- The best retro hardware reviews and how-tos around.
- [RetroActive](https://www.youtube.com/channel/UCWhWuj1wBrpaaU75SBFFfug)- Videos about retro games, including a couple of videos exploring the history of ska music in games.
- [Retrohistories](https://www.youtube.com/channel/UCzKVssfARBvDuJFJ59r0-SQ)- Historical documentaries about games.
- [RetrospectiveGaming](https://www.youtube.com/channel/UCA6ZR5id4mBTwdzGXavuF3w)- Retrospectives of old CRPGs. Kinda goofy delivery that makes me chuckle.
- 😴 [RMC - The Cave](https://www.youtube.com/channel/UCLEoyoOKZK0idGqSc6Pi23w)- A British guy with a soothing voice shares retro consoles and computers and their games. He has a real museum you can visit, and many videos focus on restorations of donated items.
- [Rock Paper Shotgun](https://www.youtube.com/channel/UC5bKSAZBvV9AKlBJPG0Py-A)- Keep up with what's going on in PC gaming.
- [Salokin](https://www.youtube.com/channel/UCN12YlMTtri3_EXAxFhZT3w)- Reviews of games I don't often see reviewed on YouTube.
- [Same Name, Different Game](https://www.youtube.com/channel/UC1OPqQpIw7xCOnusnAkbmzw)- Sometimes, the same game is different on different platforms. This channel compares them.
- [Sean Seanson](https://www.youtube.com/channel/UCnEd9PbzAKmRnDYyi0CDEmw)- Rounds up obscure PS1 games and games that were never released in the US.
- [Shesez](https://www.youtube.com/channel/UCHTnEwQKNwm49CQeCVZogMw)- Has some great series like "Boundary Break" which shows you cool finds out of bounds in games and "Region Break" which shows you the differences between regional releases of a game.
- 😴 [Shirley Curry](https://www.youtube.com/channel/UCzkY7wa8Ksxv4M5NyUYgTmA)- Grandma Shirley plays Skyrim and makes up her own personal lore to flesh out her characters as she goes. She opens ever video with "hello, grandkids." Wholesome.
- 🤌 [Skill Up](https://www.youtube.com/channel/UCZ7AeeVbyslLM_8-nVy2B8Q)- Great reviews of the big releases. He also does a weekly news roundup that is highly entertaining and informative.
- [Skyehoppers](https://www.youtube.com/channel/UCn_19WPd9vH9SMzl2AqKI1w)- Video essays.
- [SNES drunk](https://www.youtube.com/channel/UCfBLXTwLoUpDAkHcHizW3Jg)- Short videos describing SNES games.
- 🤌 [Snoman Gaming](https://www.youtube.com/channel/UCmY2tPu6TZMqHHNPj2QPwUQ)- Videos about game design.
- [SoberDwarf](https://www.youtube.com/channel/UCs595r4A30fYDOd7AzTAgbw)- Game design documentaries.
- [Stop Skeletons From Fighting](https://www.youtube.com/channel/UC5Xeb9-FhZXgvw340n7PsCQ)- Dynamic videos about the oddball side of video games.
- 👀 [strafefox](https://www.youtube.com/channel/UCtt_NEKZ4MoH4O7BT3SbXTA)- Awesome documentaries focusing on Japanese games.
- [Stylized Station](https://www.youtube.com/channel/UC7cmH--tFhYduIshTKzQUJQ)- Analysis of game graphics and art.
- 👀 [Summoning Salt](https://www.youtube.com/channel/UCtUbO6rBht0daVIOGML3c8w)- Walk through the history of speedrunning records.
- 😿 [Sunder](https://www.youtube.com/channel/UCYwIcyCwXZ--FR0iZ593uBA)- Game reviews and game design videos.
- [Super Bunnyhop](https://www.youtube.com/channel/UCWqr2tH3dPshNhPjV5h1xRw)- Reviews and thoughtful essays.
- 😿 [Sushiperv](https://www.youtube.com/channel/UCZWes7r9zKwQYyncjD34Ufg)- The JRPG innovations series is pretty cool.
- [Table 53](https://www.youtube.com/channel/UCimJO6nZt-Yanp2j8Kd9g0Q)- Reviews of indie games and video essays.
- [Taki Udon](https://www.youtube.com/channel/UCKF5151a6yAooOILrYTvfJg)- Previews and reviews of retro gaming handhelds.
- [Tama Hero](https://www.youtube.com/channel/UCid9DssdW6-yxUNl3_aba6A)- Deep dives into aspects of the elements of Pokemon games.
- 🆕 [tangomushi](https://www.youtube.com/channel/UCBo-lNrFoprsy3WTGfHQG2w)- Retrospectives on survival horror games, including some obscure ones.
- [Tanner's Game Museum](https://www.youtube.com/channel/UCI6BOes6aBWYLGgjxsjmPgA)- Awesome short videos about retro games.
- [Tehsnakerer](https://www.youtube.com/channel/UCZ1X8Zn6xguOSpx_HoJ-5cA)- Long videos about games.
- [That Trav Guy](https://www.youtube.com/channel/UCzmECGDexdpx2FxNoRy8-_w)- Fun, well-edited documentaries on games, sometimes new but mostly retro.
- [Three Minute Gaming](https://www.youtube.com/channel/UCA0J5iRCVl_2S0mRNTJEjUg)- Short game reviews.
- [Timothy Cain](https://www.youtube.com/channel/UCTAfm-YD2M9xzvbYvRc5ttA)- Shares his experience working on seminal CRPGs vlog style.
- [tomatoanus](https://www.youtube.com/channel/UCm6GSA5OROHcIBNkXkH53zQ)- Your tour guide through record speedruns.
- [Turbo Button](https://www.youtube.com/channel/UCWPTiFpzm8559H-9Err59gw)- Analysis of game mechanics.
- [Unseen64: an Archive for Beta & Cancelled Games](https://www.youtube.com/channel/UCjt4zRCKnJpdEM3N6KDFhGg)- Unearthed footage of canceled games.
- [VaatiVidya](https://www.youtube.com/channel/UCe0DNp0mKMqrYVaTundyr9w)- Learn the lore of the Soulsbourne games.
- ☠️ [Valefisk](https://www.youtube.com/channel/UC0eOlAEMdVgpmThPkpmR-qQ)- Games as masochism.
- [Video Game Animation Study](https://www.youtube.com/channel/UC8A3Zig-dNx2kZmy1FovTEA)
- [Video Game B-Roll](https://www.youtube.com/channel/UCcCjuxEtb1l-lfhElopj5aA)
- [Video Game Docs](https://www.youtube.com/channel/UCwdt4GIOHKO8lGU4LA-NNfA)- Video game documentaries exploring retro stuff.
- [The Video Game History Foundation](https://www.youtube.com/channel/UCicVsS0zrUPrA3RaOJO5oBg)- Infrequent but good and interesting videos.
- [VZedshows](https://www.youtube.com/channel/UCNFCXmja0Lnf8C7uy1rMaAg)- Interesting takes on games.
- [wizawhat](https://www.youtube.com/channel/UC-ymzG87ykUfTLdECs1sVYw)- Gaming video essays.
- 😿 [Wrestling With Gaming](https://www.youtube.com/channel/UCI7H1H_8lnxonZ1vIyfvAcg)- Videos about retro games and the hardware and culture surrounding them.
- [Writing on Games](https://www.youtube.com/channel/UCPlWv88ZRMxCcK3BGjrX7ew)
- [Xygor Gaming](https://www.youtube.com/channel/UCbGza5v86PXroSbW_2RMXvw)- Mostly short retrospectives and reviews of old JRPGs.
- [YourFriendJacob](https://www.youtube.com/channel/UCa5w_DcHdRWRIWKBqfLhbTw)- Exposing new and upcoming indie games.
## Other Stuff
- [おもしろ雑貨コレクター](https://www.youtube.com/channel/UCQcP1QPlKiwH0gX-XNFETNg)- This person shares the cool and strange items they collect, while wrapping their videos in some fun storytelling.
- [anadvora](https://www.youtube.com/channel/UCnEl2UOnkQsgjjlmCSBCxdQ)- Quirky fun songs.
- 👀🤌 [Answer in Progress](https://www.youtube.com/channel/UCqVEHtQoXHmUCfJ-9smpTSg)- Great explainers!
- 😴 [The Art and Making of](https://www.youtube.com/channel/UCul0hqYdXADxADyoIku4p5g)- Reviews art books.
- [Atomic Frontier](https://www.youtube.com/channel/UCbCq5Y0WPGimG2jNXhoQxGw)- Fun science videos.
- 😿 [baracksdubs](https://www.youtube.com/channel/UCvHn0MTf40rdEQu6Y2yNL5g)- Obama sings pop songs.
- 🤌 [Captain Disillusion](https://www.youtube.com/channel/UCEOXxzW2vU0P-0THehuIIeg)- Fun videos about visual effects.
- 🤌 [CaseyNeistat](https://www.youtube.com/channel/UCtinbF-Q-fVthA0qrFQTgXQ)- C'mon, you know this guy, right? Incredible storyteller. I enjoy when he looks at micromobility tech.
- 😿 [Chokkan](https://www.youtube.com/channel/UCtLJJRsmtUgCWLj_Ud9URfA)- Custom computer keyboards.
- 🤌 [Climate Town](https://www.youtube.com/channel/UCuVLG9pThvBABcYCm7pkNkA)- Funny videos about climate change.
- [Code to the Moon](https://www.youtube.com/channel/UCjREVt2ZJU8ql-NC9Gu-TJw)- Cool software development videos. Lots of Rust stuff, but there are also tools and workflow stuff that could be helpful to any developer.
- [ColdFusion](https://www.youtube.com/channel/UC4QZ_LsYcvcq7qOsOhpAX4A)- Tech and current events explainers.
- [Cool Worlds](https://www.youtube.com/channel/UCGHZpIpAWJQ-Jy_CeCdXhMA)- Science videos focusing on space.
- [Crypticc](https://www.youtube.com/channel/UC14YfshXdnxkD4qOTWke4eQ)- Videos about cryptids and folk legends. I don't buy that this stuff is "real" in a meaningful sense, but I still like to watch it occasionally.
- 🤌 [Dean Bog](https://www.youtube.com/channel/UC88Cq0GO7AZebZh4Z0K3-AA)- Wonderful short films about Pittsburgh neighborhoods.
- [Direct and Dominate](https://www.youtube.com/channel/UCSt7dofQxC-pIL9hUT6uX0A)- An action/comedy animated series incorporating retro 3D graphics and plenty of references to video games.
- 😴 [EasyPcRepairs](https://www.youtube.com/channel/UCZq-49HjGBTh1WX3dr1UOug)- I'm not particularly interested in the content of this channel, but the delivery of that content is relaxing.
- [Einzelgänger](https://www.youtube.com/channel/UCybBViio_TH_uiFFDJuz5tg)- Videos focused on self-improvement through philosophy.
- [exurb1a](https://www.youtube.com/channel/UCimiUgDLbi6P17BdaCZpVbg)- Fun philosophical videos.
- [Fascinating Horror](https://www.youtube.com/channel/UCFXad0mx4WxY1fXdbvtg0CQ)- Stories of horrific accidents and other real-life horrors.
- 🤌 [First We Feast](https://www.youtube.com/channel/UCPD_bxCRGpmmeQcbe2kpPaA)- Unless today is your first day trying YouTube, you probably know their show "Hot Ones." It really is as good as everyone says.
- [Folding Ideas](https://www.youtube.com/channel/UCyNtlmLB73-7gtlBz00XOQQ)- Documentaries on lots of things, from pop culture to regular culture to commerce.
- 🆕 [Grickle](https://www.youtube.com/channel/UCqz4lWE_7FjyIzkO_9KM6KA)- Creepy animations. You may know the animator from the Puzzle Agent game series.
- 🤌 [hbomberguy](https://www.youtube.com/channel/UClt01z1wHHT7c5lKcU8pxRQ)- Lots of essays about video games, but also social commentary and other explainers. [His exposé on Tommy Tallarico](https://youtu.be/0twDETh6QaI) is a standout.
- [HealthyGamerGG](https://www.youtube.com/channel/UClHVl2N3jPEbkNJVx-ItQIQ)- Mental health and personal growth.
- 👀🤌 [The Hood Internet](https://www.youtube.com/channel/UCojA_5iLYACORf5zUAWlMaA)- Great video mashups of hit songs. Each video has hits from a particular year.
- [Internet Historian](https://www.youtube.com/channel/UCR1D15p_vdP3HkrH8wgjQRw)- Tells the stories of things that happened online but also sometimes about things that happened in the world.
- 🤌 [Jay Foreman](https://www.youtube.com/channel/UCbbQalJ4OaC0oQ0AqRaOJ9g)- Silly (in a good way) videos about maps and bridges.
- [Jeffrey Kaplan](https://www.youtube.com/channel/UC_hukbByJP7OZ3Xm2tszacQ)- Videos about learning techniques and philosophy.
- 🤌 [Johnny Harris](https://www.youtube.com/channel/UCmGSJVG3mCRXVOP4yZrU1Dw)- What if the news actually explained things?
- 👀🤌 [JxmyHighroller](https://www.youtube.com/channel/UC3L9XPe0_FGfRG-CMGtBvFg)- Awesome videos about NBA basketball. Loves to dive deep and derive conclusions from stats.
- [Kaz Rowe](https://www.youtube.com/channel/UCSwwoUNvQWgZDC8a_O6Qs_A)- History videos with a focus on LGBTQ+ folks.
- 🤌 [Kyle Hill](https://www.youtube.com/channel/UCFbtcTaMFnOAP0pFO1L8hVw)- Fun videos that make science accessible.
- 🤌 [LegalEagle](https://www.youtube.com/channel/UCpa-Zb0ZcQjTCPP1Dx_1M8Q)- Whoever thought the law could be fun?
- 🤌 [LEMMiNO](https://www.youtube.com/channel/UCRcgy6GzDeccI7dkbbBna3Q)- Researches mysteries, like the origin of the cool 'S,' Jack the Ripper, and D.B. Cooper.
- 😿🤌 [LOCAL58TV](https://www.youtube.com/channel/UCuoMasRkMhlj1VNVAOJdw5w)- An early and wonderful example of this style of "analog horror" — horror content that presents as real found footage from the era of the VHS tape.
- 🤌 [Miniminuteman](https://www.youtube.com/channel/UC-SrCCzkGq0wmSAuRs7EBFg)- Accessibile and engaging history videos.
- [misterdeity](https://www.youtube.com/channel/UCOrE5EE4JH3CGwDQTsA2t_A)- Good critiques of religion.
- [More Perfect Union](https://www.youtube.com/channel/UCehBVAPy-bxmnbNARF-_tvA)- Social commentary and anti-capitalism.
- [Mr. Beat](https://www.youtube.com/channel/UCmYesELO6axBrCuSpf7S9DQ)- Great history videos from a passionate teacher.
- 🤌 [mugumogu](https://www.youtube.com/channel/UCRVruzlQF5cqpw9jQgIgNdw)- Beautiful, soothing videos of three cute cats, including Maru, the box cat.
- [Nerdwriter1](https://www.youtube.com/channel/UCJkMlOu7faDgqh4PfzbpLdg)- Such a variety here it's hard to categorize. Let's just say that all of the videos are interesting.
- 😴 [Odd Tinkering](https://www.youtube.com/channel/UCf_suVrG2dA5BTjJhNLwthQ)- Watch someone restore old objects — often gaming-related but not always.
- [Oki's Weird Stories](https://www.youtube.com/channel/UCjDQKxiTVpXutZc2Ra9wCAg)- Odd stories about people.
- [Overly Sarcastic Productions](https://www.youtube.com/channel/UCodbH5mUeF-m_BsNueRDjcw)- Videos about literature, mythology, and history.
- [Premodernist](https://www.youtube.com/channel/UC2xHMABk_sX2aC14-D7OhIw)- Micro history documentaries.
- [The Punk Rock MBA](https://www.youtube.com/channel/UCjewxGh1Gx5i5Uzxn0v-TPw)- Engaging videos about the business side of music.
- [Qxir](https://www.youtube.com/channel/UCGHDQtN_vzFYJaq_Fx1eikg)- Stories of people in peril.
- [RobWords](https://www.youtube.com/channel/UC4a9LfdavRlVMaSSWFdIciA)- Fun and funny videos about language.
- [Sakura Stardust](https://www.youtube.com/channel/UCe6Kb_fN2ZEC0bMdDye7ZQg)- Exploring Japanese internet culture, often with a horror bent.
- [Secret Base](https://www.youtube.com/channel/UCDRmGMSgrtZkOsh_NQl4_xw)- I'm not huge into sports, but I do enjoy their videos. Really great at giving you the context around important plays or rivalries.
- [Simone Giertz](https://www.youtube.com/channel/UC3KEoMzNz8eYnwBC34RaKCQ)- Formerly the "queen of shitty robots." Now, Simon makes all kinds of stuff besides just shitty robots. Always a fun watch.
- [Ska Tune Network](https://www.youtube.com/channel/UCji2l5wcs6GoYJY1GgG_slQ)- Mostly ska/punk covers of pop songs. Their energy is infectious.
- [Some More News](https://www.youtube.com/channel/UCvlj0IzjSnNoduQF0l3VGng)- Funny left-leaning news show. Like The Daily Show if it really dove deep.
- [Something Different Films](https://www.youtube.com/channel/UCa1qcJbMkbk5dwTvs-va8ew)- Videos about geography and the culture that comes out of it.
- 🤌 [Special Books by Special Kids](https://www.youtube.com/channel/UC4E98HDsPXrf5kTKIgrSmtQ)- Charming interviews with people with disabilities.
- 🤌 [Stewart Hicks](https://www.youtube.com/channel/UCYAm24PkejQR2xMgJgn7xwg)- Awesome accessible architecture videos.
- 🤌 [Stuff Made Here](https://www.youtube.com/channel/UCj1VqrHhDte54oLgPG4xpuQ)- Makes incredible devices. Less crafting and more invention + engineering.
- [Tasting History with Max Miller](https://www.youtube.com/channel/UCsaGKqPZnGp_7N80hcHySGQ)- Cooks historically accurate dishes.
- [The Thought Emporium](https://www.youtube.com/channel/UCV5vCi3jPJdURZwAOO_FNfQ)- Weird science.
- [Thoughty2](https://www.youtube.com/channel/UCRlICXvO4XR4HMeEB9JjDlA)- Cool short documentaries on a variety of topics. You will learn things you weren't aware you wanted to know.
- 🤌 [Trash Theory](https://www.youtube.com/channel/UCxHcoI9ndIdAihEB7ODTOfQ)- Great music documentaries showing the history of various aspects of popular music. The one about [the first punk rock Christmas song](https://youtu.be/l8Nw7kum0yk) is a standout.
- 🤌 [Veritasium](https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA)- Masterfully entertaining and well-produced science videos.
- [Versed](https://www.youtube.com/channel/UCUwQmBOM-tpGP13zx-vNpbQ)- Current events and politics videos with great thumbnails.
- [vewn](https://www.youtube.com/channel/UCd0zIZlbgvEifm_hd3FwlBQ)- Cool and kinda creepy animation in a very creepy aspect ratio.
- [VICE](https://www.youtube.com/channel/UCn8zNIfYAQNdrFRrr8oibKw)- News with a focus on sex, danger, and youth culture.
- [vlogbrothers](https://www.youtube.com/channel/UCGaVdbSav8xWuFWTadK6loA)- The prototypical vloggers. Two smart guys talking to the camera about interesting stuff across a variety of topics.
- 🤌 [Vox](https://www.youtube.com/channel/UCLXo7UDZvByw2ixzpQCufnA)- High-quality explainer and current events videos.
- [Vsauce](https://www.youtube.com/channel/UC6nSFpj9HTCZ5t-N3Rm3-HA)- Exists somewhere at the intersection of history, design, philosophy, and science. Always interesting.
- [Weird Paul](https://www.youtube.com/channel/UChe9i_1QOu0izWI2l_CveKw)- Retro media, thrift store finds, and Paul's home videos from his childhood.
- 🤌 [zefrank1](https://www.youtube.com/channel/UCVpankR4HtoAVtYnFDUieYA)- Off-the-wall nature documentaries.
{% endfor %}