<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.4">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2026-07-07T14:05:06+00:00</updated><id>/feed.xml</id><title type="html">Dinner Bell Design</title><entry><title type="html">Teksavvy Fibre on the Unifi Cloud Gateway Fiber</title><link href="/2025/10/13/teksavvy-fibre-on-the-unifi-cloud-gateway-fiber.html" rel="alternate" type="text/html" title="Teksavvy Fibre on the Unifi Cloud Gateway Fiber" /><published>2025-10-13T19:22:00+00:00</published><updated>2025-10-13T19:22:00+00:00</updated><id>/2025/10/13/teksavvy-fibre-on-the-unifi-cloud-gateway-fiber</id><content type="html" xml:base="/2025/10/13/teksavvy-fibre-on-the-unifi-cloud-gateway-fiber.html">&lt;p&gt;I recently upgraded my home internet connection from Teksavvy cable (via Rogers) to a 1.5 Gbps Teksavvy Fibre connection (via Bell). I’m loving it, but the combo modem / router / AP they sent me was… an interesting choice on their part.&lt;/p&gt;

&lt;div class=&quot;post-image portrait&quot;&gt;
  &lt;img src=&quot;/images/fibre-setup/adtran-854-v-6.jpeg&quot; alt=&quot;The Adtran 854 v6 really wishes it was a Playstation 5.&quot; /&gt;
  &lt;span class=&quot;caption&quot;&gt;The Adtran 854 v6 really wishes it was a Playstation 5.&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;The &lt;a href=&quot;https://gentek.com/products/adsdg854_v6&quot;&gt;Adtran 854 v6&lt;/a&gt; is your only choice if you’re using Teksavvy fibre. They ship it to you when you order their fibre service. No, it is not a Playstation 5. Yes, it really &lt;em&gt;really&lt;/em&gt; wants to live somewhere out in your living room like a giant plastic objet d’art. “How dare you even think about trying to rack-mount me somewhere?”, it screams from its mostly hollow body.&lt;/p&gt;

&lt;p&gt;Like every modem I’ve ever been sent by my ISP, I just want it to, you know, be a modem and not anything else. So - bridge mode is usually step 2 for me. Teksavvy, being awesome like they are, has &lt;a href=&quot;https://help.teksavvy.com/teksavvy-faq/post/all-about-the-adtran-854v6-5VY13bbWlkVa1K4#ea59f8d7-fe30-4879-9d54-c18035fe0aa6&quot;&gt;instructions on how to bridge this device on their site&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;post-image portrait&quot;&gt;
  &lt;img src=&quot;/images/fibre-setup/the-speed-i-was-sold.png&quot; alt=&quot;I&apos;m paying for the whole 1.5 Gbps so I want the whole 1.5 Gbps!&quot; /&gt;
  &lt;span class=&quot;caption&quot;&gt;I&apos;m paying for the whole 1.5 Gbps so I want the whole 1.5 Gbps!&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;But don’t get too excited, because there’s a big caveat. Even though I’m paying for 1.5 Gbps, the Adtran only has four 1 Gbps ports! Meaning, in bridge mode, I’ll never get the full 1.5 Gbps I’m paying for. And if I’m being really picky, even if I &lt;em&gt;was&lt;/em&gt; using this thing as an all-in-one modem/router/AP, I’d be very lucky to ever saturate that connection over the Adtran’s WiFi 6 AP.&lt;/p&gt;

&lt;p&gt;So the new question became: can I just ditch the Adtran entirely and plug the fibre directly into my UniFi controller? After some &lt;a href=&quot;https://www.reddit.com/r/teksavvy/comments/1jo795p/guide_to_using_your_own_routernetworking/?share_id=mK7JW0BT8nfvEy7_ai7K7&amp;amp;utm_content=2&amp;amp;utm_medium=ios_app&amp;amp;utm_name=ioscss&amp;amp;utm_source=share&amp;amp;utm_term=1&quot;&gt;Reddit reading&lt;/a&gt; (thank you &lt;a href=&quot;https://www.reddit.com/user/arth33/&quot;&gt;arth33&lt;/a&gt;) and some experimentation, I figured out how this can be done.&lt;/p&gt;

&lt;p&gt;First, a quick primer on some terminology:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/GPON&quot;&gt;&lt;strong&gt;GPON&lt;/strong&gt;&lt;/a&gt; (Gigabit Passive Optical Network) is the &lt;em&gt;technology standard&lt;/em&gt; used by fibre optic networks to deliver broadband internet to your home.&lt;/li&gt;
  &lt;li&gt;The &lt;a href=&quot;https://en.wikipedia.org/wiki/Demarcation_point&quot;&gt;&lt;strong&gt;demarcation point&lt;/strong&gt;&lt;/a&gt; is a &lt;em&gt;conceptual boundary&lt;/em&gt; point where your ISP’s fibre network ends and your own network begins.&lt;/li&gt;
  &lt;li&gt;An &lt;a href=&quot;https://en.wikipedia.org/wiki/Network_interface_device#Optical_network_terminals&quot;&gt;&lt;strong&gt;ONT&lt;/strong&gt;&lt;/a&gt; (Optical Network Terminal) is the &lt;em&gt;physical device&lt;/em&gt; that receives and processes the fibre optic signals from the GPON network.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Small_Form-factor_Pluggable&quot;&gt;&lt;strong&gt;SFP+&lt;/strong&gt;&lt;/a&gt; (Small Form-factor Pluggable) is a &lt;em&gt;type of transceiver module&lt;/em&gt; where the specific transceiver technology is &lt;em&gt;inside the module itself&lt;/em&gt; rather than inside the device you are connecting to.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;post-image &quot;&gt;
  &lt;img src=&quot;/images/fibre-setup/gpon-ont-from-bell.png&quot; alt=&quot;The Bell tech brought this pre-configured SFP+ GPON ONT with him. Laser beams go in the left, electrical internet magic comes out the right.&quot; /&gt;
  &lt;span class=&quot;caption&quot;&gt;The Bell tech brought this pre-configured SFP+ GPON ONT with him. Laser beams go in the left, electrical internet magic comes out the right.&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;In my case, because &lt;a href=&quot;https://www.teksavvy.com/services/fibre/&quot;&gt;Teksavvy resells Bell’s fibre&lt;/a&gt; in Toronto, the Bell technician brought a pre-configured SFP+ GPON ONT with him, and installed it into the Adtran that Teksavvy had mailed me earlier.&lt;/p&gt;

&lt;div class=&quot;post-image portrait&quot;&gt;
  &lt;img src=&quot;/images/fibre-setup/cabinet-before.png&quot; alt=&quot;My messy network cabinet, with a UniFi Dream Machine Pro awkwardly side-mounted, my old cable modem above and the new Adtran below.&quot; /&gt;
  &lt;span class=&quot;caption&quot;&gt;My messy network cabinet, with a UniFi Dream Machine Pro awkwardly side-mounted, my old cable modem above and the new Adtran below.&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;With the fibre connection working well on the Adtran with stock settings, it was time to try bridge mode, so that my old UniFi Dream Machine Pro could continue managing my network. Following &lt;a href=&quot;https://www.reddit.com/user/arth33/&quot;&gt;arth33&lt;/a&gt;’s &lt;a href=&quot;https://www.reddit.com/r/teksavvy/comments/1jo795p/guide_to_using_your_own_routernetworking/?share_id=mK7JW0BT8nfvEy7_ai7K7&amp;amp;utm_content=2&amp;amp;utm_medium=ios_app&amp;amp;utm_name=ioscss&amp;amp;utm_source=share&amp;amp;utm_term=1&quot;&gt;instructions&lt;/a&gt;, I got this working well, albeit at 1Gbps.&lt;/p&gt;

&lt;h2 id=&quot;new-hardware&quot;&gt;New Hardware&lt;/h2&gt;

&lt;p&gt;But oh man, what an ugly mess. Intolerable, really. I need to be honest with myself - I don’t have space for a proper rack so I should stop buying rack-sized gear. And the giant Adtran doens’t help things much. Lucky for me, Ubiquiti sells smaller wall-mountable gear, like the &lt;a href=&quot;https://ca.store.ui.com/ca/en/category/cloud-gateways-compact/collections/cloud-gateway-fiber/products/ucg-fiber?c=CA&quot;&gt;Unifi Cloud Gateway Fiber&lt;/a&gt; (bought one!) and the &lt;a href=&quot;https://ca.store.ui.com/ca/en/products/usw-flex-2-5g-8-poe?c=CA&quot;&gt;Flex 2.5G PoE switch&lt;/a&gt; (bought two!).&lt;/p&gt;

&lt;p&gt;The Cloud Gateway Fiber is a nice little gateway. It even has &lt;em&gt;two&lt;/em&gt; SFP+ ports! We’re almost there! But but but… the SFP+ ports support either 1G or 10G modules. &lt;strong&gt;No 2.5G!&lt;/strong&gt; And you can guess what speed Bell’s SFP+ GPON ONT runs at: 2.5G. 😖😖😖&lt;/p&gt;

&lt;p&gt;So: enter a new piece of gear (recommended by several redditors): a &lt;a href=&quot;https://www.amazon.ca/dp/B0C4JKSFW6?ref=ppx_pop_mob_ap_share&amp;amp;th=1&quot;&gt;2.5G SFP Port Transceiver Media Converter&lt;/a&gt;. The one I link to here is what I’m using, but I’m sure there are others that’d do the same thing. This little box takes a 2.5G SPF+ module (the Bell ONT in my case) and converts that to 2.5G ethernet. And the Fiber Gateway just happens to have a 2.5G WAN ethernet port (port 5) - perfect!&lt;/p&gt;

&lt;div class=&quot;post-image portrait&quot;&gt;
  &lt;img src=&quot;/images/fibre-setup/media-converter.png&quot; alt=&quot;The 2.5G media converter I bought off Amazon. Counter-intuitively, you want the little switch set to &apos;off&apos;!&quot; /&gt;
  &lt;span class=&quot;caption&quot;&gt;The 2.5G media converter I bought off Amazon. Counter-intuitively, you want the little switch set to &apos;off&apos;!&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;Here’s a hot tip that took me way too long to figure out: there is a little itty bitty switch to the left of the ethernet port. In my picture here, you can see it is set to “off”, which is what we want. What is it turning off exactly? Buried in the product description, I found this sentence: &lt;em&gt;“Equipped with a simple manual switch for easy toggling between SFP 2.5G/RJ45 100/1000/2500 adaptive and SFP 1G/RJ45 1000M modes.”&lt;/em&gt; We want adaptive, so we switch the fixed 1G speed off. The module confirms that it is indeed connected at 2.5G with one of its little green lights.&lt;/p&gt;

&lt;p&gt;One final note: make sure you’re media converter is connected to &lt;strong&gt;port 5&lt;/strong&gt;, as its preconfigured as a WAN port.&lt;/p&gt;

&lt;div class=&quot;post-image portrait&quot;&gt;
  &lt;img src=&quot;/images/fibre-setup/ports-used.png&quot; alt=&quot;Port 5 is a 2.5G ethernet port pre-configured as a WAN port.&quot; /&gt;
  &lt;span class=&quot;caption&quot;&gt;Port 5 is a 2.5G ethernet port pre-configured as a WAN port.&lt;/span&gt;
&lt;/div&gt;

&lt;h2 id=&quot;new-unifi-configs&quot;&gt;New Unifi Configs&lt;/h2&gt;
&lt;p&gt;With everything connected at the right speeds, I then had to configure my Unifi gateway to handle the PPPoE authentication (which the Adtran would normally handle). &lt;a href=&quot;https://help.teksavvy.com/teksavvy-faq/post/all-about-the-adtran-854v6-5VY13bbWlkVa1K4#ea59f8d7-fe30-4879-9d54-c18035fe0aa6&quot;&gt;Teksavvy’s instructions&lt;/a&gt; were a bit sparse and, in my case, missing some key instructions, so here are my working configurations:&lt;/p&gt;

&lt;div class=&quot;post-image &quot;&gt;
  &lt;img src=&quot;/images/fibre-setup/wan-config-with-media-converter.png&quot; alt=&quot;My working settings for gateway-managed PPPoE.&quot; /&gt;
  &lt;span class=&quot;caption&quot;&gt;My working settings for gateway-managed PPPoE.&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;The key parts from the configs above are:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Specify a &lt;strong&gt;VLAN ID of 40&lt;/strong&gt; (as per &lt;a href=&quot;https://help.teksavvy.com/teksavvy-faq/post/all-about-the-adtran-854v6-5VY13bbWlkVa1K4#ea59f8d7-fe30-4879-9d54-c18035fe0aa6&quot;&gt;Teksavvy’s instructions&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Don’t use a QoS tag&lt;/strong&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Clone the modem’s MAC address&lt;/strong&gt;. &lt;em&gt;Teksavvy didn’t mention this requirement&lt;/em&gt;, but my connection didn’t work without it!&lt;/li&gt;
  &lt;li&gt;Select &lt;strong&gt;PPPoE&lt;/strong&gt; for the IPv4 connection.&lt;/li&gt;
  &lt;li&gt;Add the PPPoE &lt;strong&gt;username and password&lt;/strong&gt; that came pre-saved in the Adtran modem Teksavvy sent you.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The MAC address of the modem can be found only from the web configuration interface in the Adtran modem itself. So I just had to plug the modem in with nothing else connected to it, connect to it via WiFi (with the credentials on a sticker on the modem’s bottom) and browse to &lt;strong&gt;http://192.168.100.1/&lt;/strong&gt;. Sign in (username and password is also on the sticker). Navigate to &lt;strong&gt;Network &amp;gt; Ethernet WAN&lt;/strong&gt; and copy the MAC address. Then navigate to &lt;strong&gt;IPv4 Configuration&lt;/strong&gt; and copy the username and password. Unfortunately, the password is obscured in an HTML element that doesn’t show its value by default 😖😖😖. If you are a software developer (and you must be if you’ve read this far!), just open your inspector and change this field to a regular text field, and voila, there is your password in plain text.&lt;/p&gt;

&lt;p&gt;You have another option, however! Just start a web chat with &lt;a href=&quot;https://www.teksavvy.com/company/contact/&quot;&gt;Teksavvy’s helpful support folks&lt;/a&gt;! After authenticating with them on their site, a rep gave me my username and password in just a couple minutes.&lt;/p&gt;

&lt;p&gt;And that’s it! My gateway was internet-connected after about 30 seconds of enabling these configurations. And the speed was &lt;em&gt;finally&lt;/em&gt; what I’d paid for:&lt;/p&gt;

&lt;div class=&quot;post-image &quot;&gt;
  &lt;img src=&quot;/images/fibre-setup/the-speed-i-got.png&quot; alt=&quot;Thank you, Teksavvy, for the bonus 5% of download speed. 🙏&quot; /&gt;
  &lt;span class=&quot;caption&quot;&gt;Thank you, Teksavvy, for the bonus 5% of download speed. 🙏&lt;/span&gt;
&lt;/div&gt;

&lt;h3 id=&quot;new-installation&quot;&gt;New Installation&lt;/h3&gt;
&lt;div class=&quot;post-image portrait&quot;&gt;
  &lt;img src=&quot;/images/fibre-setup/cabinet-after-1.png&quot; alt=&quot;The finished product.&quot; /&gt;
  &lt;span class=&quot;caption&quot;&gt;The finished product.&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;A setup this slick deserved better than to be crammed into a spider-web infested plywood cabinet, so I spent some time (perhaps &lt;em&gt;too&lt;/em&gt; much time) designing and building a custom-fit cabinet for my new gear.&lt;/p&gt;

&lt;p&gt;I wanted a cabinet that I could make changes to easily in the future, without too much disassembly and without making things uglier as my gear changes (see the “before” pic above for an example of that 😬). But most importantly, &lt;strong&gt;I wanted something that would bring a smile to my face&lt;/strong&gt; any time I looked at it - even if that isn’t all that often.&lt;/p&gt;

&lt;p&gt;With a free 3D scanning app on my phone, I scanned the incredibly un-square cabinet enclosure to get some precise measurements. I imported this into SolidWorks, cleaned it up a bit, and set to work designing an enclosure that would beautifully frame this new Unifi gear. It is made of laser-cut 2.75mm birchwood panels, with a regular slot pattern for easy mounting of equipment. 3D printed brackets, each one uniquely designed to match its position inside the rough cabinet, hold all the panels in place. Black wafer screws secure everything together, and each panel can be quickly removed and replaced. Each network component had a custom designed mount printed - one that would let me slot it into the panels at precise spacings, keeping edges aligned and spacing consistent.&lt;/p&gt;

&lt;div class=&quot;post-image &quot;&gt;
  &lt;img src=&quot;/images/fibre-setup/cabinet-after-2.png&quot; alt=&quot;Patch panel, gateway, switch and a PoE+ powered Raspberry Pi 4 (running pi-hole and scrypted) in a custom-printed enclosure.&quot; /&gt;
  &lt;span class=&quot;caption&quot;&gt;Patch panel, gateway, switch and a PoE+ powered Raspberry Pi 4 (running pi-hole and scrypted) in a custom-printed enclosure.&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;Two LED light fixtures frame the mounting panels and are obscured by some vertical valence pieces. These pieces do double-duty as a power cable hiding raceway, leading all of the power cables down to a custom-trimmed 4-gang outlet box. Not shown is an 1500 VA APC Back-UPS Pro uninteruptable power supply, which feeds the outlet box and can keep everything running for about 45 minutes without mains power.&lt;/p&gt;

&lt;p&gt;All of the data cables were purchased at the exact length I needed (6 inch for the patch panel, 18” for the switch and gateway.) I designed and printed custom cable mounts for all the different cable diameters to keep them neat and tidy.&lt;/p&gt;

&lt;div class=&quot;post-image &quot;&gt;
  &lt;img src=&quot;/images/fibre-setup/cabinet-after-3.png&quot; alt=&quot;6-inch patch panel cables connect my home&apos;s ethernet runs to two switches, which are linked together with a Unifi 10G SFP uplink cable.&quot; /&gt;
  &lt;span class=&quot;caption&quot;&gt;6-inch patch panel cables connect my home&apos;s ethernet runs to two switches, which are linked together with a Unifi 10G SFP uplink cable.&lt;/span&gt;
&lt;/div&gt;</content><author><name></name></author><summary type="html">I recently upgraded my home internet connection from Teksavvy cable (via Rogers) to a 1.5 Gbps Teksavvy Fibre connection (via Bell). I’m loving it, but the combo modem / router / AP they sent me was… an interesting choice on their part.</summary></entry><entry><title type="html">Quick Pointer</title><link href="/2025/08/12/quick-pointer-story-pointing.html" rel="alternate" type="text/html" title="Quick Pointer" /><published>2025-08-12T21:00:00+00:00</published><updated>2025-08-12T21:00:00+00:00</updated><id>/2025/08/12/quick-pointer-story-pointing</id><content type="html" xml:base="/2025/08/12/quick-pointer-story-pointing.html">&lt;p&gt;As a team lead at &lt;a href=&quot;https://www.zayzoon.com&quot;&gt;ZayZoon&lt;/a&gt;, I run a lot of sprint planning sessions. We usually have quite a lot to cover, so I tend to move quickly. The team had been using Parabol for story pointing before, but I found it too cumbersome. I really just needed the bare minimum: a web app that let people anonymously vote in points, then a way to reveal them all at once.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href=&quot;https://github.com/gregmatthewcrossley/quick_pointer&quot;&gt;Quick Pointer&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;resources&quot;&gt;
  &lt;h3&gt;Resources&lt;/h3&gt;
  &lt;p&gt;Try it out with your team, or fork it and make it your own.&lt;/p&gt;
  &lt;ul class=&quot;resource-list&quot;&gt;
    
      &lt;li class=&quot;resource-item&quot;&gt;
        &lt;a href=&quot;https://github.com/gregmatthewcrossley/quick_pointer&quot; class=&quot;resource-link&quot;&gt;
          
            &lt;svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; x=&quot;0px&quot; y=&quot;0px&quot; viewBox=&quot;0 0 28 28&quot; enable-background=&quot;new 0 0 28 28&quot; xml:space=&quot;preserve&quot; width=&quot;28&quot;&gt;
&lt;path id=&quot;GitHub&quot; fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; fill=&quot;#D1CECC&quot; d=&quot;M14.01,0C6.27,0-0.01,6.28-0.01,14.02
  c0,6.19,4.02,11.45,9.59,13.3c0.7,0.13,0.96-0.3,0.96-0.68c0-0.33-0.01-1.21-0.02-2.38c-3.9,0.85-4.72-1.88-4.72-1.88
  c-0.64-1.62-1.56-2.05-1.56-2.05c-1.27-0.87,0.1-0.85,0.1-0.85c1.41,0.1,2.15,1.44,2.15,1.44c1.25,2.14,3.28,1.52,4.08,1.16
  c0.13-0.91,0.49-1.52,0.89-1.87c-3.11-0.35-6.38-1.56-6.38-6.93c0-1.53,0.55-2.78,1.44-3.76C6.37,9.17,5.89,7.74,6.65,5.81
  c0,0,1.18-0.38,3.85,1.44c1.12-0.31,2.32-0.47,3.51-0.47c1.19,0.01,2.39,0.16,3.51,0.47c2.68-1.81,3.85-1.44,3.85-1.44
  c0.76,1.93,0.28,3.35,0.14,3.71c0.9,0.98,1.44,2.23,1.44,3.76c0,5.38-3.28,6.57-6.4,6.92c0.5,0.43,0.95,1.29,0.95,2.6
  c0,1.87-0.02,3.39-0.02,3.84c0,0.37,0.25,0.81,0.96,0.67c5.56-1.86,9.58-7.11,9.58-13.3C28.03,6.28,21.75,0,14.01,0z&quot; /&gt;
&lt;/svg&gt;

          
          &lt;span class=&quot;resource-name&quot;&gt;Quick Pointer code repo&lt;/span&gt;
        &lt;/a&gt;
      &lt;/li&gt;
    
  &lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;It’s super simple. No accounts, no setup, no admin users. You just open the site and start pointing.  The site is completely public, but who cares - we’re literally just picking numbers! As an option, you can paste in a Jira ticket link so that everyone can read it before they vote (which would be inaccessible to anyone who’s not already authenticated with Jira).&lt;/p&gt;

&lt;p&gt;The whole thing runs on Rails 8 with Turbo Streams and ActionCable handling the real-time parts. It uses Rails’ in-memory cache instead of a database because there is no need to persist story points for more than a few minutes. Browser sessions track who voted what, so people can change their votes before the big reveal.&lt;/p&gt;</content><author><name></name></author><summary type="html">As a team lead at ZayZoon, I run a lot of sprint planning sessions. We usually have quite a lot to cover, so I tend to move quickly. The team had been using Parabol for story pointing before, but I found it too cumbersome. I really just needed the bare minimum: a web app that let people anonymously vote in points, then a way to reveal them all at once.</summary></entry><entry><title type="html">Gyroid Brain Coral Shrimp Hide</title><link href="/2025/07/30/gyroid-brain-coral-shrimp-hide.html" rel="alternate" type="text/html" title="Gyroid Brain Coral Shrimp Hide" /><published>2025-07-30T14:54:00+00:00</published><updated>2025-07-30T14:54:00+00:00</updated><id>/2025/07/30/gyroid-brain-coral-shrimp-hide</id><content type="html" xml:base="/2025/07/30/gyroid-brain-coral-shrimp-hide.html">&lt;p&gt;If you’re familiar with 3D printing, you’re probably familiar with the word &lt;a href=&quot;https://en.wikipedia.org/wiki/Gyroid&quot;&gt;gyroid&lt;/a&gt;. It’s the &lt;a href=&quot;https://help.prusa3d.com/article/infill-patterns_177130&quot;&gt;default fill method&lt;/a&gt; for the Prusa slicer and for good reason - gyroids strike a great balance between print speed, structural integrity and filament efficiency.&lt;/p&gt;

&lt;p&gt;I’d been thinking about gyroids way more than any normal person every would, and looking for a project to use them in. When we introduced some tiny cherry shrimp into our betta’s aquarium, and they all got eaten within 24 hours, I suddenly had a project: a shrimp hide-away! Shaped like brain coral!&lt;/p&gt;

&lt;div class=&quot;resources&quot;&gt;
  &lt;h3&gt;Resources&lt;/h3&gt;
  &lt;p&gt;You can download the SolidWorks surface model and the brain coral (as a Prusa Slicer project file) below. If you want the solid gyroid cube or the brain coral as a STEP file, contact me - they&apos;re too big to put on this site!&lt;/p&gt;
  &lt;ul class=&quot;resource-list&quot;&gt;
    
      &lt;li class=&quot;resource-item&quot;&gt;
        &lt;a href=&quot;/images/Parametric Gyroid Surface Model.SLDPRT&quot; class=&quot;resource-link&quot;&gt;
          &lt;svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;28&quot;&gt;
  &lt;path fill=&quot;#D1CECC&quot; d=&quot;M234.5 5.7c13.9-5 29.1-5 43.1 0l192 68.6C495 83.4 512 107.5 512 134.6l0 242.9c0 27-17 51.2-42.5 60.3l-192 68.6c-13.9 5-29.1 5-43.1 0l-192-68.6C17 428.6 0 404.5 0 377.4L0 134.6c0-27 17-51.2 42.5-60.3l192-68.6zM256 66L82.3 128 256 190l173.7-62L256 66zm32 368.6l160-57.1 0-188L288 246.6l0 188z&quot; /&gt;
&lt;/svg&gt;

          &lt;span class=&quot;resource-name&quot;&gt;Parametric Gyroid Surface Model.SLDPRT&lt;/span&gt;
        &lt;/a&gt;
      &lt;/li&gt;
    
      &lt;li class=&quot;resource-item&quot;&gt;
        &lt;a href=&quot;/images/Gyroid Brain Coral Shrimp Hide.3mf&quot; class=&quot;resource-link&quot;&gt;
          &lt;svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;28&quot;&gt;
  &lt;path fill=&quot;#D1CECC&quot; d=&quot;M234.5 5.7c13.9-5 29.1-5 43.1 0l192 68.6C495 83.4 512 107.5 512 134.6l0 242.9c0 27-17 51.2-42.5 60.3l-192 68.6c-13.9 5-29.1 5-43.1 0l-192-68.6C17 428.6 0 404.5 0 377.4L0 134.6c0-27 17-51.2 42.5-60.3l192-68.6zM256 66L82.3 128 256 190l173.7-62L256 66zm32 368.6l160-57.1 0-188L288 246.6l0 188z&quot; /&gt;
&lt;/svg&gt;

          &lt;span class=&quot;resource-name&quot;&gt;Gyroid Brain Coral Shrimp Hide.3mf&lt;/span&gt;
        &lt;/a&gt;
      &lt;/li&gt;
    
  &lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;I searched the internet for a good general-purpose gyroid model that I could use as a base. I found nothing suitable, but I &lt;em&gt;did&lt;/em&gt; find &lt;a href=&quot;https://www.youtube.com/watch?v=PJovx-ytJYI&quot;&gt;this super helpful video&lt;/a&gt; by Youtuber &lt;a href=&quot;https://www.youtube.com/@A____11&quot;&gt;@A____11&lt;/a&gt; showing me how to build one in SolidWorks.&lt;/p&gt;

&lt;p&gt;Once I had this surface model built, I was able to thicken it by a few millimeters, and then pattern it into a larger gyroid cubic volume. Then, I could make &lt;em&gt;anything&lt;/em&gt; into a gyroid by simply performing an intersection (union) between the gyroid cubic and the shape I wanted.&lt;/p&gt;

&lt;div class=&quot;post-image portrait&quot;&gt;
  &lt;img src=&quot;/images/Parametric Gyroid Surface.png&quot; alt=&quot;A parametric gyroid surface built in SolidWorks.&quot; /&gt;
  &lt;span class=&quot;caption&quot;&gt;A parametric gyroid surface built in SolidWorks.&lt;/span&gt;
&lt;/div&gt;

&lt;div class=&quot;post-image portrait&quot;&gt;
  &lt;img src=&quot;/images/Parametric Gyroid-Filled Cube.png&quot; alt=&quot;The gyroid surface thickened, trimmed and patterned into a cubic volume.&quot; /&gt;
  &lt;span class=&quot;caption&quot;&gt;The gyroid surface thickened, trimmed and patterned into a cubic volume.&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;The result: a printable model of two brain coral, with a hidden underground tunnel joining them together. I also trimmed off one side of the model to match the curved glass of my Fluval Flex 15 (so we could peer inside and see how everyone was doing in there). I printed this with a sand-coloured PETG, using Prusa Slicer’s &lt;em&gt;fuzzy skin&lt;/em&gt; option.&lt;/p&gt;

&lt;div class=&quot;post-image &quot;&gt;
  &lt;img src=&quot;/images/brain-coral-shrimp-hide.jpeg&quot; alt=&quot;The shrimp hide in place in my tank.&quot; /&gt;
  &lt;span class=&quot;caption&quot;&gt;The shrimp hide in place in my tank.&lt;/span&gt;
&lt;/div&gt;

&lt;div class=&quot;post-video &quot;&gt;
  &lt;video controls=&quot;&quot;&gt;
    &lt;source src=&quot;/images/brain-coral-shrimp-hide.mp4&quot; type=&quot;video/mp4&quot; /&gt;
    Your browser does not support the video tag.
  &lt;/video&gt;
  &lt;span class=&quot;caption&quot;&gt;My shrimp in their shrimp hide, safe from the resident predator of the tank.&lt;/span&gt;
&lt;/div&gt;</content><author><name></name></author><summary type="html">If you’re familiar with 3D printing, you’re probably familiar with the word gyroid. It’s the default fill method for the Prusa slicer and for good reason - gyroids strike a great balance between print speed, structural integrity and filament efficiency.</summary></entry><entry><title type="html">Dryer Filter Vacuum Attachment</title><link href="/2024/10/06/dryer-filter-vacuum-attachment.html" rel="alternate" type="text/html" title="Dryer Filter Vacuum Attachment" /><published>2024-10-06T18:01:00+00:00</published><updated>2024-10-06T18:01:00+00:00</updated><id>/2024/10/06/dryer-filter-vacuum-attachment</id><content type="html" xml:base="/2024/10/06/dryer-filter-vacuum-attachment.html">&lt;p&gt;I don’t mean to alarm you, but you’re not doing a good job maintaining your clothes dryer. “But I clean the lint trap regularly!”, you say. That’s only half the job! Did you know that lint gets trapped in the &lt;em&gt;cavity&lt;/em&gt; that the lint filter slides into? You can’t even see it!&lt;/p&gt;

&lt;div class=&quot;post-video portrait&quot;&gt;
  &lt;video controls=&quot;&quot;&gt;
    &lt;source src=&quot;/images/Dryer Filter Vacuum Attachment.mp4&quot; type=&quot;video/mp4&quot; /&gt;
    Your browser does not support the video tag.
  &lt;/video&gt;
  &lt;span class=&quot;caption&quot;&gt;The vacuum attachment in action.&lt;/span&gt;
&lt;/div&gt;

&lt;div class=&quot;resources&quot;&gt;
  &lt;h3&gt;Buy and Download&lt;/h3&gt;
  &lt;p&gt;You can purchase the file to 3D print this dryer lint trap vacuum attachment for &lt;strong&gt;$2 CAD&lt;/strong&gt;.&lt;/p&gt;
  &lt;ul class=&quot;resource-list&quot;&gt;
    
      &lt;li class=&quot;resource-item&quot;&gt;
        &lt;a href=&quot;https://buy.stripe.com/7sIaF0fxZ9D97nO3cd&quot; class=&quot;resource-link&quot;&gt;
          &lt;svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;28&quot;&gt;
  &lt;path fill=&quot;#D1CECC&quot; d=&quot;M234.5 5.7c13.9-5 29.1-5 43.1 0l192 68.6C495 83.4 512 107.5 512 134.6l0 242.9c0 27-17 51.2-42.5 60.3l-192 68.6c-13.9 5-29.1 5-43.1 0l-192-68.6C17 428.6 0 404.5 0 377.4L0 134.6c0-27 17-51.2 42.5-60.3l192-68.6zM256 66L82.3 128 256 190l173.7-62L256 66zm32 368.6l160-57.1 0-188L288 246.6l0 188z&quot; /&gt;
&lt;/svg&gt;

          &lt;span class=&quot;resource-name&quot;&gt;Dryer Vacuum Attachment.STL&lt;/span&gt;
        &lt;/a&gt;
      &lt;/li&gt;
    
  &lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;Don’t worry though, here’s the fix: print this attachment and put it on the end of your vacuum. Suck up all the lint. Feel the endorphins surge across your brain as you check of this chore from your to-do list.&lt;/p&gt;

&lt;p&gt;The attachment is big - it will take up the entire print volume of a Prusa MK3S 3D Printer (250mm x 210mm x 210mm). You’ll need to rotate it 45 degrees on the print bed. There is a nice little flat surface that doubles as a hanger hole - you can position that part flat-side down, and then print without any supports. PLA is just fine for this model, but if you’re feeling bold and are looking for maximum durability, PVC would also be a good choice.&lt;/p&gt;

&lt;div class=&quot;post-image &quot;&gt;
  &lt;img src=&quot;/images/Marge Dryer Concerns.jpeg&quot; alt=&quot;I forgot to clean the lint basket in the dryer! If someone broke into the house and did laundry, it could start a fire!&quot; /&gt;
  &lt;span class=&quot;caption&quot;&gt;I forgot to clean the lint basket in the dryer! If someone broke into the house and did laundry, it could start a fire!&lt;/span&gt;
&lt;/div&gt;</content><author><name></name></author><summary type="html">I don’t mean to alarm you, but you’re not doing a good job maintaining your clothes dryer. “But I clean the lint trap regularly!”, you say. That’s only half the job! Did you know that lint gets trapped in the cavity that the lint filter slides into? You can’t even see it!</summary></entry><entry><title type="html">xTool S1 Honeycomb Alignment Jig</title><link href="/2024/03/15/xtool-s1-honeycomb-alignment-jig.html" rel="alternate" type="text/html" title="xTool S1 Honeycomb Alignment Jig" /><published>2024-03-15T18:01:00+00:00</published><updated>2024-03-15T18:01:00+00:00</updated><id>/2024/03/15/xtool-s1-honeycomb-alignment-jig</id><content type="html" xml:base="/2024/03/15/xtool-s1-honeycomb-alignment-jig.html">&lt;p&gt;So far, I’m loving my new laser cutter. Now that I’ve got the setting dialed in (and my ventilation system working properly), the &lt;a href=&quot;https://ca.xtool.com/products/xtool-s1-laser-cutter&quot;&gt;xTool S1 laser cutter&lt;/a&gt; has proved itself quite capable. It’s kind of disorienting for a cutting job to take 5 minutes when you’re used to waiting 5 &lt;em&gt;hours&lt;/em&gt; for a 3D print to finish!&lt;/p&gt;

&lt;div class=&quot;post-video portrait&quot;&gt;
  &lt;video controls=&quot;&quot;&gt;
    &lt;source src=&quot;/images/Laser Cutter Alignment Jig Installation.mp4&quot; type=&quot;video/mp4&quot; /&gt;
    Your browser does not support the video tag.
  &lt;/video&gt;
  &lt;span class=&quot;caption&quot;&gt;Installing the jig in my xTool S1 laser cutter.&lt;/span&gt;
&lt;/div&gt;

&lt;div class=&quot;post-image portrait&quot;&gt;
  &lt;img src=&quot;/images/Laser Cutter Alignment Jig with Crosshairs.jpeg&quot; alt=&quot;Use the laser crosshairs to perfectly zero the laser&apos;s position relative to the (now parallel) material.&quot; /&gt;
  &lt;span class=&quot;caption&quot;&gt;Use the laser crosshairs to perfectly zero the laser&apos;s position relative to the (now parallel) material.&lt;/span&gt;
&lt;/div&gt;

&lt;div class=&quot;resources&quot;&gt;
  &lt;h3&gt;Buy and Download&lt;/h3&gt;
  &lt;p&gt;You can purchase the file to 3D print the xTool S1 Honeycomb Alignment Jig for &lt;strong&gt;$2 CAD&lt;/strong&gt;.&lt;/p&gt;
  &lt;ul class=&quot;resource-list&quot;&gt;
    
      &lt;li class=&quot;resource-item&quot;&gt;
        &lt;a href=&quot;https://buy.stripe.com/cN28wS1H94iPfUk3ce&quot; class=&quot;resource-link&quot;&gt;
          &lt;svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;28&quot;&gt;
  &lt;path fill=&quot;#D1CECC&quot; d=&quot;M234.5 5.7c13.9-5 29.1-5 43.1 0l192 68.6C495 83.4 512 107.5 512 134.6l0 242.9c0 27-17 51.2-42.5 60.3l-192 68.6c-13.9 5-29.1 5-43.1 0l-192-68.6C17 428.6 0 404.5 0 377.4L0 134.6c0-27 17-51.2 42.5-60.3l192-68.6zM256 66L82.3 128 256 190l173.7-62L256 66zm32 368.6l160-57.1 0-188L288 246.6l0 188z&quot; /&gt;
&lt;/svg&gt;

          &lt;span class=&quot;resource-name&quot;&gt;xTool S1 Honeycomb Alignment Jig.STL&lt;/span&gt;
        &lt;/a&gt;
      &lt;/li&gt;
    
  &lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;Mine came with a nice &lt;a href=&quot;https://www.xtool.com/products/xtool-s1-honeycomb-panel&quot;&gt;honeycomb panel&lt;/a&gt; to reduce burn marks on cutting jobs. Its great, but for some very strange reason, there is no built-in way to ensure that the panel is aligned properly. It just kind of… sits in there. You can move it an inch or so in both directions, and there aren’t any parallel surfaces that you can press it against for alignment.&lt;/p&gt;

&lt;p&gt;This becomes an issue when you’re engraving or cutting rectangular material and you need to ensure that your cuts are aligned with the material’s edges. For example, when engraving text on a rectangular board, you don’t want the word to look crooked!&lt;/p&gt;

&lt;p&gt;With much trial and error, I made this alignment jig. It uses three of the bolt heads inside the cutter to affix itself, and its underside conforms to the contours of the honeycomb jig. With a little jiggling, you’ll feel everything drop into place.&lt;/p&gt;

&lt;p&gt;Once in place, keeping your material square is a breeze. The inner corner of the jig is exactly 1 inch right of the honeycomb’s left side, and zero inches from its bottom. This ensures that any material you put in the machine stays within the laser’s travel boundary.&lt;/p&gt;

&lt;p&gt;This jig can be printed on most 3D printers using PLA, with no supports.&lt;/p&gt;</content><author><name></name></author><summary type="html">So far, I’m loving my new laser cutter. Now that I’ve got the setting dialed in (and my ventilation system working properly), the xTool S1 laser cutter has proved itself quite capable. It’s kind of disorienting for a cutting job to take 5 minutes when you’re used to waiting 5 hours for a 3D print to finish!</summary></entry><entry><title type="html">Conversational</title><link href="/2024/02/17/conversational-a-geographically-aware-podcast-generator.html" rel="alternate" type="text/html" title="Conversational" /><published>2024-02-17T19:27:00+00:00</published><updated>2024-02-17T19:27:00+00:00</updated><id>/2024/02/17/conversational-a-geographically-aware-podcast-generator</id><content type="html" xml:base="/2024/02/17/conversational-a-geographically-aware-podcast-generator.html">&lt;p&gt;I was driving from Toronto to Ottawa one day and I was bored. I had decided to take Highway 7 instead of the 401 just because the scenery was a little bit more interesting. As I passed through small towns and villages, I found myself wondering, “What happens in this town? What am I missing by just blowing right by it?”. Wouldn’t it be cool, I thought, if I could be playing a podcast that talked about each of these places as I drove by them?&lt;/p&gt;

&lt;div class=&quot;post-video portrait&quot;&gt;
  &lt;video controls=&quot;&quot;&gt;
    &lt;source src=&quot;/images/Conversational.mp4&quot; type=&quot;video/mp4&quot; /&gt;
    Your browser does not support the video tag.
  &lt;/video&gt;
  &lt;span class=&quot;caption&quot;&gt;Listen to the start of a podcast about the Evergreen Brickworks in Toronto.&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;When I got back home, I started on this proof-of-concept app, which I call Conversational. Conversational is a Rails app with LLM-backed agents having a podcast-style conversation about the significant things close to your current location. As you move around, your browser sends periodic location updates to the app’s server. The app then uses Google Places API to determine what is notable and close by, then uses Wikipedia and ChatGPT to generate a plausible back-and-forth conversation between two “hosts”. There is a third (silent) agent in the background that acts as the program manager, keeping the other two agents on topic.&lt;/p&gt;

&lt;div class=&quot;resources&quot;&gt;
  &lt;h3&gt;Resources&lt;/h3&gt;
  &lt;p&gt;Feel free to fork and contribute to this Rails app.&lt;/p&gt;
  &lt;ul class=&quot;resource-list&quot;&gt;
    
      &lt;li class=&quot;resource-item&quot;&gt;
        &lt;a href=&quot;https://github.com/gregmatthewcrossley/conversational&quot; class=&quot;resource-link&quot;&gt;
          &lt;svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; x=&quot;0px&quot; y=&quot;0px&quot; viewBox=&quot;0 0 28 28&quot; enable-background=&quot;new 0 0 28 28&quot; xml:space=&quot;preserve&quot; width=&quot;28&quot;&gt;
&lt;path id=&quot;GitHub&quot; fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; fill=&quot;#D1CECC&quot; d=&quot;M14.01,0C6.27,0-0.01,6.28-0.01,14.02
  c0,6.19,4.02,11.45,9.59,13.3c0.7,0.13,0.96-0.3,0.96-0.68c0-0.33-0.01-1.21-0.02-2.38c-3.9,0.85-4.72-1.88-4.72-1.88
  c-0.64-1.62-1.56-2.05-1.56-2.05c-1.27-0.87,0.1-0.85,0.1-0.85c1.41,0.1,2.15,1.44,2.15,1.44c1.25,2.14,3.28,1.52,4.08,1.16
  c0.13-0.91,0.49-1.52,0.89-1.87c-3.11-0.35-6.38-1.56-6.38-6.93c0-1.53,0.55-2.78,1.44-3.76C6.37,9.17,5.89,7.74,6.65,5.81
  c0,0,1.18-0.38,3.85,1.44c1.12-0.31,2.32-0.47,3.51-0.47c1.19,0.01,2.39,0.16,3.51,0.47c2.68-1.81,3.85-1.44,3.85-1.44
  c0.76,1.93,0.28,3.35,0.14,3.71c0.9,0.98,1.44,2.23,1.44,3.76c0,5.38-3.28,6.57-6.4,6.92c0.5,0.43,0.95,1.29,0.95,2.6
  c0,1.87-0.02,3.39-0.02,3.84c0,0.37,0.25,0.81,0.96,0.67c5.56-1.86,9.58-7.11,9.58-13.3C28.03,6.28,21.75,0,14.01,0z&quot; /&gt;
&lt;/svg&gt;

          &lt;span class=&quot;resource-name&quot;&gt;&apos;Conversational&apos; code repo&lt;/span&gt;
        &lt;/a&gt;
      &lt;/li&gt;
    
  &lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;It needs a fair bit more polish, and there’s no doubt you’re listening to AI, but its a promising idea. I’m particularly excited about advances in text-to-speech, like what &lt;a href=&quot;https://elevenlabs.io&quot;&gt;Eleven Labs&lt;/a&gt; is doing. As these models get better, apps like this will only become more convincing.&lt;/p&gt;</content><author><name></name></author><summary type="html">I was driving from Toronto to Ottawa one day and I was bored. I had decided to take Highway 7 instead of the 401 just because the scenery was a little bit more interesting. As I passed through small towns and villages, I found myself wondering, “What happens in this town? What am I missing by just blowing right by it?”. Wouldn’t it be cool, I thought, if I could be playing a podcast that talked about each of these places as I drove by them?</summary></entry><entry><title type="html">Laser-cut Windup Car</title><link href="/2023/12/12/laser-cut-windup-car.html" rel="alternate" type="text/html" title="Laser-cut Windup Car" /><published>2023-12-12T18:01:00+00:00</published><updated>2023-12-12T18:01:00+00:00</updated><id>/2023/12/12/laser-cut-windup-car</id><content type="html" xml:base="/2023/12/12/laser-cut-windup-car.html">&lt;p&gt;I read &lt;em&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/31423417-this-is-how-we-do-it&quot;&gt;a children’s book&lt;/a&gt;&lt;/em&gt; to my son, and one part really resonated with him. The book goes into all sorts of detail about the routines of seven different families, but there was one dad who, after dinner, built model cars with his son. My son asked if &lt;em&gt;we&lt;/em&gt; could build a model car. Knowing that he’s young and would need a project that could be started and finished in an hour, I decided to use my laser cutter to make a simple model car kit out of basswood sheet.&lt;/p&gt;

&lt;div class=&quot;post-image portrait&quot;&gt;
  &lt;img src=&quot;/images/Laser Cut Car Pattern.jpeg&quot; alt=&quot;The laser-cut windup car pattern.&quot; /&gt;
  &lt;span class=&quot;caption&quot;&gt;The laser-cut windup car pattern.&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;There are about a &lt;a href=&quot;https://3axis.co/laser-cut/vehicles/&quot;&gt;million and one patterns&lt;/a&gt; for making a car out of 3mm laser-cut basswood, but where’s the fun in that? I decided to design my own using Solidworks.&lt;/p&gt;

&lt;div class=&quot;resources&quot;&gt;
  &lt;h3&gt;Resources&lt;/h3&gt;
  &lt;p&gt;Let me know if you successfully build this car - I&apos;d love to see it!&lt;/p&gt;
  &lt;ul class=&quot;resource-list&quot;&gt;
    
      &lt;li class=&quot;resource-item&quot;&gt;
        &lt;a href=&quot;/images/Laser-cut Windup Car Pattern.DXF&quot; class=&quot;resource-link&quot;&gt;
          &lt;svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;28&quot;&gt;
  &lt;path fill=&quot;#D1CECC&quot; d=&quot;M234.5 5.7c13.9-5 29.1-5 43.1 0l192 68.6C495 83.4 512 107.5 512 134.6l0 242.9c0 27-17 51.2-42.5 60.3l-192 68.6c-13.9 5-29.1 5-43.1 0l-192-68.6C17 428.6 0 404.5 0 377.4L0 134.6c0-27 17-51.2 42.5-60.3l192-68.6zM256 66L82.3 128 256 190l173.7-62L256 66zm32 368.6l160-57.1 0-188L288 246.6l0 188z&quot; /&gt;
&lt;/svg&gt;

          &lt;span class=&quot;resource-name&quot;&gt;Laser-cut Windup Car Pattern.DXF&lt;/span&gt;
        &lt;/a&gt;
      &lt;/li&gt;
    
  &lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;The car can be pulled backwards to “wind up” the wheels. It has so much torque that it sometimes does a burnout. Once assembled, the car can be easily painted or coloured to add some flair.&lt;/p&gt;

&lt;p&gt;Other than one sheet of 3mm basswood, you’ll also need:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;four 608 bearings (skateboard bearings)&lt;/li&gt;
  &lt;li&gt;an elastic band&lt;/li&gt;
  &lt;li&gt;some basic white or wood glue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most of the chassis is glued together, but the wheels are attached to the axil using the four little pins in the pattern.&lt;/p&gt;

&lt;p&gt;Happy modeling!&lt;/p&gt;</content><author><name></name></author><summary type="html">I read a children’s book to my son, and one part really resonated with him. The book goes into all sorts of detail about the routines of seven different families, but there was one dad who, after dinner, built model cars with his son. My son asked if we could build a model car. Knowing that he’s young and would need a project that could be started and finished in an hour, I decided to use my laser cutter to make a simple model car kit out of basswood sheet.</summary></entry><entry><title type="html">Light Switch Audio Toggler</title><link href="/2023/12/12/light-switch-audio-toggler.html" rel="alternate" type="text/html" title="Light Switch Audio Toggler" /><published>2023-12-12T18:01:00+00:00</published><updated>2023-12-12T18:01:00+00:00</updated><id>/2023/12/12/light-switch-audio-toggler</id><content type="html" xml:base="/2023/12/12/light-switch-audio-toggler.html">&lt;p&gt;In our family, we like to sleep with white noise. It drowns out the sound of the city outside (and the creaky floors if someone is up late). We like it so much that I installed two ceiling speakers in our bedroom just for playing white noise.&lt;/p&gt;

&lt;p&gt;But I didn’t want to have to futz around with my phone or fiddle with audio electronics each night. And as it happens, our bedroom had one of those outlets that is turned on by a wall switch. This gave me an idea: could I make a simple relay device that would toggle an audio signal based on whether the outlet was switched on or off?&lt;/p&gt;

&lt;p&gt;So I built this device. It’s just a two-pole 12v relay switch that toggles between two stereo audio signals from a pair of RCA connectors. The relay switch is connected to the wall outlet via a basic 12v power supply, and when the power is cut (via the wall light switch), the relay switches from one input to the other.&lt;/p&gt;

&lt;div class=&quot;post-image portrait&quot;&gt;
  &lt;img src=&quot;/images/Light Switch Audio Toggle Enclosure Installed.jpeg&quot; alt=&quot;The finished device, hooked up. I&apos;ve got an Airport Express (for AirPlay) on one input and an old iPod perpetually playing a 12 hour white noise loop on another.&quot; /&gt;
  &lt;span class=&quot;caption&quot;&gt;The finished device, hooked up. I&apos;ve got an Airport Express (for AirPlay) on one input and an old iPod perpetually playing a 12 hour white noise loop on another.&lt;/span&gt;
&lt;/div&gt;

&lt;div class=&quot;resources&quot;&gt;
  &lt;h3&gt;Resources&lt;/h3&gt;
  &lt;p&gt;Let me know if you successfully build this device yourself - I&apos;d love to see it!&lt;/p&gt;
  &lt;ul class=&quot;resource-list&quot;&gt;
    
      &lt;li class=&quot;resource-item&quot;&gt;
        &lt;a href=&quot;/images/Light Switch Audio Toggle Enclosure.step&quot; class=&quot;resource-link&quot;&gt;
          &lt;svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;28&quot;&gt;
  &lt;path fill=&quot;#D1CECC&quot; d=&quot;M234.5 5.7c13.9-5 29.1-5 43.1 0l192 68.6C495 83.4 512 107.5 512 134.6l0 242.9c0 27-17 51.2-42.5 60.3l-192 68.6c-13.9 5-29.1 5-43.1 0l-192-68.6C17 428.6 0 404.5 0 377.4L0 134.6c0-27 17-51.2 42.5-60.3l192-68.6zM256 66L82.3 128 256 190l173.7-62L256 66zm32 368.6l160-57.1 0-188L288 246.6l0 188z&quot; /&gt;
&lt;/svg&gt;

          &lt;span class=&quot;resource-name&quot;&gt;Light Switch Audio Toggle Enclosure.step&lt;/span&gt;
        &lt;/a&gt;
      &lt;/li&gt;
    
      &lt;li class=&quot;resource-item&quot;&gt;
        &lt;a href=&quot;/images/Light Switch Audio Toggle KiCAD Project.zip&quot; class=&quot;resource-link&quot;&gt;
          &lt;svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;28&quot;&gt;
  &lt;path fill=&quot;#D1CECC&quot; d=&quot;M234.5 5.7c13.9-5 29.1-5 43.1 0l192 68.6C495 83.4 512 107.5 512 134.6l0 242.9c0 27-17 51.2-42.5 60.3l-192 68.6c-13.9 5-29.1 5-43.1 0l-192-68.6C17 428.6 0 404.5 0 377.4L0 134.6c0-27 17-51.2 42.5-60.3l192-68.6zM256 66L82.3 128 256 190l173.7-62L256 66zm32 368.6l160-57.1 0-188L288 246.6l0 188z&quot; /&gt;
&lt;/svg&gt;

          &lt;span class=&quot;resource-name&quot;&gt;Light Switch Audio Toggle KiCAD Project.zip&lt;/span&gt;
        &lt;/a&gt;
      &lt;/li&gt;
    
  &lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;Outside the device, I’ve got a few things connected. First, I made a 12-hour track of white noise and copied it to an old iPod nano I had laying around. The iPod is connected to a charger so it never dies, and its output is connected to one of the toggle device’s inputs. The other input is connected to an Airport Express, so I can play music via AirPlay during the day. Finally, I bought a tiny power amp that is connected to the device’s outputs and to the speakers in my ceiling. Like the iPod, the amp stays on always. It doesn’t use much power.&lt;/p&gt;

&lt;p&gt;And with that all set up, we’ve got a light switch that turns on white noise when you turn it off! I even had a spare plug in that switch-connected outlet, so it can switch a lamp at the same time.&lt;/p&gt;

&lt;p&gt;Oh, and you might ask, “Why don’t you just plug the amp into the switch-connected outlet?”. Well, three reasons:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;the amp doesn’t handle depowering gracefully (you’ll hear a loud &lt;em&gt;pop&lt;/em&gt; when it depowers)&lt;/li&gt;
  &lt;li&gt;I wanted to be able to toggle between &lt;em&gt;two&lt;/em&gt; audio signals, not just turn one on or off&lt;/li&gt;
  &lt;li&gt;it was a fun project!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me know if you build this yourself!&lt;/p&gt;

&lt;div class=&quot;post-image &quot;&gt;
  &lt;img src=&quot;/images/What is my purpose.jpg&quot; alt=&quot;&quot; /&gt;
  &lt;span class=&quot;caption&quot;&gt;&lt;/span&gt;
&lt;/div&gt;</content><author><name></name></author><summary type="html">In our family, we like to sleep with white noise. It drowns out the sound of the city outside (and the creaky floors if someone is up late). We like it so much that I installed two ceiling speakers in our bedroom just for playing white noise.</summary></entry><entry><title type="html">Counting Trick-or-Treaters</title><link href="/2023/10/06/counting-trick-or-treaters.html" rel="alternate" type="text/html" title="Counting Trick-or-Treaters" /><published>2023-10-06T18:01:00+00:00</published><updated>2023-10-06T18:01:00+00:00</updated><id>/2023/10/06/counting-trick-or-treaters</id><content type="html" xml:base="/2023/10/06/counting-trick-or-treaters.html">&lt;p&gt;“How much candy should we buy?”, you ask yourself every October. Buy too little and you risk an egging, or worse. Buy too much and you’ll be snacking yourself to death until Christmas.&lt;/p&gt;

&lt;div class=&quot;post-video portrait&quot;&gt;
  &lt;video controls=&quot;&quot;&gt;
    &lt;source src=&quot;/images/murielhalloween.boo.mp4&quot; type=&quot;video/mp4&quot; /&gt;
    Your browser does not support the video tag.
  &lt;/video&gt;
  &lt;span class=&quot;caption&quot;&gt;Neighbors could quickly self-report their candy needs. No login needed - browser sessions keep track of each neighbor.&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;Why guess when you can use an app? As the unelected social convenor of my street, I made this little web app so that all my neighbors could self-report their trick-or-treaters.&lt;/p&gt;

&lt;p&gt;The whole thing was designed to be a 5-second experience for people. No logins, no save button. Just one click per trick-or-treater. Allergies can be self-reported, too, and once you add an allergy, other people can opt into it as well. Mistaken clicks can be undone with one click of the “undo” button. The app makes liberal use of Rails’ ActionCable (websockets) to responsively update the page view. Since no sensitive information is being shared, I just used browser sessions (cookies) to keep track of each person.&lt;/p&gt;

&lt;div class=&quot;resources&quot;&gt;
  &lt;h3&gt;Resources&lt;/h3&gt;
  &lt;p&gt;Feel free to fork and contribute to this Rails app.&lt;/p&gt;
  &lt;ul class=&quot;resource-list&quot;&gt;
    
      &lt;li class=&quot;resource-item&quot;&gt;
        &lt;a href=&quot;https://github.com/gregmatthewcrossley/murielhalloween.boo&quot; class=&quot;resource-link&quot;&gt;
          &lt;svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; x=&quot;0px&quot; y=&quot;0px&quot; viewBox=&quot;0 0 28 28&quot; enable-background=&quot;new 0 0 28 28&quot; xml:space=&quot;preserve&quot; width=&quot;28&quot;&gt;
&lt;path id=&quot;GitHub&quot; fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; fill=&quot;#D1CECC&quot; d=&quot;M14.01,0C6.27,0-0.01,6.28-0.01,14.02
  c0,6.19,4.02,11.45,9.59,13.3c0.7,0.13,0.96-0.3,0.96-0.68c0-0.33-0.01-1.21-0.02-2.38c-3.9,0.85-4.72-1.88-4.72-1.88
  c-0.64-1.62-1.56-2.05-1.56-2.05c-1.27-0.87,0.1-0.85,0.1-0.85c1.41,0.1,2.15,1.44,2.15,1.44c1.25,2.14,3.28,1.52,4.08,1.16
  c0.13-0.91,0.49-1.52,0.89-1.87c-3.11-0.35-6.38-1.56-6.38-6.93c0-1.53,0.55-2.78,1.44-3.76C6.37,9.17,5.89,7.74,6.65,5.81
  c0,0,1.18-0.38,3.85,1.44c1.12-0.31,2.32-0.47,3.51-0.47c1.19,0.01,2.39,0.16,3.51,0.47c2.68-1.81,3.85-1.44,3.85-1.44
  c0.76,1.93,0.28,3.35,0.14,3.71c0.9,0.98,1.44,2.23,1.44,3.76c0,5.38-3.28,6.57-6.4,6.92c0.5,0.43,0.95,1.29,0.95,2.6
  c0,1.87-0.02,3.39-0.02,3.84c0,0.37,0.25,0.81,0.96,0.67c5.56-1.86,9.58-7.11,9.58-13.3C28.03,6.28,21.75,0,14.01,0z&quot; /&gt;
&lt;/svg&gt;

          &lt;span class=&quot;resource-name&quot;&gt;&apos;murielhalloween.boo&apos; code repo&lt;/span&gt;
        &lt;/a&gt;
      &lt;/li&gt;
    
  &lt;/ul&gt;
&lt;/div&gt;</content><author><name></name></author><summary type="html">“How much candy should we buy?”, you ask yourself every October. Buy too little and you risk an egging, or worse. Buy too much and you’ll be snacking yourself to death until Christmas.</summary></entry><entry><title type="html">AirTag Twist Clip</title><link href="/2023/10/06/airtag-twist-clip.html" rel="alternate" type="text/html" title="AirTag Twist Clip" /><published>2023-10-06T18:01:00+00:00</published><updated>2023-10-06T18:01:00+00:00</updated><id>/2023/10/06/airtag-twist-clip</id><content type="html" xml:base="/2023/10/06/airtag-twist-clip.html">&lt;p&gt;If you have a small child running around, and you want some extra peace of mind, Apple’s &lt;a href=&quot;https://www.apple.com/airtag/&quot;&gt;AirTags&lt;/a&gt; can go a long way. There are lots of ways to attach them, but most are too dangly to survive a day on an active a 4 year old.&lt;/p&gt;

&lt;p&gt;I designed this discrete and secure twist clip to keep tabs on my son when we last visited &lt;a href=&quot;https://www.finestresorts.com/punta-cana/finest-punta-cana/&quot;&gt;our favorite vacation spot&lt;/a&gt;. It’s just two parts, and can attach anywhere on clothing or fabric.&lt;/p&gt;

&lt;div class=&quot;post-video &quot;&gt;
  &lt;video controls=&quot;&quot;&gt;
    &lt;source src=&quot;/images/AirTag Twist Clip Assembly.mp4&quot; type=&quot;video/mp4&quot; /&gt;
    Your browser does not support the video tag.
  &lt;/video&gt;
  &lt;span class=&quot;caption&quot;&gt;Assembly is pretty easy. Just make sure the three little bumps are on the same side, facing outwards.&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;I like to attach mine to the back of t-shirts or swimming tops. They’ve yet to fall off during rough play and they’re pretty discrete. But if you know what you’re looking for, you can easily check whether they’re still attached.&lt;/p&gt;

&lt;div class=&quot;resources&quot;&gt;
  &lt;h3&gt;Buy and Download&lt;/h3&gt;
  &lt;p&gt;You can purchase the file to 3D print the AirTag Twist Clip for &lt;strong&gt;$2 CAD&lt;/strong&gt;.&lt;/p&gt;
  &lt;ul class=&quot;resource-list&quot;&gt;
    
      &lt;li class=&quot;resource-item&quot;&gt;
        &lt;a href=&quot;https://buy.stripe.com/9AQ6oK1H902z8rS6oo&quot; class=&quot;resource-link&quot;&gt;
          &lt;svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;28&quot;&gt;
  &lt;path fill=&quot;#D1CECC&quot; d=&quot;M234.5 5.7c13.9-5 29.1-5 43.1 0l192 68.6C495 83.4 512 107.5 512 134.6l0 242.9c0 27-17 51.2-42.5 60.3l-192 68.6c-13.9 5-29.1 5-43.1 0l-192-68.6C17 428.6 0 404.5 0 377.4L0 134.6c0-27 17-51.2 42.5-60.3l192-68.6zM256 66L82.3 128 256 190l173.7-62L256 66zm32 368.6l160-57.1 0-188L288 246.6l0 188z&quot; /&gt;
&lt;/svg&gt;

          &lt;span class=&quot;resource-name&quot;&gt;AirTag Twist Clip.STL&lt;/span&gt;
        &lt;/a&gt;
      &lt;/li&gt;
    
  &lt;/ul&gt;
&lt;/div&gt;

&lt;div class=&quot;post-video portrait&quot;&gt;
  &lt;video controls=&quot;&quot;&gt;
    &lt;source src=&quot;/images/AirTag Twist Clip.mp4&quot; type=&quot;video/mp4&quot; /&gt;
    Your browser does not support the video tag.
  &lt;/video&gt;
  &lt;span class=&quot;caption&quot;&gt;Battle-testing the AirTag Twist Clip on our vacation.&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;Any 3D printer should be able to print this without supports. PLA works just fine, but note that PLA does expand a bit when wet, so PETG might be a better material choice if the pool will be part of your day.&lt;/p&gt;</content><author><name></name></author><summary type="html">If you have a small child running around, and you want some extra peace of mind, Apple’s AirTags can go a long way. There are lots of ways to attach them, but most are too dangly to survive a day on an active a 4 year old.</summary></entry></feed>