<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><description>The latest blog posts from Corbin Davenport.</description><title>Corbin's Blog</title><generator>Tumblr (3.0; @corbindavenport)</generator><link>https://blog.corbin.io/</link><item><title>Why I left How-To Geek and Valnet</title><description>&lt;p&gt;I quit my role as News Editor of How-To Geek last week. It was the best job I ever had, until the company was sold to Valnet in 2023, one year after I started. The goals slowly became completely detached from reality, and the abysmal technical stack made actual productivity a daily struggle. I tried my best to maintain high editorial standards, but I’ll let others decide if I sufficiently achieved that goal.&lt;/p&gt;&lt;p&gt;I have only been in the tech journalism/blogging industry for about nine years. Still, I feel like the ladder that I climbed up has been burned behind me. There are so many people in this industry who pushed me to be a better writer, a better researcher, and a better person. I wanted to carry that debt forward, but that’s difficult to do in an environment that prioritizes quantity over quality.&lt;/p&gt;&lt;p&gt;This industry has rapidly consolidated—three of the four publications I have worked at are now owned by Valnet. There are only a handful of companies left who will pay for a full-time tech reporter or editor in the United States at a living wage, and I applied at all of them many times over a period of ~2.5 years. I achieved a grand total of two tech reporter/editor interviews, plus one interview for a marketing job. I still had health insurance and rent money the entire time, though, which is a lot better than many other folks in this industry.&lt;/p&gt;&lt;p&gt;I have been persistently burnt out for the last 6-8 months because of this job. It made me miserable and jaded, and I know I dumped that miserable attitude onto others at times. I’m eternally thankful for my friends for putting up with that, and I will try my best to not be that person in the future.&lt;/p&gt;&lt;p&gt;There are still a lot of good people at How-To Geek, and other Valnet publications, and some good articles and videos—I hate the word “content,” sorry. However, I strongly believe that everything good coming out of Valnet happens &lt;i&gt;despite&lt;/i&gt; of Valnet, not because of it. If you see a genuinely good article, it’s because someone wasn’t paid enough for it, or they worked overtime, or they went over their time budget for that one and won’t reach their output goals this month.&lt;/p&gt;&lt;p&gt;This week, I’m changing careers, and I’ll talk more about that soon. My own &lt;a href="https://www.spacebar.news/subscribe"&gt;tech blog&lt;/a&gt; (not the one you&amp;rsquo;re reading right now), &lt;a href="https://techtalesshow.com/"&gt;tech history podcast&lt;/a&gt;, and &lt;a href="https://corbin.io/software/"&gt;software side projects&lt;/a&gt; are still going strong, so check those out.&lt;/p&gt;</description><link>https://blog.corbin.io/post/813115537888608256</link><guid>https://blog.corbin.io/post/813115537888608256</guid><pubDate>Sun, 05 Apr 2026 23:50:04 -0400</pubDate></item><item><title>Nexus Tools is now discontinued</title><description>&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="1080" data-orig-width="1920"&gt;&lt;img src="https://64.media.tumblr.com/4d161d289a77c874c0eab31e178a490b/319dc3e8a7dbfa7b-2e/s640x960/a602d97052684983350ed3117355c7790b5eb7b4.jpg" data-orig-height="1080" data-orig-width="1920" alt="A meme image of a person smiling over a grave. The grave says Nexus Tools, and the person is labelled as winget, brew, and linux repositories." srcset="https://64.media.tumblr.com/4d161d289a77c874c0eab31e178a490b/319dc3e8a7dbfa7b-2e/s75x75_c1/6c86b97f280026ac06f6e4818bd5dd78ff158bed.jpg 75w, https://64.media.tumblr.com/4d161d289a77c874c0eab31e178a490b/319dc3e8a7dbfa7b-2e/s100x200/b8da2368563ad8598c08965c1fdc688480cb057b.jpg 100w, https://64.media.tumblr.com/4d161d289a77c874c0eab31e178a490b/319dc3e8a7dbfa7b-2e/s250x400/5fd5fd0d330a9cb0ea1d3f4a50ba4c458d8a1fb0.jpg 250w, https://64.media.tumblr.com/4d161d289a77c874c0eab31e178a490b/319dc3e8a7dbfa7b-2e/s400x600/62414f8b1adc8d52ae7d194cd77d6d9f373e92d1.jpg 400w, https://64.media.tumblr.com/4d161d289a77c874c0eab31e178a490b/319dc3e8a7dbfa7b-2e/s500x750/404832a1755929deee8e1e9aeea27542681ae284.jpg 500w, https://64.media.tumblr.com/4d161d289a77c874c0eab31e178a490b/319dc3e8a7dbfa7b-2e/s540x810/9c9e8c4a288094f4195edeea03dc8c77b9e00430.jpg 540w, https://64.media.tumblr.com/4d161d289a77c874c0eab31e178a490b/319dc3e8a7dbfa7b-2e/s640x960/a602d97052684983350ed3117355c7790b5eb7b4.jpg 640w, https://64.media.tumblr.com/4d161d289a77c874c0eab31e178a490b/319dc3e8a7dbfa7b-2e/s1280x1920/551f31a340c00bb815142793ca3cc05bce37b78b.jpg 1280w, https://64.media.tumblr.com/4d161d289a77c874c0eab31e178a490b/319dc3e8a7dbfa7b-2e/s2048x3072/13dbd5083b0a784d261af0e9bf16ff0a3b6e20fa.jpg 1920w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;I have officially ended development of &lt;a href="https://github.com/corbindavenport/nexus-tools"&gt;Nexus Tools&lt;/a&gt;, my installer for ADB, Fastboot, and other Android system tools for Windows, Mac, and Linux. It&amp;rsquo;s for a good reason, though: the alternatives are better and more accessible.&lt;/p&gt;&lt;!-- more --&gt;&lt;p&gt;When I made the first version of Nexus Tools for Linux and Mac in 2013, Google did not provide ADB, Fastboot, and other common Android utilities as simple downloads. You had to install the Android SDK first, or download the binaries from somewhere else and add them to your system&amp;rsquo;s path. Some Linux distributions had them available as a package, but they were often out of date. Nexus Tools turned the installation into a one-step process, using a Bash script and mirrored copies of Google&amp;rsquo;s binaries.&lt;/p&gt;&lt;p&gt;Later versions added improved support for Chrome OS and the Windows Subsystem for Linux (at the time, &lt;a href="https://www.poppastring.com/blog/adding-bash-on-windows-10new-dev-tools"&gt;Bash for Windows 10&lt;/a&gt;), udev rules installation to fix USB detection issues on Linux, fixes for different shell environments, and other small improvements. Nexus Tools was covered by &lt;a href="https://www.makeuseof.com/how-to-unlock-android-device-bootloader"&gt;MakeUseOf&lt;/a&gt;, &lt;a href="https://www.xda-developers.com/set-up-adb-and-fastboot-on-linux-mac-os-x-and-chrome-os-with-a-single-command/"&gt;XDA&lt;/a&gt;, &lt;a href="https://www.androidpolice.com/install-and-use-adb-on-windows-mac-linux-android-chromebooks-browser/"&gt;Android Police&lt;/a&gt;, &lt;a href="https://9to5google.com/2021/12/02/how-to-downgrade-from-android-12-to-android-11-on-google-pixel/#:~:text=Nexus%20Tools"&gt;9to5Google&lt;/a&gt;, &lt;a href="https://wccftech.com/set-android-adb-fastboot-mac-os/"&gt;Wccftech&lt;/a&gt;, &lt;a href="https://www.redmondpie.com/how-to-install-android-5.0-lollipop-on-nexus-5-using-mac-the-easy-way/"&gt;Redmond Pie&lt;/a&gt;, and other outlets over the years. In 2021, I &lt;a href="https://blog.corbin.io/post/661416060249128960/nexus-tools-5"&gt;rewrote it in Dart&lt;/a&gt; and added support for Windows.&lt;/p&gt;&lt;p&gt;However, Nexus Tools gradually became unnecessary. In 2017, Google &lt;a href="https://www.xda-developers.com/google-releases-separate-adb-and-fastboot-binary-downloads/"&gt;finally created an official download&lt;/a&gt; for ADB and Fastboot without the Android SDK, and Nexus Tools switched to that method shortly afterwards. That download also made it easy for other package managers to offer ADB and Fastboot, and keep them updated along with all your other installed software.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="960" data-orig-width="1972"&gt;&lt;img src="https://64.media.tumblr.com/002f4bca615633a8bc15be0911219b90/319dc3e8a7dbfa7b-f6/s640x960/647b75bcb3779d8bb520ad39510252e19f862da6.png" data-orig-height="960" data-orig-width="1972" alt="Graph showing Nexus Tools users from October 2021 to February 2026" srcset="https://64.media.tumblr.com/002f4bca615633a8bc15be0911219b90/319dc3e8a7dbfa7b-f6/s75x75_c1/1998288c35b9e174ef13814ebdd8b885459ec5ab.png 75w, https://64.media.tumblr.com/002f4bca615633a8bc15be0911219b90/319dc3e8a7dbfa7b-f6/s100x200/c2b1f0ff26a9d3122f3a08305525f4aa8e73fc34.png 100w, https://64.media.tumblr.com/002f4bca615633a8bc15be0911219b90/319dc3e8a7dbfa7b-f6/s250x400/43a3cc93903f8eaf548e0f8ccd4e0b36ff73e30a.png 250w, https://64.media.tumblr.com/002f4bca615633a8bc15be0911219b90/319dc3e8a7dbfa7b-f6/s400x600/538596e231360762fa2876293ed3f11d24bd99bd.png 400w, https://64.media.tumblr.com/002f4bca615633a8bc15be0911219b90/319dc3e8a7dbfa7b-f6/s500x750/e0f9a203d27c7dc383163f5f4cfcb56d52c875c0.png 500w, https://64.media.tumblr.com/002f4bca615633a8bc15be0911219b90/319dc3e8a7dbfa7b-f6/s540x810/5d286f69289c1aff48e3ff6c7501f73190521fc3.png 540w, https://64.media.tumblr.com/002f4bca615633a8bc15be0911219b90/319dc3e8a7dbfa7b-f6/s640x960/647b75bcb3779d8bb520ad39510252e19f862da6.png 640w, https://64.media.tumblr.com/002f4bca615633a8bc15be0911219b90/319dc3e8a7dbfa7b-f6/s1280x1920/682b37a80d0d6696ccb07da009a67faf17b1e538.png 1280w, https://64.media.tumblr.com/002f4bca615633a8bc15be0911219b90/319dc3e8a7dbfa7b-f6/s2048x3072/f174f7ff3b725c500c0851510605ed37f9030c1a.png 1972w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;The easy availability of other methods, along with fewer breaking changes in new versions of Android, has contributed to Nexus Tools usage dropping over the years. Nexus Tools peaked at around 500 users per week in 2023, and now averages around 50 users per week.&lt;/p&gt;&lt;p&gt;Nexus Tools is cited in many guides and videos around Android modding and development, and I didn&amp;rsquo;t want to break those resources. If you run one of the Nexus Tools installation scripts today, you will see instructions for installing ADB and Fastboot with another package manager, such as Homebrew, Winget, APT, or DNF. The &lt;a href="https://github.com/corbindavenport/nexus-tools/blob/main/README.md"&gt;Readme file in the GitHub repository&lt;/a&gt; contains the same instructions.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="1225" data-orig-width="2350"&gt;&lt;img src="https://64.media.tumblr.com/dcde78d74656c030e28d961732e4ca04/319dc3e8a7dbfa7b-a3/s640x960/9cce2873925a81ad7e3798a75155bc9fd960c86e.png" data-orig-height="1225" data-orig-width="2350" alt="Nexus Tools script asking the user to install ADB and Fastboot with Winget" srcset="https://64.media.tumblr.com/dcde78d74656c030e28d961732e4ca04/319dc3e8a7dbfa7b-a3/s75x75_c1/3c340b90ed438c0b050d30d3c8b31b3d57b2db24.png 75w, https://64.media.tumblr.com/dcde78d74656c030e28d961732e4ca04/319dc3e8a7dbfa7b-a3/s100x200/236f2994ac54be36fd053a1b196df514f398992d.png 100w, https://64.media.tumblr.com/dcde78d74656c030e28d961732e4ca04/319dc3e8a7dbfa7b-a3/s250x400/53a8baf0a722386e409f6f040e71931019b7a2d7.png 250w, https://64.media.tumblr.com/dcde78d74656c030e28d961732e4ca04/319dc3e8a7dbfa7b-a3/s400x600/42cb8f6964d5cdf3889c525ae28283c087df8081.png 400w, https://64.media.tumblr.com/dcde78d74656c030e28d961732e4ca04/319dc3e8a7dbfa7b-a3/s500x750/1a44b3c55ee1d9f575eb1d5c2705ec6c6758a900.png 500w, https://64.media.tumblr.com/dcde78d74656c030e28d961732e4ca04/319dc3e8a7dbfa7b-a3/s540x810/6299c46ccca89b386ed20b9e8eb100705178f357.png 540w, https://64.media.tumblr.com/dcde78d74656c030e28d961732e4ca04/319dc3e8a7dbfa7b-a3/s640x960/9cce2873925a81ad7e3798a75155bc9fd960c86e.png 640w, https://64.media.tumblr.com/dcde78d74656c030e28d961732e4ca04/319dc3e8a7dbfa7b-a3/s1280x1920/b867c16ec91d6a9284432898992055ba6d9417d7.png 1280w, https://64.media.tumblr.com/dcde78d74656c030e28d961732e4ca04/319dc3e8a7dbfa7b-a3/s2048x3072/8543786bd8bee7fbae6e074b78d076be5186b51f.png 2048w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;If you already have those applications installed on your system with Nexus Tools, the script will offer to delete those copies, so they don&amp;rsquo;t conflict with the other methods. There are also standalone uninstall scripts for Mac, Linux, and Windows in the repository.&lt;/p&gt;&lt;p&gt;Nexus Tools had a good run, but it&amp;rsquo;s turned into a package manager for one specific package, and it&amp;rsquo;s just not needed at this point.&lt;/p&gt;&lt;h2&gt;Nexus Tools statistics&lt;/h2&gt;&lt;p&gt;As a final farewell, here are some fun statistics about Nexus Tools, using the data collected from November 2023 to February 2026 through Plausible Analytics. &lt;/p&gt;&lt;p&gt;&lt;b&gt;Installations by platform&lt;/b&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Windows 64-bit x86: 23.4k&lt;/li&gt;&lt;li&gt;macOS 64-bit x86: 7.9k&lt;/li&gt;&lt;li&gt;macOS Apple Silicon: 6.8k&lt;/li&gt;&lt;li&gt;Linux 64-bit x86: 3.2k&lt;/li&gt;&lt;li&gt;ChromeOS 64-bit x86: 1.7k&lt;/li&gt;&lt;li&gt;Windows Subsystem for Linux (WSL) 64-bit x86: 252&lt;/li&gt;&lt;li&gt;Windows Subsystem for Linux (WSL) 64-bit ARM: 41&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;Installations by country&lt;/b&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;United States: 5.9k&lt;/li&gt;&lt;li&gt;Poland: 1.4k&lt;/li&gt;&lt;li&gt;India: 1.3k&lt;/li&gt;&lt;li&gt;United Kingdom: 1.2k&lt;/li&gt;&lt;li&gt;Canada: 1k&lt;/li&gt;&lt;li&gt;Italy: 976&lt;/li&gt;&lt;li&gt;Germany: 814&lt;/li&gt;&lt;li&gt;Vietnam: 580&lt;/li&gt;&lt;li&gt;Russia: 620&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Bye, Nexus Tools. &#128075;&lt;/p&gt;</description><link>https://blog.corbin.io/post/809284475060174848</link><guid>https://blog.corbin.io/post/809284475060174848</guid><pubDate>Sun, 22 Feb 2026 15:56:58 -0500</pubDate></item><item><title>Introducing Just the Browser</title><description>&lt;p&gt;Modern web browsers are increasingly focused on features beyond the core browsing experience, many of which just end up as distractions. &lt;a href="https://support.google.com/chrome/answer/11625545?hl=en"&gt;Chrome gives you coupon codes&lt;/a&gt; while shopping. Microsoft Edge fills the New Tab page with clickbait garbage articles from MSN, and previously &lt;a href="https://www.bbc.com/news/technology-59492429"&gt;tried to sell you loans&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The generative AI era has made this &lt;i&gt;even worse&lt;/i&gt;. Google&amp;rsquo;s Gemini AI is now everywhere in Chrome, and the AI Search mode that told people to &lt;a href="https://www.howtogeek.com/google-search-ai-overview-responses/"&gt;eat rocks and cook with glue&lt;/a&gt; is now prominently featured in the address bar. Edge also has countless Copilot AI integrations, and &lt;a href="https://blog.mozilla.org/en/firefox/ai-window/"&gt;Firefox is getting an AI browsing mode&lt;/a&gt;. When these features aren&amp;rsquo;t using cloud AI services, &lt;a href="https://developer.chrome.com/docs/ai/built-in"&gt;Chrome&lt;/a&gt;, &lt;a href="https://learn.microsoft.com/en-us/microsoft-edge/web-platform/prompt-api"&gt;Edge&lt;/a&gt;, and &lt;a href="https://support.mozilla.org/en-US/kb/on-device-models"&gt;Firefox&lt;/a&gt; have their own local AI models that eat up system resources.&lt;/p&gt;&lt;p&gt;Call me old fashioned, but I want my web browser to be &lt;i&gt;just be a browser&lt;/i&gt;. I don&amp;rsquo;t want shopping integrations, or AI agents taking over my cursor, or local AI models running constantly in the background just to reshuffle my tabs. I shouldn&amp;rsquo;t have to resort to Safari or half-working Firefox forks for that.&lt;/p&gt;&lt;p&gt;My solution is &lt;a href="https://justthebrowser.com/"&gt;Just the Browser&lt;/a&gt;.&lt;/p&gt;&lt;!-- more --&gt;&lt;h2&gt;Making a better browser&lt;/h2&gt;&lt;p&gt;Just the Browser helps you remove AI features, telemetry data reporting, sponsored content, product integrations, and other annoyances from desktop web browsers. It accomplishes this with &lt;a href="https://en.wikipedia.org/wiki/Group_Policy"&gt;group policy&lt;/a&gt; configurations—hidden settings provided by Google, Mozilla, and Microsoft for businesses and other large organizations. Those options are how IT departments can lock down certain features for computers at work or school, but now they can be a force for good.&lt;/p&gt;&lt;p&gt;You know that &lt;a href="https://www.vice.com/en/article/firefox-will-let-users-shut-off-ai-with-a-kill-switch/"&gt;&amp;ldquo;AI kill switch&amp;rdquo; that Firefox will eventually add&lt;/a&gt;? It&amp;rsquo;s already a hidden setting that Just the Browser can enable for you. It will also turn off all Gemini and AI Mode features in Chrome. In Microsoft Edge, it turns off all Copilot features, advertisements for Adobe Reader, articles and ads on the New Tab page, automatic data import from other browsers, and much more.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="1436" data-orig-width="2400"&gt;&lt;img src="https://64.media.tumblr.com/2774e2c83b9cd49a9feeeeec35c7032a/1992a64ffe1930ad-60/s640x960/7f216a22e4ea33374fd74e6d8051f79c9f5cfc41.png" data-orig-height="1436" data-orig-width="2400" alt="Microsoft Edge with policy settings disabled" srcset="https://64.media.tumblr.com/2774e2c83b9cd49a9feeeeec35c7032a/1992a64ffe1930ad-60/s75x75_c1/571fa8600993111016832afca96b2bbf77cfd7a4.png 75w, https://64.media.tumblr.com/2774e2c83b9cd49a9feeeeec35c7032a/1992a64ffe1930ad-60/s100x200/d26b29595a55565f8279abf577ca574f3dff96bc.png 100w, https://64.media.tumblr.com/2774e2c83b9cd49a9feeeeec35c7032a/1992a64ffe1930ad-60/s250x400/a48b0c80fd315f6073567ff28c71395492c31bb0.png 250w, https://64.media.tumblr.com/2774e2c83b9cd49a9feeeeec35c7032a/1992a64ffe1930ad-60/s400x600/ef895f292dbc29dab75b1ea652b59ff363290257.png 400w, https://64.media.tumblr.com/2774e2c83b9cd49a9feeeeec35c7032a/1992a64ffe1930ad-60/s500x750/f0c1d275d6fc3ad29784b365760e523da9fc3851.png 500w, https://64.media.tumblr.com/2774e2c83b9cd49a9feeeeec35c7032a/1992a64ffe1930ad-60/s540x810/d50b1e8894af95b0d541b56e7e7a03235dff68af.png 540w, https://64.media.tumblr.com/2774e2c83b9cd49a9feeeeec35c7032a/1992a64ffe1930ad-60/s640x960/7f216a22e4ea33374fd74e6d8051f79c9f5cfc41.png 640w, https://64.media.tumblr.com/2774e2c83b9cd49a9feeeeec35c7032a/1992a64ffe1930ad-60/s1280x1920/ad581e755095f17e11babbd581aa39251a012370.png 1280w, https://64.media.tumblr.com/2774e2c83b9cd49a9feeeeec35c7032a/1992a64ffe1930ad-60/s2048x3072/dcf88a7796cc53aa798269f0a76b740c43413fc8.png 2048w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;Importantly, all that functionality &lt;i&gt;remains&lt;/i&gt; disabled, which isn&amp;rsquo;t always the case with user-accessible settings. For example, Microsoft Edge likes to &lt;a href="https://www.reddit.com/r/MicrosoftEdge/comments/zhkiod/is_there_any_way_to_prevent_edge_from_changing_my/"&gt;revert your New Tab page settings after a while&lt;/a&gt;, so you see those garbage MSN articles again. That does not happen with group policy settings.&lt;/p&gt;&lt;p&gt;Everyone has their own definition of &amp;ldquo;bloatware&amp;rdquo; and &amp;ldquo;spyware,&amp;rdquo; so the default configurations are limited in scope. They don&amp;rsquo;t go full minimalist, nor do they install extensions to boost privacy and security.&lt;/p&gt;&lt;p&gt;Just the Browser includes browser configurations for Windows, Linux, and macOS, along with guides for installing them. The documentation also explains each setting that is changed. The best part is the setup script, which can install or delete the configuration files for you in just a few clicks. They are regular Bash and PowerShell scripts, so they work on everything from x86 Fedora Linux to ARM Windows 11.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="910" data-orig-width="3324"&gt;&lt;img src="https://64.media.tumblr.com/a61ad42ab6c65c5fa5c13b643e4d80e5/1992a64ffe1930ad-37/s640x960/fbdc7d4fb7db75d9f087a7ad2f228de6084778b9.png" data-orig-height="910" data-orig-width="3324" alt="Install script on Windows and macOS" srcset="https://64.media.tumblr.com/a61ad42ab6c65c5fa5c13b643e4d80e5/1992a64ffe1930ad-37/s75x75_c1/af1d82ba60b8a602955eb28034f38537ab11c8ab.png 75w, https://64.media.tumblr.com/a61ad42ab6c65c5fa5c13b643e4d80e5/1992a64ffe1930ad-37/s100x200/4b14906de43c3df7866440a634abbc97ccbe4314.png 100w, https://64.media.tumblr.com/a61ad42ab6c65c5fa5c13b643e4d80e5/1992a64ffe1930ad-37/s250x400/f4dc61458ef4b1676be55122a8c082941c3f835e.png 250w, https://64.media.tumblr.com/a61ad42ab6c65c5fa5c13b643e4d80e5/1992a64ffe1930ad-37/s400x600/c8421530614a96def3bd3a3078949535696278e6.png 400w, https://64.media.tumblr.com/a61ad42ab6c65c5fa5c13b643e4d80e5/1992a64ffe1930ad-37/s500x750/0facfe43016d607ee717d95dfb939b2c7810583c.png 500w, https://64.media.tumblr.com/a61ad42ab6c65c5fa5c13b643e4d80e5/1992a64ffe1930ad-37/s540x810/0a0f72dfed086608688e2ac9d03a0878614bc639.png 540w, https://64.media.tumblr.com/a61ad42ab6c65c5fa5c13b643e4d80e5/1992a64ffe1930ad-37/s640x960/fbdc7d4fb7db75d9f087a7ad2f228de6084778b9.png 640w, https://64.media.tumblr.com/a61ad42ab6c65c5fa5c13b643e4d80e5/1992a64ffe1930ad-37/s1280x1920/262c2efe9f9501c1ac0a78e504e7b0fe95b9db56.png 1280w, https://64.media.tumblr.com/a61ad42ab6c65c5fa5c13b643e4d80e5/1992a64ffe1930ad-37/s2048x3072/81fa6c3d4f468a1a8ee30405bb477d0042540407.png 2048w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;The entire project is &lt;a href="https://github.com/corbindavenport/just-the-browser"&gt;open-source on GitHub&lt;/a&gt;, including the configuration files, documentation, scripts, and website. The configuration settings used by web browsers will change over time, and I&amp;rsquo;m hoping others will help me stay on top of changes and add support for more browsers.&lt;/p&gt;&lt;h2&gt;Why not alternative browsers?&lt;/h2&gt;&lt;p&gt;I know the most common response to this project will be &amp;ldquo;why not switch to [x] browser?&amp;rdquo; It&amp;rsquo;s true that LibreWolf, SeaMonkey, fresh Chromium builds, and various other Firefox forks are closer to a minimal browsing experience. Vivaldi would also fit the bill after changing a few settings—as far as I know, it doesn&amp;rsquo;t quietly turn features back on like Edge does.&lt;/p&gt;&lt;p&gt;However, most of those browsers have downsides. LibreWolf is one of the popular Firefox forks at the moment, but the project&amp;rsquo;s own FAQ &lt;a href="https://librewolf.net/docs/faq/#why-dont-you-accept-donations"&gt;promises &amp;ldquo;no expectations&amp;rdquo; of continued support&lt;/a&gt;, and it &lt;a href="https://librewolf.net/docs/faq/#why-is-librewolf-marked-as-broken"&gt;doesn&amp;rsquo;t have signed macOS builds&lt;/a&gt;. They don&amp;rsquo;t always offer data synchronization with accounts or DRM support. When a zero-day security vulnerability is found in Chromium or Firefox, it can sometimes take a while to trickle down to the various forked browsers.&lt;/p&gt;&lt;p&gt;With the custom configurations in Just the Browser, you can keep using mainstream web browsers with all of their upsides—like fast updates, robust platform support, account synchronization support, and DRM video playback—but without many of the usual annoyances. The best of both worlds.&lt;/p&gt;&lt;h2&gt;Try it out&lt;/h2&gt;&lt;p&gt;You can visit &lt;a href="https://justthebrowser.com/"&gt;justthebrowser.com&lt;/a&gt; to run the setup script, read through the documentation, and download the configuration files. I hope this will be a useful resource for years to come.&lt;/p&gt;</description><link>https://blog.corbin.io/post/805641962529177600</link><guid>https://blog.corbin.io/post/805641962529177600</guid><pubDate>Tue, 13 Jan 2026 11:00:47 -0500</pubDate><category>chrome</category><category>firefox</category><category>microsoft edge</category><category>windows 11</category><category>windows 10</category><category>deshittification</category><category>debloat</category></item><item><title>Corbin&amp;rsquo;s favorite media of 2025</title><description>&lt;p&gt;There&amp;rsquo;s only a few hours left in 2025, so I figured now is a good time to share some of the movies, shows, games, books, and podcasts I enjoyed this year. I love seeing these lists from other people, but I&amp;rsquo;ve never done one except for &lt;a href="https://www.spacebar.news/best-worst-video-games-2023/"&gt;a games list in 2023&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;As a quick note, this list is not restricted to media released in 2025. I&amp;rsquo;m not counting movies or shows I rewatched, but anything else is fair game. I&amp;rsquo;ll also avoid spoilers.&lt;/p&gt;&lt;!-- more --&gt;&lt;h2&gt;Movies&lt;/h2&gt;&lt;p&gt;I watched a lot of movies this year, though much of it bordered on masochism, including many old James Bond films and a &lt;a href="https://bsky.app/profile/corbin.io/post/3lj2kx4nhcj2t"&gt;DCEU marathon&lt;/a&gt;. Not all of it was bad, though. Also, you can &lt;a href="https://letterboxd.com/corbindavenport/"&gt;follow me on Letterboxd&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;b&gt;The Bad Guys 2 (2025)&lt;/b&gt;: &lt;i&gt;The Bad Guys&lt;/i&gt; is one of my favorite Dreamworks movies, and the sequel is also a lot of fun with fantastic animation. Despite its official status as a family movie, it has &lt;i&gt;even more&lt;/i&gt; sexual undertones than the first entry, somehow.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="800" data-orig-width="1882"&gt;&lt;img src="https://64.media.tumblr.com/55a2d82a8ca41bda685c4ca82867411d/c2ecdc5bd5a8e793-14/s640x960/07879ad152ab17e45ff3b0c7503c3ed0130ca6d8.jpg" data-orig-height="800" data-orig-width="1882" alt="Characters from The Bad Guys 2 driving in a car" srcset="https://64.media.tumblr.com/55a2d82a8ca41bda685c4ca82867411d/c2ecdc5bd5a8e793-14/s75x75_c1/fb1c35ac053d777d198b069160ccfabe7efa7b54.jpg 75w, https://64.media.tumblr.com/55a2d82a8ca41bda685c4ca82867411d/c2ecdc5bd5a8e793-14/s100x200/58e613e532f31af08aee06bfc5968c1de9111534.jpg 100w, https://64.media.tumblr.com/55a2d82a8ca41bda685c4ca82867411d/c2ecdc5bd5a8e793-14/s250x400/d8b65b24c0af3481bb01bf6f1a7df3d947bef402.jpg 250w, https://64.media.tumblr.com/55a2d82a8ca41bda685c4ca82867411d/c2ecdc5bd5a8e793-14/s400x600/b69ace0d36a1b712820b2f60566e4cafe333ff52.jpg 400w, https://64.media.tumblr.com/55a2d82a8ca41bda685c4ca82867411d/c2ecdc5bd5a8e793-14/s500x750/c6a67c5509baf5024331746b3beda0f9ebd178cb.jpg 500w, https://64.media.tumblr.com/55a2d82a8ca41bda685c4ca82867411d/c2ecdc5bd5a8e793-14/s540x810/e1b83d662087efff86087809add2ddd9eacae3a8.jpg 540w, https://64.media.tumblr.com/55a2d82a8ca41bda685c4ca82867411d/c2ecdc5bd5a8e793-14/s640x960/07879ad152ab17e45ff3b0c7503c3ed0130ca6d8.jpg 640w, https://64.media.tumblr.com/55a2d82a8ca41bda685c4ca82867411d/c2ecdc5bd5a8e793-14/s1280x1920/4b917ad87bd39f9d6c6d7099b9de3de7a47571d7.jpg 1280w, https://64.media.tumblr.com/55a2d82a8ca41bda685c4ca82867411d/c2ecdc5bd5a8e793-14/s2048x3072/db90c43eeb8516d6581b389b9b69721efbd05614.jpg 1882w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;Shin Godzilla (2016):&lt;/b&gt; This is &amp;ldquo;this meeting could have been an email&amp;rdquo; as a disaster film, and it works incredibly well. Godzilla is once again attacking Japan, but before the monster can be stopped, a small group has to push through endless layers of bureaucracy. It&amp;rsquo;s a much different movie than &lt;i&gt;Godzilla Minus One&lt;/i&gt;, which I also enjoyed a lot.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Coco (2017)&lt;/b&gt;: This was one of the few Pixar movies I never saw when it was new, and it&amp;rsquo;s absolutely one of my favorites from the studio. Coco is drop-dead gorgeous, has some fantastic music, and hit me directly in the feels just like &lt;i&gt;Inside Out&lt;/i&gt;.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Pirates of Silicon Valley (1999):&lt;/b&gt; This is a biographical drama film made for TNT, depicting the rise of Microsoft and Apple from the 1970s up to 1997, primarily focusing on Bill Gates and Steve Jobs. This isn&amp;rsquo;t a fantastic movie, but it was interesting to me as a retrospective made &lt;i&gt;before&lt;/i&gt; Jobs or Gates hit their peaks in public life. It also (mostly) stays away from glorifying either person or the tech industry at large, and even though Noah Wyle&amp;rsquo;s performance as Steve Jobs was great, &lt;a href="https://bsky.app/profile/corbin.io/post/3ltzarll6ms2c"&gt;John DiMaggio as Steve Ballmer&lt;/a&gt; is perhaps the most perfect casting of all time. I also discussed the movie in &lt;a href="https://www.youtube.com/watch?v=-Ylhbm24a0Y"&gt;a Tech Tales episode&lt;/a&gt;.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="540" data-orig-width="720"&gt;&lt;img src="https://64.media.tumblr.com/394b47fdab1b7ffb6c0bc83912d075c2/c2ecdc5bd5a8e793-8a/s640x960/317c1e066e36d1a352bd6810fd16b53059cc308b.jpg" data-orig-height="540" data-orig-width="720" alt="Steve Jobs, Bill Gates, Steve Ballmer, and others gathered around a Mac computer in Pirates of Silicon Valley" srcset="https://64.media.tumblr.com/394b47fdab1b7ffb6c0bc83912d075c2/c2ecdc5bd5a8e793-8a/s75x75_c1/dcfdd1a1cc73727821c97840ee5777511f8e28ee.jpg 75w, https://64.media.tumblr.com/394b47fdab1b7ffb6c0bc83912d075c2/c2ecdc5bd5a8e793-8a/s100x200/8ca021aedbc917b8bdc959eb6bc81799fe7c3346.jpg 100w, https://64.media.tumblr.com/394b47fdab1b7ffb6c0bc83912d075c2/c2ecdc5bd5a8e793-8a/s250x400/7c0e7b1f40f1a45738bd4762df3cd7fcd8d93b05.jpg 250w, https://64.media.tumblr.com/394b47fdab1b7ffb6c0bc83912d075c2/c2ecdc5bd5a8e793-8a/s400x600/0160b173e10341073c815a5f5b9cc08859ad94a9.jpg 400w, https://64.media.tumblr.com/394b47fdab1b7ffb6c0bc83912d075c2/c2ecdc5bd5a8e793-8a/s500x750/f7e90f4701a5fae1171d00bc8006090423bbc028.jpg 500w, https://64.media.tumblr.com/394b47fdab1b7ffb6c0bc83912d075c2/c2ecdc5bd5a8e793-8a/s540x810/21a252f8fc3131eec7eeaa701cde657a85739442.jpg 540w, https://64.media.tumblr.com/394b47fdab1b7ffb6c0bc83912d075c2/c2ecdc5bd5a8e793-8a/s640x960/317c1e066e36d1a352bd6810fd16b53059cc308b.jpg 640w, https://64.media.tumblr.com/394b47fdab1b7ffb6c0bc83912d075c2/c2ecdc5bd5a8e793-8a/s1280x1920/154ebed1279e1a4573553ddca704c431f0fe486e.jpg 720w" sizes="(max-width: 720px) 100vw, 720px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;One Battle After Another (2025): &lt;/b&gt;It&amp;rsquo;s pretty difficult to make a smart political commentary about a moment that we&amp;rsquo;re still living through, so I understand if &lt;i&gt;One Battle After Another&lt;/i&gt; doesn&amp;rsquo;t land with everyone. Even putting aside the film&amp;rsquo;s central theme, though, I was on the figurative edge of my seat for nearly the entire runtime. I loved &lt;a href="https://www.youtube.com/watch?v=nylRtGiFxjw"&gt;the &amp;ldquo;Hark! The Herald Angels Sing&amp;rdquo; scene&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;TV Shows&lt;/h2&gt;&lt;p&gt;Pretty much every show I watched this year was either a comfort rewatch (&lt;i&gt;Star Trek: Deep Space 9&lt;/i&gt;, my beloved) or a miniseries.&lt;/p&gt;&lt;p&gt;&lt;b&gt;The Pitt (S1, 2025)&lt;/b&gt;: It&amp;rsquo;s Noah Wyle again! I&amp;rsquo;m not really a medical drama guy, but &lt;i&gt;The Pitt&lt;/i&gt; is absolutely fantastic. Each episode being one hour of a single emergency department shift at a hospital was a great idea, and the pacing from slow emotional scenes to fast-moving surgeries was executed perfectly. It&amp;rsquo;s another great entry in the &lt;a href="https://lifehacker.com/entertainment/movies-and-tv-shows-that-are-basically-competence-porn"&gt;competence porn genre&lt;/a&gt; (that&amp;rsquo;s a SFW link) and I can&amp;rsquo;t wait for season 2 in January.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="1055" data-orig-width="1584"&gt;&lt;img src="https://64.media.tumblr.com/43d3643a95679d6986e60c49a1f7bf7a/c2ecdc5bd5a8e793-aa/s640x960/2e41b47ad10f7e0117ab2bc2baf14efb3606c067.jpg" data-orig-height="1055" data-orig-width="1584" alt="Noah Wyle and Katherine LaNasa in The Pitt" srcset="https://64.media.tumblr.com/43d3643a95679d6986e60c49a1f7bf7a/c2ecdc5bd5a8e793-aa/s75x75_c1/b3bf57402ceb193798aa44cc3749bd44d69b5820.jpg 75w, https://64.media.tumblr.com/43d3643a95679d6986e60c49a1f7bf7a/c2ecdc5bd5a8e793-aa/s100x200/dd99b133df1a5dcfc73d3304d6f91dc06aa2b886.jpg 100w, https://64.media.tumblr.com/43d3643a95679d6986e60c49a1f7bf7a/c2ecdc5bd5a8e793-aa/s250x400/f91629421e410d9bb545a2cf9f0dc6bf37a45972.jpg 250w, https://64.media.tumblr.com/43d3643a95679d6986e60c49a1f7bf7a/c2ecdc5bd5a8e793-aa/s400x600/9dbb4374caf26c07fb042be8fb8cd37c7b639f8a.jpg 400w, https://64.media.tumblr.com/43d3643a95679d6986e60c49a1f7bf7a/c2ecdc5bd5a8e793-aa/s500x750/d891fd6999abe9d868ad2fc1679f85df73f859f7.jpg 500w, https://64.media.tumblr.com/43d3643a95679d6986e60c49a1f7bf7a/c2ecdc5bd5a8e793-aa/s540x810/fd9e09738cb335e39b00714d568af5d180a8c47e.jpg 540w, https://64.media.tumblr.com/43d3643a95679d6986e60c49a1f7bf7a/c2ecdc5bd5a8e793-aa/s640x960/2e41b47ad10f7e0117ab2bc2baf14efb3606c067.jpg 640w, https://64.media.tumblr.com/43d3643a95679d6986e60c49a1f7bf7a/c2ecdc5bd5a8e793-aa/s1280x1920/12178dd0a5b422cf772a0bad17ceeff542baf218.jpg 1280w, https://64.media.tumblr.com/43d3643a95679d6986e60c49a1f7bf7a/c2ecdc5bd5a8e793-aa/s2048x3072/d431d665a72593a5d53da012ac00ea4688c9693d.jpg 1584w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;John Adams (2008)&lt;/b&gt;: A miniseries about the United States&amp;rsquo; second president probably sounds boring, but HBO did a fantastic job with it. I am late to the Paul Giamatti fan club, but am now a proud member.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Chernobyl (2019):&lt;/b&gt; I watched most of this in one sitting. An incredible series from start to finish, depicting a somewhat-accurate version of the Chernobyl nuclear disaster from 1986. &lt;/p&gt;&lt;figure class="tmblr-full tmblr-embed" data-provider="youtube" data-url="https://www.youtube.com/watch?v=s9APLXM9Ei8" data-orig-width="356" data-orig-height="200"&gt;&lt;iframe width="356" height="200" id="youtube_iframe" src="https://www.youtube.com/embed/s9APLXM9Ei8?feature=oembed&amp;amp;enablejsapi=1&amp;amp;origin=https://safe.txmblr.com&amp;amp;wmode=opaque" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="Chernobyl (2019) | Official Trailer | HBO"&gt;&lt;/iframe&gt;&lt;/figure&gt;&lt;p&gt;&lt;b&gt;From the Earth to the Moon (1998): &lt;/b&gt;I love the film &lt;i&gt;Apollo 13&lt;/i&gt;, and &lt;i&gt;From the Earth to the Moon&lt;/i&gt; is essentially an expanded version that covers the rest of the Apollo program. The episode quality was much more inconsistent than I had hoped, but if you&amp;rsquo;re in the mood for some space exploration and American exceptionalism, it&amp;rsquo;s worth a watch. Also, it has a &lt;a href="https://www.youtube.com/watch?v=WhZhzt1rh7o"&gt;great opening theme&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Books&lt;/h2&gt;&lt;p&gt;I had a goal of reading more books this year, and I&amp;hellip; did not do that. Maybe next year.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Forever Free (Joe Haldeman): &lt;/b&gt;I read &lt;i&gt;The Forever War&lt;/i&gt; last year and loved it, so I continued onward to Haldeman&amp;rsquo;s sequel. It&amp;rsquo;s set after a centuries-long war in deep space, with the survivors of the original human race finding themselves bored with their new home and trying to fuck around with time travel. I didn&amp;rsquo;t like this one nearly as much as the first book, but it was still interesting, and the setting of the last few chapters was amusing to me as a recovering Disney Adult.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Iron Curtain: The Crushing of Eastern Europe 1944-1956 (Anne Applebaum): &lt;/b&gt;This took me a long time to get through, but as someone who wasn&amp;rsquo;t all that familiar with eastern Europe and the inner workings of the former Soviet Union, it was both incredibly interesting and depressing. &lt;/p&gt;&lt;h2&gt;Games&lt;/h2&gt;&lt;p&gt;This year I sold my Xbox Series X for a PlayStation 5, while my gaming PC remains mostly reserved for simulation games, &lt;i&gt;Overwatch 2&lt;/i&gt;, and VR titles. Here&amp;rsquo;s some stuff I played.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Astro Bot (2024): &lt;/b&gt;I haven&amp;rsquo;t really played any 3D platforming games since &lt;i&gt;Super Mario Odyssey&lt;/i&gt;, and &lt;i&gt;Astro&amp;rsquo;s Playroom&lt;/i&gt; and &lt;i&gt;Astro Bot&lt;/i&gt; scratched that itch. The visuals, gameplay, and music in both titles are fantastic, but &lt;i&gt;Astro Bot&lt;/i&gt; is a more complete experience.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="563" data-orig-width="1000"&gt;&lt;img src="https://64.media.tumblr.com/8f426d0e7047037a59c32d78afa70aad/c2ecdc5bd5a8e793-09/s640x960/433c1127950818249b450442f0bdb0fc808b8dee.jpg" data-orig-height="563" data-orig-width="1000" alt="Astro Bot in the main hub world surrounded by a crowd of other robots, next to the PS5-like spaceship." srcset="https://64.media.tumblr.com/8f426d0e7047037a59c32d78afa70aad/c2ecdc5bd5a8e793-09/s75x75_c1/6af7b4e7daa7cdd638cb58796f85ce6796dbe6fb.jpg 75w, https://64.media.tumblr.com/8f426d0e7047037a59c32d78afa70aad/c2ecdc5bd5a8e793-09/s100x200/f4c7cdf92c57b50442e6256144be8794ad6cac89.jpg 100w, https://64.media.tumblr.com/8f426d0e7047037a59c32d78afa70aad/c2ecdc5bd5a8e793-09/s250x400/aa84e35fee609a6b840282003f0af87d4fdac1fa.jpg 250w, https://64.media.tumblr.com/8f426d0e7047037a59c32d78afa70aad/c2ecdc5bd5a8e793-09/s400x600/7333fdb5b24bf0b056435d93963e2fbe2e5f90b4.jpg 400w, https://64.media.tumblr.com/8f426d0e7047037a59c32d78afa70aad/c2ecdc5bd5a8e793-09/s500x750/71453bbdb2a05fe9bde2e21d33870c38bcffb0a4.jpg 500w, https://64.media.tumblr.com/8f426d0e7047037a59c32d78afa70aad/c2ecdc5bd5a8e793-09/s540x810/864f2baad15eaee1898d54a00f46b2a7b83cf691.jpg 540w, https://64.media.tumblr.com/8f426d0e7047037a59c32d78afa70aad/c2ecdc5bd5a8e793-09/s640x960/433c1127950818249b450442f0bdb0fc808b8dee.jpg 640w, https://64.media.tumblr.com/8f426d0e7047037a59c32d78afa70aad/c2ecdc5bd5a8e793-09/s1280x1920/67150a7d1b1af7602c986fd476a98ad6ee96565d.jpg 1000w" sizes="(max-width: 1000px) 100vw, 1000px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;Wolfenstein II: The New Colossus (2017):&lt;/b&gt; The setting of a Nazi-occupied America might not be fictional at this point, but I still had fun in my first complete playthrough of the Wolfenstein sequel. The levels and guns are fantastic, and I loved the &lt;a href="https://www.youtube.com/watch?v=CCctz4jzQS4"&gt;heavy metal-ish soundtrack&lt;/a&gt; by Mick Gordon and Martin Stig Andersen.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Death Stranding Director&amp;rsquo;s Cut (2021): &lt;/b&gt;This was my first Kojima game, and outside of a few segments that were more cumbersome than suspenseful, it&amp;rsquo;s a fantastic game about rebuilding a broken world while babysitting, delivering packages, and driving your truck at unsafe vertical inclines. I have the sequel in hand, but want to finish &lt;i&gt;Clair Obscur: Expedition 33&lt;/i&gt; first.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="2160" data-orig-width="3840"&gt;&lt;img src="https://64.media.tumblr.com/6d0bfc8c9baa7c79280d0b63c3c077cd/c2ecdc5bd5a8e793-54/s640x960/4332ea61a559a60976a41fb3c4e59a69086a94b7.jpg" data-orig-height="2160" data-orig-width="3840" srcset="https://64.media.tumblr.com/6d0bfc8c9baa7c79280d0b63c3c077cd/c2ecdc5bd5a8e793-54/s75x75_c1/c1b78dc109b3b762a04c289fae41ba0fb40f2cfe.jpg 75w, https://64.media.tumblr.com/6d0bfc8c9baa7c79280d0b63c3c077cd/c2ecdc5bd5a8e793-54/s100x200/57a2b69a712e9c1c6c81fed371c925d55d5a99c0.jpg 100w, https://64.media.tumblr.com/6d0bfc8c9baa7c79280d0b63c3c077cd/c2ecdc5bd5a8e793-54/s250x400/83edf890ae8b7f68ec6a7ff705c5a7bd471a6482.jpg 250w, https://64.media.tumblr.com/6d0bfc8c9baa7c79280d0b63c3c077cd/c2ecdc5bd5a8e793-54/s400x600/0ad6d013b9c195b1b6f1abe97f34871d2b7eb2d1.jpg 400w, https://64.media.tumblr.com/6d0bfc8c9baa7c79280d0b63c3c077cd/c2ecdc5bd5a8e793-54/s500x750/c9ef6cc565f70d26c7e924d3eb01a908eda96bca.jpg 500w, https://64.media.tumblr.com/6d0bfc8c9baa7c79280d0b63c3c077cd/c2ecdc5bd5a8e793-54/s540x810/f01fe832353db3d3115b15adb244c4272f4ab4f9.jpg 540w, https://64.media.tumblr.com/6d0bfc8c9baa7c79280d0b63c3c077cd/c2ecdc5bd5a8e793-54/s640x960/4332ea61a559a60976a41fb3c4e59a69086a94b7.jpg 640w, https://64.media.tumblr.com/6d0bfc8c9baa7c79280d0b63c3c077cd/c2ecdc5bd5a8e793-54/s1280x1920/8ac298d7345fb29f3123861e27fdff0f71c75c76.jpg 1280w, https://64.media.tumblr.com/6d0bfc8c9baa7c79280d0b63c3c077cd/c2ecdc5bd5a8e793-54/s2048x3072/91a2f2b6065cac9d5b963942100c2c67a29c2791.jpg 2048w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;VRChat:&lt;/b&gt; It&amp;rsquo;s more of a social platform than a game, and I didn&amp;rsquo;t start playing it in 2025, but I&amp;rsquo;m going to put it here anyway because I make the rules. Connecting with friendly folks and hopping through cool worlds in VRChat were great experiences for me throughout 2025. The jokes about it being &amp;lsquo;the most expensive free game&amp;rsquo; are well-earned, though—I&amp;rsquo;m eyeing an upgrade to a &lt;a href="https://www.samsung.com/us/xr/galaxy-xr/galaxy-xr/"&gt;Galaxy XR headset&lt;/a&gt; when the price drops a bit.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Ratchet &amp;amp; Clank (2016):&lt;/b&gt; I have no nostalgia for the Ratchet &amp;amp; Clank series, but I do want to play &lt;i&gt;Rift Apart&lt;/i&gt; eventually, so I went through the 2016 series reboot earlier this month. It&amp;rsquo;s a short and sweet platforming adventure through sci-fi worlds. Speaking of the Paul Giamatti fan club, he plays Chairman Drek in &lt;a href="https://www.youtube.com/watch?v=ADkHeK_GaFM"&gt;some of the cutscenes&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Podcasts&lt;/h2&gt;&lt;p&gt;If I am wearing headphones while going for a walk or cleaning my apartment, one of these shows are most likely playing.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Well There&amp;rsquo;s Your Problem:&lt;/b&gt; A fun, unapologetically leftist, and frequently-sidetracked show about engineering disasters throughout history. The &lt;a href="https://www.youtube.com/watch?v=VbkNOnX-PUQ"&gt;Macy&amp;rsquo;s Thanksgiving Day Parade episode&lt;/a&gt; absolutely killed me. Hosted by Justin Roczniak, November Kelly, Liam McAnderson, and occasionally more people. (&lt;a href="https://www.wtyppod.com/"&gt;link&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;&lt;b&gt;If Books Could Kill: &lt;/b&gt;A great show about how every airport book is insane, with occasional diversions to Eric Adams, bad op-eds from &lt;i&gt;The New York Times&lt;/i&gt;, and general discourse about political media. Hosted by Michael Hobbes and Peter Shamshiri. (&lt;a href="https://www.ifbookspod.com/"&gt;link&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;&lt;b&gt;Smosh Reads Reddit Stories:&lt;/b&gt; The perfect show for when I don&amp;rsquo;t want to be alone with my thoughts, but also don&amp;rsquo;t have the attention span for history or political topics. Funny and sometimes insane. Hosted by Shayne Topp and other Smosh members. (&lt;a href="https://www.youtube.com/playlist?list=PLcL9r1K3TSwpOVyQKP1MruSuY-NS99iQY"&gt;link&lt;/a&gt;)&lt;/p&gt;</description><link>https://blog.corbin.io/post/804498220559532032</link><guid>https://blog.corbin.io/post/804498220559532032</guid><pubDate>Wed, 31 Dec 2025 20:01:30 -0500</pubDate><category>movies</category><category>tv shows</category><category>tv series</category><category>gaming</category><category>video games</category><category>books</category><category>reading</category><category>Youtube</category></item><item><title>Important update for ImageShare users</title><description>&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="1080" data-orig-width="1920"&gt;&lt;img src="https://64.media.tumblr.com/942700ad3aa03201bda6229821a39d5c/422ea32c6985397e-24/s640x960/c06f8dd94d538403b59e3f15d25ea3cd34bb5c51.jpg" data-orig-height="1080" data-orig-width="1920" alt="ImageShare on a Nintendo 3DS" srcset="https://64.media.tumblr.com/942700ad3aa03201bda6229821a39d5c/422ea32c6985397e-24/s75x75_c1/9be6d72f5953d5d21f7bb13c2ac72a2c4bc986a9.jpg 75w, https://64.media.tumblr.com/942700ad3aa03201bda6229821a39d5c/422ea32c6985397e-24/s100x200/cb73d63017e1cf2b536e58b031ec75391a0df41e.jpg 100w, https://64.media.tumblr.com/942700ad3aa03201bda6229821a39d5c/422ea32c6985397e-24/s250x400/e3783408b5c4a3470975c12523a9514e71ed6d71.jpg 250w, https://64.media.tumblr.com/942700ad3aa03201bda6229821a39d5c/422ea32c6985397e-24/s400x600/416379b0167a23d7b310ba347acc8b690fde9539.jpg 400w, https://64.media.tumblr.com/942700ad3aa03201bda6229821a39d5c/422ea32c6985397e-24/s500x750/3449a0aedb52c98a81fda6165eca0ff1161dc525.jpg 500w, https://64.media.tumblr.com/942700ad3aa03201bda6229821a39d5c/422ea32c6985397e-24/s540x810/9e70de24c0e1385e971917954698245830e36b42.jpg 540w, https://64.media.tumblr.com/942700ad3aa03201bda6229821a39d5c/422ea32c6985397e-24/s640x960/c06f8dd94d538403b59e3f15d25ea3cd34bb5c51.jpg 640w, https://64.media.tumblr.com/942700ad3aa03201bda6229821a39d5c/422ea32c6985397e-24/s1280x1920/ee1dfe9bbd96025508562da076a08494cf07d458.jpg 1280w, https://64.media.tumblr.com/942700ad3aa03201bda6229821a39d5c/422ea32c6985397e-24/s2048x3072/b32a1d61d79d732995183d17cea94cbcb7e285ec.jpg 1920w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;Hey everyone! This is a quick public service announcement for anyone using &lt;a href="https://github.com/corbindavenport/imageshare"&gt;ImageShare&lt;/a&gt;, my web app for sharing images and videos from low-end and legacy web browsers. &lt;b&gt;ImageShare is still working and not going anywhere&lt;/b&gt;, but you may have to access it directly on more browsers moving forward.&lt;/p&gt;&lt;p&gt;I have received a few reports from people unable to load ImageShare on the original Nintendo 3DS and other platforms. I believe all of these reports are due to Google Search dropping support for many old browsers, which some people used for navigating to ImageShare. I can replicate this in Citra emulating the original 3DS web browser—my New 3DS XL can still load Google—and &lt;a href="https://www.reddit.com/r/google/comments/1ne5qbz/google_is_no_longer_supported_on_older_browsers/"&gt;Reddit threads&lt;/a&gt; confirm the same issue for browsers like Internet Explorer 5.&lt;/p&gt;&lt;p&gt;ImageShare still works on all the same low-end and legacy web browsers, including the browser on all Nintendo 3DS and Wii U consoles. However, you may need to access it directly by typing &lt;b&gt;&lt;a href="http://theimageshare.com"&gt;http://theimageshare.com&lt;/a&gt;&lt;/b&gt; in your browser&amp;rsquo;s address bar. If you have a 3DS or other device that can scan QR codes, you can also &lt;a href="http://theimageshare.com/"&gt;scan the code on the GitHub repository&amp;rsquo;s main page&lt;/a&gt; for quicker access.&lt;/p&gt;&lt;p&gt;If you use ImageShare frequently, you should bookmark it for easy access, instead of using web searches or typing in the URL each time. I have no plans to change that domain or shut off the main web server, but you can also &lt;a href="https://github.com/corbindavenport/imageshare/blob/main/DEV.md"&gt;self-host ImageShare&lt;/a&gt; if you want.&lt;/p&gt;</description><link>https://blog.corbin.io/post/799038421040594944</link><guid>https://blog.corbin.io/post/799038421040594944</guid><pubDate>Sat, 01 Nov 2025 14:40:19 -0400</pubDate><category>imageshare</category><category>nintendo 3ds</category><category>3ds</category><category>wii u</category><category>nintendo wii u</category><category>web app</category><category>web apps</category><category>retro tech</category><category>retro gaming</category></item><item><title>Peek 2.0 is out!</title><description>&lt;p&gt;Back in December, I released Peek - an extension for Google Chrome and Opera that allows you to preview links before you download them. After about two months of on-off work, I&amp;rsquo;m super excited to finally release Peek 2.0.&lt;br/&gt;&lt;br/&gt;Here is the full &lt;a href="https://web.archive.org/web/20161001053943/https://github.com/corbindavenport/peek/releases"&gt;release notes&lt;/a&gt;, and I&amp;rsquo;m pretty sure this is the longest list of changes in any update I&amp;rsquo;ve ever made for anything:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Now allows previews to &amp;lsquo;pop-out&amp;rsquo; into new windows&lt;/li&gt;&lt;li&gt;Toolbar icon now shows number of previews on the page&lt;/li&gt;&lt;li&gt;Updated preview interface&lt;/li&gt;&lt;li&gt;Supports more Google Drive links&lt;/li&gt;&lt;li&gt;Improved performance&lt;/li&gt;&lt;li&gt;Changed minimum Chrome version to 47&lt;/li&gt;&lt;li&gt;Fixed bug where multiple popups were rendered for some files&lt;/li&gt;&lt;li&gt;Changed license to MIT&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;You can get Peek 2.0 from the Chrome Web Store right now, and the update is in the approval process for Opera users.&lt;/p&gt;&lt;p&gt;&lt;a href="https://web.archive.org/web/20161001053943/https://chrome.google.com/webstore/detail/bfpogemllmpcpclnadighnpeeaegigjk"&gt;Peek for Chrome&lt;/a&gt; | &lt;a href="https://web.archive.org/web/20161001053943/https://addons.opera.com/en/extensions/details/peek/"&gt;Peek for Opera&lt;/a&gt;&lt;/p&gt;</description><link>https://blog.corbin.io/post/803512578720628736</link><guid>https://blog.corbin.io/post/803512578720628736</guid><pubDate>Thu, 25 Sep 2025 22:33:00 -0400</pubDate></item><item><title>The new Cupertino: a Firefox theme for modern macOS</title><description>&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="1080" data-orig-width="1920"&gt;&lt;img src="https://64.media.tumblr.com/30a0a7da6c44b78cb58d97f53f9aad6d/72940d1d23aa33e8-f8/s640x960/fef2c2aae9be77c38d9b4fbb61e748f6ccb226fc.png" data-orig-height="1080" data-orig-width="1920" alt="Screenshot of Firefox with Cupertino theme" srcset="https://64.media.tumblr.com/30a0a7da6c44b78cb58d97f53f9aad6d/72940d1d23aa33e8-f8/s75x75_c1/63687c43b757aeacc348b14d3ca233f825dbf421.png 75w, https://64.media.tumblr.com/30a0a7da6c44b78cb58d97f53f9aad6d/72940d1d23aa33e8-f8/s100x200/d722f6f92857be549c13603c144bc7817142ba24.png 100w, https://64.media.tumblr.com/30a0a7da6c44b78cb58d97f53f9aad6d/72940d1d23aa33e8-f8/s250x400/a65dc87bfc1283f5d7e60ef360d7fdce5cb929c4.png 250w, https://64.media.tumblr.com/30a0a7da6c44b78cb58d97f53f9aad6d/72940d1d23aa33e8-f8/s400x600/76c8c2dee2b5297697f9ada49b75cce28da9871c.png 400w, https://64.media.tumblr.com/30a0a7da6c44b78cb58d97f53f9aad6d/72940d1d23aa33e8-f8/s500x750/f0fa90613fbb563380cf8e8086eb4c4e232ae2f8.png 500w, https://64.media.tumblr.com/30a0a7da6c44b78cb58d97f53f9aad6d/72940d1d23aa33e8-f8/s540x810/d0f5419f8540745e2c6e653953e7f33ad7beb752.png 540w, https://64.media.tumblr.com/30a0a7da6c44b78cb58d97f53f9aad6d/72940d1d23aa33e8-f8/s640x960/fef2c2aae9be77c38d9b4fbb61e748f6ccb226fc.png 640w, https://64.media.tumblr.com/30a0a7da6c44b78cb58d97f53f9aad6d/72940d1d23aa33e8-f8/s1280x1920/77bfd85211cf14f488806dc8b886e5d3c6d9f24a.png 1280w, https://64.media.tumblr.com/30a0a7da6c44b78cb58d97f53f9aad6d/72940d1d23aa33e8-f8/s2048x3072/12904ec6e28c58468c6b0339f8ef4fff284ba9f6.png 1920w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;Back in 2024, I released a Firefox theme that more closely matched the color and design of the macOS operating system, called Cupertino. Apple is about to release macOS Tahoe 26 with a significant redesign, so I went back to the metaphorical drawing board to help Firefox fit in again. The new Cupertino theme is &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/cupertino-theme/"&gt;now available&lt;/a&gt;, and it was a lot more work than it looks!&lt;/p&gt;&lt;!-- more --&gt;&lt;p&gt;The original theme was somewhat simple: I just used a color picker on macOS apps like Finder and Safari, and set those colors across the &lt;a href="https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/theme"&gt;theme variables that Firefox supports&lt;/a&gt;. The incoming Liquid Glass redesign of macOS 26 posed two problems: Firefox cannot replicate the translucency effects that Apple is now using everywhere, and also Liquid Glass &lt;i&gt;does not look good&lt;/i&gt;. So many i&lt;a href="https://www.macstories.net/stories/macos-tahoe-the-macstories-public-beta-preview/"&gt;nterface elements across the operating system&lt;/a&gt; are difficult to read, complex to understand, or both.&lt;/p&gt;&lt;p&gt;The main feature here is the toolbar with rounded corners and a drop shadow, which &lt;i&gt;sort of&lt;/i&gt; matches the new floating button groups in apps like Finder, System Settings, and Safari. This was achieved with Firefox&amp;rsquo;s support for &lt;a href="https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/theme#images"&gt;additional backgrounds in themes&lt;/a&gt;: the left curve is one image, the right curve is another image, and the middle section is repeated across the remainder of the screen.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="385" data-orig-width="1000"&gt;&lt;img src="https://64.media.tumblr.com/1744703259e005d1727161db97e46d26/72940d1d23aa33e8-9c/s640x960/301cf155094100496c5eb59a0f8c49adab894a09.png" data-orig-height="385" data-orig-width="1000" alt="Illustration of three sections of background image" srcset="https://64.media.tumblr.com/1744703259e005d1727161db97e46d26/72940d1d23aa33e8-9c/s75x75_c1/c3d09c04dadf3540fe7b2a0cc24774cfcf1851ea.png 75w, https://64.media.tumblr.com/1744703259e005d1727161db97e46d26/72940d1d23aa33e8-9c/s100x200/256d0235efef16d01968a05b6812f7dc759b8637.png 100w, https://64.media.tumblr.com/1744703259e005d1727161db97e46d26/72940d1d23aa33e8-9c/s250x400/0a0bbd09e547a54aef69b9a8ddf2cca22e565135.png 250w, https://64.media.tumblr.com/1744703259e005d1727161db97e46d26/72940d1d23aa33e8-9c/s400x600/c89697f5043e152f3d4743a67577ef18f5a6e2fc.png 400w, https://64.media.tumblr.com/1744703259e005d1727161db97e46d26/72940d1d23aa33e8-9c/s500x750/10c1f6bb078519bd54f27a14ba1ff8bd5ad09407.png 500w, https://64.media.tumblr.com/1744703259e005d1727161db97e46d26/72940d1d23aa33e8-9c/s540x810/9e7357356b92a3081eb3deb726fddddcd59b3a93.png 540w, https://64.media.tumblr.com/1744703259e005d1727161db97e46d26/72940d1d23aa33e8-9c/s640x960/301cf155094100496c5eb59a0f8c49adab894a09.png 640w, https://64.media.tumblr.com/1744703259e005d1727161db97e46d26/72940d1d23aa33e8-9c/s1280x1920/8afaad3dcb38df92d8b0da99e5604bfca69b3b43.png 1000w" sizes="(max-width: 1000px) 100vw, 1000px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;I was inspired by the &lt;a href="https://www.schillmania.com/content/entries/2006/04/more-rounded-corners/"&gt;old CSS trick for creating rounded boxes&lt;/a&gt; before it was a browser-level feature, which required a background image for each corner or side of the box. Sometimes, you can&amp;rsquo;t beat the classics. Each image in this theme is in SVG format, so it looks crisp on all monitor resolutions and display scaling settings.&lt;/p&gt;&lt;p&gt;The background colors also don&amp;rsquo;t exactly match macOS, because Firefox applies a light filter over the toolbar for themes using a background image—it&amp;rsquo;s more obvious in &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/fireball-firefox-2/?utm_source=addons.mozilla.org"&gt;photo-based&lt;/a&gt; themes. This effect can&amp;rsquo;t be turned off, so I corrected the colors the best I could and updated the rest of the theme to match the modified color values. Unlike the white-on-white interface elements seen in the new Finder and other Liquid Glass applications with minimal contrast, the Firefox window frame is a light gray and the toolbar is solid white.&lt;/p&gt;&lt;p&gt;The Cupertino theme still supports dark mode, with colors based on Safari and Apple Music, but there&amp;rsquo;s no rounded toolbar. The light filter that Firefox applies over image backgrounds looks awful with darker backgrounds.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="1392" data-orig-width="2008"&gt;&lt;img src="https://64.media.tumblr.com/07810437f788454b5aa5e648eef85ea0/72940d1d23aa33e8-3f/s640x960/d029c0d587615455ac736ed96f560c8eddb73424.png" data-orig-height="1392" data-orig-width="2008" alt="Dark theme in Cupertino" srcset="https://64.media.tumblr.com/07810437f788454b5aa5e648eef85ea0/72940d1d23aa33e8-3f/s75x75_c1/0ca9fd7bb4c5f47cd79f8deb33a223869b019930.png 75w, https://64.media.tumblr.com/07810437f788454b5aa5e648eef85ea0/72940d1d23aa33e8-3f/s100x200/74275e133be321e539d77b878a3c46a00369d5e8.png 100w, https://64.media.tumblr.com/07810437f788454b5aa5e648eef85ea0/72940d1d23aa33e8-3f/s250x400/dd1fd03307ab7c1f9a4b28e0c01f6157d9695ae9.png 250w, https://64.media.tumblr.com/07810437f788454b5aa5e648eef85ea0/72940d1d23aa33e8-3f/s400x600/2ac8bdd16bee0757f5df0d054a66969f0463f736.png 400w, https://64.media.tumblr.com/07810437f788454b5aa5e648eef85ea0/72940d1d23aa33e8-3f/s500x750/c2242f76b113e8ba1e1b6b5cb7eb1c5c778c29f6.png 500w, https://64.media.tumblr.com/07810437f788454b5aa5e648eef85ea0/72940d1d23aa33e8-3f/s540x810/f680777874091cf317d64a6b4ba2f70f5a9526ef.png 540w, https://64.media.tumblr.com/07810437f788454b5aa5e648eef85ea0/72940d1d23aa33e8-3f/s640x960/d029c0d587615455ac736ed96f560c8eddb73424.png 640w, https://64.media.tumblr.com/07810437f788454b5aa5e648eef85ea0/72940d1d23aa33e8-3f/s1280x1920/f58ae337699bad6557174524919e54bbc6f7bb69.png 1280w, https://64.media.tumblr.com/07810437f788454b5aa5e648eef85ea0/72940d1d23aa33e8-3f/s2048x3072/d3cd347630cea71a4161c68229b2a8346fa22fac.png 2008w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;Firefox does allow some transparency in the search bar results, main overflow menu, and other elements, but without the fancy frosted glass-like translucency. I have this set to 97% opacity in the new Cupertino theme, because higher percentages make text more difficult to read—a problem in many applications using Liquid Glass proper.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="1392" data-orig-width="2008"&gt;&lt;img src="https://64.media.tumblr.com/8dc00e31e1c0d26db938874a8232ae86/72940d1d23aa33e8-c0/s640x960/cf1ce6aaae9e0492439a5d60d925adb5a91f23f0.png" data-orig-height="1392" data-orig-width="2008" alt="Searching in the address bar in Firefox" srcset="https://64.media.tumblr.com/8dc00e31e1c0d26db938874a8232ae86/72940d1d23aa33e8-c0/s75x75_c1/a2ecee73c989442e1747e2c8cf3ee430651f7415.png 75w, https://64.media.tumblr.com/8dc00e31e1c0d26db938874a8232ae86/72940d1d23aa33e8-c0/s100x200/525b2955b5db2942d2c795c94dc75c93547e8034.png 100w, https://64.media.tumblr.com/8dc00e31e1c0d26db938874a8232ae86/72940d1d23aa33e8-c0/s250x400/b34b43e734cd67bcac7ce4f359645cb3b6cd2eb3.png 250w, https://64.media.tumblr.com/8dc00e31e1c0d26db938874a8232ae86/72940d1d23aa33e8-c0/s400x600/e60944e6fd8987c4eacec1d5cce0f7af8e3fb6d7.png 400w, https://64.media.tumblr.com/8dc00e31e1c0d26db938874a8232ae86/72940d1d23aa33e8-c0/s500x750/f7f8fc71618bd26f06ccd619399a63e4a39a504c.png 500w, https://64.media.tumblr.com/8dc00e31e1c0d26db938874a8232ae86/72940d1d23aa33e8-c0/s540x810/456bae940d1ddf590f22ea54a7b99a63a047799c.png 540w, https://64.media.tumblr.com/8dc00e31e1c0d26db938874a8232ae86/72940d1d23aa33e8-c0/s640x960/cf1ce6aaae9e0492439a5d60d925adb5a91f23f0.png 640w, https://64.media.tumblr.com/8dc00e31e1c0d26db938874a8232ae86/72940d1d23aa33e8-c0/s1280x1920/2d8ee62a0aa8d882989fe768c984a2d76b19d018.png 1280w, https://64.media.tumblr.com/8dc00e31e1c0d26db938874a8232ae86/72940d1d23aa33e8-c0/s2048x3072/b94303826a45fbee853803ad0658f657f98c9f4b.png 2008w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;The new theme strikes a decent balance between Apple&amp;rsquo;s updated design, features allowed by Firefox themes, and the visual contrast required for easy web browser usage. Hopefully, Firefox will eventually add native support for Liquid Glass-like effects, but I&amp;rsquo;m happy to use this in the meantime.&lt;/p&gt;&lt;p&gt;You can &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/cupertino-theme/"&gt;install the new Cupertino theme&lt;/a&gt; from Firefox Add-ons, and the &lt;a href="https://github.com/corbindavenport/cupertino"&gt;source code&lt;/a&gt; is on GitHub. If you want to go back to the older theme for any reason, I&amp;rsquo;ve created a &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/cupertino-sequoia/"&gt;separate listing&lt;/a&gt; that is awaiting approval from Mozilla.&lt;/p&gt;</description><link>https://blog.corbin.io/post/791005170414780416</link><guid>https://blog.corbin.io/post/791005170414780416</guid><pubDate>Mon, 04 Aug 2025 22:35:15 -0400</pubDate><category>firefox</category><category>mozilla firefox</category><category>mac</category><category>macos</category><category>macos tahoe</category><category>liquid glass</category><category>firefox extension</category><category>firefox extensions</category></item><item><title>The new Link Cleaner</title><description>&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="1080" data-orig-width="1920"&gt;&lt;img src="https://64.media.tumblr.com/9f81b8847983136443ef0846e556e786/34e7b26833cccbbe-98/s640x960/e309467c8c82f1f89ed811700bafe38feded10fe.jpg" data-orig-height="1080" data-orig-width="1920" alt="Link Cleaner on a Mac and Pixel 6" srcset="https://64.media.tumblr.com/9f81b8847983136443ef0846e556e786/34e7b26833cccbbe-98/s75x75_c1/c06f220216142d08af64121d93b4c99ae20eed5d.jpg 75w, https://64.media.tumblr.com/9f81b8847983136443ef0846e556e786/34e7b26833cccbbe-98/s100x200/f2715fbf442d8c31259df0e7d05b3cee24223805.jpg 100w, https://64.media.tumblr.com/9f81b8847983136443ef0846e556e786/34e7b26833cccbbe-98/s250x400/217ade3b6d26164733479a535f354e476bce098b.jpg 250w, https://64.media.tumblr.com/9f81b8847983136443ef0846e556e786/34e7b26833cccbbe-98/s400x600/8048d6c3ae37e2b183d9e48706d4475405d23b49.jpg 400w, https://64.media.tumblr.com/9f81b8847983136443ef0846e556e786/34e7b26833cccbbe-98/s500x750/e04e7167f64e195e00c4ad667e4826c4a6bbabbc.jpg 500w, https://64.media.tumblr.com/9f81b8847983136443ef0846e556e786/34e7b26833cccbbe-98/s540x810/f4499d616d1db7739cb0f3262a65e7f527cc042e.jpg 540w, https://64.media.tumblr.com/9f81b8847983136443ef0846e556e786/34e7b26833cccbbe-98/s640x960/e309467c8c82f1f89ed811700bafe38feded10fe.jpg 640w, https://64.media.tumblr.com/9f81b8847983136443ef0846e556e786/34e7b26833cccbbe-98/s1280x1920/7bc78b68e5b0eab16b8ac9baf9e907d7435a71f9.jpg 1280w, https://64.media.tumblr.com/9f81b8847983136443ef0846e556e786/34e7b26833cccbbe-98/s2048x3072/d816a7d8dd83be89b6987abdb6a40047ba069c0a.jpg 1920w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;I released my &lt;a href="https://linkcleaner.app/"&gt;Link Cleaner&lt;/a&gt; web app &lt;a href="https://www.patreon.com/posts/52089037"&gt;in 2021&lt;/a&gt; as a way to quickly remove tracking parameters, search queries, and other extra fluff from web links. It was mostly intended for phones and tablets, since editing URLs with a touchscreen keyboard is especially awful, but it was also helpful on desktop browsers.&lt;/p&gt;&lt;p&gt;Link Cleaner is now my most popular software project, with over 44K users and 90K links cleaned &lt;i&gt;just&lt;/i&gt; in 2025. I&amp;rsquo;ve wanted to give it a proper design overhaul, especially for larger screens, and the big update is now complete.&lt;/p&gt;&lt;!-- more --&gt;&lt;h2&gt;New design&lt;/h2&gt;&lt;p&gt;If you have used Link Cleaner, you know the interface was simple but (mostly) functional. The new version is not a massive change: it&amp;rsquo;s just a &lt;i&gt;lot&lt;/i&gt; of usability improvements and a more refined design.&lt;/p&gt;&lt;p&gt;The home page still has the same basic layout, but the URL text box is closer to the center of the screen (more like the Google or DuckDuckGo home pages). There&amp;rsquo;s a new header that I can update with different backgrounds and text—right now it has a Pride Month theme.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="1620" data-orig-width="2160"&gt;&lt;img src="https://64.media.tumblr.com/a555af8a78274cd4f7560d819bc1957c/34e7b26833cccbbe-aa/s640x960/2ed9cb5fc9b1d0f4d3a002806d11e1a287327dfb.png" data-orig-height="1620" data-orig-width="2160" alt="Link Cleaner with banner showing pride colors" srcset="https://64.media.tumblr.com/a555af8a78274cd4f7560d819bc1957c/34e7b26833cccbbe-aa/s75x75_c1/b09da2c76432cd418cfb660541b93cfb17ed76c5.png 75w, https://64.media.tumblr.com/a555af8a78274cd4f7560d819bc1957c/34e7b26833cccbbe-aa/s100x200/7f8de052dfa6c475760945fe5aaf11d256472b83.png 100w, https://64.media.tumblr.com/a555af8a78274cd4f7560d819bc1957c/34e7b26833cccbbe-aa/s250x400/20109b448b9fa5013c0a15647221e904e03b389e.png 250w, https://64.media.tumblr.com/a555af8a78274cd4f7560d819bc1957c/34e7b26833cccbbe-aa/s400x600/9e792df132c4e9d7062f16c65785cf3a4c2de17c.png 400w, https://64.media.tumblr.com/a555af8a78274cd4f7560d819bc1957c/34e7b26833cccbbe-aa/s500x750/7d6858c9d7c458a8c482907409bd989fa885187d.png 500w, https://64.media.tumblr.com/a555af8a78274cd4f7560d819bc1957c/34e7b26833cccbbe-aa/s540x810/211760a800164cb77881239b654e6f7f5d499056.png 540w, https://64.media.tumblr.com/a555af8a78274cd4f7560d819bc1957c/34e7b26833cccbbe-aa/s640x960/2ed9cb5fc9b1d0f4d3a002806d11e1a287327dfb.png 640w, https://64.media.tumblr.com/a555af8a78274cd4f7560d819bc1957c/34e7b26833cccbbe-aa/s1280x1920/2bcd6a48effc0813fe39a01dfa6f08b7f405d776.png 1280w, https://64.media.tumblr.com/a555af8a78274cd4f7560d819bc1957c/34e7b26833cccbbe-aa/s2048x3072/dae11183624022ab7d4bb461932615ae3c1e5ad0.png 2048w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;The navigation bar has also been moved to the top of the screen, and more closely matches the design of the &lt;a href="https://www.patreon.com/posts/85748623"&gt;recent PhotoStack update&lt;/a&gt;. The navigation bar (and URL field, if you are on the main page) remain pinned to the top of the screen as you scroll down. The home page also has new explanations of Link Cleaner&amp;rsquo;s core features.&lt;/p&gt;&lt;p&gt;The Bulk Mode page has also been slightly updated, with text fields that now use most of your available screen space. There are many other small changes, like the tab icon (favicon) being more readable in dark browser themes, and improved accessibility on all popup panels.&lt;/p&gt;&lt;h2&gt;New features&lt;/h2&gt;&lt;p&gt;The navigation bar&amp;rsquo;s History button opens the new Clean History panel, showing all the links you have cleaned recently. This is more secure and (hopefully) more useful than the previous History page, since your links are not actually saved in storage. They&amp;rsquo;re gone if you close the window or switch to another page.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="1620" data-orig-width="2160"&gt;&lt;img src="https://64.media.tumblr.com/3fda9e867c2a5885e1baf711f1221b18/34e7b26833cccbbe-3b/s640x960/dc5bf16fb31434ea21c99bd1f513c9eeb690253a.png" data-orig-height="1620" data-orig-width="2160" alt="Cleaned link history in Link Cleaner" srcset="https://64.media.tumblr.com/3fda9e867c2a5885e1baf711f1221b18/34e7b26833cccbbe-3b/s75x75_c1/29cebb21273354370fb6b179c50d3747ac77987a.png 75w, https://64.media.tumblr.com/3fda9e867c2a5885e1baf711f1221b18/34e7b26833cccbbe-3b/s100x200/bf183681536dbb585258e4a0adab993ce5d2b82d.png 100w, https://64.media.tumblr.com/3fda9e867c2a5885e1baf711f1221b18/34e7b26833cccbbe-3b/s250x400/260239209fa83df59031c2f02998573cfda38801.png 250w, https://64.media.tumblr.com/3fda9e867c2a5885e1baf711f1221b18/34e7b26833cccbbe-3b/s400x600/6fcd8036c9237542a7a689905c4ae474b4f8a265.png 400w, https://64.media.tumblr.com/3fda9e867c2a5885e1baf711f1221b18/34e7b26833cccbbe-3b/s500x750/199b24d39d1b3f617b64f82d9765d03028ba5c88.png 500w, https://64.media.tumblr.com/3fda9e867c2a5885e1baf711f1221b18/34e7b26833cccbbe-3b/s540x810/5357e601f980168a02f63d109e9a766e49dc44ad.png 540w, https://64.media.tumblr.com/3fda9e867c2a5885e1baf711f1221b18/34e7b26833cccbbe-3b/s640x960/dc5bf16fb31434ea21c99bd1f513c9eeb690253a.png 640w, https://64.media.tumblr.com/3fda9e867c2a5885e1baf711f1221b18/34e7b26833cccbbe-3b/s1280x1920/ee949f44e9618630f37d007761ad2b55bd44983c.png 1280w, https://64.media.tumblr.com/3fda9e867c2a5885e1baf711f1221b18/34e7b26833cccbbe-3b/s2048x3072/dbfb4872f9d6a03a233d3f8b5619296dbe7c1066.png 2048w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;The Install button opens the new Install panel, which can guide you through installing Link Cleaner as a web app, adding the Shortcut to your Apple devices, and using Link Cleaner in custom scripts and automations with the custom share URL. It also includes a new bookmarklet, which you can add to your browser&amp;rsquo;s bookmarks toolbar to instantly get a cleaned URL for the current page in a Link Cleaner popup window.&lt;/p&gt;&lt;p&gt;Link Cleaner now uses the same text field for the URL input and cleaned link output, removing the need to click the back button each time. You just paste in the text field again, or press Enter/Return on your keyboard, to clean the link again. There&amp;rsquo;s still a &amp;lsquo;Clear&amp;rsquo; button for touchscreen devices, since selecting and removing all text is more difficult without a physical keyboard.&lt;/p&gt;&lt;p&gt;If you have a device with a physical keyboard, the merged text field means you can now paste a link with Ctrl+V/Cmd+V, then immediately press Ctrl+C/Cmd+V to copy the cleaned link. No reaching for the mouse or tabbing around required. This update removes the experimental option for automatic clipboard copy, since it was not reliable and difficult to test, and the new keyboard accessibility is a close enough replacement.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="1620" data-orig-width="2160"&gt;&lt;img src="https://64.media.tumblr.com/a81a2c716ab6432fd0383f46caa9ced8/34e7b26833cccbbe-f5/s640x960/5d05c53c7fe592eb0340b0c911654f18048cffc4.png" data-orig-height="1620" data-orig-width="2160" alt="QR code for a cleaned link with Save and Download buttons." srcset="https://64.media.tumblr.com/a81a2c716ab6432fd0383f46caa9ced8/34e7b26833cccbbe-f5/s75x75_c1/173443aabe9abec2df530efcd52d580360fbc729.png 75w, https://64.media.tumblr.com/a81a2c716ab6432fd0383f46caa9ced8/34e7b26833cccbbe-f5/s100x200/54161c561655e96cb2519daca2da74b2d8ad7a27.png 100w, https://64.media.tumblr.com/a81a2c716ab6432fd0383f46caa9ced8/34e7b26833cccbbe-f5/s250x400/434a73120bc84bbf6805b2f52e0faf82e46e3d04.png 250w, https://64.media.tumblr.com/a81a2c716ab6432fd0383f46caa9ced8/34e7b26833cccbbe-f5/s400x600/af2c01a7d6691db169928391db690c93df4274e7.png 400w, https://64.media.tumblr.com/a81a2c716ab6432fd0383f46caa9ced8/34e7b26833cccbbe-f5/s500x750/61514ca318cd42ebb051c8797e21982399e9049b.png 500w, https://64.media.tumblr.com/a81a2c716ab6432fd0383f46caa9ced8/34e7b26833cccbbe-f5/s540x810/819109802e26e5b5ea4f99b3d3abd7123957fcec.png 540w, https://64.media.tumblr.com/a81a2c716ab6432fd0383f46caa9ced8/34e7b26833cccbbe-f5/s640x960/5d05c53c7fe592eb0340b0c911654f18048cffc4.png 640w, https://64.media.tumblr.com/a81a2c716ab6432fd0383f46caa9ced8/34e7b26833cccbbe-f5/s1280x1920/63d8cf4622c9b881635bad10afebdfe418533b46.png 1280w, https://64.media.tumblr.com/a81a2c716ab6432fd0383f46caa9ced8/34e7b26833cccbbe-f5/s2048x3072/5adcbf155ed05bc1b620a37d10064136ee2f9522.png 2048w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;The share and copy buttons in Link Cleaner are mostly unchanged, but the QR code option now has a 'Save to Downloads&amp;rsquo; button. If your browser supports sharing files, you can also quickly share the QR code to another installed application. The QR codes are still generated locally in your web browser, for better privacy and offline support.&lt;/p&gt;&lt;p&gt;Importantly, &lt;b&gt;this update does not remove any functionality&lt;/b&gt;, except the experimental automatic clipboard copy that didn&amp;rsquo;t reliably work. If you have a script, bookmarklet, Apple Shortcut, or some other automation using Link Cleaner, it should still work exactly as it always did.&lt;/p&gt;&lt;h2&gt;Try Link Cleaner&lt;/h2&gt;&lt;p&gt;You can use Link Cleaner by visiting &lt;a href="https://linkcleaner.app/"&gt;linkcleaner.app&lt;/a&gt; in your browser. The code is still &lt;a href="https://github.com/corbindavenport/link-cleaner"&gt;open-source on GitHub&lt;/a&gt;.&lt;/p&gt;</description><link>https://blog.corbin.io/post/785731405176012800</link><guid>https://blog.corbin.io/post/785731405176012800</guid><pubDate>Sat, 07 Jun 2025 17:31:00 -0400</pubDate><category>web app</category><category>progressive web app</category><category>progressive web apps</category><category>chrome</category><category>firefox</category></item><item><title>The 2025 security checkup is complete</title><description>&lt;p&gt;&lt;a href="https://www.patreon.com/posts/120497418"&gt;Back in January&lt;/a&gt;, I said that I was working on a security and privacy checkup for all my currently-maintained software projects. That project is now complete, though some projects will have further updates to enhance user security. Here&amp;rsquo;s a summary of what I changed.&lt;/p&gt;&lt;!-- more --&gt;&lt;h2&gt;Functional changes&lt;/h2&gt;&lt;p&gt;&lt;a href="https://linkcleaner.app/"&gt;Link Cleaner,&lt;/a&gt; my web app for removing tracking parameters and other junk from URLs, no longer has a History page with previously-cleaned links. The usage of that page was very low, and its role as an always-on activity log could be a minor privacy risk if a threat actor gained physical access to the browser or device. All of Link Cleaner&amp;rsquo;s functionality still runs on-device without sending links anywhere.&lt;/p&gt;&lt;p&gt;I also removed the public Plausible Analytics page for &lt;a href="https://github.com/corbindavenport/nexus-tools"&gt;Nexus Tools&lt;/a&gt;, my installer and updater for &lt;a href="https://developer.android.com/studio/releases/platform-tools"&gt;Android SDK Platform Tools&lt;/a&gt;. It was a cool way to show off how many people were using Nexus Tools on which platforms, and didn&amp;rsquo;t show any personally-identifiable information, but it probably doesn&amp;rsquo;t need to be public.&lt;/p&gt;&lt;p&gt;&lt;a href="https://github.com/corbindavenport/photostack-classic/"&gt;PhotoStack Classic&lt;/a&gt;, the version of PhotoStack intended for old web browsers, was using an outdated version of the JZip library that had some &lt;a href="https://nvd.nist.gov/vuln/detail/cve-2022-48285"&gt;minor security issues&lt;/a&gt; and has been fixed. The regular PhotoStack web app was not vulnerable to that exploit.&lt;/p&gt;&lt;p&gt;I&amp;rsquo;m considering other functionality changes to improve privacy and security, like updates to embedded content in the &lt;a href="https://github.com/corbindavenport/peek"&gt;Peek extension&lt;/a&gt;, but there aren&amp;rsquo;t any more super pressing changes that I am aware of right now. Finally, I shut down the static web hosts for two old web apps, &lt;a href="https://github.com/corbindavenport/planr"&gt;Planr&lt;/a&gt; and &lt;a href="https://github.com/corbindavenport/rockwell"&gt;Rockwell&lt;/a&gt;, since they might have privacy or security issues and (to my knowledge) no one is using them.&lt;/p&gt;&lt;h2&gt;Privacy policies&lt;/h2&gt;&lt;p&gt;Most of the work here was creating detailed privacy policies for each project, explaining exactly what data is collected, if any data is transmitted to me, and the options for opting out of data collection/transmission. The privacy policy for each project is under &lt;b&gt;PRIVACY.md&lt;/b&gt; on the GitHub repository, somewhere in the interface for web apps, and in the product listing for browser extensions.&lt;/p&gt;&lt;p&gt;You can check out the &lt;a href="https://github.com/corbindavenport/nexus-tools/blob/main/PRIVACY.md"&gt;Nexus Tools privacy policy&lt;/a&gt; as an example. Most of them are very short, since none of my projects collect personally-identifiable information or function as commercial products.&lt;/p&gt;&lt;h2&gt;Staying secure&lt;/h2&gt;&lt;p&gt;My software projects are all &lt;a href="https://github.com/corbindavenport/"&gt;open-source on GitHub&lt;/a&gt;, and I&amp;rsquo;m doing my best to keep them as private and secure as possible while still giving me basic analytics data for focused development. I don&amp;rsquo;t want your private data.&lt;/p&gt;&lt;p&gt;If you like my software projects, consider &lt;a href="https://www.patreon.com/corbindavenport"&gt;joining the Patreon&lt;/a&gt; if you haven&amp;rsquo;t already, which gets you access to my monthly work logs. You can also donate through &lt;a href="https://paypal.me/corbindav"&gt;PayPal&lt;/a&gt; or &lt;a href="https://cash.app/%24corbdav"&gt;Cash App&lt;/a&gt;, but I don&amp;rsquo;t have a way to grant access to rewards through those options. Donations and patrons help pay for hosting costs, the Plausible Analytics subscription, domain registrations, and other costs.&lt;/p&gt;</description><link>https://blog.corbin.io/post/781469065268068352</link><guid>https://blog.corbin.io/post/781469065268068352</guid><pubDate>Mon, 21 Apr 2025 16:22:56 -0400</pubDate></item><item><title>A security and privacy checkup for my software projects</title><description>&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; The checkup is &lt;a href="https://www.tumblr.com/corbindavenport?source=share"&gt;now complete&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Over the next few weeks, I&amp;rsquo;ll be going through all my web apps, browser extensions, tools, and other &lt;a href="https://corbin.io/software/"&gt;software projects&lt;/a&gt; for a privacy and security checkup. This includes &lt;a href="https://photostack.app/"&gt;PhotoStack&lt;/a&gt;, &lt;a href="https://linkcleaner.app/"&gt;Link Cleaner&lt;/a&gt;, &lt;a href="https://github.com/corbindavenport/nexus-tools"&gt;Nexus Tools&lt;/a&gt;, &lt;a href="https://github.com/corbindavenport/nexus-tools"&gt;ImageShare&lt;/a&gt;, and everything else I currently maintain. I&amp;rsquo;ll be evaluating all features for possible issues and making sure everything has a clearly-stated Privacy Policy. Further updates will be shared on my &lt;a href="https://blog.corbin.io/"&gt;personal blog&lt;/a&gt; and &lt;a href="https://patreon.com/corbindavenport"&gt;Patreon feed&lt;/a&gt;.&lt;/p&gt;&lt;!-- more --&gt;&lt;p&gt;&lt;b&gt;I want to make something clear right now: I don&amp;rsquo;t want to collect your personal data, and I&amp;rsquo;m doing as much as I can to protect the privacy of anyone using my software projects.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Most of my software projects do not involve sensitive user data at all. All my web apps use &lt;a href="https://plausible.io/"&gt;Plausible Analytics&lt;/a&gt; to collect anonymized usage data, instead of Google Analytics and other popular alternatives. For use cases where private data can be handled, such as editing photos in PhotoStack, no private data ever leaves the local device. The &lt;a href="https://blog.corbin.io/post/768826371169501184/imageshare-v30-is-now-available"&gt;recent ImageShare update&lt;/a&gt; removed the use of third-party image hosts, and user uploads are deleted after a few minutes.&lt;/p&gt;&lt;p&gt;Browser extensions can often become &lt;a href="https://www.bleepingcomputer.com/news/security/malicious-browser-extensions-are-the-next-frontier-for-identity-attacks/"&gt;security nightmares&lt;/a&gt;, but my extensions are set up to use as few permissions as possible. For example, &lt;a href="https://github.com/corbindavenport/share-to-mastodon"&gt;Share to Mastodon&lt;/a&gt; doesn&amp;rsquo;t require logging in with your Mastodon server or granting permissions for the server, because it uses the server&amp;rsquo;s own share dialog in a regular browser window.&lt;/p&gt;&lt;p&gt;I&amp;rsquo;m not a cybersecurity expert, and none of my projects have been professionally vetted for security issues. That being said, I am following best practices as I understand them, and all my projects are open-source so they can be vetted by anyone. I have some changes in mind for some apps and extensions to make the default behaviors more secure and transparent.&lt;/p&gt;&lt;p&gt;If you are aware of a potential issue with &lt;a href="https://github.com/corbindavenport?tab=repositories&amp;amp;q=&amp;amp;type=&amp;amp;language=&amp;amp;sort=stargazers"&gt;any of my software projects&lt;/a&gt;, even if it&amp;rsquo;s a tiny one, please &lt;a href="https://corbin.io/contact/"&gt;contact me&lt;/a&gt; or &lt;a href="https://discord.gg/tqJDRsmQVn"&gt;join the Discord&lt;/a&gt;.&lt;/p&gt;</description><link>https://blog.corbin.io/post/773321609207545856</link><guid>https://blog.corbin.io/post/773321609207545856</guid><pubDate>Tue, 21 Jan 2025 17:02:37 -0500</pubDate></item><item><title>My domain got hijacked through GitHub</title><description>&lt;p&gt;Earlier today, I got a weird email from &lt;a href="https://search.google.com/search-console/about"&gt;Google Search Console&lt;/a&gt;, the service used for submitting domains and pages to Google&amp;rsquo;s search index and tracking their performance. It said that someone had been added as an owner for the subdomain test.corbin.io, which is under the corbin.io domain that I own and have registered through Google.&lt;/p&gt;&lt;!-- more --&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="644" data-orig-width="1366"&gt;&lt;img src="https://64.media.tumblr.com/3f164b55c3fabde822726d352e5ee00e/468f9d1a50e06fec-bc/s640x960/9f69b5b2a91a62438f7b698b8c00e90803586bc5.png" data-orig-height="644" data-orig-width="1366" alt="To: Owner of corbin.io, Google has identified that [censored] has been added as an owner of http://test.corbin.io. Property owners can change critical settings that affect how Google Search interacts with your site. It's important that only people who need this level of access have owner status. Be sure to revoke this role when it's no longer needed." srcset="https://64.media.tumblr.com/3f164b55c3fabde822726d352e5ee00e/468f9d1a50e06fec-bc/s75x75_c1/deb3d04d40e9232e3efa737cef5497685d555cdf.png 75w, https://64.media.tumblr.com/3f164b55c3fabde822726d352e5ee00e/468f9d1a50e06fec-bc/s100x200/c952ef4712526ad763071e216fcb8bd5841a383a.png 100w, https://64.media.tumblr.com/3f164b55c3fabde822726d352e5ee00e/468f9d1a50e06fec-bc/s250x400/fb859604ac0ff2c3fd94d5ffbc97361dd1b57d27.png 250w, https://64.media.tumblr.com/3f164b55c3fabde822726d352e5ee00e/468f9d1a50e06fec-bc/s400x600/d353a415517c751ebc43c37ca71c6704ae72053d.png 400w, https://64.media.tumblr.com/3f164b55c3fabde822726d352e5ee00e/468f9d1a50e06fec-bc/s500x750/bdf34346c64fba702fc4e1541d5dcabf980747cb.png 500w, https://64.media.tumblr.com/3f164b55c3fabde822726d352e5ee00e/468f9d1a50e06fec-bc/s540x810/de304f594397f21e34ef8b78fe03922d316f2bdb.png 540w, https://64.media.tumblr.com/3f164b55c3fabde822726d352e5ee00e/468f9d1a50e06fec-bc/s640x960/9f69b5b2a91a62438f7b698b8c00e90803586bc5.png 640w, https://64.media.tumblr.com/3f164b55c3fabde822726d352e5ee00e/468f9d1a50e06fec-bc/s1280x1920/e972e4419d669f4579d0a06a64612087b0a4f802.png 1280w, https://64.media.tumblr.com/3f164b55c3fabde822726d352e5ee00e/468f9d1a50e06fec-bc/s2048x3072/7d360ea977d5274ff8ab5897635728432890ef22.png 1366w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;I didn&amp;rsquo;t add anyone as a property owner, so I decided to check the test.corbin.io domain. It loaded what seemed to be a landing page for a slot gambling website in Indonesia, with the page written in Indonesian and some Chinese in the HTML comments. &lt;/p&gt;&lt;p&gt;I definitely didn&amp;rsquo;t set this up, and I didn&amp;rsquo;t even remember what test.corbin.io was originally hosting. I checked my domain registrar for that domain, Hover, and the test subdomain was set as a CNAME record redirecting to corbindavenport.github.io.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="845" data-orig-width="1519"&gt;&lt;img src="https://64.media.tumblr.com/483b71ccb8fc1b588a18b0fdbacc5927/468f9d1a50e06fec-f9/s640x960/036d3fde60d5e46cd064677139c44af75687c5b6.png" data-orig-height="845" data-orig-width="1519" alt="Screenshot of the gambling landing page." srcset="https://64.media.tumblr.com/483b71ccb8fc1b588a18b0fdbacc5927/468f9d1a50e06fec-f9/s75x75_c1/a8534a7ac0d1faafc473d27a6dbee7623b972b95.png 75w, https://64.media.tumblr.com/483b71ccb8fc1b588a18b0fdbacc5927/468f9d1a50e06fec-f9/s100x200/b3bfdbc4a4e48e51de19cd05b968e04b1ba2ad87.png 100w, https://64.media.tumblr.com/483b71ccb8fc1b588a18b0fdbacc5927/468f9d1a50e06fec-f9/s250x400/8e76a3523e0b9f72656d0e629bbf87b0fba8c5f7.png 250w, https://64.media.tumblr.com/483b71ccb8fc1b588a18b0fdbacc5927/468f9d1a50e06fec-f9/s400x600/eee9b0ba9abc8373c3810193a7afd91cc9f112ee.png 400w, https://64.media.tumblr.com/483b71ccb8fc1b588a18b0fdbacc5927/468f9d1a50e06fec-f9/s500x750/ba9c96cfe442c755efe3c7d8514d23f2a9820ab2.png 500w, https://64.media.tumblr.com/483b71ccb8fc1b588a18b0fdbacc5927/468f9d1a50e06fec-f9/s540x810/232beb734642a978c4c7f9211d518897d2a244e2.png 540w, https://64.media.tumblr.com/483b71ccb8fc1b588a18b0fdbacc5927/468f9d1a50e06fec-f9/s640x960/036d3fde60d5e46cd064677139c44af75687c5b6.png 640w, https://64.media.tumblr.com/483b71ccb8fc1b588a18b0fdbacc5927/468f9d1a50e06fec-f9/s1280x1920/e39de712d07ccc5d6aac9e24c427c992a1f43d7b.png 1280w, https://64.media.tumblr.com/483b71ccb8fc1b588a18b0fdbacc5927/468f9d1a50e06fec-f9/s2048x3072/e1ad20776ac4575ff33ea2ac7c0aeb07771ca9bf.png 1519w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;I set up test.corbin.io last year to host &lt;a href="https://blog.corbin.io/post/752757825366835200/how-i-made-my-new-personal-website"&gt;the rewritten version of my personal website&lt;/a&gt;, before it was ready to replace my main website at corbin.io. My domain was already set up to use &lt;a href="https://pages.github.com/"&gt;GitHub Pages&lt;/a&gt;, the static web hosting service, so I just made a CNAME record at that subdomain and set it as &lt;a href="https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site"&gt;the custom domain for the test website&amp;rsquo;s repository&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Here&amp;rsquo;s what I think happened.&lt;/b&gt; When my new website was done a few months ago, I moved it to the root domain (corbin.io) but left the test domain pointing to GitHub. Someone else set test.corbin.io as the custom directory for GitHub Pages on their repository, and since that domain was already pointing to GitHub, no setup was required on my part. I assume once I removed that custom domain from my own repository, the lock was released and GitHub allowed someone else to claim it.&lt;/p&gt;&lt;p&gt;I&amp;rsquo;m not sure how long ago this was set up, and I probably wouldn&amp;rsquo;t have caught it if the other person didn&amp;rsquo;t try to set up as a Search Console property. As far as I can tell, none of my accounts were ever compromised, and I already had two-factor authentication enabled on both GitHub and Hover. I deleted the subdomain record in Hover and the website no longer works.&lt;/p&gt;&lt;p&gt;Learn from my mistake: check your domains and subdomains for possible hijacking, especially if they&amp;rsquo;re pointing to GitHub, and remove GitHub from any domain records you aren&amp;rsquo;t actively using. I have mirrored &lt;a href="https://gist.github.com/corbindavenport/241f6416bc2be452e448ea69569bd2b8"&gt;the website&amp;rsquo;s HTML code&lt;/a&gt; to a GitHub Gist if anyone wants to do more digging.&lt;/p&gt;</description><link>https://blog.corbin.io/post/772417532865970176</link><guid>https://blog.corbin.io/post/772417532865970176</guid><pubDate>Sat, 11 Jan 2025 17:32:42 -0500</pubDate><category>infosec</category><category>security</category><category>cybersecurity</category><category>github</category><category>web dev</category><category>web development</category></item><item><title>ImageShare v3.0 is now available</title><description>&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="1080" data-orig-width="1920"&gt;&lt;img src="https://64.media.tumblr.com/4303262beb856a30986779b15a0c2bec/e8ebbb987d152fc9-d7/s640x960/d05e8227cb3e8693831bb83b486f2dc8ad042df6.jpg" data-orig-height="1080" data-orig-width="1920" alt="ImageShare on phones and a 3DS" srcset="https://64.media.tumblr.com/4303262beb856a30986779b15a0c2bec/e8ebbb987d152fc9-d7/s75x75_c1/c2eecee90f71c11ec8653d94e96fd210990cb683.jpg 75w, https://64.media.tumblr.com/4303262beb856a30986779b15a0c2bec/e8ebbb987d152fc9-d7/s100x200/8d7b6c511d477a093b0ad817942af847f8650d06.jpg 100w, https://64.media.tumblr.com/4303262beb856a30986779b15a0c2bec/e8ebbb987d152fc9-d7/s250x400/2640b42da3f565a4d01bf6fd2ad74adf66b168a9.jpg 250w, https://64.media.tumblr.com/4303262beb856a30986779b15a0c2bec/e8ebbb987d152fc9-d7/s400x600/9e460123ecc972c4c0a86c06962505a3761e1aef.jpg 400w, https://64.media.tumblr.com/4303262beb856a30986779b15a0c2bec/e8ebbb987d152fc9-d7/s500x750/cc8c856ade33b351d35a9b5507dd15d0cf7676b5.jpg 500w, https://64.media.tumblr.com/4303262beb856a30986779b15a0c2bec/e8ebbb987d152fc9-d7/s540x810/a4248c5d8603b30111f82fbd1ee544644739e50e.jpg 540w, https://64.media.tumblr.com/4303262beb856a30986779b15a0c2bec/e8ebbb987d152fc9-d7/s640x960/d05e8227cb3e8693831bb83b486f2dc8ad042df6.jpg 640w, https://64.media.tumblr.com/4303262beb856a30986779b15a0c2bec/e8ebbb987d152fc9-d7/s1280x1920/c48c042eb4d9d538b67b766783c06259aae629d2.jpg 1280w, https://64.media.tumblr.com/4303262beb856a30986779b15a0c2bec/e8ebbb987d152fc9-d7/s2048x3072/35e1bb6baad172875ff9e183b5571a9fbc45700d.jpg 1920w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;The new ImageShare is the best way to share images and videos from low-end and legacy devices. It works on nearly every web browser that supports file uploads, and it has additional features for the Nintendo 3DS and Wii U.&lt;/p&gt;&lt;!-- more --&gt;&lt;p&gt;I made &lt;a href="https://www.patreon.com/posts/34621826"&gt;the first version of ImageShare&lt;/a&gt; in 2020, as an alternative to Nintendo’s Image Share service for the Nintendo 3DS, and I eventually added better mobile and desktop support. Trying to keep it functional for old browsers, like the one on the 3DS, has been difficult and required numerous rewrites and quick-fix API migrations. This new v3.0 update is nearly a complete rewrite, intended to keep the web app functional for the foreseeable future.&lt;/p&gt;&lt;p&gt;ImageShare has now &lt;a href="https://en-americas-support.nintendo.com/app/answers/detail/a_id/59832/~/nintendo-3ds-and-wii-u-image-share-service-discontinuation"&gt;outlived the Nintendo-operated service that inspired it&lt;/a&gt;, and I’d like to continue that winning streak. At the same time, I hope this will be a useful tool for &lt;i&gt;any&lt;/i&gt; old devices with a functional web browser, not just game consoles.&lt;/p&gt;&lt;h2&gt;Send images and video instantly&lt;/h2&gt;&lt;p&gt;ImageShare allows you to send any image or video file to another device. You can visit &lt;a href="https://www.theimageshare.com/"&gt;theimageshare.com&lt;/a&gt; in a web browser, select a file, then just press the Upload button. The uploaded file can be downloaded on another device by scanning the provided QR code, or you can type the provided shortlink in a web browser. The file is deleted from the server after a few minutes.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="1400" data-orig-width="1860"&gt;&lt;img src="https://64.media.tumblr.com/9fe5a148408b95865952d02173e33b68/e8ebbb987d152fc9-a0/s640x960/1dd48f039d64a7801815f644446b09229df497b8.png" data-orig-height="1400" data-orig-width="1860" alt="ImageShare with an uploaded image" srcset="https://64.media.tumblr.com/9fe5a148408b95865952d02173e33b68/e8ebbb987d152fc9-a0/s75x75_c1/cf5ca8d6b62ce2f8871edfd5b3e1af54d1abca11.png 75w, https://64.media.tumblr.com/9fe5a148408b95865952d02173e33b68/e8ebbb987d152fc9-a0/s100x200/97c180fdb9925103069139ce315050da39177a9b.png 100w, https://64.media.tumblr.com/9fe5a148408b95865952d02173e33b68/e8ebbb987d152fc9-a0/s250x400/5ea9eb24bc8fe35e7e8c2f00983cabebb4ffd381.png 250w, https://64.media.tumblr.com/9fe5a148408b95865952d02173e33b68/e8ebbb987d152fc9-a0/s400x600/5e2b77bff0baa5394aaa47db57f769f8f01c9394.png 400w, https://64.media.tumblr.com/9fe5a148408b95865952d02173e33b68/e8ebbb987d152fc9-a0/s500x750/9b506470f2d742e8f172b05af9c9aaee42367410.png 500w, https://64.media.tumblr.com/9fe5a148408b95865952d02173e33b68/e8ebbb987d152fc9-a0/s540x810/d8b7cbbb6e1866ed509448097808ba61f3b58c3e.png 540w, https://64.media.tumblr.com/9fe5a148408b95865952d02173e33b68/e8ebbb987d152fc9-a0/s640x960/1dd48f039d64a7801815f644446b09229df497b8.png 640w, https://64.media.tumblr.com/9fe5a148408b95865952d02173e33b68/e8ebbb987d152fc9-a0/s1280x1920/db811a8900a040c5b435be57c241d72dce808269.png 1280w, https://64.media.tumblr.com/9fe5a148408b95865952d02173e33b68/e8ebbb987d152fc9-a0/s2048x3072/7ff59258be99c50116d20fb287f73b8317acba14.png 1860w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;The file hosting is now handled entirely by the ImageShare server, instead of using Imgur or ImgBB, like earlier versions. The ability to upload files directly to popular hosting services with permanent hosting was great, but the Nintendo 3DS and other supported platforms can’t authenticate with sites like Imgur and ImgBB anymore, and unauthenticated uploads are either rate-limited or impractical. The QR codes are also now generated by ImageShare, instead of using a third-party API.&lt;/p&gt;&lt;p&gt;Thanks to this new architecture, ImageShare now supports most media formats, not just images. Scanning the QR code or visiting the link on another device starts the download immediately, as long as the browser allows it, saving you the step of right-clicking or holding down on the file to start the download.&lt;/p&gt;&lt;p&gt;ImageShare is also built with self-hosting in mind: it’s &lt;a href="https://github.com/corbindavenport/imageshare"&gt;completely open-source&lt;/a&gt;, and you can &lt;a href="https://github.com/corbindavenport/imageshare/blob/main/DEV.md"&gt;run it on any PC, home server, or production web server with Docker&lt;/a&gt;. The new version is even easier to set up, since API keys for Imgur or ImgBB aren’t needed anymore.&lt;/p&gt;&lt;h2&gt;Nintendo 3DS and Wii U support&lt;/h2&gt;&lt;p&gt;ImageShare is still designed to work with unmodified Nintendo 3DS and Nintendo Wii U game consoles, using their built-in web browsers. Full support for the Wii U is new in this update.&lt;/p&gt;&lt;p&gt;When you upload a game screenshot or other saved image from the 3DS or Wii U, the game’s title is automatically added to the image’s EXIF metadata. The device model in the metadata is also saved as ‘Nintendo 3DS’ or ‘Nintendo Wii U’, and the device make is saved as ‘Nintendo’. That data makes the images searchable by platform and game title when they are imported into most photo library apps and services. For example, after copying a few &lt;i&gt;Animal Crossing: New Leaf&lt;/i&gt; screenshots to my iPhone, I can search “animal crossing” in the Photos app later to see all of them.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="1084" data-orig-width="1000"&gt;&lt;img src="https://64.media.tumblr.com/d3f2f126c6288fef1e7baf6101e20aff/e8ebbb987d152fc9-9f/s640x960/663f894bc41692ba05ddafb29b83c38a4db96636.png" data-orig-height="1084" data-orig-width="1000" alt="Searching for Animal Crossing images on an iPhone" srcset="https://64.media.tumblr.com/d3f2f126c6288fef1e7baf6101e20aff/e8ebbb987d152fc9-9f/s75x75_c1/c603eb25d07ada382f169e1eb11a25a1fdf3527a.png 75w, https://64.media.tumblr.com/d3f2f126c6288fef1e7baf6101e20aff/e8ebbb987d152fc9-9f/s100x200/4f1ce02ba17a75beeff7c2c932d535f3808d6653.png 100w, https://64.media.tumblr.com/d3f2f126c6288fef1e7baf6101e20aff/e8ebbb987d152fc9-9f/s250x400/3efb9f4dc6a2d9340af7fc1e570a6f7fd93d9b6f.png 250w, https://64.media.tumblr.com/d3f2f126c6288fef1e7baf6101e20aff/e8ebbb987d152fc9-9f/s400x600/91d661fedbb191ad15fbcf4a243d091701e24d3d.png 400w, https://64.media.tumblr.com/d3f2f126c6288fef1e7baf6101e20aff/e8ebbb987d152fc9-9f/s500x750/a4260b0478ba7e92d0280e770b74bbf5d005a22c.png 500w, https://64.media.tumblr.com/d3f2f126c6288fef1e7baf6101e20aff/e8ebbb987d152fc9-9f/s540x810/e5627862cefa552b24d4cb31ff4c207be4b5e400.png 540w, https://64.media.tumblr.com/d3f2f126c6288fef1e7baf6101e20aff/e8ebbb987d152fc9-9f/s640x960/663f894bc41692ba05ddafb29b83c38a4db96636.png 640w, https://64.media.tumblr.com/d3f2f126c6288fef1e7baf6101e20aff/e8ebbb987d152fc9-9f/s1280x1920/8ad340d825d289db7fc9798a6b5ce852e9077f39.png 1000w" sizes="(max-width: 1000px) 100vw, 1000px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;This functionality is possible because images saved on Nintendo consoles contain a partial ID for the game they originated from. That ID is stored in the file name on Wii U consoles, and on 3DS consoles, it’s in the EXIF metadata. ImageShare extracts that game ID, matches it against &lt;a href="https://github.com/hax0kartik/3dsdb"&gt;hax0kartik’s 3dsdb&lt;/a&gt; and &lt;a href="https://wiiubrew.org/wiki/Title_database"&gt;WiiUBrew’s title database&lt;/a&gt;, and then saves the matching game title back to the file before the file is downloaded.&lt;/p&gt;&lt;p&gt;Now that Nintendo’s own media upload service for the 3DS and Wii U is dead, ImageShare is (probably) the best way to transfer images and videos from those consoles to a phone or other modern device, where they can be easily backed up and shared online. No homebrew or taking out SD cards required.&lt;/p&gt;&lt;h2&gt;ImageShare on everything else&lt;/h2&gt;&lt;p&gt;ImageShare works on nearly every mobile and desktop web browser. I’ve tested it across modern browsers, older versions of Safari and Firefox, &lt;a href="https://www.kaiostech.com/"&gt;KaiOS&lt;/a&gt; feature phones, Windows Phone 10, and several versions of Internet Explorer and Netscape. The below image shows ImageShare working perfectly on Internet Explorer 5.0 for Mac, which was released 24 years ago. You’ve heard of &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Progressive_Enhancement"&gt;progressive enhancement&lt;/a&gt;, now get ready for regressive enhancement.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="801" data-orig-width="966"&gt;&lt;img src="https://64.media.tumblr.com/50b3d91b24fadff6bedf752010fbd2fd/e8ebbb987d152fc9-e9/s640x960/eb6a0e339be80a58945e040a788f35f28e3ab5f4.png" data-orig-height="801" data-orig-width="966" alt="ImageShare on Internet Explorer 5" srcset="https://64.media.tumblr.com/50b3d91b24fadff6bedf752010fbd2fd/e8ebbb987d152fc9-e9/s75x75_c1/d79cf71872e07401a0dc68dfc88d9da7a2282d6c.png 75w, https://64.media.tumblr.com/50b3d91b24fadff6bedf752010fbd2fd/e8ebbb987d152fc9-e9/s100x200/3529c1f7b37b9015652228cd540cff1a7af98f4c.png 100w, https://64.media.tumblr.com/50b3d91b24fadff6bedf752010fbd2fd/e8ebbb987d152fc9-e9/s250x400/d43b035eae61dabc703abd101467f6be9c7487ca.png 250w, https://64.media.tumblr.com/50b3d91b24fadff6bedf752010fbd2fd/e8ebbb987d152fc9-e9/s400x600/e3da65799232f48bf98503ebf7ebd2e9cf0a98b8.png 400w, https://64.media.tumblr.com/50b3d91b24fadff6bedf752010fbd2fd/e8ebbb987d152fc9-e9/s500x750/758ac0ab83311dc00c819141ac6541cdb179f97c.png 500w, https://64.media.tumblr.com/50b3d91b24fadff6bedf752010fbd2fd/e8ebbb987d152fc9-e9/s540x810/deb245a21e8a3cb7e0e4dc06b9b9730e0066af47.png 540w, https://64.media.tumblr.com/50b3d91b24fadff6bedf752010fbd2fd/e8ebbb987d152fc9-e9/s640x960/eb6a0e339be80a58945e040a788f35f28e3ab5f4.png 640w, https://64.media.tumblr.com/50b3d91b24fadff6bedf752010fbd2fd/e8ebbb987d152fc9-e9/s1280x1920/26b2d5dd4c2ea693d10324d5a1120926fb4a348c.png 966w" sizes="(max-width: 966px) 100vw, 966px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;Modern desktop and mobile web browsers get the fancy responsive layout, with drop shadows, two columns on larger screens, and automatic dark mode support. This works for most browsers with &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Progressive_Enhancement"&gt;CSS3 media queries support&lt;/a&gt;, mostly in the 2010s and later, and it can shrink down to a minimal interface used for the Nintendo 3DS and other small mobile screens.&lt;/p&gt;&lt;p&gt;Older web browsers get a single-column layout, and some effects like rounded corners and drop shadows might not work. This is what you’ll get on old versions of Safari, Internet Explorer, and Firefox from around the early-2000s to early-2010s.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="1400" data-orig-width="1860"&gt;&lt;img src="https://64.media.tumblr.com/4c8a6000eeb08cc0a27a39ce3e195ce2/e8ebbb987d152fc9-fa/s640x960/70fa3ba45a19d0a68fca853bb02fc139b9823f8a.png" data-orig-height="1400" data-orig-width="1860" alt="One-column layout" srcset="https://64.media.tumblr.com/4c8a6000eeb08cc0a27a39ce3e195ce2/e8ebbb987d152fc9-fa/s75x75_c1/b33dd840eb8e008431cdd1f3144c933aa82e2ee5.png 75w, https://64.media.tumblr.com/4c8a6000eeb08cc0a27a39ce3e195ce2/e8ebbb987d152fc9-fa/s100x200/51f6b263edb22718b7bbaedbaa7238cf361a2b17.png 100w, https://64.media.tumblr.com/4c8a6000eeb08cc0a27a39ce3e195ce2/e8ebbb987d152fc9-fa/s250x400/3186249a86746c2f97fee9bf7966472edad9e210.png 250w, https://64.media.tumblr.com/4c8a6000eeb08cc0a27a39ce3e195ce2/e8ebbb987d152fc9-fa/s400x600/32819faaeb08e666ea2b8aa71531f90328db2717.png 400w, https://64.media.tumblr.com/4c8a6000eeb08cc0a27a39ce3e195ce2/e8ebbb987d152fc9-fa/s500x750/2a41393d8e2433e1e42061ee0691786fcf7c2dfe.png 500w, https://64.media.tumblr.com/4c8a6000eeb08cc0a27a39ce3e195ce2/e8ebbb987d152fc9-fa/s540x810/e302fc1a0d827f5e670b482bd99a183112ee31f0.png 540w, https://64.media.tumblr.com/4c8a6000eeb08cc0a27a39ce3e195ce2/e8ebbb987d152fc9-fa/s640x960/70fa3ba45a19d0a68fca853bb02fc139b9823f8a.png 640w, https://64.media.tumblr.com/4c8a6000eeb08cc0a27a39ce3e195ce2/e8ebbb987d152fc9-fa/s1280x1920/5f8f360bcc93c9e67f44ddef6832f2e7f232c60c.png 1280w, https://64.media.tumblr.com/4c8a6000eeb08cc0a27a39ce3e195ce2/e8ebbb987d152fc9-fa/s2048x3072/4155955502ccc5d077bed595ffdf315b2c70fcb5.png 1860w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;Finally, &lt;i&gt;really&lt;/i&gt; old web browsers like Netscape 4.x get the plain HTML layout. ImageShare uses a &lt;a href="https://github.com/corbindavenport/imageshare/blob/1b72ea35e43c1ec07e8479930213ee14cae7f9d5/src/app.js#L202"&gt;fun web dev trick&lt;/a&gt; to prevent browsers with early and incomplete CSS1 implementations from trying (and failing) to load the more complex layout.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="1400" data-orig-width="1860"&gt;&lt;img src="https://64.media.tumblr.com/e9d2cebfa70aef5b6fc6b3245da4c854/e8ebbb987d152fc9-2c/s640x960/32bc8db6a20beaaf47fdeeeb9d3569505d007f9e.png" data-orig-height="1400" data-orig-width="1860" alt="ImageShare with plain HTML layout" srcset="https://64.media.tumblr.com/e9d2cebfa70aef5b6fc6b3245da4c854/e8ebbb987d152fc9-2c/s75x75_c1/7615e56a8f3309ee3d3cd5f0732196fd000fbb4e.png 75w, https://64.media.tumblr.com/e9d2cebfa70aef5b6fc6b3245da4c854/e8ebbb987d152fc9-2c/s100x200/517961520873024bb402cc43e1443c0f2b5f6607.png 100w, https://64.media.tumblr.com/e9d2cebfa70aef5b6fc6b3245da4c854/e8ebbb987d152fc9-2c/s250x400/543a26ecce8c0dbd2b3ccddc1b56e3d45ddd2e0e.png 250w, https://64.media.tumblr.com/e9d2cebfa70aef5b6fc6b3245da4c854/e8ebbb987d152fc9-2c/s400x600/858eaf8e4ff72af33a09435234937b6fbddcc86f.png 400w, https://64.media.tumblr.com/e9d2cebfa70aef5b6fc6b3245da4c854/e8ebbb987d152fc9-2c/s500x750/c76ef31e24d9c6f8a13c91f57f73c70a7ebe2625.png 500w, https://64.media.tumblr.com/e9d2cebfa70aef5b6fc6b3245da4c854/e8ebbb987d152fc9-2c/s540x810/e5fc5d9a78db874cfbd86da1e09d018e114516dd.png 540w, https://64.media.tumblr.com/e9d2cebfa70aef5b6fc6b3245da4c854/e8ebbb987d152fc9-2c/s640x960/32bc8db6a20beaaf47fdeeeb9d3569505d007f9e.png 640w, https://64.media.tumblr.com/e9d2cebfa70aef5b6fc6b3245da4c854/e8ebbb987d152fc9-2c/s1280x1920/1cc70b885137aa79d7b8808dbae276a27515fac5.png 1280w, https://64.media.tumblr.com/e9d2cebfa70aef5b6fc6b3245da4c854/e8ebbb987d152fc9-2c/s2048x3072/9bf5d0caa365d9c6475a99858e260d7eda1a4b2f.png 1860w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;ImageShare still doesn’t use any client-side JavaScript (except to show a loading spinner after you click the Upload button), and HTTPS is optional, so it’s fast and looks great on many devices. The minimum requirement is just file upload support in the browser. For example, ImageShare doesn’t work on some old iPhone and iPod Touch models, because mobile Safari &lt;a href="https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariWebContent/CreatingContentforSafarioniPhone/CreatingContentforSafarioniPhone.html"&gt;didn’t allow file uploads until iOS 6&lt;/a&gt;. The QR code also won’t work on &lt;a href="https://github.com/corbindavenport/imageshare/issues/32"&gt;browsers that don’t support PNG images&lt;/a&gt;, but most of the browsers affected by that also don’t allow file uploads.&lt;/p&gt;&lt;h2&gt;Hello, Node&lt;/h2&gt;&lt;p&gt;The new ImageShare is a near-complete rewrite, replacing the original PHP codebase with &lt;a href="https://nodejs.org/en"&gt;Node.js&lt;/a&gt;. I have never really liked working in PHP, so when faced with the problem of having to rework the app anyway, I figured now was a good time to finally change the technical foundation.&lt;/p&gt;&lt;p&gt;Node’s great ecosystem of libraries made the transition easy, and it allowed me to quickly add features that had been on the to-do list for ages. ImageShare is using &lt;a href="https://expressjs.com/"&gt;Express&lt;/a&gt; and &lt;a href="https://expressjs.com/en/resources/middleware/multer.html"&gt;Multer&lt;/a&gt; to serve the web pages (which are dynamically generated) and static resources, as well as handling image uploads and downloads. The QR codes are created with the excellent &lt;a href="https://www.npmjs.com/package/qrcode"&gt;node-qrcode&lt;/a&gt; library, and &lt;a href="https://www.npmjs.com/package/exifreader"&gt;exifreader&lt;/a&gt; is used for checking image metadata. The only core functionality that isn’t handled in the server is writing game titles to image EXIF metadata. For that, the server spawns an &lt;a href="https://www.tumblr.com/new/exiftool"&gt;ExifTool&lt;/a&gt; process.&lt;/p&gt;&lt;p&gt;ImageShare was already a multi-container Docker Compose application, with the app running in one container, Certbot from Let’s Encrypt in another container for generating and renewing the SSL certificate, and Nginx in another container for the reverse proxy. With this update, the PHP server was swapped for a Node server, and the rest remained relatively untouched. Hooray for modularity!&lt;/p&gt;&lt;h2&gt;Try it out&lt;/h2&gt;&lt;p&gt;You can use the new ImageShare by visiting &lt;a href="https://theimageshare.com/"&gt;theimageshare.com&lt;/a&gt; in your web browser, and &lt;a href="https://github.com/corbindavenport/imageshare"&gt;the source code is available on GitHub&lt;/a&gt;. You can also bookmark it for easy access in the future. I’m hoping this will remain a valuable and useful service for years to come.&lt;/p&gt;</description><link>https://blog.corbin.io/post/768826371169501184</link><guid>https://blog.corbin.io/post/768826371169501184</guid><pubDate>Tue, 03 Dec 2024 02:12:43 -0500</pubDate><category>web app</category><category>web apps</category><category>nintendo 3ds</category><category>3ds</category><category>nintendo</category><category>wii u</category><category>nintendo wii u</category><category>homebrew</category><category>windows phone</category><category>retro</category><category>retro tech</category></item><item><title>Alt Text Creator 1.2 is now available!</title><description>&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="881" data-orig-width="1304"&gt;&lt;img src="https://64.media.tumblr.com/b32b84663ab1fc04b7c2080cdfc51b89/f7ceb094647e2276-ab/s640x960/faff6906950624a5613e5ad2b18e675edb42660b.png" data-orig-height="881" data-orig-width="1304" alt="A social media post of a dog with the generated alt text: A dog wearing a Santa hat and a gray sweater sits beside a decorated Christmas tree and holiday gifts." srcset="https://64.media.tumblr.com/b32b84663ab1fc04b7c2080cdfc51b89/f7ceb094647e2276-ab/s75x75_c1/458a10d0f638cdf92ef491d91a029e4c85656000.png 75w, https://64.media.tumblr.com/b32b84663ab1fc04b7c2080cdfc51b89/f7ceb094647e2276-ab/s100x200/3dd6986438610516496f74579a90216daf464bfd.png 100w, https://64.media.tumblr.com/b32b84663ab1fc04b7c2080cdfc51b89/f7ceb094647e2276-ab/s250x400/55adec8a7221323b9e3279106940872028d4b743.png 250w, https://64.media.tumblr.com/b32b84663ab1fc04b7c2080cdfc51b89/f7ceb094647e2276-ab/s400x600/eba7cb493d769eb62790272fc469be83836cb21c.png 400w, https://64.media.tumblr.com/b32b84663ab1fc04b7c2080cdfc51b89/f7ceb094647e2276-ab/s500x750/bc326e6d3663c35ae4d13ac834147f90a8864a42.png 500w, https://64.media.tumblr.com/b32b84663ab1fc04b7c2080cdfc51b89/f7ceb094647e2276-ab/s540x810/d6932f2ba29bbfff4f8c5d2568aecb2c12c10e41.png 540w, https://64.media.tumblr.com/b32b84663ab1fc04b7c2080cdfc51b89/f7ceb094647e2276-ab/s640x960/faff6906950624a5613e5ad2b18e675edb42660b.png 640w, https://64.media.tumblr.com/b32b84663ab1fc04b7c2080cdfc51b89/f7ceb094647e2276-ab/s1280x1920/743b6514cf01efda4766a8bc524c22fb34f07717.png 1280w, https://64.media.tumblr.com/b32b84663ab1fc04b7c2080cdfc51b89/f7ceb094647e2276-ab/s2048x3072/177b0a5aa0cc8d0aa90679e96ae06e5d6166a843.png 1304w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;Earlier this year, I released &lt;a href="https://github.com/corbindavenport/alt-text-creator/"&gt;Alt Text Creator&lt;/a&gt;, a browser extension that can generate &lt;a href="https://support.microsoft.com/en-us/office/everything-you-need-to-know-to-write-effective-alt-text-df98f884-ca3d-456c-807b-1a1fa82f5dc2"&gt;alternative text&lt;/a&gt; for images by right-clicking them, using OpenAI&amp;rsquo;s GPT-4 with Vision model. The new v1.2 update is now rolling out, with support for OpenAI&amp;rsquo;s newer AI models and a new custom server option.&lt;/p&gt;&lt;!-- more --&gt;&lt;p&gt;Alt Text Creator can now use OpenAI&amp;rsquo;s latest &lt;a href="https://openai.com/index/gpt-4o-mini-advancing-cost-efficient-intelligence/"&gt;GPT-4o Mini&lt;/a&gt; or GPT-4o AI models for processing images, which are faster and cheaper than the original GPT-4 with Vision model that the extension previously used (and will soon be deprecated by OpenAI). You should be able to generate alt text for several images with less than $0.01 in API billing. Alt Text Creator still uses an API key provided by the user, and uses the low resolution option, so it runs at the lowest possible cost with the user&amp;rsquo;s own API billing.&lt;/p&gt;&lt;p&gt;This update also introduces the ability to use a custom server instead of OpenAI. The LM Studio desktop application now supports downloading AI models with vision abilities to run locally, and can enable a web server to interact with the AI model using an OpenAI-like API. Alt Text Creator can now connect to that server (and theoretically other similar API limitations), allowing you to create alt text entirely on-device without paying OpenAI for API access.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="1008" data-orig-width="1501"&gt;&lt;img src="https://64.media.tumblr.com/91e990033cefc7ce7dc9fbb9cee6a4f0/f7ceb094647e2276-18/s640x960/87548113d394ced2f8f80cfbffb2183ad72e402c.png" data-orig-height="1008" data-orig-width="1501" alt="Screenshot of LM Studio running an AI model web server for Alt Text Creator." srcset="https://64.media.tumblr.com/91e990033cefc7ce7dc9fbb9cee6a4f0/f7ceb094647e2276-18/s75x75_c1/a818d2151a05111f8b330c38eb5b70084d9fb616.png 75w, https://64.media.tumblr.com/91e990033cefc7ce7dc9fbb9cee6a4f0/f7ceb094647e2276-18/s100x200/99f55decc13e7f5f1246878ec21ecca3e6d869c7.png 100w, https://64.media.tumblr.com/91e990033cefc7ce7dc9fbb9cee6a4f0/f7ceb094647e2276-18/s250x400/837ee6c8dd1e26886f722ef5a10292e2f0ca2735.png 250w, https://64.media.tumblr.com/91e990033cefc7ce7dc9fbb9cee6a4f0/f7ceb094647e2276-18/s400x600/4f1b170e8862154843bd08f13934466d87ccd8db.png 400w, https://64.media.tumblr.com/91e990033cefc7ce7dc9fbb9cee6a4f0/f7ceb094647e2276-18/s500x750/3c942e4fec1a5a178b5d662810449c58b0bad01f.png 500w, https://64.media.tumblr.com/91e990033cefc7ce7dc9fbb9cee6a4f0/f7ceb094647e2276-18/s540x810/bbb5cc8a241c675a56fa69d4e008ac6424d70fed.png 540w, https://64.media.tumblr.com/91e990033cefc7ce7dc9fbb9cee6a4f0/f7ceb094647e2276-18/s640x960/87548113d394ced2f8f80cfbffb2183ad72e402c.png 640w, https://64.media.tumblr.com/91e990033cefc7ce7dc9fbb9cee6a4f0/f7ceb094647e2276-18/s1280x1920/f7b91d156665012100786b8d4a0f1b5c32f9c099.png 1280w, https://64.media.tumblr.com/91e990033cefc7ce7dc9fbb9cee6a4f0/f7ceb094647e2276-18/s2048x3072/60f8e7b6c56028804490e98718ca23377f3245e3.png 1501w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;The feature is &lt;a href="https://github.com/corbindavenport/alt-text-creator/blob/main/CUSTOM.md"&gt;a bit complicated to set up&lt;/a&gt;, is slower than OpenAI&amp;rsquo;s API (unless you have an incredibly powerful PC), and requires leaving LM Studio open, so I don&amp;rsquo;t expect many people will use this option for now. I primarily tested it with the &lt;a href="https://huggingface.co/second-state/Llava-v1.5-7B-GGUF"&gt;Llava 1.5 7B model&lt;/a&gt; on a 16GB M1 Mac Mini, and it was about half the speed of an OpenAI request (8 vs 4 seconds for one example) while having generally lower-quality results.&lt;/p&gt;&lt;p&gt;You can download Alt Text Creator for Chrome and Firefox, and &lt;a href="https://github.com/corbindavenport/alt-text-creator/"&gt;the source code is on GitHub&lt;/a&gt;. I still want to look into support for other AI models, like Google&amp;rsquo;s Gemini, and the option for the user to change the prompt, but I wanted to get these changes out soon before GPT-4 Vision was deprecated.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href="https://chromewebstore.google.com/detail/alt-text-creator-with-gpt/nlahkceofkdggfgfpheakpaphdfplaio"&gt;Download for Google Chrome&lt;/a&gt; &lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/alt-text-creator/"&gt;Download for Mozilla Firefox&lt;/a&gt; &lt;/b&gt;&lt;/p&gt;</description><link>https://blog.corbin.io/post/760449212397830145</link><guid>https://blog.corbin.io/post/760449212397830145</guid><pubDate>Sun, 01 Sep 2024 16:01:22 -0400</pubDate><category>gpt 4</category><category>gpt 4o</category><category>chatgpt</category><category>openai</category><category>llm</category><category>lm studio</category><category>browser extension</category><category>chrome extension</category><category>chrome</category><category>extension</category><category>firefox</category><category>firefox extension</category><category>firefox extensions</category><category>ai</category></item><item><title>Tech Tales: Year Three</title><description>&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="3000" data-orig-width="5333"&gt;&lt;img src="https://64.media.tumblr.com/b83e59ea826458d0f68ee065df03d83a/3bb9b863fc0227de-71/s640x960/90e90d5dfcfc8371d2c781e4365518f0c0762022.jpg" data-orig-height="3000" data-orig-width="5333" alt='Artwork with "Tech Tales: Year Three" and Duke Nukem, Steve Jobs, Tommy Tallarico, the CyanogenMod mascot, and Quorra from Tron: Legacy.' srcset="https://64.media.tumblr.com/b83e59ea826458d0f68ee065df03d83a/3bb9b863fc0227de-71/s75x75_c1/67773220d1b885db190ef46c4c8d266321510fa4.jpg 75w, https://64.media.tumblr.com/b83e59ea826458d0f68ee065df03d83a/3bb9b863fc0227de-71/s100x200/b0b8a1754b85202bda78e5effbe38fa10edde8f7.jpg 100w, https://64.media.tumblr.com/b83e59ea826458d0f68ee065df03d83a/3bb9b863fc0227de-71/s250x400/a2ddf67cd3c95b4b48f624b08901cf73fc425efa.jpg 250w, https://64.media.tumblr.com/b83e59ea826458d0f68ee065df03d83a/3bb9b863fc0227de-71/s400x600/ee04d7dd7e18e861763cfb9282e710a6afbd617e.jpg 400w, https://64.media.tumblr.com/b83e59ea826458d0f68ee065df03d83a/3bb9b863fc0227de-71/s500x750/8273f52953cbcc05dff983088ccbac2cc91e4b8a.jpg 500w, https://64.media.tumblr.com/b83e59ea826458d0f68ee065df03d83a/3bb9b863fc0227de-71/s540x810/4755d1d9466b37258834c4206435e6fadba09dcf.jpg 540w, https://64.media.tumblr.com/b83e59ea826458d0f68ee065df03d83a/3bb9b863fc0227de-71/s640x960/90e90d5dfcfc8371d2c781e4365518f0c0762022.jpg 640w, https://64.media.tumblr.com/b83e59ea826458d0f68ee065df03d83a/3bb9b863fc0227de-71/s1280x1920/1e1bdf57cf11d15136280c66db33f47c9e513041.jpg 1280w, https://64.media.tumblr.com/b83e59ea826458d0f68ee065df03d83a/3bb9b863fc0227de-71/s2048x3072/63dc62e562ef90c28847c872d4e368dec596a405.jpg 2048w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;Today, my podcast &lt;a href="https://techtalesshow.com/"&gt;Tech Tales&lt;/a&gt; is three years old. I&amp;rsquo;ve had a lot of fun making the show this past year, and it has continued to grow and improve.&lt;/p&gt;&lt;!-- more --&gt;&lt;p&gt;There were eight Tech Tales episodes this past year, coming in at just under eight hours of runtime. There are now 55 episodes in total, just over 17,000 plays on audio platforms, and 230 subscribers on YouTube. That&amp;rsquo;s more than double the YouTube subscribers than the show had &lt;a href="https://blog.corbin.io/post/720114735823126528/tech-tales-year-two"&gt;a year ago&lt;/a&gt;, and almost double the amount of audio plays.&lt;/p&gt;&lt;p&gt;There was a pretty good mix of episodes this year, diving into the history of the Apple IIGS computer, &lt;i&gt;Duke Nukem Forever&lt;/i&gt;, the CyanogenMod custom ROM, the Intellivision Amico console, Google AMP, and Apple&amp;rsquo;s transition to Intel processors. There were also two Movie Club episodes to give me a break from history research: one for &lt;i&gt;Tron&lt;/i&gt; and another for its sequel, &lt;i&gt;Tron: Legacy&lt;/i&gt;. That last one now holds the record for longest Tech Tales episode at 1 hour and 21 minutes.&lt;/p&gt;&lt;p&gt;Tech Tales is still growing without any paid advertising, with only word of mouth, algorithmic recommendations through YouTube, and my own efforts on social media (primarily Mastodon). There were a few sudden boosts, like YouTube&amp;rsquo;s algorithm pushing the Intellivision Amico episode to hundreds more people than usual, and a few episodes were shared on tech forums and sites by listeners.&lt;/p&gt;&lt;p&gt;The big behind-the-scenes shift this year was moving the production from Audacity to Apple Logic Pro, which has made it much easier for me to edit episodes and &lt;a href="https://blog.corbin.io/post/748500250878263296/figuring-out-podcast-chapter-markers"&gt;add chapter markers&lt;/a&gt;. The episodes sound better than ever, and the YouTube version now has a fun &lt;a href="https://www.youtube.com/watch?v=RH8jmdl7XtQ"&gt;idle animation&lt;/a&gt; instead of a static image.&lt;/p&gt;&lt;p&gt;I also started my new newsletter and blog, &lt;a href="https://www.spacebar.news/"&gt;The Spacebar&lt;/a&gt;, a few months after Tech Tales&amp;rsquo; second anniversary. I adapted some older Tech Tales episodes as new articles for The Spacebar, such as the story of the &lt;a href="https://www.spacebar.news/the-asus-eee-pc-and-the-netbook-revolution/"&gt;Eee PC&lt;/a&gt; and &lt;a href="https://www.spacebar.news/visicalc-the-first-killer-app/"&gt;VisiCalc&lt;/a&gt;. I plan to do more of that in the future, and maybe more cross-promotion where it makes sense.&lt;/p&gt;&lt;p&gt;I don&amp;rsquo;t have any grand plans for Tech Tales for the next year ahead, other than continuing to work on it when I have the time and interesting topics to discuss. The editing process is a lot less frustrating now, which helps!&lt;/p&gt;&lt;p&gt;In no particular order, I would like to thank &lt;a href="https://mas.to/@tallshmo"&gt;Joe Fedewa&lt;/a&gt;, &lt;a href="https://hachyderm.io/@347Online"&gt;Katie Janzen&lt;/a&gt;, &lt;a href="https://lucasbastos.com/"&gt;Lucas Bastos&lt;/a&gt;, &lt;a href="https://www.threads.net/@evanextreme/#."&gt;Evan Hirsh&lt;/a&gt;, &lt;a href="https://mstdn.io/@CodyToombs"&gt;Cody Toombs&lt;/a&gt;, &lt;a href="https://zwander.dev/"&gt;Zachary Wander&lt;/a&gt;, and &lt;a href="https://www.adamconway.ie/"&gt;Adam Conway&lt;/a&gt; for joining as guests this past year. I also want to thank everyone who has ever listened to the show, and especially the ones who have reached out to me.&lt;/p&gt;&lt;p&gt;You can listen to Tech Tales for free on &lt;a href="https://www.youtube.com/channel/UCoJhtqauQgAykvSLQSyu7UQ?sub_confirmation=1"&gt;YouTube&lt;/a&gt; or &lt;a href="https://techtalesshow.com/"&gt;your favorite podcast app&lt;/a&gt;. Onward to year four!&lt;/p&gt;</description><link>https://blog.corbin.io/post/753273211959083008</link><guid>https://blog.corbin.io/post/753273211959083008</guid><pubDate>Fri, 14 Jun 2024 11:01:55 -0400</pubDate></item><item><title>How I made my new personal website</title><description>&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="720" data-orig-width="1280"&gt;&lt;img src="https://64.media.tumblr.com/42db673c758c628968bb4863c5776e46/09837e97de7c33c5-74/s640x960/0238c1577ceed5665999617bc4cecd732bc6f7f9.png" data-orig-height="720" data-orig-width="1280" alt="Screenshot of about page" srcset="https://64.media.tumblr.com/42db673c758c628968bb4863c5776e46/09837e97de7c33c5-74/s75x75_c1/59f5facb6a57ea7fa5d665fa6cb2b97e2cc1087b.png 75w, https://64.media.tumblr.com/42db673c758c628968bb4863c5776e46/09837e97de7c33c5-74/s100x200/a655232d5799091d85aa25e65fdbd28084bd79ab.png 100w, https://64.media.tumblr.com/42db673c758c628968bb4863c5776e46/09837e97de7c33c5-74/s250x400/57a88cd8b9ace2052379836332f10e059ce9d598.png 250w, https://64.media.tumblr.com/42db673c758c628968bb4863c5776e46/09837e97de7c33c5-74/s400x600/82b4100237073fc4762144004b0f13433aced29c.png 400w, https://64.media.tumblr.com/42db673c758c628968bb4863c5776e46/09837e97de7c33c5-74/s500x750/31c1e6d8b7a6254107e9538552dac10ed3f3585a.png 500w, https://64.media.tumblr.com/42db673c758c628968bb4863c5776e46/09837e97de7c33c5-74/s540x810/a5632242ee30be0f9cff9306a7c6a6de2e1da0ab.png 540w, https://64.media.tumblr.com/42db673c758c628968bb4863c5776e46/09837e97de7c33c5-74/s640x960/0238c1577ceed5665999617bc4cecd732bc6f7f9.png 640w, https://64.media.tumblr.com/42db673c758c628968bb4863c5776e46/09837e97de7c33c5-74/s1280x1920/b3318da8ef6b50a264df1401d6fc9d57c98d0f67.png 1280w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;I just finished making &lt;a href="https://corbin.io/"&gt;my new personal site&lt;/a&gt;, powered by the Eleventy static site generator, a custom template, and GitHub Actions. It’s fast, easy for me to maintain, and doesn’t cost me anything to host. Here’s how I made it.&lt;/p&gt;&lt;!-- more --&gt;&lt;p&gt;My &lt;a href="https://web.archive.org/web/20240122055940id_/https:/corbin.io/"&gt;previous personal site&lt;/a&gt; was a static HTML site hosted on GitHub Pages, which I initially &lt;a href="https://blog.corbin.io/post/177683469374/how-i-built-my-website"&gt;made in 2018&lt;/a&gt; to replace my Blogger-based site (that’s a throwback!). I made the layout and site theme myself instead of using a heavier web framework, and I moved the blog section to Tumblr with a new &lt;a href="https://blog.corbin.io/"&gt;blog.corbin.io&lt;/a&gt; domain. I later tried switching to WordPress managed hosting, but that costs more money, and I wasn’t a fan of most modern WordPress themes and how resource-heavy they were. WordPress is great for larger sites, but it was overkill for my simple personal site.&lt;/p&gt;&lt;p&gt;My ideal setup here would be a site that is easy to edit, gives me full control over the template, and (ideally) doesn’t require paid hosting. My first idea was moving the content to Markdown files, and then using &lt;a href="https://jekyllrb.com/docs/github-pages/"&gt;GitHub’s Jekyll integration&lt;/a&gt; to generate a static site. Creating a Jekyll theme turned out to be a bit clunkier than I wanted, though, so I started looking at other static site generators.&lt;/p&gt;&lt;p&gt;I eventually discovered &lt;a href="https://www.11ty.dev/"&gt;Eleventy&lt;/a&gt;, which doesn’t have the extensive feature set of Jekyll or some other static site generators, but it looked perfect for my project. It can generate sites from Markdown (or other data formats) using simple HTML templates, and I could keep using free GitHub Pages hosting. It’s also possible to create reusable widget components with contents, which can be filled in by the main Eleventy generation script. The &lt;a href="https://www.11ty.dev/docs/"&gt;official getting started guide&lt;/a&gt; was helpful.&lt;/p&gt;&lt;p&gt;The most clear way for me to talk about my process is just go through each of the files in the &lt;a href="https://github.com/corbindavenport/corbindavenport.github.io"&gt;GitHub repository&lt;/a&gt;, so that’s what I’ll do!&lt;/p&gt;&lt;h2&gt;The main pages&lt;/h2&gt;&lt;p&gt;I wrote all the pages for the site, like the &lt;a href="https://github.com/corbindavenport/corbindavenport.github.io/blob/main/about.md"&gt;About page&lt;/a&gt;, in Markdown format. It’s mostly the same syntax that as GitHub, but with an added table at the top to define the page title, permalink, and template layout. This is a huge upgrade over my previous site, where I was writing the &amp;lt;head&amp;gt; and other shared elements in each page and tried to keep them synchronized.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="775" data-orig-width="1265"&gt;&lt;img src="https://64.media.tumblr.com/e636f119356e943391d555af821c6a80/09837e97de7c33c5-be/s640x960/2afd1f37427869bee17a6def06423a3275ddffeb.png" data-orig-height="775" data-orig-width="1265" alt="Markdown code for Software page" srcset="https://64.media.tumblr.com/e636f119356e943391d555af821c6a80/09837e97de7c33c5-be/s75x75_c1/172232ec20e4ded578803f8f14fe70ad3f2189be.png 75w, https://64.media.tumblr.com/e636f119356e943391d555af821c6a80/09837e97de7c33c5-be/s100x200/a54e73f20b6997e9e55c401778c983b6d8fad0fb.png 100w, https://64.media.tumblr.com/e636f119356e943391d555af821c6a80/09837e97de7c33c5-be/s250x400/8a00770999cc524e144346f93f529285793b0a5b.png 250w, https://64.media.tumblr.com/e636f119356e943391d555af821c6a80/09837e97de7c33c5-be/s400x600/f72a4920b3d6a79813563497bcad2dfe2b7b3c80.png 400w, https://64.media.tumblr.com/e636f119356e943391d555af821c6a80/09837e97de7c33c5-be/s500x750/65508e58a785df0530acda83fc7e9de9cfcaf821.png 500w, https://64.media.tumblr.com/e636f119356e943391d555af821c6a80/09837e97de7c33c5-be/s540x810/d3ca946989236f419a4df43c8909eec04d08560e.png 540w, https://64.media.tumblr.com/e636f119356e943391d555af821c6a80/09837e97de7c33c5-be/s640x960/2afd1f37427869bee17a6def06423a3275ddffeb.png 640w, https://64.media.tumblr.com/e636f119356e943391d555af821c6a80/09837e97de7c33c5-be/s1280x1920/29a8a90f30442d2cafac1ac138ba7ff263db3ccd.png 1265w" sizes="(max-width: 1265px) 100vw, 1265px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;Eleventy converts Markdown format to the equivalent standard HTML code when the site is generated. For example, “# Hello” becomes “&amp;lt;h1&amp;gt;Hello&amp;lt;/h1&amp;gt;”. That makes styling the site with CSS in the layout template easy, and it’s great for accessibility. You can also put custom HTML content in the Markdown file and it will render as expected.&lt;/p&gt;&lt;p&gt;It’s much easier for me to make quick edits to Markdown files than raw HTML. I can even do it from the GitHub app on my phone.&lt;/p&gt;&lt;h2&gt;The special pages&lt;/h2&gt;&lt;p&gt;GitHub Pages allows you to &lt;a href="https://docs.github.com/en/pages/getting-started-with-github-pages/creating-a-custom-404-page-for-your-github-pages-site"&gt;create a custom 404 page&lt;/a&gt;, which appears to still work with custom site generators as long as the resulting file is called “404.md” or “404.html” in the main directory. I &lt;a href="https://github.com/corbindavenport/corbindavenport.github.io/blob/main/404.md"&gt;made one&lt;/a&gt; and set the permalink to “404.html” and it works as expected.&lt;/p&gt;&lt;p&gt;My earlier site had a few redirecting pages, mostly for blog posts that used to be on my main domain but were later moved to my blog. Those had to be in specific locations to work with my earlier site, cluttering up the site structure, but Eleventy gave me a much cleaner solution. I created a “redirects” folder for all of them, set the permalinks to the proper locations, and added an HTML redirect element to the Markdown file.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="349" data-orig-width="1265"&gt;&lt;img src="https://64.media.tumblr.com/2dd094a00926488d38d590bdfabfd55b/09837e97de7c33c5-90/s640x960/eee080598627f2eb202fa08e018db94eb13f9657.png" data-orig-height="349" data-orig-width="1265" alt="Screenshot of redirect page" srcset="https://64.media.tumblr.com/2dd094a00926488d38d590bdfabfd55b/09837e97de7c33c5-90/s75x75_c1/1d196b253f0d13bfa6ce365df6878d7450e28775.png 75w, https://64.media.tumblr.com/2dd094a00926488d38d590bdfabfd55b/09837e97de7c33c5-90/s100x200/95d194cb896d4ed29289cb248725e89675654c5b.png 100w, https://64.media.tumblr.com/2dd094a00926488d38d590bdfabfd55b/09837e97de7c33c5-90/s250x400/85c36c8f4c65f4e28ae0370ece012baa9150eef7.png 250w, https://64.media.tumblr.com/2dd094a00926488d38d590bdfabfd55b/09837e97de7c33c5-90/s400x600/18b738982d7baa71c060041e52369116a4e46ec5.png 400w, https://64.media.tumblr.com/2dd094a00926488d38d590bdfabfd55b/09837e97de7c33c5-90/s500x750/96474231f6b8abed8556bb6cb3891f852e808798.png 500w, https://64.media.tumblr.com/2dd094a00926488d38d590bdfabfd55b/09837e97de7c33c5-90/s540x810/a58a4dec4070ea829170233e7e7b013582c13257.png 540w, https://64.media.tumblr.com/2dd094a00926488d38d590bdfabfd55b/09837e97de7c33c5-90/s640x960/eee080598627f2eb202fa08e018db94eb13f9657.png 640w, https://64.media.tumblr.com/2dd094a00926488d38d590bdfabfd55b/09837e97de7c33c5-90/s1280x1920/b28f115e8776d6159f3d8f8fe912bccb231da41d.png 1265w" sizes="(max-width: 1265px) 100vw, 1265px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;For example, I originally had a blog post at &lt;a href="https://corbin.io/wikipedia-search-11"&gt;corbin.io/wikipedia-search-11&lt;/a&gt;. When I moved that blog post to my Tumblr blog, I had to create a redirect HTML file at that specific location (root/wikipedia-search-11/index.html), which then cluttered up the root directory of my code repository. With Eleventy, I can place the redirects anywhere I want and call the files anything I want. I made a page in my “redirects” directory with the permalink “wikipedia-search-11/index.html” and it worked exactly as expected.&lt;/p&gt;&lt;h2&gt;The Node packages&lt;/h2&gt;&lt;p&gt;Eleventy uses Node.js, so there’s a &lt;a href="https://github.com/corbindavenport/corbindavenport.github.io/blob/main/package.json"&gt;package.json file&lt;/a&gt; in the root directory that tells Node what packages are needed. Right now, my only dependencies are RSS parser (more on that later) and Eleventy. Running the setup command “npm install” installs those packages.&lt;/p&gt;&lt;h2&gt;The layout theme&lt;/h2&gt;&lt;p&gt;The &lt;a href="https://github.com/corbindavenport/corbindavenport.github.io/blob/main/_includes/layout.njk"&gt;layout theme&lt;/a&gt; is stored at _includes/layout.njk, though the file can be called anything. It contains everything around the main content, including the general HTML page structure, any links to JavaScript or CSS files, and so on.&lt;/p&gt;&lt;p&gt;My custom template is a minimalist one-column layout and some basic CSS. I went back and forth on possible site designs, including some more 90s-inspired layouts, but I ended up staying close to the old design. Some of the changes include a new navigation bar that changes size based on screen size (no hamburger menu!) and removing Google Fonts.&lt;/p&gt;&lt;p&gt;I also wanted to see if I could make my site render properly on older web browsers, because that’s a fun challenge. However, the Let’s Encrypt SSL certificate that GitHub sets up for my site uses the &lt;a href="https://letsencrypt.org/docs/certificate-compatibility/"&gt;ISRG Root X1 root certificate&lt;/a&gt;, which isn’t available on most platforms and browsers released before the mid-2010s. Legacy web browsers can’t load the site in the first place, so there’s not much of a point in doing that testing. I did add some compatibility tweaks for earlier WebKit and Firefox browsers, though, and the site &lt;i&gt;should&lt;/i&gt; work in Internet Explorer 8 and above.&lt;/p&gt;&lt;p&gt;The &amp;lt;head&amp;gt; section contains code for an Open Graph card, so linking any page on platforms like Slack, Facebook, Discord, and iMessage will create a rich preview. The image is set to my current &lt;a href="https://gravatar.com/"&gt;Gravatar&lt;/a&gt; image, so if I decide to change my profile picture, it is automatically applied to my personal site at the same time as everything else connected to my Gravatar.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="196" data-orig-width="647"&gt;&lt;img src="https://64.media.tumblr.com/f61c8b6d6eb0df46ec29b814fbe788eb/09837e97de7c33c5-2f/s640x960/02bb39ee0e4890e78d99926ff62a6be86acc98ac.png" data-orig-height="196" data-orig-width="647" alt="Screenshot of Discord message with link to about page, showing a rich preview with a profile picture and description." srcset="https://64.media.tumblr.com/f61c8b6d6eb0df46ec29b814fbe788eb/09837e97de7c33c5-2f/s75x75_c1/48a5018941d0fe2e7ce1725f06387e09cf533cb2.png 75w, https://64.media.tumblr.com/f61c8b6d6eb0df46ec29b814fbe788eb/09837e97de7c33c5-2f/s100x200/dbc8ddda939f1e8d7d22a6db512d7630c5bfff96.png 100w, https://64.media.tumblr.com/f61c8b6d6eb0df46ec29b814fbe788eb/09837e97de7c33c5-2f/s250x400/849f78ee9404ba890c45d3541a19ebf75f741065.png 250w, https://64.media.tumblr.com/f61c8b6d6eb0df46ec29b814fbe788eb/09837e97de7c33c5-2f/s400x600/0415a25c861e244a924e6b17178c91bb71a40ef7.png 400w, https://64.media.tumblr.com/f61c8b6d6eb0df46ec29b814fbe788eb/09837e97de7c33c5-2f/s500x750/3c6bab426157f58f9be0007527fe02acc12ba20f.png 500w, https://64.media.tumblr.com/f61c8b6d6eb0df46ec29b814fbe788eb/09837e97de7c33c5-2f/s540x810/15dc1f2e547ae07c8b9c9452fb7e2f917c3481ec.png 540w, https://64.media.tumblr.com/f61c8b6d6eb0df46ec29b814fbe788eb/09837e97de7c33c5-2f/s640x960/02bb39ee0e4890e78d99926ff62a6be86acc98ac.png 640w, https://64.media.tumblr.com/f61c8b6d6eb0df46ec29b814fbe788eb/09837e97de7c33c5-2f/s1280x1920/43080d513d8e8308a829bc118ecfdeb4a4473500.png 647w" sizes="(max-width: 647px) 100vw, 647px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;I also added link tags in the &amp;lt;head&amp;gt; for several RSS feeds, including the feed for my personal blog (which is on a Tumblr custom domain) and the RSS for my Tech Tales podcast. If someone puts my website into an RSS reader like Feedly or Inoreader, or they have a browser extension that shows any available RSS feeds, those feeds appear as subscription options.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="704" data-orig-width="1213"&gt;&lt;img src="https://64.media.tumblr.com/75f973d46366608598dab080baaf4a58/09837e97de7c33c5-7a/s640x960/04559d6a30cfc831b3c28740ca588cf214724205.png" data-orig-height="704" data-orig-width="1213" alt="Feedly screenshot showing matching feeds for corbin.io." srcset="https://64.media.tumblr.com/75f973d46366608598dab080baaf4a58/09837e97de7c33c5-7a/s75x75_c1/31038d4e811c106c23dba53a3b3f690649171cd4.png 75w, https://64.media.tumblr.com/75f973d46366608598dab080baaf4a58/09837e97de7c33c5-7a/s100x200/38971dcf05c3a13bcc0def182752c2f6d76575e7.png 100w, https://64.media.tumblr.com/75f973d46366608598dab080baaf4a58/09837e97de7c33c5-7a/s250x400/2600536f4e2552105fb0acd36a1e796d89f0b9b0.png 250w, https://64.media.tumblr.com/75f973d46366608598dab080baaf4a58/09837e97de7c33c5-7a/s400x600/43e80a8dc7d99c3dd3f79762bd9f09ee80a08efa.png 400w, https://64.media.tumblr.com/75f973d46366608598dab080baaf4a58/09837e97de7c33c5-7a/s500x750/c7f758a6b229c468308cf78a0d1c9e34de65da76.png 500w, https://64.media.tumblr.com/75f973d46366608598dab080baaf4a58/09837e97de7c33c5-7a/s540x810/2c909e0529863aa2883fb9a4e47d9e766902259d.png 540w, https://64.media.tumblr.com/75f973d46366608598dab080baaf4a58/09837e97de7c33c5-7a/s640x960/04559d6a30cfc831b3c28740ca588cf214724205.png 640w, https://64.media.tumblr.com/75f973d46366608598dab080baaf4a58/09837e97de7c33c5-7a/s1280x1920/de9a41de0997111fd404d6bc278f10f8ff010c05.png 1213w" sizes="(max-width: 1213px) 100vw, 1213px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;Finally, I added &lt;a href="https://joinmastodon.org/verification"&gt;verification code for the Mastodon social network&lt;/a&gt; as a hidden link at the bottom of the &amp;lt;body&amp;gt; section. That allows my site to appear as a verified link on my &lt;a href="https://toot.community/@corbin"&gt;Mastodon profile&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;The Eleventy script&lt;/h2&gt;&lt;p&gt;The &lt;a href="https://github.com/corbindavenport/corbindavenport.github.io/blob/main/.eleventy.js"&gt;.eleventy.js file&lt;/a&gt; is where the magic happens: it’s the Node script that generates the site with all the custom configuration options. I added “passthroughs” for the media folder, robots.txt file, favicon file, and other resources that need to be copied to the generated site for everything to work.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="764" data-orig-width="1265"&gt;&lt;img src="https://64.media.tumblr.com/bd6fb1284b37a99a447d1da980747c6b/09837e97de7c33c5-de/s640x960/b46d543dcc58bb0f69d41df81c93625680576dd4.png" data-orig-height="764" data-orig-width="1265" alt="Screenshot of Eleventy generation script" srcset="https://64.media.tumblr.com/bd6fb1284b37a99a447d1da980747c6b/09837e97de7c33c5-de/s75x75_c1/ee39dc091014ecd0632bbf0a47baba9e0b4e36bb.png 75w, https://64.media.tumblr.com/bd6fb1284b37a99a447d1da980747c6b/09837e97de7c33c5-de/s100x200/11d303dc4dda638c64ee1794333817d7abfb1695.png 100w, https://64.media.tumblr.com/bd6fb1284b37a99a447d1da980747c6b/09837e97de7c33c5-de/s250x400/ee3f2b86f2b3389daa15cdad7bbe7538eb6874cb.png 250w, https://64.media.tumblr.com/bd6fb1284b37a99a447d1da980747c6b/09837e97de7c33c5-de/s400x600/692eb24070b902aca78aba463921c3c5ccaf2768.png 400w, https://64.media.tumblr.com/bd6fb1284b37a99a447d1da980747c6b/09837e97de7c33c5-de/s500x750/2a418a6ce9902503bbe49f94eb38d379f4aa7bc1.png 500w, https://64.media.tumblr.com/bd6fb1284b37a99a447d1da980747c6b/09837e97de7c33c5-de/s540x810/45733c6c783fbdf93b16222d71101d07f40fa395.png 540w, https://64.media.tumblr.com/bd6fb1284b37a99a447d1da980747c6b/09837e97de7c33c5-de/s640x960/b46d543dcc58bb0f69d41df81c93625680576dd4.png 640w, https://64.media.tumblr.com/bd6fb1284b37a99a447d1da980747c6b/09837e97de7c33c5-de/s1280x1920/5cba8cab2a593f298b2ccd28364ee3db1ea906db.png 1265w" sizes="(max-width: 1265px) 100vw, 1265px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;This is also where I defined shortcodes that I use in some pages, which are reusable components that Eleventy can drop in during the generation process. For example, I have download buttons for browser extensions on my &lt;a href="https://corbin.io/software/"&gt;software page&lt;/a&gt;, and I didn’t want to manually define the same image and link structure over a dozen times. I defined a “downloadBtn” shortcode with arguments for the platform and URL, which generates a download link button with that data. I also made a shortcode for the HTML redirect for my redirect pages, and other functions I’m using on other pages.&lt;/p&gt;&lt;p&gt;I also created a “letterboxd” shortcode for displaying my recent Letterboxd reviews on my about page. You can use any Node code in this script, so I’m using the &lt;a href="https://www.npmjs.com/package/rss-parser"&gt;rss-parser Node library&lt;/a&gt; to download the RSS feed from my Letterboxd profile and parse it in HTML format with links. My custom “flickr” shortcode does the same for my recent Flickr images.&lt;/p&gt;&lt;h2&gt;The GitHub Action&lt;/h2&gt;&lt;p&gt;The final piece is the &lt;a href="https://github.com/corbindavenport/corbindavenport.github.io/blob/main/.github/workflows/eleventy_build.yml"&gt;GitHub Action&lt;/a&gt; for building and deploying the website. It runs after each new commit and automatically once a day (so data used in the Letterboxd and Flickr shortcodes is fresh). The script checks out the repository code, installs all the NPM dependencies, runs Eleventy to generate the site, and then uploads the package to GitHub Pages.&lt;/p&gt;&lt;p&gt;With this integration, I can make changes to my site from anywhere, and then a minute or two later the changes are live on the site. The code repository isn’t even cluttered with the generated HTML files, since I added the “_site/” output directory to the gitignore file.&lt;/p&gt;&lt;h2&gt;The end&lt;/h2&gt;&lt;p&gt;I’m pretty happy with my new personal site. It’s fast to load, easy for me to edit from anywhere, and completely free to host. Since all the core content is server-side generated, it even works in text-based browsers like Lynx.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="854" data-orig-width="1350"&gt;&lt;img src="https://64.media.tumblr.com/5fe21f430a3e2613199b70f853e38bab/09837e97de7c33c5-5a/s640x960/f96d596a391d76a43a230bda0775977a4f2ad7d8.png" data-orig-height="854" data-orig-width="1350" alt="Screenshot of Software page in Lynx" srcset="https://64.media.tumblr.com/5fe21f430a3e2613199b70f853e38bab/09837e97de7c33c5-5a/s75x75_c1/da952f82de0a6ecd874666e610708df7e5c29519.png 75w, https://64.media.tumblr.com/5fe21f430a3e2613199b70f853e38bab/09837e97de7c33c5-5a/s100x200/d61a21f1c9ea8a475db5c94cb80fe3fb730e31e0.png 100w, https://64.media.tumblr.com/5fe21f430a3e2613199b70f853e38bab/09837e97de7c33c5-5a/s250x400/71a87f00ee165afa11bb145833f6607d191006af.png 250w, https://64.media.tumblr.com/5fe21f430a3e2613199b70f853e38bab/09837e97de7c33c5-5a/s400x600/da6e07625b2d02326db21e801c8c3f98cc782c04.png 400w, https://64.media.tumblr.com/5fe21f430a3e2613199b70f853e38bab/09837e97de7c33c5-5a/s500x750/2389a1213a03bb87263272e5f4827ebb3e66c3ab.png 500w, https://64.media.tumblr.com/5fe21f430a3e2613199b70f853e38bab/09837e97de7c33c5-5a/s540x810/67b3612c2fed24dc955db925f9f15a22dcaa04fc.png 540w, https://64.media.tumblr.com/5fe21f430a3e2613199b70f853e38bab/09837e97de7c33c5-5a/s640x960/f96d596a391d76a43a230bda0775977a4f2ad7d8.png 640w, https://64.media.tumblr.com/5fe21f430a3e2613199b70f853e38bab/09837e97de7c33c5-5a/s1280x1920/3ab1817e7e1c22e05ad9b5525c70a3981a44f3cc.png 1280w, https://64.media.tumblr.com/5fe21f430a3e2613199b70f853e38bab/09837e97de7c33c5-5a/s2048x3072/7edc032c63fab5bc2ca74d622bd46cc02d04fedb.png 1350w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;If you want to set up something similar, feel free to &lt;a href="https://github.com/corbindavenport/corbindavenport.github.io/"&gt;fork my site’s repository on GitHub&lt;/a&gt;.&lt;/p&gt;</description><link>https://blog.corbin.io/post/752757825366835200</link><guid>https://blog.corbin.io/post/752757825366835200</guid><pubDate>Sat, 08 Jun 2024 18:30:04 -0400</pubDate></item><item><title>How I added cross-platform chapters to the Tech Tales Podcast</title><description>&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="1080" data-orig-width="1920"&gt;&lt;img src="https://64.media.tumblr.com/37317e0a8ae2c21ad1c8a4336586d102/afd6f079b01eecd1-00/s640x960/b6bba029f8fb9cfa2cad7e7b9c312dd155a7085c.jpg" data-orig-height="1080" data-orig-width="1920" alt="Podcast chapters in Spotify, YouTube, and Apple Podcasts" srcset="https://64.media.tumblr.com/37317e0a8ae2c21ad1c8a4336586d102/afd6f079b01eecd1-00/s75x75_c1/ea5a9f542d4fcbcf8cee73404750318d555f6c60.jpg 75w, https://64.media.tumblr.com/37317e0a8ae2c21ad1c8a4336586d102/afd6f079b01eecd1-00/s100x200/14f223a53919cc99276e89b2b76a002460148717.jpg 100w, https://64.media.tumblr.com/37317e0a8ae2c21ad1c8a4336586d102/afd6f079b01eecd1-00/s250x400/1b9a453b17068a7279899ad44037840a30677a2e.jpg 250w, https://64.media.tumblr.com/37317e0a8ae2c21ad1c8a4336586d102/afd6f079b01eecd1-00/s400x600/679d2ade8dfc90bd24a58e7992eeedd6b4f132f5.jpg 400w, https://64.media.tumblr.com/37317e0a8ae2c21ad1c8a4336586d102/afd6f079b01eecd1-00/s500x750/ec600596d28f0210c16f396762a690d8afc76399.jpg 500w, https://64.media.tumblr.com/37317e0a8ae2c21ad1c8a4336586d102/afd6f079b01eecd1-00/s540x810/59f32ae4b2143c7a8d285161dfd8eb1d0d4bab88.jpg 540w, https://64.media.tumblr.com/37317e0a8ae2c21ad1c8a4336586d102/afd6f079b01eecd1-00/s640x960/b6bba029f8fb9cfa2cad7e7b9c312dd155a7085c.jpg 640w, https://64.media.tumblr.com/37317e0a8ae2c21ad1c8a4336586d102/afd6f079b01eecd1-00/s1280x1920/85e58bc0e6f0ff15223ac54dbc3f02e2f96a0685.jpg 1280w, https://64.media.tumblr.com/37317e0a8ae2c21ad1c8a4336586d102/afd6f079b01eecd1-00/s2048x3072/96fd50c0ac416ce43f4c3b4b83e269009814784c.jpg 1920w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;I currently produce and edit the &lt;a href="https://techtalesshow.com/"&gt;Tech Tales Podcast&lt;/a&gt;, and last month, I decided to finally try adding chapter markers to episodes. It turns out that chapter markers in podcasts is pretty complicated, especially if you want listeners to have the best possible experience across YouTube and popular podcast apps. I figured my process was interesting enough for a short blog post, and the steps explained here might help other people.&lt;/p&gt;&lt;!-- more --&gt;&lt;p&gt;Audio podcasts are usually distributed as MP3 or MP4 audio files. The show name, episode title, artwork, description, and other data can be encoded in the file using &lt;a href="https://en.wikipedia.org/wiki/ID3#Chapters"&gt;ID3 metadata&lt;/a&gt;, though most podcast apps and services now take that data from the show&amp;rsquo;s RSS feed or another source.&lt;/p&gt;&lt;p&gt;Chapter markers can also be encoded in the file using ID3 metadata, with each chapter having a title and timestamp. When Apple added support for podcasts to iTunes and iPod players in 2005, it included support for &amp;ldquo;enhanced podcasts,&amp;rdquo; which &lt;a href="https://www.ilounge.com/index.php/articles/comments/the-complete-guide-to-itunes-49-with-podcasts"&gt;could include per-chapter artwork and web links&lt;/a&gt;. Apple still supports chapter-specific artwork in Apple Podcasts, but the links feature seems to have vanished at some point, and per-chapter artwork &lt;a href="https://www.reddit.com/r/podcasting/comments/13xstb3/some_experiences_with_chapters_in_podcasts/"&gt;doesn&amp;rsquo;t seem to be well-supported&lt;/a&gt; outside of Apple&amp;rsquo;s software.&lt;/p&gt;&lt;p&gt;I currently edit Tech Tales episodes with Apple&amp;rsquo;s Logic Pro, and I use &lt;a href="https://support.apple.com/guide/logicpro/markers-overview-lgcp0ec9fc09/mac"&gt;the markers feature&lt;/a&gt; to set each chapter. Audacity has &lt;a href="https://manual.audacityteam.org/man/creating_and_selecting_labels.html"&gt;a similar &amp;ldquo;labels&amp;rdquo; feature&lt;/a&gt;.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="563" data-orig-width="818"&gt;&lt;img src="https://64.media.tumblr.com/ca7d8416682ea502a5a8435f14b676af/afd6f079b01eecd1-f1/s640x960/4ff66b944a0a5db8f0edbcc4b24bd17eff19fc03.png" data-orig-height="563" data-orig-width="818" alt="Screenshot of markers list in Logic Pro" srcset="https://64.media.tumblr.com/ca7d8416682ea502a5a8435f14b676af/afd6f079b01eecd1-f1/s75x75_c1/b3af057cce0d456db26cc427525a03c54d449727.png 75w, https://64.media.tumblr.com/ca7d8416682ea502a5a8435f14b676af/afd6f079b01eecd1-f1/s100x200/a4bebd6c8e5429664cd90dda38f8ff1b160695cd.png 100w, https://64.media.tumblr.com/ca7d8416682ea502a5a8435f14b676af/afd6f079b01eecd1-f1/s250x400/91f5086e5b97ade948458115d15651a45c01e756.png 250w, https://64.media.tumblr.com/ca7d8416682ea502a5a8435f14b676af/afd6f079b01eecd1-f1/s400x600/9fd52ba91d9645f378788840a3e1f033bcf69a3a.png 400w, https://64.media.tumblr.com/ca7d8416682ea502a5a8435f14b676af/afd6f079b01eecd1-f1/s500x750/5b26fa7d0495e0627dbe4ae18793011a70242a24.png 500w, https://64.media.tumblr.com/ca7d8416682ea502a5a8435f14b676af/afd6f079b01eecd1-f1/s540x810/1bcc65e299b18ef2d90dda38fb945908cc252aa1.png 540w, https://64.media.tumblr.com/ca7d8416682ea502a5a8435f14b676af/afd6f079b01eecd1-f1/s640x960/4ff66b944a0a5db8f0edbcc4b24bd17eff19fc03.png 640w, https://64.media.tumblr.com/ca7d8416682ea502a5a8435f14b676af/afd6f079b01eecd1-f1/s1280x1920/693cc3bd0fe596ec3aa359f8c13c2a6367397549.png 818w" sizes="(max-width: 818px) 100vw, 818px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;Logic Pro only seems to save the markers as chapter metadata when exporting as a PCM/WAV file, not when I select MP3. It&amp;rsquo;s also a bit complicated to export as a mono channel MP3, especially if the project tracks have stereo channels.&lt;/p&gt;&lt;h2&gt;MP3 Chapter Data&lt;/h2&gt;&lt;p&gt;My solution for the audio version of the podcast is to export as WAV from Logic Pro, then use the free and open-source &lt;a href="https://ffmpeg.org/"&gt;FFMPEG&lt;/a&gt; tool to create a mono-channel 128kbps MP3 file with the chapter data intact.&lt;/p&gt;&lt;p class="npf_chat"&gt;&lt;b&gt;ffmpeg -i &amp;ldquo;original.wav&amp;rdquo; -map_chapters 0 -ac 1 -b:a 128k -f mp3 &amp;ldquo;exported.mp3&amp;rdquo;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The extra step is annoying, but it does give me an MP3 file with the exact desired settings and the chapter data encoded in the file. When I re-encoded an earlier episode with those settings and uploaded it, the chapter markers showed up as expected in Apple Podcasts and Pocket Casts.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="545" data-orig-width="1113"&gt;&lt;img src="https://64.media.tumblr.com/2f142149652af1a540c1db1f86b8cdbc/afd6f079b01eecd1-e5/s640x960/4a5abc69ac709c8819e4a1e471ace122f4cceadf.png" data-orig-height="545" data-orig-width="1113" alt="Apple Podcasts screenshot with chapter markers" srcset="https://64.media.tumblr.com/2f142149652af1a540c1db1f86b8cdbc/afd6f079b01eecd1-e5/s75x75_c1/139b8eee729c19f03c19dc8a259ce93e6dcb4a85.png 75w, https://64.media.tumblr.com/2f142149652af1a540c1db1f86b8cdbc/afd6f079b01eecd1-e5/s100x200/f99013c5bc55bcf35fd77b6c8b7f051113c4ff9d.png 100w, https://64.media.tumblr.com/2f142149652af1a540c1db1f86b8cdbc/afd6f079b01eecd1-e5/s250x400/e68efea467c7e0a92d71a3b424187c2db36448e8.png 250w, https://64.media.tumblr.com/2f142149652af1a540c1db1f86b8cdbc/afd6f079b01eecd1-e5/s400x600/a44e355c2e17f47a0237e55a8f665e757d1e2335.png 400w, https://64.media.tumblr.com/2f142149652af1a540c1db1f86b8cdbc/afd6f079b01eecd1-e5/s500x750/72dd2c596da053d10b9d4ffe021e315531ac6076.png 500w, https://64.media.tumblr.com/2f142149652af1a540c1db1f86b8cdbc/afd6f079b01eecd1-e5/s540x810/1dac13a55fd6a2cee56517900d5e72adeb272883.png 540w, https://64.media.tumblr.com/2f142149652af1a540c1db1f86b8cdbc/afd6f079b01eecd1-e5/s640x960/4a5abc69ac709c8819e4a1e471ace122f4cceadf.png 640w, https://64.media.tumblr.com/2f142149652af1a540c1db1f86b8cdbc/afd6f079b01eecd1-e5/s1280x1920/3df2f91ab3850b9a1c23717ae6e4ff0fc7a397b3.png 1113w" sizes="(max-width: 1113px) 100vw, 1113px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;There were still two problems. First, there&amp;rsquo;s a video version I upload to the Tech Tales YouTube channel, and that needs chapter markers. Second, I discovered Spotify wasn&amp;rsquo;t showing the chapter markers from the MP3 file, even when other players did. It turned out both problems had the same solution.&lt;/p&gt;&lt;h2&gt;YouTube and Spotify Support&lt;/h2&gt;&lt;p&gt;YouTube supports &lt;a href="https://support.google.com/youtube/answer/9884579?hl=en"&gt;video chapters&lt;/a&gt;, which have to be added as time stamps and titles somewhere in the video description. YouTube gives you some wiggle room with the formatting: the timestamps can be anywhere in the description, and the hour isn&amp;rsquo;t necessary for videos under one hour (e.g. you can have 18:30 instead of 00:18:30). I&amp;rsquo;ve also seen different styles for separating the timestamp from the chapter title. For example, a &lt;a href="https://www.youtube.com/watch?v=Qp3BGu3vixk"&gt;GamersNexus video&lt;/a&gt; about Intel Arc Drivers uses a dash surrounded by spaces, while other videos just put a single space between the timestamp and the title.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="406" data-orig-width="779"&gt;&lt;img src="https://64.media.tumblr.com/e5e14660589064f5b3ca68188a5f699d/afd6f079b01eecd1-ec/s640x960/eba320fe2d8b6a5123f22e1ce6899b28f6c342a1.png" data-orig-height="406" data-orig-width="779" alt="Chapter markers in a YouTube video description" srcset="https://64.media.tumblr.com/e5e14660589064f5b3ca68188a5f699d/afd6f079b01eecd1-ec/s75x75_c1/0f0dbddf2b830d14d3658da3394c607094f78117.png 75w, https://64.media.tumblr.com/e5e14660589064f5b3ca68188a5f699d/afd6f079b01eecd1-ec/s100x200/0c915684437c3475d397785b3da11f41fe918b05.png 100w, https://64.media.tumblr.com/e5e14660589064f5b3ca68188a5f699d/afd6f079b01eecd1-ec/s250x400/75a5a1ad6ad5786232aa414b1ea18578406b6781.png 250w, https://64.media.tumblr.com/e5e14660589064f5b3ca68188a5f699d/afd6f079b01eecd1-ec/s400x600/095263edd4ac93a820a1933c2e8da2487d8962ea.png 400w, https://64.media.tumblr.com/e5e14660589064f5b3ca68188a5f699d/afd6f079b01eecd1-ec/s500x750/553321f520dc18a27edaba8e40976f9d186f6c62.png 500w, https://64.media.tumblr.com/e5e14660589064f5b3ca68188a5f699d/afd6f079b01eecd1-ec/s540x810/aa245c8d05a442dd596b05bff9778f9c89acc098.png 540w, https://64.media.tumblr.com/e5e14660589064f5b3ca68188a5f699d/afd6f079b01eecd1-ec/s640x960/eba320fe2d8b6a5123f22e1ce6899b28f6c342a1.png 640w, https://64.media.tumblr.com/e5e14660589064f5b3ca68188a5f699d/afd6f079b01eecd1-ec/s1280x1920/e8972c0fe61395d683394516f07157c8f1632ff8.png 779w" sizes="(max-width: 779px) 100vw, 779px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;Spotify supports &lt;a href="https://support.spotify.com/bb/podcasters/article/enabling-podcast-chapters/"&gt;a few different methods&lt;/a&gt; of adding chapters to podcast episodes, but none of them are MP3 encoding, which explains why the chapters weren&amp;rsquo;t showing up. The easiest method, and the only one accessible to me while using SoundCloud as a host, is adding timestamps to the episode description. The format is similar to YouTube, but with a few additional requirements. There must be at least three chapters, and the first one must start at zero seconds (00:00).&lt;/p&gt;&lt;p&gt;Logic Pro can&amp;rsquo;t export markers to a text file, and I didn&amp;rsquo;t really want to type them out each time I published an episode. The best solution ended up involving two different tools. First, I use &lt;a href="https://ffmpeg.org/ffprobe.html"&gt;FFPROBE&lt;/a&gt; (a media analysis tool usually included with FFMPEG) to read chapter data from that original WAV file and convert it to JSON format. &lt;/p&gt;&lt;p class="npf_chat"&gt;&lt;b&gt;ffprobe -i &amp;ldquo;original.wav&amp;rdquo; -show_chapters -sexagesimal -of json -loglevel error &amp;gt; json.txt&lt;/b&gt;&lt;/p&gt;&lt;p&gt;That gives me a text file with all the chapter data, including detailed start and end times and the titles, in JSON format. That&amp;rsquo;s not the correct format for YouTube and Spotify, but it can be easily read by other tools. As far as I can tell, FFPROBE on its own can&amp;rsquo;t create the format I need.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="663" data-orig-width="881"&gt;&lt;img src="https://64.media.tumblr.com/34cce696bc9fd8dd4d264bb5a261c0d5/afd6f079b01eecd1-ae/s640x960/dbb9848f87323a6de67ce7b4dfda2626f45f4c7f.png" data-orig-height="663" data-orig-width="881" srcset="https://64.media.tumblr.com/34cce696bc9fd8dd4d264bb5a261c0d5/afd6f079b01eecd1-ae/s75x75_c1/d7cec18c0c27b8bd84de2b91d1283b7fb5f34c2a.png 75w, https://64.media.tumblr.com/34cce696bc9fd8dd4d264bb5a261c0d5/afd6f079b01eecd1-ae/s100x200/54574cce9fbf62868e7910bf22229d7d193b5381.png 100w, https://64.media.tumblr.com/34cce696bc9fd8dd4d264bb5a261c0d5/afd6f079b01eecd1-ae/s250x400/8398155d61997450e236e298a74bb4dae04c1861.png 250w, https://64.media.tumblr.com/34cce696bc9fd8dd4d264bb5a261c0d5/afd6f079b01eecd1-ae/s400x600/7eac13a8447aac98d978fbf2202073c49d66d754.png 400w, https://64.media.tumblr.com/34cce696bc9fd8dd4d264bb5a261c0d5/afd6f079b01eecd1-ae/s500x750/9242af1bfb6d7198cd5135183d7eda1063c164f3.png 500w, https://64.media.tumblr.com/34cce696bc9fd8dd4d264bb5a261c0d5/afd6f079b01eecd1-ae/s540x810/df13ef3a7694e46a5991ac82e428dc31f9c9ebde.png 540w, https://64.media.tumblr.com/34cce696bc9fd8dd4d264bb5a261c0d5/afd6f079b01eecd1-ae/s640x960/dbb9848f87323a6de67ce7b4dfda2626f45f4c7f.png 640w, https://64.media.tumblr.com/34cce696bc9fd8dd4d264bb5a261c0d5/afd6f079b01eecd1-ae/s1280x1920/ff044346fba439cf8a7c97181d5cec2a6d36fef4.png 881w" sizes="(max-width: 881px) 100vw, 881px"/&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;The next step is using &lt;a href="https://github.com/jqlang/jq"&gt;JQ&lt;/a&gt; to write the chapters with time stamps to a text file, using the data provided in the JSON file. I actually used Microsoft Copilot to help me write the command, because I&amp;rsquo;m not too familiar with JQ&amp;rsquo;s options.&lt;/p&gt;&lt;p class="npf_chat"&gt;&lt;b&gt;jq -r &amp;rsquo;.chapters[] | &amp;ldquo;(.start_time | split(&amp;rdquo;.&amp;ldquo;)[0]) (.tags.title)&amp;rdquo;&amp;rsquo; json.txt &amp;gt; chapters.txt&lt;/b&gt;&lt;/p&gt;&lt;p&gt;This creates a text file called chapters.txt with the time stamps and titles in the exact required format. Success!&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="545" data-orig-width="773"&gt;&lt;img src="https://64.media.tumblr.com/6c2bd63fe55cc6574c4298d2eab46f9b/afd6f079b01eecd1-d5/s640x960/e78228ebe329e312c59bdaf6e430c1398b73426b.png" data-orig-height="545" data-orig-width="773" alt="Text file with audio chapters" srcset="https://64.media.tumblr.com/6c2bd63fe55cc6574c4298d2eab46f9b/afd6f079b01eecd1-d5/s75x75_c1/f9d544459893188a1da075745ec1cdcb4271b483.png 75w, https://64.media.tumblr.com/6c2bd63fe55cc6574c4298d2eab46f9b/afd6f079b01eecd1-d5/s100x200/4e37ba1e50956439d7349cffec2d4785d728fdd5.png 100w, https://64.media.tumblr.com/6c2bd63fe55cc6574c4298d2eab46f9b/afd6f079b01eecd1-d5/s250x400/1b3a7e679ee4ed23af60dbf1b9905fc9fa44d9fc.png 250w, https://64.media.tumblr.com/6c2bd63fe55cc6574c4298d2eab46f9b/afd6f079b01eecd1-d5/s400x600/be236e5df7bcb456f3550548170466a3c0153820.png 400w, https://64.media.tumblr.com/6c2bd63fe55cc6574c4298d2eab46f9b/afd6f079b01eecd1-d5/s500x750/4b32e5db9adbcb65940ca75f9c43aef2eb734d66.png 500w, https://64.media.tumblr.com/6c2bd63fe55cc6574c4298d2eab46f9b/afd6f079b01eecd1-d5/s540x810/ea31663167f0ca7b4a9bf9aa9a0dc22111ad92bb.png 540w, https://64.media.tumblr.com/6c2bd63fe55cc6574c4298d2eab46f9b/afd6f079b01eecd1-d5/s640x960/e78228ebe329e312c59bdaf6e430c1398b73426b.png 640w, https://64.media.tumblr.com/6c2bd63fe55cc6574c4298d2eab46f9b/afd6f079b01eecd1-d5/s1280x1920/6ca6ce372ce08d149b75a1d2eb27a06928a4ee6f.png 773w" sizes="(max-width: 773px) 100vw, 773px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;When I copy and paste that into the audio episode description, the chapters appear as expected in the Spotify desktop and mobile applications, and pasting the text into the YouTube video description adds the correct chapter markers to the video player.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="593" data-orig-width="1115"&gt;&lt;img src="https://64.media.tumblr.com/f96497ce70f625a1137368bcbee0bcbc/afd6f079b01eecd1-d4/s640x960/b043d4a63fe8fe9c5b789aa0b47fd2506888120b.png" data-orig-height="593" data-orig-width="1115" srcset="https://64.media.tumblr.com/f96497ce70f625a1137368bcbee0bcbc/afd6f079b01eecd1-d4/s75x75_c1/7576e49b76efb84350461fd66aa13675f3519dad.png 75w, https://64.media.tumblr.com/f96497ce70f625a1137368bcbee0bcbc/afd6f079b01eecd1-d4/s100x200/fd3975eca7543d7ac5a185663afeec8958bafd9b.png 100w, https://64.media.tumblr.com/f96497ce70f625a1137368bcbee0bcbc/afd6f079b01eecd1-d4/s250x400/6f72f26ec11079b7269a526b23d8cd4b7c0a4d99.png 250w, https://64.media.tumblr.com/f96497ce70f625a1137368bcbee0bcbc/afd6f079b01eecd1-d4/s400x600/225f70d389d48ca060a8d2e418fe76cbb0d7c157.png 400w, https://64.media.tumblr.com/f96497ce70f625a1137368bcbee0bcbc/afd6f079b01eecd1-d4/s500x750/dfa3f455aad6231df55c9de2a6f866ba4b4c5078.png 500w, https://64.media.tumblr.com/f96497ce70f625a1137368bcbee0bcbc/afd6f079b01eecd1-d4/s540x810/d4bdc67a43afc22d5cdc2956e00f448033d915c3.png 540w, https://64.media.tumblr.com/f96497ce70f625a1137368bcbee0bcbc/afd6f079b01eecd1-d4/s640x960/b043d4a63fe8fe9c5b789aa0b47fd2506888120b.png 640w, https://64.media.tumblr.com/f96497ce70f625a1137368bcbee0bcbc/afd6f079b01eecd1-d4/s1280x1920/475ea9a5130aec11ad3c2ff3081f27d6cacc5770.png 1115w" sizes="(max-width: 1115px) 100vw, 1115px"/&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;You can see it working on the latest Tech Tales episode on &lt;a href="https://open.spotify.com/episode/4bvcRI0bG7zchtdJGmxikA"&gt;Spotify&lt;/a&gt; and &lt;a href="https://youtu.be/RH8jmdl7XtQ"&gt;YouTube&lt;/a&gt;. I didn&amp;rsquo;t expect chapters support to be so annoying, but I&amp;rsquo;m glad to have a mostly-automated solution.&lt;/p&gt;&lt;h2&gt;Doing It Yourself&lt;/h2&gt;&lt;p&gt;I created a bash script file to run all three commands at once on my Mac, and then save the final audio MP3 and chapters text file to the Desktop. You can &lt;a href="https://gist.github.com/corbindavenport/03764b176bc7be79fd507e698987b55e"&gt;see it on GitHub&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;You need FFMPEG/FFPROBE and JQ installed for the commands to work. Since I&amp;rsquo;m on a Mac, I &lt;a href="https://brew.sh/"&gt;installed the Homebrew package manager&lt;/a&gt;, then ran the below command to install both packages.&lt;/p&gt;&lt;p class="npf_chat"&gt;&lt;b&gt;brew install jq ffmpeg&lt;/b&gt;&lt;/p&gt;&lt;p&gt;I hope this helps anyone else having similar issues with podcast chapters!&lt;/p&gt;</description><link>https://blog.corbin.io/post/748500250878263296</link><guid>https://blog.corbin.io/post/748500250878263296</guid><pubDate>Mon, 22 Apr 2024 18:37:45 -0400</pubDate><category>podcast</category><category>podcasts</category><category>ffmpeg</category></item><item><title>Shutting down the Wii Shop Channel Music browser extension</title><description>&lt;p&gt;I released a browser extension in 2020 that played the Wii Shop Channel music in the background when you visited Amazon, Best Buy, and other online stores. &lt;a href="https://blog.corbin.io/post/674234058456301568/wii-shop-channel-music-extension-20-now"&gt;I released a major update in 2022&lt;/a&gt;, and I&amp;rsquo;ve been working on a rewritten version, but I have now decided to discontinue the browser extension.&lt;/p&gt;&lt;!-- more --&gt;&lt;p&gt;The Wii Shop browser extension needed to be significantly rewritten to comply with Google&amp;rsquo;s Manifest V3 extension policies, which will go into effect in a few months. On top of that, Firefox has not implemented the same changes, so the extension would need a much more complex codebase to handle both web browsers.&lt;/p&gt;&lt;p&gt;More importantly, &lt;a href="https://www.theverge.com/2024/4/11/24127545/discord-suyu-sudachi-server-shutdown-account-ban"&gt;Nintendo has been increasingly litigious against unauthorized use of its intellectual property&lt;/a&gt;. I believe the browser extension&amp;rsquo;s use of Nintendo&amp;rsquo;s images and music falls under fair use, but I don&amp;rsquo;t have lawyer money to defend that, and I&amp;rsquo;m no longer comfortable with one of my side projects being a potential target for Nintendo (potentially taking out my other work as collateral damage).&lt;/p&gt;&lt;p&gt;&lt;b&gt;The Wii Shop Channel Music browser extension is now discontinued, and I have deleted the GitHub repository containing the code.&lt;/b&gt; I am aware there are forks and other mirrors of the project online, but I will not be working on them. The browser extensions are still available, and they will soon be updated to turn off all functionality and include a link to this blog post.&lt;/p&gt;&lt;p&gt;The &lt;a href="https://github.com/corbindavenport/shop-list"&gt;list of shopping sites&lt;/a&gt; used by the extension will remain available, and nothing is changing with my &lt;a href="https://github.com/corbindavenport/imageshare"&gt;ImageShare web app&lt;/a&gt; or other projects. I had fun working on it, and I especially enjoyed the occasional reviews from users saying it was the greatest invention of all time, but I think now is a great time to say farewell.&lt;/p&gt;&lt;p&gt;&amp;ldquo;But a thing isn&amp;rsquo;t beautiful because it lasts.&amp;rdquo; - Vision&lt;/p&gt;</description><link>https://blog.corbin.io/post/747582092030935040</link><guid>https://blog.corbin.io/post/747582092030935040</guid><pubDate>Fri, 12 Apr 2024 15:24:00 -0400</pubDate></item><item><title>Introducing Alt Text Creator</title><description>&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="932" data-orig-width="1500"&gt;&lt;img src="https://64.media.tumblr.com/77c12901f1c74ec44c2db0cbbd682428/af02aff92e6c9534-0f/s640x960/941c885bd39d1812204bbdcc8d6e535695977fd4.png" data-orig-height="932" data-orig-width="1500" alt="Alt Text Creator screenshot showing right-click menu option and notification." srcset="https://64.media.tumblr.com/77c12901f1c74ec44c2db0cbbd682428/af02aff92e6c9534-0f/s75x75_c1/d452a0c6215d647439c2a038b273a1cf6eb9a2df.png 75w, https://64.media.tumblr.com/77c12901f1c74ec44c2db0cbbd682428/af02aff92e6c9534-0f/s100x200/34a47b8bfcfcecadc3dea207ea6df7e270e083f4.png 100w, https://64.media.tumblr.com/77c12901f1c74ec44c2db0cbbd682428/af02aff92e6c9534-0f/s250x400/cb0d7695569a2624927b600a072fa63dd9a998ad.png 250w, https://64.media.tumblr.com/77c12901f1c74ec44c2db0cbbd682428/af02aff92e6c9534-0f/s400x600/928181648eefa6ff0d38aeefd0285add0a2a4d78.png 400w, https://64.media.tumblr.com/77c12901f1c74ec44c2db0cbbd682428/af02aff92e6c9534-0f/s500x750/77501780e169594d72388d947534f698af294927.png 500w, https://64.media.tumblr.com/77c12901f1c74ec44c2db0cbbd682428/af02aff92e6c9534-0f/s540x810/ec6dac9eab252df4a83cfdc32622eda2cc57e5c1.png 540w, https://64.media.tumblr.com/77c12901f1c74ec44c2db0cbbd682428/af02aff92e6c9534-0f/s640x960/941c885bd39d1812204bbdcc8d6e535695977fd4.png 640w, https://64.media.tumblr.com/77c12901f1c74ec44c2db0cbbd682428/af02aff92e6c9534-0f/s1280x1920/3230babbc0ecc6b9842ef250508d1e29e0cb3227.png 1280w, https://64.media.tumblr.com/77c12901f1c74ec44c2db0cbbd682428/af02aff92e6c9534-0f/s2048x3072/c22cfe56f95226aef92376e60f0bc94e2e728339.png 1500w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;Images on web pages are supposed to have &lt;a href="https://en.wikipedia.org/wiki/Alt_attribute"&gt;alternate text&lt;/a&gt;, which gives screen readers, search engines, and other tools a text description of the image. Alt text is critical for accessibility and search engine optimization (SEO), but it can also be time-consuming, which is why I am releasing Alt Text Creator!&lt;/p&gt;&lt;!-- more --&gt;&lt;p&gt;&lt;a href="https://github.com/corbindavenport/alt-text-creator/"&gt;Alt Text Creator&lt;/a&gt; is a new browser extension for Mozilla Firefox and Google Chrome (and other browsers that can install from the Chrome Web Store) that automatically generates alt text for image using the OpenAI &lt;a href="https://platform.openai.com/docs/guides/vision"&gt;GPT-4 with Vision&lt;/a&gt; AI. You just right-click any image, select &amp;ldquo;Create Alt Text&amp;rdquo; in the context menu, and a few seconds later the result will appear in a notification. The alt text is automatically copied to your clipboard, so it doesn&amp;rsquo;t interrupt your workflow with another button to click.&lt;/p&gt;&lt;p&gt;I&amp;rsquo;ve been using a prototype version of this extension for about three months (&lt;a href="https://www.howtogeek.com/author/corbindavenport/"&gt;my day job is News Editor at How-To Geek&lt;/a&gt;), and I&amp;rsquo;ve been impressed by how well the GPT-4 AI model describes text. I usually don&amp;rsquo;t need to tweak the result at all, except to make it more specific. If you&amp;rsquo;re curious about the AI prompt and interaction, you can &lt;a href="https://github.com/corbindavenport/alt-text-creator/blob/a6731ca0ab0d7ec861e1da27c77f016871fa651e/js/background.js#L49"&gt;check out the source code&lt;/a&gt;. Alt Text Creator also uses the &amp;ldquo;Low Resolution&amp;rdquo; mode and saves a local cache of responses to reduce usage costs.&lt;/p&gt;&lt;p&gt;I found at least one other browser extension with similar functionality, but Alt Text Creator is unique for two reasons. First, it uses your own OpenAI API key that you provide. That means the initial setup is a bit more annoying, but the cost is based on usage and billed directly through OpenAI. There&amp;rsquo;s no recurring subscription, and ChatGPT Plus is not required. &lt;b&gt;In my own testing, creating alt text for a single image costs under $0.01.&lt;/b&gt; Second, the extension uses as few permissions as possible—it doesn&amp;rsquo;t even have access to your current tab, just the image you select.&lt;/p&gt;&lt;p&gt;This is more of a niche tool than my other projects, but it&amp;rsquo;s something that has made my work a bit less annoying, and it might help a few other people too. I might try to add support for other AI backends in the future, but I consider this extension feature-complete in its current state.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href="https://chromewebstore.google.com/detail/alt-text-creator-with-gpt/nlahkceofkdggfgfpheakpaphdfplaio"&gt;Download for Google Chrome&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/alt-text-creator/"&gt;Download for Mozilla Firefox&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;</description><link>https://blog.corbin.io/post/745401939828817920</link><guid>https://blog.corbin.io/post/745401939828817920</guid><pubDate>Tue, 19 Mar 2024 13:51:25 -0400</pubDate><category>chrome extension</category><category>chrome extensions</category><category>firefox extension</category><category>firefox extensions</category><category>chrome</category><category>firefox</category><category>accessibility</category><category>a11y</category></item><item><title>The new ImageShare</title><description>&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="1080" data-orig-width="1920"&gt;&lt;img src="https://64.media.tumblr.com/25c800882aeed582094f825579b7757c/9fe7ff058d943e44-9e/s640x960/4b9a17899be71daaf4487a392af95328eb373a1c.jpg" data-orig-height="1080" data-orig-width="1920" alt="ImageShare in the browser on a Nintendo 3DS and Android smartphone" srcset="https://64.media.tumblr.com/25c800882aeed582094f825579b7757c/9fe7ff058d943e44-9e/s75x75_c1/1ea040798cccea7e74b33f95327da222b0ac27d1.jpg 75w, https://64.media.tumblr.com/25c800882aeed582094f825579b7757c/9fe7ff058d943e44-9e/s100x200/0be686d7f76f05f051696fd878e7f0af803f65a7.jpg 100w, https://64.media.tumblr.com/25c800882aeed582094f825579b7757c/9fe7ff058d943e44-9e/s250x400/ec42effa6d13741da5f5a03d05a8eab9b002a336.jpg 250w, https://64.media.tumblr.com/25c800882aeed582094f825579b7757c/9fe7ff058d943e44-9e/s400x600/df03ed3c53d7ee1dd86f3ec7d838b03d90bcfa32.jpg 400w, https://64.media.tumblr.com/25c800882aeed582094f825579b7757c/9fe7ff058d943e44-9e/s500x750/2ace1b335e6f41b50905e35b873ffd4d920f4d0a.jpg 500w, https://64.media.tumblr.com/25c800882aeed582094f825579b7757c/9fe7ff058d943e44-9e/s540x810/cd0ffcd3fff6eb0203db2656b35594f13296fde3.jpg 540w, https://64.media.tumblr.com/25c800882aeed582094f825579b7757c/9fe7ff058d943e44-9e/s640x960/4b9a17899be71daaf4487a392af95328eb373a1c.jpg 640w, https://64.media.tumblr.com/25c800882aeed582094f825579b7757c/9fe7ff058d943e44-9e/s1280x1920/ea545123d3440d56af7a6d291235fe5210aa3f93.jpg 1280w, https://64.media.tumblr.com/25c800882aeed582094f825579b7757c/9fe7ff058d943e44-9e/s2048x3072/00df0e1d7f4753651bfac8ffd857fab76529e2d6.jpg 1920w" sizes="(max-width: 1280px) 100vw, 1280px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://github.com/corbindavenport/imageshare"&gt;ImageShare&lt;/a&gt; is my lightweight web app for uploading and sharing images, originally created as a replacement for the Nintendo 3DS Image Share service. It has gone through a lot of code updates and migrations over the last few years to keep it compatible with aging web browsers, and now I&amp;rsquo;ve rolled out another update.&lt;/p&gt;&lt;!-- more --&gt;&lt;h2&gt;The new features&lt;/h2&gt;&lt;p&gt;ImageShare still allows you to choose an image from your device, click Upload, and get a QR code linking to the image that you can easily scan with another nearby device. It&amp;rsquo;s still entirely server-side PHP, so it loads quickly, even on low-end and legacy web browsers that can no longer connect to image upload services directly.&lt;/p&gt;&lt;p&gt;The app previously used &lt;a href="https://imgur.com/"&gt;Imgur&lt;/a&gt; for all image uploads, but that API isn&amp;rsquo;t always reliable, so ImageShare now fully supports &lt;a href="https://imgbb.com/"&gt;ImgBB&lt;/a&gt; as an alternative platform. You can select which service to use from the main upload page. For security reasons, images uploaded anonymously through ImgBB are deleted after two minutes, which should be long enough to save the image after scanning the QR code.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="531" data-orig-width="820"&gt;&lt;img src="https://64.media.tumblr.com/a58a67606255a0a48c319089410003cf/9fe7ff058d943e44-3b/s640x960/c61e1968f5d3220d94fb7ce3fa052d371b2b4663.webp" data-orig-height="531" data-orig-width="820" alt="ImageShare screenshot on a large screen after uploading an image" srcset="https://64.media.tumblr.com/a58a67606255a0a48c319089410003cf/9fe7ff058d943e44-3b/s75x75_c1/c8b1bca559df3296bdc37bfda8bf824f3d27cd43.webp 75w, https://64.media.tumblr.com/a58a67606255a0a48c319089410003cf/9fe7ff058d943e44-3b/s100x200/b956a3e5480d3f352d484b031badc14e2f8407f3.webp 100w, https://64.media.tumblr.com/a58a67606255a0a48c319089410003cf/9fe7ff058d943e44-3b/s250x400/dca0005f7df7723b3dcdaa0477014bf94253c474.webp 250w, https://64.media.tumblr.com/a58a67606255a0a48c319089410003cf/9fe7ff058d943e44-3b/s400x600/f9ee11029f88c0c751a60aebcf6fba571bb3ef00.webp 400w, https://64.media.tumblr.com/a58a67606255a0a48c319089410003cf/9fe7ff058d943e44-3b/s500x750/299b644e15e33b0263adbd6003d89e00290f1d3c.webp 500w, https://64.media.tumblr.com/a58a67606255a0a48c319089410003cf/9fe7ff058d943e44-3b/s540x810/bc324ea9518dd6633233fc363599e341f92b7ba9.webp 540w, https://64.media.tumblr.com/a58a67606255a0a48c319089410003cf/9fe7ff058d943e44-3b/s640x960/c61e1968f5d3220d94fb7ce3fa052d371b2b4663.webp 640w, https://64.media.tumblr.com/a58a67606255a0a48c319089410003cf/9fe7ff058d943e44-3b/s1280x1920/4f507d6615701addd0e1adb48f097b8edc0cacdf.webp 820w" sizes="(max-width: 820px) 100vw, 820px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;There&amp;rsquo;s also a new option to use ImgBB with your own account, instead of uploading anonymously, by entering an API key in the ImageShare settings. This allows images to be saved permanently to your ImgBB account (unless you delete them later), and the images are always accessible through the ImgBB site on another web browser.&lt;/p&gt;&lt;p&gt;I&amp;rsquo;ve wanted to add authenticated image uploads for a long time, so the functionality could be closer to uploading screenshots on an Xbox or PlayStation console, but it wasn&amp;rsquo;t easily doable with Imgur. Just like before, images uploaded from a Nintendo 3DS console have the game title saved with the image when it&amp;rsquo;s available.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="265" data-orig-width="820"&gt;&lt;img src="https://64.media.tumblr.com/b6f6683713e039190278a746b5bd4e8c/9fe7ff058d943e44-d8/s640x960/f9b3262d4f600516641469a710dc8c326adc6191.webp" data-orig-height="265" data-orig-width="820" alt="Image uploads on Imgur and ImgBB" srcset="https://64.media.tumblr.com/b6f6683713e039190278a746b5bd4e8c/9fe7ff058d943e44-d8/s75x75_c1/0b2404766a0eaba1179969c351b6635f4b82e1ed.webp 75w, https://64.media.tumblr.com/b6f6683713e039190278a746b5bd4e8c/9fe7ff058d943e44-d8/s100x200/c1997c89f9e987340bcbfe18fb770f2579766925.webp 100w, https://64.media.tumblr.com/b6f6683713e039190278a746b5bd4e8c/9fe7ff058d943e44-d8/s250x400/72c3448c2518ff7aef213de51dc38e007d311d61.webp 250w, https://64.media.tumblr.com/b6f6683713e039190278a746b5bd4e8c/9fe7ff058d943e44-d8/s400x600/fb244d0023870ddbba220bbebfd2aa9c06111955.webp 400w, https://64.media.tumblr.com/b6f6683713e039190278a746b5bd4e8c/9fe7ff058d943e44-d8/s500x750/cd18892b23072eb7f3d0fbf026a62e1e4e2b3fc5.webp 500w, https://64.media.tumblr.com/b6f6683713e039190278a746b5bd4e8c/9fe7ff058d943e44-d8/s540x810/1f311ed9105dd4095bae234dd1148efdb7df21d0.webp 540w, https://64.media.tumblr.com/b6f6683713e039190278a746b5bd4e8c/9fe7ff058d943e44-d8/s640x960/f9b3262d4f600516641469a710dc8c326adc6191.webp 640w, https://64.media.tumblr.com/b6f6683713e039190278a746b5bd4e8c/9fe7ff058d943e44-d8/s1280x1920/3c8e8359a446bb1a99895dc4285fab8ea9645665.webp 820w" sizes="(max-width: 820px) 100vw, 820px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;The downside is that the new API key feature doesn&amp;rsquo;t work on the Nintendo 3DS Browser (and possibly the Wii U Browser, I haven&amp;rsquo;t checked). As far as I can tell, Nintendo blocks any kind of permanent storage in that browser, even the simple cookies used to store the API key.&lt;/p&gt;&lt;p&gt;ImageShare also now has improved support for other legacy web browsers: it fully works in Netscape Navigator 6 from 2001, and possibly earlier versions. It also now has a proper icon when pinned to the Start menu on Windows 10 Mobile, and there are some more fixes for older iOS devices.&lt;/p&gt;&lt;div class="npf_row"&gt;&lt;figure class="tmblr-full" data-orig-height="535" data-orig-width="820"&gt;&lt;img src="https://64.media.tumblr.com/d95fc8082eabcca19cf2c3f9a4cb90bc/9fe7ff058d943e44-8e/s640x960/f4641b50696b3f09769b830da6cd1281851b571f.webp" data-orig-height="535" data-orig-width="820" alt="Screenshot of ImageShare in Netscape 6" srcset="https://64.media.tumblr.com/d95fc8082eabcca19cf2c3f9a4cb90bc/9fe7ff058d943e44-8e/s75x75_c1/4cfc5305c5e2d756014907fff7601c0ea18f29e3.webp 75w, https://64.media.tumblr.com/d95fc8082eabcca19cf2c3f9a4cb90bc/9fe7ff058d943e44-8e/s100x200/05ecbc8f38e896f169d1dcde97814a33c50041a0.webp 100w, https://64.media.tumblr.com/d95fc8082eabcca19cf2c3f9a4cb90bc/9fe7ff058d943e44-8e/s250x400/08698f00f14c510ea484eae68f39fa2a21ed4ab7.webp 250w, https://64.media.tumblr.com/d95fc8082eabcca19cf2c3f9a4cb90bc/9fe7ff058d943e44-8e/s400x600/d1727c390b4551ed68395856fca4e0092e2d238b.webp 400w, https://64.media.tumblr.com/d95fc8082eabcca19cf2c3f9a4cb90bc/9fe7ff058d943e44-8e/s500x750/7753448d5c28d74b1d9b3c4d3b0459bc327cb9e2.webp 500w, https://64.media.tumblr.com/d95fc8082eabcca19cf2c3f9a4cb90bc/9fe7ff058d943e44-8e/s540x810/2883a957b3f8b6cd594f4616c93ed60eaa1742a8.webp 540w, https://64.media.tumblr.com/d95fc8082eabcca19cf2c3f9a4cb90bc/9fe7ff058d943e44-8e/s640x960/f4641b50696b3f09769b830da6cd1281851b571f.webp 640w, https://64.media.tumblr.com/d95fc8082eabcca19cf2c3f9a4cb90bc/9fe7ff058d943e44-8e/s1280x1920/4c82f121b50b1c611dc5b9060edc6b63a54caa84.webp 820w" sizes="(max-width: 820px) 100vw, 820px"/&gt;&lt;span class="tmblr-alt-text-helper"&gt;ALT&lt;/span&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ve taken it as a challenge to support as many old web browsers and devices as possible, at least as long as it remains practical. ImageShare also now uses the &lt;a href="https://goqr.me/api/"&gt;goQR.me API&lt;/a&gt; to generate QR code images, because the deprecated Google API previously in use has stopped working entirely.&lt;/p&gt;&lt;h2&gt;Self-hosted ImageShare&lt;/h2&gt;&lt;p&gt;I&amp;rsquo;ve also done a lot of work to make ImageShare as easy to set up on a home server or production site as possible. The &lt;a href="https://github.com/corbindavenport/imageshare/blob/main/DEV.md"&gt;dev instructions&lt;/a&gt; are now more detailed, and more features that were previously hard-wired in the code are now optional when setting up an ImageShare instance. It&amp;rsquo;s still a Docker Compose application, so it works on Windows, Mac, and Linux hosts.&lt;/p&gt;&lt;p&gt;The server configuration for ImageShare supports an Imgur API key, an ImgBB API key, or both. If you set up both options, the user can choose which option they want (the ImgBB option with a custom key is always available). For example, only the ImgBB option is enabled on the main server right now (I think Imgur blocked the server&amp;rsquo;s IP for too many requests, so I&amp;rsquo;m giving it a break). Plausible Analytics is also now easily configurable, with reporting for page views, basic device and browser information, upload events, and so on.&lt;/p&gt;&lt;p&gt;I&amp;rsquo;m not aware of any other ImageShare instances, but now is as good a time as any to set one up!&lt;/p&gt;&lt;h2&gt;The open future&lt;/h2&gt;&lt;p&gt;ImageShare has required a lot of work to stay functional on the Nintendo 3DS and other legacy platforms. I&amp;rsquo;ve gone through three hosting services: first Heroku, then DigitalOcean&amp;rsquo;s App Platform, then an Ubuntu VPS through Digital Ocean. After that last migration, I reworked it to run in Docker, which has made development and troubleshooting much simpler. That has all ensured ImageShare remains functional on legacy browsers through non-secure HTTP connections, while also supporting newer devices with HTTPS.&lt;/p&gt;&lt;p&gt;I&amp;rsquo;m not sure how long image hosting platforms will continue working with the current infrastructure, and I do not want to deal with hosting user content. There&amp;rsquo;s also the issue where the main supported device, the Nintendo 3DS, can&amp;rsquo;t save settings on the browser side. I&amp;rsquo;m thinking about how best to handle the project&amp;rsquo;s future with those problems.&lt;/p&gt;&lt;p&gt;ImageShare might eventually morph into a minimal web server that runs on a computer on your home network, which would be less vulnerable to rate limiting by APIs (or could just dump images directly to a computer). Another option would be improving the self-hosted setup and publishing ImageShare to &lt;a href="https://hub.docker.com/"&gt;Docker Hub&lt;/a&gt;, where it could be installed on any computer or server with Docker in one command. This is already a popular option for NextCloud, Plex, and other local server software, so it would probably work well for ImageShare.&lt;/p&gt;&lt;p&gt;I don&amp;rsquo;t have any plans to shut down the current ImageShare site, unless all the image hosting APIs stop working and I don&amp;rsquo;t have any options left. ImageShare has already outlived the Nintendo service it was initially designed to replace, and I&amp;rsquo;d like to keep that going.&lt;/p&gt;&lt;p&gt;You can learn more about ImageShare from the &lt;a href="https://github.com/corbindavenport/imageshare"&gt;GitHub repository&lt;/a&gt;, and you can try it out from &lt;a href="https://theimageshare.com/"&gt;theimageshare.com&lt;/a&gt;. If you want to help keep this service running, please consider &lt;a href="https://www.patreon.com/corbindavenport"&gt;joining my Patreon&lt;/a&gt; or donating through &lt;a href="https://paypal.me/corbindav"&gt;PayPal&lt;/a&gt; and &lt;a href="https://cash.app/%24corbdav"&gt;Cash App&lt;/a&gt;.&lt;/p&gt;</description><link>https://blog.corbin.io/post/739426697614639104</link><guid>https://blog.corbin.io/post/739426697614639104</guid><pubDate>Sat, 13 Jan 2024 13:57:30 -0500</pubDate><category>nintendo 3ds</category><category>3ds</category><category>nintendo wii u</category><category>wii u</category><category>retro tech</category><category>open source</category><category>nintendo</category><category>docker</category><category>imgur</category></item><item><title>Introducing The Spacebar</title><description>&lt;p&gt;I&amp;rsquo;m starting a new blog and newsletter for in-depth tech articles, retrospectives, and other related stuff that doesn&amp;rsquo;t quite fit in here on my personal blog! It&amp;rsquo;s called &lt;a href="https://href.li/?https://www.spacebar.news/"&gt;The Spacebar&lt;/a&gt;, and there are two articles live right now with more to come in the future.&lt;/p&gt;&lt;p&gt;I would appreciate it a lot if you &lt;a href="https://www.spacebar.news/subscribe"&gt;subscribed via email&lt;/a&gt;, which will send new articles directly to your inbox — there won&amp;rsquo;t be more than one per week, so it shouldn&amp;rsquo;t get too spammy. You can also subscribe via &lt;a href="https://href.li/?https://www.spacebar.news/feed"&gt;RSS&lt;/a&gt; or follow the &lt;a href="https://href.li/?https://mastodon.social/@thespacebar"&gt;Mastodon account&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.spacebar.news/"&gt;&lt;b&gt;Check out The Spacebar&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;</description><link>https://blog.corbin.io/post/725031436456951808</link><guid>https://blog.corbin.io/post/725031436456951808</guid><pubDate>Mon, 07 Aug 2023 17:30:59 -0400</pubDate><category>tech</category><category>newsletter</category><category>retro tech</category></item></channel></rss>