<?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom">
  <title>The Blog of Tom Webster - Project</title>
  <id>https://www.samurailink3.com</id>
  <updated></updated>
  <subtitle>Hey! I’m Tom! I’m a tech guy who has spent far too much time building far too many things. I enjoy tinkering with a lot of different technologies: Programming, Networking, 3D Printing, 3D Design, GameDev, and more. Most of what I make is open source, if you’re feeling curious, check out my projects below.</subtitle>
  <link href="https://www.samurailink3.com"></link>
  <author>
    <name>Tom Webster</name>
  </author>
  <entry>
    <title>NotionRSSGenerator</title>
    <updated>2026-05-08T00:00:00Z</updated>
    <id>https://www.samurailink3.com/NotionRSSGenerator-35ab67864241800da58aea2ff6068461</id>
    <content type="html">&lt;html&gt;&lt;p&gt;My blog finally has RSS again (check the front page)! This was a major missing component of moving my site to Notion. I’ve decided to release the code under the Public Domain, but I have to issue a warning before you dig into it: &lt;strong&gt;ITS ROUGH!&lt;/strong&gt; The code was rapidly thrown together and based on two earlier projects: &lt;a href=&#39;https://gitlab.com/samurailink3/podcastmaker&#39;&gt;PodcastMaker&lt;/a&gt; and &lt;a href=&#39;https://gitlab.com/samurailink3/notioncalendarexporter&#39;&gt;NotionCalendarExporter&lt;/a&gt;. The resulting code has been thrown together in a blender to make RSS feeds quickly. There are functions that are too long, too complex, and plain-ol’ inefficient.&lt;/p&gt;&#xA;&lt;p&gt;Don’t get me wrong, &lt;i&gt;it works&lt;/i&gt;, but it ain’t pretty. Hopefully you can get some good out of it, just know its a mess.&lt;/p&gt;&#xA;&lt;h1&gt;Where to get it&lt;/h1&gt;&#xA;&lt;a href=&#39;https://gitlab.com/samurailink3/notionrssgenerator&#39;&gt;https://gitlab.com/samurailink3/notionrssgenerator&lt;/a&gt;&#xA;&lt;p&gt;Instructions are on the Readme on that page.&lt;/p&gt;&#xA;&lt;hr/&gt;&#xA;&lt;h3&gt;🦋 Interact with this post on Bluesky:&lt;/h3&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&#xA;&lt;a href=&#39;https://bsky.app/profile/samurailink3.com/post/3mletc45gqs2v&#39;&gt;https://bsky.app/profile/samurailink3.com/post/3mletc45gqs2v&lt;/a&gt;&#xA;&#xA;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;/html&gt;</content>
    <link href="https://www.samurailink3.com/NotionRSSGenerator-35ab67864241800da58aea2ff6068461" rel="alternate"></link>
    <author>
      <name>Tom Webster</name>
    </author>
  </entry>
  <entry>
    <title>ZedBuilder</title>
    <updated>2026-05-06T00:00:00Z</updated>
    <id>https://www.samurailink3.com/ZedBuilder-358b6786424180c8ba85d8ffa39bfb74</id>
    <content type="html">&lt;html&gt;&lt;p&gt;As Microsoft started to get less and less trustworthy, I moved from VSCode to &lt;a href=&#39;https://vscodium.com/&#39;&gt;VSCodium&lt;/a&gt;, an open-source build of the VSCode source without Microsoft’s add-ons. This mostly-worked for me, but the remote development extensions were still Microsoft-proprietary (I work in &lt;a href=&#39;https://containers.dev/&#39;&gt;DevContainers&lt;/a&gt; a lot). I can work around that. What I can’t work around is Microsoft sneakily(?) adding in more and more slop into the only product of theirs I actually care about.&lt;/p&gt;&#xA;&lt;p&gt;Microsoft caught a bunch of hate for their buggy “feature” that &lt;a href=&#39;https://github.com/microsoft/vscode/pull/310226&#39;&gt;automatically added CoPilot as a co-author to any commit you make in VSCode&lt;/a&gt;. It was supposed to add this if you use CoPilot, and it was supposed to respect the “AI Killswitch” in VSCode. Because of the buggy implementation, it did not.&lt;/p&gt;&#xA;&lt;p&gt;I’m tired of needing to constantly play defense with the software I use. I moved &lt;a href=&#39;https://www.samurailink3.com/29ab6786424180f19c01d2ac737dedcf&#39;&gt;back to Linux for a reason&lt;/a&gt;. I’m tired of the cruft. I’m tired of the forced “features”. I’m tired of tech companies removing my agency as a user.&lt;/p&gt;&#xA;&lt;p&gt;Moving to VSCodium was not enough. I needed to remove the last piece of Microsoft software from my life. So I moved to &lt;a href=&#39;https://zed.dev/&#39;&gt;Zed&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Zed seems great so far. Built by a lot of the same people who built the &lt;a href=&#39;https://atom-editor.cc/&#39;&gt;Atom editor&lt;/a&gt;, open-source (GPL!) code, and written in &lt;a href=&#39;https://rust-lang.org/&#39;&gt;Rust&lt;/a&gt;. But Zed isn’t perfect, its still pretty early-on in the project’s public life. Debian packages aren’t directly available from the project, but they are available from a &lt;a href=&#39;https://zed.dev/docs/linux#debian-and-ubuntu&#39;&gt;community-repo&lt;/a&gt; (even VSCodium &lt;a href=&#39;https://vscodium.com/install#use-a-package-manager-deb-rpm-provided-by-vscodium-related-repos&#39;&gt;has this problem&lt;/a&gt;). I &lt;i&gt;really &lt;/i&gt;don’t like adding random repos to my system, so avoiding that is important.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#39;https://flathub.org/en/apps/dev.zed.Zed&#39;&gt;Flatpak packages are available&lt;/a&gt;, but making a Flatpak package work well with my existing system utilities is (understandably) frustrating. Flatpak is a sandbox, tightly integrating it with system utilities breaks the main point of Flatpak.&lt;/p&gt;&#xA;&lt;p&gt;I also wanted to change some Zed defaults. It also suffers from AI-infestation. The project leads &lt;a href=&#39;https://zed.dev/blog/not-building-ai-for-the-money&#39;&gt;have posted their reasoning&lt;/a&gt;, and it is logically sound, I understand where they’re coming from, they see AI as a tool for humans, not a wholesale replacement. In the current landscape of AI-boosterism, the Zed developers’ take is a reasonable one.&lt;/p&gt;&#xA;&lt;p&gt;That said, I still don’t want anything to do with the plagarism-machine. I actually enjoy tech, I enjoy writing code, and I enjoy getting more skilled at it under my own power. I love &lt;i&gt;the process&lt;/i&gt; of creation, not just the end-result. AI steals much of that joy from me.&lt;/p&gt;&#xA;&lt;p&gt;So I decided to build a Zed-builder that runs in a container (to avoid polluting your system with build tools), applies some patches to the default settings (to disable AI and telemetry, among others), and gives you an archive that you can install on your system.&lt;/p&gt;&#xA;&lt;h1&gt;Where to get it&lt;/h1&gt;&#xA;&lt;a href=&#39;https://gitlab.com/samurailink3/ZedBuilder&#39;&gt;https://gitlab.com/samurailink3/ZedBuilder&lt;/a&gt;&#xA;&lt;p&gt;Instructions are on the Readme on that page.&lt;/p&gt;&#xA;&lt;h1&gt;How it works&lt;/h1&gt;&#xA;&lt;p&gt;Its not too complicated. Its a Dockerfile that includes all of the utilities needed to build Zed. I’ve also used &lt;code&gt;git diff&lt;/code&gt; to make some default settings patches that are applied before compilation. More information is in the Readme on that page.&lt;/p&gt;&#xA;&lt;hr/&gt;&#xA;&lt;h3&gt;🦋 Interact with this post on Bluesky:&lt;/h3&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&#xA;&lt;a href=&#39;https://bsky.app/profile/samurailink3.com/post/3ml7qvbaims2e&#39;&gt;https://bsky.app/profile/samurailink3.com/post/3ml7qvbaims2e&lt;/a&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;/html&gt;</content>
    <link href="https://www.samurailink3.com/ZedBuilder-358b6786424180c8ba85d8ffa39bfb74" rel="alternate"></link>
    <author>
      <name>Tom Webster</name>
    </author>
  </entry>
  <entry>
    <title>Air Boot Spur</title>
    <updated>2026-04-27T00:00:00Z</updated>
    <id>https://www.samurailink3.com/Air-Boot-Spur-34fb6786424180669177e930798dfff1</id>
    <content type="html">&lt;html&gt;&lt;p&gt;&lt;/p&gt;&#xA;&lt;p&gt;I’ve unfortunately needed to wear a medical “Air Boot” for the past few weeks. While this device is certainly helpful, it lacks whimsy. I have created a model to rectify that.&lt;/p&gt;&#xA;&lt;a href=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/54562f67-54fe-404e-afe4-53cd1d06e323/image-02.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB466YNVPNPV6%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112311Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBoaCXVzLXdlc3QtMiJIMEYCIQDgmhmoar5O66XNfeV1IEas%2B7gOqok%2FAowf45N8LoA1MAIhAObvvbpIEYvxghaw6Jpxo4q6Pfz5BealBnp7A%2Fx%2B%2BQ73KogECOP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEQABoMNjM3NDIzMTgzODA1IgwMMzRpU4Au4XNxhdUq3AOFQKHKSE7yMiLDiwYu%2BN%2BoQVNdY0USZR11Ma10en38g3mFA%2Fxf1nBvIH7Pr0US9%2FM%2Fznc79hBnr4IcYjO41ICiAaGnVBe2QB70ailEKhVgqDielcucIu9lwARYxbznZIU4EWLFEZjqssSpPrtGao75EsRIDNrLZaxO6mJ3u9d9bKL99qbPmp7exXTtszbXB7lXBnlosW%2Bflnf8cuC%2BhQpVm%2FvYQGpmPYR3i7KFiBal%2BF7BDBx1TRlIyOF4Zm2kMir8fid4C9IS9rkqtB7W3L6Q4f4Zm3rJwsILv0ZAgadvBB6RgF4C1cIHg5wN%2Fe2LAS48oJv84M7SjVf1%2BooYfXzguVcQwflwTQ4F5o7iCgocpNiXVnNcFQpdyQZLk29H09OD60o3BrRzrlrrA12HleQOf375cjKlyayVbcFhtGJOSVwcP%2FPUJ%2BsvvX9Zaj4OFPkbrsCNYIj9MxxgDslklxJ2SNQ0szYUoUbqlSlL5m3HJSXz5xxx7EVYmqd%2BPh%2FZYzs9xPQM5hZfbnFXzS12HSy7VZ2wK%2FQ%2Fkc3ShhnjHD9OXChAGqwu9tyEqkC0LDC46ojPmr7%2BlMupnEpDGjFXP16cm3jXrEgcaK3Sr56Baoca5nb%2B4w0%2FY%2FuoPohu2jCTgvzPBjqkATRjXqK3Ewy54gWWJHtKe1RDkQZmcHZpFcG1aP2dUGUmYJi1T6ReQftfqLy3J25ybCB4cAUzErPy6YJb%2Fk7D0UbbuWIiwMlFhll1znadHqpmj%2FCSF5dByf%2BOYOawem8hBjoilutPvcTTLAGBcbL3VAlUCsTzkqMKj0bwnlBN4qCirGZUj%2BoGk8PzfA1cJvVndOaBc9hXzFxxcRaFFvaZ5XK3xQVF&amp;X-Amz-Signature=4d718d5a537997236c28a2527a6bc6e52e8e601c4a13851a208555f85c397193&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39;&gt;&lt;img style =&#39;width:50vw;&#39; src=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/54562f67-54fe-404e-afe4-53cd1d06e323/image-02.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB466YNVPNPV6%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112311Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBoaCXVzLXdlc3QtMiJIMEYCIQDgmhmoar5O66XNfeV1IEas%2B7gOqok%2FAowf45N8LoA1MAIhAObvvbpIEYvxghaw6Jpxo4q6Pfz5BealBnp7A%2Fx%2B%2BQ73KogECOP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEQABoMNjM3NDIzMTgzODA1IgwMMzRpU4Au4XNxhdUq3AOFQKHKSE7yMiLDiwYu%2BN%2BoQVNdY0USZR11Ma10en38g3mFA%2Fxf1nBvIH7Pr0US9%2FM%2Fznc79hBnr4IcYjO41ICiAaGnVBe2QB70ailEKhVgqDielcucIu9lwARYxbznZIU4EWLFEZjqssSpPrtGao75EsRIDNrLZaxO6mJ3u9d9bKL99qbPmp7exXTtszbXB7lXBnlosW%2Bflnf8cuC%2BhQpVm%2FvYQGpmPYR3i7KFiBal%2BF7BDBx1TRlIyOF4Zm2kMir8fid4C9IS9rkqtB7W3L6Q4f4Zm3rJwsILv0ZAgadvBB6RgF4C1cIHg5wN%2Fe2LAS48oJv84M7SjVf1%2BooYfXzguVcQwflwTQ4F5o7iCgocpNiXVnNcFQpdyQZLk29H09OD60o3BrRzrlrrA12HleQOf375cjKlyayVbcFhtGJOSVwcP%2FPUJ%2BsvvX9Zaj4OFPkbrsCNYIj9MxxgDslklxJ2SNQ0szYUoUbqlSlL5m3HJSXz5xxx7EVYmqd%2BPh%2FZYzs9xPQM5hZfbnFXzS12HSy7VZ2wK%2FQ%2Fkc3ShhnjHD9OXChAGqwu9tyEqkC0LDC46ojPmr7%2BlMupnEpDGjFXP16cm3jXrEgcaK3Sr56Baoca5nb%2B4w0%2FY%2FuoPohu2jCTgvzPBjqkATRjXqK3Ewy54gWWJHtKe1RDkQZmcHZpFcG1aP2dUGUmYJi1T6ReQftfqLy3J25ybCB4cAUzErPy6YJb%2Fk7D0UbbuWIiwMlFhll1znadHqpmj%2FCSF5dByf%2BOYOawem8hBjoilutPvcTTLAGBcbL3VAlUCsTzkqMKj0bwnlBN4qCirGZUj%2BoGk8PzfA1cJvVndOaBc9hXzFxxcRaFFvaZ5XK3xQVF&amp;X-Amz-Signature=4d718d5a537997236c28a2527a6bc6e52e8e601c4a13851a208555f85c397193&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39; alt=&#39;Unfortunately, the Notion API does not expose Alt-Text, so please open the full link if you need that.&#39;&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;&#xA;&#xA;&lt;a href=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/6d57c059-9e88-418f-a3cb-864eb1dc48c5/image-01.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB4666N3EPKZM%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112312Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBoaCXVzLXdlc3QtMiJHMEUCIGA%2BSuOAmLJHdLE7quhJfHQ00ChWkpQslsZJ7UswmBp2AiEAylF4piGysKEmXNpwNvYXzSNDnv64bno2j5mtUtHfwOQqiAQI4%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDIFvl%2Bh9MqUwj7wo1SrcA9GFpynQG5vi5GmxJ1b%2BhLwxkKWQgXExyNkCNMo0EnMPhYCYiBxy%2FWuxwlpoCmugWvRePkTInsk26hV7GflVQZalG9vscIqHDMKpZAllY%2B0%2Fv0%2FMxpqB0ejkN7iZN4owWwWQMfsnhwGlWWWh2Stk24MQstcH7h74YqdNWXOJ%2BG3MReJHVP4bB4w3LhlWKwkDD1%2FvmkbhCqkql6Y49JZEmRwPjDShktRY%2BCZ4kPgX3FozsKiRo%2BS68iSCgk37L7gCORXREjfW1zXqpsi5ja%2Fi9AAsBpCYauWE0aO3TkPm8tXWoKdPgzgLmHrWzNB4K254xTtDUNGwMt2NX57HXyLt4cZi%2FZbvqHq8hQmYnC8R%2Fom1LVHHFvdogq8VVQyV4tpIBvPVdNchrVhoSb0yj4W0s7oKZWpA%2Bv1NSaO7n5oCF3isgolkpPX2ZzlCqF2bYmMIEHbp56owBCQKUsPB33RrBsvz%2BZ1P4N0fEVESwbJyRUdQ9apawiLjBEkSIPDtFgBJnwh5O88PQPMMN5qP2F27%2FZUVWgpoFnxMaPsK5WhEX%2FalnD72zNEU7Uc39LtS5jfVlVUyiv6Yw6nY%2FAldm4%2FTVHjwSgSVHeX7znMbNbhYiagGyJN4fe%2F55Pfv6UbaMKGA%2FM8GOqUBTDXV2VlmbwTbSI%2BARbqQH87NIo3h13vknlCGIKP8YnULTUHuNfRAvcW9XUWNUQB%2BT91t0iGtBN9gFOowgUsVx%2BpqJQbEOqFhlnq1LYcY0vXYJfW0BDm6p2zGikBYejFy8YIgdiP6MEO9v2I2VJPyWQN4sMbqyXl%2Fi%2BbGqL5SiPc1Am1LM1JltBGMk7fYNsiOhByWfAuks4jTiLE%2BzuzH52UNibYs&amp;X-Amz-Signature=5e0cc33bd4645c3589e80ebef8663d4349bd80dc1dda9253f41a5f750b02eb56&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39;&gt;&lt;img style =&#39;width:50vw;&#39; src=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/6d57c059-9e88-418f-a3cb-864eb1dc48c5/image-01.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB4666N3EPKZM%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112312Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBoaCXVzLXdlc3QtMiJHMEUCIGA%2BSuOAmLJHdLE7quhJfHQ00ChWkpQslsZJ7UswmBp2AiEAylF4piGysKEmXNpwNvYXzSNDnv64bno2j5mtUtHfwOQqiAQI4%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDIFvl%2Bh9MqUwj7wo1SrcA9GFpynQG5vi5GmxJ1b%2BhLwxkKWQgXExyNkCNMo0EnMPhYCYiBxy%2FWuxwlpoCmugWvRePkTInsk26hV7GflVQZalG9vscIqHDMKpZAllY%2B0%2Fv0%2FMxpqB0ejkN7iZN4owWwWQMfsnhwGlWWWh2Stk24MQstcH7h74YqdNWXOJ%2BG3MReJHVP4bB4w3LhlWKwkDD1%2FvmkbhCqkql6Y49JZEmRwPjDShktRY%2BCZ4kPgX3FozsKiRo%2BS68iSCgk37L7gCORXREjfW1zXqpsi5ja%2Fi9AAsBpCYauWE0aO3TkPm8tXWoKdPgzgLmHrWzNB4K254xTtDUNGwMt2NX57HXyLt4cZi%2FZbvqHq8hQmYnC8R%2Fom1LVHHFvdogq8VVQyV4tpIBvPVdNchrVhoSb0yj4W0s7oKZWpA%2Bv1NSaO7n5oCF3isgolkpPX2ZzlCqF2bYmMIEHbp56owBCQKUsPB33RrBsvz%2BZ1P4N0fEVESwbJyRUdQ9apawiLjBEkSIPDtFgBJnwh5O88PQPMMN5qP2F27%2FZUVWgpoFnxMaPsK5WhEX%2FalnD72zNEU7Uc39LtS5jfVlVUyiv6Yw6nY%2FAldm4%2FTVHjwSgSVHeX7znMbNbhYiagGyJN4fe%2F55Pfv6UbaMKGA%2FM8GOqUBTDXV2VlmbwTbSI%2BARbqQH87NIo3h13vknlCGIKP8YnULTUHuNfRAvcW9XUWNUQB%2BT91t0iGtBN9gFOowgUsVx%2BpqJQbEOqFhlnq1LYcY0vXYJfW0BDm6p2zGikBYejFy8YIgdiP6MEO9v2I2VJPyWQN4sMbqyXl%2Fi%2BbGqL5SiPc1Am1LM1JltBGMk7fYNsiOhByWfAuks4jTiLE%2BzuzH52UNibYs&amp;X-Amz-Signature=5e0cc33bd4645c3589e80ebef8663d4349bd80dc1dda9253f41a5f750b02eb56&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39; alt=&#39;Unfortunately, the Notion API does not expose Alt-Text, so please open the full link if you need that.&#39;&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;p&gt;This continues my education in &lt;a href=&#39;https://www.freecad.org/&#39;&gt;FreeCAD&lt;/a&gt;. As much as I liked OnShape, having a FOSS tool local to my machine is extremely compelling. FreeCAD is actually really nice today. If its been a while since you’ve tried it, go download the latest stable build. I’ve moved to it full-time.&lt;/p&gt;&#xA;&lt;h1&gt;Where to get it&lt;/h1&gt;&#xA;&lt;a href=&#39;https://www.printables.com/model/1702568-air-boot-spur&#39;&gt;https://www.printables.com/model/1702568-air-boot-spur&lt;/a&gt;&#xA;&lt;hr/&gt;&#xA;&lt;h3&gt;🦋 Interact with this post on Bluesky:&lt;/h3&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&#xA;&lt;a href=&#39;https://bsky.app/profile/samurailink3.com/post/3mkielz34m22a&#39;&gt;https://bsky.app/profile/samurailink3.com/post/3mkielz34m22a&lt;/a&gt;&#xA;&#xA;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;/html&gt;</content>
    <link href="https://www.samurailink3.com/Air-Boot-Spur-34fb6786424180669177e930798dfff1" rel="alternate"></link>
    <author>
      <name>Tom Webster</name>
    </author>
  </entry>
  <entry>
    <title>Stackable Table</title>
    <updated>2026-04-15T00:00:00Z</updated>
    <id>https://www.samurailink3.com/Stackable-Table-343b67864241802480c7e76bfb8aaa1b</id>
    <content type="html">&lt;html&gt;&lt;p&gt;A while ago, I needed a small table, but I didn’t know exactly how tall I wanted it to be. I’ve got a 3D printer and some rudimentary CAD skills, so I made one. This is all press-fit, no fasteners or glue required, just smash some plastic together and it’ll hold.&lt;/p&gt;&#xA;&lt;h1&gt;Where to get it&lt;/h1&gt;&#xA;&lt;p&gt;You can download and print your own with the Printables link below. I’ve also included the FreeCAD Document so you can modify the thickness, size, and margins easily. This is all Public Domain licensed, so please do whatever you’d like with this model. Its very simple, but hopefully you find it useful. Enjoy!&lt;/p&gt;&#xA;&lt;a href=&#39;https://www.printables.com/model/1690578-stackable-table&#39;&gt;https://www.printables.com/model/1690578-stackable-table&lt;/a&gt;&#xA;&lt;hr/&gt;&#xA;&lt;h3&gt;🦋 Interact with this post on Bluesky:&lt;/h3&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&#xA;&lt;a href=&#39;https://bsky.app/profile/samurailink3.com/post/3mjklj4ogmc2c&#39;&gt;https://bsky.app/profile/samurailink3.com/post/3mjklj4ogmc2c&lt;/a&gt;&#xA;&#xA;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;/html&gt;</content>
    <link href="https://www.samurailink3.com/Stackable-Table-343b67864241802480c7e76bfb8aaa1b" rel="alternate"></link>
    <author>
      <name>Tom Webster</name>
    </author>
  </entry>
  <entry>
    <title>Whistle Crew Wiki</title>
    <updated>2026-01-14T00:00:00Z</updated>
    <id>https://www.samurailink3.com/Whistle-Crew-Wiki-2f7b6786424180da9ab5d22fad2b0e31</id>
    <content type="html">&lt;html&gt;&lt;p&gt;I’ve been helping 3D print community safety whistles to distribute all over the country. With a large group of 3D printing volunteers, we needed a place on the internet to collect information and collaborate. I’ve got a server and experience hosting, so I stood up a &lt;a href=&#39;https://www.dokuwiki.org/&#39;&gt;https://www.dokuwiki.org/&lt;/a&gt; instance.&lt;/p&gt;&#xA;&lt;h1&gt;Where to get it&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#39;https://whistlecrew.samurailink3.com/start&#39;&gt;https://whistlecrew.samurailink3.com/start&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;All content on the wiki is &lt;a href=&#39;https://creativecommons.org/licenses/publicdomain/deed.en&#39;&gt;Public Domain&lt;/a&gt; and you are encouraged to &lt;a href=&#39;https://whistlecrew.samurailink3.com/wiki:meta_download-this-wiki&#39;&gt;copy, remix, and re-host it&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h1&gt;Want Whistles?&lt;/h1&gt;&#xA;&lt;p&gt;We will ship you whistles, &lt;i&gt;completely for free&lt;/i&gt;, to anywhere in the US. Reach out to the email address you see here: &lt;a href=&#39;https://linktr.ee/3Dwhistles&#39;&gt;https://linktr.ee/3Dwhistles&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1&gt;Want to Donate?&lt;/h1&gt;&#xA;&lt;p&gt;3D printing volunteers need filament, you can donate filament or cash to support our shipping fund here: &lt;a href=&#39;https://linktr.ee/WhistleWishlists&#39;&gt;https://linktr.ee/WhistleWishlists&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;/html&gt;</content>
    <link href="https://www.samurailink3.com/Whistle-Crew-Wiki-2f7b6786424180da9ab5d22fad2b0e31" rel="alternate"></link>
    <author>
      <name>Tom Webster</name>
    </author>
  </entry>
  <entry>
    <title>Tom’s WIDE Pill Case</title>
    <updated>2025-11-26T00:00:00Z</updated>
    <id>https://www.samurailink3.com/Tom-s-WIDE-Pill-Case-2b7b678642418012a9a4d4bd031b65af</id>
    <content type="html">&lt;html&gt;&lt;p&gt;My grandmother liked my &lt;a href=&#39;https://www.samurailink3.comTom’s Parametric Pill Case&#39;&gt;Tom’s Parametric Pill Case&lt;/a&gt;, but wanted something a bit bigger with support for multiple days. I came up with this design, using the same magnetic-lock design I used previously. This is a &lt;strong&gt;much&lt;/strong&gt; bigger print with multiple pieces and slightly more complex assembly (it uses &lt;i&gt;glue&lt;/i&gt;).&lt;/p&gt;&#xA;&lt;p&gt;I’m pretty happy with the overall design, and I could probably make a compact version if needed in the future. This one is CHONKY (245x87mm).&lt;/p&gt;&#xA;&lt;p&gt;This one is &lt;a href=&#39;https://creativecommons.org/publicdomain/zero/1.0/&#39;&gt;Public Domain&lt;/a&gt; licensed, so have fun!&lt;/p&gt;&#xA;&lt;p&gt;The design is fully parametric and variable-driven, if you’d like to edit it, you can download the STEP files from the Printables link below or remix the public Onshape document: &lt;a href=&#39;https://cad.onshape.com/documents/5c0538eb87b2b086d44e895c/v/3993f801077b5bbf21c6472e/e/2f8a2fb0fa432662a0257e6a?renderMode=0&amp;uiState=69269a377d174e14d110abcf&#39;&gt;https://cad.onshape.com/documents/5c0538eb87b2b086d44e895c/v/3993f801077b5bbf21c6472e/e/2f8a2fb0fa432662a0257e6a?renderMode=0&amp;uiState=69269a377d174e14d110abcf&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1&gt;Where to get it&lt;/h1&gt;&#xA;&lt;a href=&#39;https://www.printables.com/model/1494214-toms-wide-pill-case&#39;&gt;https://www.printables.com/model/1494214-toms-wide-pill-case&lt;/a&gt;&#xA;&lt;p&gt;Instructions are on that page.&lt;/p&gt;&#xA;&lt;hr/&gt;&#xA;&lt;h3&gt;🦋 Interact with this post on Bluesky:&lt;/h3&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&#xA;&lt;a href=&#39;https://bsky.app/profile/samurailink3.com/post/3m6j7hoapgs2s&#39;&gt;https://bsky.app/profile/samurailink3.com/post/3m6j7hoapgs2s&lt;/a&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;/html&gt;</content>
    <link href="https://www.samurailink3.com/Tom-s-WIDE-Pill-Case-2b7b678642418012a9a4d4bd031b65af" rel="alternate"></link>
    <author>
      <name>Tom Webster</name>
    </author>
  </entry>
  <entry>
    <title>Pay2Win</title>
    <updated>2025-11-20T00:00:00Z</updated>
    <id>https://www.samurailink3.com/Pay2Win-2b5b678642418065a4f4d1b02edb4ed9</id>
    <content type="html">&lt;html&gt;&lt;p&gt;&lt;i&gt;Pay2Win&lt;/i&gt; is the answer to “What is the most illogical conclusion of pay-to-win mechanics infesting gaming?”. I had this question a decade ago and the answer I came up with back then would be a game that’s completely based around payment. There is no gameplay. There is only spending.&lt;/p&gt;&#xA;&lt;p&gt;I very recently launched &lt;a href=&#39;https://pay2win.online/&#39;&gt;https://pay2win.online/&lt;/a&gt;, the implementation of that awful idea. In Pay2Win, every $1 USD nets you 100 useless internet points. Those points put you on a scoreboard. To get higher on the scoreboard, you must Pay2Win.&lt;/p&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;a href=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/82ba0887-7653-457d-a7bb-f881483094ec/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB4662E3AMFRB%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112314Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBsaCXVzLXdlc3QtMiJGMEQCIACCef9l7%2BK34y7eGmAw7aTO%2BEkzh9GBFbArlupyHDEaAiAD%2BmwCPACZUxGeJRkpixUvlembnVcbkppslxNS%2FcP%2BDSqIBAjk%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDYzNzQyMzE4MzgwNSIM5FldmebaP15o23RhKtwD0Nh8St4QgbVfyO9BBvkYdXu6aReqw9rKP3cdXULHh%2B6gugwGNnrum%2FmvexanlGnrO3PVe0WRlhLc3pcjLeKjEaWvAP%2BucrZgxd%2BcKdvvnjGFEh8NmDtYWlVZh1FCP9bxk5Agn2FijY5%2B9D7W7FH7cqkB2d50gU%2BClGDaLB01SOIhS4lHBjed6mEylg05jPwirroy2lEK2ILblWBGEJ%2Bsvl4aLNz%2B6fyzof1djctdKF36QO%2Fukp4GJYHrIE%2BL5VKTWbh857WCj6WoIb4BFv0t53uE4sEeHw1RwTpfypovPNtQPorJF6eLmLm4FpBJ3UZIOHOwq4YfBvBEFYBg5NZcpD2YNHXVeZBf5PIzoONc%2BodcWwjkGEuxpE1XdhzBotV5IdWnxfFwZAqv4oydirPvthQMHHl46y00o%2BxAdTGrqtLrzeG1kMK1QrTr1S5rYx%2BYcKuwOaER8K07fmg710tA2gSeFilD%2F0e6PdjUfxdDuga%2FNxCYD0c0I%2FDuV65MPLvFqCvzeE6ycr1rlAHCMYntTwNvjUmIMttDtSVNDc%2Fkx64ssokfm4ChJ4rn3PBZqfzw%2Fv9ysU9Sm4mgct1Fr8%2FUnw7yVTjs8hG250WyJICqjYq8bnW3SINCm3l4A3Uw2Z38zwY6pgG4mSAQbEQX7gGtgJz%2BrjMcWz6CI6DlqH6zb63cCBKi8v2seoAErHg8Bs0AaBnmPDWf8Ey%2FQjeUTN7oS9gZnnj%2BSLbRG6BRpBt9Ms6qLeYzY7RBDETGXP%2BJEuNR0i0Z%2Ft9GVOyTGrAnJMiMu0SwnnG378NJU6YAZRRRwGoY7fvFwG%2FH3SyazifQef7cyH442dEjQov%2FQLOYTd3L3FOmmLHfkxvEA%2BT7&amp;X-Amz-Signature=6f9ba255d0daacfa19499e82af77c8226bad1eab6346b36d4f83246509e406eb&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39;&gt;&lt;img style =&#39;width:50vw;&#39; src=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/82ba0887-7653-457d-a7bb-f881483094ec/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB4662E3AMFRB%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112314Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBsaCXVzLXdlc3QtMiJGMEQCIACCef9l7%2BK34y7eGmAw7aTO%2BEkzh9GBFbArlupyHDEaAiAD%2BmwCPACZUxGeJRkpixUvlembnVcbkppslxNS%2FcP%2BDSqIBAjk%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDYzNzQyMzE4MzgwNSIM5FldmebaP15o23RhKtwD0Nh8St4QgbVfyO9BBvkYdXu6aReqw9rKP3cdXULHh%2B6gugwGNnrum%2FmvexanlGnrO3PVe0WRlhLc3pcjLeKjEaWvAP%2BucrZgxd%2BcKdvvnjGFEh8NmDtYWlVZh1FCP9bxk5Agn2FijY5%2B9D7W7FH7cqkB2d50gU%2BClGDaLB01SOIhS4lHBjed6mEylg05jPwirroy2lEK2ILblWBGEJ%2Bsvl4aLNz%2B6fyzof1djctdKF36QO%2Fukp4GJYHrIE%2BL5VKTWbh857WCj6WoIb4BFv0t53uE4sEeHw1RwTpfypovPNtQPorJF6eLmLm4FpBJ3UZIOHOwq4YfBvBEFYBg5NZcpD2YNHXVeZBf5PIzoONc%2BodcWwjkGEuxpE1XdhzBotV5IdWnxfFwZAqv4oydirPvthQMHHl46y00o%2BxAdTGrqtLrzeG1kMK1QrTr1S5rYx%2BYcKuwOaER8K07fmg710tA2gSeFilD%2F0e6PdjUfxdDuga%2FNxCYD0c0I%2FDuV65MPLvFqCvzeE6ycr1rlAHCMYntTwNvjUmIMttDtSVNDc%2Fkx64ssokfm4ChJ4rn3PBZqfzw%2Fv9ysU9Sm4mgct1Fr8%2FUnw7yVTjs8hG250WyJICqjYq8bnW3SINCm3l4A3Uw2Z38zwY6pgG4mSAQbEQX7gGtgJz%2BrjMcWz6CI6DlqH6zb63cCBKi8v2seoAErHg8Bs0AaBnmPDWf8Ey%2FQjeUTN7oS9gZnnj%2BSLbRG6BRpBt9Ms6qLeYzY7RBDETGXP%2BJEuNR0i0Z%2Ft9GVOyTGrAnJMiMu0SwnnG378NJU6YAZRRRwGoY7fvFwG%2FH3SyazifQef7cyH442dEjQov%2FQLOYTd3L3FOmmLHfkxvEA%2BT7&amp;X-Amz-Signature=6f9ba255d0daacfa19499e82af77c8226bad1eab6346b36d4f83246509e406eb&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39; alt=&#39;Unfortunately, the Notion API does not expose Alt-Text, so please open the full link if you need that.&#39;&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;p&gt;On one hand, I hope this is successful and I make a bunch of money. On the other hand, I don’t want to burn what little faith in humanity I have left.&lt;/p&gt;&#xA;&lt;p&gt;This project is the first product I’m launching as part of my LLC. I’m gonna try to be an independent for a while, see where that goes. Whether that’s Pay2Win shenanigans, gamedev, contracting, or consulting, I’m not sure yet. But I am rather enjoying the process of exploring and figuring it all out.&lt;/p&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;p&gt;As this is a commercial venture, I’m not open-sourcing this project.&lt;/p&gt;&#xA;&lt;h1&gt;Where to get it&lt;/h1&gt;&#xA;&lt;a href=&#39;https://pay2win.online/&#39;&gt;https://pay2win.online/&lt;/a&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;hr/&gt;&#xA;&lt;h3&gt;🦋 Interact with this post on Bluesky:&lt;/h3&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&#xA;&lt;a href=&#39;https://bsky.app/profile/samurailink3.com/post/3m63nnvrjjc22&#39;&gt;https://bsky.app/profile/samurailink3.com/post/3m63nnvrjjc22&lt;/a&gt;&#xA;&#xA;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;/html&gt;</content>
    <link href="https://www.samurailink3.com/Pay2Win-2b5b678642418065a4f4d1b02edb4ed9" rel="alternate"></link>
    <author>
      <name>Tom Webster</name>
    </author>
  </entry>
  <entry>
    <title>Sunrise</title>
    <updated>2025-10-27T00:00:00Z</updated>
    <id>https://www.samurailink3.com/Sunrise-2b5b678642418050b392db5ebfff7615</id>
    <content type="html">&lt;html&gt;&lt;p&gt;Sunrise is a monitor-restart service written for Sunshine Linux Hosts!&lt;/p&gt;&#xA;&lt;p&gt;If you use Sunrise game streaming from a Linux host, there’s a good chance your monitors won’t wake up when you make a remote connection. The only real workaround was to never sleep your monitors, which seems wasteful and annoying. I wrote Sunrise to solve this problem for myself and put it on the internet, just in case it was helpful for other people.&lt;/p&gt;&#xA;&lt;p&gt;I wrote more about this bug and the solution in this section of this blog post: &lt;a href=&#39;https://www.samurailink3.comSunshine Streaming&#39;&gt;Sunshine Streaming&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1&gt;Where to get it&lt;/h1&gt;&#xA;&lt;a href=&#39;https://github.com/samurailink3/sunrise&#39;&gt;https://github.com/samurailink3/sunrise&lt;/a&gt;&#xA;&lt;p&gt;Instructions are on the Readme on that page.&lt;/p&gt;&#xA;&lt;h1&gt;How it works&lt;/h1&gt;&#xA;&lt;p&gt;Sunrise checks Sunshine’s log file for a specific error message related to not finding the monitor, then it issues a command to wake the monitor. Pretty tiny, pretty easy to use.&lt;/p&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;/html&gt;</content>
    <link href="https://www.samurailink3.com/Sunrise-2b5b678642418050b392db5ebfff7615" rel="alternate"></link>
    <author>
      <name>Tom Webster</name>
    </author>
  </entry>
  <entry>
    <title>Replika: My Spare-Parts Prusa MK3S+</title>
    <updated>2025-04-17T00:00:00Z</updated>
    <id>https://www.samurailink3.com/Replika-My-Spare-Parts-Prusa-MK3S-2bcb678642418074b7f1f5497d85416d</id>
    <content type="html">&lt;html&gt;&lt;p&gt;A while ago, I built a “new” Prusa MK3S+ out of spare parts on my kitchen table, but never wrote about it or posted pictures. I decided to do the full &lt;a href=&#39;https://www.prusa3d.com/product/original-prusa-i3-mk3-s-to-mk4-upgrade-kit/&#39;&gt;MK3S+ → MK4 upgrade&lt;/a&gt;, even though Prusa themselves slightly warn against it. At the end of the process, you’ll have rebuilt the vast majority of your MK3S+ into a MK4, and will be left with ~75% of a MK3S+ on your kitchen table.&lt;/p&gt;&#xA;&lt;p&gt;So I decided to &lt;a href=&#39;https://www.prusa3d.com/category/mk3-mk3s-mk3s/&#39;&gt;order the missing mechanical parts from Prusa directly&lt;/a&gt; and &lt;a href=&#39;https://www.printables.com/model/57217-i3-mk3s-printable-parts&#39;&gt;start printing the required printed parts&lt;/a&gt;. The fact that this was, not only possible, but wholly &lt;strong&gt;supported&lt;/strong&gt; by Prusa is fucking wild. Its the open-source ethos in action. This directly enabled me to go from “a table of spare parts” to “working machine” with a bit of time, effort, and following the &lt;a href=&#39;https://help.prusa3d.com/manual/original-prusa-i3-mk3s-kit-assembly_1128/mk3s-2&#39;&gt;pretty-good directions&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Since I needed to build the hotend anyway, I figured I may as well upgrade to an &lt;a href=&#39;https://e3d-online.com/pages/revo-configurator&#39;&gt;E3D Revo&lt;/a&gt;. I followed Prusa’s directions and &lt;a href=&#39;https://e3d-online.com/pages/revo-support-revo-mk3-six&#39;&gt;E3D’s Revo install instructions&lt;/a&gt; to build the new hotend. Mashing both instruction sets up together wasn’t the most straight-forward experience, but after a bit of fiddling, I ended up with a working (and upgraded) machine.&lt;/p&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;p&gt;Here’s some pictures of the finished build, and a couple printed upgrades to go with it (please excuse the messy workshop [and notice the bonus fire extinguisher for my first test print]):&lt;/p&gt;&#xA;&lt;a href=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/0f6c4620-2def-45a5-bf29-4f25ea8c0fe8/IMG_4896.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB466RNC4TJUO%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112315Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBoaCXVzLXdlc3QtMiJGMEQCIAnvla22t1yTP9RMJigqlyvowrqxqBoREzehk1ozzM20AiBZBQvem86xDFcALecrXNxJiG6h1agtYBBpN3uhyWETdCqIBAjj%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDYzNzQyMzE4MzgwNSIMHTSoIs59cqI%2FE7igKtwDoXiw8naaaLCrNr8NzTyVtg1dMQb1UKvdQpA6gudhIsWKt%2FkFbwR1Pp4BbHOqoTm8jeVu8d5KbyrpXXLFtmWRCOfpKgRSaRtkWrxs3P%2BlXCPOQSYDl9ZoA6vf8SQ%2FRbf9luEy9mo4lnyilOxi1FhjH%2FfnxQdvDVcklOOaOCfs0dXyEs%2BBqH0Am8ZF4OobX3u06LUQqCRUvyZH8H9SyjtBFdin%2B95Ki0PTf0CXqu%2F17iAmJoVL8Z%2Bi232%2FXrMsMILmJxDGU9c%2BoVwNZAqMpW8FTL9JGk8Cdbh57zQBMoVy2hO%2F%2Fa1KN1arggNf58zwZPrZNYQMbrFjsOl7oOQmYY%2F9E9UY%2FZ%2BG%2BtQ2GbB7eDn8Of8uk1nyZ6DPW%2BAg3Qi6gzwEr3rJL%2BcsoFPhDQ%2FN7mzRMOojkj7NM57QSFrCR1QmujzdjgoYVxpfjKtvOCouWISCOFnBu9FsLPUAAjKAidY1AkPyh3nIoKQ0JalvtHbTGqZdkW5aZiThjQGUGT4tV2amdxJuIBe1ozYDMPu6AnkEJEcMO1NaE7za45VWIVay4%2BQB2bvLd%2B9YcpLzslQ1MTlZyOGyZznwT%2FErvSDxb%2FyqnoU5E4PGGGVIy5v8h0enXc%2BRgRgrVp0yL%2FGtmdsw0%2F%2F7zwY6pgFRcD3HiuYHhWqBiu0qj0HUAsiBtUrF%2BARB3ZyPjVMzxTnfFSJpHwrPOqFdGwZhGYfKC6gpcoSEKi0VIGKQo7WURMV73VzVqdItw4PpSdwENnri5rDFLerwaBodAJz2%2BcpmTdOmgkvkDJ%2Bczalki2469N615S2xJdbU40tb0xRbl5JvgNN4tE9XK2KBZ%2BlUvX7ouaa7I6yjleoKX02%2FGkQTlCdJdeSa&amp;X-Amz-Signature=bdf0c550b9b05fd5fe591170eca16418526f1e146a4737edfeab85923542d551&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39;&gt;&lt;img style =&#39;width:50vw;&#39; src=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/0f6c4620-2def-45a5-bf29-4f25ea8c0fe8/IMG_4896.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB466RNC4TJUO%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112315Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBoaCXVzLXdlc3QtMiJGMEQCIAnvla22t1yTP9RMJigqlyvowrqxqBoREzehk1ozzM20AiBZBQvem86xDFcALecrXNxJiG6h1agtYBBpN3uhyWETdCqIBAjj%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDYzNzQyMzE4MzgwNSIMHTSoIs59cqI%2FE7igKtwDoXiw8naaaLCrNr8NzTyVtg1dMQb1UKvdQpA6gudhIsWKt%2FkFbwR1Pp4BbHOqoTm8jeVu8d5KbyrpXXLFtmWRCOfpKgRSaRtkWrxs3P%2BlXCPOQSYDl9ZoA6vf8SQ%2FRbf9luEy9mo4lnyilOxi1FhjH%2FfnxQdvDVcklOOaOCfs0dXyEs%2BBqH0Am8ZF4OobX3u06LUQqCRUvyZH8H9SyjtBFdin%2B95Ki0PTf0CXqu%2F17iAmJoVL8Z%2Bi232%2FXrMsMILmJxDGU9c%2BoVwNZAqMpW8FTL9JGk8Cdbh57zQBMoVy2hO%2F%2Fa1KN1arggNf58zwZPrZNYQMbrFjsOl7oOQmYY%2F9E9UY%2FZ%2BG%2BtQ2GbB7eDn8Of8uk1nyZ6DPW%2BAg3Qi6gzwEr3rJL%2BcsoFPhDQ%2FN7mzRMOojkj7NM57QSFrCR1QmujzdjgoYVxpfjKtvOCouWISCOFnBu9FsLPUAAjKAidY1AkPyh3nIoKQ0JalvtHbTGqZdkW5aZiThjQGUGT4tV2amdxJuIBe1ozYDMPu6AnkEJEcMO1NaE7za45VWIVay4%2BQB2bvLd%2B9YcpLzslQ1MTlZyOGyZznwT%2FErvSDxb%2FyqnoU5E4PGGGVIy5v8h0enXc%2BRgRgrVp0yL%2FGtmdsw0%2F%2F7zwY6pgFRcD3HiuYHhWqBiu0qj0HUAsiBtUrF%2BARB3ZyPjVMzxTnfFSJpHwrPOqFdGwZhGYfKC6gpcoSEKi0VIGKQo7WURMV73VzVqdItw4PpSdwENnri5rDFLerwaBodAJz2%2BcpmTdOmgkvkDJ%2Bczalki2469N615S2xJdbU40tb0xRbl5JvgNN4tE9XK2KBZ%2BlUvX7ouaa7I6yjleoKX02%2FGkQTlCdJdeSa&amp;X-Amz-Signature=bdf0c550b9b05fd5fe591170eca16418526f1e146a4737edfeab85923542d551&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39; alt=&#39;Unfortunately, the Notion API does not expose Alt-Text, so please open the full link if you need that.&#39;&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&#xA;&lt;a href=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/69c987f4-4202-4230-bafd-fc0971835bd0/IMG_4898.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB4664VIQY2KU%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112315Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBsaCXVzLXdlc3QtMiJHMEUCIQCWoBlx%2BA%2ByPcfq25zOabvqjxsj%2BQIgTtnevFQOdP1jKAIgRbGGKvllUaqk4MXX2QEShBXK474UPV8qaPvB%2FblzaewqiAQI5P%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDP2%2B32cRjUFlWVzOFircA6GWpjAOuWxT8gjyF5hBFB6qTitSWd5s26AK7%2B6xXwcC825Wz2bykZXUIiidC8NhKJVyAtXXSl%2F1q%2BU4YhYTzg3X%2FwDuJHgyc0o1PI6fbI%2FffF0YzWIZRAQ7O3Xtw94p2SsgDljTdRhx%2BtjsG6SW0hRRo4%2B3rmby1dlVmyHog%2FNT7lcsNANniPgpyR3Z97PFuVScmP12Tn39qfxY1k6%2Bec03QZU0vreKXYLQuIuGKNaVySlRYVKZTaZsG%2FLP8pDJ3QBUP3ufI%2Bwab0BOHadj5BEIBP6Xgx585dCYn5uSYTNcLmlJzpCGnk1hAdd6o73vsjEItAMfSNXjbvC%2ByKajf1%2BeIYNwbHRa1BqGjXXn9IGsmmdwRF%2BGdwe501JCpDBkOl9gMgAegwGa0duhGFTRZvuDJabVQI2HYPy90NjsY8GMHKeaIezvTJ4D2E6IgNA%2FanMq5D%2FqSF8j701YeR6oXZhlkSLbkYV1%2BCIjU1sp0zP0hK%2Bl%2FzBmMLleFS8Y7OBpw4W%2BGh1zJftz0zdxx6rNuaYP45gXP0zDRD2c7%2FLoYdA7E3m09R6GysRis1tv3YXK9TjQV9eCKA0GXsmlosQcZ516Pxhf%2F5%2BiOXRzq18bODsPyj35NX8b0IVtQM80MPWi%2FM8GOqUBuOlGvn8NmOTJjxomjq9LYZG0s2wVyv9C3McX8gZ%2FVpOeZn4TrFDofwInHLJlZ6HZBdKX%2FWSEpPAUH6cqnb5f0YBcH1o4N4s4jbdbVEJyoLvwmnsimqUMzqCXBLtk5Qe%2FrB01p9LdxZA2VeG5GKhB5x%2FUEmZPd%2FWKDPPTieL%2BTtiD3y%2Fn0tSB%2FE7ORKc%2B%2FnP3M3wVQstrgPI5nN%2Ft%2BvL1qlTOxkdH&amp;X-Amz-Signature=348dce4fe102a5f8e7858b79c232178d622eeac8deaa33e403ddef19bbb886e9&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39;&gt;&lt;img style =&#39;width:50vw;&#39; src=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/69c987f4-4202-4230-bafd-fc0971835bd0/IMG_4898.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB4664VIQY2KU%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112315Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBsaCXVzLXdlc3QtMiJHMEUCIQCWoBlx%2BA%2ByPcfq25zOabvqjxsj%2BQIgTtnevFQOdP1jKAIgRbGGKvllUaqk4MXX2QEShBXK474UPV8qaPvB%2FblzaewqiAQI5P%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDP2%2B32cRjUFlWVzOFircA6GWpjAOuWxT8gjyF5hBFB6qTitSWd5s26AK7%2B6xXwcC825Wz2bykZXUIiidC8NhKJVyAtXXSl%2F1q%2BU4YhYTzg3X%2FwDuJHgyc0o1PI6fbI%2FffF0YzWIZRAQ7O3Xtw94p2SsgDljTdRhx%2BtjsG6SW0hRRo4%2B3rmby1dlVmyHog%2FNT7lcsNANniPgpyR3Z97PFuVScmP12Tn39qfxY1k6%2Bec03QZU0vreKXYLQuIuGKNaVySlRYVKZTaZsG%2FLP8pDJ3QBUP3ufI%2Bwab0BOHadj5BEIBP6Xgx585dCYn5uSYTNcLmlJzpCGnk1hAdd6o73vsjEItAMfSNXjbvC%2ByKajf1%2BeIYNwbHRa1BqGjXXn9IGsmmdwRF%2BGdwe501JCpDBkOl9gMgAegwGa0duhGFTRZvuDJabVQI2HYPy90NjsY8GMHKeaIezvTJ4D2E6IgNA%2FanMq5D%2FqSF8j701YeR6oXZhlkSLbkYV1%2BCIjU1sp0zP0hK%2Bl%2FzBmMLleFS8Y7OBpw4W%2BGh1zJftz0zdxx6rNuaYP45gXP0zDRD2c7%2FLoYdA7E3m09R6GysRis1tv3YXK9TjQV9eCKA0GXsmlosQcZ516Pxhf%2F5%2BiOXRzq18bODsPyj35NX8b0IVtQM80MPWi%2FM8GOqUBuOlGvn8NmOTJjxomjq9LYZG0s2wVyv9C3McX8gZ%2FVpOeZn4TrFDofwInHLJlZ6HZBdKX%2FWSEpPAUH6cqnb5f0YBcH1o4N4s4jbdbVEJyoLvwmnsimqUMzqCXBLtk5Qe%2FrB01p9LdxZA2VeG5GKhB5x%2FUEmZPd%2FWKDPPTieL%2BTtiD3y%2Fn0tSB%2FE7ORKc%2B%2FnP3M3wVQstrgPI5nN%2Ft%2BvL1qlTOxkdH&amp;X-Amz-Signature=348dce4fe102a5f8e7858b79c232178d622eeac8deaa33e403ddef19bbb886e9&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39; alt=&#39;Unfortunately, the Notion API does not expose Alt-Text, so please open the full link if you need that.&#39;&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;&#xA;&#xA;&lt;a href=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/368bd6a2-d052-4c16-86c7-ce7a492655de/IMG_4903.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB466YOZ2YVI3%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112316Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBoaCXVzLXdlc3QtMiJHMEUCIFNZaH5QeTSC3Y4UA%2BJbM4oy8aTl1T%2B6nkwLKjuR0G9eAiEA9UzfM8nRcTKt7orvvAx%2B2XdOnOsV%2BA64LXk5jRIwWLEqiAQI4%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDOLGCm5axOhE7egwVCrcA7taVlN5T4kT7%2BOgQlmYpizFcaANV0Y7UaYDuY5iVul393UamSG5E886fzgrLHIZfGQWXsmke%2BCwvIBan%2Fov82DNUO%2BsrD3Kt2y02YZJGEMpyqxjjnVVUnJbN0AdHnLu3X3kc2mWoPNXhot0AVmyWekeK0IXEX8%2FB2OOxsioHJOd6CeTkLzVPQCvMa0MqmPC%2FRyfeXNUBc60L%2FjKh%2FWvHO5xIL47d33l3FDUhbMXks5W9mzyhxNNZ7Lj%2Fnz7xAIlAQLcJwT3lURVNYjo98drQlnjgNTQTUe%2BGjAVCFkAk%2B0GeamjAmrhw9bG4fIXeEcE8tPULz6Fo7nRkreuxVL6aD%2BQODgUFy%2FXSK97pDf5vlfj9ZIkukzpfaY6JEpm5I4B%2FV70Mg1KOvroxlvUsx%2Fc2QovbLm6lzLjrni6dU1Jr42fQeH48tHeXJsZzaabmSaVEoPh8LVtdbRPs%2FY7GyS35i8RcUOSSUgkLDwP2ZIa%2FrsSQd0nk1fVTGb%2FgG8%2Fj1c%2BTeAHbUYAPNXaGZrb9fR4BBNqbuUVLVsZhvJcCymdidZFtIRKFjfbgO0FSf57hReTsGej7mgP23MgflkAozmggavOqIl4agHIJgunRCamukc22fSC0BirmmavJSyMMJOF%2FM8GOqUBD6dv9DHz9lMUmOReU2QVG%2B4DhTauCbvij1t%2FAWJUqfU18JnohZD1lD8FvRSt6sP6DuKCD5mKyjI%2Bty5j46OekpvsxbGnLiFVBhyG3kI2Rzg1xp6wv6UYziBWAb91HwYkN9aNe%2B9JUf%2FKKl7yHrKOwYtg%2B%2BMXw%2BgLeNgIm8lVX2va4T7DwzuBRTbEsAtIytyHbIPxa22sV439xYfEe%2BEen7mrArCv&amp;X-Amz-Signature=446e205c133ee3410831fcd32961620d86998a1972aacfb5a228b75a0f826bce&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39;&gt;&lt;img style =&#39;width:50vw;&#39; src=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/368bd6a2-d052-4c16-86c7-ce7a492655de/IMG_4903.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB466YOZ2YVI3%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112316Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBoaCXVzLXdlc3QtMiJHMEUCIFNZaH5QeTSC3Y4UA%2BJbM4oy8aTl1T%2B6nkwLKjuR0G9eAiEA9UzfM8nRcTKt7orvvAx%2B2XdOnOsV%2BA64LXk5jRIwWLEqiAQI4%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDOLGCm5axOhE7egwVCrcA7taVlN5T4kT7%2BOgQlmYpizFcaANV0Y7UaYDuY5iVul393UamSG5E886fzgrLHIZfGQWXsmke%2BCwvIBan%2Fov82DNUO%2BsrD3Kt2y02YZJGEMpyqxjjnVVUnJbN0AdHnLu3X3kc2mWoPNXhot0AVmyWekeK0IXEX8%2FB2OOxsioHJOd6CeTkLzVPQCvMa0MqmPC%2FRyfeXNUBc60L%2FjKh%2FWvHO5xIL47d33l3FDUhbMXks5W9mzyhxNNZ7Lj%2Fnz7xAIlAQLcJwT3lURVNYjo98drQlnjgNTQTUe%2BGjAVCFkAk%2B0GeamjAmrhw9bG4fIXeEcE8tPULz6Fo7nRkreuxVL6aD%2BQODgUFy%2FXSK97pDf5vlfj9ZIkukzpfaY6JEpm5I4B%2FV70Mg1KOvroxlvUsx%2Fc2QovbLm6lzLjrni6dU1Jr42fQeH48tHeXJsZzaabmSaVEoPh8LVtdbRPs%2FY7GyS35i8RcUOSSUgkLDwP2ZIa%2FrsSQd0nk1fVTGb%2FgG8%2Fj1c%2BTeAHbUYAPNXaGZrb9fR4BBNqbuUVLVsZhvJcCymdidZFtIRKFjfbgO0FSf57hReTsGej7mgP23MgflkAozmggavOqIl4agHIJgunRCamukc22fSC0BirmmavJSyMMJOF%2FM8GOqUBD6dv9DHz9lMUmOReU2QVG%2B4DhTauCbvij1t%2FAWJUqfU18JnohZD1lD8FvRSt6sP6DuKCD5mKyjI%2Bty5j46OekpvsxbGnLiFVBhyG3kI2Rzg1xp6wv6UYziBWAb91HwYkN9aNe%2B9JUf%2FKKl7yHrKOwYtg%2B%2BMXw%2BgLeNgIm8lVX2va4T7DwzuBRTbEsAtIytyHbIPxa22sV439xYfEe%2BEen7mrArCv&amp;X-Amz-Signature=446e205c133ee3410831fcd32961620d86998a1972aacfb5a228b75a0f826bce&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39; alt=&#39;Unfortunately, the Notion API does not expose Alt-Text, so please open the full link if you need that.&#39;&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;&#xA;&#xA;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;p&gt;I wanted this to be a mobile manufacturing station that I could just plug-and-play around the house (or even to other people’s houses). I added a few accessories to pull this off:&lt;/p&gt;&#xA;&lt;h2&gt;Logitech C270 Camera Mount [not pictured]&lt;/h2&gt;&#xA;&lt;p&gt;I added this webcam mount to attach to the Raspberry Pi, so I could actively monitor the printer: &lt;a href=&#39;https://www.printables.com/model/3991-logitech-c270-mount-prusa-i3-mk3&#39;&gt;https://www.printables.com/model/3991-logitech-c270-mount-prusa-i3-mk3&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;The interface isn’t as tight as I’d like it, the camera will get itself out of position if bumped, but its good enough for now.&lt;/p&gt;&#xA;&lt;h2&gt;Revo Nozzle Holder&lt;/h2&gt;&#xA;&lt;p&gt;This Revo Nozzle Holder just sticks right onto the MK3S+ frame and has slots for holding nozzles. Super handy, no chance of me losing them.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#39;https://www.printables.com/model/99012-revo-nozzle-holder-for-prusa-mk3s&#39;&gt;https://www.printables.com/model/99012-revo-nozzle-holder-for-prusa-mk3s&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2&gt;PrusaLink / Prusa Connect on a Raspberry Pi 3B+&lt;/h2&gt;&#xA;&lt;p&gt;I love the ability to just send jobs from PrusaSlicer and have them start on the printer. Extremely handy, and it would share the same interface as my MK4. I printed up a case, followed the directions, and everything just worked.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#39;https://www.printables.com/model/5313-raspberry-pi-3b-case-for-mk3-v-vslot-with-screw&#39;&gt;https://www.printables.com/model/5313-raspberry-pi-3b-case-for-mk3-v-vslot-with-screw&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#39;https://help.prusa3d.com/guide/prusalink-prusa-connect-with-rpi-3-4-usb-mk2-5-s-mk3-s_469341&#39;&gt;https://help.prusa3d.com/guide/prusalink-prusa-connect-with-rpi-3-4-usb-mk2-5-s-mk3-s_469341&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1&gt;Where to get it&lt;/h1&gt;&#xA;&lt;p&gt;If you’d like to get your own MK3S+, you’ve gotta build it yourself. Honestly, &lt;a href=&#39;https://www.prusa3d.com/category/3d-printers/&#39;&gt;just get one of Prusa’s other excellent printers&lt;/a&gt;. If you’re really insistent on building one yourself:&lt;/p&gt;&#xA;&lt;ul&gt;&lt;li&gt;Printable Parts: &lt;/li&gt;&lt;li&gt;&lt;a href=&#39;https://www.printables.com/model/57217-i3-mk3s-printable-parts&#39;&gt;https://www.printables.com/model/57217-i3-mk3s-printable-parts&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;ul&gt;&lt;li&gt;Spare Parts: &lt;/li&gt;&lt;li&gt;&lt;a href=&#39;https://www.prusa3d.com/category/mk3-mk3s-mk3s/&#39;&gt;https://www.prusa3d.com/category/mk3-mk3s-mk3s/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;ul&gt;&lt;li&gt;Main GitHub Repo (and links to other necessary repos): &lt;/li&gt;&lt;li&gt;&lt;a href=&#39;https://github.com/prusa3d/Original-Prusa-i3/tree/MK3S&#39;&gt;https://github.com/prusa3d/Original-Prusa-i3/tree/MK3S&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;ul&gt;&lt;li&gt;Raspberry Pi PrusaLink Setup: &lt;/li&gt;&lt;li&gt;&lt;a href=&#39;https://help.prusa3d.com/guide/prusalink-prusa-connect-with-rpi-3-4-usb-mk2-5-s-mk3-s_469341&#39;&gt;https://help.prusa3d.com/guide/prusalink-prusa-connect-with-rpi-3-4-usb-mk2-5-s-mk3-s_469341&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;/html&gt;</content>
    <link href="https://www.samurailink3.com/Replika-My-Spare-Parts-Prusa-MK3S-2bcb678642418074b7f1f5497d85416d" rel="alternate"></link>
    <author>
      <name>Tom Webster</name>
    </author>
  </entry>
  <entry>
    <title>Honeycomb Storage Wall Anbernic RG35XXSP Mount</title>
    <updated>2025-01-17T00:00:00Z</updated>
    <id>https://www.samurailink3.com/Honeycomb-Storage-Wall-Anbernic-RG35XXSP-Mount-17eb678642418013a15ee502052e7427</id>
    <content type="html">&lt;html&gt;&lt;p&gt;This is a &lt;a href=&#39;https://www.printables.com/model/152592-honeycomb-storage-wall&#39;&gt;Honeycomb Storage Wall &lt;/a&gt;mount for the &lt;a href=&#39;https://anbernic.com/products/rg35xxsp&#39;&gt;Anbernic RG35XXSP&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;There&#39;s not much to say about this one, its a simple box that can attach to HSW inserts and holds your handheld securely.&lt;/p&gt;&#xA;&lt;h1&gt;Where to get it&lt;/h1&gt;&#xA;&lt;a href=&#39;https://www.printables.com/model/1152772-honeycomb-storage-wall-anbernic-rg35xxsp-mount&#39;&gt;https://www.printables.com/model/1152772-honeycomb-storage-wall-anbernic-rg35xxsp-mount&lt;/a&gt;&#xA;&lt;p&gt;Source CAD and printing instructions available on the Printables page.&lt;/p&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;hr/&gt;&#xA;&lt;h3&gt;🦋 Interact with this post on Bluesky:&lt;/h3&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&#xA;&lt;a href=&#39;https://bsky.app/profile/samurailink3.com/post/3lfxmaontvs2w&#39;&gt;https://bsky.app/profile/samurailink3.com/post/3lfxmaontvs2w&lt;/a&gt;&#xA;&#xA;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;/html&gt;</content>
    <link href="https://www.samurailink3.com/Honeycomb-Storage-Wall-Anbernic-RG35XXSP-Mount-17eb678642418013a15ee502052e7427" rel="alternate"></link>
    <author>
      <name>Tom Webster</name>
    </author>
  </entry>
  <entry>
    <title>Wireguard Backhaul</title>
    <updated>2024-11-15T00:00:00Z</updated>
    <id>https://www.samurailink3.com/Wireguard-Backhaul-13eb678642418019a22aebdcc8fe3c36</id>
    <content type="html">&lt;html&gt;&lt;p&gt;If you’ve ever wanted to host your own sites on a Raspberry Pi in your house, but ran into complications with port forwarding, CG-NAT, blocked public ports, or other ISP nonsense, &lt;i&gt;Wireguard Backhaul&lt;/i&gt; can fix this for you quickly and easily.&lt;/p&gt;&#xA;&lt;p&gt;&lt;i&gt;Wireguard Backhaul&lt;/i&gt; is my chosen strategy to host things on the public internet from my CG-NAT home internet connection. These tips will allow you to host things like websites, game servers, and anything else from your home, but still make them internet-accessible. Additionally, if you’d like to make your services accessible &lt;i&gt;only&lt;/i&gt; to select people with the proper VPN profile&lt;i&gt;, &lt;/i&gt;I’ll show you how.&lt;/p&gt;&#xA;&lt;h1&gt;Where to get it&lt;/h1&gt;&#xA;&lt;p&gt;Since this project is really just a list of instructions and some configuration files, there isn’t a central GitLab repo for it, just this post and this script: &lt;a href=&#39;https://github.com/samurailink3/TomsEasyWireguardSetupScript&#39;&gt;Tom’s Easy Wireguard Setup Script&lt;/a&gt;. Feel free to use and share this! All written content is under &lt;code&gt;CC-BY-4.0&lt;/code&gt;. This is all open-source goodness.&lt;/p&gt;&#xA;&lt;h1&gt;Instructions&lt;/h1&gt;&#xA;&lt;h2&gt;Initial Setup&lt;/h2&gt;&#xA;&lt;p&gt;First, you’ll need something to host from your home network. This can be as simple or as complex as you’d like. For this example, I’ll be using nginx on a Debian virtual machine to host a site. I’ll start by showing how to host this site completely privately to those with a corresponding Wireguard profile, then I’ll show you how we can publish this to the public internet.&lt;/p&gt;&#xA;&lt;p&gt;Next, you’ll need a cheap VPS. The Wireguard service and traffic-backhaul won’t take much CPU or RAM, but (maybe obviously?) will require bandwidth. If you pay by the gig for bandwidth on your VPS host and stream 24/7 8k 240FPS video streams, this will get expensive quickly. For websites and game servers, it’ll be cheap. I use &lt;a href=&#39;https://www.digitalocean.com/&#39;&gt;Digital Ocean&lt;/a&gt; for my personal VPS needs and have been using their ~$5/month VPS with no issues.&lt;/p&gt;&#xA;&lt;h2&gt;VPS Setup&lt;/h2&gt;&#xA;&lt;p&gt;I chose the cheapest Digital Ocean VPS running the latest stable Debian image. After you get it launched, configure your VPS firewall and allow the following ports:&lt;/p&gt;&#xA;&lt;code&gt;22/TCP - Open to your IP address only&#xA;(you can remove this rule once Wireguard is running)&#xA;&#xA;51820/UDP - Allow All&#xA;80/TCP - Allow All (optional, for public website hosting)&#xA;443/TCP - Allow All (optional, for public website hosting)&lt;/code&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;p&gt;Then ssh to it, install Vim, Git, Caddy, and Wireguard: &lt;code&gt;apt install caddy wireguard git vim&lt;/code&gt;. I wrote a very simple script to help automate the creation of Wireguard profiles for game servers, its available here: &lt;a href=&#39;https://github.com/samurailink3/TomsEasyWireguardSetupScript&#39;&gt;https://github.com/samurailink3/TomsEasyWireguardSetupScript&lt;/a&gt;. Follow these commands to clone the script and set it up for convenient use in our Wireguard config folder:&lt;/p&gt;&#xA;&lt;code&gt;cd /etc/wireguard&#xA;git clone https://github.com/samurailink3/TomsEasyWireguardSetupScript&#xA;ln -s TomsEasyWireguardSetupScript/install-wireguard.bash ./&lt;/code&gt;&#xA;&lt;p&gt;Then, just run the script and follow the prompts: &lt;code&gt;./install-wireguard.bash&lt;/code&gt;&lt;/p&gt;&#xA;&lt;code&gt;What is the public IP address of your server? &lt;-- This is the public IP of your VPS&#xA;How many people need a VPN profile (including you)? &lt;-- 2 (one for the server, one for your test client)&#xA;&lt;/code&gt;&#xA;&lt;p&gt;Restart the Wireguard service to pick up the new keys: &lt;code&gt;systemctl restart wg-quick@wg0&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;p&gt;Take a look at the files we generated: &lt;code&gt;ls -l /etc/wireguard/wg0/&lt;/code&gt;&lt;/p&gt;&#xA;&lt;code&gt;client_1.conf &lt;-- Your home server wireguard config file.&#xA;client_1.priv &lt;-- Ignore this. Your home server private key.&#xA;client_1.pub  &lt;-- Ignore this. Your home server public key.&#xA;client_2.conf &lt;-- Your test client wireguard config file.&#xA;client_2.priv &lt;-- Ignore this. Your test client private key.&#xA;client_2.pub  &lt;-- Ignore this. Your test client public key.&#xA;server.priv   &lt;-- Ignore this. Your VPS private key.&#xA;server.pub    &lt;-- Ignore this. Your VPS public key.&#xA;&lt;/code&gt;&#xA;&lt;p&gt;We only want the two &lt;code&gt;*.conf&lt;/code&gt; files, those contain all the information Wireguard needs to make a connection.&lt;/p&gt;&#xA;&lt;h2&gt;Wireguard Testing&lt;/h2&gt;&#xA;&lt;p&gt;Let’s make sure Wireguard is working properly. First, make sure the machine you’re on now has &lt;a href=&#39;https://www.wireguard.com/&#39;&gt;Wireguard installed&lt;/a&gt;. Then copy out &lt;code&gt;client_2.conf&lt;/code&gt; and load it into your Wireguard client.&lt;/p&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;p&gt;Once the Wireguard tunnel is activated, you can run &lt;code&gt;ping 10.11.12.1&lt;/code&gt; and should see responses. If you don’t, make sure your firewall is configured to allow 51820/UDP and restart the Wireguard service if you missed that step.&lt;/p&gt;&#xA;&lt;h2&gt;Server Setup and Private Hosting&lt;/h2&gt;&#xA;&lt;p&gt;On your home network server, make sure you have Wireguard installed and install the &lt;code&gt;client_1.conf&lt;/code&gt; profile. Once Wireguard is configured and started, ping &lt;code&gt;10.11.12.1&lt;/code&gt; to make sure everything is hooked up correctly.&lt;/p&gt;&#xA;&lt;p&gt;By default, most webservers will listen on &lt;code&gt;0.0.0.0&lt;/code&gt; (essentially “every configured interface on this machine”). We can isolate services to specific Wireguard IP addresses by specifying that in the config file. This is both cleaner and more expandable because we can host multiple Wireguard tunnels on this machine, each with their own underlying web services.&lt;/p&gt;&#xA;&lt;p&gt;Here’s a snippet of the nginx config showing how this is done:&lt;/p&gt;&#xA;&lt;code&gt;server {&#xA;&#x9;&#x9;&#x9;&#x9;listen 10.11.12.2:80 default_server;&#xA;...&lt;/code&gt;&#xA;&lt;p&gt;So now, nginx will only listen on our configured Wireguard IP address. If we had multiple Wireguard tunnels configured, we’d just use &lt;i&gt;that&lt;/i&gt; IP address instead.&lt;/p&gt;&#xA;&lt;p&gt;Now, if both your server and test client are connected to the Wireguard network, you can click on &lt;a href=&#39;http://10.11.12.2/&#39;&gt;http://10.11.12.2/&lt;/a&gt; and see that the default nginx page is loaded. When you disable Wireguard on your test client and try to access the site, it times out. &lt;i&gt;This means you now have a fully-private website, accessible over the internet to anyone you give a Wireguard profile to.&lt;/i&gt; This can be extremely helpful when hosting services for your family and friends, but don’t want the wider internet to have access.&lt;/p&gt;&#xA;&lt;p&gt;If you want to make this even easier for your users, you can add a DNS record to point a domain name to &lt;code&gt;10.11.12.2&lt;/code&gt; . The DNS records &lt;i&gt;are public&lt;/i&gt;, so don’t leak information by naming your site &lt;code&gt;super-secret-stuff.example.com&lt;/code&gt;. You can even use &lt;a href=&#39;https://letsencrypt.org/&#39;&gt;Let’s Encrypt&lt;/a&gt; and a &lt;a href=&#39;https://letsencrypt.org/docs/challenge-types/#dns-01-challenge&#39;&gt;DNS-01 challenge&lt;/a&gt; to add HTTPS to this internal site. For a more practical example, check out &lt;a href=&#39;https://www.samurailink3.comRom Browser&#39;&gt;Rom Browser&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;i&gt;But what if you &lt;/i&gt;&lt;strong&gt;&lt;i&gt;do &lt;/i&gt;&lt;/strong&gt;&lt;i&gt;want to make it public on the internet?&lt;/i&gt;&lt;/p&gt;&#xA;&lt;h2&gt;Public Hosting with the Wireguard Backhaul&lt;/h2&gt;&#xA;&lt;p&gt;Luckily, making your site publicly-accessible is pretty quick and simple!&lt;/p&gt;&#xA;&lt;p&gt;SSH to your VPS and configure Caddy: &lt;code&gt;vim /etc/caddy/Caddyfile&lt;/code&gt;&lt;/p&gt;&#xA;&lt;code&gt;https://public.example.com {&#xA;        reverse_proxy 10.11.12.2:80&#xA;}&lt;/code&gt;&#xA;&lt;p&gt;Then restart the service: &lt;code&gt;systemctl restart caddy&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;In this config file, we’ve instructed Caddy to host an HTTPS site on public.example.com. Every request made to this server is then passed to our home server over Wireguard (that’s the &lt;code&gt;10.11.12.2&lt;/code&gt; address). So the request starts here at our Wireguard Backhaul VPS, then is proxied over the Wireguard tunnel to our home network server, where the request is actually responded to. The cherry on top is because this is using Caddy, we get automatic HTTPS courtesy of &lt;a href=&#39;https://letsencrypt.org/&#39;&gt;Let’s Encrypt&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;p&gt;And… that’s it! Really, its a simple as that. It does cost some money to have a publicly-accessible VPS to hook into, but you can easily spend the bare-minimum on the VPS, then more efficiently spend money on local hardware that does the real work of hosting. I’ve been using this for a few months and have moved nearly all of my cloud-based hosting to this model, saving a pile of money. Hopefully it works for you!&lt;/p&gt;&#xA;&lt;hr/&gt;&#xA;&lt;h3&gt;🦋 Interact with this post on Bluesky:&lt;/h3&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&#xA;&lt;a href=&#39;https://bsky.app/profile/samurailink3.com/post/3lbaqumumik2x&#39;&gt;https://bsky.app/profile/samurailink3.com/post/3lbaqumumik2x&lt;/a&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;/html&gt;</content>
    <link href="https://www.samurailink3.com/Wireguard-Backhaul-13eb678642418019a22aebdcc8fe3c36" rel="alternate"></link>
    <author>
      <name>Tom Webster</name>
    </author>
  </entry>
  <entry>
    <title>Notion Calendar Exporter</title>
    <updated>2024-10-09T00:00:00Z</updated>
    <id>https://www.samurailink3.com/Notion-Calendar-Exporter-119b6786424180ec82f8facf2a806b3b</id>
    <content type="html">&lt;html&gt;&lt;p&gt;Notion Calendar Exporter lets you put your Notion todo items on your calendar, even if you don’t use Google Calendar. It generates an iCal file that is uploaded to S3 using a secret name. You can use that link in your calendar provider of choice.&lt;/p&gt;&#xA;&lt;h1&gt;Where to get it&lt;/h1&gt;&#xA;&lt;a href=&#39;https://gitlab.com/samurailink3/notioncalendarexporter&#39;&gt;https://gitlab.com/samurailink3/notioncalendarexporter&lt;/a&gt;&#xA;&lt;p&gt;Instructions are on the Readme on that page.&lt;/p&gt;&#xA;&lt;h1&gt;How it works&lt;/h1&gt;&#xA;&lt;ul&gt;&lt;li&gt;Gets items in the specified Notion database&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;ul&gt;&lt;li&gt;Build iCal events using due dates&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;ul&gt;&lt;li&gt;Upload the generated iCal file to S3 using seeded UUIDs to make the link un-guessable&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;h1&gt;Background (aka story time)&lt;/h1&gt;&#xA;&lt;h2&gt;The Problem&lt;/h2&gt;&#xA;&lt;p&gt;I’ve been moving more things into Notion (&lt;a href=&#39;https://www.samurailink3.com/118b6786424180e4b1e9d2bf07a49347&#39;&gt;including this site&lt;/a&gt;), but my first task was moving my Todo List. Well… Not really a todo list… More like a pile of calendar reminders, random scheduled tasks in Apple Reminders, an Apple Notes shopping list, some stuff in a text file on the system I SSH into for work, the single Apple Sticky Note on my work computer, and the physical notebook that sits on my desk…&lt;/p&gt;&#xA;&lt;p&gt;I’m a mess and my extreme proliferation of unconnected todo lists is also bad too.&lt;/p&gt;&#xA;&lt;p&gt;At the start of this year, I swore to get more organized. I’m not much on New Years resolutions, but “getting organized” seemed helpful enough to try it out. Naturally, the first 6 months of the year, I did absolutely nothing to help achieve that goal in any way. After that, I explored a bit and decided to try Notion to manage my tasks.&lt;/p&gt;&#xA;&lt;p&gt;Things being mini-databases in Notion was pretty alluring. Being able to slice-and-dice my tasks on various data fields is pretty cool. I can have views into that database to cover &lt;i&gt;very specific vibes&lt;/i&gt;, like “Personal tasks that are related to project-work that involve 3D printing”. I’m mostly impulse-driven, so being able to take advantage of my whims is a super important part of how I get things done (ADHD-brain goes &lt;i&gt;hard&lt;/i&gt;).&lt;/p&gt;&#xA;&lt;p&gt;The big problem was: I had to remember to look at it.&lt;/p&gt;&#xA;&lt;p&gt;My calendar rules my life most days, so that felt like the best place to keep todo reminders. Notion supports calendar integration, but only for Google Calendar, and I’m a Fastmail guy. I needed a calendar file I could host and subscribe to. Thus this project.&lt;/p&gt;&#xA;&lt;h2&gt;Building the thing&lt;/h2&gt;&#xA;&lt;p&gt;This was my first project really putting Notion’s AI product through its paces with programming tasks. But, before I tell you how the AI performed, I want to give you my &lt;i&gt;very abridged&lt;/i&gt; lukewarm-take on AI:&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I really need to write a longer blog post diving into that rant, but that’s for another day.&lt;/p&gt;&#xA;&lt;p&gt;Initially, I asked the AI to use a specific Notion Go library and write a function to query a task database. It hallucinated some constants that didn’t exist in the library, but the intent was correct (like writing &lt;code&gt;SRTDSC&lt;/code&gt; instead of &lt;code&gt;SortDescending&lt;/code&gt; ). It then added status field filtering after I asked it to.&lt;/p&gt;&#xA;&lt;p&gt;Ok, pretty good so far.&lt;/p&gt;&#xA;&lt;p&gt;So I tried giving it this instruction:&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&#xA;And it gave me this:&lt;/p&gt;&#xA;&lt;code&gt;func getDescriptionFromTaskItem(p notion.Page) (details string) {&#xA;    var sb strings.Builder&#xA;&#xA;    // Iterate through all blocks in the page&#xA;    for _, block := range p.Blocks {&#xA;        switch block.Type {&#xA;        case notion.BlockTypeParagraph:&#xA;            sb.WriteString(block.Paragraph.RichText[0].PlainText)&#xA;        case notion.BlockTypeHeading1:&#xA;            sb.WriteString(&#34;# &#34; + block.Heading1.RichText[0].PlainText)&#xA;        case notion.BlockTypeHeading2:&#xA;            sb.WriteString(&#34;## &#34; + block.Heading2.RichText[0].PlainText)&#xA;        case notion.BlockTypeHeading3:&#xA;            sb.WriteString(&#34;### &#34; + block.Heading3.RichText[0].PlainText)&#xA;        case notion.BlockTypeBulletedListItem:&#xA;            sb.WriteString(&#34;- &#34; + block.BulletedListItem.RichText[0].PlainText)&#xA;        case notion.BlockTypeNumberedListItem:&#xA;            sb.WriteString(&#34;1. &#34; + block.NumberedListItem.RichText[0].PlainText)&#xA;        case notion.BlockTypeToggle:&#xA;            sb.WriteString(&#34;&gt; &#34; + block.Toggle.RichText[0].PlainText)&#xA;        case notion.BlockTypeCode:&#xA;            sb.WriteString(&#34;```\n&#34; + block.Code.RichText[0].PlainText + &#34;\n```&#34;)&#xA;        // Add more cases for other block types as needed&#xA;        }&#xA;        sb.WriteString(&#34;\n\n&#34;) // Add newlines between blocks&#xA;    }&#xA;&#xA;    details = sb.String()&#xA;    return&#xA;}&lt;/code&gt;&#xA;&lt;p&gt;It takes the formatted blocks converts them to markdown so they’ll show up nicely on the event description. I was pretty impressed here, I expected the simplest answer, but this was more complex and more useful than I had asked for. I even asked it to add todo checkboxes for subtasks, &lt;a href=&#39;https://gitlab.com/samurailink3/notioncalendarexporter/-/blob/d44471d36613d361ccf6187766e9ed6c79b68779/notion-util.go#L10-51&#39;&gt;and it did&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;One (admittedly nitpicky) complaint I had is how the bot wrote documentation:&lt;/p&gt;&#xA;&lt;code&gt;// appendRichText appends rich text content to a strings.Builder, including formatting&#xA;// for bold, italic, and code annotations.&#xA;//&#xA;// Parameters:&#xA;//   - builder: A pointer to a strings.Builder to append the formatted text.&#xA;//   - richText: A slice of notion.RichText containing the rich text to process.&lt;/code&gt;&#xA;&lt;p&gt;Its.. not really Go-like. Or at least not like I’m used to. I kept it because there’s nothing &lt;i&gt;wrong&lt;/i&gt; with it, its just different.&lt;/p&gt;&#xA;&lt;p&gt;However my biggest complaint is the Notion AI interface. If “Help me with code” is a suggested question, &lt;i&gt;please&lt;/i&gt; let me use code blocks, because this is fucking gross:&lt;/p&gt;&#xA;&lt;a href=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/054021fd-7820-4a5d-8550-7d99a0fc9c5f/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB4667WOOTN44%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112317Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBoaCXVzLXdlc3QtMiJHMEUCIEU5UtgvEWmoCMzbhoCRzchTeuKFmt40ks2FBXpOvuJuAiEA5V6xYxpPafFuF6pyS0E5xPd3A8sJf%2BXz84rd2pRHgGkqiAQI4%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDPjo%2Bf1gxA%2FunuapSircA3YXf0YoUfgtO5dl2i59JRzFpV2%2FvJBhvxg5AJf0vH3vb%2BXbn0Iwhpoy04JJS2a7nXnrnVPEgHm9r2Fy7%2FP%2BWR2kWiCfGqCLd07ADa5NU3qzMQ2dhzIwstwd407eFwhdlQdV6KvrvK%2BSO%2B4nAeJAELy7dt236JRUzfwTM6z8EMe4KHbYFAjr2jGExsfcDcNEcsFrlqw8rXM7gUedkv705S18gURNH50OlrqxLvc%2BMpboSqXAVoZmbYl8UVINiwWXQN7GJeTuz4rLK6e4AANSufxd6Qfy0aea9YqeX5etEe86X8BflLfRkhgbSa%2B%2FnPAm5I%2F%2Fp1Uy15%2Bf7gqrEiHXohr8maex3quGLMyf%2FvLHNVZfberXtZFS5IrQYZVkwsqsI4ffLtMv9nsXo8yGecTx8gF4o5bqjEsjz%2FWQtQEPHOWqjB9GR1vzPUVz4fXucQAQ0uszkt5rLgE3HXbHQxIrIbexoggrUVSzaLTv1D7N0HKF8Qz4LOAXY%2BE22coLndaA8vNb9X6BSVBjAO480tt8b58XdVHZduiWiyo94GYs9H5%2B9%2FF8jR7BrnPn%2F4YuHx3EZvOD06reIpvu8%2F86Hahetsuz11FAiVFtZj79tGiM0GfvM0LoTHRvGZ3QR3B%2FMOuR%2FM8GOqUBpgPwUt8keYolXN5d%2FZd2hMIt%2F%2Btsa7nNZ2MFG5er4COP%2BBA3fqFlQbgtmVMnSE2fWM36VdN%2FwlIKh6P4HyqMo90QhBEz3kXL1MG2D30suJ556qbcX2fIiUbglY0iMRHZWAElbVoHVqin1qvqrDX8LxMyxYWFhSBWh7k41Az62PnOh6ILHBVbqaDNVCuiNfnyKDj6eNfqxSvnZhSVYa87Oobal4sQ&amp;X-Amz-Signature=4d2d07b604ea5345e65b6f36c78646aa239a42a3100b9fb04314d7db4b70fb34&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39;&gt;&lt;img style =&#39;width:50vw;&#39; src=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/054021fd-7820-4a5d-8550-7d99a0fc9c5f/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB4667WOOTN44%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112317Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBoaCXVzLXdlc3QtMiJHMEUCIEU5UtgvEWmoCMzbhoCRzchTeuKFmt40ks2FBXpOvuJuAiEA5V6xYxpPafFuF6pyS0E5xPd3A8sJf%2BXz84rd2pRHgGkqiAQI4%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDPjo%2Bf1gxA%2FunuapSircA3YXf0YoUfgtO5dl2i59JRzFpV2%2FvJBhvxg5AJf0vH3vb%2BXbn0Iwhpoy04JJS2a7nXnrnVPEgHm9r2Fy7%2FP%2BWR2kWiCfGqCLd07ADa5NU3qzMQ2dhzIwstwd407eFwhdlQdV6KvrvK%2BSO%2B4nAeJAELy7dt236JRUzfwTM6z8EMe4KHbYFAjr2jGExsfcDcNEcsFrlqw8rXM7gUedkv705S18gURNH50OlrqxLvc%2BMpboSqXAVoZmbYl8UVINiwWXQN7GJeTuz4rLK6e4AANSufxd6Qfy0aea9YqeX5etEe86X8BflLfRkhgbSa%2B%2FnPAm5I%2F%2Fp1Uy15%2Bf7gqrEiHXohr8maex3quGLMyf%2FvLHNVZfberXtZFS5IrQYZVkwsqsI4ffLtMv9nsXo8yGecTx8gF4o5bqjEsjz%2FWQtQEPHOWqjB9GR1vzPUVz4fXucQAQ0uszkt5rLgE3HXbHQxIrIbexoggrUVSzaLTv1D7N0HKF8Qz4LOAXY%2BE22coLndaA8vNb9X6BSVBjAO480tt8b58XdVHZduiWiyo94GYs9H5%2B9%2FF8jR7BrnPn%2F4YuHx3EZvOD06reIpvu8%2F86Hahetsuz11FAiVFtZj79tGiM0GfvM0LoTHRvGZ3QR3B%2FMOuR%2FM8GOqUBpgPwUt8keYolXN5d%2FZd2hMIt%2F%2Btsa7nNZ2MFG5er4COP%2BBA3fqFlQbgtmVMnSE2fWM36VdN%2FwlIKh6P4HyqMo90QhBEz3kXL1MG2D30suJ556qbcX2fIiUbglY0iMRHZWAElbVoHVqin1qvqrDX8LxMyxYWFhSBWh7k41Az62PnOh6ILHBVbqaDNVCuiNfnyKDj6eNfqxSvnZhSVYa87Oobal4sQ&amp;X-Amz-Signature=4d2d07b604ea5345e65b6f36c78646aa239a42a3100b9fb04314d7db4b70fb34&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39; alt=&#39;Unfortunately, the Notion API does not expose Alt-Text, so please open the full link if you need that.&#39;&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;p&gt;I’m particularly happy with my “secret” link generation though:&lt;/p&gt;&#xA;&lt;p&gt;First, I set up some random UUIDs as namespaces:&lt;/p&gt;&#xA;&lt;code&gt;uuidSecretPathNamespace1 = uuid.UUID{0x68, 0xc8, 0xc9, 0x0, 0xf5, 0x67, 0x46, 0x80, 0xb5, 0xd6, 0x3a, 0xf9, 0xde, 0x7, 0xc8, 0xc6}&#xA;uuidSecretPathNamespace2 = uuid.UUID{0x6f, 0xe, 0x61, 0xbe, 0x6c, 0x94, 0x45, 0x99, 0x86, 0x7, 0xb4, 0x34, 0xea, 0x20, 0x5c, 0xf4}&#xA;uuidSecretPathNamespace3 = uuid.UUID{0x38, 0x85, 0x6e, 0x83, 0xcc, 0xdb, 0x47, 0x5e, 0xbf, 0x51, 0xc7, 0x50, 0x91, 0x11, 0xd8, 0x32}&lt;/code&gt;&#xA;&lt;p&gt;Every Notion database has a UUID that can be found in the URL. For example, here’s the URL for this website’s Content database:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;&lt;a href=&#39;https://www.samurailink3.com/118b678642418065bd9eeb8a463491cf?v=118b6786424181de8359000c0111fac0&#39;&gt;https://www.samurailink3.com/118b678642418065bd9eeb8a463491cf?v=118b6786424181de8359000c0111fac0&lt;/a&gt;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;In this case &lt;code&gt;118b678642418065bd9eeb8a463491cf&lt;/code&gt; would be the ID&lt;/p&gt;&#xA;&lt;p&gt;This uses our random UUID namespaces set above to create three brand new UUIDs from that one ID:&lt;/p&gt;&#xA;&lt;code&gt;path1 := uuid.NewHash(sha256.New(), uuidSecretPathNamespace1, []byte(id), 5)&#xA;path2 := uuid.NewHash(sha256.New(), uuidSecretPathNamespace2, []byte(id), 5)&#xA;path3 := uuid.NewHash(sha256.New(), uuidSecretPathNamespace3, []byte(id), 5)&lt;/code&gt;&#xA;&lt;p&gt;Then we string that together:&lt;/p&gt;&#xA;&lt;code&gt;return path1.String() + &#34;/&#34; + path2.String() + &#34;/&#34; + path3.String() + &#34;.ics&#34;&lt;/code&gt;&#xA;&lt;p&gt;And that gives us our S3 “secret” URL.&lt;/p&gt;&#xA;&lt;p&gt;It ends up looking like this:&lt;/p&gt;&#xA;&lt;p&gt;https://www.example.com/3df81e72-0cae-460c-b0d0-b9dae9a60c52/f1160061-07d0-457f-9281-45e38366fd3a/9578670a-5b34-444e-8cf9-e21d99799d63.ics&lt;/p&gt;&#xA;&lt;p&gt;And because this is based on the underlying Notion database ID, its consistent.&lt;/p&gt;&#xA;&lt;p&gt;The rest of the project just involved me reading the RFCs for &lt;a href=&#39;https://www.rfc-editor.org/rfc/rfc5545&#39;&gt;iCal objects&lt;/a&gt; and &lt;a href=&#39;https://www.rfc-editor.org/rfc/rfc5546.html&#39;&gt;iCal Interoperability&lt;/a&gt;, then using &lt;a href=&#39;http://github.com/emersion/go-ical&#39;&gt;github.com/emersion/go-ical&lt;/a&gt; to build a calendar of events.&lt;/p&gt;&#xA;&lt;h1&gt;Future plans&lt;/h1&gt;&#xA;&lt;p&gt;I’m trying out using Notion as a household organizer, so eventually, both my and my wife’s todo items will be in a shared database. When we do that, I’d like to be able to generate different iCal files based on assignee. Easy enough to do, I just need to find the time to do it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;/html&gt;</content>
    <link href="https://www.samurailink3.com/Notion-Calendar-Exporter-119b6786424180ec82f8facf2a806b3b" rel="alternate"></link>
    <author>
      <name>Tom Webster</name>
    </author>
  </entry>
  <entry>
    <title>Armored Core 6 Affinity Launcher</title>
    <updated>2024-10-08T00:00:00Z</updated>
    <id>https://www.samurailink3.com/Armored-Core-6-Affinity-Launcher-119b67864241801bb309d7be9dbe95b4</id>
    <content type="html">&lt;html&gt;&lt;p&gt;The AC6Launcher is a small project that launches Armored Core 6 (or the AC6 Coop Launcher) without the stutters. The launcher sets the CPU affinity of &lt;code&gt;armoredcore6.exe&lt;/code&gt; and bans the use of CPU0. This is a common solution to stop AC6 from severe stuttering.&lt;/p&gt;&#xA;&lt;h1&gt;Where to get it&lt;/h1&gt;&#xA;&lt;a href=&#39;https://gitlab.com/samurailink3/ac6launcher&#39;&gt;https://gitlab.com/samurailink3/ac6launcher&lt;/a&gt;&#xA;&lt;p&gt;Instructions are on the Readme on that page.&lt;/p&gt;&#xA;&lt;h1&gt;How it works&lt;/h1&gt;&#xA;&lt;ul&gt;&lt;li&gt;Launches AC6, either through the standard &lt;/li&gt;&lt;li&gt;&lt;code&gt;armoredcore6.exe&lt;/code&gt;&lt;/li&gt;&lt;li&gt; or the Coop Launcher &lt;/li&gt;&lt;li&gt;&lt;code&gt;ac6_for_coop_launcher.exe&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;ul&gt;&lt;li&gt;Watches for &lt;/li&gt;&lt;li&gt;&lt;code&gt;armoredcore6.exe&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;ul&gt;&lt;li&gt;After it finds the process, wait 15 seconds then…&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;ul&gt;&lt;li&gt;Sets CPU affinity to block only the first processor&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;ul&gt;&lt;li&gt;No more stutters 🙂&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;h1&gt;Background (aka story time)&lt;/h1&gt;&#xA;&lt;p&gt;Armored Core 6 has a &lt;a href=&#39;https://steamcommunity.com/app/1888160/discussions/0/3820795131605305341/?ctp=11&#39;&gt;well&lt;/a&gt; &lt;a href=&#39;https://www.reddit.com/r/armoredcore/comments/1cz32wl/how_do_i_make_my_ac6_stop_stuttering_so_hard/&#39;&gt;documented&lt;/a&gt; &lt;a href=&#39;https://steamcommunity.com/app/1888160/discussions/0/3820795131610074167/&#39;&gt;problem&lt;/a&gt; with stuttering on some systems. Stuttering was so bad that pre-rendered cutscene FMVs would continue playing for a full minute after the audio completed. It was &lt;i&gt;bad&lt;/i&gt;. Originally, this stuttering led me to just outright refund the game on Steam, but recently I decided to give it another shot.&lt;/p&gt;&#xA;&lt;p&gt;One very strange suggestion led me to setting core affinity on the &lt;code&gt;armoredcore6.exe&lt;/code&gt; process to ban the use of &lt;code&gt;CPU0&lt;/code&gt;, the first CPU core. Suddenly, no more stutters. It was magical. So the workflow was now:&lt;/p&gt;&#xA;&lt;ul&gt;&lt;li&gt;Launch AC6, either through &lt;/li&gt;&lt;li&gt;&lt;a href=&#39;https://www.nexusmods.com/armoredcore6firesofrubicon/mods/3&#39;&gt;the excellent Armored Core Coop Mod&lt;/a&gt;&lt;/li&gt;&lt;li&gt; or regularly through Steam&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;ul&gt;&lt;li&gt;Open Task Manager&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;ul&gt;&lt;li&gt;Navigate to the &lt;/li&gt;&lt;li&gt;&lt;i&gt;Details&lt;/i&gt;&lt;/li&gt;&lt;li&gt; tab&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;ul&gt;&lt;li&gt;Right click &lt;/li&gt;&lt;li&gt;&lt;code&gt;armoredcore6.exe&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;ul&gt;&lt;li&gt;&lt;i&gt;Set affinity&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;ul&gt;&lt;li&gt;Unchcked &lt;/li&gt;&lt;li&gt;&lt;code&gt;CPU 0&lt;/code&gt;&lt;/li&gt;&lt;li&gt; and press &lt;/li&gt;&lt;li&gt;&lt;i&gt;OK&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;p&gt;The main issue with this is that you need to do this &lt;i&gt;every time you launch the game&lt;/i&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I would regularly load into a mission, spend a few minutes wondering why it felt so bad to play, then remembering that I needed to do the &lt;i&gt;Task Manager Dance&lt;/i&gt; to get a good gameplay experience.&lt;/p&gt;&#xA;&lt;p&gt;Several other posters who had encountered this problem suggested using &lt;a href=&#39;https://bitsum.com/&#39;&gt;Process Lasso&lt;/a&gt; to force AC6 away from CPU0. I didn’t want yet another piece of software running just to manage a different piece of software that was being buggy, so I tried to make my own solution. First step: Simple batch file.&lt;/p&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;p&gt;Stack Overflow led me to this result:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#39;https://superuser.com/questions/908848/how-do-i-permanently-set-the-affinity-of-a-process&#39;&gt;https://superuser.com/questions/908848/how-do-i-permanently-set-the-affinity-of-a-process&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;So I should be able to launch the game with something similar to: &lt;code&gt;X:\Windows\System32\cmd.exe /C start /affinity Y game.exe&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;But this didn’t work…&lt;/p&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;p&gt;I’m running AC6 through the Coop mod, which has its own launcher executable. If I launched the multiplayer launcher with custom affinity set, it would instantly crash. Furthermore, setting &lt;i&gt;any&lt;/i&gt; affinity on the multiplayer launcher didn’t pass that affinity to &lt;code&gt;armoredcore6.exe&lt;/code&gt; (you’d need to specifically launch sub-processes with affinity inherited from the parent process). Dead end.&lt;/p&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;p&gt;I needed to create my own &lt;i&gt;launcher launcher&lt;/i&gt;. A launcher to launch the launcher that launches the game. Here’s the rough steps for my application:&lt;/p&gt;&#xA;&lt;ul&gt;&lt;li&gt;Launch &lt;/li&gt;&lt;li&gt;&lt;code&gt;ac6_for_coop_launcher.exe&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;ul&gt;&lt;li&gt;Grab the process table and look for &lt;/li&gt;&lt;li&gt;&lt;code&gt;armoredcore6.exe&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;ul&gt;&lt;li&gt;Once you have the AC6 PID, wait and…&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;ul&gt;&lt;li&gt;Set  the process affinity to use all cores &lt;/li&gt;&lt;li&gt;&lt;strong&gt;except CPU 0&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;a href=&#39;https://media0.giphy.com/media/KEYEpIngcmXlHetDqz/giphy.gif?cid=7941fdc6c7h5naqhca0vfw7sji9nml5jwtlgps1ht7fp2sxn&amp;ep=v1_gifs_search&amp;rid=giphy.gif&amp;ct=g&#39;&gt;&lt;img style =&#39;width:50vw;&#39; src=&#39;https://media0.giphy.com/media/KEYEpIngcmXlHetDqz/giphy.gif?cid=7941fdc6c7h5naqhca0vfw7sji9nml5jwtlgps1ht7fp2sxn&amp;ep=v1_gifs_search&amp;rid=giphy.gif&amp;ct=g&#39; alt=&#39;Unfortunately, the Notion API does not expose Alt-Text, so please open the full link if you need that.&#39;&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;p&gt;This project was relatively simple to put together, but did require me to dig into using Windows syscalls, which I don’t have a ton of experience with. I ended up testing out Notion’s AI here and it did a pretty acceptable job! I gave it a page with my current research and had it take a crack at solving the problem.&lt;/p&gt;&#xA;&lt;p&gt;Initially the AI did a great job at building the boilerplate of the application, &lt;a href=&#39;https://gitlab.com/samurailink3/ac6launcher/-/blob/bc79ed2723863169ae7b3b81dff050923ece37bc/main.go#L65-88&#39;&gt;including this findProcess function&lt;/a&gt;, but struggled in some other areas. Initially it wanted me to use some deprecated syscall functions. Then it often suggested using &lt;code&gt;windows.SetProcessAffinityMask&lt;/code&gt;, &lt;a href=&#39;https://pkg.go.dev/golang.org/x/sys@v0.26.0/windows&#39;&gt;which doesn’t exist&lt;/a&gt;. Then it caught a bug it had introduced which was setting an invalid number of processors in the affinity mask. In the end, it suggested this bit of code that solved that particular issue:&lt;/p&gt;&#xA;&lt;code&gt;&#x9;// Set affinity mask&#xA;&#x9;mask := ^uintptr(1)&#xA;&#x9;numCPU := runtime.NumCPU()&#xA;&#x9;if numCPU &lt; 64 {&#xA;&#x9;&#x9;mask = (1 &lt;&lt; numCPU) - 2&#xA;&#x9;}&lt;/code&gt;&#xA;&lt;p&gt;As a disclaimer, I hate bit-math. So I did a bunch of manual testing and it seems like it did the trick.&lt;/p&gt;&#xA;&lt;p&gt;I’m still experimenting with using AI in programming and GameDev tasks. I have a lot of opinions on AI (room-temperature takes, mostly), but was mostly pleasantly surprised with how it saved me time with this micro-project.&lt;/p&gt;&#xA;&lt;p&gt;In the end, I ended up &lt;i&gt;very lightly cleaning up&lt;/i&gt; the code and writing some docs. I released the code as Public Domain software via &lt;a href=&#39;https://unlicense.org/&#39;&gt;The Unlicense&lt;/a&gt;. If you’d like to contribute in any way, send a PR on GitLab.&lt;/p&gt;&#xA;&lt;p&gt;In the meantime, I’ll be playing Armored Core 6 - without the stutters.&lt;/p&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;/html&gt;</content>
    <link href="https://www.samurailink3.com/Armored-Core-6-Affinity-Launcher-119b67864241801bb309d7be9dbe95b4" rel="alternate"></link>
    <author>
      <name>Tom Webster</name>
    </author>
  </entry>
  <entry>
    <title>Shampoo Bottle Holder</title>
    <updated>2024-08-22T00:00:00Z</updated>
    <id>https://www.samurailink3.com/Shampoo-Bottle-Holder-11ab67864241807da1d6e659e72eeb1e</id>
    <content type="html">&lt;html&gt;&lt;a href=&#39;https://www.printables.com/model/982501-shampoo-bottle-holder&#39;&gt;https://www.printables.com/model/982501-shampoo-bottle-holder&lt;/a&gt;&#xA;&lt;p&gt;Source CAD: &lt;/p&gt;&#xA;&lt;a href=&#39;https://cad.onshape.com/documents/0057d60a310f9d47d1d05498/w/fd362080d23c943c671fff1f/e/c831359f6a1c21b1a3a33d82?renderMode=0&amp;uiState=66c756aa4d558b234dfba1db&#39;&gt;https://cad.onshape.com/documents/0057d60a310f9d47d1d05498/w/fd362080d23c943c671fff1f/e/c831359f6a1c21b1a3a33d82?renderMode=0&amp;uiState=66c756aa4d558b234dfba1db&lt;/a&gt;&#xA;&lt;p&gt;A tiny 3D design project I finished. This holds my shampoo/conditioner bottles upright or upside-down if its getting to the bottom of the bottle. More information can be found on the Printables page.&lt;/p&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;/html&gt;</content>
    <link href="https://www.samurailink3.com/Shampoo-Bottle-Holder-11ab67864241807da1d6e659e72eeb1e" rel="alternate"></link>
    <author>
      <name>Tom Webster</name>
    </author>
  </entry>
  <entry>
    <title>Tom’s Easy Wireguard Setup Script</title>
    <updated>2024-07-09T00:00:00Z</updated>
    <id>https://www.samurailink3.com/Tom-s-Easy-Wireguard-Setup-Script-11ab67864241807e801fd0fbd80a08ae</id>
    <content type="html">&lt;html&gt;&lt;a href=&#39;https://github.com/samurailink3/TomsEasyWireguardSetupScript&#39;&gt;https://github.com/samurailink3/TomsEasyWireguardSetupScript&lt;/a&gt;&#xA;&lt;p&gt;I built this project to easily set up Wireguard config files for game servers. I run a lot of private game servers and I needed a way to quickly generate ~10 Wireguard configs for my server, myself, and my friends. If you need to set up a Hamachi-like VPN for your friends, this makes it easy.&lt;/p&gt;&#xA;&lt;p&gt;This simple bash script is designed to be used interactively or automatically via environment variables. More information available on the GitHub page.&lt;/p&gt;&#xA;&lt;hr/&gt;&#xA;&lt;h3&gt;🦋 Interact with this post on Bluesky:&lt;/h3&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&#xA;&lt;a href=&#39;https://bsky.app/profile/samurailink3.com/post/3lb62t2pg5k2b&#39;&gt;https://bsky.app/profile/samurailink3.com/post/3lb62t2pg5k2b&lt;/a&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;/html&gt;</content>
    <link href="https://www.samurailink3.com/Tom-s-Easy-Wireguard-Setup-Script-11ab67864241807e801fd0fbd80a08ae" rel="alternate"></link>
    <author>
      <name>Tom Webster</name>
    </author>
  </entry>
  <entry>
    <title>Tom’s Parametric Pill Case</title>
    <updated>2024-06-25T00:00:00Z</updated>
    <id>https://www.samurailink3.com/Tom-s-Parametric-Pill-Case-11ab678642418029b61cce6a8d4e5cd4</id>
    <content type="html">&lt;html&gt;&lt;a href=&#39;https://www.printables.com/model/923492-toms-parametric-pill-case&#39;&gt;https://www.printables.com/model/923492-toms-parametric-pill-case&lt;/a&gt;&#xA;&lt;p&gt;I have some pretty unique use-cases for a pill case:&lt;/p&gt;&#xA;&lt;ul&gt;&lt;li&gt;Fit A LOT of pills (~15)&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;ul&gt;&lt;li&gt;Fit BIG pills (like Calcium)&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;ul&gt;&lt;li&gt;Stay closed when I want it to be closed&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;ul&gt;&lt;li&gt;Don’t be a massive pain to open when I want it open&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;ul&gt;&lt;li&gt;Be a single-unit case, I don’t want to lose the “lid” randomly&lt;/li&gt;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;p&gt;So I built this. References and more details are available on the Printables page.&lt;/p&gt;&#xA;&lt;hr/&gt;&#xA;&lt;h3&gt;🦋 Interact with this post on Bluesky:&lt;/h3&gt;&#xA;&#xA;&lt;a href=&#39;https://bsky.app/profile/samurailink3.com/post/3lb4ikhoras2q&#39;&gt;https://bsky.app/profile/samurailink3.com/post/3lb4ikhoras2q&lt;/a&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;/html&gt;</content>
    <link href="https://www.samurailink3.com/Tom-s-Parametric-Pill-Case-11ab678642418029b61cce6a8d4e5cd4" rel="alternate"></link>
    <author>
      <name>Tom Webster</name>
    </author>
  </entry>
  <entry>
    <title>Door Handle Slammer Stopper - My Stupidest Useful 3D Print</title>
    <updated>2024-03-05T00:00:00Z</updated>
    <id>https://www.samurailink3.com/Door-Handle-Slammer-Stopper-My-Stupidest-Useful-3D-Print-143b6786424180f0abf1c39fe6bde9c9</id>
    <content type="html">&lt;html&gt;&lt;p&gt;For the most part, I love my house. Its fairly well-built and doesn’t need a lot of fuss or maintenance. Great “first house” kind of place. That said, there’s one area that’s just &lt;i&gt;bad&lt;/i&gt;. Its not critical, &lt;i&gt;its just dumb&lt;/i&gt; and that makes it even worse:&lt;/p&gt;&#xA;&lt;a href=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/b1420efb-1cb1-454e-895d-6bcb328f7ca7/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB466WCHTA54W%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112322Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBoaCXVzLXdlc3QtMiJIMEYCIQD3pKfgYSkbUrn%2Bwbg26HEBpkwk6TF%2BDeDs4H%2FwhxiguwIhANNjpXOIlDvj0B%2BFC2RslDVEjdsSadiKUNmiFsOSgZD4KogECOP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEQABoMNjM3NDIzMTgzODA1IgyytcjiZEN%2BLy8TCmIq3AMm8ISchXwaHqUJ9rrijSD3UleELfe%2FnopiqAKT6XlmQb83zc8C63dVZkuP4llAWd01IlTXjPk2NF%2B5We3CnDHxUkvTwBFchKRZ3j8%2BUkP3GIUoHKBJAzDCyp8wg1FiejW%2FRVL%2FCYjclXe%2BKJDqMXB%2FimMjxtocjzsEvZpBBOe7tImHNFAGLI84ZBdnA2Nja6uPdyTEJcjKQ%2BbESfYE9tNNny%2FhDQH3zAXv03NdyZaouh9DFRNMHG6NBz%2BCa1l5T7t1PHlHW36eSwXfWqNrWmLb7TqfB9gFVBaZQ3zJc7wq6ZwjfTqioBsqJg2lthgHYXWU%2BPhkN7IF6r7Luk%2BnXxIlJwiuP%2ByUbKrKm0946wIUGA6FDKlEuYZzs3AKOjU%2FYbttDuY5QHXkvsotwGTh2JS8%2FUwgoA6ytimn%2FoiaA8wZFJ1ewrbbY4qcwLUK6f8UJsB3XdvmUmcdAuFx0iwmkZqKC1gRPJ79GftKzbTFtmRwC%2BVxKq2Ops06wW5Ce7qclYhY5DK5BeavEjqM64QxqvZ3c7p3Aa%2BC5WjAT9PBOl%2BiqcibXTUjtmM6z9KYUz5Lo%2FpGVIjWrbfH7IdI7S9OVK4aW%2FMC5CrkMIJ05A0xNoabu%2FWxX8ZDZev2aCNTwDDF%2F%2FvPBjqkAdZcHZ9DjjDnrOeMq4orDn9FPJzEN06uv8925UHv2zgH2RoMX2VPwAY%2FFIuAe1FGzWIphAKc5fHUGgQVKD7QJja151WadZt7SaCwL%2Bm%2FKgWnXmajj96n7mjvleebY3sWhjWxh2fj83xsg%2FCh1YDGEz6v6iS68LU%2FWiPZuS2Aw4H5TkpDc7KhucPc8ZwoPF%2FGKeKgHayDc6kYXKQFJPv9a64s0XUw&amp;X-Amz-Signature=e927f5b313fcf593983cc512ae4b011acf056f9051c8d198d8465fd915207e3a&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39;&gt;&lt;img style =&#39;width:50vw;&#39; src=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/b1420efb-1cb1-454e-895d-6bcb328f7ca7/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB466WCHTA54W%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112322Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBoaCXVzLXdlc3QtMiJIMEYCIQD3pKfgYSkbUrn%2Bwbg26HEBpkwk6TF%2BDeDs4H%2FwhxiguwIhANNjpXOIlDvj0B%2BFC2RslDVEjdsSadiKUNmiFsOSgZD4KogECOP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEQABoMNjM3NDIzMTgzODA1IgyytcjiZEN%2BLy8TCmIq3AMm8ISchXwaHqUJ9rrijSD3UleELfe%2FnopiqAKT6XlmQb83zc8C63dVZkuP4llAWd01IlTXjPk2NF%2B5We3CnDHxUkvTwBFchKRZ3j8%2BUkP3GIUoHKBJAzDCyp8wg1FiejW%2FRVL%2FCYjclXe%2BKJDqMXB%2FimMjxtocjzsEvZpBBOe7tImHNFAGLI84ZBdnA2Nja6uPdyTEJcjKQ%2BbESfYE9tNNny%2FhDQH3zAXv03NdyZaouh9DFRNMHG6NBz%2BCa1l5T7t1PHlHW36eSwXfWqNrWmLb7TqfB9gFVBaZQ3zJc7wq6ZwjfTqioBsqJg2lthgHYXWU%2BPhkN7IF6r7Luk%2BnXxIlJwiuP%2ByUbKrKm0946wIUGA6FDKlEuYZzs3AKOjU%2FYbttDuY5QHXkvsotwGTh2JS8%2FUwgoA6ytimn%2FoiaA8wZFJ1ewrbbY4qcwLUK6f8UJsB3XdvmUmcdAuFx0iwmkZqKC1gRPJ79GftKzbTFtmRwC%2BVxKq2Ops06wW5Ce7qclYhY5DK5BeavEjqM64QxqvZ3c7p3Aa%2BC5WjAT9PBOl%2BiqcibXTUjtmM6z9KYUz5Lo%2FpGVIjWrbfH7IdI7S9OVK4aW%2FMC5CrkMIJ05A0xNoabu%2FWxX8ZDZev2aCNTwDDF%2F%2FvPBjqkAdZcHZ9DjjDnrOeMq4orDn9FPJzEN06uv8925UHv2zgH2RoMX2VPwAY%2FFIuAe1FGzWIphAKc5fHUGgQVKD7QJja151WadZt7SaCwL%2Bm%2FKgWnXmajj96n7mjvleebY3sWhjWxh2fj83xsg%2FCh1YDGEz6v6iS68LU%2FWiPZuS2Aw4H5TkpDc7KhucPc8ZwoPF%2FGKeKgHayDc6kYXKQFJPv9a64s0XUw&amp;X-Amz-Signature=e927f5b313fcf593983cc512ae4b011acf056f9051c8d198d8465fd915207e3a&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39; alt=&#39;Unfortunately, the Notion API does not expose Alt-Text, so please open the full link if you need that.&#39;&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;&#xA;&lt;p&gt;&lt;i&gt;Oh my god I hate it.&lt;/i&gt;&lt;/p&gt;&#xA;&lt;p&gt;So, if you’re coming home from the store and are holding a heavy package: You paw at the garage door to unlatch it, then bump your way into the door to swing it open. This causes the two door handles to forcefully collide with each other.&lt;/p&gt;&#xA;&lt;p&gt;&lt;i&gt;Ugh.&lt;/i&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;p&gt;So I made two stupid circles and stuck them together:&lt;/p&gt;&#xA;&lt;a href=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/8983387a-6dc8-428d-90a6-d43b086b4201/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB466WCHTA54W%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112322Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBoaCXVzLXdlc3QtMiJIMEYCIQD3pKfgYSkbUrn%2Bwbg26HEBpkwk6TF%2BDeDs4H%2FwhxiguwIhANNjpXOIlDvj0B%2BFC2RslDVEjdsSadiKUNmiFsOSgZD4KogECOP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEQABoMNjM3NDIzMTgzODA1IgyytcjiZEN%2BLy8TCmIq3AMm8ISchXwaHqUJ9rrijSD3UleELfe%2FnopiqAKT6XlmQb83zc8C63dVZkuP4llAWd01IlTXjPk2NF%2B5We3CnDHxUkvTwBFchKRZ3j8%2BUkP3GIUoHKBJAzDCyp8wg1FiejW%2FRVL%2FCYjclXe%2BKJDqMXB%2FimMjxtocjzsEvZpBBOe7tImHNFAGLI84ZBdnA2Nja6uPdyTEJcjKQ%2BbESfYE9tNNny%2FhDQH3zAXv03NdyZaouh9DFRNMHG6NBz%2BCa1l5T7t1PHlHW36eSwXfWqNrWmLb7TqfB9gFVBaZQ3zJc7wq6ZwjfTqioBsqJg2lthgHYXWU%2BPhkN7IF6r7Luk%2BnXxIlJwiuP%2ByUbKrKm0946wIUGA6FDKlEuYZzs3AKOjU%2FYbttDuY5QHXkvsotwGTh2JS8%2FUwgoA6ytimn%2FoiaA8wZFJ1ewrbbY4qcwLUK6f8UJsB3XdvmUmcdAuFx0iwmkZqKC1gRPJ79GftKzbTFtmRwC%2BVxKq2Ops06wW5Ce7qclYhY5DK5BeavEjqM64QxqvZ3c7p3Aa%2BC5WjAT9PBOl%2BiqcibXTUjtmM6z9KYUz5Lo%2FpGVIjWrbfH7IdI7S9OVK4aW%2FMC5CrkMIJ05A0xNoabu%2FWxX8ZDZev2aCNTwDDF%2F%2FvPBjqkAdZcHZ9DjjDnrOeMq4orDn9FPJzEN06uv8925UHv2zgH2RoMX2VPwAY%2FFIuAe1FGzWIphAKc5fHUGgQVKD7QJja151WadZt7SaCwL%2Bm%2FKgWnXmajj96n7mjvleebY3sWhjWxh2fj83xsg%2FCh1YDGEz6v6iS68LU%2FWiPZuS2Aw4H5TkpDc7KhucPc8ZwoPF%2FGKeKgHayDc6kYXKQFJPv9a64s0XUw&amp;X-Amz-Signature=78a5171298509dbb1ace7910ba4cb52afb176f704990d6d238387f158acbb1ce&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39;&gt;&lt;img style =&#39;width:50vw;&#39; src=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/8983387a-6dc8-428d-90a6-d43b086b4201/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB466WCHTA54W%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112322Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBoaCXVzLXdlc3QtMiJIMEYCIQD3pKfgYSkbUrn%2Bwbg26HEBpkwk6TF%2BDeDs4H%2FwhxiguwIhANNjpXOIlDvj0B%2BFC2RslDVEjdsSadiKUNmiFsOSgZD4KogECOP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEQABoMNjM3NDIzMTgzODA1IgyytcjiZEN%2BLy8TCmIq3AMm8ISchXwaHqUJ9rrijSD3UleELfe%2FnopiqAKT6XlmQb83zc8C63dVZkuP4llAWd01IlTXjPk2NF%2B5We3CnDHxUkvTwBFchKRZ3j8%2BUkP3GIUoHKBJAzDCyp8wg1FiejW%2FRVL%2FCYjclXe%2BKJDqMXB%2FimMjxtocjzsEvZpBBOe7tImHNFAGLI84ZBdnA2Nja6uPdyTEJcjKQ%2BbESfYE9tNNny%2FhDQH3zAXv03NdyZaouh9DFRNMHG6NBz%2BCa1l5T7t1PHlHW36eSwXfWqNrWmLb7TqfB9gFVBaZQ3zJc7wq6ZwjfTqioBsqJg2lthgHYXWU%2BPhkN7IF6r7Luk%2BnXxIlJwiuP%2ByUbKrKm0946wIUGA6FDKlEuYZzs3AKOjU%2FYbttDuY5QHXkvsotwGTh2JS8%2FUwgoA6ytimn%2FoiaA8wZFJ1ewrbbY4qcwLUK6f8UJsB3XdvmUmcdAuFx0iwmkZqKC1gRPJ79GftKzbTFtmRwC%2BVxKq2Ops06wW5Ce7qclYhY5DK5BeavEjqM64QxqvZ3c7p3Aa%2BC5WjAT9PBOl%2BiqcibXTUjtmM6z9KYUz5Lo%2FpGVIjWrbfH7IdI7S9OVK4aW%2FMC5CrkMIJ05A0xNoabu%2FWxX8ZDZev2aCNTwDDF%2F%2FvPBjqkAdZcHZ9DjjDnrOeMq4orDn9FPJzEN06uv8925UHv2zgH2RoMX2VPwAY%2FFIuAe1FGzWIphAKc5fHUGgQVKD7QJja151WadZt7SaCwL%2Bm%2FKgWnXmajj96n7mjvleebY3sWhjWxh2fj83xsg%2FCh1YDGEz6v6iS68LU%2FWiPZuS2Aw4H5TkpDc7KhucPc8ZwoPF%2FGKeKgHayDc6kYXKQFJPv9a64s0XUw&amp;X-Amz-Signature=78a5171298509dbb1ace7910ba4cb52afb176f704990d6d238387f158acbb1ce&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39; alt=&#39;Unfortunately, the Notion API does not expose Alt-Text, so please open the full link if you need that.&#39;&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;&#xA;&lt;p&gt;Then I printed that in TPU and stretched it over the door handle.&lt;/p&gt;&#xA;&lt;p&gt;Now:&lt;/p&gt;&#xA;&lt;a href=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/0eefe606-56c9-4b97-8b4b-4ca0446c970e/IMG_2382-1.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB466VB7WLQCM%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112322Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBoaCXVzLXdlc3QtMiJHMEUCIQDT7cw7ruit5ef3eWQsHSZhG8F5DlZFd7dRDfotag86mwIgR03vFs9pjObYfpaAiFuwJNIfOwk%2F2Wl3dQeMfnTQ1dIqiAQI4%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDDCiBXUX%2FFWmjhbceSrcAzhHcgGBMbs5XkAN3Qjyr7t4IykbBsIZNSpeAQH%2BusG0wYC1pWPc73b6rBkth6Tl67j%2Fg8721nGs%2FV2eGsfA5s7aEp1VpoJhYDhsC4gGcq0ONnFiyD2HShuBXgAEjj6DONd%2BRbesoS%2BD62JN%2FsYYBTM%2F7DiAm0Zq4D2Bxf5DeDZK%2FipGt9mODaq0LNemnfVkkPFpXSdLcHIVLbK8ByEW7L41x2KYU0g1fz9TErFk1tnJFWtJsAJQwISy2vL%2Bx%2Fauu0toYYDX4qmdsY%2BsmMJM9qXHhYdUsFloqtwSr0dHQfzBHFGTkXwn0BGhOAmKlr1paZFMDRZZvfzLaSH4%2FaZ5p1yV5NYfmTltV2Y3H6pg%2FKPzga9wMJm5GvDKd3pGUWkavE2WGJfKrcYqoPYSlRVoj7HmY%2FJbv%2BM4eO0WhgkDS08gtEV34q9tXPXPFBUvVVfp7jOa7sg90%2BujY7i72tenYEmZagCmDMTdZnNws1ittHfXymNiY3ba6zP3Dece10y%2BHpeYXZOeDaJqlF1NtLQ3PMsNCsRe10Jsh1T1vs9dzB0DyMeiR2bybGa97D8oyNld0l9zeM1cVdrf2ayz0yL82%2FFDRsnullGv2emSy3qZmVw3zfXFoB9P%2FB9JLvvBMLiB%2FM8GOqUBaTP12QOjxY0bpPvJ79Gy5QICEPF2s0DsVmZWnmOfhXnW6frla4BQ11tpAIPZFfXaB7ZkcQfW9iDEqTK2KK9KOhvWHHUqlZwbphnuElDSfBmO18siqRUXcHybc501Hm%2ByNnvy6ebDS%2BO0xNr5vT113xq4LSn0lp5P34BEhfCWEYRQ1%2BCeRqCgNbVbP8CQKFzrUK%2FvYcScY5g7yI0tAHrKHLaGHBKq&amp;X-Amz-Signature=47b86ad2d6fa36c52abce8736aefe0b6b06a4da68ab8c0ae85f5eeae7ee1b788&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39;&gt;&lt;img style =&#39;width:50vw;&#39; src=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/0eefe606-56c9-4b97-8b4b-4ca0446c970e/IMG_2382-1.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB466VB7WLQCM%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112322Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBoaCXVzLXdlc3QtMiJHMEUCIQDT7cw7ruit5ef3eWQsHSZhG8F5DlZFd7dRDfotag86mwIgR03vFs9pjObYfpaAiFuwJNIfOwk%2F2Wl3dQeMfnTQ1dIqiAQI4%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDDCiBXUX%2FFWmjhbceSrcAzhHcgGBMbs5XkAN3Qjyr7t4IykbBsIZNSpeAQH%2BusG0wYC1pWPc73b6rBkth6Tl67j%2Fg8721nGs%2FV2eGsfA5s7aEp1VpoJhYDhsC4gGcq0ONnFiyD2HShuBXgAEjj6DONd%2BRbesoS%2BD62JN%2FsYYBTM%2F7DiAm0Zq4D2Bxf5DeDZK%2FipGt9mODaq0LNemnfVkkPFpXSdLcHIVLbK8ByEW7L41x2KYU0g1fz9TErFk1tnJFWtJsAJQwISy2vL%2Bx%2Fauu0toYYDX4qmdsY%2BsmMJM9qXHhYdUsFloqtwSr0dHQfzBHFGTkXwn0BGhOAmKlr1paZFMDRZZvfzLaSH4%2FaZ5p1yV5NYfmTltV2Y3H6pg%2FKPzga9wMJm5GvDKd3pGUWkavE2WGJfKrcYqoPYSlRVoj7HmY%2FJbv%2BM4eO0WhgkDS08gtEV34q9tXPXPFBUvVVfp7jOa7sg90%2BujY7i72tenYEmZagCmDMTdZnNws1ittHfXymNiY3ba6zP3Dece10y%2BHpeYXZOeDaJqlF1NtLQ3PMsNCsRe10Jsh1T1vs9dzB0DyMeiR2bybGa97D8oyNld0l9zeM1cVdrf2ayz0yL82%2FFDRsnullGv2emSy3qZmVw3zfXFoB9P%2FB9JLvvBMLiB%2FM8GOqUBaTP12QOjxY0bpPvJ79Gy5QICEPF2s0DsVmZWnmOfhXnW6frla4BQ11tpAIPZFfXaB7ZkcQfW9iDEqTK2KK9KOhvWHHUqlZwbphnuElDSfBmO18siqRUXcHybc501Hm%2ByNnvy6ebDS%2BO0xNr5vT113xq4LSn0lp5P34BEhfCWEYRQ1%2BCeRqCgNbVbP8CQKFzrUK%2FvYcScY5g7yI0tAHrKHLaGHBKq&amp;X-Amz-Signature=47b86ad2d6fa36c52abce8736aefe0b6b06a4da68ab8c0ae85f5eeae7ee1b788&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39; alt=&#39;Unfortunately, the Notion API does not expose Alt-Text, so please open the full link if you need that.&#39;&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;&#xA;&#xA;&lt;a href=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/a8961ccf-2ef4-4826-bdd6-9e32dd354a2f/IMG_2383.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB466V5C3YGGS%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112322Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBoaCXVzLXdlc3QtMiJHMEUCIF%2Fr2ci3dN0l85bCYpW0G21V%2F734HCfD1t1RsvvlKxTxAiEAtVbCd6G5pG3hce6IkwUN7FRSv0aXAll4A8R3EbZU7eMqiAQI4%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDOQ5c0%2FzUKXk1VJACyrcA5dYQFK7HX7TCOKSxvubKw2Gg4Px2tnY6IyPZVgr41vGHP1IEA44xYzeacbF9kXbvWJLICnF9Hlda3bmzsQoa3q%2B%2FHNAIJ48Q3CHjgN90DHwiZzXY0rXCXN%2BU%2Fc5rbSQvzKKedKyfVw5QZylLdQ0fqq2JIJZG8vTTlsR7OVlcYqUISY8CisuhZZu%2Fp55q8ko2JBtWeGJEBFLMlGfvqlGI%2B%2FXmHYQ6Ofp9lIG6KgzsnlWYBzTSWWEU6Ud9BRAlWmRWl3PbmDToJjKSxbogJsyKCfy2weOUz%2BtTGRCTmusqYq%2F7LHH0FmQl2sXgKUoImjtqv5QhCSwZNasPk0nvIQtkx%2FMQLRCwLYy%2BcfQSg7XAxRAZgRt3BU1upqDSZA0zIYSIkPb6oJN2j3K5ziAUD15pwo3uBLrQ%2Ber1%2B1Texu3VNDzfKso3IcLhv6Ig5CuR5Mk2EQ4ok3qQu28kRRNc8gTLuC52qISUXfIqBXEpYto9prLO1dC%2B5K3paU57%2FP23ZRdnJ5fVfQkVaCvQm3MiVQ%2BntAneBTjx%2BmYSjuHjAyIDD6Ml2D6rC7PVR7s3m6zgHlzrrB%2FuI8cZA%2BvQwTPVVFJql6C%2FJAlIx4POIA2z4d284KOv2T%2BpQhPtojxyhPIMPuB%2FM8GOqUBQSQ47p%2Fa3m6YeaEUEZX7xVntzxF4z2DeFxte%2BUpkeIrnl%2F7lSmsrPlKLvR6L2w2QdKHKf7X3O%2FtQsQXznSFFJFuMu5BxJF7r5WM2%2BsaG0CpdiLJfqog%2BJH9IoyArABpJn0kqb1oSttgTYFfiVhfJFyT81UorV18%2FpPD88HMWS8X%2Bob7wHb7vk2b3aNmLtEKw3UoNek4Fyuo2bVA74jylagYfnvUB&amp;X-Amz-Signature=7e6dbb8f0adfb040bae7d227bafa82c3fdd3c58cca3a6a4f65812f67f53ce24b&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39;&gt;&lt;img style =&#39;width:50vw;&#39; src=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/a8961ccf-2ef4-4826-bdd6-9e32dd354a2f/IMG_2383.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB466V5C3YGGS%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112322Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBoaCXVzLXdlc3QtMiJHMEUCIF%2Fr2ci3dN0l85bCYpW0G21V%2F734HCfD1t1RsvvlKxTxAiEAtVbCd6G5pG3hce6IkwUN7FRSv0aXAll4A8R3EbZU7eMqiAQI4%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDOQ5c0%2FzUKXk1VJACyrcA5dYQFK7HX7TCOKSxvubKw2Gg4Px2tnY6IyPZVgr41vGHP1IEA44xYzeacbF9kXbvWJLICnF9Hlda3bmzsQoa3q%2B%2FHNAIJ48Q3CHjgN90DHwiZzXY0rXCXN%2BU%2Fc5rbSQvzKKedKyfVw5QZylLdQ0fqq2JIJZG8vTTlsR7OVlcYqUISY8CisuhZZu%2Fp55q8ko2JBtWeGJEBFLMlGfvqlGI%2B%2FXmHYQ6Ofp9lIG6KgzsnlWYBzTSWWEU6Ud9BRAlWmRWl3PbmDToJjKSxbogJsyKCfy2weOUz%2BtTGRCTmusqYq%2F7LHH0FmQl2sXgKUoImjtqv5QhCSwZNasPk0nvIQtkx%2FMQLRCwLYy%2BcfQSg7XAxRAZgRt3BU1upqDSZA0zIYSIkPb6oJN2j3K5ziAUD15pwo3uBLrQ%2Ber1%2B1Texu3VNDzfKso3IcLhv6Ig5CuR5Mk2EQ4ok3qQu28kRRNc8gTLuC52qISUXfIqBXEpYto9prLO1dC%2B5K3paU57%2FP23ZRdnJ5fVfQkVaCvQm3MiVQ%2BntAneBTjx%2BmYSjuHjAyIDD6Ml2D6rC7PVR7s3m6zgHlzrrB%2FuI8cZA%2BvQwTPVVFJql6C%2FJAlIx4POIA2z4d284KOv2T%2BpQhPtojxyhPIMPuB%2FM8GOqUBQSQ47p%2Fa3m6YeaEUEZX7xVntzxF4z2DeFxte%2BUpkeIrnl%2F7lSmsrPlKLvR6L2w2QdKHKf7X3O%2FtQsQXznSFFJFuMu5BxJF7r5WM2%2BsaG0CpdiLJfqog%2BJH9IoyArABpJn0kqb1oSttgTYFfiVhfJFyT81UorV18%2FpPD88HMWS8X%2Bob7wHb7vk2b3aNmLtEKw3UoNek4Fyuo2bVA74jylagYfnvUB&amp;X-Amz-Signature=7e6dbb8f0adfb040bae7d227bafa82c3fdd3c58cca3a6a4f65812f67f53ce24b&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39; alt=&#39;Unfortunately, the Notion API does not expose Alt-Text, so please open the full link if you need that.&#39;&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;&#xA;&#xA;&#xA;&lt;a href=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/a3e0fe62-2ef9-4ff7-878e-ed26a0366b85/IMG_2384.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB466WCHTA54W%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112322Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBoaCXVzLXdlc3QtMiJIMEYCIQD3pKfgYSkbUrn%2Bwbg26HEBpkwk6TF%2BDeDs4H%2FwhxiguwIhANNjpXOIlDvj0B%2BFC2RslDVEjdsSadiKUNmiFsOSgZD4KogECOP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEQABoMNjM3NDIzMTgzODA1IgyytcjiZEN%2BLy8TCmIq3AMm8ISchXwaHqUJ9rrijSD3UleELfe%2FnopiqAKT6XlmQb83zc8C63dVZkuP4llAWd01IlTXjPk2NF%2B5We3CnDHxUkvTwBFchKRZ3j8%2BUkP3GIUoHKBJAzDCyp8wg1FiejW%2FRVL%2FCYjclXe%2BKJDqMXB%2FimMjxtocjzsEvZpBBOe7tImHNFAGLI84ZBdnA2Nja6uPdyTEJcjKQ%2BbESfYE9tNNny%2FhDQH3zAXv03NdyZaouh9DFRNMHG6NBz%2BCa1l5T7t1PHlHW36eSwXfWqNrWmLb7TqfB9gFVBaZQ3zJc7wq6ZwjfTqioBsqJg2lthgHYXWU%2BPhkN7IF6r7Luk%2BnXxIlJwiuP%2ByUbKrKm0946wIUGA6FDKlEuYZzs3AKOjU%2FYbttDuY5QHXkvsotwGTh2JS8%2FUwgoA6ytimn%2FoiaA8wZFJ1ewrbbY4qcwLUK6f8UJsB3XdvmUmcdAuFx0iwmkZqKC1gRPJ79GftKzbTFtmRwC%2BVxKq2Ops06wW5Ce7qclYhY5DK5BeavEjqM64QxqvZ3c7p3Aa%2BC5WjAT9PBOl%2BiqcibXTUjtmM6z9KYUz5Lo%2FpGVIjWrbfH7IdI7S9OVK4aW%2FMC5CrkMIJ05A0xNoabu%2FWxX8ZDZev2aCNTwDDF%2F%2FvPBjqkAdZcHZ9DjjDnrOeMq4orDn9FPJzEN06uv8925UHv2zgH2RoMX2VPwAY%2FFIuAe1FGzWIphAKc5fHUGgQVKD7QJja151WadZt7SaCwL%2Bm%2FKgWnXmajj96n7mjvleebY3sWhjWxh2fj83xsg%2FCh1YDGEz6v6iS68LU%2FWiPZuS2Aw4H5TkpDc7KhucPc8ZwoPF%2FGKeKgHayDc6kYXKQFJPv9a64s0XUw&amp;X-Amz-Signature=56fc4d1c0f8d3cfc0cc3e4b49add2035f95f700cd554db96ed3ba5ceaae1247b&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39;&gt;&lt;img style =&#39;width:50vw;&#39; src=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/a3e0fe62-2ef9-4ff7-878e-ed26a0366b85/IMG_2384.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB466WCHTA54W%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112322Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBoaCXVzLXdlc3QtMiJIMEYCIQD3pKfgYSkbUrn%2Bwbg26HEBpkwk6TF%2BDeDs4H%2FwhxiguwIhANNjpXOIlDvj0B%2BFC2RslDVEjdsSadiKUNmiFsOSgZD4KogECOP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEQABoMNjM3NDIzMTgzODA1IgyytcjiZEN%2BLy8TCmIq3AMm8ISchXwaHqUJ9rrijSD3UleELfe%2FnopiqAKT6XlmQb83zc8C63dVZkuP4llAWd01IlTXjPk2NF%2B5We3CnDHxUkvTwBFchKRZ3j8%2BUkP3GIUoHKBJAzDCyp8wg1FiejW%2FRVL%2FCYjclXe%2BKJDqMXB%2FimMjxtocjzsEvZpBBOe7tImHNFAGLI84ZBdnA2Nja6uPdyTEJcjKQ%2BbESfYE9tNNny%2FhDQH3zAXv03NdyZaouh9DFRNMHG6NBz%2BCa1l5T7t1PHlHW36eSwXfWqNrWmLb7TqfB9gFVBaZQ3zJc7wq6ZwjfTqioBsqJg2lthgHYXWU%2BPhkN7IF6r7Luk%2BnXxIlJwiuP%2ByUbKrKm0946wIUGA6FDKlEuYZzs3AKOjU%2FYbttDuY5QHXkvsotwGTh2JS8%2FUwgoA6ytimn%2FoiaA8wZFJ1ewrbbY4qcwLUK6f8UJsB3XdvmUmcdAuFx0iwmkZqKC1gRPJ79GftKzbTFtmRwC%2BVxKq2Ops06wW5Ce7qclYhY5DK5BeavEjqM64QxqvZ3c7p3Aa%2BC5WjAT9PBOl%2BiqcibXTUjtmM6z9KYUz5Lo%2FpGVIjWrbfH7IdI7S9OVK4aW%2FMC5CrkMIJ05A0xNoabu%2FWxX8ZDZev2aCNTwDDF%2F%2FvPBjqkAdZcHZ9DjjDnrOeMq4orDn9FPJzEN06uv8925UHv2zgH2RoMX2VPwAY%2FFIuAe1FGzWIphAKc5fHUGgQVKD7QJja151WadZt7SaCwL%2Bm%2FKgWnXmajj96n7mjvleebY3sWhjWxh2fj83xsg%2FCh1YDGEz6v6iS68LU%2FWiPZuS2Aw4H5TkpDc7KhucPc8ZwoPF%2FGKeKgHayDc6kYXKQFJPv9a64s0XUw&amp;X-Amz-Signature=56fc4d1c0f8d3cfc0cc3e4b49add2035f95f700cd554db96ed3ba5ceaae1247b&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39; alt=&#39;Unfortunately, the Notion API does not expose Alt-Text, so please open the full link if you need that.&#39;&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;h1&gt;Where to get it&lt;/h1&gt;&#xA;&lt;p&gt;These models are so simple and pretty specific to my door handles that I didn’t want it “clogging up” my Printables profile. That said, it may be useful to someone in the future (that &lt;i&gt;someone&lt;/i&gt; could be me one day), so here’s everything:&lt;/p&gt;&#xA;&#xA;&#xA;&lt;p&gt;&lt;a href=&#39;https://cad.onshape.com/documents/816637436fcc2d5f54129eed/w/39832787685d43081fc2526f/e/952737fe94676df396d05dd3?renderMode=0&amp;uiState=673d0b3b654dd43b335da0ce&#39;&gt;https://cad.onshape.com/documents/816637436fcc2d5f54129eed/w/39832787685d43081fc2526f/e/952737fe94676df396d05dd3?renderMode=0&amp;uiState=673d0b3b654dd43b335da0ce&lt;/a&gt; Source Document&lt;/p&gt;&#xA;&lt;h1&gt;License: &lt;code&gt;Public Domain&lt;/code&gt;&lt;/h1&gt;&#xA;&lt;p&gt;This article, all model files (STLs), CAD sources (STEP files), and images are &lt;a href=&#39;https://creativecommons.org/publicdomain/zero/1.0/&#39;&gt;Public Domain / CC0&lt;/a&gt;. You can use these files and this information however you want, whenever, and wherever you want.&lt;/p&gt;&#xA;&lt;hr/&gt;&#xA;&lt;h3&gt;🦋 Interact with this post on Bluesky:&lt;/h3&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&#xA;&lt;a href=&#39;https://bsky.app/profile/samurailink3.com/post/3lbdiry74uk27&#39;&gt;https://bsky.app/profile/samurailink3.com/post/3lbdiry74uk27&lt;/a&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;/html&gt;</content>
    <link href="https://www.samurailink3.com/Door-Handle-Slammer-Stopper-My-Stupidest-Useful-3D-Print-143b6786424180f0abf1c39fe6bde9c9" rel="alternate"></link>
    <author>
      <name>Tom Webster</name>
    </author>
  </entry>
  <entry>
    <title>Shower Wand Grab Bar Mount</title>
    <updated>2024-01-01T00:00:00Z</updated>
    <id>https://www.samurailink3.com/Shower-Wand-Grab-Bar-Mount-146b6786424180a59862e2e8e218ed0f</id>
    <content type="html">&lt;html&gt;&lt;p&gt;If you’ve ever had surgery, you know one of the most painful and annoying things is figuring out how to bathe without hurting yourself too badly. When I had gallbladder removal surgery, I ran into an annoying problem: I’m a short guy and the shower wand attaches to the main faucet, which is &lt;i&gt;way&lt;/i&gt; above my head. I would need to stretch to grab it, which was painful.&lt;/p&gt;&#xA;&lt;a href=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/edf4fcaf-2d56-4e9f-aa90-2d3c0dc3df4f/signal-2024-11-22-121242_002.jpeg?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB4667MT4XCV7%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112325Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBoaCXVzLXdlc3QtMiJGMEQCIAbgbA8sUV9O6DYeZA%2B6h6En0%2BtFa9dsugIDj%2BD5jTVUAiB8irZLsYWd7IrOZAIJsGukcdl9Ome8LwQVVNfP6Db3wSqIBAjj%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDYzNzQyMzE4MzgwNSIMDvUlqaOBNIREXoYkKtwD%2FI%2FArogAfE2wUUqyMvULdv5Duj6TuDY0bMMo3XHtFNtbB%2FfiQKoCpi6x1aoYzp1xTshwvjAN%2BJFUxQxBeBE%2FtZbObU%2FrPCz%2F5aYmwkwcyHiErlGcNSZAitDJbpm%2F2MpR0NMSheDPck2EfJvX%2FASgLOV43xbdhzUyUynf7v%2BW%2F2z%2FOzGMknCSCCh74Q6IQ8PCWItvmIEJhH1ZC%2BP65hQlULZ6F5%2FvMHPWgEUwnLVk3ce4HS0e8rakYM5RIWZTKtiZ7oFwqaZkmuDuBdsMZzUag0KecIBMeMuJ5WB1IQevPBA63nI4DctP3%2Fba9mnRne3bHkVtNHwpdpqOQw90%2B8wbcTH%2FWD2gcLx70hQPj6PmMhiwB1r3WDpdNDD70K6JyrXGWClW79e55YR8LkLgZyWqj9kAT5tgo6PKkBjeMQLiamEi9yRGs6QNxu6M6UR9H%2F2Pjt547RuJNU9USBqMHLyAmEvyxRzYKE6rsQKop7HnkWoLAcG58l%2FHos03p3RhPRDZX9QnPYHhgjYfPDa9RIf7Tyb%2Bcz31Y80jNRyq07Zkf4IVjQyYQAWNp8EZ3QiINcvlxr8jbVTgcoc3XYeNu9dedN8PUNT0cfXaJa%2BDDzkDoC1N%2BE6kNOOaB6fV5aAwh%2F%2F7zwY6pgGFui%2BVBNGWyxe1SliySzBGLLIuV99UbVK93xdAlSWcOd9ARow70RHaOMR95pGCYNJhtEG%2Bvxv1ARlqWgpqLplwPbYSaYeZcSbPnWeAsw%2FmNm%2F20rnwlKcw4raO1oLcHN4F7nEw0a%2B2fMU2tsIXJsdHAIOX93B1D3IhyH9WwC50B9HCFnsofQ17L483W%2F%2FDVrTpZhV86nX31WCAuLdDGj9Nr50SpGjt&amp;X-Amz-Signature=ba34f1d606eebdfab2577014a933faec27ef737f872f135328f9888cb106158a&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39;&gt;&lt;img style =&#39;width:50vw;&#39; src=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/edf4fcaf-2d56-4e9f-aa90-2d3c0dc3df4f/signal-2024-11-22-121242_002.jpeg?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB4667MT4XCV7%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112325Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBoaCXVzLXdlc3QtMiJGMEQCIAbgbA8sUV9O6DYeZA%2B6h6En0%2BtFa9dsugIDj%2BD5jTVUAiB8irZLsYWd7IrOZAIJsGukcdl9Ome8LwQVVNfP6Db3wSqIBAjj%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDYzNzQyMzE4MzgwNSIMDvUlqaOBNIREXoYkKtwD%2FI%2FArogAfE2wUUqyMvULdv5Duj6TuDY0bMMo3XHtFNtbB%2FfiQKoCpi6x1aoYzp1xTshwvjAN%2BJFUxQxBeBE%2FtZbObU%2FrPCz%2F5aYmwkwcyHiErlGcNSZAitDJbpm%2F2MpR0NMSheDPck2EfJvX%2FASgLOV43xbdhzUyUynf7v%2BW%2F2z%2FOzGMknCSCCh74Q6IQ8PCWItvmIEJhH1ZC%2BP65hQlULZ6F5%2FvMHPWgEUwnLVk3ce4HS0e8rakYM5RIWZTKtiZ7oFwqaZkmuDuBdsMZzUag0KecIBMeMuJ5WB1IQevPBA63nI4DctP3%2Fba9mnRne3bHkVtNHwpdpqOQw90%2B8wbcTH%2FWD2gcLx70hQPj6PmMhiwB1r3WDpdNDD70K6JyrXGWClW79e55YR8LkLgZyWqj9kAT5tgo6PKkBjeMQLiamEi9yRGs6QNxu6M6UR9H%2F2Pjt547RuJNU9USBqMHLyAmEvyxRzYKE6rsQKop7HnkWoLAcG58l%2FHos03p3RhPRDZX9QnPYHhgjYfPDa9RIf7Tyb%2Bcz31Y80jNRyq07Zkf4IVjQyYQAWNp8EZ3QiINcvlxr8jbVTgcoc3XYeNu9dedN8PUNT0cfXaJa%2BDDzkDoC1N%2BE6kNOOaB6fV5aAwh%2F%2F7zwY6pgGFui%2BVBNGWyxe1SliySzBGLLIuV99UbVK93xdAlSWcOd9ARow70RHaOMR95pGCYNJhtEG%2Bvxv1ARlqWgpqLplwPbYSaYeZcSbPnWeAsw%2FmNm%2F20rnwlKcw4raO1oLcHN4F7nEw0a%2B2fMU2tsIXJsdHAIOX93B1D3IhyH9WwC50B9HCFnsofQ17L483W%2F%2FDVrTpZhV86nX31WCAuLdDGj9Nr50SpGjt&amp;X-Amz-Signature=ba34f1d606eebdfab2577014a933faec27ef737f872f135328f9888cb106158a&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39; alt=&#39;Unfortunately, the Notion API does not expose Alt-Text, so please open the full link if you need that.&#39;&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;&#xA;&#xA;&lt;a href=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/c1c4ff91-f56d-4259-b5d5-c00d7c4cc611/signal-2024-11-22-121242_003.jpeg?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB466RD5K4DTN%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112325Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBoaCXVzLXdlc3QtMiJHMEUCIClwASWJwKXXtv7BO3X9xlL0mP2s%2B7FbedRMQG8azRH5AiEAnFPCx8OfFdIup5JFQUrJxDpdXw8A3Syx%2FmylyQSqNmIqiAQI4%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDC%2Fn%2F7Pq%2BtDe1kb8oyrcA2sUZw5Yscpom89GpnZIs8Et464YuKuuMHph70RN%2BffMrnwGFxyeYmziAwaW4EfQ0hwTlTzt0l8YlCR3pWbENSQgDphXZR7aQO6OLFH566x5eKmGSXNPIrALTDoNq9XbXI%2BwV6c0Lg0wsA9cMowdzBPo69kYrHcSSFLpATj0MqSrc9mwTsnVULL9Shb78gWPhi7v80OfVkd25SYl0mTwja9IndBpbWW4YUUzD%2BEKg93oNHMdm2oF0HB3XD9FskrCcOKTaM23D1WqdfwnHCZHiSzZUH1ILtbKU%2B8E9KJcmnZwtVU6exixS0gtsH5A6ddy%2BVaPZvzoB%2F5afDIG5B%2B2JbSYcQPg0CDUIDBp2UxoJwNae84XiLfmbaYv87YiU6Bg9J5tDY%2BibZxAXT03jzTO%2BTz%2B6pT33V45cN9uJMhT%2FqtdxUZXXRJ%2B03rqPDPJvv0p4LxvwwJWWsn0gcBaBG9eqqIkN2ZkJASISIUoRmBHCWsFwNZ4mQKqjwoj7c0vxOFj1yvbCn29bMQrvZqoM%2Fckfo5a%2Bn9q5PLZROdW9b20MdAWy1ezwXUIpPg%2BtJbJTyO2cE5SVzXA77vpfhxjZqgc1ZFZSMjraha8UhqfU5PkGeh7dDD5gSvkTsqIpZ4pMNr%2F%2B88GOqUBTa2gLpw8X%2FXmT9piNs37oVFvAOeoTHIRC5wcQnlzlVAZc1TnqRRLWnMecHNWtu7R1rFKt%2F4A22HbBG1h4p%2Bw3Rg6EDWLA7L5YDV1bD7pSUp0W5mBa5U6sUqNXEuSl1nzc9HZoHvoIjwafGUntNuuhI3%2FmogXxdGHkuaJwAAG0BCsJm0zZveMGWOQL0ZaKR9ojLV0dIjOMC8ES%2FmEopm3DHCDt2Zo&amp;X-Amz-Signature=58c13775f76959df05e1b2cbcfe135f60b93c3e990dee3fd4b1fbb1351949dc3&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39;&gt;&lt;img style =&#39;width:50vw;&#39; src=&#39;https://prod-files-secure.s3.us-west-2.amazonaws.com/6882aefd-0704-4f0d-86a6-e9f8000b81d4/c1c4ff91-f56d-4259-b5d5-c00d7c4cc611/signal-2024-11-22-121242_003.jpeg?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=ASIAZI2LB466RD5K4DTN%2F20260509%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20260509T112325Z&amp;X-Amz-Expires=3600&amp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBoaCXVzLXdlc3QtMiJHMEUCIClwASWJwKXXtv7BO3X9xlL0mP2s%2B7FbedRMQG8azRH5AiEAnFPCx8OfFdIup5JFQUrJxDpdXw8A3Syx%2FmylyQSqNmIqiAQI4%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDC%2Fn%2F7Pq%2BtDe1kb8oyrcA2sUZw5Yscpom89GpnZIs8Et464YuKuuMHph70RN%2BffMrnwGFxyeYmziAwaW4EfQ0hwTlTzt0l8YlCR3pWbENSQgDphXZR7aQO6OLFH566x5eKmGSXNPIrALTDoNq9XbXI%2BwV6c0Lg0wsA9cMowdzBPo69kYrHcSSFLpATj0MqSrc9mwTsnVULL9Shb78gWPhi7v80OfVkd25SYl0mTwja9IndBpbWW4YUUzD%2BEKg93oNHMdm2oF0HB3XD9FskrCcOKTaM23D1WqdfwnHCZHiSzZUH1ILtbKU%2B8E9KJcmnZwtVU6exixS0gtsH5A6ddy%2BVaPZvzoB%2F5afDIG5B%2B2JbSYcQPg0CDUIDBp2UxoJwNae84XiLfmbaYv87YiU6Bg9J5tDY%2BibZxAXT03jzTO%2BTz%2B6pT33V45cN9uJMhT%2FqtdxUZXXRJ%2B03rqPDPJvv0p4LxvwwJWWsn0gcBaBG9eqqIkN2ZkJASISIUoRmBHCWsFwNZ4mQKqjwoj7c0vxOFj1yvbCn29bMQrvZqoM%2Fckfo5a%2Bn9q5PLZROdW9b20MdAWy1ezwXUIpPg%2BtJbJTyO2cE5SVzXA77vpfhxjZqgc1ZFZSMjraha8UhqfU5PkGeh7dDD5gSvkTsqIpZ4pMNr%2F%2B88GOqUBTa2gLpw8X%2FXmT9piNs37oVFvAOeoTHIRC5wcQnlzlVAZc1TnqRRLWnMecHNWtu7R1rFKt%2F4A22HbBG1h4p%2Bw3Rg6EDWLA7L5YDV1bD7pSUp0W5mBa5U6sUqNXEuSl1nzc9HZoHvoIjwafGUntNuuhI3%2FmogXxdGHkuaJwAAG0BCsJm0zZveMGWOQL0ZaKR9ojLV0dIjOMC8ES%2FmEopm3DHCDt2Zo&amp;X-Amz-Signature=58c13775f76959df05e1b2cbcfe135f60b93c3e990dee3fd4b1fbb1351949dc3&amp;X-Amz-SignedHeaders=host&amp;x-amz-checksum-mode=ENABLED&amp;x-id=GetObject&#39; alt=&#39;Unfortunately, the Notion API does not expose Alt-Text, so please open the full link if you need that.&#39;&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;&#xA;&#xA;&#xA;&lt;p&gt;My buddy, Salem, always says that one of the main superpowers of 3D printing was gaining the ability to stick things to other things. So that’s just what I did.&lt;/p&gt;&#xA;&lt;p&gt;I took measurements of the grab bar and a bunch of reference photos. Then I modeled a simple bracket that I printed in PETG. This is the latest version of the bracket. The original didn’t have the secondary hook, so the whole mount tended to rotate around the main grab bar. This version is a bit better in that regard. Not perfectly stable, but it doesn’t have to be. Its very much “good enough”.&lt;/p&gt;&#xA;&lt;p&gt;Out of everything I’ve designed and printed, this piece is my all-time favorite (so far). The design is simple-enough and I was able to use open-source tools to solve a painful problem I was experiencing. Today I don’t &lt;i&gt;need&lt;/i&gt; the mount, but I still use it for the sheer convenience (much like &lt;a href=&#39;https://en.wikipedia.org/wiki/Curb_cut&#39;&gt;curb cuts&lt;/a&gt;). Accessibility doesn’t need to be hard or expensive, we just have to be a bit more clever than the default.&lt;/p&gt;&#xA;&#xA;&lt;h1&gt;Source Files and CAD&lt;/h1&gt;&#xA;&lt;p&gt;Feel free to use the source CAD and files however you want, its all Public Domain, but I’d like to issue a light warning first: The CAD is &lt;i&gt;rough&lt;/i&gt;. The design &lt;i&gt;is parametric&lt;/i&gt;, but annoying to actually edit. This was my first more-complex-than-sticking-cubes-together CAD project and I’ve learned a lot since building this. It kinda sucks to edit, but I figured it may be somewhat helpful to someone in the future.&lt;/p&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#39;https://cad.onshape.com/documents/ddf2cdc7fdc8326141fe9300/w/6087830b46d9750ca0017fc4/e/6ea5e739f9db7d1aafc204af?renderMode=0&amp;uiState=6740cc83687bd540b1895b8f&#39;&gt;https://cad.onshape.com/documents/ddf2cdc7fdc8326141fe9300/w/6087830b46d9750ca0017fc4/e/6ea5e739f9db7d1aafc204af?renderMode=0&amp;uiState=6740cc83687bd540b1895b8f&lt;/a&gt; Document&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h1&gt;License: &lt;code&gt;Public Domain&lt;/code&gt;&lt;/h1&gt;&#xA;&lt;p&gt;This article, all model files (STLs), CAD sources (STEP files), and images are &lt;a href=&#39;https://creativecommons.org/publicdomain/zero/1.0/&#39;&gt;Public Domain / CC0&lt;/a&gt;. You can use these files and this information however you want, whenever, and wherever you want.&lt;/p&gt;&#xA;&lt;hr/&gt;&#xA;&lt;h3&gt;🦋 Interact with this post on Bluesky:&lt;/h3&gt;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&#xA;&lt;a href=&#39;https://bsky.app/profile/samurailink3.com/post/3lbknojx3pc2w&#39;&gt;https://bsky.app/profile/samurailink3.com/post/3lbknojx3pc2w&lt;/a&gt;&#xA;&#xA;&#xA;&lt;p&gt;&lt;/p&gt;&#xA;&lt;/html&gt;</content>
    <link href="https://www.samurailink3.com/Shower-Wand-Grab-Bar-Mount-146b6786424180a59862e2e8e218ed0f" rel="alternate"></link>
    <author>
      <name>Tom Webster</name>
    </author>
  </entry>
</feed>