<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[build notes.]]></title><description><![CDATA[Welcome to build notes. The newsletter where I showcase my micro-projects and builds as a solo-developer!]]></description><link>https://tomshaw.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!zNDI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4f2d96-61b9-46a0-8558-d404fa731ac8_1080x1080.png</url><title>build notes.</title><link>https://tomshaw.substack.com</link></image><generator>Substack</generator><lastBuildDate>Mon, 11 May 2026 06:17:42 GMT</lastBuildDate><atom:link href="https://tomshaw.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Trent Vision LTD]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[tom@tomshaw.dev]]></webMaster><itunes:owner><itunes:email><![CDATA[tom@tomshaw.dev]]></itunes:email><itunes:name><![CDATA[Tom Shaw]]></itunes:name></itunes:owner><itunes:author><![CDATA[Tom Shaw]]></itunes:author><googleplay:owner><![CDATA[tom@tomshaw.dev]]></googleplay:owner><googleplay:email><![CDATA[tom@tomshaw.dev]]></googleplay:email><googleplay:author><![CDATA[Tom Shaw]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[How I'm Building an F1 Cyberdeck (and Why It Nearly Broke Me)]]></title><description><![CDATA[A rugged case, two screens, F1 Telemetry, and a Raspberry Pi. How hard can it be?]]></description><link>https://tomshaw.substack.com/p/how-im-building-an-f1-cyberdeck-and</link><guid isPermaLink="false">https://tomshaw.substack.com/p/how-im-building-an-f1-cyberdeck-and</guid><dc:creator><![CDATA[Tom Shaw]]></dc:creator><pubDate>Sun, 10 May 2026 23:08:17 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/9c00c704-a02b-4da6-81be-ab457ac2bff5_1200x630.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Cyberdecks are having a moment.</p><p>If you&#8217;ve spent any time on YouTube, Instagram or TikTok recently, you&#8217;ll have seen them everywhere. Funky cases. Mini keyboards. Little screens bolted to the side.</p><p>In simple terms, a cyberdeck is:</p><blockquote><p><em>&#8220;a custom-built, portable computer often designed with a retro-futuristic or &#8220;cyberpunk&#8221; aesthetic, usually featuring exposed components, rugged casings, and specialized, personalized functionality&#8221;.</em></p></blockquote><p>So of course I had to make one.</p><p>And because I&#8217;m incapable of building anything that isn&#8217;t somehow related to Formula 1, I decided to put the <a href="https://github.com/IAmTomShaw/f1-race-replay">F1 Race Replay project</a> inside one.</p><p><em>I&#8217;d actually had this idea sitting in my notes for months. No idea why it took me this long.</em></p><div><hr></div><h3>The Idea &#128161;</h3><p>You know the <a href="https://github.com/IAmTomShaw/f1-race-replay">F1 Race Replay</a> project? The one that went a little bit viral?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pvfO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0172eaf8-4c9a-4aad-9704-abb45749dcef_1910x1191.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pvfO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0172eaf8-4c9a-4aad-9704-abb45749dcef_1910x1191.png 424w, https://substackcdn.com/image/fetch/$s_!pvfO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0172eaf8-4c9a-4aad-9704-abb45749dcef_1910x1191.png 848w, https://substackcdn.com/image/fetch/$s_!pvfO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0172eaf8-4c9a-4aad-9704-abb45749dcef_1910x1191.png 1272w, https://substackcdn.com/image/fetch/$s_!pvfO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0172eaf8-4c9a-4aad-9704-abb45749dcef_1910x1191.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pvfO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0172eaf8-4c9a-4aad-9704-abb45749dcef_1910x1191.png" width="1456" height="908" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0172eaf8-4c9a-4aad-9704-abb45749dcef_1910x1191.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:908,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;F1 Race Replay Preview&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="F1 Race Replay Preview" title="F1 Race Replay Preview" srcset="https://substackcdn.com/image/fetch/$s_!pvfO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0172eaf8-4c9a-4aad-9704-abb45749dcef_1910x1191.png 424w, https://substackcdn.com/image/fetch/$s_!pvfO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0172eaf8-4c9a-4aad-9704-abb45749dcef_1910x1191.png 848w, https://substackcdn.com/image/fetch/$s_!pvfO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0172eaf8-4c9a-4aad-9704-abb45749dcef_1910x1191.png 1272w, https://substackcdn.com/image/fetch/$s_!pvfO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0172eaf8-4c9a-4aad-9704-abb45749dcef_1910x1191.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>What if it lived inside a physical box, with two screens, an LED strip that flashes yellow for yellow flags and white for safety cars, and a little LCD panel showing race control messages?</p><p>This idea has bee circulating in my mind for weeks if not months. A dedicated piece of hardware. A proper pit wall on my desk.</p><p>Sounds simple. <em>It was not simple.</em></p><div><hr></div><h3>The Components &#128297;</h3><p>Here&#8217;s the thing nobody tells you about hardware projects: you can&#8217;t just start building. There&#8217;s no <code>npm install</code>. You have to figure out what you need, order it, wait for it to arrive, realise you got something wrong, and order again.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aKVJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4775a37a-4660-43ea-81d5-16747bb79134_1200x960.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aKVJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4775a37a-4660-43ea-81d5-16747bb79134_1200x960.jpeg 424w, https://substackcdn.com/image/fetch/$s_!aKVJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4775a37a-4660-43ea-81d5-16747bb79134_1200x960.jpeg 848w, https://substackcdn.com/image/fetch/$s_!aKVJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4775a37a-4660-43ea-81d5-16747bb79134_1200x960.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!aKVJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4775a37a-4660-43ea-81d5-16747bb79134_1200x960.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aKVJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4775a37a-4660-43ea-81d5-16747bb79134_1200x960.jpeg" width="1200" height="960" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4775a37a-4660-43ea-81d5-16747bb79134_1200x960.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:960,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:783313,&quot;alt&quot;:&quot;F1 Cyberdeck parts&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/197125669?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4775a37a-4660-43ea-81d5-16747bb79134_1200x960.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="F1 Cyberdeck parts" title="F1 Cyberdeck parts" srcset="https://substackcdn.com/image/fetch/$s_!aKVJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4775a37a-4660-43ea-81d5-16747bb79134_1200x960.jpeg 424w, https://substackcdn.com/image/fetch/$s_!aKVJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4775a37a-4660-43ea-81d5-16747bb79134_1200x960.jpeg 848w, https://substackcdn.com/image/fetch/$s_!aKVJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4775a37a-4660-43ea-81d5-16747bb79134_1200x960.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!aKVJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4775a37a-4660-43ea-81d5-16747bb79134_1200x960.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here&#8217;s the final parts list:</p><ul><li><p><strong><a href="https://www.amazon.co.uk/Raspberry-Pi-SC1111-5-4GB/dp/B0CK3L9WD3/ref=sr_1_12?crid=38BE9U0MSQFW4&amp;dib=eyJ2IjoiMSJ9.x-46X2MDq32AYhC6alKwj5YoUPysrV6jPl3c8G-V8zDCqX3-JAuT2YObOcZrarzyGBv90IyaPoSCYs9bvU3JMaa2jpjLXsf8fUNrJr5xvIrIQontg_aIOSNmqbJaxPZrW5iLb3K7Jl6M-548bqhRV0ISHwQKXdRJ4rGWJZP4rB8MIMwn577Cx_XUoRyLh1jumUx7l9s7LN6S-mF4aTztL4pZQvvz91-buiJu3qiZqfA.tSh6Q5ZaZvKoEINrFuk48WbUFhWj2bB77QraAvxVXEI&amp;dib_tag=se&amp;keywords=raspberry+pi+5&amp;qid=1778451156&amp;sprefix=raspberry+pi+%2Caps%2C127&amp;sr=8-12&amp;ufe=app_do%3Aamzn1.fos.d7e5a2de-8759-4da3-993c-d11b6e3d217f">Raspberry Pi 5</a></strong> &#8212; the brain of the whole thing</p></li><li><p><strong>2x <a href="https://www.amazon.co.uk/dp/B07PQQGP7R?ref=ppx_yo2ov_dt_b_fed_asin_title">ELECROW 5&#8221; Touch Screen Monitors</a></strong> &#8212; one for the track map, one for telemetry</p></li><li><p><strong><a href="https://www.amazon.co.uk/BTF-LIGHTING-60pixels-Individually-Addressable-Non-waterproof/dp/B01CDTED80/ref=sr_1_9?crid=9IKIMV07KR7G&amp;dib=eyJ2IjoiMSJ9.-RKkIXaeka4TEp7slay4UmSGeIhijsF1WG2uvP4quKvxk0Q9Zf3EobEtIV03_2N416HXo5x430r7_2ZFJLhQGlJcGB_VILbVpTTQaluNxMi8QSyMjdm8wycHJLJVpKAV2No3Hes61ws7QS3cs1gG1Dtw71kexV5RTL4XmLOUCfUOkDSKHRBA9dvH8T8tjJSQl0Lw23MO0_QWrhwbt4AdhcNlJNEj4plDQeaflTN69BYv74tpJfaoeAii_5HdNaBMuM5pE1u-fRxDIYCgQpUE_q7_Y33NHa9CnzjKXLvu2zE.lObQ7bgtWYZNMGFgVt_9zVrnNNE78vV9akDZNAa12aQ&amp;dib_tag=se&amp;keywords=w2812b%2Bled%2Bstrip&amp;qid=1778451002&amp;sprefix=w28%2Caps%2C127&amp;sr=8-9&amp;th=1">RGB LED Light Strip</a></strong> &#8212; yellow flags, red flags, safety car, VSC. All of it.</p></li><li><p><strong><a href="https://www.amazon.co.uk/FREENOVE-Display-Compatible-Arduino-Raspberry/dp/B0B76YGDV4/ref=sr_1_1_sspa?crid=118ZQW3PNLQX1&amp;dib=eyJ2IjoiMSJ9.yenAjkLk_5J7GCByguLHepKbeY7PplUp7GPZ-d8OIqViqYT_5-Nose8m-wKYZhdqr9HrrJ6m7EDNDoKWGSIxz0-AywnSAk4x9qyNKiO2-PCQMrMcs9-8JUWFnSrH8-G5rNBSJvzlHU4GQDOloWxYD6KL3wEZpO0LfFxdL41lJyqg7jMYFUuq-rHJ7ufFw_YhDFEQ9O4D9pAPsfwRnryEc3j8osLw0M-mIn5AG0HciLUmUcOIDtAc_4VrJAkJG8stuIYw-OnZKNSPVVys0g6_HOAg8uGoBAP6K9BGs80work.-diTt-ttiontGIPBWhyREJj8yQMJejroO936CWgJQe0&amp;dib_tag=se&amp;keywords=freenove%2Bi2c%2Biic%2Blcd%2B1602%2Bmodule&amp;qid=1778451042&amp;sprefix=freenove%2Blcd%2Caps%2C137&amp;sr=8-1-spons&amp;aref=CVLYARuROY&amp;sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&amp;th=1">Freenove I2C LCD Module</a></strong> &#8212; displays live race control messages</p></li><li><p><strong><a href="https://thepihut.com/products/usb-c-round-panel-mount-extension-cable-30cm?variant=19932906520638">USB-C to USB-C Panel Mount</a></strong> &#8212; so there&#8217;s a clean power port on the outside of the case</p></li><li><p><strong><a href="https://thepihut.com/products/rj-45-ethernet-round-panel-mount-extension-cable-30cm?variant=19932905865278">Ethernet Panel Mount</a></strong> &#8212; same idea, clean external connection</p></li><li><p><strong><a href="https://thepihut.com/products/16mm-illuminated-pushbutton-red-momentary?variant=27739366801">Momentary Push Button</a></strong> &#8212; a proper power button on the exterior</p></li><li><p><strong><a href="https://www.amazon.co.uk/dp/B01G6XGLQQ?ref=ppx_yo2ov_dt_b_fed_asin_title">Wireless Mini Keyboard</a></strong> &#8212; used as a backup mouse and keyboard</p></li><li><p><strong><a href="https://www.amazon.co.uk/dp/B0F37H1MML?ref=ppx_yo2ov_dt_b_fed_asin_title">Peli-style rugged case</a></strong> &#8212; the housing for the project.</p></li></ul><p>I already had jumper wires knocking around from a previous project, which saved me a few quid.</p><div><hr></div><h3>Assembling the Electronics &#128295;</h3><p>Before you start throwing everything into a case, you get everything working on a desk first. Lead times are brutal, if you find out a component doesn&#8217;t work <em>after</em> you&#8217;ve screwed it into a frame, you&#8217;re losing days waiting for a replacement.</p><p>So I wired it all up loose. Displays via HDMI and USB. LED strip connected to the GPIO pins. LCD module over I2C.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xmVG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e416a39-655b-496e-aa19-b329ba8140f9_1200x959.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xmVG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e416a39-655b-496e-aa19-b329ba8140f9_1200x959.jpeg 424w, https://substackcdn.com/image/fetch/$s_!xmVG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e416a39-655b-496e-aa19-b329ba8140f9_1200x959.jpeg 848w, https://substackcdn.com/image/fetch/$s_!xmVG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e416a39-655b-496e-aa19-b329ba8140f9_1200x959.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!xmVG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e416a39-655b-496e-aa19-b329ba8140f9_1200x959.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xmVG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e416a39-655b-496e-aa19-b329ba8140f9_1200x959.jpeg" width="1200" height="959" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5e416a39-655b-496e-aa19-b329ba8140f9_1200x959.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:959,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:680742,&quot;alt&quot;:&quot;F1 Cyberdeck testing&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/197125669?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e416a39-655b-496e-aa19-b329ba8140f9_1200x959.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="F1 Cyberdeck testing" title="F1 Cyberdeck testing" srcset="https://substackcdn.com/image/fetch/$s_!xmVG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e416a39-655b-496e-aa19-b329ba8140f9_1200x959.jpeg 424w, https://substackcdn.com/image/fetch/$s_!xmVG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e416a39-655b-496e-aa19-b329ba8140f9_1200x959.jpeg 848w, https://substackcdn.com/image/fetch/$s_!xmVG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e416a39-655b-496e-aa19-b329ba8140f9_1200x959.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!xmVG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e416a39-655b-496e-aa19-b329ba8140f9_1200x959.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>First power-on: most of it worked. <em>Most.</em></p><p>I had originally bought an LED panel which I thought was RGB, however in the fine print in the description of the product, it mentioned it was the colour red only. Gutted, but glad that I had a spare LED strip lying around to replace it.</p><p>I wrote some software to flag the lights, display text on the LCD and show content on both screens to make sure they were working.</p><p>Eventually: working. Moving on.</p><div><hr></div><h3>The Software &#128187;</h3><p>This is where I got overconfident.</p><p>I assumed loading the <a href="https://github.com/IAmTomShaw/f1-race-replay">F1 Race Replay</a> project onto the Pi would be straightforward. Clone the repo, install the dependencies, run it. Ten minutes, tops.</p><p>It was not ten minutes.</p><p>The Pi 5 threw a wall of errors related to OpenGL and Anti-Aliasing. Basically the graphical rendering that makes the full version look polished wasn&#8217;t going to fly on this hardware. So essentially the Pi isn&#8217;t powerful enough to run it as-is.</p><p>So I had to build a <em>lite</em> version, which took a day, but turned out to be a really great move for this project.</p><p>It meant I could strip the project back to exactly what I needed for the cyberdeck and rebuild it with the aesthetic I had in mind: minimalistic, retro, a bit brutalist. No fluff.</p><p>I ripped out everything that didn&#8217;t belong. Then I rebuilt the Driver Telemetry view with proper touch controls, so you can tap the screen to select a driver rather than fiddling with a keyboard.</p><p>It actually fits the build better than the original version would have.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0MBh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69ea159c-736b-4245-a64f-5e30701b18f6_1800x804.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0MBh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69ea159c-736b-4245-a64f-5e30701b18f6_1800x804.jpeg 424w, https://substackcdn.com/image/fetch/$s_!0MBh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69ea159c-736b-4245-a64f-5e30701b18f6_1800x804.jpeg 848w, https://substackcdn.com/image/fetch/$s_!0MBh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69ea159c-736b-4245-a64f-5e30701b18f6_1800x804.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!0MBh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69ea159c-736b-4245-a64f-5e30701b18f6_1800x804.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0MBh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69ea159c-736b-4245-a64f-5e30701b18f6_1800x804.jpeg" width="1456" height="650" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69ea159c-736b-4245-a64f-5e30701b18f6_1800x804.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:650,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:594776,&quot;alt&quot;:&quot;F1 Cyberdeck software&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/197125669?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69ea159c-736b-4245-a64f-5e30701b18f6_1800x804.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="F1 Cyberdeck software" title="F1 Cyberdeck software" srcset="https://substackcdn.com/image/fetch/$s_!0MBh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69ea159c-736b-4245-a64f-5e30701b18f6_1800x804.jpeg 424w, https://substackcdn.com/image/fetch/$s_!0MBh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69ea159c-736b-4245-a64f-5e30701b18f6_1800x804.jpeg 848w, https://substackcdn.com/image/fetch/$s_!0MBh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69ea159c-736b-4245-a64f-5e30701b18f6_1800x804.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!0MBh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69ea159c-736b-4245-a64f-5e30701b18f6_1800x804.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h3>What&#8217;s Next &#128640;</h3><p>I was hoping this week&#8217;s newsletter would end with a finished cyberdeck.</p><p><em>Spoiler alert: It&#8217;s not finished.</em></p><p>Turns out building a custom internal frame to mount several separate components is significantly harder than &#8220;just screw some stuff together.&#8221; The electronics work. The software works. It&#8217;s the physical housing that&#8217;s still giving me grief, and 3D printing takes a long time.</p><p>Currently, parts of the frame are sat on my kitchen table drying after being glued.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8yfv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b8c0a21-cc63-438e-ac53-be1b532dc658_1200x817.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8yfv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b8c0a21-cc63-438e-ac53-be1b532dc658_1200x817.jpeg 424w, https://substackcdn.com/image/fetch/$s_!8yfv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b8c0a21-cc63-438e-ac53-be1b532dc658_1200x817.jpeg 848w, https://substackcdn.com/image/fetch/$s_!8yfv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b8c0a21-cc63-438e-ac53-be1b532dc658_1200x817.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!8yfv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b8c0a21-cc63-438e-ac53-be1b532dc658_1200x817.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8yfv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b8c0a21-cc63-438e-ac53-be1b532dc658_1200x817.jpeg" width="1200" height="817" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5b8c0a21-cc63-438e-ac53-be1b532dc658_1200x817.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:817,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:521167,&quot;alt&quot;:&quot;F1 Cyberdeck 3D printing&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/197125669?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b8c0a21-cc63-438e-ac53-be1b532dc658_1200x817.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="F1 Cyberdeck 3D printing" title="F1 Cyberdeck 3D printing" srcset="https://substackcdn.com/image/fetch/$s_!8yfv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b8c0a21-cc63-438e-ac53-be1b532dc658_1200x817.jpeg 424w, https://substackcdn.com/image/fetch/$s_!8yfv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b8c0a21-cc63-438e-ac53-be1b532dc658_1200x817.jpeg 848w, https://substackcdn.com/image/fetch/$s_!8yfv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b8c0a21-cc63-438e-ac53-be1b532dc658_1200x817.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!8yfv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b8c0a21-cc63-438e-ac53-be1b532dc658_1200x817.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>All that&#8217;s left to do is finish printing some of the cosmetics, and then finally install it inside of the case.</p><div><hr></div><p>Have a great week. Keep building. See you in the next edition! &#128512;</p>]]></content:encoded></item><item><title><![CDATA[AI can't do this, so that's why I am.]]></title><description><![CDATA[And it only cost me &#163;50 to get started]]></description><link>https://tomshaw.substack.com/p/ai-cant-do-this-so-thats-why-i-am</link><guid isPermaLink="false">https://tomshaw.substack.com/p/ai-cant-do-this-so-thats-why-i-am</guid><dc:creator><![CDATA[Tom Shaw]]></dc:creator><pubDate>Sun, 03 May 2026 16:24:49 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/caddc4a4-14f1-4fc2-8c81-a184846f398e_1080x1080.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Silicon Valley keeps telling us there&#8217;ll be no programmers left in five years.</p><p>I don&#8217;t know if that&#8217;s true. But I do know that lately, I&#8217;ve stopped feeling like a developer.</p><p>I feel like a <em><strong>product manager.</strong></em></p><p>I delegate tasks. I review outputs. I approve things. And somewhere in the middle of all of that, the actual feeling of <em>building something</em> quietly slipped away. I don&#8217;t feel like that all of the time, it depends on the project, but its there.</p><p>So at the start of this year I told myself that I&#8217;m going to make an effort to increase my knowledge of electronics.</p><div><hr></div><h4>The Adult Version of Lego &#129521;</h4><p>I&#8217;ve always been curious about hardware. Done bits here and there. But it wasn&#8217;t until earlier this year that I sat myself down and made a proper commitment to make it more a part of my every day life, instead of just a tiny side-hobby / offering to clients.</p><p>Last year I built a game for an AWS conference using microcontrollers and break beam sensors; and I loved it.</p><p>If you&#8217;ve been following along, you&#8217;ll know I&#8217;m currently building F1-style telemetry sensors for my go-kart. It&#8217;s been a steep learning curve. It&#8217;s also been the most fun I&#8217;ve had on a project in a long time.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZSOj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23c8e56e-ba89-4384-8f73-aff32a7d2df1_1170x689.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZSOj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23c8e56e-ba89-4384-8f73-aff32a7d2df1_1170x689.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZSOj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23c8e56e-ba89-4384-8f73-aff32a7d2df1_1170x689.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZSOj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23c8e56e-ba89-4384-8f73-aff32a7d2df1_1170x689.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZSOj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23c8e56e-ba89-4384-8f73-aff32a7d2df1_1170x689.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZSOj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23c8e56e-ba89-4384-8f73-aff32a7d2df1_1170x689.jpeg" width="1170" height="689" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/23c8e56e-ba89-4384-8f73-aff32a7d2df1_1170x689.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:689,&quot;width&quot;:1170,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZSOj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23c8e56e-ba89-4384-8f73-aff32a7d2df1_1170x689.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZSOj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23c8e56e-ba89-4384-8f73-aff32a7d2df1_1170x689.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZSOj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23c8e56e-ba89-4384-8f73-aff32a7d2df1_1170x689.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZSOj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23c8e56e-ba89-4384-8f73-aff32a7d2df1_1170x689.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You can learn more about that project in the post linked below:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;247fdf25-cf28-4252-864d-78d93dfda54a&quot;,&quot;caption&quot;:&quot;If you didn&#8217;t know already, I&#8217;m building a Formula 1-style sensor for go karts. And this week I solved a huge problem that could have destroyed the project&#8230;&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;UPDATE - Building a Go Kart Telemetry System using Python and a Raspberry Pi&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:124420874,&quot;name&quot;:&quot;Tom Shaw&quot;,&quot;bio&quot;:&quot;Tech Content Creator and Developer &#128187; Building cool projects and sharing them with as many people as possible!&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1385654c-22e7-45ad-831e-79f738c9971e_1080x1080.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-01-18T20:45:47.242Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!Y8SR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34d9904f-9a8b-45ff-830a-032d3de76ee2_2039x1315.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://tomshaw.substack.com/p/update-building-a-go-kart-telemetry&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:184983866,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:11,&quot;comment_count&quot;:1,&quot;publication_id&quot;:1721578,&quot;publication_name&quot;:&quot;build notes.&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!zNDI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4f2d96-61b9-46a0-8558-d404fa731ac8_1080x1080.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><h4>The Learning Problem &#128161;</h4><p>Here&#8217;s the annoying thing about electronics: you can&#8217;t just install it on your laptop.</p><p>There are browser tools like <a href="https://www.tinkercad.com/">TinkerCAD</a> for designing circuits, but working with a simulator doesn&#8217;t give you the same feeling as actual components in your hands.</p><p>So I picked up one of those &#8220;<a href="https://www.amazon.co.uk/dp/B0BJ1P9JN8?ref_=ppx_hzsearch_conn_dt_b_fed_asin_title_1&amp;th=1">Ultimate Starter Kits</a>&#8221; from Amazon. Mine came with a Raspberry Pi Pico and a ton of components for &#163;50. I actually bought it back in 2022, but it gathered dust because it felt overwhelming and I couldn&#8217;t justify the time.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iTMH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30b70a36-0509-4bd0-9d8d-5927a373d3bd_679x680.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iTMH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30b70a36-0509-4bd0-9d8d-5927a373d3bd_679x680.jpeg 424w, https://substackcdn.com/image/fetch/$s_!iTMH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30b70a36-0509-4bd0-9d8d-5927a373d3bd_679x680.jpeg 848w, https://substackcdn.com/image/fetch/$s_!iTMH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30b70a36-0509-4bd0-9d8d-5927a373d3bd_679x680.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!iTMH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30b70a36-0509-4bd0-9d8d-5927a373d3bd_679x680.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iTMH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30b70a36-0509-4bd0-9d8d-5927a373d3bd_679x680.jpeg" width="479" height="479.70544918998525" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/30b70a36-0509-4bd0-9d8d-5927a373d3bd_679x680.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:680,&quot;width&quot;:679,&quot;resizeWidth&quot;:479,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Freenove Ultimate Starter Kit for Raspberry Pi Pico W (Included), Dual-core Arm Cortex-M0+ Microcontroller, 767-Page Detailed Tutorial, 224 Items, 119 Projects, Python C Java Code&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Freenove Ultimate Starter Kit for Raspberry Pi Pico W (Included), Dual-core Arm Cortex-M0+ Microcontroller, 767-Page Detailed Tutorial, 224 Items, 119 Projects, Python C Java Code" title="Freenove Ultimate Starter Kit for Raspberry Pi Pico W (Included), Dual-core Arm Cortex-M0+ Microcontroller, 767-Page Detailed Tutorial, 224 Items, 119 Projects, Python C Java Code" srcset="https://substackcdn.com/image/fetch/$s_!iTMH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30b70a36-0509-4bd0-9d8d-5927a373d3bd_679x680.jpeg 424w, https://substackcdn.com/image/fetch/$s_!iTMH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30b70a36-0509-4bd0-9d8d-5927a373d3bd_679x680.jpeg 848w, https://substackcdn.com/image/fetch/$s_!iTMH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30b70a36-0509-4bd0-9d8d-5927a373d3bd_679x680.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!iTMH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30b70a36-0509-4bd0-9d8d-5927a373d3bd_679x680.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Freenove Ultimate Starter Kit for Raspberry Pi Pico W (not sponsored)</figcaption></figure></div><p>These kits always come with a workbook or tutorial PDF. And in my experience, those are almost impossible to engage with. It&#8217;s hundreds of pages of components you have no immediate interest in using.</p><p>I learn by building real things. A 360-page manual isn&#8217;t going to change that.</p><p>So what am I actually using to learn?</p><p><em>You&#8217;re not going to like this.</em></p><div><hr></div><h4>I&#8217;m Using AI to Learn Electronics &#128187;</h4><p>Here&#8217;s the thing, because hardware is such a human-involved process, I have to stay deeply engaged in a way I just don&#8217;t with software anymore.</p><p>Say I want to build a G-Force sensor. I still need to research which sensors to buy. I still need to think about power supply and whether I need resistors. I still need to design and 3D print a housing that fits my exact use case. I still need to physically wire everything together.</p><p>I can ask for guidance along the way. But I&#8217;m the one making the decisions. And unlike broken code, broken components don&#8217;t just undo themselves.</p><blockquote><p><em>You can&#8217;t prompt an AI agent to go from idea to finished device sitting on your desk. Not yet and probably not soon. Well, I wouldn&#8217;t trust a &#8220;vibe-hardware&#8221; product in my house anyway.</em></p></blockquote><p>That&#8217;s exactly why I&#8217;m enjoying this so much.</p><p>For the first time in a while, I feel like I&#8217;m actually <em>building</em> again. My creativity is the differentiator between a project that works and one that doesn&#8217;t. That feeling has been missing from my software work lately.</p><div><hr></div><h4>Where to Start &#128640;</h4><p>If you&#8217;re curious about hardware but have no idea where to begin, here&#8217;s what I&#8217;d tell you:</p><p><strong>1. Buy a cheap starter kit.</strong> Spend &#163;50 on Amazon and you&#8217;ll have more components than you know what to do with.</p><p><strong>2. Skip most of the manual.</strong> Run through the first project so you know how to turn an LED on. Then close it and forget it exists.</p><p><strong>3. Find a project that&#8217;s ambitious but affordable.</strong> Too easy and you&#8217;ll lose interest. Too expensive and you&#8217;ll be scared to break anything.</p><p><strong>4. Ask for help, but always understand what you&#8217;re doing.</strong> If something isn&#8217;t working, ask <em>why</em> isn&#8217;t it working? If you&#8217;re using a component, ask <em>what does it actually do?</em> Blindly copying AI output works fine for a side project. It does not work when the wrong resistor fries your board.</p><div><hr></div><p>There has never been a lower barrier to getting into electronics. The tools are there. The components are cheap. And weirdly, AI makes the learning curve a bit less brutal.</p><p>You just have to actually show up and build the thing yourself.</p>]]></content:encoded></item><item><title><![CDATA[How I Built an Automated F1 Race Report That Lands in Your Inbox Every Monday Morning]]></title><description><![CDATA[I built an AI post-race commentator, and then open sourced it.]]></description><link>https://tomshaw.substack.com/p/how-i-built-an-automated-f1-race</link><guid isPermaLink="false">https://tomshaw.substack.com/p/how-i-built-an-automated-f1-race</guid><dc:creator><![CDATA[Tom Shaw]]></dc:creator><pubDate>Sun, 12 Apr 2026 11:03:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!E5vC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93e1a9b9-2a54-4148-b94f-b75c4d958768_1459x908.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last week I posted a list of F1 programming project ideas to my Instagram. The response was brilliant, and a lot of you clearly want to see this stuff get built.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!E5vC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93e1a9b9-2a54-4148-b94f-b75c4d958768_1459x908.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!E5vC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93e1a9b9-2a54-4148-b94f-b75c4d958768_1459x908.png 424w, https://substackcdn.com/image/fetch/$s_!E5vC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93e1a9b9-2a54-4148-b94f-b75c4d958768_1459x908.png 848w, https://substackcdn.com/image/fetch/$s_!E5vC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93e1a9b9-2a54-4148-b94f-b75c4d958768_1459x908.png 1272w, https://substackcdn.com/image/fetch/$s_!E5vC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93e1a9b9-2a54-4148-b94f-b75c4d958768_1459x908.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!E5vC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93e1a9b9-2a54-4148-b94f-b75c4d958768_1459x908.png" width="1456" height="906" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/93e1a9b9-2a54-4148-b94f-b75c4d958768_1459x908.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:906,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:247129,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/193872963?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93e1a9b9-2a54-4148-b94f-b75c4d958768_1459x908.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!E5vC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93e1a9b9-2a54-4148-b94f-b75c4d958768_1459x908.png 424w, https://substackcdn.com/image/fetch/$s_!E5vC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93e1a9b9-2a54-4148-b94f-b75c4d958768_1459x908.png 848w, https://substackcdn.com/image/fetch/$s_!E5vC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93e1a9b9-2a54-4148-b94f-b75c4d958768_1459x908.png 1272w, https://substackcdn.com/image/fetch/$s_!E5vC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93e1a9b9-2a54-4148-b94f-b75c4d958768_1459x908.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This week I shipped <strong><a href="https://github.com/IAmTomShaw/f1-race-report">F1 Race Report</a></strong>, an automated system that wakes up every Monday morning, checks whether a Grand Prix took place the day before, and if it did, sends you a fully formatted race report straight to your inbox. No app to open. No website to visit. Just a clean email waiting for you.</p><div><hr></div><h3>The Project Idea &#128161;</h3><p>The concept is simple. Every F1 Sunday, millions of fans either watch live or catch up on highlights. But there&#8217;s no great &#8220;morning after&#8221; summary that combines the data <em>and</em> a readable narrative in one place.</p><p><em>Correction, there is, Formula 1 themselves post articles, but I wanted to build one myself.</em></p><p>So this tool does exactly that. Automatically, every week, for the entire season.</p><div><hr></div><h3>Features &#127950;&#65039;</h3><ul><li><p><strong>Automatic race detection:</strong> checks every Monday at 09:00 UTC whether a race happened the day before. If not, it skips silently.</p></li><li><p><strong>Full race results:</strong> podium finishers, fastest lap, and a complete results table</p></li><li><p><strong>Lap position chart:</strong> a dark-theme line chart showing every driver&#8217;s position throughout the race, coloured by official F1 team colours</p></li><li><p><strong>AI-written narrative:</strong> a proper race summary written by a GPT-4o-mini agent, not just a data dump. (other models can be used but GPT-4o-mini is insanely cheap and does the job)</p></li><li><p><strong>Inbox delivery: </strong>a polished HTML email that renders correctly in Gmail, Outlook, and Apple Mail</p></li></ul><div><hr></div><h3>How It&#8217;s Built &#128187;</h3><p>This one&#8217;s a bit of a polyglot stack, which made it interesting to put together.</p><ul><li><p><strong>Language:</strong> <a href="https://www.typescriptlang.org/">TypeScript</a> + <a href="https://www.python.org/">Python</a></p></li><li><p><strong>Scheduler:</strong> <a href="https://fandf.co/4b35uVG">Trigger.dev</a> &#8212; fires a scheduled task every Monday morning. Free tier is more than enough.</p></li><li><p><strong>Race Data:</strong> <a href="https://docs.fastf1.dev/">FastF1</a> &#8212; a Python library that pulls official F1 session data. Lap times, positions, team colours, all of it.</p></li><li><p><strong>Chart Generation:</strong> <a href="https://www.chartjs.org/">Chart.js</a> with Node canvas &#8212; renders the lap position chart server-side as an image, then embeds it inline in the email as a CID attachment so it actually shows up rather than getting blocked.</p></li><li><p><strong>Email Generation:</strong> <a href="https://developers.openai.com/api/docs/guides/agents-sdk">OpenAI Agents SDK </a>(gpt-4o-mini) &#8212; the agent receives the raw race data and outputs a plain text report of what happened, which is inserted into the HTML template.</p></li><li><p><strong>Email Delivery:</strong> <a href="https://resend.com/">Resend</a> &#8212; sends the finished email. Again, free tier handles it fine.</p></li></ul><p>The TypeScript side orchestrates everything. The Python script handles the FastF1 data fetch and hands the results back as JSON to the TypeScript app. I would have built the entire thing using TypeScript, but the FastF1 package only works with Python, so I created a quick executable script for the import.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_0qR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bcf1ed5-df52-43f5-91c9-c861f5a54be1_6900x760.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_0qR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bcf1ed5-df52-43f5-91c9-c861f5a54be1_6900x760.png 424w, https://substackcdn.com/image/fetch/$s_!_0qR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bcf1ed5-df52-43f5-91c9-c861f5a54be1_6900x760.png 848w, https://substackcdn.com/image/fetch/$s_!_0qR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bcf1ed5-df52-43f5-91c9-c861f5a54be1_6900x760.png 1272w, https://substackcdn.com/image/fetch/$s_!_0qR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bcf1ed5-df52-43f5-91c9-c861f5a54be1_6900x760.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_0qR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bcf1ed5-df52-43f5-91c9-c861f5a54be1_6900x760.png" width="1456" height="160" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5bcf1ed5-df52-43f5-91c9-c861f5a54be1_6900x760.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:160,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:267233,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/193872963?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bcf1ed5-df52-43f5-91c9-c861f5a54be1_6900x760.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_0qR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bcf1ed5-df52-43f5-91c9-c861f5a54be1_6900x760.png 424w, https://substackcdn.com/image/fetch/$s_!_0qR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bcf1ed5-df52-43f5-91c9-c861f5a54be1_6900x760.png 848w, https://substackcdn.com/image/fetch/$s_!_0qR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bcf1ed5-df52-43f5-91c9-c861f5a54be1_6900x760.png 1272w, https://substackcdn.com/image/fetch/$s_!_0qR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bcf1ed5-df52-43f5-91c9-c861f5a54be1_6900x760.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>One thing worth calling out, the chart embedding. Getting inline images to actually render in all major email clients is more annoying than it should be. CID attachments are the right approach and it works, but it took a bit of fiddling.</p><div><hr></div><h3>The Lap Position Chart &#128200;</h3><p>Finishing positions don&#8217;t tell you anything about the actual race. They just tell you where everyone ended up. This chart fixes that.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Q9tw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605721c1-0520-4539-a60b-32171a3ed17c_900x500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Q9tw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605721c1-0520-4539-a60b-32171a3ed17c_900x500.png 424w, https://substackcdn.com/image/fetch/$s_!Q9tw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605721c1-0520-4539-a60b-32171a3ed17c_900x500.png 848w, https://substackcdn.com/image/fetch/$s_!Q9tw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605721c1-0520-4539-a60b-32171a3ed17c_900x500.png 1272w, https://substackcdn.com/image/fetch/$s_!Q9tw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605721c1-0520-4539-a60b-32171a3ed17c_900x500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Q9tw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605721c1-0520-4539-a60b-32171a3ed17c_900x500.png" width="900" height="500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/605721c1-0520-4539-a60b-32171a3ed17c_900x500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:115666,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/193872963?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605721c1-0520-4539-a60b-32171a3ed17c_900x500.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Q9tw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605721c1-0520-4539-a60b-32171a3ed17c_900x500.png 424w, https://substackcdn.com/image/fetch/$s_!Q9tw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605721c1-0520-4539-a60b-32171a3ed17c_900x500.png 848w, https://substackcdn.com/image/fetch/$s_!Q9tw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605721c1-0520-4539-a60b-32171a3ed17c_900x500.png 1272w, https://substackcdn.com/image/fetch/$s_!Q9tw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605721c1-0520-4539-a60b-32171a3ed17c_900x500.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Every driver gets a line. Every lap gets a data point. The y-axis is inverted so P1 sits at the top, and each line uses the official F1 team colours, so you can trace your favourite driver across the full length of the race.</p><p>It&#8217;s rendered server-side using <a href="https://www.chartjs.org/">Chart.js</a> and <a href="https://www.npmjs.com/package/chartjs-node-canvas">chartjs-node-canvas</a>. No browser, no headless Chrome nonsense. Just a buffer that goes straight into the email.</p><div><hr></div><h3>The Agent &#129302;</h3><p>The results, podium, and chart are all deterministic, FastF1 gives you the data, you render it. The narrative is a different problem.</p><p>I didn&#8217;t want a summary that just reads back the lap times. Anyone can see those. The interesting stuff is the story, the undercut that won the race, the safety car that reshuffled everything, the driver who threw it in the wall on lap 3. FastF1 just doesn&#8217;t give you that data.</p><p>So instead of prompting a model with raw JSON and hoping for the best, the report uses the <a href="https://openai.github.io/openai-agents-python/">OpenAI Agents SDK</a> with the WebSearchTool enabled. The agent researches the race itself before writing anything.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!439G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26e988d2-c521-44b3-953d-6bd4084ebdca_2024x1112.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!439G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26e988d2-c521-44b3-953d-6bd4084ebdca_2024x1112.png 424w, https://substackcdn.com/image/fetch/$s_!439G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26e988d2-c521-44b3-953d-6bd4084ebdca_2024x1112.png 848w, https://substackcdn.com/image/fetch/$s_!439G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26e988d2-c521-44b3-953d-6bd4084ebdca_2024x1112.png 1272w, https://substackcdn.com/image/fetch/$s_!439G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26e988d2-c521-44b3-953d-6bd4084ebdca_2024x1112.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!439G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26e988d2-c521-44b3-953d-6bd4084ebdca_2024x1112.png" width="1456" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/26e988d2-c521-44b3-953d-6bd4084ebdca_2024x1112.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:368197,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/193872963?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26e988d2-c521-44b3-953d-6bd4084ebdca_2024x1112.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!439G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26e988d2-c521-44b3-953d-6bd4084ebdca_2024x1112.png 424w, https://substackcdn.com/image/fetch/$s_!439G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26e988d2-c521-44b3-953d-6bd4084ebdca_2024x1112.png 848w, https://substackcdn.com/image/fetch/$s_!439G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26e988d2-c521-44b3-953d-6bd4084ebdca_2024x1112.png 1272w, https://substackcdn.com/image/fetch/$s_!439G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26e988d2-c521-44b3-953d-6bd4084ebdca_2024x1112.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The finished HTML drops straight into a pre-built template alongside the deterministic content. The agent never sees the full email, it just returns 2-3 <code>&lt;p&gt;</code> tags and nothing else.</p><div><hr></div><h3>The Future &#128640;</h3><p>Right now the tool covers the race. But an F1 weekend is three days long.</p><p>The obvious next step is adding equivalent reports for <strong>qualifying</strong> and <strong>practice sessions</strong>, so you&#8217;d get a summary drop after each session across the whole weekend. FastF1 supports all of that data, so it&#8217;s entirely doable.</p><p>That&#8217;s where you come in.</p><div><hr></div><h3>Get Involved &#129781;</h3><p>This project is <strong>fully open source</strong> and I&#8217;d love for the community to help shape where it goes next.</p><p>Whether that&#8217;s adding qualifying support, improving the email template, tweaking the chart, or fixing something that&#8217;s broken&#8230; contributions are very welcome.</p><p>&#128073; <a href="https://github.com/IAmTomShaw/f1-race-report">github.com/IAmTomShaw/f1-race-report</a></p><p>Star it, fork it, open a PR. Let&#8217;s build it out together.</p><div><hr></div><p>Have a great week. Keep building. See you in the next edition! &#128512;</p>]]></content:encoded></item><item><title><![CDATA[Your code isn't your advantage.]]></title><description><![CDATA[AI just made that painfully obvious.]]></description><link>https://tomshaw.substack.com/p/your-code-isnt-your-advantage</link><guid isPermaLink="false">https://tomshaw.substack.com/p/your-code-isnt-your-advantage</guid><dc:creator><![CDATA[Tom Shaw]]></dc:creator><pubDate>Sun, 05 Apr 2026 11:02:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Xk6p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b035cfb-402c-4ff0-ae8c-4c0277cf18d8_662x488.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A few years ago, if you could build something well, you had an edge.</p><p>The software was better. The UX was tighter. The architecture held up under load. That mattered. It took time and skill to ship something good, and not everyone could do it.</p><p><em>That gap is closing fast.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Xk6p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b035cfb-402c-4ff0-ae8c-4c0277cf18d8_662x488.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Xk6p!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b035cfb-402c-4ff0-ae8c-4c0277cf18d8_662x488.png 424w, https://substackcdn.com/image/fetch/$s_!Xk6p!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b035cfb-402c-4ff0-ae8c-4c0277cf18d8_662x488.png 848w, https://substackcdn.com/image/fetch/$s_!Xk6p!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b035cfb-402c-4ff0-ae8c-4c0277cf18d8_662x488.png 1272w, https://substackcdn.com/image/fetch/$s_!Xk6p!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b035cfb-402c-4ff0-ae8c-4c0277cf18d8_662x488.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Xk6p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b035cfb-402c-4ff0-ae8c-4c0277cf18d8_662x488.png" width="594" height="437.87311178247734" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0b035cfb-402c-4ff0-ae8c-4c0277cf18d8_662x488.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:488,&quot;width&quot;:662,&quot;resizeWidth&quot;:594,&quot;bytes&quot;:67440,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/193157635?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b035cfb-402c-4ff0-ae8c-4c0277cf18d8_662x488.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Xk6p!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b035cfb-402c-4ff0-ae8c-4c0277cf18d8_662x488.png 424w, https://substackcdn.com/image/fetch/$s_!Xk6p!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b035cfb-402c-4ff0-ae8c-4c0277cf18d8_662x488.png 848w, https://substackcdn.com/image/fetch/$s_!Xk6p!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b035cfb-402c-4ff0-ae8c-4c0277cf18d8_662x488.png 1272w, https://substackcdn.com/image/fetch/$s_!Xk6p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b035cfb-402c-4ff0-ae8c-4c0277cf18d8_662x488.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3><strong>What AI actually changed</strong></h3><p>The conversation about AI in development tends to focus on speed. You can ship faster. You can prototype in an afternoon. Junior devs punch above their weight.</p><p>All true. But that&#8217;s not the real shift.</p><p>The real shift is that <strong>the barrier to building something functional has dropped to almost zero.</strong> Not just for you. For everyone. Your competitor can spin up the same stack, with the same features, in roughly the same time. The thing you spent three months building last year? Someone can replicate the core of it in a week.</p><blockquote><p><em>The code itself is no longer a competitive advantage.</em></p></blockquote><p>Which means if you&#8217;re a developer who&#8217;s been quietly assuming that writing good software or building a good product is enough, it&#8217;s time to think about what your actual moat is.</p><p>As far as I can tell, there are two answers.</p><h3><strong>Moat #1: Marketing and audience</strong></h3><p>The first moat is still digital, but it has nothing to do with the code.</p><p>If people already know you, trust you, and follow what you build, then it doesn&#8217;t matter that someone could clone your product. They&#8217;d still come to you first. They&#8217;d still buy from you because they trust you.</p><p>This is what&#8217;s been quietly true in the indie dev world for years. Developers with large audiences ship mediocre products and make a living. Developers without audiences ship excellent products and get nowhere. The code quality has almost no correlation with the outcome.</p><blockquote><p><em>Distribution has always been the moat. AI just removed the last excuse for pretending otherwise.</em></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7PWF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95940030-c244-4376-ba46-df578a28408e_1290x1148.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7PWF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95940030-c244-4376-ba46-df578a28408e_1290x1148.jpeg 424w, https://substackcdn.com/image/fetch/$s_!7PWF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95940030-c244-4376-ba46-df578a28408e_1290x1148.jpeg 848w, https://substackcdn.com/image/fetch/$s_!7PWF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95940030-c244-4376-ba46-df578a28408e_1290x1148.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!7PWF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95940030-c244-4376-ba46-df578a28408e_1290x1148.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7PWF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95940030-c244-4376-ba46-df578a28408e_1290x1148.jpeg" width="1290" height="1148" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95940030-c244-4376-ba46-df578a28408e_1290x1148.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1148,&quot;width&quot;:1290,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:361985,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/193157635?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95940030-c244-4376-ba46-df578a28408e_1290x1148.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!7PWF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95940030-c244-4376-ba46-df578a28408e_1290x1148.jpeg 424w, https://substackcdn.com/image/fetch/$s_!7PWF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95940030-c244-4376-ba46-df578a28408e_1290x1148.jpeg 848w, https://substackcdn.com/image/fetch/$s_!7PWF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95940030-c244-4376-ba46-df578a28408e_1290x1148.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!7PWF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95940030-c244-4376-ba46-df578a28408e_1290x1148.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I started building my audience back in 2021, long before this felt urgent. Not because I had some grand strategy, but because I wanted to reach more freelance clients and create social proof around my work. That compounding head start is something I&#8217;m genuinely grateful for now. If I were starting from scratch today, with no audience, I&#8217;d be urgently getting started.</p><p><em>The developers who spent the last few years building in public, writing, talking to people, they&#8217;re in a very advantageous position right now.</em></p><h3><strong>Moat #2: The real world</strong></h3><p>The second moat is harder, and most developers aren&#8217;t even thinking about it.</p><p>Software that only lives on a screen is now trivially replicable. But software that interacts with the physical world is a different story. Hardware. Devices. Sensors. Tools that do something tangible, that connect to a machine, read from a physical environment, control something in the real world.</p><p>Nobody can vibe-code their way to a well-engineered embedded system. You can&#8217;t prompt your way past supply chain constraints, or skip the part where you actually test a physical prototype. The real world doesn&#8217;t have a fast-follow.</p><blockquote><p><em>AI compresses the time it takes to write code. It can&#8217;t compress the time it takes to understand a real problem.</em></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_iSe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b1e6921-9795-48ea-a2be-64bff6944798_1170x689.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_iSe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b1e6921-9795-48ea-a2be-64bff6944798_1170x689.webp 424w, https://substackcdn.com/image/fetch/$s_!_iSe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b1e6921-9795-48ea-a2be-64bff6944798_1170x689.webp 848w, https://substackcdn.com/image/fetch/$s_!_iSe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b1e6921-9795-48ea-a2be-64bff6944798_1170x689.webp 1272w, https://substackcdn.com/image/fetch/$s_!_iSe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b1e6921-9795-48ea-a2be-64bff6944798_1170x689.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_iSe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b1e6921-9795-48ea-a2be-64bff6944798_1170x689.webp" width="1170" height="689" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6b1e6921-9795-48ea-a2be-64bff6944798_1170x689.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:689,&quot;width&quot;:1170,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:140984,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/193157635?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b1e6921-9795-48ea-a2be-64bff6944798_1170x689.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_iSe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b1e6921-9795-48ea-a2be-64bff6944798_1170x689.webp 424w, https://substackcdn.com/image/fetch/$s_!_iSe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b1e6921-9795-48ea-a2be-64bff6944798_1170x689.webp 848w, https://substackcdn.com/image/fetch/$s_!_iSe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b1e6921-9795-48ea-a2be-64bff6944798_1170x689.webp 1272w, https://substackcdn.com/image/fetch/$s_!_iSe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b1e6921-9795-48ea-a2be-64bff6944798_1170x689.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This is something I&#8217;ve been getting more curious about myself. I&#8217;ve been working on a sensor project for a go-kart, capturing real telemetry data from a physical vehicle. I&#8217;ve been 3D printing custom housing for the hardware. It&#8217;s messier than writing a web app. It&#8217;s slower. Things don&#8217;t work the first time.</p><p><em>And that&#8217;s exactly the point.</em></p><p>Think about the software that feels genuinely hard to displace. It&#8217;s rarely a web app. It&#8217;s the thing bolted to a piece of machinery. The firmware running on a device. The system that has to work in a warehouse, on a factory floor, in a car, on a track. Those problems require domain knowledge, physical intuition, and real-world testing that no amount of prompting replaces.</p><p>That&#8217;s where the moat is.</p><h3><strong>So what should developers actually do?</strong></h3><p>I&#8217;m not saying stop caring about the code. Write good software. Ship clean, reliable things. That still matters.</p><p>But start being honest about where your edge actually comes from.</p><p>Are you building an audience? Are you writing, posting, being visible in the places your customers exist? Or are you quietly assuming the product will speak for itself?</p><p>Are you building things that touch the real world? Things that require knowledge, context, and physical understanding that can&#8217;t be Googled or prompted into existence?</p><p>The developers who thrive in the next few years won&#8217;t necessarily be the best at writing code. They&#8217;ll be the ones who figured out that coding is now the easy part, and went and got good at something harder.</p><div><hr></div><p>Have a great week. Keep building. See you in the next edition! &#128512;</p>]]></content:encoded></item><item><title><![CDATA[How I Built an AI Agent That Knows Everything About Formula 1]]></title><description><![CDATA[The RAG pipeline powering Formula Chat]]></description><link>https://tomshaw.substack.com/p/how-i-built-an-ai-agent-that-knows</link><guid isPermaLink="false">https://tomshaw.substack.com/p/how-i-built-an-ai-agent-that-knows</guid><dc:creator><![CDATA[Tom Shaw]]></dc:creator><pubDate>Sun, 22 Mar 2026 22:35:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Ydp5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba741f36-7729-4bee-b3c8-35026e90162d_1878x1164.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This week&#8217;s edition of Build Notes is all about my latest side-project, <a href="https://github.com/IAmTomShaw/formula-chat">Formula Chat</a>. It&#8217;s an AI-Agent Chatbot that &#8220;knows everything about Formula 1&#8221;. Well, that&#8217;s the plan anyway.</p><p>Let&#8217;s get into it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ydp5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba741f36-7729-4bee-b3c8-35026e90162d_1878x1164.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ydp5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba741f36-7729-4bee-b3c8-35026e90162d_1878x1164.png 424w, https://substackcdn.com/image/fetch/$s_!Ydp5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba741f36-7729-4bee-b3c8-35026e90162d_1878x1164.png 848w, https://substackcdn.com/image/fetch/$s_!Ydp5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba741f36-7729-4bee-b3c8-35026e90162d_1878x1164.png 1272w, https://substackcdn.com/image/fetch/$s_!Ydp5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba741f36-7729-4bee-b3c8-35026e90162d_1878x1164.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ydp5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba741f36-7729-4bee-b3c8-35026e90162d_1878x1164.png" width="1456" height="902" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba741f36-7729-4bee-b3c8-35026e90162d_1878x1164.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:902,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:142784,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/191803379?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba741f36-7729-4bee-b3c8-35026e90162d_1878x1164.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Ydp5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba741f36-7729-4bee-b3c8-35026e90162d_1878x1164.png 424w, https://substackcdn.com/image/fetch/$s_!Ydp5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba741f36-7729-4bee-b3c8-35026e90162d_1878x1164.png 848w, https://substackcdn.com/image/fetch/$s_!Ydp5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba741f36-7729-4bee-b3c8-35026e90162d_1878x1164.png 1272w, https://substackcdn.com/image/fetch/$s_!Ydp5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba741f36-7729-4bee-b3c8-35026e90162d_1878x1164.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Project Idea &#128161;</h2><p>The goal is simple: build an AI agent that can answer <em>anything</em> about Formula One.</p><p>Not just <em>&#8220;who won the 2026 championship?&#8221;.</em></p><p>I&#8217;m talking about stats, race results, what happened at each circuit, and eventually, what the lap data actually looked like.</p><p>The kind of questions an F1 obsessive would ask.</p><h3>Features &#127950;&#65039;</h3><ul><li><p><strong>Conversational AI:</strong> Ask any F1 question and get a detailed, contextual answer</p></li><li><p><strong>RAG-powered knowledge base:</strong> 40+ public knowledge sources indexed across driver profiles, team histories, circuit guides, and FIA regulations.</p></li><li><p><strong>Streaming responses:</strong> Real-time token-by-token streaming via Server-Sent Events so you&#8217;re not just staring at a blank screen waiting for a response to finish generating.</p></li><li><p><strong>Stats Querying: </strong>The agent can query a database of statistics from champions, races, qualifying sessions, etc to answer complex questions that wouldn&#8217;t be possible via a traditional RAG pipeline <em>(still working on this, not in the repo yet).</em></p></li></ul><h3>The Tech Stack &#128187;</h3><p><strong>Language:</strong> <a href="https://www.python.org/">Python 3.12</a></p><p><strong>Agent Framework:</strong> <a href="https://developers.openai.com/api/docs/guides/agents-sdk">OpenAI Agents SDK</a></p><p><strong>Backend:</strong> <a href="https://fastapi.tiangolo.com/">FastAPI</a></p><p><strong>Database:</strong> <a href="https://www.postgresql.org/">PostgreSQL</a> + <a href="https://github.com/pgvector/pgvector">pgvector</a></p><p><strong>Web Scraping:</strong> <a href="https://playwright.dev/">Playwright</a></p><p><strong>Frontend:</strong> <a href="https://react.dev/">React</a> + <a href="https://www.typescriptlang.org/">TypeScript</a> + <a href="https://tailwindcss.com/">Tailwind CSS</a></p><h2>How the RAG Pipeline works</h2><p>The core of the project is a RAG pipeline <em>(Retrieval-Augmented Generation).</em></p><p><em>In plain English: instead of relying purely on what the model already knows, we feed it relevant chunks of real F1 content at query time.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zMdA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F979eedb4-4aa0-41c7-82c7-01749d4b7730_3420x2685.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zMdA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F979eedb4-4aa0-41c7-82c7-01749d4b7730_3420x2685.png 424w, https://substackcdn.com/image/fetch/$s_!zMdA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F979eedb4-4aa0-41c7-82c7-01749d4b7730_3420x2685.png 848w, https://substackcdn.com/image/fetch/$s_!zMdA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F979eedb4-4aa0-41c7-82c7-01749d4b7730_3420x2685.png 1272w, https://substackcdn.com/image/fetch/$s_!zMdA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F979eedb4-4aa0-41c7-82c7-01749d4b7730_3420x2685.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zMdA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F979eedb4-4aa0-41c7-82c7-01749d4b7730_3420x2685.png" width="1456" height="1143" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/979eedb4-4aa0-41c7-82c7-01749d4b7730_3420x2685.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1143,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:338515,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/191803379?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F979eedb4-4aa0-41c7-82c7-01749d4b7730_3420x2685.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zMdA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F979eedb4-4aa0-41c7-82c7-01749d4b7730_3420x2685.png 424w, https://substackcdn.com/image/fetch/$s_!zMdA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F979eedb4-4aa0-41c7-82c7-01749d4b7730_3420x2685.png 848w, https://substackcdn.com/image/fetch/$s_!zMdA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F979eedb4-4aa0-41c7-82c7-01749d4b7730_3420x2685.png 1272w, https://substackcdn.com/image/fetch/$s_!zMdA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F979eedb4-4aa0-41c7-82c7-01749d4b7730_3420x2685.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The pipeline runs in four stages.</p><ol><li><p>First, a Playwright-based scraper pulls clean text from Wikipedia articles, stripping out all the boilerplate (navigation bars, styling, references, etc) before anything gets stored.</p></li></ol><ol start="2"><li><p>Then it chunks the content into overlapping ~400-token segments using <a href="https://github.com/openai/tiktoken">tiktoken</a>, respecting paragraph and sentence boundaries to keep things semantically coherent.</p></li><li><p>Each chunk gets embedded using OpenAI&#8217;s <code>text-embedding-3-small</code> model.</p></li><li><p>The embeddings are loaded into <a href="https://github.com/pgvector/pgvector">pgvector</a> (PostgreSQL with vector search built in)</p></li></ol><p>When you ask the agent a question, it performs a cosine similarity search over that vector store and surfaces the most relevant chunks to inform its answer.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xkKA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcacee67e-4ee9-465d-b063-283aec607737_1380x2985.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xkKA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcacee67e-4ee9-465d-b063-283aec607737_1380x2985.png 424w, https://substackcdn.com/image/fetch/$s_!xkKA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcacee67e-4ee9-465d-b063-283aec607737_1380x2985.png 848w, https://substackcdn.com/image/fetch/$s_!xkKA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcacee67e-4ee9-465d-b063-283aec607737_1380x2985.png 1272w, https://substackcdn.com/image/fetch/$s_!xkKA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcacee67e-4ee9-465d-b063-283aec607737_1380x2985.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xkKA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcacee67e-4ee9-465d-b063-283aec607737_1380x2985.png" width="241" height="521.2934782608696" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cacee67e-4ee9-465d-b063-283aec607737_1380x2985.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2985,&quot;width&quot;:1380,&quot;resizeWidth&quot;:241,&quot;bytes&quot;:257353,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/191803379?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcacee67e-4ee9-465d-b063-283aec607737_1380x2985.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xkKA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcacee67e-4ee9-465d-b063-283aec607737_1380x2985.png 424w, https://substackcdn.com/image/fetch/$s_!xkKA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcacee67e-4ee9-465d-b063-283aec607737_1380x2985.png 848w, https://substackcdn.com/image/fetch/$s_!xkKA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcacee67e-4ee9-465d-b063-283aec607737_1380x2985.png 1272w, https://substackcdn.com/image/fetch/$s_!xkKA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcacee67e-4ee9-465d-b063-283aec607737_1380x2985.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It&#8217;s a clean setup. And it works really well for the narrative side of a given subject (in this case F1 and its history, driver profiles, team stories, regulation changes, etc).</p><h3>The future &#128640;</h3><p>This is just the MVP. Currently, it only supports the RAG knowledge search, but not for long.</p><p>I&#8217;ve already started building out a <strong>database search for statistics</strong>, which will allow the agent to reference and filter structured data. Lap times, race results, championship standings, tyre strategy, etc. The stuff that makes F1 data genuinely fascinating.</p><p>The end goal is an agent that can answer the full spectrum of F1 questions. Not just <em>who won</em>, but fastest laps, driver comparisons, potentially generating charts, etc.</p><h3>How you can get involved &#129781;</h3><p>If you&#8217;re an F1 fan, a data nerd, or just someone who wants to poke around a proper RAG implementation, the repo is open source and ready to run.</p><p>Give it a star if you find it useful. &#11088;</p><p>&#128073; <a href="https://github.com/IAmTomShaw/formula-chat">https://github.com/IAmTomShaw/formula-chat</a></p><p>Thank you to everyone that&#8217;s supporting the newsletter and keeping up to date with my projects. See you in the next one! :)</p>]]></content:encoded></item><item><title><![CDATA[Turns out "figure it out yourself" is the best career advice I can give you]]></title><description><![CDATA[2020. A pandemic. A software agency. A very bad decision.]]></description><link>https://tomshaw.substack.com/p/turns-out-figure-it-out-yourself</link><guid isPermaLink="false">https://tomshaw.substack.com/p/turns-out-figure-it-out-yourself</guid><dc:creator><![CDATA[Tom Shaw]]></dc:creator><pubDate>Sun, 08 Mar 2026 20:02:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!sFmr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc40cfa31-2da1-403f-bee1-e8fa7a520fa5_2832x1770.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In 2020, a software development agency screwed me over. <em>It was the best thing that ever happened to my career.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ncnT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7427875b-d685-47ac-8ab8-6ce334b58b0f_1900x1898.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ncnT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7427875b-d685-47ac-8ab8-6ce334b58b0f_1900x1898.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ncnT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7427875b-d685-47ac-8ab8-6ce334b58b0f_1900x1898.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ncnT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7427875b-d685-47ac-8ab8-6ce334b58b0f_1900x1898.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ncnT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7427875b-d685-47ac-8ab8-6ce334b58b0f_1900x1898.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ncnT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7427875b-d685-47ac-8ab8-6ce334b58b0f_1900x1898.jpeg" width="528" height="527.2747252747253" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7427875b-d685-47ac-8ab8-6ce334b58b0f_1900x1898.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1454,&quot;width&quot;:1456,&quot;resizeWidth&quot;:528,&quot;bytes&quot;:470655,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/190302459?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7427875b-d685-47ac-8ab8-6ce334b58b0f_1900x1898.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ncnT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7427875b-d685-47ac-8ab8-6ce334b58b0f_1900x1898.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ncnT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7427875b-d685-47ac-8ab8-6ce334b58b0f_1900x1898.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ncnT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7427875b-d685-47ac-8ab8-6ce334b58b0f_1900x1898.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ncnT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7427875b-d685-47ac-8ab8-6ce334b58b0f_1900x1898.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Me in my first office in 2019 (running my first business)</figcaption></figure></div><p>This is the short story of how I went from getting scammed by a software development agency to building my own career in tech and learning to build projects for myself.</p><p>Let me take you where it's all began, spring 2020&#8230;</p><div><hr></div><h3>I Had No Idea How to Build an App &#128241;</h3><p>I didn&#8217;t come from tech. Not even close.</p><p>My background was marketing. For years I ran marketing campaigns for bars and restaurants. I felt like I knew that world inside out.</p><p>So when lockdown hit and venues were being forced to close overnight, I felt it personally. My entire business was gone, and I had friends losing their livelihoods in real time.</p><p>So I had an idea.</p><p>An app that would help restaurants and bars adapt and safely sell to their customers through the various stages of lockdown restrictions. A lifeline for businesses that had no idea how to pivot online.</p><p>The only problem? I had absolutely no idea how to build it.</p><div><hr></div><h3>So I Hired an Agency &#128176;</h3><p>It seemed like the logical move at the time.</p><p>We spent weeks working with them. Requirements, scope, back and forth. Getting excited about what this thing could become.</p><p>Then we asked for access to our own code.</p><p>They said no.</p><p>Their reasoning was that if they handed it over, we might not come back for continued support. They wanted us locked in. Dependent on them.</p><blockquote><p><em>They were holding our own product hostage to protect a retainer.</em></p></blockquote><p>Trust broken. Instantly.</p><div><hr></div><h3>The Red Flags I Should Have Caught Sooner &#128681;</h3><p>Looking back, the signs were there.</p><p>Before signing anything, I should have asked:</p><ul><li><p><strong>Who owns the code?</strong> This should be in writing before a single line is written.</p></li><li><p><strong>Will I have access to the repository?</strong> If they hesitate on this, walk away.</p></li><li><p><strong>What happens if we part ways?</strong> If you&#8217;ve paid, you&#8217;re entitled to what you paid for.</p></li></ul><p><em>A good agency / freelancer should never make the client feel like they don&#8217;t own the work.</em></p><div><hr></div><h3>The Decision That Changed Everything &#9878;&#65039;</h3><p>I had two options.</p><p>Find another agency. Or figure it out myself.</p><p>I chose the second one. Which, honestly, terrified me.</p><p>No CS degree. No developer friends to call. No idea where to even start. Just an idea I believed in and a lot of frustration pointing me in one direction.</p><p>So I started learning to code. And then I started building my first app.</p><div><hr></div><h3>What Actually Happened &#128640;</h3><p>I launched the app / web platform.</p><p>Thousands of users signed up. It drove tens of thousands of dollars in revenue. For someone who had never written a line of code before, that felt completely unreal.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!O4Cx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5af4aba8-abef-4c66-8b08-e88ec91d54fb_720x720.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!O4Cx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5af4aba8-abef-4c66-8b08-e88ec91d54fb_720x720.jpeg 424w, https://substackcdn.com/image/fetch/$s_!O4Cx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5af4aba8-abef-4c66-8b08-e88ec91d54fb_720x720.jpeg 848w, https://substackcdn.com/image/fetch/$s_!O4Cx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5af4aba8-abef-4c66-8b08-e88ec91d54fb_720x720.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!O4Cx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5af4aba8-abef-4c66-8b08-e88ec91d54fb_720x720.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!O4Cx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5af4aba8-abef-4c66-8b08-e88ec91d54fb_720x720.jpeg" width="400" height="400" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5af4aba8-abef-4c66-8b08-e88ec91d54fb_720x720.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:720,&quot;resizeWidth&quot;:400,&quot;bytes&quot;:148700,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/190302459?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5af4aba8-abef-4c66-8b08-e88ec91d54fb_720x720.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!O4Cx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5af4aba8-abef-4c66-8b08-e88ec91d54fb_720x720.jpeg 424w, https://substackcdn.com/image/fetch/$s_!O4Cx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5af4aba8-abef-4c66-8b08-e88ec91d54fb_720x720.jpeg 848w, https://substackcdn.com/image/fetch/$s_!O4Cx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5af4aba8-abef-4c66-8b08-e88ec91d54fb_720x720.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!O4Cx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5af4aba8-abef-4c66-8b08-e88ec91d54fb_720x720.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Collecting stock from one of the customers using the app</figcaption></figure></div><p>But more importantly, it opened a door I didn&#8217;t know existed.</p><p>The app eventually shut down when the world returned to normal. But that project turned my failed marketing business into a new career in tech.</p><p>I began freelancing and making videos about programming, building things, etc</p><p>Which turned into where I am now.</p><p>None of this would have happened if that agency had just handed over the code like they should have.</p><div><hr></div><h3>The Thing Nobody Tells You &#8252;&#65039;</h3><p>Doing something yourself is terrifying at first.</p><p>But it is also the fastest way to learn. And learning compounds. Every project teaches you something the next one benefits from. Skills that feel impossible in month one feel obvious by month six.</p><p>If I had just hired another agency, I wouldn&#8217;t have learnt anything.</p><p>If I was too busy, outsourcing would have been a good idea. But the reality was that I had all the time in the world.</p><p>If you are sitting on an idea right now, waiting until you feel ready or until you can afford someone else to build it&#8230; consider whether that wait is actually protecting you, or just delaying you.</p><blockquote><p><em>Sometimes if you want to build something, you have to build it yourself.</em></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sFmr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc40cfa31-2da1-403f-bee1-e8fa7a520fa5_2832x1770.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sFmr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc40cfa31-2da1-403f-bee1-e8fa7a520fa5_2832x1770.png 424w, https://substackcdn.com/image/fetch/$s_!sFmr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc40cfa31-2da1-403f-bee1-e8fa7a520fa5_2832x1770.png 848w, https://substackcdn.com/image/fetch/$s_!sFmr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc40cfa31-2da1-403f-bee1-e8fa7a520fa5_2832x1770.png 1272w, https://substackcdn.com/image/fetch/$s_!sFmr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc40cfa31-2da1-403f-bee1-e8fa7a520fa5_2832x1770.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sFmr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc40cfa31-2da1-403f-bee1-e8fa7a520fa5_2832x1770.png" width="1456" height="910" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c40cfa31-2da1-403f-bee1-e8fa7a520fa5_2832x1770.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:910,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5022561,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/190302459?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc40cfa31-2da1-403f-bee1-e8fa7a520fa5_2832x1770.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!sFmr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc40cfa31-2da1-403f-bee1-e8fa7a520fa5_2832x1770.png 424w, https://substackcdn.com/image/fetch/$s_!sFmr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc40cfa31-2da1-403f-bee1-e8fa7a520fa5_2832x1770.png 848w, https://substackcdn.com/image/fetch/$s_!sFmr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc40cfa31-2da1-403f-bee1-e8fa7a520fa5_2832x1770.png 1272w, https://substackcdn.com/image/fetch/$s_!sFmr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc40cfa31-2da1-403f-bee1-e8fa7a520fa5_2832x1770.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Interviewing engineers at GitHub Universe for my videos</figcaption></figure></div><div><hr></div><h3>A Note for the Freelancers Reading This &#129781;</h3><p>If you&#8217;re running an agency or freelancing, I hope this story teaches you something too.</p><ul><li><p><strong>Be transparent about code ownership from day one.</strong> It protects both of you.</p></li><li><p><strong>Give clients repository access.</strong> If they&#8217;ve paid, it&#8217;s theirs.</p></li><li><p><strong>If you part ways, they get what they paid for.</strong> No exceptions.</p></li></ul><p>Trust is the only thing that keeps clients coming back. Holding code hostage doesn&#8217;t create loyalty. It creates resentment.</p><p><em>And sometimes, it accidentally launches someone else&#8217;s tech career.</em></p>]]></content:encoded></item><item><title><![CDATA[We're turning the F1 Race Replay Python Project into a...]]></title><description><![CDATA[If you're a Programmer that loves Formula 1, you're going to love this]]></description><link>https://tomshaw.substack.com/p/were-turning-the-f1-race-replay-python</link><guid isPermaLink="false">https://tomshaw.substack.com/p/were-turning-the-f1-race-replay-python</guid><dc:creator><![CDATA[Tom Shaw]]></dc:creator><pubDate>Sun, 22 Feb 2026 20:39:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!lkNA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02b7d2a7-16f1-4337-a8e2-1b6269c77ba9_3440x1414.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This week, the next big thing happened&#8230;</p><blockquote><h3><em><a href="https://github.com/IAmTomShaw/f1-race-replay">F1 Race Replay</a> entered it&#8217;s pit wall era.</em></h3></blockquote><p>The project that started out as a simple way for developers to visualise F1 races on a 2D map has now become a pit wall-style tool for developers and F1 lovers to be able to analyse data.</p><p><em>Here&#8217;s how&#8230;</em></p><p>2 weeks ago I built the telemetry service. A way for the main race application to stream data to different windows on my desktop.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;7bcf8afd-3a22-4a6b-bdba-8ed94c5c8c33&quot;,&quot;caption&quot;:&quot;The biggest limitation in F1 Race Replay is gone!&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Why contributing to the VIRAL F1 Python Project just got easier&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:124420874,&quot;name&quot;:&quot;Tom Shaw&quot;,&quot;bio&quot;:&quot;Tech Content Creator and Developer &#128187; Building cool projects and sharing them with as many people as possible!&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1385654c-22e7-45ad-831e-79f738c9971e_1080x1080.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-02-08T19:52:49.464Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!F5Gz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54da71ca-d122-4728-b56f-615b9b7d0cbd_1882x848.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://tomshaw.substack.com/p/why-contributing-to-f1-race-replay&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:187319867,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:7,&quot;comment_count&quot;:3,&quot;publication_id&quot;:1721578,&quot;publication_name&quot;:&quot;build notes.&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!zNDI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4f2d96-61b9-46a0-8558-d404fa731ac8_1080x1080.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>This meant that we could make a start on adding insights outside of the Race Replay window that you&#8217;re used to seeing.</p><h2>Introducing the Driver Telemetry Insight</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lkNA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02b7d2a7-16f1-4337-a8e2-1b6269c77ba9_3440x1414.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lkNA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02b7d2a7-16f1-4337-a8e2-1b6269c77ba9_3440x1414.png 424w, https://substackcdn.com/image/fetch/$s_!lkNA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02b7d2a7-16f1-4337-a8e2-1b6269c77ba9_3440x1414.png 848w, https://substackcdn.com/image/fetch/$s_!lkNA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02b7d2a7-16f1-4337-a8e2-1b6269c77ba9_3440x1414.png 1272w, https://substackcdn.com/image/fetch/$s_!lkNA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02b7d2a7-16f1-4337-a8e2-1b6269c77ba9_3440x1414.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lkNA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02b7d2a7-16f1-4337-a8e2-1b6269c77ba9_3440x1414.png" width="3440" height="1414" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/02b7d2a7-16f1-4337-a8e2-1b6269c77ba9_3440x1414.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1414,&quot;width&quot;:3440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:725997,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/188819692?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25c4a687-15d8-4d4b-86bf-201635a85125_3440x1440.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lkNA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02b7d2a7-16f1-4337-a8e2-1b6269c77ba9_3440x1414.png 424w, https://substackcdn.com/image/fetch/$s_!lkNA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02b7d2a7-16f1-4337-a8e2-1b6269c77ba9_3440x1414.png 848w, https://substackcdn.com/image/fetch/$s_!lkNA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02b7d2a7-16f1-4337-a8e2-1b6269c77ba9_3440x1414.png 1272w, https://substackcdn.com/image/fetch/$s_!lkNA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02b7d2a7-16f1-4337-a8e2-1b6269c77ba9_3440x1414.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This new insight allows you to view the telemetry traces coming of of all of the drivers cars, onto a line chart while the Race Replay screen is in view.</p><p>This exact style of charts are used by motorsport engineers to analyse how a driver is actually driving the car. Such as:</p><ul><li><p>Where they&#8217;re braking</p></li><li><p>Where they&#8217;re changing gear</p></li><li><p>How heavily or steadily they&#8217;re applying the brake</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ue6o!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa599f8b9-f2b6-42a1-ae35-6bd98b083d3f_2598x1450.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ue6o!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa599f8b9-f2b6-42a1-ae35-6bd98b083d3f_2598x1450.png 424w, https://substackcdn.com/image/fetch/$s_!ue6o!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa599f8b9-f2b6-42a1-ae35-6bd98b083d3f_2598x1450.png 848w, https://substackcdn.com/image/fetch/$s_!ue6o!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa599f8b9-f2b6-42a1-ae35-6bd98b083d3f_2598x1450.png 1272w, https://substackcdn.com/image/fetch/$s_!ue6o!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa599f8b9-f2b6-42a1-ae35-6bd98b083d3f_2598x1450.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ue6o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa599f8b9-f2b6-42a1-ae35-6bd98b083d3f_2598x1450.png" width="1456" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a599f8b9-f2b6-42a1-ae35-6bd98b083d3f_2598x1450.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:486269,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/188819692?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa599f8b9-f2b6-42a1-ae35-6bd98b083d3f_2598x1450.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ue6o!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa599f8b9-f2b6-42a1-ae35-6bd98b083d3f_2598x1450.png 424w, https://substackcdn.com/image/fetch/$s_!ue6o!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa599f8b9-f2b6-42a1-ae35-6bd98b083d3f_2598x1450.png 848w, https://substackcdn.com/image/fetch/$s_!ue6o!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa599f8b9-f2b6-42a1-ae35-6bd98b083d3f_2598x1450.png 1272w, https://substackcdn.com/image/fetch/$s_!ue6o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa599f8b9-f2b6-42a1-ae35-6bd98b083d3f_2598x1450.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>These charts are probably the most valuable charts that an Engineer has access to during a race weekend, especially when they&#8217;re used to compare telemetry between teammates.</p><p>You can access this new insight by selecting it using the Insights menu that automatically appears when the Race Replay Window is loaded.</p><h2>How you can build your own Insight!</h2><p>This new method of building insights has been made super easy using the <em>&#8220;PitWallWindow&#8221;</em> class.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OCOC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b446b77-42ae-4b1e-bf9b-5a6add370716_790x370.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OCOC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b446b77-42ae-4b1e-bf9b-5a6add370716_790x370.png 424w, https://substackcdn.com/image/fetch/$s_!OCOC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b446b77-42ae-4b1e-bf9b-5a6add370716_790x370.png 848w, https://substackcdn.com/image/fetch/$s_!OCOC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b446b77-42ae-4b1e-bf9b-5a6add370716_790x370.png 1272w, https://substackcdn.com/image/fetch/$s_!OCOC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b446b77-42ae-4b1e-bf9b-5a6add370716_790x370.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OCOC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b446b77-42ae-4b1e-bf9b-5a6add370716_790x370.png" width="409" height="191.55696202531647" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8b446b77-42ae-4b1e-bf9b-5a6add370716_790x370.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:370,&quot;width&quot;:790,&quot;resizeWidth&quot;:409,&quot;bytes&quot;:42465,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/188819692?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b446b77-42ae-4b1e-bf9b-5a6add370716_790x370.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!OCOC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b446b77-42ae-4b1e-bf9b-5a6add370716_790x370.png 424w, https://substackcdn.com/image/fetch/$s_!OCOC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b446b77-42ae-4b1e-bf9b-5a6add370716_790x370.png 848w, https://substackcdn.com/image/fetch/$s_!OCOC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b446b77-42ae-4b1e-bf9b-5a6add370716_790x370.png 1272w, https://substackcdn.com/image/fetch/$s_!OCOC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b446b77-42ae-4b1e-bf9b-5a6add370716_790x370.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The <em>&#8220;PitWallWindow&#8221;</em> class implements the essential logic for initialising and running a pit wall insight inside of the project.</p><p>The  <em>&#8220;MyCustomWindow&#8221;</em> template inside of <em>&#8220;pit_wall_window_template.py&#8221;</em> is a blank canvas built on top of the PitWallWindow to make it super easy for you to build your insight.</p><p>It receives all of the telemetry data that you&#8217;ll need from the Telemetry Service by default, so you don&#8217;t have to worry about how its connected.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qThI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6ba2b-ff0a-4c56-a004-4e5c3158046d_1500x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qThI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6ba2b-ff0a-4c56-a004-4e5c3158046d_1500x900.png 424w, https://substackcdn.com/image/fetch/$s_!qThI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6ba2b-ff0a-4c56-a004-4e5c3158046d_1500x900.png 848w, https://substackcdn.com/image/fetch/$s_!qThI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6ba2b-ff0a-4c56-a004-4e5c3158046d_1500x900.png 1272w, https://substackcdn.com/image/fetch/$s_!qThI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6ba2b-ff0a-4c56-a004-4e5c3158046d_1500x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qThI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6ba2b-ff0a-4c56-a004-4e5c3158046d_1500x900.png" width="1456" height="874" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3ea6ba2b-ff0a-4c56-a004-4e5c3158046d_1500x900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:874,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:177600,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/188819692?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6ba2b-ff0a-4c56-a004-4e5c3158046d_1500x900.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qThI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6ba2b-ff0a-4c56-a004-4e5c3158046d_1500x900.png 424w, https://substackcdn.com/image/fetch/$s_!qThI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6ba2b-ff0a-4c56-a004-4e5c3158046d_1500x900.png 848w, https://substackcdn.com/image/fetch/$s_!qThI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6ba2b-ff0a-4c56-a004-4e5c3158046d_1500x900.png 1272w, https://substackcdn.com/image/fetch/$s_!qThI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6ba2b-ff0a-4c56-a004-4e5c3158046d_1500x900.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><blockquote><p><strong>&#8252;&#65039; Important:</strong> Make sure to add your chart to the <em>&#8220;Insights Menu&#8221;</em> so that it can be selected by users.</p></blockquote><p>I&#8217;ve written a guide for building your own Insights and added it to the GitHub repository. You can find it here: <a href="https://github.com/IAmTomShaw/f1-race-replay/blob/main/docs/PitWallWindow.md">https://github.com/IAmTomShaw/f1-race-replay/blob/main/docs/PitWallWindow.md</a></p><div><hr></div><h1>Projects of the Week &#128640;</h1><p>Last week on my Instagram, I asked developers to drop the links to their open-source projects, with the intention of showcasing my favourites on my social channels!</p><p>Here are three of my favourites!</p><h2>1. DhruvGoswami10/TARS-WIZARD</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bfV-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7621097-c019-4807-bc0c-cd93ca746a87_1386x950.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bfV-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7621097-c019-4807-bc0c-cd93ca746a87_1386x950.png 424w, https://substackcdn.com/image/fetch/$s_!bfV-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7621097-c019-4807-bc0c-cd93ca746a87_1386x950.png 848w, https://substackcdn.com/image/fetch/$s_!bfV-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7621097-c019-4807-bc0c-cd93ca746a87_1386x950.png 1272w, https://substackcdn.com/image/fetch/$s_!bfV-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7621097-c019-4807-bc0c-cd93ca746a87_1386x950.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bfV-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7621097-c019-4807-bc0c-cd93ca746a87_1386x950.png" width="436" height="298.84559884559883" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e7621097-c019-4807-bc0c-cd93ca746a87_1386x950.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:950,&quot;width&quot;:1386,&quot;resizeWidth&quot;:436,&quot;bytes&quot;:451751,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/188819692?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7621097-c019-4807-bc0c-cd93ca746a87_1386x950.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bfV-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7621097-c019-4807-bc0c-cd93ca746a87_1386x950.png 424w, https://substackcdn.com/image/fetch/$s_!bfV-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7621097-c019-4807-bc0c-cd93ca746a87_1386x950.png 848w, https://substackcdn.com/image/fetch/$s_!bfV-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7621097-c019-4807-bc0c-cd93ca746a87_1386x950.png 1272w, https://substackcdn.com/image/fetch/$s_!bfV-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7621097-c019-4807-bc0c-cd93ca746a87_1386x950.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Open-source guide to building a replica of TARS from the Interstellar movie!</p><ul><li><p>Python &#128013;</p></li><li><p>3d Printing &#128424;&#65039;</p></li><li><p>Hardware &#128187;</p></li></ul><p>GitHub: <a href="https://github.com/DhruvGoswami10/TARS-WIZARD">https://github.com/DhruvGoswami10/TARS-WIZARD</a></p><h2>2. saccofrancesco/Deepshot</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CNiR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fc130e8-32e3-4fbd-9692-e25a509bf69b_1590x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CNiR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fc130e8-32e3-4fbd-9692-e25a509bf69b_1590x900.png 424w, https://substackcdn.com/image/fetch/$s_!CNiR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fc130e8-32e3-4fbd-9692-e25a509bf69b_1590x900.png 848w, https://substackcdn.com/image/fetch/$s_!CNiR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fc130e8-32e3-4fbd-9692-e25a509bf69b_1590x900.png 1272w, https://substackcdn.com/image/fetch/$s_!CNiR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fc130e8-32e3-4fbd-9692-e25a509bf69b_1590x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CNiR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fc130e8-32e3-4fbd-9692-e25a509bf69b_1590x900.png" width="426" height="241.0879120879121" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2fc130e8-32e3-4fbd-9692-e25a509bf69b_1590x900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:824,&quot;width&quot;:1456,&quot;resizeWidth&quot;:426,&quot;bytes&quot;:561136,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/188819692?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fc130e8-32e3-4fbd-9692-e25a509bf69b_1590x900.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!CNiR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fc130e8-32e3-4fbd-9692-e25a509bf69b_1590x900.png 424w, https://substackcdn.com/image/fetch/$s_!CNiR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fc130e8-32e3-4fbd-9692-e25a509bf69b_1590x900.png 848w, https://substackcdn.com/image/fetch/$s_!CNiR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fc130e8-32e3-4fbd-9692-e25a509bf69b_1590x900.png 1272w, https://substackcdn.com/image/fetch/$s_!CNiR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fc130e8-32e3-4fbd-9692-e25a509bf69b_1590x900.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>ML application for predicting NBA game outcomes using historic data.</p><ul><li><p>Python &#128013;</p></li><li><p>scikit-learn &#128200;</p></li></ul><p>GitHub: <a href="https://github.com/saccofrancesco/deepshot">https://github.com/saccofrancesco/deepshot</a></p><h2>3. TemRevil/Kittle</h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5IF3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71b9c87-e61a-4dec-b353-cff4e76a5580_3566x2044.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5IF3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71b9c87-e61a-4dec-b353-cff4e76a5580_3566x2044.png 424w, https://substackcdn.com/image/fetch/$s_!5IF3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71b9c87-e61a-4dec-b353-cff4e76a5580_3566x2044.png 848w, https://substackcdn.com/image/fetch/$s_!5IF3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71b9c87-e61a-4dec-b353-cff4e76a5580_3566x2044.png 1272w, https://substackcdn.com/image/fetch/$s_!5IF3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71b9c87-e61a-4dec-b353-cff4e76a5580_3566x2044.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5IF3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71b9c87-e61a-4dec-b353-cff4e76a5580_3566x2044.png" width="418" height="239.7184065934066" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f71b9c87-e61a-4dec-b353-cff4e76a5580_3566x2044.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:835,&quot;width&quot;:1456,&quot;resizeWidth&quot;:418,&quot;bytes&quot;:353717,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/188819692?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71b9c87-e61a-4dec-b353-cff4e76a5580_3566x2044.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5IF3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71b9c87-e61a-4dec-b353-cff4e76a5580_3566x2044.png 424w, https://substackcdn.com/image/fetch/$s_!5IF3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71b9c87-e61a-4dec-b353-cff4e76a5580_3566x2044.png 848w, https://substackcdn.com/image/fetch/$s_!5IF3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71b9c87-e61a-4dec-b353-cff4e76a5580_3566x2044.png 1272w, https://substackcdn.com/image/fetch/$s_!5IF3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71b9c87-e61a-4dec-b353-cff4e76a5580_3566x2044.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Chat with your codebase to understand vulnerabilities, bugs, etc using your own AI API Keys.</p><ul><li><p>TypeScript &#128309;</p></li><li><p>LLMs &#129504;</p></li></ul><p>GitHub: <a href="https://github.com/TemRevil/Kittle">https://github.com/TemRevil/Kittle</a></p><div><hr></div><p>If this is successful, I might turn <em>&#8220;Projects of the Week&#8221; </em>into a regular feature on this newsletter!</p><p>If you&#8217;d like to get your project feature, send it in by commenting on this post (via Substack) using the following format: <em><strong>[Your GitHub link] - [Project Description]</strong></em></p>]]></content:encoded></item><item><title><![CDATA[One way to guarantee that your startup project fails]]></title><description><![CDATA[Important advice from someone who's never built a successful startup]]></description><link>https://tomshaw.substack.com/p/you-can-build-whatever-you-want-but</link><guid isPermaLink="false">https://tomshaw.substack.com/p/you-can-build-whatever-you-want-but</guid><dc:creator><![CDATA[Tom Shaw]]></dc:creator><pubDate>Sun, 15 Feb 2026 21:43:27 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8b94c48e-a8ac-42be-9b68-2f805c283018_1200x630.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;ve launched 3 startups. <em>All of them failed.</em></p><p>Not because I couldn&#8217;t build a good product.</p><p><em>That&#8217;s the painful part.</em></p><p>I&#8217;ve always wanted to build something real. Something that solves a problem for thousands of people.</p><p>People love my open-source projects <em>(not to brag). </em>But there&#8217;s a huge difference between building communities around open-source projects and launching a paid service to customers.</p><p>I&#8217;ve had many failed attempts in the past:</p><h3>1. Kardlo (2021)</h3><p>My first proper app.</p><p>A mobile ordering system for restaurants.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xCvP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa35fbf3-dd45-4c23-a5f7-5dd5929fe85b_1952x1954.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xCvP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa35fbf3-dd45-4c23-a5f7-5dd5929fe85b_1952x1954.jpeg 424w, https://substackcdn.com/image/fetch/$s_!xCvP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa35fbf3-dd45-4c23-a5f7-5dd5929fe85b_1952x1954.jpeg 848w, https://substackcdn.com/image/fetch/$s_!xCvP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa35fbf3-dd45-4c23-a5f7-5dd5929fe85b_1952x1954.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!xCvP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa35fbf3-dd45-4c23-a5f7-5dd5929fe85b_1952x1954.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xCvP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa35fbf3-dd45-4c23-a5f7-5dd5929fe85b_1952x1954.jpeg" width="464" height="464.31868131868134" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aa35fbf3-dd45-4c23-a5f7-5dd5929fe85b_1952x1954.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1457,&quot;width&quot;:1456,&quot;resizeWidth&quot;:464,&quot;bytes&quot;:124751,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/185747187?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa35fbf3-dd45-4c23-a5f7-5dd5929fe85b_1952x1954.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xCvP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa35fbf3-dd45-4c23-a5f7-5dd5929fe85b_1952x1954.jpeg 424w, https://substackcdn.com/image/fetch/$s_!xCvP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa35fbf3-dd45-4c23-a5f7-5dd5929fe85b_1952x1954.jpeg 848w, https://substackcdn.com/image/fetch/$s_!xCvP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa35fbf3-dd45-4c23-a5f7-5dd5929fe85b_1952x1954.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!xCvP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa35fbf3-dd45-4c23-a5f7-5dd5929fe85b_1952x1954.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>We launched during COVID.</p><p>Customers signed up. Orders came in. Revenue grew.</p><p><em>Over $40k revenue in 45 days</em></p><p>I thought I&#8217;d hit a home run.</p><p>Then lockdown ended. And with it, the urgency.</p><p>Restaurants went back to normal service. They didn&#8217;t need another system. They needed fewer systems.</p><p>The product didn&#8217;t fail technically.</p><p>The market no longer needed it.</p><h3>2. Code Planner (2023)</h3><p>I was so excited about this one. And some developers still love it, so I&#8217;ve kept online. <a href="https://www.codeplanner.co/">(link here)</a></p><p><em>Over 10,000 registered users.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TIzM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3a1b8cb-3064-4dcb-91b4-968d39f4d4e3_806x550.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TIzM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3a1b8cb-3064-4dcb-91b4-968d39f4d4e3_806x550.gif 424w, https://substackcdn.com/image/fetch/$s_!TIzM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3a1b8cb-3064-4dcb-91b4-968d39f4d4e3_806x550.gif 848w, https://substackcdn.com/image/fetch/$s_!TIzM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3a1b8cb-3064-4dcb-91b4-968d39f4d4e3_806x550.gif 1272w, https://substackcdn.com/image/fetch/$s_!TIzM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3a1b8cb-3064-4dcb-91b4-968d39f4d4e3_806x550.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TIzM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3a1b8cb-3064-4dcb-91b4-968d39f4d4e3_806x550.gif" width="452" height="308.43672456575683" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d3a1b8cb-3064-4dcb-91b4-968d39f4d4e3_806x550.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:550,&quot;width&quot;:806,&quot;resizeWidth&quot;:452,&quot;bytes&quot;:76253,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/185747187?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3a1b8cb-3064-4dcb-91b4-968d39f4d4e3_806x550.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!TIzM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3a1b8cb-3064-4dcb-91b4-968d39f4d4e3_806x550.gif 424w, https://substackcdn.com/image/fetch/$s_!TIzM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3a1b8cb-3064-4dcb-91b4-968d39f4d4e3_806x550.gif 848w, https://substackcdn.com/image/fetch/$s_!TIzM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3a1b8cb-3064-4dcb-91b4-968d39f4d4e3_806x550.gif 1272w, https://substackcdn.com/image/fetch/$s_!TIzM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3a1b8cb-3064-4dcb-91b4-968d39f4d4e3_806x550.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And yet&#8230; it doesn&#8217;t make meaningful money.</p><p>Why?</p><p>Because I built it for me.</p><p>I assumed:</p><ul><li><p>Developers want to plan projects exactly like I do</p></li><li><p>Developers are juggling multiple large-scale projects at once</p></li><li><p>Developers care enough about planning to pay for it</p></li></ul><p>Turns out&#8230; most don&#8217;t.</p><p>Most devs spin up a repo and just start building.</p><p>I built a &#8220;nice to have&#8221; and tried to price it like a &#8220;need to have.&#8221;</p><p><em>Classic mistake.</em></p><h3>3. CreatorBee (2023)</h3><p>A pitch deck platform for content creators. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!S1n1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3bc7633-1d9f-4901-80e0-aee1814e9878_860x1254.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!S1n1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3bc7633-1d9f-4901-80e0-aee1814e9878_860x1254.jpeg 424w, https://substackcdn.com/image/fetch/$s_!S1n1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3bc7633-1d9f-4901-80e0-aee1814e9878_860x1254.jpeg 848w, https://substackcdn.com/image/fetch/$s_!S1n1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3bc7633-1d9f-4901-80e0-aee1814e9878_860x1254.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!S1n1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3bc7633-1d9f-4901-80e0-aee1814e9878_860x1254.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!S1n1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3bc7633-1d9f-4901-80e0-aee1814e9878_860x1254.jpeg" width="262" height="382.0325581395349" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c3bc7633-1d9f-4901-80e0-aee1814e9878_860x1254.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1254,&quot;width&quot;:860,&quot;resizeWidth&quot;:262,&quot;bytes&quot;:122220,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/185747187?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1951c6df-947c-4a1b-b9af-7f0b15c7fde1_860x2782.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!S1n1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3bc7633-1d9f-4901-80e0-aee1814e9878_860x1254.jpeg 424w, https://substackcdn.com/image/fetch/$s_!S1n1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3bc7633-1d9f-4901-80e0-aee1814e9878_860x1254.jpeg 848w, https://substackcdn.com/image/fetch/$s_!S1n1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3bc7633-1d9f-4901-80e0-aee1814e9878_860x1254.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!S1n1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3bc7633-1d9f-4901-80e0-aee1814e9878_860x1254.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>On paper? Smart idea.</p><p>In reality? My audience doesn&#8217;t follow me for creator advice.</p><p>They follow me to watch me build.</p><p>I tried selling swimming lessons to people who showed up to learn rock climbing.</p><p>The product wasn&#8217;t terrible. <em>The distribution was.</em></p><div><hr></div><h2>So what&#8217;s the lesson here?</h2><p>None of these failed because the product was bad.</p><p>They all failed because of one thing.</p><p>I started building before thinking about distribution.</p><p>That&#8217;s backwards.</p><h3>Here&#8217;s the uncomfortable truth:</h3><p>Most developers don&#8217;t fail because they can&#8217;t build.</p><p>They fail because nobody knows they built something.</p><p>And distribution isn&#8217;t a &#8220;launch day&#8221; problem.</p><p>It&#8217;s a &#8220;before you write a line of code&#8221; problem.</p><p>If you don&#8217;t know:</p><ul><li><p>Who exactly it&#8217;s for</p></li><li><p>Where those people are</p></li><li><p>How you&#8217;ll consistently reach them</p></li><li><p>Why they would care</p></li></ul><p>Then you&#8217;re just building for the dopamine.</p><p>And dopamine doesn&#8217;t pay the bills.</p><div><hr></div><blockquote><h2>Distribution First. Product Second.</h2></blockquote><p>Before you build:</p><ul><li><p>Do you have an audience?</p></li><li><p>Do you have access to someone else&#8217;s audience?</p></li><li><p>Are you solving a painful problem, or a clever one?</p></li><li><p>Would someone pay today for a scrappy version?</p></li></ul><p>If you can&#8217;t answer those clearly, pause.</p><p>Because once you press &#8220;deploy,&#8221; you&#8217;re not a builder anymore.</p><p><em>You&#8217;re a marketer.</em></p><p>And most developers aren&#8217;t ready for that identity shift.</p><div><hr></div><p>You can keep building for fun.</p><p>But if your goal is a startup?</p><p>You need to figure out how you&#8217;re going to sell it, before you start building it.</p><p>That&#8217;s the lesson I learned the expensive way.</p><div><hr></div><p>I hope you&#8217;ve enjoyed this slightly different broadcast of <a href="https://tomshaw.substack.com/">build notes.</a></p><p>If you did, please give it a like so I know to send out more advice like this :)</p><p></p>]]></content:encoded></item><item><title><![CDATA[Why contributing to the VIRAL F1 Python Project just got easier]]></title><description><![CDATA[Telemetry is now streamed outside the replay window &#8212; build whatever you want]]></description><link>https://tomshaw.substack.com/p/why-contributing-to-f1-race-replay</link><guid isPermaLink="false">https://tomshaw.substack.com/p/why-contributing-to-f1-race-replay</guid><dc:creator><![CDATA[Tom Shaw]]></dc:creator><pubDate>Sun, 08 Feb 2026 19:52:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!F5Gz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54da71ca-d122-4728-b56f-615b9b7d0cbd_1882x848.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3>The biggest limitation in F1 Race Replay is gone!</h3><p>Until now, every new feature in <a href="https://github.com/IAmTomShaw/f1-race-replay/">F1 Race Replay</a> had to fit inside a single window.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!prRa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe109d4e5-3ff6-428f-9b63-44c42435f509_1726x1198.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!prRa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe109d4e5-3ff6-428f-9b63-44c42435f509_1726x1198.png 424w, https://substackcdn.com/image/fetch/$s_!prRa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe109d4e5-3ff6-428f-9b63-44c42435f509_1726x1198.png 848w, https://substackcdn.com/image/fetch/$s_!prRa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe109d4e5-3ff6-428f-9b63-44c42435f509_1726x1198.png 1272w, https://substackcdn.com/image/fetch/$s_!prRa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe109d4e5-3ff6-428f-9b63-44c42435f509_1726x1198.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!prRa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe109d4e5-3ff6-428f-9b63-44c42435f509_1726x1198.png" width="1456" height="1011" data-attrs="{&quot;src&quot;:&quot;https://substackcdn.com/image/fetch/$s_!prRa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe109d4e5-3ff6-428f-9b63-44c42435f509_1726x1198.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1011,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:343122,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/187311712?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe109d4e5-3ff6-428f-9b63-44c42435f509_1726x1198.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!prRa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe109d4e5-3ff6-428f-9b63-44c42435f509_1726x1198.png 424w, https://substackcdn.com/image/fetch/$s_!prRa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe109d4e5-3ff6-428f-9b63-44c42435f509_1726x1198.png 848w, https://substackcdn.com/image/fetch/$s_!prRa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe109d4e5-3ff6-428f-9b63-44c42435f509_1726x1198.png 1272w, https://substackcdn.com/image/fetch/$s_!prRa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe109d4e5-3ff6-428f-9b63-44c42435f509_1726x1198.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Everything had to sit in this window&#8230;</figcaption></figure></div><p>That constraint shaped everything:</p><ul><li><p>what insights we could add</p></li><li><p>how complex charts could be</p></li><li><p>which Pull Requests could realistically be merged</p></li></ul><p>That limitation is now gone.</p><h1>Introducing the Telemetry Stream Service</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!F5Gz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54da71ca-d122-4728-b56f-615b9b7d0cbd_1882x848.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F5Gz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54da71ca-d122-4728-b56f-615b9b7d0cbd_1882x848.png 424w, https://substackcdn.com/image/fetch/$s_!F5Gz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54da71ca-d122-4728-b56f-615b9b7d0cbd_1882x848.png 848w, https://substackcdn.com/image/fetch/$s_!F5Gz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54da71ca-d122-4728-b56f-615b9b7d0cbd_1882x848.png 1272w, https://substackcdn.com/image/fetch/$s_!F5Gz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54da71ca-d122-4728-b56f-615b9b7d0cbd_1882x848.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F5Gz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54da71ca-d122-4728-b56f-615b9b7d0cbd_1882x848.png" width="1456" height="656" data-attrs="{&quot;src&quot;:&quot;https://substackcdn.com/image/fetch/$s_!F5Gz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54da71ca-d122-4728-b56f-615b9b7d0cbd_1882x848.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:656,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1515302,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/187311712?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54da71ca-d122-4728-b56f-615b9b7d0cbd_1882x848.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!F5Gz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54da71ca-d122-4728-b56f-615b9b7d0cbd_1882x848.png 424w, https://substackcdn.com/image/fetch/$s_!F5Gz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54da71ca-d122-4728-b56f-615b9b7d0cbd_1882x848.png 848w, https://substackcdn.com/image/fetch/$s_!F5Gz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54da71ca-d122-4728-b56f-615b9b7d0cbd_1882x848.png 1272w, https://substackcdn.com/image/fetch/$s_!F5Gz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54da71ca-d122-4728-b56f-615b9b7d0cbd_1882x848.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I mentioned in a <a href="https://youtu.be/7CTC6RoYkjk">video on YouTube</a> a few weeks ago that the next step of building the project meant that we needed to find a way to share data between application windows. So since then, I&#8217;ve been building a new internal service that streams telemetry out of the race replay window in real time.</p><p>Instead of every feature living inside the Arcade Race Replay UI, telemetry is now broadcast via WebSockets to any window or application on your local machine that wants to consume it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Z8tA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F970bf51c-6980-44ec-b1a2-cc7a1b556307_698x524.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Z8tA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F970bf51c-6980-44ec-b1a2-cc7a1b556307_698x524.png 424w, https://substackcdn.com/image/fetch/$s_!Z8tA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F970bf51c-6980-44ec-b1a2-cc7a1b556307_698x524.png 848w, https://substackcdn.com/image/fetch/$s_!Z8tA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F970bf51c-6980-44ec-b1a2-cc7a1b556307_698x524.png 1272w, https://substackcdn.com/image/fetch/$s_!Z8tA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F970bf51c-6980-44ec-b1a2-cc7a1b556307_698x524.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Z8tA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F970bf51c-6980-44ec-b1a2-cc7a1b556307_698x524.png" width="698" height="524" data-attrs="{&quot;src&quot;:&quot;https://substackcdn.com/image/fetch/$s_!Z8tA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F970bf51c-6980-44ec-b1a2-cc7a1b556307_698x524.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:524,&quot;width&quot;:698,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:99369,&quot;alt&quot;:&quot;Example of the \&quot;broadcast\&quot; function being used&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/187311712?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F970bf51c-6980-44ec-b1a2-cc7a1b556307_698x524.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Example of the &quot;broadcast&quot; function being used" title="Example of the &quot;broadcast&quot; function being used" srcset="https://substackcdn.com/image/fetch/$s_!Z8tA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F970bf51c-6980-44ec-b1a2-cc7a1b556307_698x524.png 424w, https://substackcdn.com/image/fetch/$s_!Z8tA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F970bf51c-6980-44ec-b1a2-cc7a1b556307_698x524.png 848w, https://substackcdn.com/image/fetch/$s_!Z8tA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F970bf51c-6980-44ec-b1a2-cc7a1b556307_698x524.png 1272w, https://substackcdn.com/image/fetch/$s_!Z8tA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F970bf51c-6980-44ec-b1a2-cc7a1b556307_698x524.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Example of the &#8220;broadcast&#8221; function being used</figcaption></figure></div><p>In simple terms:</p><ul><li><p>the race replay window becomes the producer, and everything else becomes optional add-ons.</p></li><li><p>Each rendered frame publishes a chunk of telemetry data, and any connected client can subscribe to it as if it were live car data.</p></li></ul><h2>Why this matters (especially if you&#8217;re a contributor)</h2><p>Since launching the project:</p><ul><li><p>160+ Pull Requests have been opened</p></li><li><p>30+ contributors have had code merged</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HsjU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c0bdc69-0312-4583-a14f-a8df4929eaa2_308x167.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HsjU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c0bdc69-0312-4583-a14f-a8df4929eaa2_308x167.png 424w, https://substackcdn.com/image/fetch/$s_!HsjU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c0bdc69-0312-4583-a14f-a8df4929eaa2_308x167.png 848w, https://substackcdn.com/image/fetch/$s_!HsjU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c0bdc69-0312-4583-a14f-a8df4929eaa2_308x167.png 1272w, https://substackcdn.com/image/fetch/$s_!HsjU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c0bdc69-0312-4583-a14f-a8df4929eaa2_308x167.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HsjU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c0bdc69-0312-4583-a14f-a8df4929eaa2_308x167.png" width="338" height="183.26623376623377" data-attrs="{&quot;src&quot;:&quot;https://substackcdn.com/image/fetch/$s_!HsjU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c0bdc69-0312-4583-a14f-a8df4929eaa2_308x167.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:183.26623376623377,&quot;width&quot;:338,&quot;resizeWidth&quot;:338,&quot;bytes&quot;:40138,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/187311712?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c0bdc69-0312-4583-a14f-a8df4929eaa2_308x167.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!HsjU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c0bdc69-0312-4583-a14f-a8df4929eaa2_308x167.png 424w, https://substackcdn.com/image/fetch/$s_!HsjU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c0bdc69-0312-4583-a14f-a8df4929eaa2_308x167.png 848w, https://substackcdn.com/image/fetch/$s_!HsjU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c0bdc69-0312-4583-a14f-a8df4929eaa2_308x167.png 1272w, https://substackcdn.com/image/fetch/$s_!HsjU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c0bdc69-0312-4583-a14f-a8df4929eaa2_308x167.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>One of the most common reasons PRs were rejected wasn&#8217;t because the submissions weren&#8217;t good enough, it was because I had to be so careful about filling up the user interface.</p><p>If a feature:</p><ul><li><p>didn&#8217;t fit cleanly into the existing UI, or</p></li><li><p>added too much visual clutter</p></li></ul><p>&#8230;it was hard to justify merging.</p><p>The Telemetry Stream Service changes that completely.</p><p>New features no longer need to live inside the main race replay window. They don&#8217;t even need to use Arcade.</p><p>You can now build:</p><ul><li><p>standalone dashboards</p></li><li><p>external charting tools (PySide6, anything else you want)</p></li><li><p>multi-monitor pit wall layouts</p></li><li><p>experimental insights without bloating the core UI</p></li></ul><p>If it can consume telemetry, it can be part of the project.</p><h2>What you can build now</h2><p>A few examples of what&#8217;s suddenly possible:</p><ul><li><p>tyre degradation or stint analysis dashboards</p></li><li><p>driver delta and gap visualisations</p></li><li><p>strategy simulators running alongside the replay</p></li><li><p>custom &#8220;second screen&#8221; pit wall tools</p></li><li><p>experimental ideas that don&#8217;t need to be merged into the core UI at all</p></li><li><p>Users can open only the tools they care about, and ignore the rest.</p></li></ul><p>No more fighting for space inside one window.</p><h2>How to try it</h2><p>The service is ready, but it&#8217;s not enabled by default yet.</p><p>Run the project with the <code>--telemetry</code> flag to enable streaming.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wuer!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2c21fc6-b462-4539-913c-738682e9081e_811x86.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wuer!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2c21fc6-b462-4539-913c-738682e9081e_811x86.png 424w, https://substackcdn.com/image/fetch/$s_!wuer!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2c21fc6-b462-4539-913c-738682e9081e_811x86.png 848w, https://substackcdn.com/image/fetch/$s_!wuer!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2c21fc6-b462-4539-913c-738682e9081e_811x86.png 1272w, https://substackcdn.com/image/fetch/$s_!wuer!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2c21fc6-b462-4539-913c-738682e9081e_811x86.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wuer!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2c21fc6-b462-4539-913c-738682e9081e_811x86.png" width="811" height="86" data-attrs="{&quot;src&quot;:&quot;https://substackcdn.com/image/fetch/$s_!wuer!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2c21fc6-b462-4539-913c-738682e9081e_811x86.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:86,&quot;width&quot;:811,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:7996,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/187311712?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe815d624-5184-4f5f-8fa2-c597c0d3b926_816x86.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!wuer!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2c21fc6-b462-4539-913c-738682e9081e_811x86.png 424w, https://substackcdn.com/image/fetch/$s_!wuer!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2c21fc6-b462-4539-913c-738682e9081e_811x86.png 848w, https://substackcdn.com/image/fetch/$s_!wuer!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2c21fc6-b462-4539-913c-738682e9081e_811x86.png 1272w, https://substackcdn.com/image/fetch/$s_!wuer!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2c21fc6-b462-4539-913c-738682e9081e_811x86.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>When enabled, a Telemetry Stream Preview window opens alongside the replay.</p><p>This just shows raw streamed data so you can understand exactly what&#8217;s being broadcast.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!i9z3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dbbd1fd-1f77-4d24-8926-ef981b397991_2624x1880.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i9z3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dbbd1fd-1f77-4d24-8926-ef981b397991_2624x1880.png 424w, https://substackcdn.com/image/fetch/$s_!i9z3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dbbd1fd-1f77-4d24-8926-ef981b397991_2624x1880.png 848w, https://substackcdn.com/image/fetch/$s_!i9z3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dbbd1fd-1f77-4d24-8926-ef981b397991_2624x1880.png 1272w, https://substackcdn.com/image/fetch/$s_!i9z3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dbbd1fd-1f77-4d24-8926-ef981b397991_2624x1880.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i9z3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dbbd1fd-1f77-4d24-8926-ef981b397991_2624x1880.png" width="1456" height="1043" data-attrs="{&quot;src&quot;:&quot;https://substackcdn.com/image/fetch/$s_!i9z3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dbbd1fd-1f77-4d24-8926-ef981b397991_2624x1880.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1043,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:985403,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/187311712?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dbbd1fd-1f77-4d24-8926-ef981b397991_2624x1880.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!i9z3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dbbd1fd-1f77-4d24-8926-ef981b397991_2624x1880.png 424w, https://substackcdn.com/image/fetch/$s_!i9z3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dbbd1fd-1f77-4d24-8926-ef981b397991_2624x1880.png 848w, https://substackcdn.com/image/fetch/$s_!i9z3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dbbd1fd-1f77-4d24-8926-ef981b397991_2624x1880.png 1272w, https://substackcdn.com/image/fetch/$s_!i9z3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dbbd1fd-1f77-4d24-8926-ef981b397991_2624x1880.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you&#8217;d like to take a look at the code for yourself, you can view the Pull Request on GitHub:</p><p><a href="https://github.com/IAmTomShaw/f1-race-replay/pull/223">https://github.com/IAmTomShaw/f1-race-replay/pull/223</a></p><div><hr></div><p>This is a huge step toward turning F1 Race Replay into something that actually feels like a real F1 pit wall.</p><p></p>]]></content:encoded></item><item><title><![CDATA[I've launched a new open source project for YOU to get involved in!]]></title><description><![CDATA[And it's built to help developers make more money!]]></description><link>https://tomshaw.substack.com/p/ive-launched-a-new-open-source-project</link><guid isPermaLink="false">https://tomshaw.substack.com/p/ive-launched-a-new-open-source-project</guid><dc:creator><![CDATA[Tom Shaw]]></dc:creator><pubDate>Sun, 01 Feb 2026 22:24:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!zBSV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb19b583-b5ee-4243-af2b-575c8e41ec35_2050x1201.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Today I&#8217;m launching a new open source project that we can work on together, and its aimed at <em><strong>solo developers and freelancers</strong></em>!</p><h1>The Problem &#129300;</h1><p>I&#8217;ve been self-employed (a freelancer and small business owner) since the day that I turned 18 (I&#8217;m 25 now), and I can say with absolute confidence that the most annoying task for me to complete on a regular basis is sending proposals. Its full of issues:</p><ul><li><p>Figuring out pricing</p></li><li><p>Figuring out how long something is going to take</p></li><li><p>Writing up the proposal to sell the service, but not sound too eager</p></li><li><p>The amount of time you actually spend on all of the above</p></li></ul><p>There have been times where I&#8217;ve spent an entire day working on a quote (proposal) to send to a customer. <strong>It felt like a day wasted.</strong></p><p>If I had been able to create the quote faster, I would have had more time to work on completing client projects, meaning I would have earned more money.</p><p>To solve a problem that I and many other freelancers face, I&#8217;ve started this project&#8230;</p><h1>Introducing Quote CLI &#128176;</h1><p><a href="https://github.com/IAmTomShaw/quote-cli">Quote CLI</a> is a simple command line-based tool used for generating project proposals and pricing quotes from client briefs.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zBSV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb19b583-b5ee-4243-af2b-575c8e41ec35_2050x1201.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zBSV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb19b583-b5ee-4243-af2b-575c8e41ec35_2050x1201.png 424w, https://substackcdn.com/image/fetch/$s_!zBSV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb19b583-b5ee-4243-af2b-575c8e41ec35_2050x1201.png 848w, https://substackcdn.com/image/fetch/$s_!zBSV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb19b583-b5ee-4243-af2b-575c8e41ec35_2050x1201.png 1272w, https://substackcdn.com/image/fetch/$s_!zBSV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb19b583-b5ee-4243-af2b-575c8e41ec35_2050x1201.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zBSV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb19b583-b5ee-4243-af2b-575c8e41ec35_2050x1201.png" width="1456" height="853" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bb19b583-b5ee-4243-af2b-575c8e41ec35_2050x1201.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:853,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:456586,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/186522820?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb19b583-b5ee-4243-af2b-575c8e41ec35_2050x1201.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zBSV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb19b583-b5ee-4243-af2b-575c8e41ec35_2050x1201.png 424w, https://substackcdn.com/image/fetch/$s_!zBSV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb19b583-b5ee-4243-af2b-575c8e41ec35_2050x1201.png 848w, https://substackcdn.com/image/fetch/$s_!zBSV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb19b583-b5ee-4243-af2b-575c8e41ec35_2050x1201.png 1272w, https://substackcdn.com/image/fetch/$s_!zBSV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb19b583-b5ee-4243-af2b-575c8e41ec35_2050x1201.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Using the &#8220;quote&#8221; command, a user can instantly open the tool on their local computer, so there&#8217;s no need to visit any specific websites.</p><p>Originally this tool was built as a web interface using Streamlit and Python (<a href="https://github.com/IAmTomShaw/quotation-agent">https://github.com/IAmTomShaw/quotation-agent</a>), however I wanted to explore building a CLI tool using TypeScript and Node.js that could be instantly run from the terminal at any time.</p><h1>How it works &#128187;</h1><p>Users can open the CLI tool at any time inside of their terminal by entering &#8220;<code>quote</code>&#8221; and pressing ENTER.</p><p>The user can create a new quote using &#8220;<code>/create</code>&#8221; and passing in the exact brief text from the client.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Filj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d97f07a-8bef-4cba-9aa3-d4979a8900d2_1037x293.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Filj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d97f07a-8bef-4cba-9aa3-d4979a8900d2_1037x293.png 424w, https://substackcdn.com/image/fetch/$s_!Filj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d97f07a-8bef-4cba-9aa3-d4979a8900d2_1037x293.png 848w, https://substackcdn.com/image/fetch/$s_!Filj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d97f07a-8bef-4cba-9aa3-d4979a8900d2_1037x293.png 1272w, https://substackcdn.com/image/fetch/$s_!Filj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d97f07a-8bef-4cba-9aa3-d4979a8900d2_1037x293.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Filj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d97f07a-8bef-4cba-9aa3-d4979a8900d2_1037x293.png" width="1037" height="293" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4d97f07a-8bef-4cba-9aa3-d4979a8900d2_1037x293.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:293,&quot;width&quot;:1037,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:128554,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/186522820?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d97f07a-8bef-4cba-9aa3-d4979a8900d2_1037x293.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Filj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d97f07a-8bef-4cba-9aa3-d4979a8900d2_1037x293.png 424w, https://substackcdn.com/image/fetch/$s_!Filj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d97f07a-8bef-4cba-9aa3-d4979a8900d2_1037x293.png 848w, https://substackcdn.com/image/fetch/$s_!Filj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d97f07a-8bef-4cba-9aa3-d4979a8900d2_1037x293.png 1272w, https://substackcdn.com/image/fetch/$s_!Filj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d97f07a-8bef-4cba-9aa3-d4979a8900d2_1037x293.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The user can discuss the quote with the chatbot and provide any additional information that the agent asks for.</p><p>When working on a quote, you can also use the &#8220;<code>/close</code>&#8221; function to generate a final quote text and save it to your local storage.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1ng0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95a577ed-c985-4f6a-a30f-ccf682906961_1034x423.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1ng0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95a577ed-c985-4f6a-a30f-ccf682906961_1034x423.png 424w, https://substackcdn.com/image/fetch/$s_!1ng0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95a577ed-c985-4f6a-a30f-ccf682906961_1034x423.png 848w, https://substackcdn.com/image/fetch/$s_!1ng0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95a577ed-c985-4f6a-a30f-ccf682906961_1034x423.png 1272w, https://substackcdn.com/image/fetch/$s_!1ng0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95a577ed-c985-4f6a-a30f-ccf682906961_1034x423.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1ng0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95a577ed-c985-4f6a-a30f-ccf682906961_1034x423.png" width="1034" height="423" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95a577ed-c985-4f6a-a30f-ccf682906961_1034x423.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:423,&quot;width&quot;:1034,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:137139,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/186522820?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95a577ed-c985-4f6a-a30f-ccf682906961_1034x423.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1ng0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95a577ed-c985-4f6a-a30f-ccf682906961_1034x423.png 424w, https://substackcdn.com/image/fetch/$s_!1ng0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95a577ed-c985-4f6a-a30f-ccf682906961_1034x423.png 848w, https://substackcdn.com/image/fetch/$s_!1ng0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95a577ed-c985-4f6a-a30f-ccf682906961_1034x423.png 1272w, https://substackcdn.com/image/fetch/$s_!1ng0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95a577ed-c985-4f6a-a30f-ccf682906961_1034x423.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The quote in this example is quite long, so I couldn&#8217;t show the full output</figcaption></figure></div><h2>Tech Stack</h2><ul><li><p><strong>Language:</strong> <a href="https://www.typescriptlang.org/">TypeScript</a> </p></li><li><p><strong>Runtime:</strong> <a href="https://nodejs.org/en">Node.js</a></p></li><li><p><strong>Agent Framework:</strong> <a href="https://github.com/github/copilot-sdk">GitHub Copilot SDK</a></p></li></ul><h3>Third-Party Integrations</h3><ul><li><p><strong><a href="https://www.notion.so">Notion</a> (via API)</strong> - for accessing the user&#8217;s service pricing information</p></li><li><p><strong><a href="https://www.exchangerate-api.com/">Exchange Rate API</a></strong> - for converting currencies automatically</p></li></ul><h1>Future ideas &#128161;</h1><p><em>These are two of my most urgent ideas for improving the project</em></p><h3>1. Making GitHub Copilot optional</h3><p>Right now, the tool works best if you already have GitHub Copilot installed.</p><p>That&#8217;s great for some users, but not ideal for those that don&#8217;t use Copilot.</p><p>I&#8217;d love to make the AI layer pluggable, so you can choose:</p><ul><li><p>your own AI provider</p></li><li><p>or a different agent framework entirely</p></li></ul><h3>2. Making integrations optional</h3><p>At the moment, the tool assumes:</p><ul><li><p>your pricing/service info lives in Notion</p></li><li><p>you want to use a specific exchange-rate API</p></li></ul><p>That doesn&#8217;t exactly make this tool useful for everyone.</p><p>Making these integrations optional (or replaceable) is key to making Quote CLI usable by as many developers as possible.</p><div><hr></div><h1>Why I&#8217;ve chosen this project next.</h1><p>I&#8217;ve had loads of great suggestions from the community:</p><p><em>Sim racing tools, generative AI projects, resume builders, even event operating systems.</em></p><p>All great ideas.</p><p>But since so many readers of this newsletter are freelancers or developers planning to start a business, this felt like the most useful place to start.</p><h1>Build it with me &#129309;</h1><p>This project isn&#8217;t <em>&#8220;done&#8221;. </em>It&#8217;s a starting point.</p><p>If you&#8217;ve ever wanted to:</p><ul><li><p>contribute to open source but didn&#8217;t know where to start</p></li><li><p>influence the direction of a real, practical tool</p></li><li><p>or just ship something that people actually use</p></li></ul><p>This is your invitation.</p><p>&#128073; Repo: <a href="https://github.com/IAmTomShaw/quote-cli">https://github.com/IAmTomShaw/quote-cli</a></p><p>&#128073; Issues, ideas &amp; PRs are all welcome.</p><p>Let&#8217;s build something genuinely useful <em><strong>together.</strong></em></p><p>(also if you could give it a Star on GitHub, that would be great &#128521;)</p>]]></content:encoded></item><item><title><![CDATA[I want to build open source projects with you.]]></title><description><![CDATA[Why building "real projects" isn't enough, and what I want to try instead.]]></description><link>https://tomshaw.substack.com/p/i-want-to-build-open-source-projects</link><guid isPermaLink="false">https://tomshaw.substack.com/p/i-want-to-build-open-source-projects</guid><dc:creator><![CDATA[Tom Shaw]]></dc:creator><pubDate>Sun, 25 Jan 2026 21:59:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!c4kc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b4b2b04-ec78-4c62-9361-11cb477d25df_2832x1834.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>If you&#8217;re a Programmer stuck with no ideas, this is the post for you!</strong></p><p>As a programmer you&#8217;ve probably heard the following advice:</p><blockquote><p><em>&#8220;Build real projects or contribute to open source&#8221;</em></p></blockquote><p>It sounds great, but in practice, it often doesn&#8217;t work. Because so many programmers build a &#8220;real&#8221; project, and then it never gets used.</p><p>Or they try to get involved in open source projects, and their PR never even gets looked at.</p><p>So I think I&#8217;ve come up with a solution, and I hope you&#8217;re here for it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!c4kc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b4b2b04-ec78-4c62-9361-11cb477d25df_2832x1834.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!c4kc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b4b2b04-ec78-4c62-9361-11cb477d25df_2832x1834.png 424w, https://substackcdn.com/image/fetch/$s_!c4kc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b4b2b04-ec78-4c62-9361-11cb477d25df_2832x1834.png 848w, https://substackcdn.com/image/fetch/$s_!c4kc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b4b2b04-ec78-4c62-9361-11cb477d25df_2832x1834.png 1272w, https://substackcdn.com/image/fetch/$s_!c4kc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b4b2b04-ec78-4c62-9361-11cb477d25df_2832x1834.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!c4kc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b4b2b04-ec78-4c62-9361-11cb477d25df_2832x1834.png" width="2832" height="1834" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4b4b2b04-ec78-4c62-9361-11cb477d25df_2832x1834.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1834,&quot;width&quot;:2832,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8593957,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/185747195?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffed75a17-68ce-48f5-8c4e-0fc1d68109ae_2832x4240.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!c4kc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b4b2b04-ec78-4c62-9361-11cb477d25df_2832x1834.png 424w, https://substackcdn.com/image/fetch/$s_!c4kc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b4b2b04-ec78-4c62-9361-11cb477d25df_2832x1834.png 848w, https://substackcdn.com/image/fetch/$s_!c4kc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b4b2b04-ec78-4c62-9361-11cb477d25df_2832x1834.png 1272w, https://substackcdn.com/image/fetch/$s_!c4kc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b4b2b04-ec78-4c62-9361-11cb477d25df_2832x1834.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The problem isn&#8217;t motivation or skill.</p><p>The problem is <strong>context.</strong></p><p>People learn best when they&#8217;re:</p><ul><li><p>working on something that actually ships into the real world</p></li><li><p>solving a problem they care about</p></li><li><p>and building with other people, not alone</p></li></ul><h2>The idea (that I hope you&#8217;ll love it) &#129504;</h2><p>Since launching <a href="https://github.com/IAmTomShaw/f1-race-replay">F1 Race Replay</a>, over 130 features and bug fixes have been contributed by developers from all over the world.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!g7mG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5601cdf4-fe44-41a2-9243-a4fb2dd2e88a_1200x600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!g7mG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5601cdf4-fe44-41a2-9243-a4fb2dd2e88a_1200x600.png 424w, https://substackcdn.com/image/fetch/$s_!g7mG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5601cdf4-fe44-41a2-9243-a4fb2dd2e88a_1200x600.png 848w, https://substackcdn.com/image/fetch/$s_!g7mG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5601cdf4-fe44-41a2-9243-a4fb2dd2e88a_1200x600.png 1272w, https://substackcdn.com/image/fetch/$s_!g7mG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5601cdf4-fe44-41a2-9243-a4fb2dd2e88a_1200x600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!g7mG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5601cdf4-fe44-41a2-9243-a4fb2dd2e88a_1200x600.png" width="1200" height="600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5601cdf4-fe44-41a2-9243-a4fb2dd2e88a_1200x600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:600,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:105008,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/185747195?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5601cdf4-fe44-41a2-9243-a4fb2dd2e88a_1200x600.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!g7mG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5601cdf4-fe44-41a2-9243-a4fb2dd2e88a_1200x600.png 424w, https://substackcdn.com/image/fetch/$s_!g7mG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5601cdf4-fe44-41a2-9243-a4fb2dd2e88a_1200x600.png 848w, https://substackcdn.com/image/fetch/$s_!g7mG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5601cdf4-fe44-41a2-9243-a4fb2dd2e88a_1200x600.png 1272w, https://substackcdn.com/image/fetch/$s_!g7mG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5601cdf4-fe44-41a2-9243-a4fb2dd2e88a_1200x600.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And the reason it worked wasn&#8217;t luck.</p><p>It worked because:</p><ul><li><p>the project did something <strong>genuinely cool</strong></p></li><li><p>it was themed around an interest people already <em><strong>cared about</strong></em></p></li><li><p>and it was small enough that contributors could make a <strong>real impact</strong></p></li></ul><p>That experience changed how I think about building.</p><h2>Let&#8217;s build something together! &#129489;&#8205;&#128187;&#128105;&#8205;&#128187;</h2><p>So I want to try something.</p><p>I want to experiment with building open-source projects together, starting from day one.</p><p>Not as a Discord full of ideas, but as small, focused projects that actually ship.</p><p>This isn&#8217;t a course. It&#8217;s not a bootcamp. And it&#8217;s not about grinding for free.</p><div class="pullquote"><p>It&#8217;s about building things that matter, with other builders.</p></div><p>Most people get involved in projects because of 2 reasons:</p><ul><li><p>The topic/mission of the project interests them</p></li><li><p>The technologies that are being used are ones that they want to work with (and show other people that they can work with them)</p></li></ul><p>I&#8217;ve built some cool projects that I&#8217;ve open-sourced before, so we could further develop some of these, or we could start from scratch?</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;c4f1d820-8f0d-473d-b11b-8283de498438&quot;,&quot;caption&quot;:&quot;2025 has been a pretty awesome year for building projects. As the year draws to a close, I thought it would be a good idea to share some of my favourite projects (big and small) that I&#8217;ve built this year.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;The coolest programming projects I've built this year&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:124420874,&quot;name&quot;:&quot;Tom Shaw&quot;,&quot;bio&quot;:&quot;Tech Content Creator and Developer &#128187; Building cool projects and sharing them with as many people as possible!&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1385654c-22e7-45ad-831e-79f738c9971e_1080x1080.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2025-12-21T23:07:57.508Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!r65i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80a7c9a4-051a-49d1-8fd9-d294d9195e6a_1920x1080.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://tomshaw.substack.com/p/the-coolest-programming-projects&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:182228996,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:9,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1721578,&quot;publication_name&quot;:&quot;build notes.&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!zNDI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4f2d96-61b9-46a0-8558-d404fa731ac8_1080x1080.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>To get this started, I&#8217;ve been thinking about a few problem spaces we could explore together.</p><p>We don&#8217;t have to work build in these categories though, this is just a starting point for ideas.</p><h2>Categories we could look at &#128161;</h2><h3>1. Motorsport &#127950;&#65039;</h3><p>Perhaps a simulation tool? Or what about a sim racing pit wall? Think F1 Race Replay, but for Sim Racing <em>(I&#8217;ve thought about this a lot, so we could definitely do this)</em></p><h3>2. Developer Tools &#128187;</h3><p>As developers, we&#8217;re perfectly positioned to build tools for other developers. We know what problems exist, and we have the ability to solve them. Whether it&#8217;s an extension for an IDE, a CLI tool, Database tool, etc, I&#8217;d love to know what we could do in this space.</p><h3>3. Small Businesses &#128717;&#65039;</h3><p>Small businesses often struggle to find tools that are affordable and can meet their needs. I think every small business needs a bit of help, especially when it comes to the technical side of things.</p><p>Even though the project would be open-source, it could be a great opportunity for you and other developers to potentially earn some money helping these businesses to install the tool and start using it.</p><h3>4. Local Software Tools &#128506;&#65039;</h3><p>Last year I had an idea which I never really actioned. It was called the <em>&#8220;Manchester API&#8221;,</em> a single API to give developers access to as much data as possible about things happening in the city that I live in.</p><p><em>Bus times, business listings,  neighbourhood info, events, etc.</em></p><p>This API would be one a single trusted source for data across the city. Meaning that developers could easily build applications on top of the API, without having to worry too much about how to get the data.</p><p>I&#8217;d love to know your thoughts on this one&#8230;</p><h2>How to get involved &#129489;&#8205;&#128187;</h2><p>You&#8217;re probably wondering, &#8220;Tom, what&#8217;s the point in this?&#8221;.</p><p>Part of what makes an open source project successful is the <strong>distribution</strong> it has and the ability to <strong>attract contributors</strong>. Without those two things (users and contributors), there isn&#8217;t much point in building an open source project.</p><p>So by doing this, my goal is to help programmers like you to get involved in projects that receive enough exposure that you can say <em>&#8220;I&#8217;m a contributor to that project that everyone knows about&#8221;.</em></p><h2>So what&#8217;s next? &#128064;</h2><p>If you&#8217;re interested in getting involved, we need some ideas. I&#8217;m going to have a brainstorm, but I&#8217;d love to know what you&#8217;d like to build too! Hopefully then we can find some synergy between our ideas and build something that we&#8217;re all excited about!</p><p><strong>What you can do to get started &#11015;&#65039;</strong></p><p><em>In the comments on this post, I want you to share one project idea you&#8217;d genuinely want to help build with other people.</em></p><p><em>Not a startup idea.</em></p><p><em>Not a massive platform.</em></p><p><em>Just a real problem you think is worth solving together.</em></p><p><em>Over the next week, I&#8217;ll look for patterns, overlap, and momentum&#8230; and then we&#8217;ll pick something and start building.</em></p><p><strong>If this works, it won&#8217;t just be another Github repo&#8230; it&#8217;ll be a shared success story for everyone involved.</strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://tomshaw.substack.com/p/i-want-to-build-open-source-projects/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://tomshaw.substack.com/p/i-want-to-build-open-source-projects/comments"><span>Leave a comment</span></a></p>]]></content:encoded></item><item><title><![CDATA[UPDATE - Building a Go Kart Telemetry System using Python and a Raspberry Pi]]></title><description><![CDATA[This was make or break for this project!]]></description><link>https://tomshaw.substack.com/p/update-building-a-go-kart-telemetry</link><guid isPermaLink="false">https://tomshaw.substack.com/p/update-building-a-go-kart-telemetry</guid><dc:creator><![CDATA[Tom Shaw]]></dc:creator><pubDate>Sun, 18 Jan 2026 20:45:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Y8SR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34d9904f-9a8b-45ff-830a-032d3de76ee2_2039x1315.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>If you didn&#8217;t know already, I&#8217;m building a Formula 1-style sensor for go karts. And this week I solved a huge problem that could have destroyed the project&#8230;</em></p><h2>A quick project recap &#127950;&#65039;</h2><p>I love going to the local karting track, I might not be the best, but it&#8217;s a fun day out.</p><p>As a tech nerd and F1 fan, I&#8217;ve always wondered what telemetry data from my driving would look like at different parts of the lap. Things like:</p><ul><li><p>Speed</p></li><li><p>Steering angle</p></li><li><p>G-force</p></li><li><p>Where I&#8217;m using the throttle and the brakes</p></li></ul><p>Having all of this information would effectively give me my own pit wall like the ones you see on TV.</p><p>A few weeks ago I made a start by messing around with an accelerometer and gyroscope module and figured out that I could use this to track how much I&#8217;m pressing down on the pedals.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Y8SR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34d9904f-9a8b-45ff-830a-032d3de76ee2_2039x1315.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Y8SR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34d9904f-9a8b-45ff-830a-032d3de76ee2_2039x1315.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Y8SR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34d9904f-9a8b-45ff-830a-032d3de76ee2_2039x1315.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Y8SR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34d9904f-9a8b-45ff-830a-032d3de76ee2_2039x1315.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Y8SR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34d9904f-9a8b-45ff-830a-032d3de76ee2_2039x1315.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Y8SR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34d9904f-9a8b-45ff-830a-032d3de76ee2_2039x1315.jpeg" width="1456" height="939" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/34d9904f-9a8b-45ff-830a-032d3de76ee2_2039x1315.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:939,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:746438,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/184983866?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34d9904f-9a8b-45ff-830a-032d3de76ee2_2039x1315.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Y8SR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34d9904f-9a8b-45ff-830a-032d3de76ee2_2039x1315.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Y8SR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34d9904f-9a8b-45ff-830a-032d3de76ee2_2039x1315.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Y8SR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34d9904f-9a8b-45ff-830a-032d3de76ee2_2039x1315.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Y8SR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34d9904f-9a8b-45ff-830a-032d3de76ee2_2039x1315.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>If you&#8217;re wondering why I&#8217;m using a gyroscope to measure brake pressure, I explained this in the original post a few weeks ago:</em></p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;291309e9-1c47-4b04-8564-0ea01c535ce0&quot;,&quot;caption&quot;:&quot;Last week I added lap telemetry charts to the F1 Race Replay project, which enables users to look at the speed, gear, throttle and braking telemetry coming off of a car as it goes around the track during a qualifying session.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Building a Go Kart Telemetry System using Python and a Raspberry Pi&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:124420874,&quot;name&quot;:&quot;Tom Shaw&quot;,&quot;bio&quot;:&quot;Tech Content Creator and Developer &#128187; Building cool projects and sharing them with as many people as possible!&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1385654c-22e7-45ad-831e-79f738c9971e_1080x1080.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2025-12-14T22:40:59.712Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!aW9L!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4409c998-0485-4c7a-9e09-fbf996b623c0_862x536.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://tomshaw.substack.com/p/building-a-go-kart-telemetry-system&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:181624093,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:6,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1721578,&quot;publication_name&quot;:&quot;build notes.&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!zNDI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4f2d96-61b9-46a0-8558-d404fa731ac8_1080x1080.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>Long story short, the sensor would need to be inside of my shoe and would measure the rotation of my foot to determine how much I&#8217;m pressing down on the throttle and brake pedals.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gqni!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f4c6169-8969-46cb-9ade-0d30014ae1c4_1080x782.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gqni!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f4c6169-8969-46cb-9ade-0d30014ae1c4_1080x782.png 424w, https://substackcdn.com/image/fetch/$s_!gqni!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f4c6169-8969-46cb-9ade-0d30014ae1c4_1080x782.png 848w, https://substackcdn.com/image/fetch/$s_!gqni!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f4c6169-8969-46cb-9ade-0d30014ae1c4_1080x782.png 1272w, https://substackcdn.com/image/fetch/$s_!gqni!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f4c6169-8969-46cb-9ade-0d30014ae1c4_1080x782.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gqni!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f4c6169-8969-46cb-9ade-0d30014ae1c4_1080x782.png" width="1080" height="782" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0f4c6169-8969-46cb-9ade-0d30014ae1c4_1080x782.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:782,&quot;width&quot;:1080,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:795443,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/184983866?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c5e40ab-3015-486e-82cb-b6bc23ea5296_1080x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gqni!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f4c6169-8969-46cb-9ade-0d30014ae1c4_1080x782.png 424w, https://substackcdn.com/image/fetch/$s_!gqni!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f4c6169-8969-46cb-9ade-0d30014ae1c4_1080x782.png 848w, https://substackcdn.com/image/fetch/$s_!gqni!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f4c6169-8969-46cb-9ade-0d30014ae1c4_1080x782.png 1272w, https://substackcdn.com/image/fetch/$s_!gqni!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f4c6169-8969-46cb-9ade-0d30014ae1c4_1080x782.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h2>The problem &#129318;&#8205;&#9794;&#65039;</h2><p>Putting sensors inside of my shoe is no problem. It might be a little uncomfortable or require some 3D printed housing, but that&#8217;s easily doable.</p><blockquote><h3>Getting the data from the sensor, connecting it with any other sensors and saving the data is the main problem.</h3></blockquote><p>Initially I thought it would be a fantastic idea to run a cable from the sensor in my shoe to a Microcontroller that I&#8217;d keep in my pocket. Of course you can see how that&#8217;s a massive safety issue&#8230;</p><p>So it sounds like we need to remove the wires. But how?</p><h2>The solution &#128161;</h2><p>I know what you&#8217;re thinking <em>&#8220;oh no, how&#8217;s he going to solve this?!? The project must be over now&#8230;&#8221;.</em> Wrong. And, in proper &#8220;Tom Shaw style&#8221; I&#8217;m going to share the solution with you!</p><p>If I&#8217;m worried about cables, there is one really useful solution that comes to mind&#8230;</p><blockquote><h3>Bluetooth &#128309;</h3></blockquote><p>I&#8217;m using Raspberry Pi Pico W&#8217;s for this project at the moment, and one of their features is that they carry built-in Bluetooth capabilities.</p><p>When the 2 Raspberry Pi Picos (a designated transmitter and a designated receiver) are turned on, the transmitter starts broadcasting its availability, with the receiver connecting to any transmitters that are available. Once connected, a start/stop button on the receiver can be used to start the data collection process which syncs the timeline and stores it onto a MicroSD card.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZSOj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23c8e56e-ba89-4384-8f73-aff32a7d2df1_1170x689.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZSOj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23c8e56e-ba89-4384-8f73-aff32a7d2df1_1170x689.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZSOj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23c8e56e-ba89-4384-8f73-aff32a7d2df1_1170x689.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZSOj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23c8e56e-ba89-4384-8f73-aff32a7d2df1_1170x689.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZSOj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23c8e56e-ba89-4384-8f73-aff32a7d2df1_1170x689.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZSOj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23c8e56e-ba89-4384-8f73-aff32a7d2df1_1170x689.jpeg" width="1170" height="689" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/23c8e56e-ba89-4384-8f73-aff32a7d2df1_1170x689.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:689,&quot;width&quot;:1170,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:432872,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/184983866?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23c8e56e-ba89-4384-8f73-aff32a7d2df1_1170x689.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZSOj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23c8e56e-ba89-4384-8f73-aff32a7d2df1_1170x689.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZSOj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23c8e56e-ba89-4384-8f73-aff32a7d2df1_1170x689.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZSOj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23c8e56e-ba89-4384-8f73-aff32a7d2df1_1170x689.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZSOj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23c8e56e-ba89-4384-8f73-aff32a7d2df1_1170x689.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Updated Project Architecture</h3><p>Some project architecture changes were needed to make this work, but I think we&#8217;ve got a pretty solid solution.</p><ul><li><p>All sensors in the kit will now transmit data to a single receiver.</p></li><li><p>The receiver will merge all of the incoming data into a single timeline and save it to a MicroSD card</p></li><li><p>There is an opportunity to add another sensor to the receiver&#8217;s hardware, which gives it dual purpose. Maybe tracking G-force?</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qbPS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f8b1d37-a3e2-466c-ac0e-c0b541b3f5d9_1080x809.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qbPS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f8b1d37-a3e2-466c-ac0e-c0b541b3f5d9_1080x809.png 424w, https://substackcdn.com/image/fetch/$s_!qbPS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f8b1d37-a3e2-466c-ac0e-c0b541b3f5d9_1080x809.png 848w, https://substackcdn.com/image/fetch/$s_!qbPS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f8b1d37-a3e2-466c-ac0e-c0b541b3f5d9_1080x809.png 1272w, https://substackcdn.com/image/fetch/$s_!qbPS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f8b1d37-a3e2-466c-ac0e-c0b541b3f5d9_1080x809.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qbPS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f8b1d37-a3e2-466c-ac0e-c0b541b3f5d9_1080x809.png" width="1080" height="809" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f8b1d37-a3e2-466c-ac0e-c0b541b3f5d9_1080x809.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:809,&quot;width&quot;:1080,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:884782,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/184983866?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff491d3e6-c155-4612-ac79-d25678ead8f7_1080x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qbPS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f8b1d37-a3e2-466c-ac0e-c0b541b3f5d9_1080x809.png 424w, https://substackcdn.com/image/fetch/$s_!qbPS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f8b1d37-a3e2-466c-ac0e-c0b541b3f5d9_1080x809.png 848w, https://substackcdn.com/image/fetch/$s_!qbPS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f8b1d37-a3e2-466c-ac0e-c0b541b3f5d9_1080x809.png 1272w, https://substackcdn.com/image/fetch/$s_!qbPS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f8b1d37-a3e2-466c-ac0e-c0b541b3f5d9_1080x809.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Testing the Bluetooth telemetry</h3><p><em>I&#8217;ve created this live telemetry viewer so that I can see the data coming off of each of the sensors in the kit.</em></p><p>The bottom chart displays the data coming from a sensor that is using a Bluetooth connection to communicate with the receiver.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3VVW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdd45157-2258-4326-86a2-5b0bc5979e92_1513x897.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3VVW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdd45157-2258-4326-86a2-5b0bc5979e92_1513x897.png 424w, https://substackcdn.com/image/fetch/$s_!3VVW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdd45157-2258-4326-86a2-5b0bc5979e92_1513x897.png 848w, https://substackcdn.com/image/fetch/$s_!3VVW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdd45157-2258-4326-86a2-5b0bc5979e92_1513x897.png 1272w, https://substackcdn.com/image/fetch/$s_!3VVW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdd45157-2258-4326-86a2-5b0bc5979e92_1513x897.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3VVW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdd45157-2258-4326-86a2-5b0bc5979e92_1513x897.png" width="1456" height="863" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fdd45157-2258-4326-86a2-5b0bc5979e92_1513x897.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:863,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:269449,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/184983866?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdd45157-2258-4326-86a2-5b0bc5979e92_1513x897.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3VVW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdd45157-2258-4326-86a2-5b0bc5979e92_1513x897.png 424w, https://substackcdn.com/image/fetch/$s_!3VVW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdd45157-2258-4326-86a2-5b0bc5979e92_1513x897.png 848w, https://substackcdn.com/image/fetch/$s_!3VVW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdd45157-2258-4326-86a2-5b0bc5979e92_1513x897.png 1272w, https://substackcdn.com/image/fetch/$s_!3VVW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdd45157-2258-4326-86a2-5b0bc5979e92_1513x897.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>The chart here shows some data that has been recorded by moving and rotating the sensor. For demo purposes, the orientation data and the acceleration data have been combined, which is why you might be wondering why the graph is titled &#8220;Acceleration&#8221;.</em></p><h2>Remaining Issues &#128203;</h2><p>Of course there are some issues with using Bluetooth as a method of transferring live telemetry data. Here are two that I am experiencing at the moment:</p><ul><li><p>Latency is causing some telemetry data to be out of sync by up to 100 milliseconds</p></li><li><p>Minor drops in connection sometimes mean that data is patchy</p></li></ul><p>These two issues may not be the end of the world, especially as this is a hobby project, but it would be nice to get them resolved.</p><p>The next focus is fixing a bigger issue&#8230;</p><h3>I&#8217;m using the wrong sensors &#10060;</h3><p>Since posting a video about this Bluetooth addition to the project, I&#8217;ve received feedback from some motorsport engineering experts <em>(keeping names secret as I have not asked for permission to name them)</em> who have informed me that the sensor I&#8217;m using isn&#8217;t good enough for the job.</p><p>They&#8217;ve suggested a better sensor module that can easily be put into the project, but I&#8217;ll have to test it before I talk about it in a newsletter post.</p><div><hr></div><p>The analytics on Substack are the only way I know if you&#8217;ve enjoyed reading a specific post. </p><p>So if you want to see more like this, drop a like, comment and share it with a friend!</p><p>See you next week!</p>]]></content:encoded></item><item><title><![CDATA[I built an Open-Source Net Worth Manager 📈]]></title><description><![CDATA[Why I built an offline-first finance tracker, open-sourced it, and what it says about how I want to build in 2026]]></description><link>https://tomshaw.substack.com/p/i-built-an-open-source-net-worth</link><guid isPermaLink="false">https://tomshaw.substack.com/p/i-built-an-open-source-net-worth</guid><dc:creator><![CDATA[Tom Shaw]]></dc:creator><pubDate>Sun, 11 Jan 2026 14:24:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Dhdp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc91d2fb-544a-4c6f-97d7-2cfd6a698db4_3588x2066.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;ve been working towards my goal of <em><strong>becoming a millionaire</strong></em> for a while, and over the past few years I&#8217;ve been making really great progress. </p><h2>Why a spreadsheet doesn&#8217;t cut it anymore &#128683;</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nmFk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb43d48f-2e66-4557-b167-620c8fb125b1_570x246.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nmFk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb43d48f-2e66-4557-b167-620c8fb125b1_570x246.png 424w, https://substackcdn.com/image/fetch/$s_!nmFk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb43d48f-2e66-4557-b167-620c8fb125b1_570x246.png 848w, https://substackcdn.com/image/fetch/$s_!nmFk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb43d48f-2e66-4557-b167-620c8fb125b1_570x246.png 1272w, https://substackcdn.com/image/fetch/$s_!nmFk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb43d48f-2e66-4557-b167-620c8fb125b1_570x246.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nmFk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb43d48f-2e66-4557-b167-620c8fb125b1_570x246.png" width="570" height="246" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bb43d48f-2e66-4557-b167-620c8fb125b1_570x246.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:246,&quot;width&quot;:570,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:28314,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/184157430?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb43d48f-2e66-4557-b167-620c8fb125b1_570x246.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!nmFk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb43d48f-2e66-4557-b167-620c8fb125b1_570x246.png 424w, https://substackcdn.com/image/fetch/$s_!nmFk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb43d48f-2e66-4557-b167-620c8fb125b1_570x246.png 848w, https://substackcdn.com/image/fetch/$s_!nmFk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb43d48f-2e66-4557-b167-620c8fb125b1_570x246.png 1272w, https://substackcdn.com/image/fetch/$s_!nmFk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb43d48f-2e66-4557-b167-620c8fb125b1_570x246.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">(Example finances, not my actual numbers)</figcaption></figure></div><p>I&#8217;ve been doing my best to keep track of things using spreadsheets, but the problem is that they get bulky and unorganised really quickly. If you try to keep it simple, you don&#8217;t get much functionality, and if you want detail, it breaks easily&#8230;</p><blockquote><h4><em>Duplicated rows. Broken formulas. The fear of accidentally deleting things. Ugh!!!</em></h4></blockquote><p>Spreadsheets work fine at the beginning, but as I&#8217;ve started to invest in different things, put my money to work and have the desire to keep track of it over time, a simple spreadsheet just isn&#8217;t cutting it anymore.</p><p>2025 was a big year for me, and I want 2026 to be even bigger! So it&#8217;s important that I have something to help me keep track of my finances.</p><h2>I built something for myself (and open-sourced it) &#128187;</h2><p>I wanted a single place where I could see everything, bank accounts, investments, assets, loans, without having to worry about whether I&#8217;d accidentally broken a spreadsheet formula six months ago.</p><p>Once I had a rough version working, I realised something interesting:</p><blockquote><p><em><strong>&#8220;this isn&#8217;t just useful to me&#8221;</strong></em></p></blockquote><p>So this week, I cleaned it up and launched it as an open-source project on GitHub: <a href="https://github.com/IAmTomShaw/personal-finance-tracker">Personal Finance Tracker</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Dhdp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc91d2fb-544a-4c6f-97d7-2cfd6a698db4_3588x2066.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Dhdp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc91d2fb-544a-4c6f-97d7-2cfd6a698db4_3588x2066.png 424w, https://substackcdn.com/image/fetch/$s_!Dhdp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc91d2fb-544a-4c6f-97d7-2cfd6a698db4_3588x2066.png 848w, https://substackcdn.com/image/fetch/$s_!Dhdp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc91d2fb-544a-4c6f-97d7-2cfd6a698db4_3588x2066.png 1272w, https://substackcdn.com/image/fetch/$s_!Dhdp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc91d2fb-544a-4c6f-97d7-2cfd6a698db4_3588x2066.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Dhdp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc91d2fb-544a-4c6f-97d7-2cfd6a698db4_3588x2066.png" width="1456" height="838" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cc91d2fb-544a-4c6f-97d7-2cfd6a698db4_3588x2066.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:838,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:602566,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/184157430?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc91d2fb-544a-4c6f-97d7-2cfd6a698db4_3588x2066.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Dhdp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc91d2fb-544a-4c6f-97d7-2cfd6a698db4_3588x2066.png 424w, https://substackcdn.com/image/fetch/$s_!Dhdp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc91d2fb-544a-4c6f-97d7-2cfd6a698db4_3588x2066.png 848w, https://substackcdn.com/image/fetch/$s_!Dhdp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc91d2fb-544a-4c6f-97d7-2cfd6a698db4_3588x2066.png 1272w, https://substackcdn.com/image/fetch/$s_!Dhdp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc91d2fb-544a-4c6f-97d7-2cfd6a698db4_3588x2066.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>(image above doesn&#8217;t contain my personal finances btw &#128521;)</p><p>Honestly, it&#8217;s a simple web app for recording balances over time and visualising how your net worth changes. No budgeting gimmicks, no predictions&#8230; just a clear picture of where things stand.</p><p>Let me share with you how I built it.</p><h2>Tech Stack &#128187;</h2><ul><li><p><strong>Frontend &amp; Backend:</strong> <a href="https://nextjs.org/">Next.js</a></p></li><li><p><strong>Authentication:</strong> <a href="https://auth0.com/">Auth0</a></p></li><li><p><strong>Database (if Cloud Sync is being used):</strong> <a href="https://www.mongodb.com/">MongoDB</a> </p></li><li><p><strong>Hosting:</strong> <a href="https://aws.amazon.com/">Amazon Web Services</a> (but can be hosted with any Next.js compatible host or hosted locally) </p></li></ul><h2>Features &#128640;</h2><ul><li><p><strong>Personal Balance Sheet:</strong> Get an instant snapshot of what your finances look like.</p></li><li><p><strong>Manage Accounts:</strong> Create and manage multiple accounts (bank accounts, stock accounts, credit cards, etc).</p></li><li><p><strong>Record Balances:</strong> Quickly record periodic balances for accounts and assets.</p></li><li><p><strong>Net Worth &amp; Charts:</strong> Visualise net worth over time with interactive charts going back weeks, months and years.</p></li><li><p><strong>Offline First:</strong> Local-only mode with optional cloud sync via the toggle.</p></li><li><p><strong>Download Backups:</strong> You can download a copy of your data at any time.</p></li></ul><h2>How I&#8217;ve built offline-mode &#128064;</h2><p><em>Offline mode is a weird thing to build into a web app in 2026.</em></p><p>Most people would just assume everything lives in a database somewhere and move on.</p><p>But whenever I use any kind of personal finance tool, my first thought is always the same:</p><blockquote><h4><em>&#8220;Where is my data actually going?&#8221;</em></h4></blockquote><p>Even if I trust the company, I don&#8217;t necessarily trust the outcomes. Breaches happen, mistakes happen, and financial data is one of those things you can&#8217;t really take back once it&#8217;s out there.</p><p>So for this project, I wanted the default experience to be the safest one.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PmJB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F016be512-a5ec-4eb9-8031-a8129b39e791_742x190.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PmJB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F016be512-a5ec-4eb9-8031-a8129b39e791_742x190.png 424w, https://substackcdn.com/image/fetch/$s_!PmJB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F016be512-a5ec-4eb9-8031-a8129b39e791_742x190.png 848w, https://substackcdn.com/image/fetch/$s_!PmJB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F016be512-a5ec-4eb9-8031-a8129b39e791_742x190.png 1272w, https://substackcdn.com/image/fetch/$s_!PmJB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F016be512-a5ec-4eb9-8031-a8129b39e791_742x190.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PmJB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F016be512-a5ec-4eb9-8031-a8129b39e791_742x190.png" width="742" height="190" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/016be512-a5ec-4eb9-8031-a8129b39e791_742x190.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:190,&quot;width&quot;:742,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:30909,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/184157430?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F016be512-a5ec-4eb9-8031-a8129b39e791_742x190.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!PmJB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F016be512-a5ec-4eb9-8031-a8129b39e791_742x190.png 424w, https://substackcdn.com/image/fetch/$s_!PmJB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F016be512-a5ec-4eb9-8031-a8129b39e791_742x190.png 848w, https://substackcdn.com/image/fetch/$s_!PmJB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F016be512-a5ec-4eb9-8031-a8129b39e791_742x190.png 1272w, https://substackcdn.com/image/fetch/$s_!PmJB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F016be512-a5ec-4eb9-8031-a8129b39e791_742x190.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>When you open the website for the first time, no financial data is sent to a server. No balances, no assets, no net worth history. All of your financial data is stored locally in the browser using local storage, and it never leaves your machine unless you explicitly opt into cloud sync.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0nNF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3d81be0-7191-4ac4-b74a-1fe90057cfc5_912x528.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0nNF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3d81be0-7191-4ac4-b74a-1fe90057cfc5_912x528.png 424w, https://substackcdn.com/image/fetch/$s_!0nNF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3d81be0-7191-4ac4-b74a-1fe90057cfc5_912x528.png 848w, https://substackcdn.com/image/fetch/$s_!0nNF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3d81be0-7191-4ac4-b74a-1fe90057cfc5_912x528.png 1272w, https://substackcdn.com/image/fetch/$s_!0nNF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3d81be0-7191-4ac4-b74a-1fe90057cfc5_912x528.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0nNF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3d81be0-7191-4ac4-b74a-1fe90057cfc5_912x528.png" width="912" height="528" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b3d81be0-7191-4ac4-b74a-1fe90057cfc5_912x528.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:528,&quot;width&quot;:912,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:70277,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/184157430?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3d81be0-7191-4ac4-b74a-1fe90057cfc5_912x528.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0nNF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3d81be0-7191-4ac4-b74a-1fe90057cfc5_912x528.png 424w, https://substackcdn.com/image/fetch/$s_!0nNF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3d81be0-7191-4ac4-b74a-1fe90057cfc5_912x528.png 848w, https://substackcdn.com/image/fetch/$s_!0nNF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3d81be0-7191-4ac4-b74a-1fe90057cfc5_912x528.png 1272w, https://substackcdn.com/image/fetch/$s_!0nNF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3d81be0-7191-4ac4-b74a-1fe90057cfc5_912x528.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Under the hood, the app&#8217;s data model is intentionally small. Right now, all finance data fits into just two interfaces, which makes it easy to store, version, and export without any hidden complexity. That simplicity is what makes offline-first possible without the app becoming fragile.</p><p>Cloud sync is there if you want it, and only if you want it. When enabled, balances are associated with your account and stored remotely so you can access them across devices. But offline mode isn&#8217;t a &#8220;limited&#8221; version of the app; it&#8217;s the baseline.</p><h2>The community is already getting involved! &#10084;&#65039;</h2><p>Since launching, two other developers have started building features for the project to help kickstart its growth and turn it into a fully comprehensive personal finance tool!</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2pUv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65e238dd-1265-400a-be58-4532cf3c48e5_573x123.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2pUv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65e238dd-1265-400a-be58-4532cf3c48e5_573x123.png 424w, https://substackcdn.com/image/fetch/$s_!2pUv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65e238dd-1265-400a-be58-4532cf3c48e5_573x123.png 848w, https://substackcdn.com/image/fetch/$s_!2pUv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65e238dd-1265-400a-be58-4532cf3c48e5_573x123.png 1272w, https://substackcdn.com/image/fetch/$s_!2pUv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65e238dd-1265-400a-be58-4532cf3c48e5_573x123.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2pUv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65e238dd-1265-400a-be58-4532cf3c48e5_573x123.png" width="728" height="156.27225130890054" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/65e238dd-1265-400a-be58-4532cf3c48e5_573x123.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:123,&quot;width&quot;:573,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:23410,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/184157430?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65e238dd-1265-400a-be58-4532cf3c48e5_573x123.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2pUv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65e238dd-1265-400a-be58-4532cf3c48e5_573x123.png 424w, https://substackcdn.com/image/fetch/$s_!2pUv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65e238dd-1265-400a-be58-4532cf3c48e5_573x123.png 848w, https://substackcdn.com/image/fetch/$s_!2pUv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65e238dd-1265-400a-be58-4532cf3c48e5_573x123.png 1272w, https://substackcdn.com/image/fetch/$s_!2pUv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65e238dd-1265-400a-be58-4532cf3c48e5_573x123.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>With one PR already being accepted!</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1DGI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F688e8a37-55a9-445e-bd1a-ad2f3c73326b_397x57.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1DGI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F688e8a37-55a9-445e-bd1a-ad2f3c73326b_397x57.png 424w, https://substackcdn.com/image/fetch/$s_!1DGI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F688e8a37-55a9-445e-bd1a-ad2f3c73326b_397x57.png 848w, https://substackcdn.com/image/fetch/$s_!1DGI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F688e8a37-55a9-445e-bd1a-ad2f3c73326b_397x57.png 1272w, https://substackcdn.com/image/fetch/$s_!1DGI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F688e8a37-55a9-445e-bd1a-ad2f3c73326b_397x57.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1DGI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F688e8a37-55a9-445e-bd1a-ad2f3c73326b_397x57.png" width="728" height="104.52392947103274" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/688e8a37-55a9-445e-bd1a-ad2f3c73326b_397x57.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:57,&quot;width&quot;:397,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:12050,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/184157430?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F688e8a37-55a9-445e-bd1a-ad2f3c73326b_397x57.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1DGI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F688e8a37-55a9-445e-bd1a-ad2f3c73326b_397x57.png 424w, https://substackcdn.com/image/fetch/$s_!1DGI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F688e8a37-55a9-445e-bd1a-ad2f3c73326b_397x57.png 848w, https://substackcdn.com/image/fetch/$s_!1DGI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F688e8a37-55a9-445e-bd1a-ad2f3c73326b_397x57.png 1272w, https://substackcdn.com/image/fetch/$s_!1DGI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F688e8a37-55a9-445e-bd1a-ad2f3c73326b_397x57.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>There&#8217;s something really special about starting a new open-source project and seeing people contribute to it. The project is small enough that every developer can easily get a full picture of the project and instantly think &#8220;I know what&#8217;s missing&#8221; and then get to work building it!</p><p>These kind of open-source projects are exactly what I wish I&#8217;d had access to earlier in my career. Frankly, the big open-source projects scare me, so I never even thought about contributing to them. But this, a real tool in its infancy, that&#8217;s something I&#8217;d have loved to have been a part of.</p><div><hr></div><p>If you&#8217;ve ever wanted to contribute to something practical, or just see how a project evolves in public, here&#8217;s a list of some of my favourite projects that I&#8217;ve open-sourced in the past few months that I&#8217;d love to see more people get involved in:</p><p><strong>F1 Race Replay:</strong> <a href="https://github.com/IAmTomShaw/f1-race-replay">https://github.com/IAmTomShaw/f1-race-replay</a> &#127950;&#65039;</p><p><strong>Personal Finance Tracker: </strong><a href="https://github.com/IAmTomShaw/personal-finance-tracker">https://github.com/IAmTomShaw/personal-finance-tracker</a> &#128176;</p><p><strong>Stock Market Tracker Agent (via SMS): </strong><a href="https://github.com/IAmTomShaw/stock-tracker-agent">https://github.com/IAmTomShaw/stock-tracker-agent</a> &#129302;</p>]]></content:encoded></item><item><title><![CDATA[The CLI wasn't enough, so I built a GUI]]></title><description><![CDATA[Users prefer something they can see... not typing into a terminal.]]></description><link>https://tomshaw.substack.com/p/the-cli-wasnt-enough-so-i-built-a</link><guid isPermaLink="false">https://tomshaw.substack.com/p/the-cli-wasnt-enough-so-i-built-a</guid><dc:creator><![CDATA[Tom Shaw]]></dc:creator><pubDate>Sun, 04 Jan 2026 11:30:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!iuSK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff64bacd-64fe-4a97-a8d4-b8561d2528c1_1112x840.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This was one of those weeks where I didn&#8217;t really build anything new. No groundbreaking project or innovative idea that is going to change the world. But I did solve a problem that a lot of people have mentioned to me over the past few weeks.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6ZFH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e47ec18-441c-47b6-bec8-82fac2080c75_1910x1191.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6ZFH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e47ec18-441c-47b6-bec8-82fac2080c75_1910x1191.png 424w, https://substackcdn.com/image/fetch/$s_!6ZFH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e47ec18-441c-47b6-bec8-82fac2080c75_1910x1191.png 848w, https://substackcdn.com/image/fetch/$s_!6ZFH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e47ec18-441c-47b6-bec8-82fac2080c75_1910x1191.png 1272w, https://substackcdn.com/image/fetch/$s_!6ZFH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e47ec18-441c-47b6-bec8-82fac2080c75_1910x1191.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6ZFH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e47ec18-441c-47b6-bec8-82fac2080c75_1910x1191.png" width="1456" height="908" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8e47ec18-441c-47b6-bec8-82fac2080c75_1910x1191.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:908,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:258065,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/182898202?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e47ec18-441c-47b6-bec8-82fac2080c75_1910x1191.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6ZFH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e47ec18-441c-47b6-bec8-82fac2080c75_1910x1191.png 424w, https://substackcdn.com/image/fetch/$s_!6ZFH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e47ec18-441c-47b6-bec8-82fac2080c75_1910x1191.png 848w, https://substackcdn.com/image/fetch/$s_!6ZFH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e47ec18-441c-47b6-bec8-82fac2080c75_1910x1191.png 1272w, https://substackcdn.com/image/fetch/$s_!6ZFH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e47ec18-441c-47b6-bec8-82fac2080c75_1910x1191.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>My F1 Race Replay project has received a lot of positive feedback and recommendations over the past few weeks.</p><blockquote><h3>One thing that always keeps cropping up is adding a GUI menu to the project.</h3></blockquote><p>Before writing this, users could select a specific race weekend and insight type by specifying it when running the python project in the command line.</p><p>For example:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JTdS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59dcac43-7cb9-426f-a8ae-05d772325bc9_422x38.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JTdS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59dcac43-7cb9-426f-a8ae-05d772325bc9_422x38.png 424w, https://substackcdn.com/image/fetch/$s_!JTdS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59dcac43-7cb9-426f-a8ae-05d772325bc9_422x38.png 848w, https://substackcdn.com/image/fetch/$s_!JTdS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59dcac43-7cb9-426f-a8ae-05d772325bc9_422x38.png 1272w, https://substackcdn.com/image/fetch/$s_!JTdS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59dcac43-7cb9-426f-a8ae-05d772325bc9_422x38.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JTdS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59dcac43-7cb9-426f-a8ae-05d772325bc9_422x38.png" width="728" height="65.55450236966824" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/59dcac43-7cb9-426f-a8ae-05d772325bc9_422x38.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:38,&quot;width&quot;:422,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:7718,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/182898202?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59dcac43-7cb9-426f-a8ae-05d772325bc9_422x38.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JTdS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59dcac43-7cb9-426f-a8ae-05d772325bc9_422x38.png 424w, https://substackcdn.com/image/fetch/$s_!JTdS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59dcac43-7cb9-426f-a8ae-05d772325bc9_422x38.png 848w, https://substackcdn.com/image/fetch/$s_!JTdS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59dcac43-7cb9-426f-a8ae-05d772325bc9_422x38.png 1272w, https://substackcdn.com/image/fetch/$s_!JTdS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59dcac43-7cb9-426f-a8ae-05d772325bc9_422x38.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><p>This would open the qualifying insight and display data from the 2025 British GP (round 12 of the 2025 season). Its a quick way to run the project, but only if you know the round number of the race weekend you want to view. Without it, you had to run another command:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0JWj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23d2f5e6-24b0-4b52-9b8e-8d3e39a16d06_932x613.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0JWj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23d2f5e6-24b0-4b52-9b8e-8d3e39a16d06_932x613.png 424w, https://substackcdn.com/image/fetch/$s_!0JWj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23d2f5e6-24b0-4b52-9b8e-8d3e39a16d06_932x613.png 848w, https://substackcdn.com/image/fetch/$s_!0JWj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23d2f5e6-24b0-4b52-9b8e-8d3e39a16d06_932x613.png 1272w, https://substackcdn.com/image/fetch/$s_!0JWj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23d2f5e6-24b0-4b52-9b8e-8d3e39a16d06_932x613.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0JWj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23d2f5e6-24b0-4b52-9b8e-8d3e39a16d06_932x613.png" width="932" height="613" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/23d2f5e6-24b0-4b52-9b8e-8d3e39a16d06_932x613.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:613,&quot;width&quot;:932,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:109621,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/182898202?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23d2f5e6-24b0-4b52-9b8e-8d3e39a16d06_932x613.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0JWj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23d2f5e6-24b0-4b52-9b8e-8d3e39a16d06_932x613.png 424w, https://substackcdn.com/image/fetch/$s_!0JWj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23d2f5e6-24b0-4b52-9b8e-8d3e39a16d06_932x613.png 848w, https://substackcdn.com/image/fetch/$s_!0JWj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23d2f5e6-24b0-4b52-9b8e-8d3e39a16d06_932x613.png 1272w, https://substackcdn.com/image/fetch/$s_!0JWj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23d2f5e6-24b0-4b52-9b8e-8d3e39a16d06_932x613.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>So that&#8217;s 2 commands you have to run just to be able to view the data you want. Its slow and, if you&#8217;re new to Python, its also a bit complicated. So I decided it was time to build a menu that users could visually navigate.</p><h2>Existing PRs from the community</h2><p>The F1 Race Replay community is growing really strong. Over 18 contributors have had their code pushed to the main branch since launching the project, and there have been over 100 Pull Requests containing new features. A few of those PRs contain pretty awesome attempts at building a menu interface for selecting race weekends.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jQf2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3826a99-1b67-48bc-b8e6-d5da596ea8b0_1239x423.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jQf2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3826a99-1b67-48bc-b8e6-d5da596ea8b0_1239x423.png 424w, https://substackcdn.com/image/fetch/$s_!jQf2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3826a99-1b67-48bc-b8e6-d5da596ea8b0_1239x423.png 848w, https://substackcdn.com/image/fetch/$s_!jQf2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3826a99-1b67-48bc-b8e6-d5da596ea8b0_1239x423.png 1272w, https://substackcdn.com/image/fetch/$s_!jQf2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3826a99-1b67-48bc-b8e6-d5da596ea8b0_1239x423.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jQf2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3826a99-1b67-48bc-b8e6-d5da596ea8b0_1239x423.png" width="1239" height="423" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d3826a99-1b67-48bc-b8e6-d5da596ea8b0_1239x423.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:423,&quot;width&quot;:1239,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:74515,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/182898202?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3826a99-1b67-48bc-b8e6-d5da596ea8b0_1239x423.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!jQf2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3826a99-1b67-48bc-b8e6-d5da596ea8b0_1239x423.png 424w, https://substackcdn.com/image/fetch/$s_!jQf2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3826a99-1b67-48bc-b8e6-d5da596ea8b0_1239x423.png 848w, https://substackcdn.com/image/fetch/$s_!jQf2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3826a99-1b67-48bc-b8e6-d5da596ea8b0_1239x423.png 1272w, https://substackcdn.com/image/fetch/$s_!jQf2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3826a99-1b67-48bc-b8e6-d5da596ea8b0_1239x423.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>So you might be thinking:</p><blockquote><h4><em>&#8220;Tom, why aren&#8217;t you using any of those?&#8221;</em> - you, probably</h4></blockquote><p>Unfortunately, it comes down to how those interfaces were built. A few used the GUI features of the Acrade package, which although lightweight for a simple menu system, aren&#8217;t that great when you&#8217;re trying to build an interface that needs to be able create the kind of user and developer experience that I want for this project.</p><p>Another developer also built a GUI menu using Electron, which (as they mentioned in the PR) is a great opportunity to get Web Developers involved in the project. However, this introduced complexity when creating a seamless transition between the menu and the menu and the Arcade interface.</p><h2>The Python GUI Dilemma</h2><p>Building an interface using Python is made possible using a variety of different frameworks and libraries, but choosing the right one depends on your exact requirements and the future of your project.</p><p>Here were my options primary options:</p><p><strong>Dear PyGui</strong></p><p>Pros: Very fast to iterate, minimal boilerplate, great for tool-style menus and controls.</p><p>Cons: UI leans more &#8220;developer tool&#8221; than native app without extra styling.</p><p><strong>Toga</strong></p><p>Pros: Aims for true native UI across platforms, clean high-level API.</p><p>Cons: Smaller ecosystem, slower iteration, more risk of hitting framework limitations.</p><p><strong>Dear ImGui</strong></p><p>Pros: Perfect for in-app tools and overlays, extremely responsive, pairs well with render loops.</p><p>Cons: Not native UI, more setup, can feel &#8220;game dev&#8221; if not styled carefully.</p><p><strong>PySide6 (Qt)</strong></p><p>Pros: Most polished and scalable option, huge ecosystem, professional desktop-app feel.</p><p>Cons: More boilerplate, steeper learning curve, heavier integration work.</p><p></p><h3>My choice: PySide6</h3><p>Based on my research findings, I&#8217;ve chosen <a href="https://pypi.org/project/PySide6/">PySide6</a> as the framework that we&#8217;re going to use to build and grow the menu interface for the project.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iuSK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff64bacd-64fe-4a97-a8d4-b8561d2528c1_1112x840.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iuSK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff64bacd-64fe-4a97-a8d4-b8561d2528c1_1112x840.png 424w, https://substackcdn.com/image/fetch/$s_!iuSK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff64bacd-64fe-4a97-a8d4-b8561d2528c1_1112x840.png 848w, https://substackcdn.com/image/fetch/$s_!iuSK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff64bacd-64fe-4a97-a8d4-b8561d2528c1_1112x840.png 1272w, https://substackcdn.com/image/fetch/$s_!iuSK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff64bacd-64fe-4a97-a8d4-b8561d2528c1_1112x840.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iuSK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff64bacd-64fe-4a97-a8d4-b8561d2528c1_1112x840.png" width="1112" height="840" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ff64bacd-64fe-4a97-a8d4-b8561d2528c1_1112x840.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:840,&quot;width&quot;:1112,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:212739,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/182898202?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff64bacd-64fe-4a97-a8d4-b8561d2528c1_1112x840.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!iuSK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff64bacd-64fe-4a97-a8d4-b8561d2528c1_1112x840.png 424w, https://substackcdn.com/image/fetch/$s_!iuSK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff64bacd-64fe-4a97-a8d4-b8561d2528c1_1112x840.png 848w, https://substackcdn.com/image/fetch/$s_!iuSK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff64bacd-64fe-4a97-a8d4-b8561d2528c1_1112x840.png 1272w, https://substackcdn.com/image/fetch/$s_!iuSK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff64bacd-64fe-4a97-a8d4-b8561d2528c1_1112x840.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>PySide6 is a bit complicated to work with compared to tools like <a href="https://github.com/hoffstadt/DearPyGui">Dear PyGui</a> or building an interface using HTML and CSS, however, it does offer much more flexibility once you actually figure out how to implement it.</p><p>If you&#8217;re interested in viewing exactly how I&#8217;ve built the GUI using PySide6, you can view the code for it right here: <a href="https://github.com/IAmTomShaw/f1-race-replay/blob/main/src/gui/race_selection.py">https://github.com/IAmTomShaw/f1-race-replay/blob/main/src/gui/race_selection.py</a></p><p>So now users can start the project by using the &#8220;&#8212;gui&#8221; argument to see the new menu and select their chosen year and round from the interface.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sQCz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14575229-1304-4b33-8526-7e56bde77c20_270x42.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sQCz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14575229-1304-4b33-8526-7e56bde77c20_270x42.png 424w, https://substackcdn.com/image/fetch/$s_!sQCz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14575229-1304-4b33-8526-7e56bde77c20_270x42.png 848w, https://substackcdn.com/image/fetch/$s_!sQCz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14575229-1304-4b33-8526-7e56bde77c20_270x42.png 1272w, https://substackcdn.com/image/fetch/$s_!sQCz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14575229-1304-4b33-8526-7e56bde77c20_270x42.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sQCz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14575229-1304-4b33-8526-7e56bde77c20_270x42.png" width="728" height="113.24444444444444" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/14575229-1304-4b33-8526-7e56bde77c20_270x42.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:42,&quot;width&quot;:270,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:6637,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/182898202?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14575229-1304-4b33-8526-7e56bde77c20_270x42.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!sQCz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14575229-1304-4b33-8526-7e56bde77c20_270x42.png 424w, https://substackcdn.com/image/fetch/$s_!sQCz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14575229-1304-4b33-8526-7e56bde77c20_270x42.png 848w, https://substackcdn.com/image/fetch/$s_!sQCz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14575229-1304-4b33-8526-7e56bde77c20_270x42.png 1272w, https://substackcdn.com/image/fetch/$s_!sQCz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14575229-1304-4b33-8526-7e56bde77c20_270x42.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div><hr></div><p>On another note, I&#8217;m curious.</p><p>The F1 Race Replay project has received a lot of attention, but I want to make sure I&#8217;m still putting out the right amount of content that is related to other projects and topics.</p><p>If you can, please can you answer the below poll with your preferences? :)</p><div class="poll-embed" data-attrs="{&quot;id&quot;:427499}" data-component-name="PollToDOM"></div><p></p>]]></content:encoded></item><item><title><![CDATA[The coolest programming projects I've built this year]]></title><description><![CDATA[My 2025 coding roundup]]></description><link>https://tomshaw.substack.com/p/the-coolest-programming-projects</link><guid isPermaLink="false">https://tomshaw.substack.com/p/the-coolest-programming-projects</guid><dc:creator><![CDATA[Tom Shaw]]></dc:creator><pubDate>Sun, 21 Dec 2025 23:07:57 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!r65i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80a7c9a4-051a-49d1-8fd9-d294d9195e6a_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>2025 has been a pretty awesome year for building projects. As the year draws to a close, I thought it would be a good idea to share some of my favourite projects (big and small) that I&#8217;ve built this year.</p><h2>Email Inbox Labeller &#128231;</h2><p>My emails can get pretty hectic sometimes. A few months ago I decided I&#8217;d had enough of opening my inbox every morning and going through the same process of categorising emails from new contacts into their various categories (&#8220;new business&#8221;, &#8220;admin&#8221;, &#8220;invoices&#8221;, etc).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EXSx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46f0e462-6dc2-4f76-815d-0ad025bd2599_439x642.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EXSx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46f0e462-6dc2-4f76-815d-0ad025bd2599_439x642.png 424w, https://substackcdn.com/image/fetch/$s_!EXSx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46f0e462-6dc2-4f76-815d-0ad025bd2599_439x642.png 848w, https://substackcdn.com/image/fetch/$s_!EXSx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46f0e462-6dc2-4f76-815d-0ad025bd2599_439x642.png 1272w, https://substackcdn.com/image/fetch/$s_!EXSx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46f0e462-6dc2-4f76-815d-0ad025bd2599_439x642.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EXSx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46f0e462-6dc2-4f76-815d-0ad025bd2599_439x642.png" width="371" height="542.5558086560364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/46f0e462-6dc2-4f76-815d-0ad025bd2599_439x642.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:642,&quot;width&quot;:439,&quot;resizeWidth&quot;:371,&quot;bytes&quot;:49128,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/182228996?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46f0e462-6dc2-4f76-815d-0ad025bd2599_439x642.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!EXSx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46f0e462-6dc2-4f76-815d-0ad025bd2599_439x642.png 424w, https://substackcdn.com/image/fetch/$s_!EXSx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46f0e462-6dc2-4f76-815d-0ad025bd2599_439x642.png 848w, https://substackcdn.com/image/fetch/$s_!EXSx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46f0e462-6dc2-4f76-815d-0ad025bd2599_439x642.png 1272w, https://substackcdn.com/image/fetch/$s_!EXSx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46f0e462-6dc2-4f76-815d-0ad025bd2599_439x642.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Home screen for the Chrome Extension</figcaption></figure></div><p>Every time I open my emails, the extension would check if an email has been categorised in the local storage and display its category. If it hasn&#8217;t been categorised, it would ask an AI Agent to categorise it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AzIa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52fb0c1e-43f6-48a8-a6a5-9a5106f62296_651x288.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AzIa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52fb0c1e-43f6-48a8-a6a5-9a5106f62296_651x288.png 424w, https://substackcdn.com/image/fetch/$s_!AzIa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52fb0c1e-43f6-48a8-a6a5-9a5106f62296_651x288.png 848w, https://substackcdn.com/image/fetch/$s_!AzIa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52fb0c1e-43f6-48a8-a6a5-9a5106f62296_651x288.png 1272w, https://substackcdn.com/image/fetch/$s_!AzIa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52fb0c1e-43f6-48a8-a6a5-9a5106f62296_651x288.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AzIa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52fb0c1e-43f6-48a8-a6a5-9a5106f62296_651x288.png" width="651" height="288" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/52fb0c1e-43f6-48a8-a6a5-9a5106f62296_651x288.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:288,&quot;width&quot;:651,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:26625,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/182228996?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52fb0c1e-43f6-48a8-a6a5-9a5106f62296_651x288.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AzIa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52fb0c1e-43f6-48a8-a6a5-9a5106f62296_651x288.png 424w, https://substackcdn.com/image/fetch/$s_!AzIa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52fb0c1e-43f6-48a8-a6a5-9a5106f62296_651x288.png 848w, https://substackcdn.com/image/fetch/$s_!AzIa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52fb0c1e-43f6-48a8-a6a5-9a5106f62296_651x288.png 1272w, https://substackcdn.com/image/fetch/$s_!AzIa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52fb0c1e-43f6-48a8-a6a5-9a5106f62296_651x288.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Example of tags applied to the inbox</figcaption></figure></div><h3>Tech Stack</h3><ul><li><p>Language: TypeScript</p></li><li><p>Agent: OpenAI Agents SDK</p></li><li><p>Database: SQLite</p></li></ul><h3>How it works</h3><p>This Chrome Extension is built using TypeScript. It has a really simple HTML interface which runs the categorisation logic locally. So your OpenAI API key is only stored on your local computer, and there is no need to connect to or pay for any other service to host the backend.</p><p>It uses OpenAI&#8217;s Agents SDK to analyse the contents of the email subject, sender and preview snippet. The agent has the ability to query similar emails that have been categorised, in an attempt to make the categorisation functionality more intelligent without requiring any super complex sorting or data structures.</p><p><strong>Code:</strong> <a href="https://github.com/IAmTomShaw/email-inbox-agent">https://github.com/IAmTomShaw/email-inbox-agent</a></p><h2>Stock tracker Agent &#128200;</h2><p>This SMS service notifies me if any of my investments go up or down more that a specified percentage over the course of a day, and (crucially) does the research to let me know why each stock has risen or fallen.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DSWY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F841db870-a5ef-4f69-882f-4076bf2d181e_1290x466.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DSWY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F841db870-a5ef-4f69-882f-4076bf2d181e_1290x466.webp 424w, https://substackcdn.com/image/fetch/$s_!DSWY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F841db870-a5ef-4f69-882f-4076bf2d181e_1290x466.webp 848w, https://substackcdn.com/image/fetch/$s_!DSWY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F841db870-a5ef-4f69-882f-4076bf2d181e_1290x466.webp 1272w, https://substackcdn.com/image/fetch/$s_!DSWY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F841db870-a5ef-4f69-882f-4076bf2d181e_1290x466.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DSWY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F841db870-a5ef-4f69-882f-4076bf2d181e_1290x466.webp" width="1290" height="466" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/841db870-a5ef-4f69-882f-4076bf2d181e_1290x466.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:466,&quot;width&quot;:1290,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:29010,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/182228996?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F841db870-a5ef-4f69-882f-4076bf2d181e_1290x466.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!DSWY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F841db870-a5ef-4f69-882f-4076bf2d181e_1290x466.webp 424w, https://substackcdn.com/image/fetch/$s_!DSWY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F841db870-a5ef-4f69-882f-4076bf2d181e_1290x466.webp 848w, https://substackcdn.com/image/fetch/$s_!DSWY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F841db870-a5ef-4f69-882f-4076bf2d181e_1290x466.webp 1272w, https://substackcdn.com/image/fetch/$s_!DSWY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F841db870-a5ef-4f69-882f-4076bf2d181e_1290x466.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Tech Stack</h3><ul><li><p>Language: Python</p></li><li><p>Backend: FastAPI</p></li><li><p>Hosting: Amazon Web Services</p></li><li><p>SMS Service: Twilio</p></li><li><p>Agents: OpenAI Agents SDK</p></li></ul><h3>How it works</h3><p>This project runs as a small backend service and communicates entirely over SMS. It&#8217;s built with FastAPI and uses Twilio webhooks so you can text the system directly to add or remove stocks, or ask for current prices. Stock prices are pulled from public market data, and an automated background job checks tracked stocks on a schedule to see if anything has moved significantly.</p><p>When a stock crosses a defined threshold (for example, up or down 2%), the system uses OpenAI&#8217;s Agents SDK to kick off a research workflow. One agent gathers recent context from the web to understand why the price moved, and another agent summarises that information into a short explanation and sends it via SMS.</p><p><strong>Code:</strong> <a href="https://github.com/IAmTomShaw/stock-tracker-agent">https://github.com/IAmTomShaw/stock-tracker-agent</a></p><p>If you&#8217;d like to learn more about this project, you can read the newsletter post from last month.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;ee77ed66-05d5-4e10-87f0-2c2448565dd8&quot;,&quot;caption&quot;:&quot;If you know me, you&#8217;ll know I live a double life as a stocks bro (I wish &#128064;). In all seriousness, I actually have an addiction to checking my investing app to see if I&#8217;m getting poorer or richer each day and why.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;How I built a Stock Tracker Chatbot &#128176;&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:124420874,&quot;name&quot;:&quot;Tom Shaw&quot;,&quot;bio&quot;:&quot;Tech Content Creator and Developer &#128187; Building cool projects and sharing them with as many people as possible!&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c6a446c6-f707-4d54-a59b-cdb42ea06d8b_1080x1080.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2025-11-23T16:09:09.291Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bdae9eaa-9a5b-4ed8-b576-58ab918d754b_1920x1080.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://tomshaw.substack.com/p/how-i-built-a-stock-tracker-agent&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:179594078,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:2,&quot;comment_count&quot;:2,&quot;publication_id&quot;:1721578,&quot;publication_name&quot;:&quot;build notes.&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!__FP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a8e5fec-1cae-4077-a448-f76ddc420466_1280x1280.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><h2>Quotation Agent &#128176;</h2><p>Sometimes I&#8217;ll spend all day sending out quotes for different project requests that I&#8217;ve received over the course of a week. Its a nice problem to have, but takes way too much time.</p><p>With the desire of automating as much of the boring bits of my work as possible, I built a chatbot tool that enabled me to submit the requirements that a client has sent me and generate a custom project quote/proposal based on my standard pricing for my services and industry standard rates.</p><p>I&#8217;m able to send and receive messages from the chatbot, so we can talk about the specifics of the project and come up with the final quote together before sending it to the client. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0xVg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d57bdad-09c6-4c93-adfd-f07df6478412_1714x1071.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0xVg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d57bdad-09c6-4c93-adfd-f07df6478412_1714x1071.png 424w, https://substackcdn.com/image/fetch/$s_!0xVg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d57bdad-09c6-4c93-adfd-f07df6478412_1714x1071.png 848w, https://substackcdn.com/image/fetch/$s_!0xVg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d57bdad-09c6-4c93-adfd-f07df6478412_1714x1071.png 1272w, https://substackcdn.com/image/fetch/$s_!0xVg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d57bdad-09c6-4c93-adfd-f07df6478412_1714x1071.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0xVg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d57bdad-09c6-4c93-adfd-f07df6478412_1714x1071.png" width="1456" height="910" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2d57bdad-09c6-4c93-adfd-f07df6478412_1714x1071.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:910,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:132228,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/182228996?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d57bdad-09c6-4c93-adfd-f07df6478412_1714x1071.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0xVg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d57bdad-09c6-4c93-adfd-f07df6478412_1714x1071.png 424w, https://substackcdn.com/image/fetch/$s_!0xVg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d57bdad-09c6-4c93-adfd-f07df6478412_1714x1071.png 848w, https://substackcdn.com/image/fetch/$s_!0xVg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d57bdad-09c6-4c93-adfd-f07df6478412_1714x1071.png 1272w, https://substackcdn.com/image/fetch/$s_!0xVg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d57bdad-09c6-4c93-adfd-f07df6478412_1714x1071.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Tech Stack</h3><ul><li><p>Language: Python</p></li><li><p>Interface: Streamlit</p></li><li><p>Backend: FastAPI</p></li><li><p>Agents: OpenAI Agents SDK</p></li><li><p>Knowledge: Notion API (to my pricing doc)</p></li></ul><h3>How it works</h3><p>The project is powered using Python, with effectively two applications built into one. A frontend application to create the sleek looking interface you saw above (built using Streamlit) which uses a WebSocket connection via FastAPI to connect to the simple Python backend which runs the chatbot logic via OpenAI&#8217;s Agents SDK.</p><p>The Chatbot Agent has access to tools that enable it to retrieve my service pricing information from Notion page, and search the internet for information relating to industry standard pricing and terms.</p><p><strong>Code:</strong> <a href="https://github.com/IAmTomShaw/quotation-agent">https://github.com/IAmTomShaw/quotation-agent</a></p><h2>NFL Throwing Game &#127944;</h2><p>Earlier this year, I helped to build an activation for the <a href="https://aws.amazon.com/events/summits/london/">AWS Summit</a> in London. The idea was to build a target game which tests players accuracy and reaction time.</p><p>Players would be able to sign up with a staff member, have the game remotely started, have their score accurately measured and then view their results instantly on the digital leaderboard.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0E54!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51dfb3df-7acf-453b-a27f-f72e65f99ff2_1280x911.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0E54!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51dfb3df-7acf-453b-a27f-f72e65f99ff2_1280x911.jpeg 424w, https://substackcdn.com/image/fetch/$s_!0E54!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51dfb3df-7acf-453b-a27f-f72e65f99ff2_1280x911.jpeg 848w, https://substackcdn.com/image/fetch/$s_!0E54!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51dfb3df-7acf-453b-a27f-f72e65f99ff2_1280x911.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!0E54!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51dfb3df-7acf-453b-a27f-f72e65f99ff2_1280x911.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0E54!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51dfb3df-7acf-453b-a27f-f72e65f99ff2_1280x911.jpeg" width="1280" height="911" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/51dfb3df-7acf-453b-a27f-f72e65f99ff2_1280x911.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:911,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:606477,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/182228996?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51dfb3df-7acf-453b-a27f-f72e65f99ff2_1280x911.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0E54!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51dfb3df-7acf-453b-a27f-f72e65f99ff2_1280x911.jpeg 424w, https://substackcdn.com/image/fetch/$s_!0E54!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51dfb3df-7acf-453b-a27f-f72e65f99ff2_1280x911.jpeg 848w, https://substackcdn.com/image/fetch/$s_!0E54!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51dfb3df-7acf-453b-a27f-f72e65f99ff2_1280x911.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!0E54!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51dfb3df-7acf-453b-a27f-f72e65f99ff2_1280x911.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Tech Stack</h3><ul><li><p>Leaderboard and Admin Platform: React</p></li><li><p>Backend: TypeScript (with Express and Socket.io)</p></li><li><p>Game Runner: Python (with dearpygui)</p></li><li><p>Microcontroller Language: MicroPython</p></li></ul><h3>How it works</h3><p>Using a set of Raspberry Pi Pico Microcontrollers, some break beam sensors and RGB LED light strips I was able to build the hardware for the project.</p><p>Each target hole used a break bean sensor to a ball passing through, and an LED light strip to indicate when a user should throw the ball at that hole (blue), if the user had scored (green flashes) and if the player had missed or ran out of time (red flashes).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!r65i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80a7c9a4-051a-49d1-8fd9-d294d9195e6a_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!r65i!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80a7c9a4-051a-49d1-8fd9-d294d9195e6a_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!r65i!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80a7c9a4-051a-49d1-8fd9-d294d9195e6a_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!r65i!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80a7c9a4-051a-49d1-8fd9-d294d9195e6a_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!r65i!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80a7c9a4-051a-49d1-8fd9-d294d9195e6a_1920x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!r65i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80a7c9a4-051a-49d1-8fd9-d294d9195e6a_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/80a7c9a4-051a-49d1-8fd9-d294d9195e6a_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:476718,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/182228996?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80a7c9a4-051a-49d1-8fd9-d294d9195e6a_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!r65i!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80a7c9a4-051a-49d1-8fd9-d294d9195e6a_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!r65i!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80a7c9a4-051a-49d1-8fd9-d294d9195e6a_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!r65i!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80a7c9a4-051a-49d1-8fd9-d294d9195e6a_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!r65i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80a7c9a4-051a-49d1-8fd9-d294d9195e6a_1920x1080.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Diagram of the hardware powering each target hole on the stand</figcaption></figure></div><p>Using a laptop stored inside of the structure (running a Python application), I was able to bridge the gap between the cloud-based backend service and the hardware inside of the structure.</p><p>Here&#8217;s a video explaining a bit more about how it works: </p><div class="instagram-embed-wrap" data-attrs="{&quot;instagram_id&quot;:&quot;DJmLqZ2ifYP&quot;,&quot;title&quot;:&quot;Tom Shaw on Instagram: \&quot;Here&#8217;s how I built the tech for this NF&#8230;&quot;,&quot;author_name&quot;:&quot;@tom.developer&quot;,&quot;thumbnail_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/__ss-rehost__IG-meta-DJmLqZ2ifYP.jpg&quot;,&quot;like_count&quot;:null,&quot;comment_count&quot;:null,&quot;profile_pic_url&quot;:null,&quot;follower_count&quot;:null,&quot;timestamp&quot;:null,&quot;belowTheFold&quot;:true}" data-component-name="InstagramToDOM"></div><p><strong>Code:</strong> Unfortunately I can&#8217;t share this one as its a project for a client.</p><p><em>(Just to be clear, I only built the tech for this project. The idea, construction of the structure and the branding was not handled by me. Only the software and hardware running the game)</em></p><h2>F1 Race Replay &#127950;&#65039;</h2><p>This project went pretty viral over the past few weeks. If you haven&#8217;t heard about it, let me introduce you to F1 Race Replay, an interactive Formula 1 race visualisation and data analysis tool built with Python!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cunx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa09a0f93-b2eb-4e95-9ec9-093214533056_1910x1191.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cunx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa09a0f93-b2eb-4e95-9ec9-093214533056_1910x1191.png 424w, https://substackcdn.com/image/fetch/$s_!cunx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa09a0f93-b2eb-4e95-9ec9-093214533056_1910x1191.png 848w, https://substackcdn.com/image/fetch/$s_!cunx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa09a0f93-b2eb-4e95-9ec9-093214533056_1910x1191.png 1272w, https://substackcdn.com/image/fetch/$s_!cunx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa09a0f93-b2eb-4e95-9ec9-093214533056_1910x1191.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cunx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa09a0f93-b2eb-4e95-9ec9-093214533056_1910x1191.png" width="1456" height="908" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a09a0f93-b2eb-4e95-9ec9-093214533056_1910x1191.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:908,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:258065,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/182228996?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa09a0f93-b2eb-4e95-9ec9-093214533056_1910x1191.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cunx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa09a0f93-b2eb-4e95-9ec9-093214533056_1910x1191.png 424w, https://substackcdn.com/image/fetch/$s_!cunx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa09a0f93-b2eb-4e95-9ec9-093214533056_1910x1191.png 848w, https://substackcdn.com/image/fetch/$s_!cunx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa09a0f93-b2eb-4e95-9ec9-093214533056_1910x1191.png 1272w, https://substackcdn.com/image/fetch/$s_!cunx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa09a0f93-b2eb-4e95-9ec9-093214533056_1910x1191.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Using the tool, you can re-watch races play out on the track map, while viewing insights into things like weather, car telemetry, flags, safety cars, etc.</p><p>It also has the ability to view detailed telemetry from drivers&#8217; qualifying laps and compare the data with another driver.</p><h3>Tech Stack</h3><ul><li><p>Language: Python</p></li><li><p>Data Source: FastF1</p></li><li><p>Interface: Arcade</p></li></ul><h3>How it works</h3><p>Using the FastF1 library, all of the raw race data (positions, lap times, speeds, tyre info, etc) is gathered and then normalised onto a single, continuous timeline so every car can be replayed in sync. Because different cars report data at slightly different intervals, the system interpolates positions to ensure smooth, accurate movement throughout the race.</p><p>The replay itself is rendered using the Arcade game library, which acts as a lightweight 2D engine. Each car&#8217;s position is updated frame-by-frame based on the processed telemetry, while a separate data layer drives the live leaderboard, lap counters, tyre compounds, and race state.</p><p>Code: <a href="https://github.com/IAmTomShaw/f1-race-replay">https://github.com/IAmTomShaw/f1-race-replay</a></p><p>If you&#8217;d like to learn more about this project, visit this post:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;a6e5c60b-e9fb-44ce-a685-4929bba65f4b&quot;,&quot;caption&quot;:&quot;Earlier this week I launched my latest micro-project, F1 Race Replay. Since then it has racked up over 1 million views on social media, with thousands of people checking out the open-source code for themselves!&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;How I'm building F1 Race Replay using Python&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:124420874,&quot;name&quot;:&quot;Tom Shaw&quot;,&quot;bio&quot;:&quot;Tech Content Creator and Developer &#128187; Building cool projects and sharing them with as many people as possible!&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c6a446c6-f707-4d54-a59b-cdb42ea06d8b_1080x1080.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2025-11-30T18:18:15.618Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!qB9Q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ef35c50-0d2f-4289-bb3c-cabcdc9482f4_1393x875.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://tomshaw.substack.com/p/how-im-building-f1-race-replay-using&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:180188786,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:10,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1721578,&quot;publication_name&quot;:&quot;build notes.&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!__FP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a8e5fec-1cae-4077-a448-f76ddc420466_1280x1280.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><p>I hope you all have a great holiday period. One more newsletter post to go before the new year, let&#8217;s finish 2025 on a high! :)</p>]]></content:encoded></item><item><title><![CDATA[Building a Go Kart Telemetry System using Python and a Raspberry Pi]]></title><description><![CDATA[Displaying racing telemetry was the easy part. Now we need to figure out how to collect it.]]></description><link>https://tomshaw.substack.com/p/building-a-go-kart-telemetry-system</link><guid isPermaLink="false">https://tomshaw.substack.com/p/building-a-go-kart-telemetry-system</guid><dc:creator><![CDATA[Tom Shaw]]></dc:creator><pubDate>Sun, 14 Dec 2025 22:40:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!aW9L!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4409c998-0485-4c7a-9e09-fbf996b623c0_862x536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last week I added lap telemetry charts to the <a href="https://github.com/IAmTomShaw/f1-race-replay">F1 Race Replay</a> project, which enables users to look at the speed, gear, throttle and braking telemetry coming off of a car as it goes around the track during a qualifying session.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QzSV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ae93da1-bf68-4b46-9577-38c1b4c06e04_3572x2184.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QzSV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ae93da1-bf68-4b46-9577-38c1b4c06e04_3572x2184.png 424w, https://substackcdn.com/image/fetch/$s_!QzSV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ae93da1-bf68-4b46-9577-38c1b4c06e04_3572x2184.png 848w, https://substackcdn.com/image/fetch/$s_!QzSV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ae93da1-bf68-4b46-9577-38c1b4c06e04_3572x2184.png 1272w, https://substackcdn.com/image/fetch/$s_!QzSV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ae93da1-bf68-4b46-9577-38c1b4c06e04_3572x2184.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QzSV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ae93da1-bf68-4b46-9577-38c1b4c06e04_3572x2184.png" width="1456" height="890" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0ae93da1-bf68-4b46-9577-38c1b4c06e04_3572x2184.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:890,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:566942,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/181624093?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ae93da1-bf68-4b46-9577-38c1b4c06e04_3572x2184.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!QzSV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ae93da1-bf68-4b46-9577-38c1b4c06e04_3572x2184.png 424w, https://substackcdn.com/image/fetch/$s_!QzSV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ae93da1-bf68-4b46-9577-38c1b4c06e04_3572x2184.png 848w, https://substackcdn.com/image/fetch/$s_!QzSV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ae93da1-bf68-4b46-9577-38c1b4c06e04_3572x2184.png 1272w, https://substackcdn.com/image/fetch/$s_!QzSV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ae93da1-bf68-4b46-9577-38c1b4c06e04_3572x2184.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>These types of charts are without a doubt my favourite insight/visualisation of F1 data. I love how they allow us to really get an insight into how a driver is performing and driving the car, especially when the charts can be used to compare multiple laps or multiple drivers.</p><p>So I&#8217;ve had an idea&#8230;</p><blockquote><p><strong>&#8220;What if you could do this for go karting?&#8221;</strong></p></blockquote><p>Go karting is a huge sport, so of course there are devices and kits that you can buy to attach to your go kart to measure different metrics, however, there are two issues:</p><ol><li><p><strong>They&#8217;re really expensive</strong>.</p><p>Which is not something that I can afford to purchase as someone who&#8217;s just interested in the data. <em>Maybe if I was working on building a career as a driver, but I&#8217;m not.</em></p></li><li><p><strong>You aren&#8217;t allowed to modify the Karts.</strong></p><p>Go karting centres won&#8217;t actually allow you to attach anything to their go karts. (Makes sense for safety reasons, and because they don&#8217;t want you to damage their equipment).</p></li></ol><p>While go kart tracks may not allow you to modify or attach equipment to their cars, they do allow you to wear &#8220;wearables&#8221; such as Smart Watches, GoPros, etc. So as long as I keep whatever sensors and hardware that I need on my person, I should be all good right?</p><h2>Testing out the idea</h2><p>During the week, I started experimenting with a spare accelerometer module and a Raspberry Pi Pico.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dcAB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc934b4a-c667-41cd-8476-7b61c47f6981_2451x2489.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dcAB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc934b4a-c667-41cd-8476-7b61c47f6981_2451x2489.png 424w, https://substackcdn.com/image/fetch/$s_!dcAB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc934b4a-c667-41cd-8476-7b61c47f6981_2451x2489.png 848w, https://substackcdn.com/image/fetch/$s_!dcAB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc934b4a-c667-41cd-8476-7b61c47f6981_2451x2489.png 1272w, https://substackcdn.com/image/fetch/$s_!dcAB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc934b4a-c667-41cd-8476-7b61c47f6981_2451x2489.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dcAB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc934b4a-c667-41cd-8476-7b61c47f6981_2451x2489.png" width="1456" height="1479" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fc934b4a-c667-41cd-8476-7b61c47f6981_2451x2489.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1479,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:6395703,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/181624093?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc934b4a-c667-41cd-8476-7b61c47f6981_2451x2489.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dcAB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc934b4a-c667-41cd-8476-7b61c47f6981_2451x2489.png 424w, https://substackcdn.com/image/fetch/$s_!dcAB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc934b4a-c667-41cd-8476-7b61c47f6981_2451x2489.png 848w, https://substackcdn.com/image/fetch/$s_!dcAB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc934b4a-c667-41cd-8476-7b61c47f6981_2451x2489.png 1272w, https://substackcdn.com/image/fetch/$s_!dcAB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc934b4a-c667-41cd-8476-7b61c47f6981_2451x2489.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Using MicroPython, I was able to measure the orientation and the movement of the module (I&#8217;m using an MPU-6050 which includes a Gyroscope) and display it on my screen.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!s26I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde483ba7-7a06-4733-9406-19ba9451c977_752x656.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!s26I!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde483ba7-7a06-4733-9406-19ba9451c977_752x656.png 424w, https://substackcdn.com/image/fetch/$s_!s26I!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde483ba7-7a06-4733-9406-19ba9451c977_752x656.png 848w, https://substackcdn.com/image/fetch/$s_!s26I!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde483ba7-7a06-4733-9406-19ba9451c977_752x656.png 1272w, https://substackcdn.com/image/fetch/$s_!s26I!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde483ba7-7a06-4733-9406-19ba9451c977_752x656.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!s26I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde483ba7-7a06-4733-9406-19ba9451c977_752x656.png" width="728" height="635.063829787234" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de483ba7-7a06-4733-9406-19ba9451c977_752x656.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:656,&quot;width&quot;:752,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:222276,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/181624093?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde483ba7-7a06-4733-9406-19ba9451c977_752x656.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!s26I!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde483ba7-7a06-4733-9406-19ba9451c977_752x656.png 424w, https://substackcdn.com/image/fetch/$s_!s26I!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde483ba7-7a06-4733-9406-19ba9451c977_752x656.png 848w, https://substackcdn.com/image/fetch/$s_!s26I!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde483ba7-7a06-4733-9406-19ba9451c977_752x656.png 1272w, https://substackcdn.com/image/fetch/$s_!s26I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde483ba7-7a06-4733-9406-19ba9451c977_752x656.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">These are the readings I get as I move and rotate the accelerometer module.</figcaption></figure></div><h2>How I&#8217;m going to build it</h2><p>So here&#8217;s the plan. (It&#8217;s still a work in progress)</p><p>Based on my initial testing using the Raspberry Pi Pico board and the accelerometer, I&#8217;ve determined that by attaching one of these modules to each of my feet, I could use the rotation metrics to measure how far I&#8217;m pressing on the throttle and brake of the kart. And, by attaching a single accelerometer to a stable part of my body (jeans pocket for example), I should be able to get a fairly accurate measurement of the G-Forces that I experience as I go around the track.</p><p><em>Mounting the accelerometer to my chest would probably be the most ideal location, but I suspect safety policies might prohibit the use of a chest mount, even it it is under my clothes.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MHZH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03f7aa8d-ca1a-4b71-a415-13ba86ba1f1b_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MHZH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03f7aa8d-ca1a-4b71-a415-13ba86ba1f1b_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!MHZH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03f7aa8d-ca1a-4b71-a415-13ba86ba1f1b_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!MHZH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03f7aa8d-ca1a-4b71-a415-13ba86ba1f1b_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!MHZH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03f7aa8d-ca1a-4b71-a415-13ba86ba1f1b_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MHZH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03f7aa8d-ca1a-4b71-a415-13ba86ba1f1b_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/03f7aa8d-ca1a-4b71-a415-13ba86ba1f1b_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:758248,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/181624093?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03f7aa8d-ca1a-4b71-a415-13ba86ba1f1b_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!MHZH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03f7aa8d-ca1a-4b71-a415-13ba86ba1f1b_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!MHZH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03f7aa8d-ca1a-4b71-a415-13ba86ba1f1b_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!MHZH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03f7aa8d-ca1a-4b71-a415-13ba86ba1f1b_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!MHZH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03f7aa8d-ca1a-4b71-a415-13ba86ba1f1b_1024x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now, you have to remember that these are consumer rental karts, they&#8217;re not going to be super fast, but they should be fast enough for me to at least be able to look at the telemetry and recognise the different corners, straights and ramps (if any) that are on the track.</p><h2>Limitations (and how I plan to get past them)</h2><p>It looks like getting the telemetry from the kart is going to be possible using the system that I&#8217;ve described above, but that&#8217;s only half of the job done.</p><p>With that system on it&#8217;s own, I have no indication of where I am on the circuit or how fast my lap times are. Two essential bits of information that I&#8217;ll need if I want to actually be able to understand the data that I&#8217;m collecting.</p><p>Unfortunately, the go kart tracks that I go to are usually inside of a building, so using GPS data isn&#8217;t a viable option.</p><p>In this situation, using Bluetooth Low Energy Beacons seems like a really good option for tracking indoor positioning, but I doubt the venue would let me setup beacons in the corners of the room, and I think that might be overkill for an MVP version. I think adding a GoPro and manually syncing it up with the data will be a much better option anyway.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aW9L!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4409c998-0485-4c7a-9e09-fbf996b623c0_862x536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aW9L!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4409c998-0485-4c7a-9e09-fbf996b623c0_862x536.png 424w, https://substackcdn.com/image/fetch/$s_!aW9L!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4409c998-0485-4c7a-9e09-fbf996b623c0_862x536.png 848w, https://substackcdn.com/image/fetch/$s_!aW9L!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4409c998-0485-4c7a-9e09-fbf996b623c0_862x536.png 1272w, https://substackcdn.com/image/fetch/$s_!aW9L!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4409c998-0485-4c7a-9e09-fbf996b623c0_862x536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aW9L!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4409c998-0485-4c7a-9e09-fbf996b623c0_862x536.png" width="862" height="536" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4409c998-0485-4c7a-9e09-fbf996b623c0_862x536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:536,&quot;width&quot;:862,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:81648,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/181624093?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4409c998-0485-4c7a-9e09-fbf996b623c0_862x536.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!aW9L!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4409c998-0485-4c7a-9e09-fbf996b623c0_862x536.png 424w, https://substackcdn.com/image/fetch/$s_!aW9L!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4409c998-0485-4c7a-9e09-fbf996b623c0_862x536.png 848w, https://substackcdn.com/image/fetch/$s_!aW9L!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4409c998-0485-4c7a-9e09-fbf996b623c0_862x536.png 1272w, https://substackcdn.com/image/fetch/$s_!aW9L!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4409c998-0485-4c7a-9e09-fbf996b623c0_862x536.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Another limitation is measuring exact lap times. Usually karting tracks will use break beam sensors to detect cars crossing the start/finish line to accurately measure their lap times. Unfortunately I won&#8217;t be able to setup my own break beam sensors, but fortunately, the track I go to sends you an email that includes all of your lap times from the session. So with a bit of manual input, I could add this data into the telemetry.</p><h2>The next steps.</h2><p>The side-project is definitely in its early stages, but I thought that it would be really cool to share the idea with everyone in this community and keep you up to date on it&#8217;s progress <em>(alongside the development of F1 Race Replay)</em>.</p><p>So far I&#8217;ve purchased the additional sensors and components that I&#8217;ll need to be able to start work on hacking this project together.</p><p>My hope is that the next time I&#8217;m at the go kart track, I&#8217;ll be able to take this kit with me and give it a try!</p><div><hr></div><p>Unfortunately there&#8217;s no open-source code to share in this week&#8217;s newsletter, but I hope you&#8217;re as excited as I am to see how this side-project progresses! </p><p>I&#8217;ve also got some really cool additions to the F1 Race Replay project coming soon, so be ready for that!</p>]]></content:encoded></item><item><title><![CDATA[How I'm analysing F1 Telemetry using Python]]></title><description><![CDATA[The next step in building the ultimate Python project for F1 Fans!]]></description><link>https://tomshaw.substack.com/p/how-im-analysing-f1-telemetry-using</link><guid isPermaLink="false">https://tomshaw.substack.com/p/how-im-analysing-f1-telemetry-using</guid><dc:creator><![CDATA[Tom Shaw]]></dc:creator><pubDate>Sun, 07 Dec 2025 18:10:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!MjJJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F709e824b-b51c-49db-8b00-0d6daa32d6ba_3572x2184.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last week I shared my latest project, <a href="https://github.com/IAmTomShaw/f1-race-replay">F1 Race Replay</a>, a tool that enables you to watch Formula 1 races from above.</p><p>In my <a href="https://tomshaw.substack.com/p/how-im-building-f1-race-replay-using">previous newsletter post</a>, I outlined what the future of the project looks like and the features that I&#8217;d like to prioritise.</p><p>So this week, I made a start by adding Qualifying telemetry analysis.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MjJJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F709e824b-b51c-49db-8b00-0d6daa32d6ba_3572x2184.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MjJJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F709e824b-b51c-49db-8b00-0d6daa32d6ba_3572x2184.png 424w, https://substackcdn.com/image/fetch/$s_!MjJJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F709e824b-b51c-49db-8b00-0d6daa32d6ba_3572x2184.png 848w, https://substackcdn.com/image/fetch/$s_!MjJJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F709e824b-b51c-49db-8b00-0d6daa32d6ba_3572x2184.png 1272w, https://substackcdn.com/image/fetch/$s_!MjJJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F709e824b-b51c-49db-8b00-0d6daa32d6ba_3572x2184.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MjJJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F709e824b-b51c-49db-8b00-0d6daa32d6ba_3572x2184.png" width="1456" height="890" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/709e824b-b51c-49db-8b00-0d6daa32d6ba_3572x2184.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:890,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:523340,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/180950637?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F709e824b-b51c-49db-8b00-0d6daa32d6ba_3572x2184.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!MjJJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F709e824b-b51c-49db-8b00-0d6daa32d6ba_3572x2184.png 424w, https://substackcdn.com/image/fetch/$s_!MjJJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F709e824b-b51c-49db-8b00-0d6daa32d6ba_3572x2184.png 848w, https://substackcdn.com/image/fetch/$s_!MjJJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F709e824b-b51c-49db-8b00-0d6daa32d6ba_3572x2184.png 1272w, https://substackcdn.com/image/fetch/$s_!MjJJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F709e824b-b51c-49db-8b00-0d6daa32d6ba_3572x2184.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now you may be thinking:</p><blockquote><p><em>&#8220;Tom, why didn&#8217;t you just add the track map showing the cars going around the track during Qualifying?</em>&#8221;</p></blockquote><p><strong>Two reasons:</strong></p><ol><li><p>I wanted to go the extra mile (pun intended). &#128521;</p></li><li><p>The real importance of qualifying isn&#8217;t about where everyone else is on the circuit, it&#8217;s about how each driver performs during their lap as they attempt to squeeze every millisecond of time out of the car.</p></li></ol><p>So to make sure that the tool gives the best insight into the drivers&#8217; laps, I wanted users to be able to view the telemetry that showcases their speed, where they change gear, where they use the throttle and brakes, all plotted to show every little adjustment throughout the lap.</p><h2>Introducing the &#8220;Telemetry Trace&#8221; Charts</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4mJ-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56f31d11-598a-4534-9b4e-ad5d1aa5183f_1166x453.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4mJ-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56f31d11-598a-4534-9b4e-ad5d1aa5183f_1166x453.png 424w, https://substackcdn.com/image/fetch/$s_!4mJ-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56f31d11-598a-4534-9b4e-ad5d1aa5183f_1166x453.png 848w, https://substackcdn.com/image/fetch/$s_!4mJ-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56f31d11-598a-4534-9b4e-ad5d1aa5183f_1166x453.png 1272w, https://substackcdn.com/image/fetch/$s_!4mJ-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56f31d11-598a-4534-9b4e-ad5d1aa5183f_1166x453.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4mJ-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56f31d11-598a-4534-9b4e-ad5d1aa5183f_1166x453.png" width="1166" height="453" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/56f31d11-598a-4534-9b4e-ad5d1aa5183f_1166x453.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:453,&quot;width&quot;:1166,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:39688,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/180950637?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56f31d11-598a-4534-9b4e-ad5d1aa5183f_1166x453.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4mJ-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56f31d11-598a-4534-9b4e-ad5d1aa5183f_1166x453.png 424w, https://substackcdn.com/image/fetch/$s_!4mJ-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56f31d11-598a-4534-9b4e-ad5d1aa5183f_1166x453.png 848w, https://substackcdn.com/image/fetch/$s_!4mJ-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56f31d11-598a-4534-9b4e-ad5d1aa5183f_1166x453.png 1272w, https://substackcdn.com/image/fetch/$s_!4mJ-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56f31d11-598a-4534-9b4e-ad5d1aa5183f_1166x453.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You&#8217;ve probably seen one of these before. They&#8217;re used by the engineers to understand how a driver is performing, often overlaid with another driver&#8217;s telemetry so that they can see where time is being gained or lost at different points around the track.</p><p>The concept is very simple, if you have a dataset which contains the distance that a car has travelled around the circuit, along with the parameters that you want to analyse, you&#8217;ll be able to plot the X axis with the distance and use the Y axis to plot any value in the telemetry.</p><p>Here&#8217;s an example of what that data could look like:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!i7Rj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511537cc-ff51-4d7a-b899-9bb0cc169e64_499x135.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i7Rj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511537cc-ff51-4d7a-b899-9bb0cc169e64_499x135.png 424w, https://substackcdn.com/image/fetch/$s_!i7Rj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511537cc-ff51-4d7a-b899-9bb0cc169e64_499x135.png 848w, https://substackcdn.com/image/fetch/$s_!i7Rj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511537cc-ff51-4d7a-b899-9bb0cc169e64_499x135.png 1272w, https://substackcdn.com/image/fetch/$s_!i7Rj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511537cc-ff51-4d7a-b899-9bb0cc169e64_499x135.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i7Rj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511537cc-ff51-4d7a-b899-9bb0cc169e64_499x135.png" width="728" height="196.95390781563125" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/511537cc-ff51-4d7a-b899-9bb0cc169e64_499x135.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:135,&quot;width&quot;:499,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:16343,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/180950637?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511537cc-ff51-4d7a-b899-9bb0cc169e64_499x135.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!i7Rj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511537cc-ff51-4d7a-b899-9bb0cc169e64_499x135.png 424w, https://substackcdn.com/image/fetch/$s_!i7Rj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511537cc-ff51-4d7a-b899-9bb0cc169e64_499x135.png 848w, https://substackcdn.com/image/fetch/$s_!i7Rj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511537cc-ff51-4d7a-b899-9bb0cc169e64_499x135.png 1272w, https://substackcdn.com/image/fetch/$s_!i7Rj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511537cc-ff51-4d7a-b899-9bb0cc169e64_499x135.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2>Adding this to F1 Race Replay</h2><p>So how did this feature get introduced into the project?</p><p>Well first I had to do some cleaning up of the code. A little reorganising to make sure that it&#8217;s well kept and presentable for anyone that wants to download it and have a look at how it works.</p><p>The codebase now has the following structure:</p><pre><code><code>f1-race-replay/
&#9500;&#9472;&#9472; main.py                   # Entry point
&#9500;&#9472;&#9472; requirements.txt          # Python dependencies
&#9500;&#9472;&#9472; README.md                 # Project documentation
&#9500;&#9472;&#9472; roadmap.md                # Planned features and project vision
&#9500;&#9472;&#9472; resources/
&#9474;   &#9492;&#9472;&#9472; preview.png           # Race replay preview image
&#9500;&#9472;&#9472; src/
&#9474;   &#9500;&#9472;&#9472; f1_data.py            # Telemetry loading, processing, and frame generation
&#9474;   &#9500;&#9472;&#9472; arcade_replay.py      # UI starter logic
&#9474;   &#9492;&#9472;&#9472; ui_components.py      # UI components like buttons and leaderboard
&#9474;   &#9500;&#9472;&#9472; interfaces/
&#9474;   &#9474;   &#9492;&#9472;&#9472; qualifying.py     # Qualifying session interface (w/ chart)
&#9474;   &#9474;   &#9492;&#9472;&#9472; race_replay.py    # Race replay interface
&#9474;   &#9492;&#9472;&#9472; lib/
&#9474;       &#9492;&#9472;&#9472; tyres.py          # Tyre formatting utilities
&#9474;       &#9492;&#9472;&#9472; time.py           # Time formatting utilities
&#9492;&#9472;&#9472; .fastf1-cache/            # FastF1 cache folder
&#9492;&#9472;&#9472; computed_data/            # Computed telemetry data</code></code></pre><p>The qualifying interface is completely separate from the race replay interface. So while they share some code similarities in terms of the UI, handling resizing, displaying the cars, etc, they&#8217;re very much separate features.</p><p>All of the data for this feature is sourced using the <a href="https://docs.fastf1.dev/">FastF1</a> Python package. And the interface is built using the <a href="https://api.arcade.academy/en/stable/">Arcade</a> Python package. Using a chart library probably would have been easier for this feature, however, embedding an interactive chart into an Arcade interface isn&#8217;t as easy&#8230; so I opted for creating the charts myself.</p><h2>How to use the new feature</h2><p>By passing the <em>&#8220;&#8212;qualifying&#8221;</em> argument when running the Python project, the application will process and display the qualifying data from the relevant race weekend that you select at runtime.</p><p>You will then be presented with a leaderboard screen where you can (using your mouse) select a driver and then select their lap telemetry from Q1, Q2 or Q3.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fCLQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53f58080-66d6-4e92-9745-aeb92a30c5b9_1674x1100.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fCLQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53f58080-66d6-4e92-9745-aeb92a30c5b9_1674x1100.png 424w, https://substackcdn.com/image/fetch/$s_!fCLQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53f58080-66d6-4e92-9745-aeb92a30c5b9_1674x1100.png 848w, https://substackcdn.com/image/fetch/$s_!fCLQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53f58080-66d6-4e92-9745-aeb92a30c5b9_1674x1100.png 1272w, https://substackcdn.com/image/fetch/$s_!fCLQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53f58080-66d6-4e92-9745-aeb92a30c5b9_1674x1100.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fCLQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53f58080-66d6-4e92-9745-aeb92a30c5b9_1674x1100.png" width="1674" height="1100" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/53f58080-66d6-4e92-9745-aeb92a30c5b9_1674x1100.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1100,&quot;width&quot;:1674,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:112963,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/180950637?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7af7450d-002e-4771-a0c1-656de31276f1_3572x2184.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fCLQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53f58080-66d6-4e92-9745-aeb92a30c5b9_1674x1100.png 424w, https://substackcdn.com/image/fetch/$s_!fCLQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53f58080-66d6-4e92-9745-aeb92a30c5b9_1674x1100.png 848w, https://substackcdn.com/image/fetch/$s_!fCLQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53f58080-66d6-4e92-9745-aeb92a30c5b9_1674x1100.png 1272w, https://substackcdn.com/image/fetch/$s_!fCLQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53f58080-66d6-4e92-9745-aeb92a30c5b9_1674x1100.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>What&#8217;s next?</h2><p>This feature is a really cool addition to the project, and  I&#8217;m really excited to see the feedback that it gets from the community, but it&#8217;s definitely missing something&#8230; Comparison Tools.</p><p>As I mentioned earlier, these charts are often used to compare the performance of a driver with another driver. So without a doubt the next addition to this project has to be the ability to compare a driver&#8217;s telemetry with another driver. </p><p>For now though, you&#8217;ll have to wait for the comparison feature. In the meantime, check out the Qualifying Replay feature and have a think if there&#8217;s anything you&#8217;d like to add to the project. It&#8217;s open-source, so anyone can download it, add their own code and even submit a pull request to add their work into the main codebase for everyone to see!</p><p>You can access the code here: <a href="https://github.com/IAmTomShaw/f1-race-replay">https://github.com/IAmTomShaw/f1-race-replay</a></p><div><hr></div><p>Also, congratulations to Lando Norris on becoming the 2025 Formula 1 World Champion! &#127942;</p>]]></content:encoded></item><item><title><![CDATA[How I'm building F1 Race Replay using Python]]></title><description><![CDATA[How it works, and the future of the viral project!]]></description><link>https://tomshaw.substack.com/p/how-im-building-f1-race-replay-using</link><guid isPermaLink="false">https://tomshaw.substack.com/p/how-im-building-f1-race-replay-using</guid><dc:creator><![CDATA[Tom Shaw]]></dc:creator><pubDate>Sun, 30 Nov 2025 18:18:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!qB9Q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ef35c50-0d2f-4289-bb3c-cabcdc9482f4_1393x875.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Earlier this week I launched my latest micro-project, <a href="https://github.com/IAmTomShaw/f1-race-replay">F1 Race Replay</a>. Since then it has racked up over <strong>1 million views</strong> on social media, with thousands of people checking out the open-source code for themselves!</p><p>So in this week&#8217;s edition of Build Notes, you&#8217;re going to hear all about how I built this python-based project and what the future holds for it!</p><h1>Project Idea &#128161;</h1><p>F1 Race Replay is an interactive tool that let&#8217;s you watch replays of Formula 1 races from above, giving you a better view of everything that&#8217;s happening in the race!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qB9Q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ef35c50-0d2f-4289-bb3c-cabcdc9482f4_1393x875.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qB9Q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ef35c50-0d2f-4289-bb3c-cabcdc9482f4_1393x875.png 424w, https://substackcdn.com/image/fetch/$s_!qB9Q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ef35c50-0d2f-4289-bb3c-cabcdc9482f4_1393x875.png 848w, https://substackcdn.com/image/fetch/$s_!qB9Q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ef35c50-0d2f-4289-bb3c-cabcdc9482f4_1393x875.png 1272w, https://substackcdn.com/image/fetch/$s_!qB9Q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ef35c50-0d2f-4289-bb3c-cabcdc9482f4_1393x875.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qB9Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ef35c50-0d2f-4289-bb3c-cabcdc9482f4_1393x875.png" width="1393" height="875" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9ef35c50-0d2f-4289-bb3c-cabcdc9482f4_1393x875.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:875,&quot;width&quot;:1393,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:138049,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/180188786?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ef35c50-0d2f-4289-bb3c-cabcdc9482f4_1393x875.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qB9Q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ef35c50-0d2f-4289-bb3c-cabcdc9482f4_1393x875.png 424w, https://substackcdn.com/image/fetch/$s_!qB9Q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ef35c50-0d2f-4289-bb3c-cabcdc9482f4_1393x875.png 848w, https://substackcdn.com/image/fetch/$s_!qB9Q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ef35c50-0d2f-4289-bb3c-cabcdc9482f4_1393x875.png 1272w, https://substackcdn.com/image/fetch/$s_!qB9Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ef35c50-0d2f-4289-bb3c-cabcdc9482f4_1393x875.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Features &#127950;&#65039;</h1><ul><li><p><strong>Race Replay Visualisation:</strong> Watch the race unfold with real-time driver positions on a rendered track.</p></li><li><p><strong>Leaderboard:</strong> See live driver positions and current tyre compounds.</p></li><li><p><strong>Lap &amp; Time Display:</strong> Track the current lap and total race time.</p></li><li><p><strong>Driver Status:</strong> Drivers who retire or go out are marked as &#8220;OUT&#8221; on the leaderboard.</p></li><li><p><strong>Interactive Controls:</strong> Pause, rewind, fast forward, and adjust playback speed using keyboard shortcuts.</p></li><li><p><strong>Driver Telemetry Insights:</strong> View speed, gear, DRS status, and current lap for selected drivers when selected on the leaderboard.</p></li></ul><h1>How it&#8217;s built &#128187;</h1><h2>Tech Stack</h2><p><strong>Language:</strong> Python &#128013;</p><p><strong>Data Source:</strong> FastF1 &#127950;&#65039;</p><p><strong>Interface:</strong> Arcade &#128377;&#65039;</p><p><strong>Data Processing:</strong> NumPy &#128200;</p><h2>Data Source</h2><p>All of the RAW data that is used inside of the project is sourced from the <a href="https://docs.fastf1.dev/">FastF1</a> python package!</p><blockquote><p>FastF1 gives you access to F1 lap timing, car telemetry and position, tyre data, weather data, the event schedule and session results. - FastF1 Website</p></blockquote><p>All of this data is taken in its raw form from FastF1 and put onto a normalised timeline for the entire race, which allows us to know the exact position, gear, speed, throttle pressure, etc of each driver at any given second in the race.</p><h2>Interface</h2><p>I decided that I wanted to use Python for the interface so that the entire project could be easily installed and run by users on their own device. Hosting it on a website and having separate applications to process and display data just didn&#8217;t feel like the optimal solution this project.</p><p>I chose <a href="https://api.arcade.academy/">Arcade</a>, which is a python package that enables you to build 2D interfaces. It&#8217;s usually meant for games, but was a great option for creating a custom GUI (Graphical User Interface) that used animations and movement.</p><p>An alternative that I used in the initial version on my laptop was the animation features inside of <a href="https://matplotlib.org/">Matplotlib</a>, however I felt like Arcade offered more potential for the future features that I want to add in.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!im6U!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4413c4b5-2c8f-4ff9-b81f-4ca46936e68b_2292x1237.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!im6U!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4413c4b5-2c8f-4ff9-b81f-4ca46936e68b_2292x1237.png 424w, https://substackcdn.com/image/fetch/$s_!im6U!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4413c4b5-2c8f-4ff9-b81f-4ca46936e68b_2292x1237.png 848w, https://substackcdn.com/image/fetch/$s_!im6U!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4413c4b5-2c8f-4ff9-b81f-4ca46936e68b_2292x1237.png 1272w, https://substackcdn.com/image/fetch/$s_!im6U!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4413c4b5-2c8f-4ff9-b81f-4ca46936e68b_2292x1237.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!im6U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4413c4b5-2c8f-4ff9-b81f-4ca46936e68b_2292x1237.png" width="1456" height="786" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4413c4b5-2c8f-4ff9-b81f-4ca46936e68b_2292x1237.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:786,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:212239,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/180188786?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4413c4b5-2c8f-4ff9-b81f-4ca46936e68b_2292x1237.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!im6U!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4413c4b5-2c8f-4ff9-b81f-4ca46936e68b_2292x1237.png 424w, https://substackcdn.com/image/fetch/$s_!im6U!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4413c4b5-2c8f-4ff9-b81f-4ca46936e68b_2292x1237.png 848w, https://substackcdn.com/image/fetch/$s_!im6U!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4413c4b5-2c8f-4ff9-b81f-4ca46936e68b_2292x1237.png 1272w, https://substackcdn.com/image/fetch/$s_!im6U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4413c4b5-2c8f-4ff9-b81f-4ca46936e68b_2292x1237.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">This is what the original matplotlib based animation looked like</figcaption></figure></div><p>Based on the above, you can see why I needed to select a library that gave me a few more customisation options. With Arcade, I don&#8217;t think we&#8217;re going to be limited by what we can do with the interface, which is great for growing the project!</p><h2>User Experience </h2><p>Currently users must start the project by running <code>&#8216;python main.py &#8212;year (year number) &#8212;round (round number)</code> in their terminal. As I&#8217;ll mention in the next section, another developer has already started working on a feature to introduce a visual menu for selecting a race, so that&#8217;s going to be a great improvement for the project if that PR get&#8217;s finalised!</p><h1>Community Response &#128220;</h1><p>The response from the community since releasing this project has been MEGA! I made the code open-source to enable people to learn from it and hopefully commit their own features to the codebase&#8230; and that&#8217;s exactly what you&#8217;ve done!</p><p>Since launching, we&#8217;ve had a developer add a feature to enable users to resize the viewer window (now merged), another developer work on the first version of visual menu for selecting the race that you want to watch (awaiting code review) and another developer work on adding in the ability to view sprint races too (awaiting code review).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VMvI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32c50c73-227f-48b7-94c0-e116dd2588d2_2468x788.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VMvI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32c50c73-227f-48b7-94c0-e116dd2588d2_2468x788.png 424w, https://substackcdn.com/image/fetch/$s_!VMvI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32c50c73-227f-48b7-94c0-e116dd2588d2_2468x788.png 848w, https://substackcdn.com/image/fetch/$s_!VMvI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32c50c73-227f-48b7-94c0-e116dd2588d2_2468x788.png 1272w, https://substackcdn.com/image/fetch/$s_!VMvI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32c50c73-227f-48b7-94c0-e116dd2588d2_2468x788.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VMvI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32c50c73-227f-48b7-94c0-e116dd2588d2_2468x788.png" width="1456" height="465" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/32c50c73-227f-48b7-94c0-e116dd2588d2_2468x788.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:465,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:198655,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/180188786?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32c50c73-227f-48b7-94c0-e116dd2588d2_2468x788.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VMvI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32c50c73-227f-48b7-94c0-e116dd2588d2_2468x788.png 424w, https://substackcdn.com/image/fetch/$s_!VMvI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32c50c73-227f-48b7-94c0-e116dd2588d2_2468x788.png 848w, https://substackcdn.com/image/fetch/$s_!VMvI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32c50c73-227f-48b7-94c0-e116dd2588d2_2468x788.png 1272w, https://substackcdn.com/image/fetch/$s_!VMvI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32c50c73-227f-48b7-94c0-e116dd2588d2_2468x788.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>At the time of writing, I&#8217;m still in the process of reviewing these new submissions.</p><h1>The future of F1 Race Replay &#128640;</h1><p>I&#8217;ve been asked a lot of questions about what the future of this project actually is. After launching something that&#8217;s received this much love, it would be silly to stop here.</p><p>In my mind, this project is a great opportunity for Developers, F1 Fans and Data-lovers to explore the data behind their favourite sport using their very own hands!</p><p>With that mission in mind, here are some feature ideas which I think would be great:</p><ul><li><p><strong>Telemetry Charts:</strong> Showcasing speed, throttle, braking, etc</p></li><li><p><strong>Post-Race Reports:</strong> Telling the story of the race in a single chart</p></li><li><p><strong>Race Control Messages:</strong> Understanding exactly what decisions they&#8217;re making</p></li><li><p><strong>Qualifying Insights:</strong> A separate feature in itself, but could be really cool</p></li></ul><p>There is a known issue where the leaderboard isn&#8217;t 100% accurate with the drivers&#8217; positions on track. I&#8217;m currently looking into fixing this issue.</p><h1>How you can get involved <strong>&#129781;</strong></h1><p>If you&#8217;ve got an idea for a feature, make sure to submit it! If it&#8217;s cool enough, we can add it to the roadmap and you can even have a go at building it!</p><p>Make sure to check out the project on GitHub, and give it a star! &#11088;</p><p>Link: <a href="https://github.com/IAmTomShaw/f1-race-replay">https://github.com/IAmTomShaw/f1-race-replay</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Hi8X!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2837cab8-7ef8-4f0f-9c5f-cd5ae1116b79_674x542.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hi8X!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2837cab8-7ef8-4f0f-9c5f-cd5ae1116b79_674x542.png 424w, https://substackcdn.com/image/fetch/$s_!Hi8X!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2837cab8-7ef8-4f0f-9c5f-cd5ae1116b79_674x542.png 848w, https://substackcdn.com/image/fetch/$s_!Hi8X!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2837cab8-7ef8-4f0f-9c5f-cd5ae1116b79_674x542.png 1272w, https://substackcdn.com/image/fetch/$s_!Hi8X!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2837cab8-7ef8-4f0f-9c5f-cd5ae1116b79_674x542.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hi8X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2837cab8-7ef8-4f0f-9c5f-cd5ae1116b79_674x542.png" width="728" height="585.4243323442137" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2837cab8-7ef8-4f0f-9c5f-cd5ae1116b79_674x542.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:542,&quot;width&quot;:674,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:86389,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/180188786?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2837cab8-7ef8-4f0f-9c5f-cd5ae1116b79_674x542.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Hi8X!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2837cab8-7ef8-4f0f-9c5f-cd5ae1116b79_674x542.png 424w, https://substackcdn.com/image/fetch/$s_!Hi8X!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2837cab8-7ef8-4f0f-9c5f-cd5ae1116b79_674x542.png 848w, https://substackcdn.com/image/fetch/$s_!Hi8X!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2837cab8-7ef8-4f0f-9c5f-cd5ae1116b79_674x542.png 1272w, https://substackcdn.com/image/fetch/$s_!Hi8X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2837cab8-7ef8-4f0f-9c5f-cd5ae1116b79_674x542.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>Disclaimer</h2><p>No copyright infringement intended. Formula 1 and related trademarks are the property of their respective owners. All data used is sourced from publicly available APIs and is used for educational and non-commercial purposes only.</p><div><hr></div><p>Have a great week. Keep building. See you in the next edition! &#128512;</p>]]></content:encoded></item><item><title><![CDATA[How I built a Stock Tracker Chatbot 💰]]></title><description><![CDATA[An automated chatbot tool to keep an eye on my stocks for me]]></description><link>https://tomshaw.substack.com/p/how-i-built-a-stock-tracker-agent</link><guid isPermaLink="false">https://tomshaw.substack.com/p/how-i-built-a-stock-tracker-agent</guid><dc:creator><![CDATA[Tom Shaw]]></dc:creator><pubDate>Sun, 23 Nov 2025 16:09:09 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/bdae9eaa-9a5b-4ed8-b576-58ab918d754b_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you know me, you&#8217;ll know I live a double life as a stocks bro (I wish &#128064;). In all seriousness, I actually have an addiction to checking my investing app to see if I&#8217;m getting poorer or richer each day and why. </p><p><em>Of course that takes up a lot of time.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rhOU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cfb65b5-a827-42fb-8479-ad9f7c774026_1290x466.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rhOU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cfb65b5-a827-42fb-8479-ad9f7c774026_1290x466.jpeg 424w, https://substackcdn.com/image/fetch/$s_!rhOU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cfb65b5-a827-42fb-8479-ad9f7c774026_1290x466.jpeg 848w, https://substackcdn.com/image/fetch/$s_!rhOU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cfb65b5-a827-42fb-8479-ad9f7c774026_1290x466.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!rhOU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cfb65b5-a827-42fb-8479-ad9f7c774026_1290x466.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rhOU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cfb65b5-a827-42fb-8479-ad9f7c774026_1290x466.jpeg" width="1290" height="466" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1cfb65b5-a827-42fb-8479-ad9f7c774026_1290x466.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:466,&quot;width&quot;:1290,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:82939,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/179594078?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cfb65b5-a827-42fb-8479-ad9f7c774026_1290x466.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rhOU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cfb65b5-a827-42fb-8479-ad9f7c774026_1290x466.jpeg 424w, https://substackcdn.com/image/fetch/$s_!rhOU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cfb65b5-a827-42fb-8479-ad9f7c774026_1290x466.jpeg 848w, https://substackcdn.com/image/fetch/$s_!rhOU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cfb65b5-a827-42fb-8479-ad9f7c774026_1290x466.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!rhOU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cfb65b5-a827-42fb-8479-ad9f7c774026_1290x466.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>The idea &#128161;</h2><p>Instead of checking my app on a routine,  I thought it would be a good idea to get notified every time the value of one of my investments changes significantly. </p><p>Now the app does have a feature to receive notifications, but they just tell you about the price change, not why it&#8217;s changed.</p><p>Ultimately if I&#8217;ve lost some money on something I want to know why&#8230; so tell me why!</p><div class="pullquote"><p>Anyway so I&#8217;ve decide to build an automation that sends me an SMS message with information on the price change and why it changed.</p></div><p>Let&#8217;s build it!</p><h1>Tech Stack &#128187;</h1><p><strong>SMS Service:</strong> <a href="https://www.twilio.com/en-us">Twilio</a> &#128172;</p><p><strong>Language:</strong> <a href="https://www.python.org/">Python</a> &#128013;</p><p><strong>Framework:</strong> <a href="https://fastapi.tiangolo.com/">FastAPI</a> &#128640;</p><p><strong>Finance API:</strong> <a href="https://pypi.org/project/yfinance/">yfinance</a> &#128176;</p><p><strong>AI Agents Framework:</strong> <a href="https://github.com/openai/openai-agents-python">OpenAI Agents SDK</a> &#129504;</p><h2>The Two Functions &#128296;</h2><h3>User Message Webhook</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_heV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10b953a2-19f0-450a-9a6c-072a220d3985_3254x1482.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_heV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10b953a2-19f0-450a-9a6c-072a220d3985_3254x1482.png 424w, https://substackcdn.com/image/fetch/$s_!_heV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10b953a2-19f0-450a-9a6c-072a220d3985_3254x1482.png 848w, https://substackcdn.com/image/fetch/$s_!_heV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10b953a2-19f0-450a-9a6c-072a220d3985_3254x1482.png 1272w, https://substackcdn.com/image/fetch/$s_!_heV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10b953a2-19f0-450a-9a6c-072a220d3985_3254x1482.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_heV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10b953a2-19f0-450a-9a6c-072a220d3985_3254x1482.png" width="1456" height="663" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/10b953a2-19f0-450a-9a6c-072a220d3985_3254x1482.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:663,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:282457,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/179594078?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10b953a2-19f0-450a-9a6c-072a220d3985_3254x1482.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_heV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10b953a2-19f0-450a-9a6c-072a220d3985_3254x1482.png 424w, https://substackcdn.com/image/fetch/$s_!_heV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10b953a2-19f0-450a-9a6c-072a220d3985_3254x1482.png 848w, https://substackcdn.com/image/fetch/$s_!_heV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10b953a2-19f0-450a-9a6c-072a220d3985_3254x1482.png 1272w, https://substackcdn.com/image/fetch/$s_!_heV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10b953a2-19f0-450a-9a6c-072a220d3985_3254x1482.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>As a user, I want to be able to interact with the system to ask for pricing info on demand, or add new stocks to my tracking list. So to do this, I&#8217;ve created a webhook which is triggered whenever I send an SMS message from my phone to the system&#8217;s phone number.</p><p><strong>Message Handler Agent</strong></p><p>This agent uses the OpenAI Agents SDK to determine which tools to use based on the user&#8217;s instructions and generate a response message to send back to the user.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9fHb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb5351fb-95f4-45e2-82fc-f9d0140771fd_1290x712.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9fHb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb5351fb-95f4-45e2-82fc-f9d0140771fd_1290x712.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9fHb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb5351fb-95f4-45e2-82fc-f9d0140771fd_1290x712.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9fHb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb5351fb-95f4-45e2-82fc-f9d0140771fd_1290x712.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9fHb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb5351fb-95f4-45e2-82fc-f9d0140771fd_1290x712.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9fHb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb5351fb-95f4-45e2-82fc-f9d0140771fd_1290x712.jpeg" width="1290" height="712" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb5351fb-95f4-45e2-82fc-f9d0140771fd_1290x712.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:712,&quot;width&quot;:1290,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:93473,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/179594078?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb5351fb-95f4-45e2-82fc-f9d0140771fd_1290x712.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9fHb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb5351fb-95f4-45e2-82fc-f9d0140771fd_1290x712.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9fHb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb5351fb-95f4-45e2-82fc-f9d0140771fd_1290x712.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9fHb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb5351fb-95f4-45e2-82fc-f9d0140771fd_1290x712.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9fHb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb5351fb-95f4-45e2-82fc-f9d0140771fd_1290x712.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here&#8217;s an example of what the user (me) sees when they send a message to the designated phone number.</p><h3>The Automated Stock Price Checker</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!diwA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F104aab7e-cf4c-4436-824f-6e0c381b39d6_3398x998.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!diwA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F104aab7e-cf4c-4436-824f-6e0c381b39d6_3398x998.png 424w, https://substackcdn.com/image/fetch/$s_!diwA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F104aab7e-cf4c-4436-824f-6e0c381b39d6_3398x998.png 848w, https://substackcdn.com/image/fetch/$s_!diwA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F104aab7e-cf4c-4436-824f-6e0c381b39d6_3398x998.png 1272w, https://substackcdn.com/image/fetch/$s_!diwA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F104aab7e-cf4c-4436-824f-6e0c381b39d6_3398x998.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!diwA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F104aab7e-cf4c-4436-824f-6e0c381b39d6_3398x998.png" width="1456" height="428" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/104aab7e-cf4c-4436-824f-6e0c381b39d6_3398x998.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:428,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:221908,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/179594078?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F104aab7e-cf4c-4436-824f-6e0c381b39d6_3398x998.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!diwA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F104aab7e-cf4c-4436-824f-6e0c381b39d6_3398x998.png 424w, https://substackcdn.com/image/fetch/$s_!diwA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F104aab7e-cf4c-4436-824f-6e0c381b39d6_3398x998.png 848w, https://substackcdn.com/image/fetch/$s_!diwA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F104aab7e-cf4c-4436-824f-6e0c381b39d6_3398x998.png 1272w, https://substackcdn.com/image/fetch/$s_!diwA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F104aab7e-cf4c-4436-824f-6e0c381b39d6_3398x998.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I&#8217;m using a CRON Job to automatically check the price of the stocks in my tracker list every hour.</p><p>If the price has changed (up or down) by 2%, we&#8217;ll pass the stock to the Stock Research Agent so that we can find out what caused the stock price change.</p><p><strong>Stock Research Agent</strong></p><p>This agent has the ability to search the web to find out more information on the stock&#8217;s sudden movement using the <code>WebSearchTool().</code></p><p>It is instructed to respond with a 160 character message detailing the reason behind the movement.</p><p><strong>Summariser Agent</strong></p><p>This agent is used to attempt to shorten and format the message that is going to be sent to the user. Pretty simple.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZD_9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bd0ec2-599a-4f08-bec6-3feb33df575c_1290x466.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZD_9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bd0ec2-599a-4f08-bec6-3feb33df575c_1290x466.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZD_9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bd0ec2-599a-4f08-bec6-3feb33df575c_1290x466.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZD_9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bd0ec2-599a-4f08-bec6-3feb33df575c_1290x466.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZD_9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bd0ec2-599a-4f08-bec6-3feb33df575c_1290x466.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZD_9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bd0ec2-599a-4f08-bec6-3feb33df575c_1290x466.jpeg" width="1290" height="466" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/89bd0ec2-599a-4f08-bec6-3feb33df575c_1290x466.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:466,&quot;width&quot;:1290,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:82939,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://tomshaw.substack.com/i/179594078?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bd0ec2-599a-4f08-bec6-3feb33df575c_1290x466.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZD_9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bd0ec2-599a-4f08-bec6-3feb33df575c_1290x466.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZD_9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bd0ec2-599a-4f08-bec6-3feb33df575c_1290x466.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZD_9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bd0ec2-599a-4f08-bec6-3feb33df575c_1290x466.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZD_9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bd0ec2-599a-4f08-bec6-3feb33df575c_1290x466.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Deployment &#128640;</h2><p>I&#8217;ve deployed this project onto a single ubuntu instance and configured it with a domain so that I can add it to the Twilio webhook settings. (instructions included in the GitHub repository.</p><h2>Check out the code! &#129489;&#8205;&#128187;</h2><p>This project is <strong>open-source!</strong></p><p>If you&#8217;d like to check out the code for this project, you can download the code from the public GitHub repository.</p><p><em>Please make sure you give it a star! &#11088;</em></p><p><a href="https://github.com/IAmTomShaw/stock-tracker-agent">Check it out here!</a></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tomshaw.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading about my project! Subscribe for free to receive weekly posts like this directly to your inbox!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[For the Developers who feel lost this year]]></title><description><![CDATA[How we can fall back in love with building things again]]></description><link>https://tomshaw.substack.com/p/for-the-developers-who-feel-lost</link><guid isPermaLink="false">https://tomshaw.substack.com/p/for-the-developers-who-feel-lost</guid><dc:creator><![CDATA[Tom Shaw]]></dc:creator><pubDate>Sun, 16 Nov 2025 17:21:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!zNDI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4f2d96-61b9-46a0-8558-d404fa731ac8_1080x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3>The problem.</h3><p>The past year has been the year of many things. AI Agents. AI Automation. No Code Tools. </p><p>But there&#8217;s one thing that is definitely true&#8230; Developers don&#8217;t recognise this place anymore.</p><p>I know I&#8217;m not the only one who feels like this. Sometimes it really does feel like working in tech is becoming more like a rat race every day.</p><p>The constant need to keep up with the new technologies and stay up to date with the latest tools.</p><blockquote><p><em>We thought it was hard when new JS frameworks were being released every month, try listening to a new company bang on about their &#8220;game-changing AI&#8221; which is just an LLM call every single day.</em></p></blockquote><p></p><h3>We shouldn&#8217;t feel like this.</h3><p>The thing is, we shouldn&#8217;t feel like this, and I don&#8217;t actually think the problem is as bad as it seems.</p><p>All day every day, we&#8217;re being told that the job market is tough, AI is replacing programmers, it feels like constant negativity.</p><blockquote><p><em><strong>Unfortunately, negativity generates clicks.</strong></em></p></blockquote><p>Positivity doesn&#8217;t really have the same scroll stopping effect. Clicks = Ad views. Ad views = revenue. <em>It&#8217;s a shame, but it&#8217;s true.</em></p><p>The reality is that the world of software development has changed, not as much as we think, but it has definitely changed. As developers we do need to figure out how to adapt, in the same way that we all did when we first started learning to code.</p><p></p><h3>Falling out of love with coding.</h3><p>I&#8217;m sure that computers (the profession - people who computed numbers) felt exactly the same when computers (the technology) came along, but actually, early computing machines needed people who understood mathematics and large-scale calculation workflows. </p><p>Anyone who&#8217;s met a vibe coder knows that using an AI coding assistant without having any coding knowledge usually results in either a poor quality product or a security issue.</p><blockquote><p>I think a lot of this is just mental, at least in my head anyway. And it&#8217;s caused many of us to fall out of love with building things.</p></blockquote><p></p><h3>The Path Back to Loving Tech.</h3><p>So how do we fall in love with this industry?</p><p>This answer will be different for some of you, but for me, I&#8217;m revisiting what first got me interested in learning to code (building things that make me think &#8220;Wow that&#8217;s cool&#8221; and &#8220;Wow I built that&#8221;).</p><p>Sounds lovely Tom&#8230; But practically, what does that mean?<br></p><p>It means:</p><ul><li><p><strong>Tinkering with things for fun</strong>, not with the intention of making a profit</p></li><li><p><strong>Exploring new tools</strong> because they just might make my life easier or give me an idea</p></li><li><p><strong>Sharing my projects</strong> to hopefully receive positive feedback from other people</p></li><li><p><strong>Building</strong> for the sake of building</p></li></ul><p></p><p>I&#8217;m going on a bit here. My point is that you need to go back to your roots, understand why you started in the first place.</p><p></p><h3>2026 and beyond.</h3><p>So I don&#8217;t think the year 2026 will be the year of AGI. It&#8217;ll be the year developers remember why we started building things in the first place. Not for productivity. Not for hype.</p><p>For curiosity. For joy. For the magic of turning an idea into something real.</p>]]></content:encoded></item></channel></rss>