Compare commits
10 commits
cb2aa96e90
...
fd5fbc2541
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fd5fbc2541 | ||
|
|
c37a322648 | ||
|
|
f665396d55 | ||
|
|
fc92223b23 | ||
|
|
c806c12dd9 | ||
|
|
88f90cdd02 | ||
|
|
71f08c2927 | ||
|
|
fa056712d1 | ||
|
|
9d493413c8 | ||
|
|
ae0487886b |
22
.eleventy.js
|
|
@ -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
|
|
@ -1 +1 @@
|
|||
14
|
||||
18
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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
|
||||
}
|
||||
|
||||
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
|
|
@ -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;
|
||||
}
|
||||
|
Before Width: | Height: | Size: 8 KiB After Width: | Height: | Size: 8 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 716 B After Width: | Height: | Size: 716 B |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
BIN
images/blog/outsourcing-my-memory-to-gum/donpm.gif
Normal file
|
After Width: | Height: | Size: 95 KiB |
17
images/blog/outsourcing-my-memory-to-gum/donpm.sh
Normal 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
|
||||
}
|
||||
16
images/blog/outsourcing-my-memory-to-gum/donpm.tape
Normal 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
|
||||
BIN
images/blog/outsourcing-my-memory-to-gum/script-discovery.gif
Normal file
|
After Width: | Height: | Size: 106 KiB |
|
|
@ -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
|
||||
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 153 KiB After Width: | Height: | Size: 153 KiB |
20761
package-lock.json
generated
|
|
@ -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"
|
||||
}
|
||||
|
|
|
|||
125
src/_data/freetubeCategories.js
Normal 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;
|
||||
};
|
||||
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
|
|
@ -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.
|
||||
|
||||

|
||||
<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!
|
||||
|
||||

|
||||

|
||||
<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.' />
|
||||

|
||||

|
||||
<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.
|
||||
37
src/blog/automating-my-youtube-channel-list/index.md
Normal 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.
|
||||
|
Before Width: | Height: | Size: 2.6 MiB After Width: | Height: | Size: 2.6 MiB |
|
Before Width: | Height: | Size: 1.7 MiB After Width: | Height: | Size: 1.7 MiB |
|
Before Width: | Height: | Size: 296 KiB After Width: | Height: | Size: 296 KiB |
|
Before Width: | Height: | Size: 2.4 MiB After Width: | Height: | Size: 2.4 MiB |
|
Before Width: | Height: | Size: 2 MiB After Width: | Height: | Size: 2 MiB |
|
Before Width: | Height: | Size: 1.9 MiB After Width: | Height: | Size: 1.9 MiB |
|
Before Width: | Height: | Size: 2 MiB After Width: | Height: | Size: 2 MiB |
|
Before Width: | Height: | Size: 2 MiB After Width: | Height: | Size: 2 MiB |
|
Before Width: | Height: | Size: 6.7 MiB After Width: | Height: | Size: 6.7 MiB |
|
Before Width: | Height: | Size: 2.3 MiB After Width: | Height: | Size: 2.3 MiB |
|
Before Width: | Height: | Size: 2.2 MiB After Width: | Height: | Size: 2.2 MiB |
|
Before Width: | Height: | Size: 3.1 MiB After Width: | Height: | Size: 3.1 MiB |
|
Before Width: | Height: | Size: 2.5 MiB After Width: | Height: | Size: 2.5 MiB |
|
|
@ -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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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.
|
||||
|
||||
|
Before Width: | Height: | Size: 252 KiB After Width: | Height: | Size: 252 KiB |
|
|
@ -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.
|
||||
|
||||

|
||||

|
||||
|
||||
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.
|
||||
|
||||
|
|
@ -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.
|
||||
---
|
||||
|
|
@ -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.
|
||||
---
|
||||
|
|
@ -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.
|
||||
---
|
||||
|
|
@ -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…
|
||||
---
|
||||
128
src/blog/outsourcing-my-memory-to-gum/index.md
Normal 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)
|
||||
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 903 KiB After Width: | Height: | Size: 903 KiB |
|
Before Width: | Height: | Size: 2 MiB After Width: | Height: | Size: 2 MiB |
|
Before Width: | Height: | Size: 790 KiB After Width: | Height: | Size: 790 KiB |
|
Before Width: | Height: | Size: 617 KiB After Width: | Height: | Size: 617 KiB |
|
Before Width: | Height: | Size: 2 MiB After Width: | Height: | Size: 2 MiB |
|
Before Width: | Height: | Size: 1.4 MiB After Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 1.7 MiB After Width: | Height: | Size: 1.7 MiB |
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.4 MiB After Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 677 KiB After Width: | Height: | Size: 677 KiB |
|
Before Width: | Height: | Size: 157 KiB After Width: | Height: | Size: 157 KiB |
|
|
@ -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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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.
|
||||
13
src/blog/rideshare-renegades/index.md
Normal 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&fg_color=eeeeee&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>.
|
||||
|
Before Width: | Height: | Size: 158 KiB After Width: | Height: | Size: 158 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 71 KiB |
|
|
@ -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.
|
||||
|
||||

|
||||

|
||||
|
||||
[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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
Quake’s 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 game’s 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 user’s modem or entering another player’s IP address in the game client. Enter QSpy, a Quake server browser that made it easier to find and connect to multiplayer games.
|
||||
|
||||

|
||||

|
||||
|
||||
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.
|
||||
|
||||
|
|
@ -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.
|
||||
---
|
||||
|
|
@ -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.
|
||||
---
|
||||
|
|
@ -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?
|
||||
---
|
||||
36
src/feed/automating-my-youtube-channel-list.md
Normal 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.
|
||||
|
|
@ -15,7 +15,7 @@ I'll be looking at some subjective factors like my own experiences existing in t
|
|||
|
||||
# Braga, Portugal
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||

|
||||

|
||||
|
||||
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.
|
||||
|
||||
|
|
|
|||
127
src/feed/outsourcing-my-memory-to-gum.md
Normal 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)
|
||||
|
|
@ -9,25 +9,25 @@ These are my thoughts on some games I've played over the last few months, in no
|
|||
|
||||
# Spookware
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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.
|
||||
|
|
|
|||
12
src/feed/rideshare-renegades.md
Normal 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&fg_color=eeeeee&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>.
|
||||
|
|
@ -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.
|
||||
|
||||

|
||||

|
||||
|
||||
[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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
Quake’s 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 game’s 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 user’s modem or entering another player’s IP address in the game client. Enter QSpy, a Quake server browser that made it easier to find and connect to multiplayer games.
|
||||
|
||||

|
||||

|
||||
|
||||
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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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 %}
|
||||
|
|
|
|||