<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Coltography</title>
	<atom:link href="https://coltography.ca/feed/" rel="self" type="application/rss+xml" />
	<link>https://coltography.ca</link>
	<description>Projects &#38; Visuals</description>
	<lastBuildDate>Fri, 23 Oct 2026 02:59:27 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.4</generator>
	<item>
		<title>Cloning My Garage Door Remote FOB with 3D Printing</title>
		<link>https://coltography.ca/cloning-my-garage-door-remote-fob-with-3d-printing/</link>
		
		<dc:creator><![CDATA[Colton]]></dc:creator>
		<pubDate>Sun, 18 Oct 2026 20:50:01 +0000</pubDate>
				<category><![CDATA[3D Printing]]></category>
		<category><![CDATA[DIY]]></category>
		<guid isPermaLink="false">https://coltography.ca/?p=1462</guid>

					<description><![CDATA[I saved money by designing and 3D printing a custom replacement shell for my broken garage door remote fob using durable PETG filament.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">My garage door remote / keyfob recently broke, and my building&#8217;s strata wanted to charge me ~$50 for a new one. Seeing as how the electronics were totally fine, I saw a good opportunity to practice my CAD and re-design a new shell to 3D print. </p>



<p class="has-text-align-center wp-block-paragraph"><br><strong>The STL / print files are free to download on my <a href="https://makerworld.com/en/models/3465757-garage-remote-key-fob#profileId-3955353" target="_blank" rel="noopener">MakerWorld</a>.</strong></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">This seemed simple enough, the only weird part was this weird little semi-flexible piece for the actuating button.</p>



<div class="wp-block-columns are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/keyfob-two-empty-halves-on-grid-mat.jpeg" class="wp-block-image size-large wp-lightbox-container"><img fetchpriority="high" decoding="async" width="1024" height="576" src="https://coltography.ca/img/keyfob-two-empty-halves-on-grid-mat-1024x576.jpeg" alt="Two halves of a grey keyfob housing lying open on a green cutting mat." class="wp-image-1498" srcset="https://coltography.ca/img/keyfob-two-empty-halves-on-grid-mat-1024x576.jpeg 1024w, https://coltography.ca/img/keyfob-two-empty-halves-on-grid-mat-300x169.jpeg 300w, https://coltography.ca/img/keyfob-two-empty-halves-on-grid-mat-768x432.jpeg 768w, https://coltography.ca/img/keyfob-two-empty-halves-on-grid-mat-1536x865.jpeg 1536w, https://coltography.ca/img/keyfob-two-empty-halves-on-grid-mat-2048x1153.jpeg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">The old, stock keyfob with its PCB removed</figcaption></figure>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-video"><video height="480" style="aspect-ratio: 854 / 480;" width="854" src="https://coltography.ca/img/disassembled-remote-control-interior.mp4" autoplay loop muted playsinline poster="https://coltography.ca/img/disassembled-remote-control-interior-poster.jpg"></video><figcaption class="wp-element-caption">Actuating button</figcaption></figure>
</div>
</div>



<p class="wp-block-paragraph">I got a little fancy with it and set the first bottom layer to <a href="https://www.orcaslicer.com/wiki/print_settings/strength/strength_settings_patterns#octagram-spiral" target="_blank" rel="noreferrer noopener">octogram spiral</a> in the <a href="https://www.orcaslicer.com/" target="_blank" rel="noreferrer noopener">slicer</a>. This adds a nice geometric &#8220;shine&#8221; to an otherwise boring flat face. </p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-video is-boomerang"><video height="480" style="aspect-ratio: 854 / 480;" width="854" src="https://coltography.ca/img/3d-printed-garage-door-remote-fob-surface-finish-boomerang.mp4?v=377565%3A1792463189" autoplay loop muted playsinline poster="https://coltography.ca/img/3d-printed-garage-door-remote-fob-surface-finish-poster.jpg"></video></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/keyfob-printing-on-3d-printer-bed.jpeg" class="wp-block-image size-large wp-lightbox-container"><img decoding="async" width="1024" height="576" src="https://coltography.ca/img/keyfob-printing-on-3d-printer-bed-1024x576.jpeg" alt="A 3D printer nozzle extrudes purple filament onto a textured print bed to create a garage door remote." class="wp-image-1500" srcset="https://coltography.ca/img/keyfob-printing-on-3d-printer-bed-1024x576.jpeg 1024w, https://coltography.ca/img/keyfob-printing-on-3d-printer-bed-300x169.jpeg 300w, https://coltography.ca/img/keyfob-printing-on-3d-printer-bed-768x432.jpeg 768w, https://coltography.ca/img/keyfob-printing-on-3d-printer-bed-1536x864.jpeg 1536w, https://coltography.ca/img/keyfob-printing-on-3d-printer-bed-2048x1152.jpeg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>
</div>



<p class="wp-block-paragraph">Given the beating a set of keys goes through, I decided to use PETG instead of PLA. I tried my best to make it &#8216;snap&#8217; together like the original, so the little bit of flex from the PETG made this work pretty well. It&#8217;s actually surprisingly tight, and has held up for over a year now.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<figure class="wp-block-gallery has-nested-images columns-2 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/keyfob-purple-housing-disassembled-with-circuit-board.jpeg" class="wp-block-image size-large"><img decoding="async" width="1024" height="576" data-id="1509" src="https://coltography.ca/img/keyfob-purple-housing-disassembled-with-circuit-board-1024x576.jpeg" alt="Disassembled purple 3D printed keyfob housing components and a green circuit board on a wooden table." class="wp-image-1509" srcset="https://coltography.ca/img/keyfob-purple-housing-disassembled-with-circuit-board-1024x576.jpeg 1024w, https://coltography.ca/img/keyfob-purple-housing-disassembled-with-circuit-board-300x169.jpeg 300w, https://coltography.ca/img/keyfob-purple-housing-disassembled-with-circuit-board-768x432.jpeg 768w, https://coltography.ca/img/keyfob-purple-housing-disassembled-with-circuit-board-1536x865.jpeg 1536w, https://coltography.ca/img/keyfob-purple-housing-disassembled-with-circuit-board-2048x1153.jpeg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/keyfob-custom-textured-purple-housing-placed-on-wooden-table.jpeg" class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" data-id="1506" src="https://coltography.ca/img/keyfob-custom-textured-purple-housing-placed-on-wooden-table-1024x576.jpeg" alt="Two textured purple 3D-printed keyfob housings resting side by side on a wooden surface." class="wp-image-1506" srcset="https://coltography.ca/img/keyfob-custom-textured-purple-housing-placed-on-wooden-table-1024x576.jpeg 1024w, https://coltography.ca/img/keyfob-custom-textured-purple-housing-placed-on-wooden-table-300x169.jpeg 300w, https://coltography.ca/img/keyfob-custom-textured-purple-housing-placed-on-wooden-table-768x432.jpeg 768w, https://coltography.ca/img/keyfob-custom-textured-purple-housing-placed-on-wooden-table-1536x865.jpeg 1536w, https://coltography.ca/img/keyfob-custom-textured-purple-housing-placed-on-wooden-table-2048x1153.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/keyfob-assembled-purple-housing-held-horizontally.jpeg" class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" data-id="1501" src="https://coltography.ca/img/keyfob-assembled-purple-housing-held-horizontally-1024x576.jpeg" alt="A person holds a small, purple 3D printed garage door remote keyfob housing in their hand in front of a pegboard." class="wp-image-1501" srcset="https://coltography.ca/img/keyfob-assembled-purple-housing-held-horizontally-1024x576.jpeg 1024w, https://coltography.ca/img/keyfob-assembled-purple-housing-held-horizontally-300x169.jpeg 300w, https://coltography.ca/img/keyfob-assembled-purple-housing-held-horizontally-768x432.jpeg 768w, https://coltography.ca/img/keyfob-assembled-purple-housing-held-horizontally-1536x864.jpeg 1536w, https://coltography.ca/img/keyfob-assembled-purple-housing-held-horizontally-2048x1152.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/keyfob-custom-3d-printed-purple-housing-internal-view.jpeg" class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" data-id="1502" src="https://coltography.ca/img/keyfob-custom-3d-printed-purple-housing-internal-view-1024x576.jpeg" alt="A purple 3D printed keyfob housing with integrated button piece and retaining clips rests on a wooden surface." class="wp-image-1502" srcset="https://coltography.ca/img/keyfob-custom-3d-printed-purple-housing-internal-view-1024x576.jpeg 1024w, https://coltography.ca/img/keyfob-custom-3d-printed-purple-housing-internal-view-300x169.jpeg 300w, https://coltography.ca/img/keyfob-custom-3d-printed-purple-housing-internal-view-768x432.jpeg 768w, https://coltography.ca/img/keyfob-custom-3d-printed-purple-housing-internal-view-1536x864.jpeg 1536w, https://coltography.ca/img/keyfob-custom-3d-printed-purple-housing-internal-view-2048x1152.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Lid with button &amp; LED diffuser</figcaption></figure>



<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/keyfob-two-halves-in-hands.jpeg" class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" data-id="1497" src="https://coltography.ca/img/keyfob-two-halves-in-hands-1024x576.jpeg" alt="A pair of purple 3D-printed garage door remote keyfob halves held in two hands." class="wp-image-1497" srcset="https://coltography.ca/img/keyfob-two-halves-in-hands-1024x576.jpeg 1024w, https://coltography.ca/img/keyfob-two-halves-in-hands-300x169.jpeg 300w, https://coltography.ca/img/keyfob-two-halves-in-hands-768x432.jpeg 768w, https://coltography.ca/img/keyfob-two-halves-in-hands-1536x864.jpeg 1536w, https://coltography.ca/img/keyfob-two-halves-in-hands-2048x1152.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Two halves, with button &amp; LED diffuser</figcaption></figure>



<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/keyfob-3d-printed-keyfob-casings-held-in-hand-comparison.jpeg" class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" data-id="1511" src="https://coltography.ca/img/keyfob-3d-printed-keyfob-casings-held-in-hand-comparison-1024x576.jpeg" alt="A hand holding three different colored 3D printed garage door remote keyfob casings against a workbench background." class="wp-image-1511" srcset="https://coltography.ca/img/keyfob-3d-printed-keyfob-casings-held-in-hand-comparison-1024x576.jpeg 1024w, https://coltography.ca/img/keyfob-3d-printed-keyfob-casings-held-in-hand-comparison-300x169.jpeg 300w, https://coltography.ca/img/keyfob-3d-printed-keyfob-casings-held-in-hand-comparison-768x432.jpeg 768w, https://coltography.ca/img/keyfob-3d-printed-keyfob-casings-held-in-hand-comparison-1536x864.jpeg 1536w, https://coltography.ca/img/keyfob-3d-printed-keyfob-casings-held-in-hand-comparison-2048x1152.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Old keyfob, next to two 3D printed versions</figcaption></figure>
</figure>



<p class="wp-block-paragraph">The stock FOB features a status / feedback LED light under the lid. I made a little opening for this and a seperate file to print to snap-fit in a diffuser, to give it a more finished look. </p>



<figure class="wp-block-video aligncenter" style="max-width:100%;margin-left:auto;margin-right:auto;width:448px"><video height="480" style="aspect-ratio: 852 / 480;" width="852" src="https://coltography.ca/img/testing-3d-printed-garage-remote-keyfob-button-led.mp4" autoplay loop muted playsinline poster="https://coltography.ca/img/testing-3d-printed-garage-remote-keyfob-button-led-poster.jpg"></video></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">This is a pretty small, finicky little piece so it&#8217;s an option. <strong>The file on my <a href="https://makerworld.com/en/@coltograph" target="_blank" rel="noreferrer noopener">MakerWorld</a> has a seperate build plate / STL for a lid without the LED opening for those who don&#8217;t want to deal with it.</strong></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">The button itself is also push-fit, and a little finicky. I&#8217;ve put little video clips below to show how they snap in. You&#8217;ll likely need a little tiny screw driver, and might need to print some extras for when you inevitably break one</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-video"><video height="480" style="aspect-ratio: 854 / 480;" width="854" src="https://coltography.ca/img/installing-button-mechanism-on-3d-printed-keyfob.mp4" autoplay loop muted playsinline poster="https://coltography.ca/img/installing-button-mechanism-on-3d-printed-keyfob-poster.jpg"></video><figcaption class="wp-element-caption">Installing Button</figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-video"><video height="480" style="aspect-ratio: 854 / 480;" width="854" src="https://coltography.ca/img/installing-led-diffuser-in-3d-printed-keyfob.mp4" autoplay loop muted playsinline poster="https://coltography.ca/img/installing-led-diffuser-in-3d-printed-keyfob-poster.jpg"></video><figcaption class="wp-element-caption">Installing Tiny LED Diffuser</figcaption></figure>
</div>
</div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">I&#8217;m pretty happy with the finished result. I actually made this FOB over a year ago and beta-tested it on a set of keys to get beat up, to see if it actually holds up. I didn&#8217;t want to release something like this for the few people that may need to print a replacement. </p>



<h2 class="wp-block-heading has-text-align-center">Size &amp; Weight Stats:</h2>



<figure class="wp-block-table aligncenter"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center"><strong>Measurement</strong></td><td class="has-text-align-center" data-align="center"><strong>Old Keyfob</strong></td><td class="has-text-align-center" data-align="center"><strong>New Keyfob</strong></td><td class="has-text-align-center" data-align="center"><strong>Size Reduction</strong></td></tr><tr><td class="has-text-align-center" data-align="center">Weight</td><td class="has-text-align-center" data-align="center">11.4g</td><td class="has-text-align-center" data-align="center">9.8g</td><td class="has-text-align-center" data-align="center">-14%</td></tr><tr><td class="has-text-align-center" data-align="center">Length</td><td class="has-text-align-center" data-align="center">59mm</td><td class="has-text-align-center" data-align="center">55mm</td><td class="has-text-align-center" data-align="center">-7%</td></tr><tr><td class="has-text-align-center" data-align="center">Width</td><td class="has-text-align-center" data-align="center">33.5mm</td><td class="has-text-align-center" data-align="center">32mm</td><td class="has-text-align-center" data-align="center">-4%</td></tr><tr><td class="has-text-align-center" data-align="center">Thickness</td><td class="has-text-align-center" data-align="center">14.4mm</td><td class="has-text-align-center" data-align="center">11.5mm</td><td class="has-text-align-center" data-align="center">-20%</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Overall the 3D printed version is about a <strong>~29% volume reduction</strong> which is nice.</p>



<p class="wp-block-paragraph">And again the STL / print files are free to download on my <a href="https://makerworld.com/en/models/3465757-garage-remote-key-fob#profileId-3955353" target="_blank" rel="noopener">MakerWorld</a>!</p>



<p class="wp-block-paragraph">Thanks for looking.</p>
]]></content:encoded>
					
		
		<enclosure url="https://coltography.ca/img/disassembled-remote-control-interior.mp4" length="192495" type="video/mp4" />
<enclosure url="https://coltography.ca/img/3d-printed-garage-door-remote-fob-surface-finish.mp4" length="377565" type="video/mp4" />
<enclosure url="https://coltography.ca/img/testing-3d-printed-garage-remote-keyfob-button-led.mp4" length="358021" type="video/mp4" />
<enclosure url="https://coltography.ca/img/installing-button-mechanism-on-3d-printed-keyfob.mp4" length="932433" type="video/mp4" />
<enclosure url="https://coltography.ca/img/installing-led-diffuser-in-3d-printed-keyfob.mp4" length="1447305" type="video/mp4" />

			</item>
		<item>
		<title>3D Printed Aerosol Spray Can Holders for Work Vehicles</title>
		<link>https://coltography.ca/3d-printed-aerosol-spray-can-holders-for-work-vehicle/</link>
		
		<dc:creator><![CDATA[Colton]]></dc:creator>
		<pubDate>Wed, 14 Oct 2026 21:24:53 +0000</pubDate>
				<category><![CDATA[3D Printing]]></category>
		<guid isPermaLink="false">https://coltography.ca/?p=1210</guid>

					<description><![CDATA[Custom 3D printed aerosol spray can holders for my work van: no more rattling cans or wasted shelf space. Free STL print files on MakerWorld!]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">These are my custom designed, 3D printed aerosol spray can holders for my work van. I was tired of the noise and wasted shelf space. This also helped utilize an otherwise wasted chunk of space. </p>



<figure class="wp-block-video aligncenter" style="max-width:100%;margin-left:auto;margin-right:auto;width:664px"><video height="480" style="aspect-ratio: 854 / 480;" width="854" src="https://coltography.ca/img/3d-printed-aerosol-spray-can-holder-for-work-vehicle-example-video-web.mp4" autoplay loop muted playsinline poster="https://coltography.ca/img/3d-printed-aerosol-spray-can-holder-for-work-vehicle-example-video-web-poster.jpg"></video><figcaption class="wp-element-caption">3D Printed Aerosol Spray Can Holder/Mount for Work Truck</figcaption></figure>



<p class="wp-block-paragraph"><br>These are made to fit standard ~65mm cans (Like WD-40, fluid film, etc.) but can work with slightly larger ones. Used #2 Robertson self tapping screws to make mounting easy. I printed them out of PETG to add some flex to them so the cans can securely &#8220;slip&#8221; into the grip and be held properly. I tried my best to match the &#8220;Milwaukee Red&#8221; but couldn&#8217;t find an exact match. These have held on for months now through some pretty rough roads.</p>



<p class="wp-block-paragraph">Here&#8217;s an example of all of them mounted in the little &#8216;alcove&#8217; behind the sliding door in my 2021 Ford Transit. Personally I find this extremely satisfying!</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex">
<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/3d-printed-aerosol-mounted-in-work-van.jpeg" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="576" height="1024" data-id="1409" src="https://coltography.ca/img/3d-printed-aerosol-mounted-in-work-van-576x1024.jpeg" alt="Multiple aerosol spray cans secured in red 3D printed holders mounted on the vertical panel inside a work van." class="wp-image-1409" srcset="https://coltography.ca/img/3d-printed-aerosol-mounted-in-work-van-576x1024.jpeg 576w, https://coltography.ca/img/3d-printed-aerosol-mounted-in-work-van-169x300.jpeg 169w, https://coltography.ca/img/3d-printed-aerosol-mounted-in-work-van-768x1365.jpeg 768w, https://coltography.ca/img/3d-printed-aerosol-mounted-in-work-van-864x1536.jpeg 864w, https://coltography.ca/img/3d-printed-aerosol-mounted-in-work-van-1152x2048.jpeg 1152w, https://coltography.ca/img/3d-printed-aerosol-mounted-in-work-van.jpeg 1440w" sizes="auto, (max-width: 576px) 100vw, 576px" /></figure>



<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/3d-printed-spray-can-holders-in-vertical-van-mount.jpeg" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="576" height="1024" data-id="1408" src="https://coltography.ca/img/3d-printed-spray-can-holders-in-vertical-van-mount-576x1024.jpeg" alt="A close-up view of 3D printed red holders securing multiple aerosol spray cans in a work van." class="wp-image-1408" srcset="https://coltography.ca/img/3d-printed-spray-can-holders-in-vertical-van-mount-576x1024.jpeg 576w, https://coltography.ca/img/3d-printed-spray-can-holders-in-vertical-van-mount-169x300.jpeg 169w, https://coltography.ca/img/3d-printed-spray-can-holders-in-vertical-van-mount-768x1365.jpeg 768w, https://coltography.ca/img/3d-printed-spray-can-holders-in-vertical-van-mount-864x1536.jpeg 864w, https://coltography.ca/img/3d-printed-spray-can-holders-in-vertical-van-mount-1152x2048.jpeg 1152w, https://coltography.ca/img/3d-printed-spray-can-holders-in-vertical-van-mount.jpeg 1440w" sizes="auto, (max-width: 576px) 100vw, 576px" /></figure>



<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/3d-printed-red-spray-can-bracket-mounting-details.jpeg" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="576" data-id="1407" src="https://coltography.ca/img/3d-printed-red-spray-can-bracket-mounting-details-1024x576.jpeg" alt="Low angle close-up of a red 3D printed spray can bracket mounted with two screws inside a work vehicle." class="wp-image-1407" srcset="https://coltography.ca/img/3d-printed-red-spray-can-bracket-mounting-details-1024x576.jpeg 1024w, https://coltography.ca/img/3d-printed-red-spray-can-bracket-mounting-details-300x169.jpeg 300w, https://coltography.ca/img/3d-printed-red-spray-can-bracket-mounting-details-768x432.jpeg 768w, https://coltography.ca/img/3d-printed-red-spray-can-bracket-mounting-details-1536x864.jpeg 1536w, https://coltography.ca/img/3d-printed-red-spray-can-bracket-mounting-details-2048x1152.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/3d-printed-can-holder-front-angle.jpeg" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="576" data-id="1410" src="https://coltography.ca/img/3d-printed-can-holder-front-angle-1024x576.jpeg" alt="Front angle view of a bright red 3D printed aerosol spray can holder mounted on a white surface inside a work van." class="wp-image-1410" srcset="https://coltography.ca/img/3d-printed-can-holder-front-angle-1024x576.jpeg 1024w, https://coltography.ca/img/3d-printed-can-holder-front-angle-300x169.jpeg 300w, https://coltography.ca/img/3d-printed-can-holder-front-angle-768x432.jpeg 768w, https://coltography.ca/img/3d-printed-can-holder-front-angle-1536x864.jpeg 1536w, https://coltography.ca/img/3d-printed-can-holder-front-angle-2048x1152.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/3d-printed-spray-can-holder-side-view.jpeg" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="576" data-id="1411" src="https://coltography.ca/img/3d-printed-spray-can-holder-side-view-1024x576.jpeg" alt="Close-up of a red 3D printed aerosol spray can holder mounted in a work van." class="wp-image-1411" srcset="https://coltography.ca/img/3d-printed-spray-can-holder-side-view-1024x576.jpeg 1024w, https://coltography.ca/img/3d-printed-spray-can-holder-side-view-300x169.jpeg 300w, https://coltography.ca/img/3d-printed-spray-can-holder-side-view-768x432.jpeg 768w, https://coltography.ca/img/3d-printed-spray-can-holder-side-view-1536x864.jpeg 1536w, https://coltography.ca/img/3d-printed-spray-can-holder-side-view-2048x1152.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</figure>



<p class="wp-block-paragraph">The bottom piece securely holds the little lip on standard spray cans, and so far it&#8217;s been universally working for any typical lubricant and paint can. This makes it quick and easy to snap them in, and pull them out. I&#8217;m pretty impressed with how well 3D printed holders/tools have held up in a light industrial environment.</p>



<p class="wp-block-paragraph">As always, the STL print files are free to download and print yourself over on my <a href="https://makerworld.com/en/models/2581922-aerosol-spray-can-holder#profileId-3334509" data-type="link" data-id="https://makerworld.com/en/models/2581922-aerosol-spray-can-holder#profileId-3334509" target="_blank" rel="noreferrer noopener">MakerWorld</a> page!</p>



<p class="wp-block-paragraph">Thanks for looking!</p>
]]></content:encoded>
					
		
		<enclosure url="https://coltography.ca/img/3d-printed-aerosol-spray-can-holder-for-work-vehicle-example-video-web.mp4" length="295888" type="video/mp4" />

			</item>
		<item>
		<title>Automatically Sorting Work Photos on iOS with Home Assistant and an ESP32</title>
		<link>https://coltography.ca/automatically-sorting-work-photos-on-ios/</link>
		
		<dc:creator><![CDATA[Obsidian]]></dc:creator>
		<pubDate>Fri, 09 Oct 2026 02:03:38 +0000</pubDate>
				<category><![CDATA[Home Assistant]]></category>
		<guid isPermaLink="false">https://coltography.ca/?p=1003</guid>

					<description><![CDATA[How I auto-sort iPhone work photos into their own album using an ESP32 iBeacon in my van, Home Assistant and an iOS Shortcut, then hide them in Immich]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">The Goal:</h2>



<h4 class="wp-block-heading">Sort the photos in my iPhone camera roll to a dedicated work album, then archive them in Immich to hide them from my memories and main feed. </h4>



<p class="wp-block-paragraph">This wasn&#8217;t a simple &#8220;location based&#8221; automation because I work at different jobsites all the time.</p>



<p class="wp-block-paragraph">iOS automations are pretty clunky and unreliable, so I accomplished this primarily with the help of Home Assistant to do most of the &#8216;logic&#8217;.</p>



<p class="wp-block-paragraph"><strong>Prerequisites:</strong></p>



<ul class="wp-block-list">
<li>ESP32 + ESPHome &#8211; to act as an iBeacon</li>



<li>Home Assistant &#8211; to facilitate the booleans and variables</li>



<li>Apple Homepod / TV &#8211; To get Home Assistant booleans into the shortcuts app</li>



<li>VPN connection (or Home Assistant Cloud/Link) &#8211; for remote execution</li>
</ul>



<p class="wp-block-paragraph">For context, iOS 27 broke &#8220;automations&#8221; triggered by bluetooth connections (Without an annoying notification) which sucks because I need this to trigger when I hop into my work van in the morning.</p>



<h3 class="wp-block-heading">Meet the ESP32 iBeacon: The trigger. </h3>



<p class="wp-block-paragraph">Using ESPHome I made a simple iBeacon, and set it up <a href="https://esphome.io/components/esp32_ble_beacon/" data-type="link" data-id="https://esphome.io/components/esp32_ble_beacon/" target="_blank" rel="noreferrer noopener">as per the docs:</a></p>



<pre class="wp-block-code"><code><code>esp32_ble_beacon:</code><code>type: iBeacon</code><code>uuid: 'C5A1E7D2-4B3F-4E8A-9D61-7F2B0C8E5A34'</code><code>major: 1</code><code>minor: 1</code><code>min_interval: 100ms</code><code>max_interval: 200ms</code><code>tx_power: 3dBm</code></code></pre>



<p class="wp-block-paragraph">(I had to set tx_power low because this cheap esp32-c3 has an antenna issue.)</p>


<div class="wp-block-image">
<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/esp32-c3-esphome-ibeacon-in-vehicle-for-home-assistant-automations.jpg" class="aligncenter size-full is-resized wp-lightbox-container"><img loading="lazy" decoding="async" width="1920" height="1080" src="https://coltography.ca/img/esp32-c3-esphome-ibeacon-in-vehicle-for-home-assistant-automations.jpg" alt="A hand holds a small ESP32 microcontroller board plugged into a USB cable inside a car." class="wp-image-1061" style="aspect-ratio:1.7732260424286759;width:638px;height:auto" srcset="https://coltography.ca/img/esp32-c3-esphome-ibeacon-in-vehicle-for-home-assistant-automations.jpg 1920w, https://coltography.ca/img/esp32-c3-esphome-ibeacon-in-vehicle-for-home-assistant-automations-300x169.jpg 300w, https://coltography.ca/img/esp32-c3-esphome-ibeacon-in-vehicle-for-home-assistant-automations-768x432.jpg 768w, https://coltography.ca/img/esp32-c3-esphome-ibeacon-in-vehicle-for-home-assistant-automations-1024x576.jpg 1024w, https://coltography.ca/img/esp32-c3-esphome-ibeacon-in-vehicle-for-home-assistant-automations-1536x864.jpg 1536w" sizes="auto, (max-width: 1920px) 100vw, 1920px" /><figcaption class="wp-element-caption">ESP32-C3 Installed in my work van</figcaption></figure>
</div>


<p class="wp-block-paragraph">After installing, I need to tell Home Assistant my work van is a &#8220;zone&#8221;. To accomplish this, I first created a zone in the UI called &#8220;Van&#8221;.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p class="wp-block-paragraph"><strong>Note:</strong></p>



<ul class="wp-block-list">
<li>Name of the zone, in this case &#8220;Van&#8221;, must match the config below</li>



<li>GPS coordinates are some random area, I set 0.0 and 0.0</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-image">
<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/home-assistant-zone-example-for-ibeacon.jpg" class="aligncenter size-full is-resized wp-lightbox-container"><img loading="lazy" decoding="async" width="929" height="1280" src="https://coltography.ca/img/home-assistant-zone-example-for-ibeacon.jpg" alt="A user interface displaying the creation of a new zone named Van with a map location." class="wp-image-1025" style="aspect-ratio:0.7258010118043845;width:300px;height:auto" srcset="https://coltography.ca/img/home-assistant-zone-example-for-ibeacon.jpg 929w, https://coltography.ca/img/home-assistant-zone-example-for-ibeacon-218x300.jpg 218w, https://coltography.ca/img/home-assistant-zone-example-for-ibeacon-743x1024.jpg 743w, https://coltography.ca/img/home-assistant-zone-example-for-ibeacon-768x1058.jpg 768w" sizes="auto, (max-width: 929px) 100vw, 929px" /><figcaption class="wp-element-caption">Example of zone setup in UI</figcaption></figure>
</div></div>
</div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">Next I added the following to my configuration.yaml:</p>



<pre class="wp-block-code"><code>homeassistant:
  customize:
    zone.van:
      beacon:
        uuid: C5A1E7D2-4B3F-4E8A-9D61-7F2B0C8E5A34
        major: 1
        minor: 1</code></pre>



<p class="wp-block-paragraph"><strong>Note:</strong></p>



<ul class="wp-block-list">
<li>The UUID, minor, major match the ESPHome config.</li>



<li>The zone.van matches the name of the zone created in UI, ie: &#8220;van&#8221; (Important)</li>



<li>Home Assistant must be restarted</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Automation</h3>



<p class="wp-block-paragraph">The key is to make this as bulletproof as possible, and only trigger on weekdays, when its the first time getting into the van, and only once a day &#8211; in case I have to move the van at some point in the evening.</p>



<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="has-text-align-center wp-block-paragraph">The flow would look like this:</p>



<pre class="wp-block-code"><code><strong>WHEN</strong> the phone sees the van beacon
|
+-- Is today a workday?
|        <em>NO</em> --&gt; stop, do nothing
|        <strong>YES</strong>
|
+-- Has work already started today?
|         <em>YES</em> --&gt; stop, do nothing
|         <strong>NO</strong>
|
+--&gt; 1. Send "Van Connected" notification
        2. Turn <strong>ON</strong> "Working"
        3. Turn <strong>ON</strong> "Work started today"

<strong>WHEN</strong> your phone arrives in the Home zone
|
+--&gt; Turn <strong>OFF</strong> "Working"

<strong>EVERY</strong> night at midnight
|
+--&gt; Turn <strong>OFF</strong> "Work started today"
     Turn <strong>OFF</strong> "Connected to van"

<strong>RESULT:</strong>
"Working" <strong>ON</strong> --&gt; photos go to the Work album
"Working" <strong>OFF</strong> --&gt; photos stay where they are</code></pre>



<p class="wp-block-paragraph">With a baseline of what needs to happen, I made the automation and included the YAML below for anyone interested in digging deeper into it. <br><br>Notes:</p>



<ul class="wp-block-list">
<li>The trigger for arriving home is based on the event, not the usual &#8220;Zone Entered&#8221;</li>



<li>The iBeacon -&gt; van entered trigger is also based on the event firing once, not entering the zone</li>



<li>This is necessary for both, since after the phone detects the iBeacon, phone pings my location -&gt; instantly thinks I&#8217;m back home -&gt; turns OFF &#8220;Working&#8221; boolean that needs to be ON for sorting</li>



<li>With event firing as the trigger, it will only happen once I actually re-enter that zone</li>



<li>I have a few booleans (input helpers) that flip on/off to make this all work</li>



<li>Trigger IDs are used to keep the whole automation nice and clean</li>
</ul>



<p class="wp-block-paragraph">Hopefully that makes sense, it took some troubleshooting to narrow down and work!</p>



<p class="wp-block-paragraph">Home Assistant Automation YAML: </p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<pre class="wp-block-code"><code>alias: Work Photos Auto Sort
description: ''
triggers:
  - trigger: event
    event_type: ios.zone_entered
    event_data:
      zone: zone.van
    id: Van Connected
    alias: Entered Van
  - trigger: event
    event_type: ios.zone_entered
    event_data:
      zone: zone.home
    id: Home
    alias: Arrived Home
  - trigger: time
    at: '00:00:00'
    weekday:
      - fri
      - thu
      - wed
      - tue
      - mon
      - sun
      - sat
    id: Daily Reset
    alias: Daily Reset
conditions: &#91;]
actions:
  - if:
      - condition: and
        conditions:
          - condition: trigger
            id:
              - Van Connected
          - condition: state
            entity_id: binary_sensor.workday_sensor_2
            state:
              - 'on'
            enabled: true
          - condition: switch.is_off
            target:
              entity_id: input_boolean.work_start
            options:
              behavior: any
              for: '00:00:00'
            enabled: true
    then:
      - action: notify.mobile_app_satellite
        metadata: {}
        data:
          message: Van Connected
          title: Success
      - action: input_boolean.turn_on
        metadata: {}
        target:
          entity_id: input_boolean.working
        data: {}
        enabled: true
      - action: input_boolean.turn_on
        metadata: {}
        target:
          entity_id: input_boolean.work_start
        data: {}
        enabled: true
    alias: Start Work
  - if:
      - condition: trigger
        id:
          - Home
    then:
      - action: input_boolean.turn_off
        metadata: {}
        target:
          entity_id: input_boolean.working
        data: {}
    alias: Home
  - if:
      - condition: trigger
        id:
          - Daily Reset
    then:
      - action: input_boolean.turn_off
        metadata: {}
        target:
          entity_id: input_boolean.work_start
        data: {}
      - action: input_boolean.turn_off
        metadata: {}
        target:
          entity_id: input_boolean.connected_to_van
        data: {}
    alias: Reset
mode: single</code></pre>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-image">
<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/home-assistant-auto-sort-work-photos-automation-example.png" class="aligncenter size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="861" height="692" src="https://coltography.ca/img/home-assistant-auto-sort-work-photos-automation-example.png" alt="A screenshot of a Home Assistant automation setup page showing triggers, conditions, and actions." class="wp-image-1048" style="aspect-ratio:1.244242831022751" srcset="https://coltography.ca/img/home-assistant-auto-sort-work-photos-automation-example.png 861w, https://coltography.ca/img/home-assistant-auto-sort-work-photos-automation-example-300x241.png 300w, https://coltography.ca/img/home-assistant-auto-sort-work-photos-automation-example-768x617.png 768w" sizes="auto, (max-width: 861px) 100vw, 861px" /><figcaption class="wp-element-caption">The automation overview</figcaption></figure>
</div></div>
</div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">iOS Shortcut</h3>



<p class="wp-block-paragraph">For iOS shortcuts I hit this annoying wall where input helpers / booleans would not show up. Luckily I already have an Apple Homepod which lets my booleans show up in the Apple home app and I can use their state as a condition in Shortcuts.</p>



<p class="has-text-align-center wp-block-paragraph">The flow would look like this:</p>



<pre class="wp-block-code"><code><strong>WHEN</strong> the camera app closes
|
+-- Is 'working' toggle on?
         <em>NO</em> --&gt; stop, do nothing
         <strong>YES</strong>
          |
          +--&gt; 1. Sort recent photos into 'Work' album</code></pre>



<p class="wp-block-paragraph">With the clunkiness of iOS shortcuts app, I was able to accomplish this. Here&#8217;s what it looks like (My home is named &#8220;Goobopolis&#8221;, don&#8217;t judge me.)</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-image">
<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/auto-sort-work-photos-ios-shortcuts-example-1.png" class="aligncenter size-large is-resized wp-lightbox-container"><img loading="lazy" decoding="async" width="471" height="1024" src="https://coltography.ca/img/auto-sort-work-photos-ios-shortcuts-example-1-471x1024.png" alt="A screenshot of an iOS Shortcut for auto sorting Work Photos with various automation actions." class="wp-image-1052" style="aspect-ratio:0.4599683771740693;width:282px;height:auto" srcset="https://coltography.ca/img/auto-sort-work-photos-ios-shortcuts-example-1-471x1024.png 471w, https://coltography.ca/img/auto-sort-work-photos-ios-shortcuts-example-1-138x300.png 138w, https://coltography.ca/img/auto-sort-work-photos-ios-shortcuts-example-1-768x1669.png 768w, https://coltography.ca/img/auto-sort-work-photos-ios-shortcuts-example-1-706x1536.png 706w, https://coltography.ca/img/auto-sort-work-photos-ios-shortcuts-example-1-942x2048.png 942w, https://coltography.ca/img/auto-sort-work-photos-ios-shortcuts-example-1.png 1177w" sizes="auto, (max-width: 471px) 100vw, 471px" /></figure>
</div></div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-image">
<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/auto-sort-work-photos-ios-shortcuts-example-2.png" class="aligncenter size-large is-resized wp-lightbox-container"><img loading="lazy" decoding="async" width="471" height="1024" src="https://coltography.ca/img/auto-sort-work-photos-ios-shortcuts-example-2-471x1024.png" alt="A screenshot of an Apple Shortcuts workflow for auto sorting work photos with filters for date taken, time taken, and album." class="wp-image-1053" style="aspect-ratio:0.4599683771740693;width:282px;height:auto" srcset="https://coltography.ca/img/auto-sort-work-photos-ios-shortcuts-example-2-471x1024.png 471w, https://coltography.ca/img/auto-sort-work-photos-ios-shortcuts-example-2-138x300.png 138w, https://coltography.ca/img/auto-sort-work-photos-ios-shortcuts-example-2-768x1669.png 768w, https://coltography.ca/img/auto-sort-work-photos-ios-shortcuts-example-2-706x1536.png 706w, https://coltography.ca/img/auto-sort-work-photos-ios-shortcuts-example-2-942x2048.png 942w, https://coltography.ca/img/auto-sort-work-photos-ios-shortcuts-example-2.png 1177w" sizes="auto, (max-width: 471px) 100vw, 471px" /></figure>
</div></div>
</div>



<p class="wp-block-paragraph">Link to the iOS shortcut if you want to just add it/tweak it yourself:<br><a rel="noopener noreferrer" target="_blank" href="https://www.icloud.com/shortcuts/c5ec247f71c9460da19c92467b39d3dd">https://www.icloud.com/shortcuts/c5ec247f71c9460da19c92467b39d3dd</a><br><br>If you can figure out how to use raw input booleans from home assistant as a condition, <a href="https://coltography.ca/contact/" data-type="page" data-id="25" target="_blank" rel="noreferrer noopener">contact me.</a></p>



<p class="wp-block-paragraph">And here&#8217;s the photos and their album in all it’s glory, sorted and working for over a month now without a hitch. </p>



<p class="wp-block-paragraph">There&#8217;s been maybe 1 or 2 occasions where I took a photo I didn&#8217;t want to end up in work photos, and I just manually removed it later. MUCH easier than sorting all my work photos into an album manually.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-image">
<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/auto-sort-work-photos-album-ios.png" class="aligncenter size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="471" height="1024" src="https://coltography.ca/img/auto-sort-work-photos-album-ios-471x1024.png" alt="A smartphone screen showing the Work album with a green icon depicting crossed tools in the iOS Photos app." class="wp-image-1054" srcset="https://coltography.ca/img/auto-sort-work-photos-album-ios-471x1024.png 471w, https://coltography.ca/img/auto-sort-work-photos-album-ios-138x300.png 138w, https://coltography.ca/img/auto-sort-work-photos-album-ios-768x1669.png 768w, https://coltography.ca/img/auto-sort-work-photos-album-ios-706x1536.png 706w, https://coltography.ca/img/auto-sort-work-photos-album-ios-942x2048.png 942w, https://coltography.ca/img/auto-sort-work-photos-album-ios.png 1206w" sizes="auto, (max-width: 471px) 100vw, 471px" /></figure>
</div></div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-image">
<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/auto-sort-work-photos-album-ios-example.png" class="aligncenter size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="471" height="1024" src="https://coltography.ca/img/auto-sort-work-photos-album-ios-example-471x1024.png" alt="A smartphone screen showing a photo gallery app interface with a grid of work-related images." class="wp-image-1055" srcset="https://coltography.ca/img/auto-sort-work-photos-album-ios-example-471x1024.png 471w, https://coltography.ca/img/auto-sort-work-photos-album-ios-example-138x300.png 138w, https://coltography.ca/img/auto-sort-work-photos-album-ios-example-768x1669.png 768w, https://coltography.ca/img/auto-sort-work-photos-album-ios-example-706x1536.png 706w, https://coltography.ca/img/auto-sort-work-photos-album-ios-example-942x2048.png 942w, https://coltography.ca/img/auto-sort-work-photos-album-ios-example.png 1177w" sizes="auto, (max-width: 471px) 100vw, 471px" /></figure>
</div></div>
</div>



<p class="wp-block-paragraph">Conclusion: There’s probably an app for this that already exists, I didn&#8217;t even look.</p>



<p class="wp-block-paragraph">Knowing iOS it would be another subscription based app that maybe works, maybe doesn&#8217;t. </p>



<p class="wp-block-paragraph">This is my own homebrew solution and it&#8217;s been working great!</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Usage Cost Notifications with Home Assistant and Bambu Lab 3D Printers</title>
		<link>https://coltography.ca/usage-cost-notifications-with-home-assistant-and-bambu-lab-3d-printers/</link>
		
		<dc:creator><![CDATA[Colton]]></dc:creator>
		<pubDate>Mon, 27 Jan 2025 00:55:26 +0000</pubDate>
				<category><![CDATA[3D Printing]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[Home Assistant]]></category>
		<guid isPermaLink="false">https://coltography.ca/?p=301</guid>

					<description><![CDATA[The goal here is to create as accurate as possible cost estimates with Bambu Lab printers and Home Assistant to provide more detailed notifications when a print completes, and curate data analytics…]]></description>
										<content:encoded><![CDATA[
<h4 class="wp-block-heading has-text-align-center has-medium-font-size">The goal here is to create as accurate as possible cost estimates with Bambu Lab printers and Home Assistant to provide more detailed notifications when a print completes, and curate data analytics of print usage / cost over time.<br><br><strong>The beauty of this automation is that it does NOT rely on Bambu Cloud and can run on prints in LAN mode. Prior to the modifications below, you needed Bambu Cloud to view the print weight, and couldn&#8217;t get the filament cost based on each filament profile.</strong><br></h4>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"></p>


<div class="wp-block-image">
<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/402409823-893f267f-44d7-40f9-bc0d-486ceae7026d.png" class="aligncenter size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="501" height="502" src="https://coltography.ca/img/402409823-893f267f-44d7-40f9-bc0d-486ceae7026d.png" alt="A Discord notification message showing 3D printing statistics and progress photo from a Bambu Lab printer." class="wp-image-320" srcset="https://coltography.ca/img/402409823-893f267f-44d7-40f9-bc0d-486ceae7026d.png 501w, https://coltography.ca/img/402409823-893f267f-44d7-40f9-bc0d-486ceae7026d-300x300.png 300w, https://coltography.ca/img/402409823-893f267f-44d7-40f9-bc0d-486ceae7026d-150x150.png 150w" sizes="auto, (max-width: 501px) 100vw, 501px" /></figure>
</div>


<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"><strong>How this works:</strong><br>When a print starts, the automation detects the printer in &#8220;prepare&#8221; mode. Using a python script, Home Assistant downloads the current .3mf file from the printer to /www/bblab/ and extracts the gcode preview image / .gcode file. The .gcode file contains the filament type, print weight, length, and cost. These values are parsed and input to number/text input helpers that are created previously. After this, another python script copies the gcode preview image to /www/snapshots/gcode_thumbnails and renames it with a dynamic name to be recalled later on for our data rich Discord message.</p>



<p class="wp-block-paragraph"></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"><strong>Pre-requisites:</strong><br>&#8211; <a href="https://www.home-assistant.io/" target="_blank" rel="noopener" title="">Home Assistant</a><br>&#8211; <a href="https://bambulab.com/" target="_blank" rel="noopener" title="">Bambu Lab 3D Printer</a> in LAN mode<br>&#8211; <a href="https://github.com/greghesp/ha-bambulab" target="_blank" rel="noopener" title="">Bambu Lab HACS integration installed</a><br>&#8211; <a href="https://github.com/SoftFever/OrcaSlicer" target="_blank" rel="noopener" title="OrcaSlicer">OrcaSlicer</a> (v2.2.0 at time of writing)<br>&#8211; Smart plug with energy monitoring<br> <br><em>*For this I used an inexpensive Zigbee compatible <a href="https://www.ikea.com/us/en/p/inspelning-plug-smart-energy-monitor-90569846/" target="_blank" rel="noopener" title="">smart plug</a> from IKEA that features energy monitoring, and integrates very will with Home Assistant if you have a <a href="https://sonoff.tech/product/gateway-and-sensors/sonoff-zigbee-3-0-usb-dongle-plus-e/" target="_blank" rel="noopener" title="Zigbee antenna">Zigbee antenna</a>.</em></p>



<p class="has-text-align-left wp-block-paragraph"></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"></p>



<p class="has-text-align-left wp-block-paragraph">Now before creating any automations, we will need some &#8220;Helpers&#8221; in home assistant. <br>This is now fairly easy through the GUI by clicking Helpers &gt; + Create Helper. Create the following &#8220;Number&#8221; helpers and &#8220;Text&#8221; helpers as detailed.<br><br><strong>Make sure you set the maximum values high, the display mode as &#8220;Input Field&#8221; and the step size with an accuracy of 0.01 or more. For currency it makes sense to use 0.01 and for measurements like weight, length etc. use 0.001</strong><br><br><em>Input Numbers:</em><br><strong>1. &#8220;3D Print kWh Start&#8221;</strong> &#8211; Used to capture the kWh usage at start of print<br><strong>2. &#8220;3D Print kWh Used&#8221;</strong> &#8211; Used to display the total kWh used after the print completes<br><strong>3. &#8220;Current 3D Print Filament Cost&#8221;</strong> &#8211; Holds the current gcode filament cost<br><strong>4. &#8220;Current 3D Print Filament Length&#8221; </strong>&#8211; Holds the current gcode filament length<br><strong>5. &#8220;Current 3D Print Filament Weight&#8221;</strong> &#8211; Holds the current gcode filament weight<br><strong>6. &#8220;3D Electrical Cost Cumulative&#8221;</strong> &#8211; Sum of all prints electrical cost<br><strong>7. &#8220;3D Filament Cost Cumulative&#8221;</strong> &#8211; Sum of all prints filament cost<br><strong>8. &#8220;3D Filament Weight Cumulative&#8221;</strong> &#8211; Sum of all prints filament weight in grams<br><br><em>Input Text:</em><br><strong>1. &#8220;Gcode Filename Variable&#8221;</strong> &#8211; Lets us store a unique gcode filename for each job<br><strong>2. &#8220;Current 3D Print FIlament Type&#8221;</strong> &#8211; Stores the current prints filament type<br></p>



<p class="wp-block-paragraph"></p>



<p class="has-text-align-center wp-block-paragraph">Example input number:</p>



<p class="wp-block-paragraph"></p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="473" height="587" src="https://coltography.ca/img/Screenshot-2024-12-28-200453.png" alt="A dark mode settings dialog for creating a number helper named 3D Print kWh Start." class="wp-image-304" style="width:461px;height:auto" srcset="https://coltography.ca/img/Screenshot-2024-12-28-200453.png 473w, https://coltography.ca/img/Screenshot-2024-12-28-200453-242x300.png 242w" sizes="auto, (max-width: 473px) 100vw, 473px" /></figure>
</div>


<p class="wp-block-paragraph"></p>



<p class="has-text-align-center wp-block-paragraph">A quick look at all the created helpers and their respective entity IDs.</p>



<p class="wp-block-paragraph"></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="707" src="https://coltography.ca/img/Screenshot-2025-01-26-153628-1024x707.png" alt="Screenshot of Home Assistant displaying 3D printer helper input number and text entities." class="wp-image-311" srcset="https://coltography.ca/img/Screenshot-2025-01-26-153628-1024x707.png 1024w, https://coltography.ca/img/Screenshot-2025-01-26-153628-300x207.png 300w, https://coltography.ca/img/Screenshot-2025-01-26-153628-768x530.png 768w, https://coltography.ca/img/Screenshot-2025-01-26-153628.png 1047w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="has-text-align-left wp-block-paragraph"><br></p>



<p class="has-text-align-center wp-block-paragraph"></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"><br>Make the necessary folders in /config/<br>We will need these folders later and to run the necessary scripts.</p>



<ul class="wp-block-list">
<li>/www/snapshots</li>



<li>/www/snapshots/gcode_thumbnail</li>



<li>/www/bblab</li>
</ul>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Download the following <a href="https://gist.github.com/coltography/4b0d93e7d3376b8f875d5942a2f3d80b" target="_blank" rel="noopener" title="">gist</a> (Credit to <a href="https://gist.github.com/steveneaston" target="_blank" rel="noopener" title="">@steveneaston</a> for the original) and save it as combine.py in your /config/ directory on your Home Assistant machine:<br><a href="https://gist.github.com/coltography/4b0d93e7d3376b8f875d5942a2f3d80b" target="_blank" rel="noopener" title="">https://gist.github.com/coltography/4b0d93e7d3376b8f875d5942a2f3d80b</a></p>



<p class="wp-block-paragraph">NOTE: You will need to fill in your respective entity IDs for this to work properly if they differ from mine.<br><br>You will also need to fill in your HOMEASSITANT.LOCAL url, and create a long-lived access token to authenticate the script and replace &#8220;LONG_LIVED_ACCESS_TOKEN&#8221; with your token.<br><br>To create a long lived access token, open Home Assistant and click your username in the bottom left sidebar. Click the security tab at the top &gt; scroll to Long Lived Access tokens. Create a token and copy it into your python script.</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Now you will need to add some things to your configuration.yaml to use these scripts later:</p>



<pre class="wp-block-code"><code>shell_command:
    capture_gcode_img: "cp /config/www/bblab/cover_image.png \"/config/www/snapshots/gcode_thumbnail/{{ states('input_text.gcode_filename_variable') }}\""
    
    
    combine: 'python3 /config/combine.py "{{ printer }}" "{{ access_code }}" "{{ gcode_filename }}"'</code></pre>



<p class="wp-block-paragraph">Note: You do not need to change anything here, the printer, access code and gcode_filename will be filled dynamically during our automation.<br><br></p>



<p class="wp-block-paragraph">You will also need to add a RESTful command to your configuration.yaml for the Discord notification to work. Before this, make sure you have your Discord channel and <a href="https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks" target="_blank" rel="noopener" title="">Webhook URL</a> setup.</p>



<pre class="wp-block-code"><code>rest_command:
  discord_3dp:
    url: "https://discord.com/api/webhooks/YOUR_DISCORD_WEBOOK_URL"
    method: post
    headers:
      Content-Type: "application/json"
    payload: &gt;
      {
        "username": "Print Completed!",
        "embeds": &#91;
          {
            "description": "{{ response }}",
            "color": 2401603,
            "image": {
              "url": "{{ photo_url }}"
            },
            "thumbnail": {
              "url": "{{thumb_url }}"
            }
          }
        ]
      }</code></pre>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">After adding your shell_command and rest_command to your configuration.yaml, restart Home Assistant for them to work properly.<br><em>Note: Quick YAML reload will NOT work for this!</em></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">For the Automation portion of this you will have to review the YAML and input your own entities as needed.<br>I tried making a blueprint for this and it just proved to be way too complex for me, having no experience with Blueprints.<br><br>The automation.yaml is here:<br><a href="https://github.com/coltography/Bambu-Labs-3D-Printer-Discord-Notifications/blob/23033d8c97557a8c6331e0de19b6d4fa03246b50/LAN%20Mode%20Bambu%203D%20Print%20Discord%20Notifications" target="_blank" rel="noopener" title="">https://github.com/coltography/Bambu-Labs-3D-Printer-Discord-Notifications/blob/23033d8c97557a8c6331e0de19b6d4fa03246b50/LAN%20Mode%20Bambu%203D%20Print%20Discord%20Notifications</a><br><br>As a reminder, you will need to replace ALL entity IDs and your Home Assistant URLs with your own for this to work. <br><br>I have my automation set up to provide Alexa and iPhone notifications as well which you can omit or change depending on your use cases.<br><br>I may update this post with a blueprint if I ever figure it out.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Turbo Cooling My PC With AC Ducting</title>
		<link>https://coltography.ca/turbo-cooling-pc-with-air-conditioning-ducting/</link>
		
		<dc:creator><![CDATA[Colton]]></dc:creator>
		<pubDate>Sun, 12 Nov 2023 21:27:00 +0000</pubDate>
				<category><![CDATA[DIY]]></category>
		<guid isPermaLink="false">https://coltography.ca/?p=1107</guid>

					<description><![CDATA[The NZXT H510 is notorious for poor airflow, so I tried forcing air through it with an 8" inline fan. Spoiler: it didn’t help. Here’s the photos.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">The <a href="https://ca.pcpartpicker.com/product/6Cyqqs/nzxt-h510-atx-mid-tower-case-ca-h510b-w1" data-type="link" data-id="https://ca.pcpartpicker.com/product/6Cyqqs/nzxt-h510-atx-mid-tower-case-ca-h510b-w1" target="_blank" rel="noopener">NZXT H510 </a>case is pretty notorious for having terrible airflow. Not something I was aware of before ordering it and setting up my last PC build.</p>



<p class="wp-block-paragraph">I decided to have a little fun with it and incorporate it into my office transfer fan, and utilize an extra 8&#8243; inline fan I had to try and &#8220;force&#8221; airflow through it to produce better temperatures. </p>



<p class="wp-block-paragraph">(Spoiler alert, it didn&#8217;t help!)</p>



<p class="wp-block-paragraph">There isn&#8217;t much to say in this post, I just wanted an archival &#8220;source&#8221; of this photo since it tends to make its rounds on social media.</p>


<div class="wp-block-image">
<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/air-conditioning-ducting-to-pc-for-cooling-e1791866526582.jpg" class="aligncenter size-large is-resized wp-lightbox-container"><img decoding="async" src="https://coltography.ca/img/air-conditioning-ducting-to-pc-for-cooling-484x1024.jpg" alt="A gaming computer mounted on a wall with flexible air conditioning ducts attached for ventilation and cooling." class="wp-image-1108" style="aspect-ratio:0.47348710658657006;width:378px;height:auto"/><figcaption class="wp-element-caption">Flexible air conditioning ducting attached to PC</figcaption></figure>
</div>


<p class="wp-block-paragraph">What&#8217;s happening here? </p>



<ul class="wp-block-list">
<li>8&#8243; flex duct is pulling cold, dry air from outside &gt; forcing it through a 4&#8243; duct to the front side panel</li>



<li>4&#8243; white flex duct is pulling cold, dry air from outside &gt; blowing it under the GPU</li>



<li>4&#8243; white flex duct is exhausting out the top, being pulled into my transfer fan ducting to the bedroom</li>
</ul>



<p class="wp-block-paragraph">(The metal round duct has another 8&#8243; inline fan that pulls air from my living room on the other side of the wall, to the bedroom.) I cut a 4&#8243; hole into the bottom of that inline filter box to try experimenting with stuff like this.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">As I mentioned this photo definitely makes its rounds on social media. Getting over <a href="https://reddit.com/r/pcmasterrace/comments/zar5e3/seen_some_folks_attaching_ducting_to_their_pcs/" data-type="link" data-id="https://old.reddit.com/r/pcmasterrace/comments/zar5e3/seen_some_folks_attaching_ducting_to_their_pcs/" target="_blank" rel="noopener">34k upvotes on Reddit</a>, I quickly noticed a trend with the discussions that pop up under it. Not that anyone even reads this, but to I need to clarify for posterity:</p>



<ul class="wp-block-list">
<li>The air is not moist and there&#8217;s no condensation inside.</li>



<li>Bugs, dust, rats or mice do not get into the PC. This was setup for less than a day.</li>



<li>It did not provide any notable temperature benefits to the main components. Less than ~3C change.</li>



<li>The air temperature outside when testing this was about 5<strong>°</strong>C (41<strong>°</strong>F)</li>



<li>This was just for fun. It was purely experimental and a product of my boredom.</li>
</ul>



<p class="wp-block-paragraph">14 years ago in 2009, before I had a job or any direction in life, I set up this similar abomination to try and help my overheating laptop:</p>


<div class="wp-block-image">
<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/outside-air-duct-cooling-for-old-overheating-laptop-2009.jpg" class="aligncenter size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="768" src="https://coltography.ca/img/outside-air-duct-cooling-for-old-overheating-laptop-2009-1024x768.jpg" alt="A laptop and monitor sit on a desk in a red room, connected to a DIY air conditioning duct made of garbage bags and plastic bubble wrap" class="wp-image-1112" srcset="https://coltography.ca/img/outside-air-duct-cooling-for-old-overheating-laptop-2009-1024x768.jpg 1024w, https://coltography.ca/img/outside-air-duct-cooling-for-old-overheating-laptop-2009-300x225.jpg 300w, https://coltography.ca/img/outside-air-duct-cooling-for-old-overheating-laptop-2009-768x576.jpg 768w, https://coltography.ca/img/outside-air-duct-cooling-for-old-overheating-laptop-2009-1536x1152.jpg 1536w, https://coltography.ca/img/outside-air-duct-cooling-for-old-overheating-laptop-2009.jpg 1600w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Home made flex ducting, made of bubble wrap, taped to two garbage bags on window fan to cool my overheating laptop.</figcaption></figure>
</div>


<p class="wp-block-paragraph">Thanks for looking!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Creating a Dynamic Logo with CSS and Additive Colour Mixing</title>
		<link>https://coltography.ca/creating-a-dynamic-logo-with-css-and-additive-color-mixing/</link>
		
		<dc:creator><![CDATA[Colton]]></dc:creator>
		<pubDate>Sun, 09 Apr 2023 01:53:42 +0000</pubDate>
				<category><![CDATA[DIY]]></category>
		<category><![CDATA[Website]]></category>
		<guid isPermaLink="false">http://coltography.ca/?p=137</guid>

					<description><![CDATA[To preface: I have hardly any experience with CSS and building websites. I basically just winged it for my last site and this one. I started out by simply wanting the logo…]]></description>
										<content:encoded><![CDATA[
<p class="has-text-align-left wp-block-paragraph">To preface: I have hardly any experience with CSS and building websites. I basically just winged it for my last site and this one.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">I started out by simply wanting the logo in the header of my website to have a clean little animation whenever the website loaded. I wanted this .GIF to loop once any time the website loaded:s</p>


<div class="wp-block-image">
<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/CO_Logo_Animation_1_looped.gif" class="aligncenter size-full is-resized wp-lightbox-container"><img loading="lazy" decoding="async" width="250" height="141" src="https://coltography.ca/img/CO_Logo_Animation_1_looped.gif" alt="A short animation showing a multicolored logo morphing and shifting colors on a transparent background" class="wp-image-153" style="width:186px;height:105px"/></figure>
</div>


<h6 class="wp-block-heading has-text-align-center"><sub>(This version loops, just so you can see what I was going for animation wise)</sub></h6>



<p class="wp-block-paragraph">You can see the edges of the .GIF have a chunky, horrible look. At this point I felt forced to settle for the static image with no animation.</p>



<p class="wp-block-paragraph">Although later on, while putting the finishing touches on my sites CSS with the help of the handy dandy <a rel="noopener noreferrer" target="_blank" href="https://chat.openai.com/chat">ChatGPT</a>, I came to the realization I might be able to use this tool to achieve my goal after all.</p>



<p class="wp-block-paragraph">I also quickly found you can apply <a rel="noopener noreferrer" target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode">blend modes</a> to images with CSS same way you can in <a rel="noopener noreferrer" target="_blank" href="https://helpx.adobe.com/ca/photoshop/using/blending-modes.html">Photoshop</a>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading has-text-align-center">Creating the foundation</h2>



<p class="wp-block-paragraph">First, I created separate transparent .PNG of the logo in the colours I knew would cancel each other out to create white, in the same way I made the static image.</p>


<div class="wp-block-image animated fadeIn">
<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/co-logo-seperated-colors-example.png" class="aligncenter size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="113" src="https://coltography.ca/img/co-logo-seperated-colors-example-1024x113.png" alt="Horizontal CO logo graphic displaying infinity-style loops in red, orange, green, purple, and blue against a black background." class="wp-image-217" srcset="https://coltography.ca/img/co-logo-seperated-colors-example-1024x113.png 1024w, https://coltography.ca/img/co-logo-seperated-colors-example-300x33.png 300w, https://coltography.ca/img/co-logo-seperated-colors-example-768x85.png 768w, https://coltography.ca/img/co-logo-seperated-colors-example.png 1224w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">I edited my sites header.php file directly to add all of these images in to their own div, and gave them unique class names to manipulate with CSS later.</p>



<pre class="wp-block-code"><code>&lt;a href="https://coltography.ca/"&gt;
&lt;div class="king-logo"&gt;
&lt;img src="https://coltography.ca/wp-content/uploads/2023/04/l1-co-red.png" class="logo-img-1"/&gt;
&lt;img src="https://coltography.ca/wp-content/uploads/2023/04/l2-co-orange.png" class="logo-img-2"/&gt;
&lt;img src="https://coltography.ca/wp-content/uploads/2023/04/l3-co-green.png" class="logo-img-3"/&gt;
&lt;img src="https://coltography.ca/wp-content/uploads/2023/04/l4-co-purple.png" class="logo-img-4"/&gt;
&lt;img src="https://coltography.ca/wp-content/uploads/2023/04/l5-co-blue.png" class="logo-img-5"/&gt;
&lt;/div&gt;
&lt;/a&gt;</code></pre>



<p class="wp-block-paragraph">After a quick refresh, I saw they had shown up on the header but they were all stacked on top of each other given there was no CSS styling yet.</p>


<div class="wp-block-image animated fadeIn ">
<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/logo-without-css-uncollapsed.png" class="aligncenter size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="261" height="352" src="https://coltography.ca/img/logo-without-css-uncollapsed.png" alt="Five vertically stacked CO logos in red, yellow, green, purple, and blue against a dark starry background." class="wp-image-146" srcset="https://coltography.ca/img/logo-without-css-uncollapsed.png 261w, https://coltography.ca/img/logo-without-css-uncollapsed-222x300.png 222w" sizes="auto, (max-width: 261px) 100vw, 261px" /></figure>
</div>


<p class="wp-block-paragraph">At this point I was getting a little giddy and asked ChatGPT to write me some CSS quickly to align them all on top of each other, and apply the blending mode &#8220;lighten&#8221;, the same way I did in Photoshop.</p>



<pre class="wp-block-code"><code>.logo-img-1,
.logo-img-2,
.logo-img-3,
.logo-img-4,
.logo-img-5 {
  position: absolute;
  top: 0;
  left: 0;
  mix-blend-mode: lighten;
}</code></pre>



<h2 class="wp-block-heading has-text-align-center">The result, so far:</h2>


<div class="wp-block-image animated fadeIn ">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="264" height="130" src="https://coltography.ca/img/co-logo-header-combined-first-try.png" alt="An infinity-style CO logo symbol displayed over a dark cosmic background with a bright star visible near the bottom." class="wp-image-147"/></figure>
</div>


<p class="wp-block-paragraph">While not completely a perfect white, it was at least working nearly as intended. The colours I could fine-tune later. At this point I decided I didn&#8217;t want the logo to animate on a page load, and instead wanted it to animate when a mouse hovered over it.<br><br>Inspecting the element showed me this:</p>


<div class="wp-block-image wp-block-image aligncenter is-style-default animated fadeIn">
<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/screenshot-element-inspection.png" class="wp-lightbox-container" ><img loading="lazy" decoding="async" width="1243" height="678" src="https://coltography.ca/img/screenshot-element-inspection.png" alt="A web browser inspector panel showing HTML code and CSS box model properties for dynamic logo color mixing" class="wp-image-148" srcset="https://coltography.ca/img/screenshot-element-inspection.png 1243w, https://coltography.ca/img/screenshot-element-inspection-300x164.png 300w, https://coltography.ca/img/screenshot-element-inspection-1024x559.png 1024w, https://coltography.ca/img/screenshot-element-inspection-768x419.png 768w" sizes="auto, (max-width: 1243px) 100vw, 1243px" /></figure>
</div>


<p class="wp-block-paragraph">&nbsp;</p>



<h2 class="wp-block-heading has-text-align-center">What am I looking at?!</h2>



<p class="wp-block-paragraph">At this point I was getting lost. I want to style that &#8220;hover&#8221; element but applying any styles to &#8220;a:hover&#8221; did nothing. Knowing the div I added all the images to was &#8220;king-logo&#8221; I simply asked ChatGPT to make the logos align themselves on hover, and then when NOT hovered, them all a negative or positive offset that I would alter later.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading has-text-align-center">Wrapping it all up</h2>



<p class="wp-block-paragraph">I&#8217;ll skip over the boring parts, but after some painful back and forth, lots of troubleshooting and added clarification, this is the code it I was able to get out of ChatGPT:</p>



<pre class="wp-block-code"><code>/* Initial styles for the logo images */
.king-logo img {
  position: absolute;
  max-width: 180px;
  mix-blend-mode: lighten;
  top: 0px; /* Update to initial offset value for each image */
  transition: top 0.4s ease; /* Add transition effect for smooth animation */
}

/* Hover styles for the logo images */
.king-logo:hover .logo-img-1 { /* RED */
  top: 0px; /* Update to desired overlapping offset value */
}

.king-logo:hover .logo-img-2 { /* ORANGE */
  top: 0px; /* Update to desired overlapping offset value */
}

.king-logo:hover .logo-img-3 { /* GREEN */
  top: 0px; /* Update to desired overlapping offset value */
}

.king-logo:hover .logo-img-4 { /* PURPLE */
  top: 0px; /* Update to desired overlapping offset value */
}

.king-logo:hover .logo-img-5 { /* BLUE */
  top: 0px; /* Update to desired overlapping offset value */
}

/* Reset the initial offsets when not hovered */
.king-logo .logo-img-1 { /* RED */
  top: -5.5px; /* Update to initial offset value */
}

.king-logo .logo-img-2 { /* ORANGE */
  top: -3px; /* Update to initial offset value */
}

.king-logo .logo-img-3 { /* GREEN */
  top: 0px; /* Update to initial offset value */
}

.king-logo .logo-img-4 { /* PURPLE */
  top: 3px; /* Update to initial offset value */
}

.king-logo .logo-img-5 { /* BLUE */
  top: 6px; /* Update to initial offset value */
}</code></pre>



<p class="wp-block-paragraph">You can see I ended up giving the upper red layer an offset of -5.5px because for some reason 6px just looked too thick, but in the end it looked exactly how I wanted, and acted exactly how I wanted.</p>


<div class="wp-block-image is-resized animated fadeIn">
<figure data-marilyn-lightbox="1" data-full="https://coltography.ca/img/logo_hover_final_result-1.gif" class="aligncenter size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="800" height="450" src="https://coltography.ca/img/logo_hover_final_result-1.gif" alt="A short animation showing a multicolored CO logo morphing and shifting colors on a black background" class="wp-image-149"/><figcaption class="wp-element-caption">Coltography (Colton Onushko) CO Logo animating on mouse hover</figcaption></figure>
</div>


<p class="wp-block-paragraph">In conclusion, I wasted the better part of my day making a silly little animation that hardly anyone will see.</p>



<p class="wp-block-paragraph">But I had so much fun doing it, and I was pretty mind-blown I could leverage a free online language model to teach myself some things I never thought possible with my limited knowledge of CSS / HTML.</p>



<p class="wp-block-paragraph">&nbsp;</p>



<p class="wp-block-paragraph">Not only did I learn a lot doing this, but it expanded my mind and took away some limitations on my imagination with what I could do with my website going forward. <br><br>If you have any questions or comments about this, feel free to <a title="" href="https://coltography.ca/contact/" target="_blank" rel="noopener">email me</a>!</p>



<p class="wp-block-paragraph">&nbsp;</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
