<?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[Techtrails]]></title><description><![CDATA[The journal of my digital wanderings, with a focus on my build-in-public journey.]]></description><link>https://techtrails.io</link><image><url>https://substackcdn.com/image/fetch/$s_!mOPI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff90053d7-5b39-470b-9019-37ce873bc8d9_512x512.png</url><title>Techtrails</title><link>https://techtrails.io</link></image><generator>Substack</generator><lastBuildDate>Mon, 06 Apr 2026 08:27:05 GMT</lastBuildDate><atom:link href="https://techtrails.io/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Olivier Lance]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[techtrails@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[techtrails@substack.com]]></itunes:email><itunes:name><![CDATA[Olivier Lance]]></itunes:name></itunes:owner><itunes:author><![CDATA[Olivier Lance]]></itunes:author><googleplay:owner><![CDATA[techtrails@substack.com]]></googleplay:owner><googleplay:email><![CDATA[techtrails@substack.com]]></googleplay:email><googleplay:author><![CDATA[Olivier Lance]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Down the Kamal rabbit holes]]></title><description><![CDATA[Multi-arch builds, GitHub Container Registry, custom TLS certificate, conflicts with foreman, ...]]></description><link>https://techtrails.io/p/down-the-kamal-rabbit-holes</link><guid isPermaLink="false">https://techtrails.io/p/down-the-kamal-rabbit-holes</guid><dc:creator><![CDATA[Olivier Lance]]></dc:creator><pubDate>Thu, 19 Sep 2024 23:18:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!eXP4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19cd969-fcb7-45b1-aaa7-a7480b7ce56f_4608x2560.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eXP4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19cd969-fcb7-45b1-aaa7-a7480b7ce56f_4608x2560.png" data-component-name="Image2ToDOM"><div class="image2-inset image2-full-screen"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eXP4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19cd969-fcb7-45b1-aaa7-a7480b7ce56f_4608x2560.png 424w, https://substackcdn.com/image/fetch/$s_!eXP4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19cd969-fcb7-45b1-aaa7-a7480b7ce56f_4608x2560.png 848w, https://substackcdn.com/image/fetch/$s_!eXP4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19cd969-fcb7-45b1-aaa7-a7480b7ce56f_4608x2560.png 1272w, https://substackcdn.com/image/fetch/$s_!eXP4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19cd969-fcb7-45b1-aaa7-a7480b7ce56f_4608x2560.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eXP4!,w_5760,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19cd969-fcb7-45b1-aaa7-a7480b7ce56f_4608x2560.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f19cd969-fcb7-45b1-aaa7-a7480b7ce56f_4608x2560.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;full&quot;,&quot;height&quot;:809,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8544040,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-fullscreen" alt="" srcset="https://substackcdn.com/image/fetch/$s_!eXP4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19cd969-fcb7-45b1-aaa7-a7480b7ce56f_4608x2560.png 424w, https://substackcdn.com/image/fetch/$s_!eXP4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19cd969-fcb7-45b1-aaa7-a7480b7ce56f_4608x2560.png 848w, https://substackcdn.com/image/fetch/$s_!eXP4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19cd969-fcb7-45b1-aaa7-a7480b7ce56f_4608x2560.png 1272w, https://substackcdn.com/image/fetch/$s_!eXP4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19cd969-fcb7-45b1-aaa7-a7480b7ce56f_4608x2560.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><div class="pullquote"><p>This is a post from my Tech Journal section, in which I explore technical topics and focus on how I overcome specific challenges.<br>If you're not into the tech stuff, you can unsubscribe from Tech Journal updates from <a href="https://techtrails.io/account">your account</a>.</p></div><p>OK, the title might be a bit &#8220;click-baity&#8221; &#128517;</p><p>The truth is, Kamal is super cool to setup!<br>I have never deployed an app from scratch so quickly.</p><p>I did end up spending time into 4 rabbit holes though, so I wanted to keep notes about what happened and how to overcome the issues I faced.</p><p>You know, just in case.</p><h1>Multi-arch build issues</h1><p>The first issue I encountered was somewhat of a tricky one, although the fix was simple in the end.</p><p>It's always like this, isn't it? &#128517;</p><p>After I setup Kamal for my project, I ran <code>kamal server bootstrap</code> followed by <code>kamal deploy</code>, as instructed.</p><p>Colorful logs started flowing on my screen and I sat back, amazed by the simplicity of it all.</p><p>The Docker build process started. Along came the bundling step, and gem names came trickling down the terminal.</p><p>And then, it hung. For a few minutes.<br>I thought it must be doing something big, and it was late, so I went to bed.</p><p>The next morning, it was still stuck on the same thing:</p><pre><code> DEBUG [0729c69a] &#9;#29 668.9 Bundled gems are installed into `/usr/local/bundle`
 DEBUG [0729c69a] &#9;#29 668.9 Post-install message from rubyzip:
 DEBUG [0729c69a] &#9;#29 668.9 RubyZip 3.0 is coming!
 DEBUG [0729c69a] &#9;#29 668.9 **********************
 DEBUG [0729c69a] &#9;#29 668.9 
 DEBUG [0729c69a] &#9;#29 668.9 The public API of some Rubyzip classes has been modernized to use named
 DEBUG [0729c69a] &#9;#29 668.9 parameters for optional arguments. Please check your usage of the
 DEBUG [0729c69a] &#9;#29 668.9 following classes:
 DEBUG [0729c69a] &#9;#29 668.9   * `Zip::File`
 DEBUG [0729c69a] &#9;#29 668.9   * `Zip::Entry`
 DEBUG [0729c69a] &#9;#29 668.9   * `Zip::InputStream`
 DEBUG [0729c69a] &#9;#29 668.9   * `Zip::OutputStream`
 DEBUG [0729c69a] &#9;#29 668.9 
 DEBUG [0729c69a] &#9;#29 668.9 Please ensure that your Gemfiles and .gemspecs are suitably restrictive
 DEBUG [0729c69a] &#9;#29 668.9 to avoid an unexpected breakage when 3.0 is released (e.g. ~&gt; 2.3.0).
 DEBUG [0729c69a] &#9;#29 668.9 See https://github.com/rubyzip/rubyzip for details. The Changelog also
 DEBUG [0729c69a] &#9;#29 668.9 lists other enhancements and bugfixes that have been implemented since
 DEBUG [0729c69a] &#9;#29 668.9 version 2.3.0.</code></pre><p>A second run led to the same issue.</p><p>So I started searching, and found a few threads about the problem. The one that led me to a solution is Discussion #747 on Kamal&#8217;s repository: <a href="https://github.com/basecamp/kamal/discussions/747">Deploy stucks on message about RubyZip 3.0 coming</a>.<br>Someone in there hints at the issue coming from Kamal building a cross-platform Docker image by default, targeted for both AMD64 (Intel/x86-64 compatible processors) and ARM64 (ARM architectures such as Ampere processors).<br>Apparently building for ARM64 from an Intel CPU tends to fail and hang, at least on a Mac.</p><p>Since I am building on an Intel Mac but also for an x86-64 server, I don't need to build for ARM. So I disabled the ARM build, and everything went smoothly after that!</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!c1s9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4dc6094-60a3-4659-92da-b82749a7af40_1442x342.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!c1s9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4dc6094-60a3-4659-92da-b82749a7af40_1442x342.png 424w, https://substackcdn.com/image/fetch/$s_!c1s9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4dc6094-60a3-4659-92da-b82749a7af40_1442x342.png 848w, https://substackcdn.com/image/fetch/$s_!c1s9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4dc6094-60a3-4659-92da-b82749a7af40_1442x342.png 1272w, https://substackcdn.com/image/fetch/$s_!c1s9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4dc6094-60a3-4659-92da-b82749a7af40_1442x342.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!c1s9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4dc6094-60a3-4659-92da-b82749a7af40_1442x342.png" width="1442" height="342" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c4dc6094-60a3-4659-92da-b82749a7af40_1442x342.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:342,&quot;width&quot;:1442,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:35953,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!c1s9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4dc6094-60a3-4659-92da-b82749a7af40_1442x342.png 424w, https://substackcdn.com/image/fetch/$s_!c1s9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4dc6094-60a3-4659-92da-b82749a7af40_1442x342.png 848w, https://substackcdn.com/image/fetch/$s_!c1s9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4dc6094-60a3-4659-92da-b82749a7af40_1442x342.png 1272w, https://substackcdn.com/image/fetch/$s_!c1s9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4dc6094-60a3-4659-92da-b82749a7af40_1442x342.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Everything?<br>Well, not exactly.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/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">Is the suspense killing you? Subscribe for more tech adventures! &#128513;</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><h1>Using GHCR as Docker registry</h1><p>As hinted above, Kamal uses Docker to build an app &#8220;artifact&#8221; and deploy it onto your servers. In the process, it needs to push the locally built image to a container registry, from which it can pull it again for deployment from your servers.</p><p>Since I'm using GitHub to host my code, I wanted to keep things simple and use their Container Registry feature as well, instead of Docker Hub.</p><p>It's pretty straightforward to setup Kamal for this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Sbbc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f4d9e39-f22d-4f36-9c1a-caf52b61928f_1442x442.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Sbbc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f4d9e39-f22d-4f36-9c1a-caf52b61928f_1442x442.png 424w, https://substackcdn.com/image/fetch/$s_!Sbbc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f4d9e39-f22d-4f36-9c1a-caf52b61928f_1442x442.png 848w, https://substackcdn.com/image/fetch/$s_!Sbbc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f4d9e39-f22d-4f36-9c1a-caf52b61928f_1442x442.png 1272w, https://substackcdn.com/image/fetch/$s_!Sbbc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f4d9e39-f22d-4f36-9c1a-caf52b61928f_1442x442.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Sbbc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f4d9e39-f22d-4f36-9c1a-caf52b61928f_1442x442.png" width="1442" height="442" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2f4d9e39-f22d-4f36-9c1a-caf52b61928f_1442x442.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:442,&quot;width&quot;:1442,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:71929,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Sbbc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f4d9e39-f22d-4f36-9c1a-caf52b61928f_1442x442.png 424w, https://substackcdn.com/image/fetch/$s_!Sbbc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f4d9e39-f22d-4f36-9c1a-caf52b61928f_1442x442.png 848w, https://substackcdn.com/image/fetch/$s_!Sbbc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f4d9e39-f22d-4f36-9c1a-caf52b61928f_1442x442.png 1272w, https://substackcdn.com/image/fetch/$s_!Sbbc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f4d9e39-f22d-4f36-9c1a-caf52b61928f_1442x442.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 <code>KAMAL_REGISTRY_PASSWORD</code> comes from your <em>.env</em> file at the root of your project.<br>For things to work with GitHub Container Registry, you have to use <a href="https://github.com/settings/tokens/new">a new Classic Personal Access Token</a> (PAT) as your password.</p><p>I did this, but unfortunately it did not work immediately: as soon as Kamal tried to push the built image, it failed with an error:</p><pre><code>Error: unexpected status from POST request to https://ghcr.io/v2/techtrails/real-emails/blobs/uploads/: 403 Forbidden</code></pre><p>Kamal does manage to log into the registry as its first step, so the error was a bit unsettling: why could it log in, but not push an image to my repository registry?</p><p>Since I'm not pushing to my user GitHub (<a href="https://github.com/olance">https://github.com/olance</a>) but to my Techtrails organization (<a href="https://github.com/techtrails-io">https://github.com/techtrails-io</a>), I thought it might be an issue with my PAT and the rights it had to push to my org.</p><p>I spent a lot of time trying different tokens and tweaking settings on GitHub.<br>To no avail.</p><p>The 403 error really misled me into looking for token issues, but it was actually much simpler: as you might have noticed, I was pushing to <code>techtrails/real-emails</code>, whereas my GitHub org name is <code>techtrails-io</code>.</p><p>Yeah, <code>techtrails</code> was already taken :(</p><p>Kamal generates the push URL from the <code>image</code> setting in the <em>deploy.yml</em> file:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Y7PI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc60d9432-5e36-4e90-95fb-b6cb24b8fc52_1442x306.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Y7PI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc60d9432-5e36-4e90-95fb-b6cb24b8fc52_1442x306.png 424w, https://substackcdn.com/image/fetch/$s_!Y7PI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc60d9432-5e36-4e90-95fb-b6cb24b8fc52_1442x306.png 848w, https://substackcdn.com/image/fetch/$s_!Y7PI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc60d9432-5e36-4e90-95fb-b6cb24b8fc52_1442x306.png 1272w, https://substackcdn.com/image/fetch/$s_!Y7PI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc60d9432-5e36-4e90-95fb-b6cb24b8fc52_1442x306.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Y7PI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc60d9432-5e36-4e90-95fb-b6cb24b8fc52_1442x306.png" width="1442" height="306" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c60d9432-5e36-4e90-95fb-b6cb24b8fc52_1442x306.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:306,&quot;width&quot;:1442,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:42389,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Y7PI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc60d9432-5e36-4e90-95fb-b6cb24b8fc52_1442x306.png 424w, https://substackcdn.com/image/fetch/$s_!Y7PI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc60d9432-5e36-4e90-95fb-b6cb24b8fc52_1442x306.png 848w, https://substackcdn.com/image/fetch/$s_!Y7PI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc60d9432-5e36-4e90-95fb-b6cb24b8fc52_1442x306.png 1272w, https://substackcdn.com/image/fetch/$s_!Y7PI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc60d9432-5e36-4e90-95fb-b6cb24b8fc52_1442x306.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>So I changed <code>techtrails</code> into <code>techtrails-io</code>, and it worked!</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!s86K!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4c221c3-0d5d-48b6-93ae-556892711aed_1442x298.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!s86K!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4c221c3-0d5d-48b6-93ae-556892711aed_1442x298.png 424w, https://substackcdn.com/image/fetch/$s_!s86K!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4c221c3-0d5d-48b6-93ae-556892711aed_1442x298.png 848w, https://substackcdn.com/image/fetch/$s_!s86K!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4c221c3-0d5d-48b6-93ae-556892711aed_1442x298.png 1272w, https://substackcdn.com/image/fetch/$s_!s86K!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4c221c3-0d5d-48b6-93ae-556892711aed_1442x298.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!s86K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4c221c3-0d5d-48b6-93ae-556892711aed_1442x298.png" width="1442" height="298" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a4c221c3-0d5d-48b6-93ae-556892711aed_1442x298.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:298,&quot;width&quot;:1442,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:42884,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!s86K!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4c221c3-0d5d-48b6-93ae-556892711aed_1442x298.png 424w, https://substackcdn.com/image/fetch/$s_!s86K!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4c221c3-0d5d-48b6-93ae-556892711aed_1442x298.png 848w, https://substackcdn.com/image/fetch/$s_!s86K!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4c221c3-0d5d-48b6-93ae-556892711aed_1442x298.png 1272w, https://substackcdn.com/image/fetch/$s_!s86K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4c221c3-0d5d-48b6-93ae-556892711aed_1442x298.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://techtrails.io/subscribe?"><span>Subscribe now</span></a></p><h1>TLS and CloudFlare</h1><p>At this point, I had my app successfully deployed to <a href="https://real-emails.com">real-emails.com</a>.<br>It's there, you can check!</p><p>There were a few things, SSL/TLS-wise, that were not 100% satisfying.</p><h2>TLS termination point &amp; redirection loop</h2><p>I'm using CloudFlare as my DNS server, taking advantage of their Proxy feature that serves my site through their own infrastructure, allowing them to cache content at the edge, detect DDoS attacks, etc.</p><p>They also provide automated TLS certificates out-of-the-box, which is great.<br>To make this simple for everyone, the way it works is that their servers act as a TLS termination point:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gH4M!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e8d07c-2770-4c62-b0dd-a4f18eb6d80e_1002x292.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gH4M!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e8d07c-2770-4c62-b0dd-a4f18eb6d80e_1002x292.png 424w, https://substackcdn.com/image/fetch/$s_!gH4M!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e8d07c-2770-4c62-b0dd-a4f18eb6d80e_1002x292.png 848w, https://substackcdn.com/image/fetch/$s_!gH4M!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e8d07c-2770-4c62-b0dd-a4f18eb6d80e_1002x292.png 1272w, https://substackcdn.com/image/fetch/$s_!gH4M!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e8d07c-2770-4c62-b0dd-a4f18eb6d80e_1002x292.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gH4M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e8d07c-2770-4c62-b0dd-a4f18eb6d80e_1002x292.png" width="1002" height="292" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b7e8d07c-2770-4c62-b0dd-a4f18eb6d80e_1002x292.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:292,&quot;width&quot;:1002,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:29316,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gH4M!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e8d07c-2770-4c62-b0dd-a4f18eb6d80e_1002x292.png 424w, https://substackcdn.com/image/fetch/$s_!gH4M!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e8d07c-2770-4c62-b0dd-a4f18eb6d80e_1002x292.png 848w, https://substackcdn.com/image/fetch/$s_!gH4M!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e8d07c-2770-4c62-b0dd-a4f18eb6d80e_1002x292.png 1272w, https://substackcdn.com/image/fetch/$s_!gH4M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e8d07c-2770-4c62-b0dd-a4f18eb6d80e_1002x292.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 illustrated above, a request coming from a client will be encrypted only between the browser and CloudFlare&#8217;s servers. CloudFlare relays the request to my servers in plain HTTP, without TLS encryption.</p><p>With a Rails application, what this causes when you load your website is an redirection loop, because Rails is configured to force SSL connections by default:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HniB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0fdab3d-d414-476b-a25b-29de34dc46a1_1442x410.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HniB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0fdab3d-d414-476b-a25b-29de34dc46a1_1442x410.png 424w, https://substackcdn.com/image/fetch/$s_!HniB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0fdab3d-d414-476b-a25b-29de34dc46a1_1442x410.png 848w, https://substackcdn.com/image/fetch/$s_!HniB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0fdab3d-d414-476b-a25b-29de34dc46a1_1442x410.png 1272w, https://substackcdn.com/image/fetch/$s_!HniB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0fdab3d-d414-476b-a25b-29de34dc46a1_1442x410.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HniB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0fdab3d-d414-476b-a25b-29de34dc46a1_1442x410.png" width="728" height="206.9902912621359" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c0fdab3d-d414-476b-a25b-29de34dc46a1_1442x410.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:410,&quot;width&quot;:1442,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:66989,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!HniB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0fdab3d-d414-476b-a25b-29de34dc46a1_1442x410.png 424w, https://substackcdn.com/image/fetch/$s_!HniB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0fdab3d-d414-476b-a25b-29de34dc46a1_1442x410.png 848w, https://substackcdn.com/image/fetch/$s_!HniB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0fdab3d-d414-476b-a25b-29de34dc46a1_1442x410.png 1272w, https://substackcdn.com/image/fetch/$s_!HniB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0fdab3d-d414-476b-a25b-29de34dc46a1_1442x410.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>So when CloudFlare relays the browser&#8217;s request to Rails as an HTTP request, Rails responds with an HTTP Redirect from http://real-emails.com to https://real-emails.com.<br>This triggers a reloading of the HTTPS URL by the browser, which again is responded to with a redirect&#8230; and thus the loop begins.</p><p>My first fix to this issue was to turn <code>config.force_ssl</code> to <code>false</code>. Easy!</p><p>This, however, feels hacky and suboptimal. Plus it caused another issue that I forgot to note down.<br>And, I do want end-to-end encryption between the browser and my server.</p><p>So what I really want is &#8230;</p><h2>CloudFlare &#8220;Full (strict)&#8221; encryption mode</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8Bt4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1e07f54-e0eb-4d67-9d82-780bd7d33a06_1028x292.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8Bt4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1e07f54-e0eb-4d67-9d82-780bd7d33a06_1028x292.png 424w, https://substackcdn.com/image/fetch/$s_!8Bt4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1e07f54-e0eb-4d67-9d82-780bd7d33a06_1028x292.png 848w, https://substackcdn.com/image/fetch/$s_!8Bt4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1e07f54-e0eb-4d67-9d82-780bd7d33a06_1028x292.png 1272w, https://substackcdn.com/image/fetch/$s_!8Bt4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1e07f54-e0eb-4d67-9d82-780bd7d33a06_1028x292.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8Bt4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1e07f54-e0eb-4d67-9d82-780bd7d33a06_1028x292.png" width="1028" height="292" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d1e07f54-e0eb-4d67-9d82-780bd7d33a06_1028x292.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:292,&quot;width&quot;:1028,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:31302,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8Bt4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1e07f54-e0eb-4d67-9d82-780bd7d33a06_1028x292.png 424w, https://substackcdn.com/image/fetch/$s_!8Bt4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1e07f54-e0eb-4d67-9d82-780bd7d33a06_1028x292.png 848w, https://substackcdn.com/image/fetch/$s_!8Bt4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1e07f54-e0eb-4d67-9d82-780bd7d33a06_1028x292.png 1272w, https://substackcdn.com/image/fetch/$s_!8Bt4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1e07f54-e0eb-4d67-9d82-780bd7d33a06_1028x292.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>In this mode, you get end-to-end encryption <em>and</em> a certificate provided by CloudFlare that allows them to certify they're talking to your origin server.</p><p>I think I'll write a specific tutorial to configure Kamal for this setup, but here&#8217;s the gist of it:</p><ul><li><p>Store CloudFlare certificate on your server</p></li><li><p>Declare a Docker volume for the Traefik service to get access to this certificate and am accompanying TLS config file</p></li><li><p>Configure a TLS entryPoint on Traefik and route it to your app&#8217;s service</p></li></ul><p><a href="https://traefik.io/">Traefik</a> is the reverse proxy Kamal is built upon to route requests to your application. In CloudFlare&#8217;s Full (strict or not) encryption mode, it's Traefik that becomes the TLS termination point, right before Rails serves your app.</p><p>So what you have to do, as outlined above, is just to provide it with the right TLS certificate and be done.<br>It&#8217;s even easier if you don't aim for strict mode (but I thought, let's go all the way!) since Traefik can provision certificates for you with Let's Encrypt.</p><p>Anyway. The simple yet terrible mistake I made here is that &#8220;Traefik&#8221; is simply the phonetics transcription of &#8220;traffic&#8221;, and some muscle memory at some point made me write &#8220;traefi<strong>c</strong>&#8221; in the Docker volume name configuration &#129318;&#8205;&#9794;&#65039;</p><p>Only after I left the broken site for a night and came back to it with fresh eyes and a thorough review of Traefik logs (which only indicated it hadn't found any certificate) did I understand my mistake.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/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">Get those tech insights and tutorials right into your inbox: subscribe!</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><h1>Bonus: conflict with foreman</h1><p>As an added bonus, I finally faced a seemingly unrelated issue when I got back to developing locally.</p><p>Since I'm using TailwindCSS, I have the cssbundling gem installed to rebuild my styles as I add new Tailwind classes to my templates.<br>This is handled by a separate process, so I'm using the provided <code>bin/dev</code> command instead of running <code>rails server</code>.</p><p><code>bin/dev</code> is provided by the gem, and simply uses <a href="https://github.com/ddollar/foreman">foreman</a> to run both <code>rails server</code> and <code>rails tailwindcss:watch</code> in parallel.</p><p>What happened after I had completed my Kamal setup, is that:</p><ul><li><p>running <code>rails server</code> would work just fine</p></li><li><p>running <code>bin/dev</code> would see the <code>rails server</code> process fail with an error: <code>ActiveSupport::MessageEncryptor::InvalidMessage</code></p></li></ul><p>This error generally occurs when Rails, upon booting, is not able to decrypt the <em>credentials.yml.enc</em> file that contains the <code>secret_base</code> token and other credentials you might have stored there.</p><p>It made no sense though, that it would work when run alone and fail when run through foreman.</p><p>To figure out what was going on, I edited Rails core files to place a debugger instruction right before the code that would throw the <code>ActiveSupport::MessageEncryptor::InvalidMessage</code> exception.</p><p>This allowed me to run rdbg (a command-line Ruby debugger) and attach to the process, which in turn let me inspect live variables content and see what the process was dealing with when crashing.</p><p>This is the code I dove into:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!czY2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13a1e978-ec65-43da-a8cb-8b9042dfc629_1594x1632.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!czY2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13a1e978-ec65-43da-a8cb-8b9042dfc629_1594x1632.png 424w, https://substackcdn.com/image/fetch/$s_!czY2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13a1e978-ec65-43da-a8cb-8b9042dfc629_1594x1632.png 848w, https://substackcdn.com/image/fetch/$s_!czY2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13a1e978-ec65-43da-a8cb-8b9042dfc629_1594x1632.png 1272w, https://substackcdn.com/image/fetch/$s_!czY2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13a1e978-ec65-43da-a8cb-8b9042dfc629_1594x1632.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!czY2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13a1e978-ec65-43da-a8cb-8b9042dfc629_1594x1632.png" width="1456" height="1491" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/13a1e978-ec65-43da-a8cb-8b9042dfc629_1594x1632.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1491,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:343042,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!czY2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13a1e978-ec65-43da-a8cb-8b9042dfc629_1594x1632.png 424w, https://substackcdn.com/image/fetch/$s_!czY2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13a1e978-ec65-43da-a8cb-8b9042dfc629_1594x1632.png 848w, https://substackcdn.com/image/fetch/$s_!czY2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13a1e978-ec65-43da-a8cb-8b9042dfc629_1594x1632.png 1272w, https://substackcdn.com/image/fetch/$s_!czY2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13a1e978-ec65-43da-a8cb-8b9042dfc629_1594x1632.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>From <code>decrypt_and_verify</code>, in which the first <code>catch_and_raise</code> method was the one ultimately causing the crash, I could verify that the <code>message</code> argument contained the encrypted content of my development <em>credentials.yml.enc</em> file.<br>As I would expect in this context.</p><p>Later on, the <code>read_message</code> call leads to the <code>decrypt</code> method.<br>In there, I inspected the <code>@secret</code> instance variable, and found that it contained my <em><strong>production</strong></em> encryption key.</p><p>No surprise it couldn't correctly decrypt the file!</p><p>Now the question was: how did Rails, started in development mode, was picking up the production key instead of the development one?</p><p>After some thinking and digging, I inspected the content of <code>ENV["RAILS_MASTER_KEY&#8220;]</code>, which is one way for Rails to get the decryption key.<br>It was indeed set to the production key.</p><p>That's when I realized what was going on:</p><ul><li><p><strong>One one hand:</strong><br>When initializing Kamal, it creates a <em>.env</em> file into which you can provide environment variables for your deployment.<br>If you recall from the beginning of this article, this is where the <code>KAMAL_REGISTRY_PASSWORD</code> value comes from.<br><br>The other value that you <em>need</em> to put there, is the <code>RAILS_MASTER_KEY</code> encryption key, so that Kamal can set it on the deployed container for Rails to boot correctly.</p></li><li><p><strong>On the other hand:<br></strong>Foreman, used in the <code>bin/dev</code> script, will by default load environment variables for the spawned processes from any <em>.env</em> file it can find in its working directory.<br>So it picks up the one from Kamal, and &#8220;corrupts&#8221; your local process with environment variables meant for production.</p></li></ul><p>It's hard to tell whether Kamal or Foreman is at fault here, but once I understood the issue I quickly found a PR on GitHub that addressed the problem: <a href="https://github.com/rails/cssbundling-rails/pull/155">Disable loading .env file when running foreman for development</a>.</p><p>Simply tell foreman to load environment variables from <em>/dev/null</em> (or another arbitrary file if needed) in the <code>bin/dev</code> script:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4OTb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbc5b690-bfee-4cad-ac87-087d9906e2bd_864x88.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4OTb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbc5b690-bfee-4cad-ac87-087d9906e2bd_864x88.png 424w, https://substackcdn.com/image/fetch/$s_!4OTb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbc5b690-bfee-4cad-ac87-087d9906e2bd_864x88.png 848w, https://substackcdn.com/image/fetch/$s_!4OTb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbc5b690-bfee-4cad-ac87-087d9906e2bd_864x88.png 1272w, https://substackcdn.com/image/fetch/$s_!4OTb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbc5b690-bfee-4cad-ac87-087d9906e2bd_864x88.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4OTb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbc5b690-bfee-4cad-ac87-087d9906e2bd_864x88.png" width="864" height="88" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bbc5b690-bfee-4cad-ac87-087d9906e2bd_864x88.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:88,&quot;width&quot;:864,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:16420,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4OTb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbc5b690-bfee-4cad-ac87-087d9906e2bd_864x88.png 424w, https://substackcdn.com/image/fetch/$s_!4OTb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbc5b690-bfee-4cad-ac87-087d9906e2bd_864x88.png 848w, https://substackcdn.com/image/fetch/$s_!4OTb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbc5b690-bfee-4cad-ac87-087d9906e2bd_864x88.png 1272w, https://substackcdn.com/image/fetch/$s_!4OTb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbc5b690-bfee-4cad-ac87-087d9906e2bd_864x88.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h1>The end.</h1><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/p/down-the-kamal-rabbit-holes?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading it all! If you liked this post, please share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/p/down-the-kamal-rabbit-holes?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://techtrails.io/p/down-the-kamal-rabbit-holes?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div>]]></content:encoded></item><item><title><![CDATA[Real-emails.com Series #3 – Not live 😬]]></title><description><![CDATA[Lessons learned from a failed deadline.]]></description><link>https://techtrails.io/p/real-emailscom-series-3-not-live</link><guid isPermaLink="false">https://techtrails.io/p/real-emailscom-series-3-not-live</guid><dc:creator><![CDATA[Olivier Lance]]></dc:creator><pubDate>Thu, 05 Sep 2024 10:10:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!mtWz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87f197b-1720-43f6-9056-51fef06c8e65_4608x2560.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mtWz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87f197b-1720-43f6-9056-51fef06c8e65_4608x2560.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset image2-full-screen"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mtWz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87f197b-1720-43f6-9056-51fef06c8e65_4608x2560.jpeg 424w, https://substackcdn.com/image/fetch/$s_!mtWz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87f197b-1720-43f6-9056-51fef06c8e65_4608x2560.jpeg 848w, https://substackcdn.com/image/fetch/$s_!mtWz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87f197b-1720-43f6-9056-51fef06c8e65_4608x2560.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!mtWz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87f197b-1720-43f6-9056-51fef06c8e65_4608x2560.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mtWz!,w_5760,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87f197b-1720-43f6-9056-51fef06c8e65_4608x2560.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f87f197b-1720-43f6-9056-51fef06c8e65_4608x2560.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;full&quot;,&quot;height&quot;:809,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1652474,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-fullscreen" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mtWz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87f197b-1720-43f6-9056-51fef06c8e65_4608x2560.jpeg 424w, https://substackcdn.com/image/fetch/$s_!mtWz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87f197b-1720-43f6-9056-51fef06c8e65_4608x2560.jpeg 848w, https://substackcdn.com/image/fetch/$s_!mtWz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87f197b-1720-43f6-9056-51fef06c8e65_4608x2560.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!mtWz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87f197b-1720-43f6-9056-51fef06c8e65_4608x2560.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><h1>Failures</h1><p>It's early morning on Thursday where I live, and this is what real-emails.com still looks like online: </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KHYv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccfc961b-f9d4-4888-aa45-95be3bd9e4a1_1350x868.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KHYv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccfc961b-f9d4-4888-aa45-95be3bd9e4a1_1350x868.png 424w, https://substackcdn.com/image/fetch/$s_!KHYv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccfc961b-f9d4-4888-aa45-95be3bd9e4a1_1350x868.png 848w, https://substackcdn.com/image/fetch/$s_!KHYv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccfc961b-f9d4-4888-aa45-95be3bd9e4a1_1350x868.png 1272w, https://substackcdn.com/image/fetch/$s_!KHYv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccfc961b-f9d4-4888-aa45-95be3bd9e4a1_1350x868.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KHYv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccfc961b-f9d4-4888-aa45-95be3bd9e4a1_1350x868.png" width="1350" height="868" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ccfc961b-f9d4-4888-aa45-95be3bd9e4a1_1350x868.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:868,&quot;width&quot;:1350,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:86391,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!KHYv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccfc961b-f9d4-4888-aa45-95be3bd9e4a1_1350x868.png 424w, https://substackcdn.com/image/fetch/$s_!KHYv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccfc961b-f9d4-4888-aa45-95be3bd9e4a1_1350x868.png 848w, https://substackcdn.com/image/fetch/$s_!KHYv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccfc961b-f9d4-4888-aa45-95be3bd9e4a1_1350x868.png 1272w, https://substackcdn.com/image/fetch/$s_!KHYv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccfc961b-f9d4-4888-aa45-95be3bd9e4a1_1350x868.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>And here's my current status:</p><ul><li><p><strong>Friday:</strong></p><ul><li><p>&#9989; Project setup</p></li><li><p>&#9989;  User registration &amp; authentication</p></li><li><p>&#9989; API service with API key authentication</p></li><li><p>&#9989; Endpoints specifications</p><ul><li><p>&#128048; Studied existing APIs with the same purpose, such as check-mail.org or Mailjet&#8217;s validation API.a</p></li></ul></li></ul></li><li><p><strong>Sunday:</strong></p><ul><li><p>&#10060; Blocklist matching implementation</p><ul><li><p>&#128048; Spent some time exploring existing blocklists and their sources, documenting myself on risky domains &amp; spam detection, etc.</p></li></ul></li><li><p>&#10060; Dynamic checks &amp; results caching</p></li></ul></li><li><p><strong>Monday:</strong></p><ul><li><p>&#10060; Payment setup &amp; implementation</p></li></ul></li><li><p><strong>Tuesday:</strong></p><ul><li><p>&#10060; Server provisioning</p></li><li><p>&#10060; real-emails.com domain configuration</p></li><li><p>&#10060; Deployment preparation</p></li></ul></li><li><p><strong>Wednesday:</strong></p><ul><li><p>&#10060; Production deployment</p></li><li><p>&#10060; Live tests</p></li></ul></li></ul><p>I have barely done more than what I thought I could achieve on Friday evening.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/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">Subscribe if you want to continue reading me fail forward :)</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>On top of that, I wanted to post daily <a href="https://x.com/olance">on X</a>, but I haven't sent a single message besides the project announcement.</p><p>All in all, it's not brilliant.</p><p>But I can't say I'm disappointed with myself, though, and here&#8217;s why:</p><h1>Learnings</h1><p>A few months ago, I set out to join the Indie Hackers movement and &#8220;build in public&#8221;.</p><p>In my very first post, I wrote:</p><blockquote><p>My objective: personal fulfilment and financial autonomy.<br>But to be honest, I have no idea where this will take me.</p><p>What I do know is that it took me a long time to dare, and that I will learn many things along the way. Through failures and successes alike.</p></blockquote><p>This small project with a short deadline is probably the best choice I could have made to put myself into learning mode.<br></p><p>Why? Because <strong>a short-term goal is much more motivating.</strong></p><p>I still like Speakerine&#8217;s idea, but it is a larger project that I can only finish in a longer time frame.<br>Pivoting to a smaller project and imposing a short deadline gave me much more valuable information on:</p><p><strong>&#127919; How well can I focus on delivering what's needed and forget the rest?<br></strong>It starts with framing the idea and giving yourself precise objectives. I think I did this part well enough.</p><p>However, I do tend to lose focus while I work and start exploring adjacent topics, or things I think &#8220;would be nice if the project works&#8221;.<br>Well, get it to work first!<br></p><p><strong>&#128104;&#127996;&#8205;&#128187; How efficient am I when it comes to coding?<br></strong>Clearly, the last few years of not coding at all and the last decade+ of not coding with Ruby/Rails have made me rusty.<br>And I did try to learn Rust, but that's not what I mean &#128517;<br><br>Whatever I build at the moment requires some back-and-forth between my code and the docs or between my editor and my browser to test things out.<br><br>The last few days have made me more confident, and I can feel that I'm catching up on things I once mastered, but I'm still feeling quite slow.<br>I also tend to overthink my code &amp; architecture, so I'm trying to stick to the YAGNI principle: <em>You Ain't Gonna Need it!</em><br><br>Hopefully, I'll get back to better speeds soon!<br></p><p>&#128104;&#8205;&#128105;&#8205;&#128102;&#8205;&#128102; <strong>How much time &amp; energy can I dedicate to this?<br></strong>This is maybe the biggest thing: I have a regular job and a family.<br>When I return home from work, my top priority is not, and should not be, my indie projects.</p><p>It's my family.</p><p>Only when everyone is fed, washed and tucked in bed can I start working again.</p><p>It usually means starting a bit late and, as a result, going quite late to bed. Which makes me tired and is not sustainable on the long run.</p><p>And of course, it's also important that I keep some quality time with my wife. This is something that's easy to neglect when you're head-on in your projects.</p><p>To be honest, that's the one main impact I've noticed from setting this one-week deadline for myself: duties done? Let's get to work!</p><p>Moving forward, I have to take that into account and set reasonable expectations for myself &#8212; there is actually no way for me to work every day or night on my projects.</p><p>So, where does this leave me?</p><h1>Next steps</h1><p>I am like most developers: too optimistic with time estimations.</p><p>On top of that, I have constraints I must take into account to plan my projects realistically.</p><p>Pushing myself to work on real-emails.com, something I consider quite a small project, was a great way for me to have this reality check I needed!</p><p>Now I do want to finish and deploy it, as the next step will be to work on marketing it and getting some sales in.</p><p>This time I'll give myself until end of next week to have my v1 live on real-emails.com.</p><p>I'll keep reporting here; see you soon!</p>]]></content:encoded></item><item><title><![CDATA[Real-emails.com Series #2 – Progress update]]></title><description><![CDATA[I'm late!]]></description><link>https://techtrails.io/p/real-emailscom-series-2-progress</link><guid isPermaLink="false">https://techtrails.io/p/real-emailscom-series-2-progress</guid><dc:creator><![CDATA[Olivier Lance]]></dc:creator><pubDate>Mon, 02 Sep 2024 12:02:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bQu1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff699938e-6d9b-419e-889c-73a8dc1c99dd_2304x1280.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bQu1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff699938e-6d9b-419e-889c-73a8dc1c99dd_2304x1280.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset image2-full-screen"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bQu1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff699938e-6d9b-419e-889c-73a8dc1c99dd_2304x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!bQu1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff699938e-6d9b-419e-889c-73a8dc1c99dd_2304x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!bQu1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff699938e-6d9b-419e-889c-73a8dc1c99dd_2304x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!bQu1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff699938e-6d9b-419e-889c-73a8dc1c99dd_2304x1280.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bQu1!,w_5760,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff699938e-6d9b-419e-889c-73a8dc1c99dd_2304x1280.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f699938e-6d9b-419e-889c-73a8dc1c99dd_2304x1280.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;full&quot;,&quot;height&quot;:809,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:299696,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-fullscreen" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bQu1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff699938e-6d9b-419e-889c-73a8dc1c99dd_2304x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!bQu1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff699938e-6d9b-419e-889c-73a8dc1c99dd_2304x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!bQu1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff699938e-6d9b-419e-889c-73a8dc1c99dd_2304x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!bQu1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff699938e-6d9b-419e-889c-73a8dc1c99dd_2304x1280.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>First, Disney was fantastic &#128513;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DEvE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba2db558-ffad-4fb3-b2c0-1a8d73891ca8_3024x4032.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DEvE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba2db558-ffad-4fb3-b2c0-1a8d73891ca8_3024x4032.jpeg 424w, https://substackcdn.com/image/fetch/$s_!DEvE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba2db558-ffad-4fb3-b2c0-1a8d73891ca8_3024x4032.jpeg 848w, https://substackcdn.com/image/fetch/$s_!DEvE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba2db558-ffad-4fb3-b2c0-1a8d73891ca8_3024x4032.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!DEvE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba2db558-ffad-4fb3-b2c0-1a8d73891ca8_3024x4032.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DEvE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba2db558-ffad-4fb3-b2c0-1a8d73891ca8_3024x4032.jpeg" width="1456" height="1941" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba2db558-ffad-4fb3-b2c0-1a8d73891ca8_3024x4032.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1941,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1489781,&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;: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_!DEvE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba2db558-ffad-4fb3-b2c0-1a8d73891ca8_3024x4032.jpeg 424w, https://substackcdn.com/image/fetch/$s_!DEvE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba2db558-ffad-4fb3-b2c0-1a8d73891ca8_3024x4032.jpeg 848w, https://substackcdn.com/image/fetch/$s_!DEvE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba2db558-ffad-4fb3-b2c0-1a8d73891ca8_3024x4032.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!DEvE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba2db558-ffad-4fb3-b2c0-1a8d73891ca8_3024x4032.jpeg 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>But unfortunately, I'm late on my planned schedule!<br>Kinda like Alice in Wonderland&#8217;s White Rabbit &#128048;<br><br>Two reasons for this:</p><ul><li><p>Starting up the Rails project took me more time than I expected</p></li><li><p>I went down into a few rabbit holes, but I'm getting better at noticing and pulling myself out of them!</p></li><li><p>I did not find as much time as I thought I would on Sunday</p></li></ul><p>Here's my current status:</p><div><hr></div><ul><li><p><strong>Friday:</strong></p><ul><li><p>&#9989; Project setup</p><ul><li><p>Rails project with Turbo/Stimulus and Phlex</p></li><li><p>&#128048; Lots of boilerplate to setup for Phlex. I'll need to build myself a reusable lib to kick things off faster</p></li><li><p>&#128048; Spent too much time on UI/design on top of that</p></li></ul></li><li><p>&#9989;  User registration &amp; authentication</p><ul><li><p>Using Devise + <a href="https://github.com/abevoelker/devise-passwordless">devise-passwordless</a></p><ul><li><p>&#128048; devise-passwordless&#8217; implementation isn't in line with what I had in mind.<br>Even though I'm not a huge fan of them, the beauty of Magic Links is that you don't have to worry about the user being already registered: just show an email field, create a new user if needed and shoot the email link.<br>Unfortunately, the gem did not merge sign-up and sign-in this way, so I had to override their sessions controller.</p></li></ul></li><li><p>Some minor fine-tuning remains</p></li></ul></li><li><p>&#10060; API service with API key authentication</p></li><li><p>&#10060; Endpoints specifications</p></li></ul></li><li><p><strong>Sunday:</strong></p><ul><li><p>&#10060; Blocklist matching implementation</p></li><li><p>&#10060; Dynamic checks &amp; results caching</p></li></ul></li><li><p><strong>Monday:</strong></p><ul><li><p>&#10060; Payment setup &amp; implementation</p></li></ul></li><li><p><strong>Tuesday:</strong></p><ul><li><p>&#10060; Server provisioning</p></li><li><p>&#10060; real-emails.com domain configuration</p></li><li><p>&#10060; Deployment preparation</p></li></ul></li><li><p><strong>Wednesday:</strong></p><ul><li><p>&#10060; Production deployment</p></li><li><p>&#10060; Live tests</p></li></ul></li></ul><div><hr></div><p>Ouch! That's a lot of red &#128584;</p><p>Hopefully, I will be able to accelerate now that I have the foundations in place.<br>For the moment, I think I can still meet Wednesday&#8217;s deadline.</p><p>I would probably shift it to Friday if I were on a freelance contract. &#128517;</p><p>Anyway, here's what it looks like at the moment:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HMeM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e962de8-b1be-49e3-a3ba-10866db7aadd_800x436.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HMeM!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e962de8-b1be-49e3-a3ba-10866db7aadd_800x436.gif 424w, https://substackcdn.com/image/fetch/$s_!HMeM!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e962de8-b1be-49e3-a3ba-10866db7aadd_800x436.gif 848w, https://substackcdn.com/image/fetch/$s_!HMeM!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e962de8-b1be-49e3-a3ba-10866db7aadd_800x436.gif 1272w, https://substackcdn.com/image/fetch/$s_!HMeM!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e962de8-b1be-49e3-a3ba-10866db7aadd_800x436.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HMeM!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e962de8-b1be-49e3-a3ba-10866db7aadd_800x436.gif" width="728" height="396.76" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1e962de8-b1be-49e3-a3ba-10866db7aadd_800x436.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:436,&quot;width&quot;:800,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Enregistrement de l&#8217;e&#769;cran 2024-09-02 a&#768; 13.46.26.mov [video-to-gif output image]&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="Enregistrement de l&#8217;e&#769;cran 2024-09-02 a&#768; 13.46.26.mov [video-to-gif output image]" title="Enregistrement de l&#8217;e&#769;cran 2024-09-02 a&#768; 13.46.26.mov [video-to-gif output image]" srcset="https://substackcdn.com/image/fetch/$s_!HMeM!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e962de8-b1be-49e3-a3ba-10866db7aadd_800x436.gif 424w, https://substackcdn.com/image/fetch/$s_!HMeM!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e962de8-b1be-49e3-a3ba-10866db7aadd_800x436.gif 848w, https://substackcdn.com/image/fetch/$s_!HMeM!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e962de8-b1be-49e3-a3ba-10866db7aadd_800x436.gif 1272w, https://substackcdn.com/image/fetch/$s_!HMeM!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e962de8-b1be-49e3-a3ba-10866db7aadd_800x436.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>As I wrote above, some fine-tuning is still needed on the login flow. Right now, it redirects to the homepage after sending the email, which isn't great.</p><p>It should be done quickly, and then I can move on to the core part: the API.</p><p>Stay tuned :)</p>]]></content:encoded></item><item><title><![CDATA[Real-emails.com Series #1 – the plan]]></title><description><![CDATA[From idea to plan: defining what I&#8217;m going to build in the next 6 days]]></description><link>https://techtrails.io/p/real-emailscom-part1-the-plan</link><guid isPermaLink="false">https://techtrails.io/p/real-emailscom-part1-the-plan</guid><dc:creator><![CDATA[Olivier Lance]]></dc:creator><pubDate>Fri, 30 Aug 2024 15:42:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VfcA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9cb5a2-d28b-4fe7-9717-09d667caa046_2304x1280.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VfcA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9cb5a2-d28b-4fe7-9717-09d667caa046_2304x1280.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset image2-full-screen"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VfcA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9cb5a2-d28b-4fe7-9717-09d667caa046_2304x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!VfcA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9cb5a2-d28b-4fe7-9717-09d667caa046_2304x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!VfcA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9cb5a2-d28b-4fe7-9717-09d667caa046_2304x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!VfcA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9cb5a2-d28b-4fe7-9717-09d667caa046_2304x1280.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VfcA!,w_5760,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9cb5a2-d28b-4fe7-9717-09d667caa046_2304x1280.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8c9cb5a2-d28b-4fe7-9717-09d667caa046_2304x1280.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;full&quot;,&quot;height&quot;:809,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:353258,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-fullscreen" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VfcA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9cb5a2-d28b-4fe7-9717-09d667caa046_2304x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!VfcA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9cb5a2-d28b-4fe7-9717-09d667caa046_2304x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!VfcA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9cb5a2-d28b-4fe7-9717-09d667caa046_2304x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!VfcA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9cb5a2-d28b-4fe7-9717-09d667caa046_2304x1280.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>My deadline is 6 days away. If I want to make it, I have to have some sort of plan.<br>In this first update, I&#8217;ll take you through how I go from an idea to a&nbsp;plan.</p><h1>The idea</h1><p>Here&#8217;s a template I like to use to keep track of my ideas.<br>It&#8217;s very simple but helps me see more clearly where I want to go.</p><p><strong>&#128161; One-sentence idea pitch</strong></p><p>Real-emails.com is an API that lets you find out whether an email address is temporary/disposable or legitimate.</p><p>&#129309; <strong>Value proposition</strong></p><p>Collect email addresses you can trust</p><p><strong>&#128483;&#65039; Target audience</strong></p><ul><li><p>Anyone accepting email addresses from their users who wants to make sure they&#8217;re not garbage</p><ul><li><p>SaaS owners</p></li><li><p>E-commerce owners?</p><ul><li><p>making sure customers register with a legitimate address</p><ul><li><p>could make sense when you get 10% off your first order by subscribing to the store&#8217;s newsletter</p></li></ul></li></ul></li><li><p>Landing pages &amp; lead magnets builders</p></li><li><p>Newsletter authors?</p><ul><li><p>Probably newsletter platforms</p></li></ul></li><li><p>Fintechs (disposable email = fraudsters)</p></li></ul></li></ul><p><strong>&#128176; Business model</strong></p><p>I see several possibilities here:</p><ul><li><p>Subscription (yearly/monthly)</p></li><li><p>Pay-as-you-go with per-check pricing</p></li><li><p>Lifetime deal</p></li></ul><p><strong>&#128172; Product description</strong></p><ul><li><p>This is an API-first product&#8212;it&#8217;s meant for developers integrating email validation into their own products.</p><ul><li><p>The &#171;&nbsp;product surface&nbsp;&#187; could ultimately be larger and include:</p><ul><li><p>open-source API clients for various languages</p></li><li><p>platform plugins to provide plug &amp; play integration with the service</p></li></ul></li></ul></li><li><p>It&#8217;s quite simple: send an email address (or domain) through the API, and it will respond with a status (disposable or legit).</p><ul><li><p>It might be interesting to have a bulk check feature too</p></li></ul></li></ul><p><strong>&#9881;&#65039; Resources</strong></p><ul><li><p><strong>Disposable email providers:</strong></p><ul><li><p>Google results for &#171;&nbsp;<a href="https://www.google.com/search?q=temporary+email&amp;ie=UTF-8&amp;oe=UTF-8">temporary email</a>&nbsp;&#187;, &#171;&nbsp;<a href="https://www.google.com/search?q=disposable+email&amp;ie=UTF-8&amp;oe=UTF-8">disposable email</a>&nbsp;&#187;, &#171;&nbsp;<a href="https://www.google.com/search?q=burner+email&amp;ie=UTF-8&amp;oe=UTF-8">burner email</a>&nbsp;&#187;, &#8230;</p></li><li><p><a href="https://github.com/disposable-email-domains/disposable-email-domains/tree/master">disposable-email-domains</a> GitHub repository<br>&#8594; lots of domains are listed already, although 100% of recent Yopmail domains I have tested are absent.<br>&#8594; Interestingly, they also have an &#171;&nbsp;allowlist&nbsp;&#187;</p><ul><li><p>I could automate contributing back to that repo at some point!</p></li></ul></li></ul></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/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">Subscribe to follow my progress as I build this in the next 6 days!</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><h1>My constraints</h1><p>Before moving on to the plan, I think it's good in this instance that I outline my personal constraints. They will be key to gauge what I'll be able to deliver.</p><ul><li><p>I've got a job, so every weekday I can only work during the evening</p><ul><li><p>That's 4 days out of 6 remaining</p></li></ul></li><li><p>On Saturday I'm going out with my son for his birthday!</p><ul><li><p>Pretty excited about this as we&#8217;re going to Disneyland, but that means I actually have 5 days remaining to work on real-emails.com</p></li></ul></li></ul><p>Since I want to deploy something next Wednesday, I'm thinking:</p><ul><li><p>&#129489;&#8205;&#128187; Get the basic service done by Monday evening</p></li><li><p>&#9881;&#65039; Deployment setup (server provisioning, domain config and so on) on Tuesday evening</p></li><li><p>&#128640; Production deployment and troubleshooting on Wednesday evening</p></li></ul><h1>The job to be done</h1><p>From my basic idea description, what I like to do next is make a list of what I have to build. I usually break it down into Proof of Concept, Prototype and MVP phases (with meanings that might be my own&#8230;).</p><p>As I've already done some technical validation that could be considered a Proof of Concept, I'll keep things simple here and merge Prototype/MVP into one phase.</p><p>Let's call it the Get it done! phase &#128516;</p><h2>Get it done!</h2><p>As you'll see, I try to be exhaustive and will list both the very basic &amp; more complicated stuff.</p><p>I try to use my idea &#8220;brief&#8221; as an anchor to decide what's a &#128994; must have, i.e. key to execute on the value proposition, versus a &#128993; nice to have or a &#128992; maybe later.</p><p>So, here's what I have to build.</p><h3>Build an API service</h3><ul><li><p>&#128994; Basic JSON API</p></li><li><p>&#128994; API authentication</p><ul><li><p>&#128994; API key associated to subscribed user</p></li></ul></li><li><p>&#128992; API throttling &amp; rate limiting</p></li></ul><h3>Identify disposable/temp email providers</h3><ul><li><p>&#128994; Gather list of temp email providers</p><ul><li><p>&#128993; Automatically update blocklist sources</p></li><li><p>&#128994; Identify their domains lists and dynamic features</p><ul><li><p>e.g. Yopmail enrols new domains regularly, emailnator generates dummy Gmail addresses, etc.</p></li></ul></li></ul></li><li><p>&#128994; Match provided email domain to blocklist</p></li><li><p>&#128994; Dynamically identify provider domains in case of blocklist miss</p><ul><li><p>e.g. detect a newly added Yopmail domain that hasn't made it to the list yet</p></li><li><p>&#128994; Cache results for faster lookups</p></li></ul></li><li><p>&#128993; Process &amp; check emails in bulk</p><ul><li><p>&#128993; Implement async processing</p><ul><li><p>&#128993; with task API? (i.e. get task status/result)</p></li></ul></li><li><p>&#128992; Implement webhook notifications</p></li></ul></li><li><p>&#128992; Allow flagging of false positives &amp; false negatives</p></li></ul><h3>Let users subscribe &amp; pay</h3><ul><li><p>&#128994; User registration &amp; authentication</p></li><li><p>&#128994; Accept payments</p><ul><li><p>&#128994; Activate API key on payment</p><ul><li><p>&#128994; Implement payment webhooks</p></li></ul></li></ul></li></ul><h3>Provide integration tooling</h3><ul><li><p>&#128993; API clients in different languages</p><ul><li><p>JS, PHP, Python &amp; Ruby at a minimum</p></li></ul></li><li><p>&#128992; Paid-for self-hosted solutions?</p><ul><li><p>Could be a Docker image, a Rails engine, etc.</p></li></ul></li><li><p>&#128992; Platform integrations</p><ul><li><p>&#128992; Blogs &amp; Content management systems</p></li><li><p>&#128992; E-commerce platforms</p></li></ul></li></ul><div><hr></div><p><em>Note: I usually use Notion toggles &amp; databases to work on this &#8211; sorry if it's not very legible on the newsletter!</em></p><div><hr></div><h1>Bringing it all together</h1><p>Given my constraints, I'll only be focusing on the &#128994; must haves for next Wednesday.</p><p>One of those tasks hides is an &#8220;infinite&#8221; source of work though: <em>Dynamically identify provider domains in case of blocklist miss.<br></em>Indeed, it's going to be hard to cover all providers by Wednesday&#8230; if ever!</p><p>So I'm going to focus first on Yopmail and other providers found through Google searches that make use of the same DNS technique to add domains to their lists.</p><p>I'll keep Emailnator as a nice to have/maybe later, as their strategy is quite different and will probably prove harder to detect.</p><p>In terms of user authentication &amp; payment, I found <a href="https://www.iffy.com/">iffy.com&#8217;s </a>approach simple and efficient:</p><ol><li><p>Just provide your email address to log in &#8211; I'm not a fan of magic links so I might try to add Google/Apple login along with it, but for an API service it feels OK to me.</p></li><li><p>Once logged in, you get metered access to the API (3 calls per day) for free</p></li><li><p>If you want to subscribe, a click on &#8220;Pay for more&#8221; will bring you to a Stripe Checkout page to start your subscription</p></li></ol><p>It's good inspiration but I'll make things much simpler to start with.<br>For instance, I think I will initially only implement a lifetime access deal. It will make since much easier regarding API key management, as I won't have to monitor recurring payment status to invalidate keys and so on.<br><br>So! Here comes the plan :)</p><ul><li><p><strong>Tonight:</strong></p><ul><li><p>Project setup</p></li><li><p>User registration &amp; authentication</p></li><li><p>API service with API key authentication</p></li><li><p>Endpoints specifications</p></li></ul></li><li><p><strong>Sunday evening:</strong></p><ul><li><p>Blocklist matching implementation</p></li><li><p>Dynamic checks &amp; results caching</p></li></ul></li><li><p><strong>Monday evening:</strong></p><ul><li><p>Payment setup &amp; implementation</p></li></ul></li><li><p><strong>Tuesday evening:</strong></p><ul><li><p>Server provisioning</p></li><li><p>real-emails.com domain configuration</p></li><li><p>Deployment preparation</p></li></ul></li><li><p><strong>Wednesday evening:</strong></p><ul><li><p>Production deployment</p></li><li><p>Live tests</p></li></ul></li></ul><p>See you on Sunday!</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/p/real-emailscom-part1-the-plan?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Share this post if you liked it!</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/p/real-emailscom-part1-the-plan?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://techtrails.io/p/real-emailscom-part1-the-plan?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div>]]></content:encoded></item><item><title><![CDATA[Changing course.]]></title><description><![CDATA[How competition can help you strengthen your product vision; treat your projects like cattle, not pets; setting myself up for success on a new project]]></description><link>https://techtrails.io/p/changing-course</link><guid isPermaLink="false">https://techtrails.io/p/changing-course</guid><dc:creator><![CDATA[Olivier Lance]]></dc:creator><pubDate>Wed, 28 Aug 2024 22:10:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F546ff843-4d8e-4be7-80aa-320fe292efaf_4608x2560.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bFiM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F546ff843-4d8e-4be7-80aa-320fe292efaf_4608x2560.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset image2-full-screen"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bFiM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F546ff843-4d8e-4be7-80aa-320fe292efaf_4608x2560.jpeg 424w, https://substackcdn.com/image/fetch/$s_!bFiM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F546ff843-4d8e-4be7-80aa-320fe292efaf_4608x2560.jpeg 848w, https://substackcdn.com/image/fetch/$s_!bFiM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F546ff843-4d8e-4be7-80aa-320fe292efaf_4608x2560.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!bFiM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F546ff843-4d8e-4be7-80aa-320fe292efaf_4608x2560.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bFiM!,w_5760,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F546ff843-4d8e-4be7-80aa-320fe292efaf_4608x2560.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/546ff843-4d8e-4be7-80aa-320fe292efaf_4608x2560.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;full&quot;,&quot;height&quot;:809,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:904687,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-fullscreen" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bFiM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F546ff843-4d8e-4be7-80aa-320fe292efaf_4608x2560.jpeg 424w, https://substackcdn.com/image/fetch/$s_!bFiM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F546ff843-4d8e-4be7-80aa-320fe292efaf_4608x2560.jpeg 848w, https://substackcdn.com/image/fetch/$s_!bFiM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F546ff843-4d8e-4be7-80aa-320fe292efaf_4608x2560.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!bFiM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F546ff843-4d8e-4be7-80aa-320fe292efaf_4608x2560.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><h1>Handling competition</h1><p>A lot has happened to my perception of my Speakerine project in the past 10 days.</p><p>Some time ago, I discovered some mobile applications that I could consider to be competition.</p><p>One of them is <a href="https://omnivore.app/login?errorCodes=AUTH_FAILED">Omnivore</a>.<br>It's open source. So it's free. And it honestly looks good!</p><p>It <em><strong>is</strong></em> competition because it's a <em>read-later</em> app that offers text-to-speech capabilities. It's got great feature ideas, too! For example, you can create emails linked to your account to receive newsletters directly in the app.</p><p>When I discovered this app, my inner voice went all &#8220;That's it, you should quit&#8221; on me.<br>Somebody's already there and they're doing a great job, just leave it.</p><p>But then I figured that's not how I should think about it.</p><p>Omnivore <em><strong>is not</strong></em> competition.<br>What I want to build with Speakerine has a very strong focus on audio, not on reading.<br>It is not &#8220;for serious readers"; it is for people who don't have time to read.<br>It's about curating your daily reading list of articles and getting a playlist to listen to out of it.</p><p>Of course, I did not jump instantly from the first feeling to the second.<br>I was surprised, though, that this became my conclusion. Competition has always made me anxious, and it's hard for me to ignore it.<br>But here, what it really did is help me strengthen my &#8220;product vision&#8221; (let's call it that) for Speakerine.</p><p>Good for me :)</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/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 Techtrails! Subscribe for free to receive new posts and support my work.</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><h1>About cattle &amp; pets</h1><p>Some of you already know I'm part of the <a href="https://smallbets.com">Small Bets community</a> (hey, small betters! &#128075;). I should write later about the benefits of belonging to such a community.</p><p>One thing that's been repeated several times in Small Bet&#8217;s chat is:</p><blockquote><p><em>Treat your projects like cattle, not pets</em></p></blockquote><p>When you get too attached to a project and treat it like a pet, you might fail to see when it's time to stop it. Cattle, on the other hand, is dispensable.</p><p>Well, what Omnivore helped me realise as well is that Speakerine might be too big of a cow for me right now. Here's why:</p><p>Technically speaking, I know where to go and what I want to build.</p><p>Since Omnivore is open source, I've explored their code, and I can see they have actually solved everything I have in mind:</p><ul><li><p>Extracting an article&#8217;s main content</p></li><li><p>Turning that content into audio thanks to text-to-speech models. They even use a secondary voice for block quotes; I love the idea!</p></li><li><p>Handling RSS feeds</p></li><li><p>And so on, and so forth</p></li></ul><p>Reading their code, I can see how many challenges they&#8217;ve faced and overcome while building their apps and the API services to support them.</p><p>You know how we sometimes say that knowing your future will ruin your present?<br>That's the effect Omnivore&#8217;s code has had on me: instead of a relatively straightforward road to an MVP/prototype, all I can see now is a winding path full of bumps and brambles.</p><p>It let me see the unknown unknowns I was happy to ignore at the moment and made my task look more daunting than it had to be.</p><p>I thought about it for some time and saw two main paths in front of me:</p><ul><li><p>Continue on my current path of building Speakerine as I intended, knowing I will probably face many roadblocks.</p></li><li><p>Use Ominvore&#8217;s code. After all, it's open source! I could ditch a good part of it and rebuild the front end to match the user experience I'm aiming for.</p></li></ul><p>The thing is, in both cases, it does not really look like a &#8220;small bet&#8221; anymore.</p><p>So I'm starting to think I&#8217;m treating this project like a pet, meaning I care too much about moving it forward and finishing it, even when it gets too complicated considering my current situation: two young kids, a 9-5 job, and little bandwidth.</p><p>I might need something else.</p><h1>Setting myself up for success</h1><p>Let's get back to some fundamentals:</p><ul><li><p>I haven&#8217;t done any serious coding in ~3/4 years</p></li><li><p>I haven't built &amp; shipped a full project on my own for 10+ years</p></li><li><p>I'm a perfectionist who tends to overthink (could you tell? &#129763;)</p></li><li><p>I am not, at the moment, particularly good at time management, organising myself for productivity, (&#8230;)</p></li></ul><p>I want to build in public to get back to doing all of the above and to have fun.<br>Ultimately, I'd like to earn money from that, but it will take time. That's fine.</p><p>So, my definition of success right now would be:</p><ul><li><p>I found a simple idea</p></li><li><p>I built &amp; shipped it in a matter of days/weeks</p></li><li><p>I publicly documented the process</p></li></ul><p>I don't even care if it's earning money in the end.<br>I'll just kill it if it's a money pit. That's the idea of small bets.</p><p>Speakerine is too big for me right now to have this velocity, and I know I would care if it did not earn any money.</p><p>That's why I decided to pause the project and get myself back into shape by working on something much simpler.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/p/changing-course?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Techtrails! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/p/changing-course?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://techtrails.io/p/changing-course?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><h1>Introducing: real-emails.com</h1><p>This is the simple idea: an API to check for disposable/temp email addresses.<br>I already bought the domain for it: real-emails.com.</p><p>There are tons of services offering disposable/temporary email addresses to help people provide fake email addresses they'll never ever check again.</p><p>Honestly, I can see why people use them, and I do happen to use Yopmail from time to time&#8230;<br>But when you&#8217;re building a SaaS or trying to acquire emails legitimately, you want to make sure you're not being given crap addresses.</p><p>Some basic services use only one or a few domain names for their email generators. You could simply list those ones in a blocklist, and you'd be done with them.</p><p>However, more serious services like Yopmail.com can enrol new domains every day!</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xTm1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b1e9d73-9bcf-497e-89c9-f683d91576ed_668x230.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xTm1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b1e9d73-9bcf-497e-89c9-f683d91576ed_668x230.png 424w, https://substackcdn.com/image/fetch/$s_!xTm1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b1e9d73-9bcf-497e-89c9-f683d91576ed_668x230.png 848w, https://substackcdn.com/image/fetch/$s_!xTm1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b1e9d73-9bcf-497e-89c9-f683d91576ed_668x230.png 1272w, https://substackcdn.com/image/fetch/$s_!xTm1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b1e9d73-9bcf-497e-89c9-f683d91576ed_668x230.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xTm1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b1e9d73-9bcf-497e-89c9-f683d91576ed_668x230.png" width="512" height="176.2874251497006" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7b1e9d73-9bcf-497e-89c9-f683d91576ed_668x230.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:230,&quot;width&quot;:668,&quot;resizeWidth&quot;:512,&quot;bytes&quot;:34382,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xTm1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b1e9d73-9bcf-497e-89c9-f683d91576ed_668x230.png 424w, https://substackcdn.com/image/fetch/$s_!xTm1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b1e9d73-9bcf-497e-89c9-f683d91576ed_668x230.png 848w, https://substackcdn.com/image/fetch/$s_!xTm1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b1e9d73-9bcf-497e-89c9-f683d91576ed_668x230.png 1272w, https://substackcdn.com/image/fetch/$s_!xTm1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b1e9d73-9bcf-497e-89c9-f683d91576ed_668x230.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>This is where a service becomes useful: you don't have to worry about keeping up-to-date with all those new domains.</p><p>So I will build that service, release it, and make it available for a tiny yearly subscription fee or a lifetime deal.</p><p>I'm giving myself <strong>a week</strong> to build it and will try to send updates every other day.</p><p>Let's see what happens!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/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">Subscribe to follow this tiny adventure &#128640;</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[Story of my remote coding setup]]></title><description><![CDATA[&#171; Remotely local &#187; work with an iPad]]></description><link>https://techtrails.io/p/remote-coding-setup</link><guid isPermaLink="false">https://techtrails.io/p/remote-coding-setup</guid><dc:creator><![CDATA[Olivier Lance]]></dc:creator><pubDate>Tue, 20 Aug 2024 15:31:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!xRuH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde9ead53-b909-4a15-b38f-4ba6b9e33c92_4608x2560.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xRuH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde9ead53-b909-4a15-b38f-4ba6b9e33c92_4608x2560.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset image2-full-screen"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xRuH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde9ead53-b909-4a15-b38f-4ba6b9e33c92_4608x2560.jpeg 424w, https://substackcdn.com/image/fetch/$s_!xRuH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde9ead53-b909-4a15-b38f-4ba6b9e33c92_4608x2560.jpeg 848w, https://substackcdn.com/image/fetch/$s_!xRuH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde9ead53-b909-4a15-b38f-4ba6b9e33c92_4608x2560.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!xRuH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde9ead53-b909-4a15-b38f-4ba6b9e33c92_4608x2560.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xRuH!,w_5760,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde9ead53-b909-4a15-b38f-4ba6b9e33c92_4608x2560.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de9ead53-b909-4a15-b38f-4ba6b9e33c92_4608x2560.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;full&quot;,&quot;height&quot;:809,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1547336,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-fullscreen" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xRuH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde9ead53-b909-4a15-b38f-4ba6b9e33c92_4608x2560.jpeg 424w, https://substackcdn.com/image/fetch/$s_!xRuH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde9ead53-b909-4a15-b38f-4ba6b9e33c92_4608x2560.jpeg 848w, https://substackcdn.com/image/fetch/$s_!xRuH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde9ead53-b909-4a15-b38f-4ba6b9e33c92_4608x2560.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!xRuH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde9ead53-b909-4a15-b38f-4ba6b9e33c92_4608x2560.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></p><h1>An iPad Pro for photos &amp; note taking &#9989;</h1><p>A few years ago, I sold my trusty but aging Macbook Pro and bought a 12.9" iPad Pro.</p><p>At this time, my decision was driven by two main factors:</p><ul><li><p>I needed a light computer to work on my digital photos while on the go &#8211; the 12.9 inches screen, its M1 processor and the Lightroom iOS app made the iPad Pro a great candidate. The quality of the Apple Pencil comes as a bonus too, to work on precise masks.</p></li><li><p>I wanted something to continue taking handwritten notes at work, but with a digital tool that would allow me to easily search within those notes. The fluidity of the Apple Pencil, paired with the <a href="https://www.nebo.app/">Nebo app</a> for note taking &amp; handwriting recognition, are exactly what I was looking for!</p><p>It turns out it&#8217;s also a great companion on conference calls to do some live whiteboarding.</p></li></ul><p>Back then, I wasn&#8217;t working on any personal projects, so if I needed to code it was mainly for work, and I already had a MacBook Pro from my job.<br>I also had &#171;&nbsp;inherited&nbsp;&#187; a 2013 Mac Pro from a previous company, that I could use as a personal workstation at home.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/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 Techtrails! Subscribe for free to receive new posts and support my work.</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><h1>An iPad Pro for coding? &#129300;</h1><p>When I started working more frequently on personal projects, came the question of how I&#8217;d do if I wanted to work on them remotely, i.e. while on holidays.</p><p>Evidently, I cannot code <em>on</em> the iPad: there&#8217;s no terminal, no way to install packages, let alone a compiler or web server of any sort. Damn you, Apple!</p><p>Already owning an iPad Pro and a Mac Pro, I did not want to purchase a MacBook Pro if I did not have to. So I thought of ways I could code <em>from</em> the iPad Pro on code hosted elsewhere.</p><h2>Cloud editors</h2><p>At the time I was looking into this, cloud editors existed but weren&#8217;t as mainstream as they are today.</p><p>Github Codespaces was only nascent and not generally available.<br>Available options, I believe, were mainly Cloud9 (already owned by AWS) and GitPod.</p><p>These were great solutions really, but I think several things made me want to find something else:</p><ul><li><p>I did not want to depend from a third party and end up paying for my setup </p></li><li><p>I also had started learning Unity and game development, so I was thinking it might be useful to have access to more than just an SSH session on a virtual machine.<br>If could access my actual home computer screen from afar, that would be nice!</p></li></ul><p>As a result, my focus then moved to: how can I code on my Mac Pro from my iPad?</p><h2>Remotely local coding</h2><p>I explored different options to make this work, to finally settle on the following:</p><ul><li><p>Using <a href="https://tailscale.com">Tailscale</a> to create a Virtual Private Network between my devices</p></li><li><p>Hosting a VSCode server with <a href="https://github.com/coder/code-server">code-server</a> on my Mac Pro</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://techtrails.io/subscribe?"><span>Subscribe now</span></a></p><p>On a Mac, installing <code>code-server</code> is just a <code>brew install</code> command away, and Tailscale is even easier to setup both on my Mac and my iPad.<br>In a few minutes, I got access to:</p><ul><li><p>My Mac Pro, from my iPad, using a convenient domain name</p></li><li><p>A full-fledged code editor, VS Code, with access to all my files</p></li><li><p>A terminal, thanks to VS Code, that allows me to run any command on my Mac Pro as if I was using it directly</p></li></ul><p>That&#8217;s all I needed to code remotely from my iPad!</p><p>As a bonus, I also get access to my Windows machine, as a virtual desktop using Microsoft&#8217;s <a href="https://apps.apple.com/us/app/remote-desktop-mobile/id714464092">RD Client app</a>. Since I&#8217;ve got a good graphics card on it, I can use it for generative AI tools such as Stable Diffusion even when I&#8217;m on the go.</p><h1>The cons</h1><p>I have been using this setup for the last month or so to code on Speakerine. All in all, it&#8217;s going pretty well, but there are some caveats and downsides to it:</p><ul><li><p><strong>From the setup itself first:</strong></p><ul><li><p>If, for any reason, my Mac Pro shuts down or disconnects itself from my home network, I&#8217;ve got no way to reach it anymore and can&#8217;t code anymore.<br>I&#8217;m unfortunately talking from experience &#129394;</p></li><li><p>An internet connection is required at all times. Coding usually requires one anyway, but with this setup and how VS Code seems to work, you cannot even have a temporary internet-less coding session.</p></li></ul></li><li><p><strong>From the iPad:</strong></p><ul><li><p>The absence of developer tooling for Safari on the iPad. I found the <a href="https://apps.apple.com/fr/app/web-inspector/id1584825745">Web Inspector Safari extension</a>, but it&#8217;s not as powerful as what we&#8217;re used to on desktop, and will only serve for basic DOM or requests inspection.</p></li><li><p>Very buggy keyboard support: I have owned a Logi Combo Touch for a long time without using the keyboard much at the beginning.<br>Using it more intensively revealed many very annoying bugs: the trackpad will stop working randomly mid-action, as will some of the keys.<br>Fixing required switching apps using Cmd+Tab, or sometimes even unplugging/replugging the keyboard.<br>I ended up being so frustrated with this that I ordered Apple&#8217;s quite expensive Magic Keyboard. Only to realize it&#8217;s got similar issues!<br>It&#8217;s not as bad, but not great either, so I really feel less productive when the first thing I have to do when switching back to my editor is to click on different form fields and back to the code so that I can type again.</p></li></ul></li></ul><h1>In the end&#8230;</h1><p>Retrospectively, in terms of setup, I think a cloud editor would suit me just fine today.<br>GitPod and GitHub Codespaces both have generous free plans (50 &amp; 60 free hours per month) that would be totally fit for my holidays use case.</p><p>What I&#8217;d be closing myself to using cloud editors is:</p><ul><li><p>Development that requires visual tooling, such as Unity or XCode</p><ul><li><p>For that matter, any macOS/iOS development since it requires a Mac</p></li></ul></li><li><p>Access to my graphics card for gen AI</p></li></ul><p>It&#8217;s not things I need today.<br>What would remain are the issues from the iPad itself, and the need for always-on connectivity.</p><p>Two factors that might push me to buy a MacBook Pro in the end.</p><p>Maybe when I do earn money from my indie hacking!</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/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">Subscribe if you liked this post &amp; want more!</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>]]></content:encoded></item><item><title><![CDATA[To code or not to code, that is the question.]]></title><description><![CDATA[On balancing activities when building in public]]></description><link>https://techtrails.io/p/to-code-or-not-to-code-that-is-the</link><guid isPermaLink="false">https://techtrails.io/p/to-code-or-not-to-code-that-is-the</guid><dc:creator><![CDATA[Olivier Lance]]></dc:creator><pubDate>Thu, 08 Aug 2024 12:56:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!HiRC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba241560-df68-47d6-bdcc-0c85a74e42e2_1152x640.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HiRC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba241560-df68-47d6-bdcc-0c85a74e42e2_1152x640.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset image2-full-screen"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HiRC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba241560-df68-47d6-bdcc-0c85a74e42e2_1152x640.jpeg 424w, https://substackcdn.com/image/fetch/$s_!HiRC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba241560-df68-47d6-bdcc-0c85a74e42e2_1152x640.jpeg 848w, https://substackcdn.com/image/fetch/$s_!HiRC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba241560-df68-47d6-bdcc-0c85a74e42e2_1152x640.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!HiRC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba241560-df68-47d6-bdcc-0c85a74e42e2_1152x640.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HiRC!,w_5760,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba241560-df68-47d6-bdcc-0c85a74e42e2_1152x640.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba241560-df68-47d6-bdcc-0c85a74e42e2_1152x640.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;full&quot;,&quot;height&quot;:640,&quot;width&quot;:1152,&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;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-fullscreen" alt="" srcset="https://substackcdn.com/image/fetch/$s_!HiRC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba241560-df68-47d6-bdcc-0c85a74e42e2_1152x640.jpeg 424w, https://substackcdn.com/image/fetch/$s_!HiRC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba241560-df68-47d6-bdcc-0c85a74e42e2_1152x640.jpeg 848w, https://substackcdn.com/image/fetch/$s_!HiRC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba241560-df68-47d6-bdcc-0c85a74e42e2_1152x640.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!HiRC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba241560-df68-47d6-bdcc-0c85a74e42e2_1152x640.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>My last post is already a bit more than 2 weeks old. Damn.<br>It&#8217;s not like I&#8217;ve been idle all this time though, on the contrary.</p><p>That&#8217;s why this post will probably feel like when you&#8217;ve coded for a long time without committing anything to Git &#128556;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/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 Techtrails! Subscribe for free to receive new posts and support my work.</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>In the last two weeks, I have&#8230;</p><p><strong>Set up my Rails project for Speakerine.</strong> I had already done the very basic <code>rails new speakerine</code>. I went a bit deeper into the app&#8217;s configuration and setup, re-reading Rails guides when needed.</p><p><strong>Lost myself in some front-end tech rabbit holes. </strong>I haven&#8217;t touched Ruby on Rails for like &#8230; 14 years &#128517;<br>It&#8217;s refreshing to see that the framework has remained generally the same, but of course it has evolved a lot since Rails 2.3/Rails 3.0. So there are a lot of things I have to discover and learn, especially on the front-end side where technologies have moved a lot in the past years.</p><p>Since I have a TailwindUI subscription, I wondered whether I should use React with Rails. That led me into exploring the assets pipeline options for Rails, and how to integrate React with the backend. Which almost inevitably leads to building an API-only Rails and a heavy front-end.<br>At some point I thought &#171;&nbsp;that&#8217;s getting too complicated&nbsp;&#187;, and that&#8217;s when I decided to stop .</p><p>So in the end, I <strong>decided to go with Rails&#8217; defaults:</strong> Import maps, Hotwire &amp; Stimulus, and using TailwindCSS for styles.</p><p>I actually <a href="https://x.com/olance/status/1819321676707905931">tweeted about this</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_!tmuH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe912718d-d28b-464f-a27a-565a9a2eed45_1616x1414.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tmuH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe912718d-d28b-464f-a27a-565a9a2eed45_1616x1414.png 424w, https://substackcdn.com/image/fetch/$s_!tmuH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe912718d-d28b-464f-a27a-565a9a2eed45_1616x1414.png 848w, https://substackcdn.com/image/fetch/$s_!tmuH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe912718d-d28b-464f-a27a-565a9a2eed45_1616x1414.png 1272w, https://substackcdn.com/image/fetch/$s_!tmuH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe912718d-d28b-464f-a27a-565a9a2eed45_1616x1414.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tmuH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe912718d-d28b-464f-a27a-565a9a2eed45_1616x1414.png" width="558" height="488.25" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e912718d-d28b-464f-a27a-565a9a2eed45_1616x1414.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1274,&quot;width&quot;:1456,&quot;resizeWidth&quot;:558,&quot;bytes&quot;:358217,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!tmuH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe912718d-d28b-464f-a27a-565a9a2eed45_1616x1414.png 424w, https://substackcdn.com/image/fetch/$s_!tmuH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe912718d-d28b-464f-a27a-565a9a2eed45_1616x1414.png 848w, https://substackcdn.com/image/fetch/$s_!tmuH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe912718d-d28b-464f-a27a-565a9a2eed45_1616x1414.png 1272w, https://substackcdn.com/image/fetch/$s_!tmuH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe912718d-d28b-464f-a27a-565a9a2eed45_1616x1414.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>With regards to my usual tweets performance, this one had a decent reach!<br>It encouraged me to try and continue sharing on X about my building experience.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://techtrails.io/subscribe?"><span>Subscribe now</span></a></p><p>I do find it complicated to identify what I should share, though.<br>That&#8217;s why I <strong>started journaling,</strong> also as a result of reading <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;S&#233;bastien Dubois&quot;,&quot;id&quot;:124087908,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/61ef9504-a916-45a1-b998-70c93a1127db_2400x1600.jpeg&quot;,&quot;uuid&quot;:&quot;6bc18a69-dd63-4884-bc59-46ac6d393642&quot;}" data-component-name="MentionToDOM"></span>&#8217; excellent article on <a href="https://www.dsebastien.net/how-i-organize-my-work-as-a-solo-founder/">how he organises his work as a solo founder</a>.</p><p>I&#8217;ve always found the journaling exercise quite complicated to integrate into my routine, and I&#8217;ve yet to manage to do it more than two days in a row.</p><p>I found I need to be much more <em>intentional</em> about it, instead of waiting for things to &#171; click&nbsp;&#187; and implement themselves into my life.</p><p>But more on that later.<br>Let&#8217;s go back to Speakerine for now.</p><p>If I&#8217;m being honest, I am once again not going in a straight line towards my objective.</p><p>I have <strong>started by working on authentication</strong> using the Devise gem. I&#8217;ve spent quite a long time on this, much more than I had anticipated.<br>No matter how good I was on Rails 14 years ago, I need to shake off the dust and rust on those skills to get up to speed again.</p><p>One problem I faced was also solely due to my remote working setup.<br>I&#8217;m using a self-hosted VSCode instance that proxies local open ports through a convoluted URL, which forces me to configure Rails with a URL prefix that messes up URL generation.</p><p>Not ideal.</p><p>I got things to work though, and continued with <strong>setting up my webapp layout.<br></strong>That&#8217;s where I could have probably kept things simpler.<br>The designs I shared in <a href="https://techtrails.io/p/mvp-design-or-life-design">my last post</a> were quite simple indeed: the app title and a form.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!D9Ya!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44523c4b-d7d8-4256-8c4f-930e41744295_693x1383.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!D9Ya!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44523c4b-d7d8-4256-8c4f-930e41744295_693x1383.png 424w, https://substackcdn.com/image/fetch/$s_!D9Ya!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44523c4b-d7d8-4256-8c4f-930e41744295_693x1383.png 848w, https://substackcdn.com/image/fetch/$s_!D9Ya!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44523c4b-d7d8-4256-8c4f-930e41744295_693x1383.png 1272w, https://substackcdn.com/image/fetch/$s_!D9Ya!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44523c4b-d7d8-4256-8c4f-930e41744295_693x1383.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!D9Ya!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44523c4b-d7d8-4256-8c4f-930e41744295_693x1383.png" width="265" height="528.8528138528138" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/44523c4b-d7d8-4256-8c4f-930e41744295_693x1383.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1383,&quot;width&quot;:693,&quot;resizeWidth&quot;:265,&quot;bytes&quot;:60461,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!D9Ya!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44523c4b-d7d8-4256-8c4f-930e41744295_693x1383.png 424w, https://substackcdn.com/image/fetch/$s_!D9Ya!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44523c4b-d7d8-4256-8c4f-930e41744295_693x1383.png 848w, https://substackcdn.com/image/fetch/$s_!D9Ya!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44523c4b-d7d8-4256-8c4f-930e41744295_693x1383.png 1272w, https://substackcdn.com/image/fetch/$s_!D9Ya!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44523c4b-d7d8-4256-8c4f-930e41744295_693x1383.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>But instead of keeping things that simple, I went on to integrate a TailwindUI application shell with a navigation bar and profile menu.</p><p>I try to rationalise by telling myself that I&#8217;ll need it and that it&#8217;s helping me walk the learning curve to re-learn what I have forgotten.<br>Which, to be fair, is true.</p><p>But it reminds me of an advice a friend gave me a long time ago.<br>It went kinda like this:</p><blockquote><p><em>Between learning and shipping, a project can only have one goal.<br>If you want to learn, start a project you don&#8217;t need to ship.<br>If you want to ship, use tools you don&#8217;t have to learn.</em></p></blockquote><p>It does not mean you&#8217;re not going to learn when building something you want to ship, nor that you won&#8217;t ship projects used to learn new tech.<br>Just that the main goal should be one or the other.</p><p>And right now, I&#8217;m kinda mixing the two.</p><p>Maybe it&#8217;s a path I have to take anyway since I haven&#8217;t developed a full web app for a long time, but I&#8217;ll try to be more mindful of this in the future.</p><p>Now the next thing I want to get done is tuning Tailwind&#8217;s configuration to use the color theme I had in mind.<br>I&#8217;ll try to keep it simple this time. It&#8217;s not like I need much branding for the moment.</p><p>There, you have it. Two weeks of coding and no writing.</p><p>I almost titled this post <em>&#171;&nbsp;To build or not to build, that is the question&nbsp;&#187;.</em><br>What I&#8217;m realising though, is that building in public is as much about writing than it is about coding.<br>Striking the balance between the two isn&#8217;t simple: once I get into coding, I want to get things done.</p><p>But this post is a good illustration of what goes on if I don&#8217;t write regularly enough: topics pile on and I can&#8217;t get deep into any of them.</p><p>As I mentioned before, there are things I need to become more <em>intentional</em> about.</p><p>I&#8217;ll add writing to that list.</p>]]></content:encoded></item><item><title><![CDATA[MVP design, or life design?]]></title><description><![CDATA[Fighting against myself, guess who's winning!]]></description><link>https://techtrails.io/p/mvp-design-or-life-design</link><guid isPermaLink="false">https://techtrails.io/p/mvp-design-or-life-design</guid><dc:creator><![CDATA[Olivier Lance]]></dc:creator><pubDate>Mon, 22 Jul 2024 22:29:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!DEly!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ceab6a-fbe0-424a-97fc-a69221d700c1_2048x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DEly!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ceab6a-fbe0-424a-97fc-a69221d700c1_2048x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset image2-full-screen"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DEly!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ceab6a-fbe0-424a-97fc-a69221d700c1_2048x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!DEly!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ceab6a-fbe0-424a-97fc-a69221d700c1_2048x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!DEly!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ceab6a-fbe0-424a-97fc-a69221d700c1_2048x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!DEly!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ceab6a-fbe0-424a-97fc-a69221d700c1_2048x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DEly!,w_5760,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ceab6a-fbe0-424a-97fc-a69221d700c1_2048x1024.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c8ceab6a-fbe0-424a-97fc-a69221d700c1_2048x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;full&quot;,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:253174,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-fullscreen" alt="" srcset="https://substackcdn.com/image/fetch/$s_!DEly!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ceab6a-fbe0-424a-97fc-a69221d700c1_2048x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!DEly!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ceab6a-fbe0-424a-97fc-a69221d700c1_2048x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!DEly!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ceab6a-fbe0-424a-97fc-a69221d700c1_2048x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!DEly!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ceab6a-fbe0-424a-97fc-a69221d700c1_2048x1024.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>Lately I have found I have to fight against my own self, at different levels.</p><h1>Life design</h1><p>Like so many people out there, <em>I</em> <em>just want to be happy.</em><br>Trying to build a portfolio of products for myself is one way for me to reach that goal:</p><ul><li><p>I get to work on my own ideas, from start to finish.</p></li><li><p>I get to create again by imagining new products, coding them, writing about them&#8230; <em>Creating</em> has actually been missing from my life for a while and it's a real driver for me.</p></li><li><p>Ultimately, I'm working towards financial autonomy and thus a lifestyle that I can fully control.</p></li></ul><p>It's actually quite nice, and I feel privileged having the opportunity to try this out.<br>Yet, as I was saying, I'm having to fight against myself to get the ball rolling.</p><p>As <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Jack&quot;,&quot;id&quot;:125072947,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/abd78eb6-2030-43e7-974a-d402d318aeca_1836x2201.jpeg&quot;,&quot;uuid&quot;:&quot;56a1148d-899a-4793-a680-57041e8562db&quot;}" data-component-name="MentionToDOM"></span> told me the other day, I&#8217;ve done &#8220;some really cool shit in [my] career&#8221; &#128517;<br>But it also came with a price, and my professional life has kinda made me afraid of success as a result, and shaped me into looking for external validation more than my own satisfaction for a job well done.</p><p>Now that I truly want to build something for myself, I'm facing a few blockers.</p><p>Things like <a href="https://en.wikipedia.org/wiki/Analysis_paralysis">analysis paralysis</a> and procrastination of course but also, in some rare cases&#8230; anxiety attacks.<br>Those would typically happen when thinking about <em>proving myself</em> or about <em>potentiality of success.</em></p><p>I won't expand more on that today but it's definitely one way I have to fight against myself.</p><p>Starting my build in public journey and committing to this newsletter is my way of doing this. So, thanks for reading! &#128578;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/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">Subscribe if you want to show your support!</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><h1>Lost in exploration</h1><p>And here's another fight!</p><p>At heart, I'm a software engineer. One who hasn't coded for quite a long time, too.<br>So when I decided it was time to &#8220;really&#8221; start working on a Speakerine, here's what I did:</p><ul><li><p>Spent hours reading about the latest JS frameworks and serverless platforms</p></li><li><p>Researched affordable hosting solutions and free managed database tiers</p></li><li><p>Decided I'd go back to using Rails again</p></li><li><p>Installed Rails on my computer &amp; created a new project</p></li><li><p>Installed RubyMine and opened that new project</p></li></ul><p>And then I was like: &#8220;now what?!&#8221; &#128517;</p><p>Said differently, I spent <em>hours</em> looking for solutions to problems I did not have, to finally decide on a tech stack and initiate a codebase without really knowing what I wanted to do.</p><p>Duh.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jgHc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfa080b-f445-486e-85cb-5a4361958313_500x228.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jgHc!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfa080b-f445-486e-85cb-5a4361958313_500x228.gif 424w, https://substackcdn.com/image/fetch/$s_!jgHc!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfa080b-f445-486e-85cb-5a4361958313_500x228.gif 848w, https://substackcdn.com/image/fetch/$s_!jgHc!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfa080b-f445-486e-85cb-5a4361958313_500x228.gif 1272w, https://substackcdn.com/image/fetch/$s_!jgHc!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfa080b-f445-486e-85cb-5a4361958313_500x228.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jgHc!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfa080b-f445-486e-85cb-5a4361958313_500x228.gif" width="500" height="228" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/adfa080b-f445-486e-85cb-5a4361958313_500x228.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:228,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;TV gif. Mia Talerico as Charlie on Good Luck Charlie shrugs and and draws her chin back with a surprised expression as she looks around.&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="TV gif. Mia Talerico as Charlie on Good Luck Charlie shrugs and and draws her chin back with a surprised expression as she looks around." title="TV gif. Mia Talerico as Charlie on Good Luck Charlie shrugs and and draws her chin back with a surprised expression as she looks around." srcset="https://substackcdn.com/image/fetch/$s_!jgHc!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfa080b-f445-486e-85cb-5a4361958313_500x228.gif 424w, https://substackcdn.com/image/fetch/$s_!jgHc!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfa080b-f445-486e-85cb-5a4361958313_500x228.gif 848w, https://substackcdn.com/image/fetch/$s_!jgHc!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfa080b-f445-486e-85cb-5a4361958313_500x228.gif 1272w, https://substackcdn.com/image/fetch/$s_!jgHc!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfa080b-f445-486e-85cb-5a4361958313_500x228.gif 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Realizing my mistake, I went back to square 1 and thought about the &#8220;really cool shit&#8221; my career had taught me.</p><h1>MVP design</h1><h2>What do I want to prove?</h2><p>My first step in thinking about the MVP for a new product, is to define what I want to prove.</p><p>In the case of Speakerine, that would be:</p><ul><li><p>That, given its URL, I can extract the content of an article</p><ul><li><p>Textual content and ideally metadata such as cover picture, author, published date, &#8230;</p></li></ul></li><li><p>That I can turn this textual content into audio, with high enough quality that it's pleasant to listen to</p><ul><li><p>While keeping costs as low as possible</p></li></ul></li><li><p>That I can build an app that does all that</p></li><li><p>That people are interested in using this app</p><ul><li><p>and actually paying for it!</p></li></ul></li></ul><p>This, I believe, is the minimum I should build to validate anything.</p><p>I've got other feature ideas of course, but I don't think they're as essential as what's listed above.</p><h2>How do I prove it?</h2><p>As I said in the previous issue, I don't have all the answers.<br>In terms of distribution and monetisation, it's still quite a big unknown to me.</p><p>For the rest, this MVP calls for an app of course, with enough components &amp; interactions to provide the described minimal experience.</p><p>I've got two things to design: UI/UX design, and technical design.</p><p>I'm a firm believer that to build a good product, the UX must dictate how the product is built and not the other way around.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><p>So I drew a few things on my iPad and used <a href="https://penpot.app/">Penpot</a>&#8212;a serious Open Source Figma alternative&#8212;to make it shareable here:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gg4C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4888292c-0ebc-4e06-9751-8c7599679181_7858x2128.png" data-component-name="Image2ToDOM"><div class="image2-inset image2-full-screen"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gg4C!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4888292c-0ebc-4e06-9751-8c7599679181_7858x2128.png 424w, https://substackcdn.com/image/fetch/$s_!gg4C!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4888292c-0ebc-4e06-9751-8c7599679181_7858x2128.png 848w, https://substackcdn.com/image/fetch/$s_!gg4C!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4888292c-0ebc-4e06-9751-8c7599679181_7858x2128.png 1272w, https://substackcdn.com/image/fetch/$s_!gg4C!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4888292c-0ebc-4e06-9751-8c7599679181_7858x2128.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gg4C!,w_5760,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4888292c-0ebc-4e06-9751-8c7599679181_7858x2128.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4888292c-0ebc-4e06-9751-8c7599679181_7858x2128.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;full&quot;,&quot;height&quot;:394,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:419926,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-fullscreen" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gg4C!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4888292c-0ebc-4e06-9751-8c7599679181_7858x2128.png 424w, https://substackcdn.com/image/fetch/$s_!gg4C!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4888292c-0ebc-4e06-9751-8c7599679181_7858x2128.png 848w, https://substackcdn.com/image/fetch/$s_!gg4C!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4888292c-0ebc-4e06-9751-8c7599679181_7858x2128.png 1272w, https://substackcdn.com/image/fetch/$s_!gg4C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4888292c-0ebc-4e06-9751-8c7599679181_7858x2128.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 idea is quite simple:</p><ul><li><p>Log into the app</p></li><li><p>Paste the URL of the article you want to listen to</p></li><li><p>Wait as the service does its job</p></li><li><p>Hit &#8220;Play&#8221; to listen to it</p></li></ul><p>This very simple design gives me entry points into the main components of my app&#8217;s system:</p><ul><li><p>A &#8220;service&#8221; to receive a URL and:</p><ul><li><p>extract metadata from it, shown as the article list item in the UI</p></li><li><p>start generating the audio for the article</p></li></ul></li><li><p>An &#8220;observable&#8221; task system to track the ongoing process</p><ul><li><p>shown as the progress indicator close to the article item</p></li><li><p>allowing the app to be notified of the process completion</p></li></ul></li><li><p>Somewhere to store the audio data so that it can be played in the app</p></li><li><p>A client-side audio player</p></li></ul><p>Those building blocks should be enough to get me going and (in)validate many of the points I want to prove.</p><p>I think now, I can start RubyMine again and get to coding some of this stuff!</p><p></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>This is actually quite similar to Test Driven Development or even <a href="https://tom.preston-werner.com/2010/08/23/readme-driven-development.html">&#8220;Readme Driven Development&#8221;</a> as formulated by Tom Preston-Werner.</p></div></div>]]></content:encoded></item><item><title><![CDATA[First project: Speakerine]]></title><description><![CDATA[Turning your reading list into a personalised podcast.]]></description><link>https://techtrails.io/p/first-project-speakerine</link><guid isPermaLink="false">https://techtrails.io/p/first-project-speakerine</guid><dc:creator><![CDATA[Olivier Lance]]></dc:creator><pubDate>Sun, 14 Jul 2024 23:47:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vfwP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6474716-34f8-4823-ac2a-1f951d67daa7_1927x2183.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I almost forgot about introducing my first project! &#129318;&#8205;&#9794;&#65039;</p><p>I have started working on Speakerine: an application to turn your reading list into a personalised podcast.</p><p>This is what its landing page looks like right now: <a href="https://speakerine.app">speakerine.app</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_!vfwP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6474716-34f8-4823-ac2a-1f951d67daa7_1927x2183.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vfwP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6474716-34f8-4823-ac2a-1f951d67daa7_1927x2183.png 424w, https://substackcdn.com/image/fetch/$s_!vfwP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6474716-34f8-4823-ac2a-1f951d67daa7_1927x2183.png 848w, https://substackcdn.com/image/fetch/$s_!vfwP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6474716-34f8-4823-ac2a-1f951d67daa7_1927x2183.png 1272w, https://substackcdn.com/image/fetch/$s_!vfwP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6474716-34f8-4823-ac2a-1f951d67daa7_1927x2183.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vfwP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6474716-34f8-4823-ac2a-1f951d67daa7_1927x2183.png" width="1456" height="1649" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d6474716-34f8-4823-ac2a-1f951d67daa7_1927x2183.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1649,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:369742,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vfwP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6474716-34f8-4823-ac2a-1f951d67daa7_1927x2183.png 424w, https://substackcdn.com/image/fetch/$s_!vfwP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6474716-34f8-4823-ac2a-1f951d67daa7_1927x2183.png 848w, https://substackcdn.com/image/fetch/$s_!vfwP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6474716-34f8-4823-ac2a-1f951d67daa7_1927x2183.png 1272w, https://substackcdn.com/image/fetch/$s_!vfwP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6474716-34f8-4823-ac2a-1f951d67daa7_1927x2183.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>The concept</h1><p>The idea is quite simple:</p><ol><li><p>Through my days, I often stumble upon articles I want to read. Since I usually don&#8217;t have the time to read them right away, I keep the tab opened &#8220;for later&#8221;&#8230; but later never comes</p></li><li><p>On the other hand, I have multiple occasions when I could <em>listen</em> to some content instead of reading it.</p><p>While commuting to work, exercising, cooking, doing the dishes or my laundry, while cleaning, &#8230; there are actually <em>many</em> opportunities to be listening to content while our hands are busy with routine tasks.</p></li></ol><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/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">Feels familiar? Subscribe to get early access! </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>So I thought: why not create a Pocket-like app that allows me to easily transform any article into its audio transcription, and organise that into a playlist?</p><p>I kept this idea in my ideas list for a while, and since it kept creeping back to me as something I felt would be nice to do and valuable, I decided to build it!</p><p>I thought about many different features that could make it a daily companion for podcast <em>aficionados,</em> but I guess I&#8217;ll have to do it one step at a time :)</p><h1>The name</h1><p>Why Speakerine?</p><p>I wanted an original name which could be directly related to the text-to-speech nature of the project. I think <em>Speak/Speaker</em> in &#8220;Speakerine&#8221; works well for that, even though the word Speakerine itself might not be very well known internationally.</p><p>It&#8217;s actually the word &#8220;Speaker&#8221;, turned to a feminine form using the French suffix <em>-ine. </em>Speakerines were <a href="https://en.wikipedia.org/wiki/Continuity_(broadcasting)">continuity announcers</a> on the French television stations, appearing between programs, during unwanted interruptions or at the end of the day.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vgEn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2308ee8-ec4f-4fd3-ad11-bc99dad0668d_520x588.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vgEn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2308ee8-ec4f-4fd3-ad11-bc99dad0668d_520x588.png 424w, https://substackcdn.com/image/fetch/$s_!vgEn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2308ee8-ec4f-4fd3-ad11-bc99dad0668d_520x588.png 848w, https://substackcdn.com/image/fetch/$s_!vgEn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2308ee8-ec4f-4fd3-ad11-bc99dad0668d_520x588.png 1272w, https://substackcdn.com/image/fetch/$s_!vgEn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2308ee8-ec4f-4fd3-ad11-bc99dad0668d_520x588.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vgEn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2308ee8-ec4f-4fd3-ad11-bc99dad0668d_520x588.png" width="520" height="588" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c2308ee8-ec4f-4fd3-ad11-bc99dad0668d_520x588.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:588,&quot;width&quot;:520,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:373167,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vgEn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2308ee8-ec4f-4fd3-ad11-bc99dad0668d_520x588.png 424w, https://substackcdn.com/image/fetch/$s_!vgEn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2308ee8-ec4f-4fd3-ad11-bc99dad0668d_520x588.png 848w, https://substackcdn.com/image/fetch/$s_!vgEn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2308ee8-ec4f-4fd3-ad11-bc99dad0668d_520x588.png 1272w, https://substackcdn.com/image/fetch/$s_!vgEn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2308ee8-ec4f-4fd3-ad11-bc99dad0668d_520x588.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">Jacqueline Joubert by Studio Harcourt &#8211; the first official Speakerine in France</figcaption></figure></div><h1>What I already know</h1><ul><li><p>My target is a mobile app &#8211; it seems to me that would be the best way to make it a daily tool that can be used on the go.</p></li><li><p>I&#8217;ll build the MVP as a web application though, as it&#8217;ll allow me to go faster to something I can put in your (and my ^^) hands!</p><ul><li><p>With that objective in mind, I&#8217;ll start with Ruby on Rails as a framework to get things done quickly.</p></li></ul></li><li><p>I know what the main technical challenges are, and (mostly) how to solve them:</p><ul><li><p><strong>Challenge #1: </strong>given a URL, extract the meaningful content</p><ul><li><p>This is what the &#8220;reader mode&#8221; of your browser does, and some of those readers are open source. I might have to customise the output of such tools to better prepare it for Speech-to-Text processing.</p></li><li><p>Content behind paywalls or login/password will be a specific challenge I&#8217;ll have to figure out.</p></li></ul></li><li><p><strong>Challenge #2:</strong> turn this content into a quality audio transcription</p><ul><li><p><a href="https://github.com/openai/whisper">Whisper</a> or similar models are the most obvious approach</p></li><li><p>Using a language detector will probably be useful as well, to inform the model of the language it should use</p></li></ul></li></ul></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/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">Subscribe to see how I&#8217;ll manage (hopefully &#128517;) to tackle those challenges!</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><h1>What needs figuring out</h1><p>There are so many things I still need to figure out, but the two most impacting areas I believe are:</p><ul><li><p><strong>Marketing &amp; distribution:</strong></p><ul><li><p>I need to find where I can reach people who would be interested in the app, and how to target them</p></li><li><p>I also need to figure out SEO/ASO: what keywords will bring traffic to my app&#8217;s website or App Store listing?</p></li></ul></li><li><p><strong>Pricing:</strong></p><ul><li><p>Can I do something else than subscription, like credits or pay-as-you-go?</p></li><li><p>I&#8217;m thinking it will highly depend on:</p><ul><li><p>Speech-to-Text performance and what kind of server I&#8217;ll need to rent to make it work efficiently</p></li><li><p>How varied are transcribed articles in terms of length per article and per user</p></li></ul></li></ul></li></ul><h1>Next steps</h1><p>The other day I&#8217;ve installed both Ruby on Rails and RubyMine on my computer, for the first time in like&#8230; 12 years &#128561;</p><p>I&#8217;m pretty excited to go back to RoR honestly, but after that I was like: &#8220;now what?&#8221;. And I figured I had not yet thought through what I wanted an initial prototype or MVP to look like.</p><p>So I closed RubyMine, got a pen and paper out, and jotted down some initial wireframes of the minimal web app to get things running.</p><p>This is what I&#8217;ll work on for Techtrails&#8217; next issue!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/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">Spoiler alert: wonderful hand-drawings to come! You don&#8217;t want to miss this :)</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[Adding subscribers to Substack]]></title><description><![CDATA[Or dealing with sunk costs and escalation of commitment...]]></description><link>https://techtrails.io/p/adding-subscribers-to-substack</link><guid isPermaLink="false">https://techtrails.io/p/adding-subscribers-to-substack</guid><dc:creator><![CDATA[Olivier Lance]]></dc:creator><pubDate>Sat, 06 Jul 2024 21:02:08 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!pEDW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46602c1b-4ca4-4718-8be0-9c37f9df21dc_2000x838.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pEDW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46602c1b-4ca4-4718-8be0-9c37f9df21dc_2000x838.png" data-component-name="Image2ToDOM"><div class="image2-inset image2-full-screen"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pEDW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46602c1b-4ca4-4718-8be0-9c37f9df21dc_2000x838.png 424w, https://substackcdn.com/image/fetch/$s_!pEDW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46602c1b-4ca4-4718-8be0-9c37f9df21dc_2000x838.png 848w, https://substackcdn.com/image/fetch/$s_!pEDW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46602c1b-4ca4-4718-8be0-9c37f9df21dc_2000x838.png 1272w, https://substackcdn.com/image/fetch/$s_!pEDW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46602c1b-4ca4-4718-8be0-9c37f9df21dc_2000x838.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pEDW!,w_5760,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46602c1b-4ca4-4718-8be0-9c37f9df21dc_2000x838.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/46602c1b-4ca4-4718-8be0-9c37f9df21dc_2000x838.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;full&quot;,&quot;height&quot;:610,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3537396,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-fullscreen" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pEDW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46602c1b-4ca4-4718-8be0-9c37f9df21dc_2000x838.png 424w, https://substackcdn.com/image/fetch/$s_!pEDW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46602c1b-4ca4-4718-8be0-9c37f9df21dc_2000x838.png 848w, https://substackcdn.com/image/fetch/$s_!pEDW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46602c1b-4ca4-4718-8be0-9c37f9df21dc_2000x838.png 1272w, https://substackcdn.com/image/fetch/$s_!pEDW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46602c1b-4ca4-4718-8be0-9c37f9df21dc_2000x838.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><div class="pullquote"><p>This is a post from my Tech Journal section, in which I dive into technical topics, focusing on how I overcome specific challenges.<br>If you're not into the tech stuff, you can unsubscribe from Tech Journal updates from <a href="https://techtrails.io/account">your account</a>.</p></div><p>My build in public journey starts with technical challenges on stuff I wouldn't want to have to deal with&#8230;<br>I'm probably going down a rabbit hole here, but I hope I&#8217;ll be out of it soon.</p><p>The thing is, I have already invested <em>some </em>money in both Carrd &amp; Substack, and I'd like the setup to work. Because I <em>invested </em>in it, right?<br>Right.</p><p>Check out the concept of <a href="https://en.wikipedia.org/wiki/Sunk_cost">sunk costs</a> or <a href="https://en.wikipedia.org/wiki/Escalation_of_commitment">escalation of commitment</a> if you want to understand the dilemma I'm in &#128517;</p><p>Anyway.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/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 Techtrails! Subscribe for free to receive new posts and support my work.</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>So, I've decided to use <a href="https://try.carrd.co/techtrails">Carrd.co</a> to quickly build the landing page for my projects, and Substack to power my newsletter.</p><p>The issue is: since Substack has no public API, there&#8217;s no way to register subscribers on Substack from Carrd forms.</p><h1>SubstackAPI.com</h1><p>While searching for a potential solution, I stumbled upon <a href="https://substackapi.com">SubstackAPI.com</a>.</p><p>I've tried using their solution, but it ended up not working after a short while and I'm not sure why. The author's account is not very active, so I'm going to assume their service is broken&#8230;</p><p>Which leaves me no choice but to figure it out myself.</p><h1>All by myself</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oTcn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73f78ac0-6dd5-4ecf-bc02-51801e1ad6f6_480x400.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oTcn!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73f78ac0-6dd5-4ecf-bc02-51801e1ad6f6_480x400.gif 424w, https://substackcdn.com/image/fetch/$s_!oTcn!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73f78ac0-6dd5-4ecf-bc02-51801e1ad6f6_480x400.gif 848w, https://substackcdn.com/image/fetch/$s_!oTcn!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73f78ac0-6dd5-4ecf-bc02-51801e1ad6f6_480x400.gif 1272w, https://substackcdn.com/image/fetch/$s_!oTcn!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73f78ac0-6dd5-4ecf-bc02-51801e1ad6f6_480x400.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oTcn!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73f78ac0-6dd5-4ecf-bc02-51801e1ad6f6_480x400.gif" width="480" height="400" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/73f78ac0-6dd5-4ecf-bc02-51801e1ad6f6_480x400.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:400,&quot;width&quot;:480,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Ill Do It Myself Season 4 GIF by The Office&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="Ill Do It Myself Season 4 GIF by The Office" title="Ill Do It Myself Season 4 GIF by The Office" srcset="https://substackcdn.com/image/fetch/$s_!oTcn!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73f78ac0-6dd5-4ecf-bc02-51801e1ad6f6_480x400.gif 424w, https://substackcdn.com/image/fetch/$s_!oTcn!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73f78ac0-6dd5-4ecf-bc02-51801e1ad6f6_480x400.gif 848w, https://substackcdn.com/image/fetch/$s_!oTcn!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73f78ac0-6dd5-4ecf-bc02-51801e1ad6f6_480x400.gif 1272w, https://substackcdn.com/image/fetch/$s_!oTcn!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73f78ac0-6dd5-4ecf-bc02-51801e1ad6f6_480x400.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>Substack <em>does</em> have an API to register new subscribers. It's just not public.<br>So I'm taking my chances trying to use it myself, and I'm guessing that's just what substackapi.com did initially.</p><h2>How Substack does it</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5k0-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2607e63f-d47a-46d8-9c76-c47264b5be07_858x754.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5k0-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2607e63f-d47a-46d8-9c76-c47264b5be07_858x754.png 424w, https://substackcdn.com/image/fetch/$s_!5k0-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2607e63f-d47a-46d8-9c76-c47264b5be07_858x754.png 848w, https://substackcdn.com/image/fetch/$s_!5k0-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2607e63f-d47a-46d8-9c76-c47264b5be07_858x754.png 1272w, https://substackcdn.com/image/fetch/$s_!5k0-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2607e63f-d47a-46d8-9c76-c47264b5be07_858x754.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5k0-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2607e63f-d47a-46d8-9c76-c47264b5be07_858x754.png" width="318" height="279.45454545454544" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2607e63f-d47a-46d8-9c76-c47264b5be07_858x754.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:754,&quot;width&quot;:858,&quot;resizeWidth&quot;:318,&quot;bytes&quot;:127732,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5k0-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2607e63f-d47a-46d8-9c76-c47264b5be07_858x754.png 424w, https://substackcdn.com/image/fetch/$s_!5k0-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2607e63f-d47a-46d8-9c76-c47264b5be07_858x754.png 848w, https://substackcdn.com/image/fetch/$s_!5k0-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2607e63f-d47a-46d8-9c76-c47264b5be07_858x754.png 1272w, https://substackcdn.com/image/fetch/$s_!5k0-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2607e63f-d47a-46d8-9c76-c47264b5be07_858x754.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;splash screen&#8221; subscription form for my publication allowed me to get the details of the API call they're making to their servers to add a new subscriber. Here it is as a <code>cURL</code> 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_!A93C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4a9238e-85b1-4309-8952-0c4d68989d5f_1724x1200.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!A93C!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4a9238e-85b1-4309-8952-0c4d68989d5f_1724x1200.png 424w, https://substackcdn.com/image/fetch/$s_!A93C!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4a9238e-85b1-4309-8952-0c4d68989d5f_1724x1200.png 848w, https://substackcdn.com/image/fetch/$s_!A93C!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4a9238e-85b1-4309-8952-0c4d68989d5f_1724x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!A93C!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4a9238e-85b1-4309-8952-0c4d68989d5f_1724x1200.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!A93C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4a9238e-85b1-4309-8952-0c4d68989d5f_1724x1200.png" width="1456" height="1013" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c4a9238e-85b1-4309-8952-0c4d68989d5f_1724x1200.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1013,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:303406,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!A93C!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4a9238e-85b1-4309-8952-0c4d68989d5f_1724x1200.png 424w, https://substackcdn.com/image/fetch/$s_!A93C!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4a9238e-85b1-4309-8952-0c4d68989d5f_1724x1200.png 848w, https://substackcdn.com/image/fetch/$s_!A93C!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4a9238e-85b1-4309-8952-0c4d68989d5f_1724x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!A93C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4a9238e-85b1-4309-8952-0c4d68989d5f_1724x1200.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 important part is of course the JSON data at the end of the command, but interestingly Substack will not process the subscriber when I remove too much of the headers.</p><p>With trial and error, I got the request stripped down to:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uy8r!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed3a23e-ac58-49cf-8054-1c675b0a72fe_1744x796.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uy8r!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed3a23e-ac58-49cf-8054-1c675b0a72fe_1744x796.png 424w, https://substackcdn.com/image/fetch/$s_!uy8r!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed3a23e-ac58-49cf-8054-1c675b0a72fe_1744x796.png 848w, https://substackcdn.com/image/fetch/$s_!uy8r!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed3a23e-ac58-49cf-8054-1c675b0a72fe_1744x796.png 1272w, https://substackcdn.com/image/fetch/$s_!uy8r!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed3a23e-ac58-49cf-8054-1c675b0a72fe_1744x796.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uy8r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed3a23e-ac58-49cf-8054-1c675b0a72fe_1744x796.png" width="1456" height="665" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5ed3a23e-ac58-49cf-8054-1c675b0a72fe_1744x796.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:665,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:211550,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uy8r!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed3a23e-ac58-49cf-8054-1c675b0a72fe_1744x796.png 424w, https://substackcdn.com/image/fetch/$s_!uy8r!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed3a23e-ac58-49cf-8054-1c675b0a72fe_1744x796.png 848w, https://substackcdn.com/image/fetch/$s_!uy8r!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed3a23e-ac58-49cf-8054-1c675b0a72fe_1744x796.png 1272w, https://substackcdn.com/image/fetch/$s_!uy8r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed3a23e-ac58-49cf-8054-1c675b0a72fe_1744x796.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>Surprisingly, the <code>user-agent</code> header is required for the email to be sent. I guess it's one of their heuristics to prevent server-to-server signups &#129300;</p><p>The <code>origin</code> header is also definitely used to check where the request is coming from and reject unrecognized sources. Since browsers won't let you override this header in JavaScript <code>fetch</code> requests, it's a good filter for blocking rogue forms from external sources.<br>However it does mean that I'll have to send the request from a server for things to work.</p><h2>Making the call</h2><h3>Using Carrd&#8217;s custom form handler</h3><p>It's possible, using Carrd, to directly address a remote server with a custom JSON payload. What's nice is, they make the API call from their own servers.<br>So I wouldn't have anything to code or host if it works!</p><p>I have dropped the <code>accept</code> and <code>content-type</code> headers as I suppose they'll be added by Carrd:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!I7uU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57ef4951-487d-4c64-8cdf-30ee5712be31_810x1686.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!I7uU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57ef4951-487d-4c64-8cdf-30ee5712be31_810x1686.png 424w, https://substackcdn.com/image/fetch/$s_!I7uU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57ef4951-487d-4c64-8cdf-30ee5712be31_810x1686.png 848w, https://substackcdn.com/image/fetch/$s_!I7uU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57ef4951-487d-4c64-8cdf-30ee5712be31_810x1686.png 1272w, https://substackcdn.com/image/fetch/$s_!I7uU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57ef4951-487d-4c64-8cdf-30ee5712be31_810x1686.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!I7uU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57ef4951-487d-4c64-8cdf-30ee5712be31_810x1686.png" width="318" height="661.9111111111112" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/57ef4951-487d-4c64-8cdf-30ee5712be31_810x1686.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1686,&quot;width&quot;:810,&quot;resizeWidth&quot;:318,&quot;bytes&quot;:206503,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!I7uU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57ef4951-487d-4c64-8cdf-30ee5712be31_810x1686.png 424w, https://substackcdn.com/image/fetch/$s_!I7uU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57ef4951-487d-4c64-8cdf-30ee5712be31_810x1686.png 848w, https://substackcdn.com/image/fetch/$s_!I7uU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57ef4951-487d-4c64-8cdf-30ee5712be31_810x1686.png 1272w, https://substackcdn.com/image/fetch/$s_!I7uU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57ef4951-487d-4c64-8cdf-30ee5712be31_810x1686.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 took me 2 minutes to set this up on my Carrd form. Will it work?</p><p>&#128073; Hit save<br>&#128073; Open landing page<br>&#128073; Enter email &amp; click &#8220;get updates&#8221; &#8230;<br>&#129345;<br>&#129431;&#129431;&#129431;</p><p>The call seems to have been successful, but I do not receive any subscription confirmation email from Substack.</p><p>Let's investigate!</p><p>As Carrd is sending the request from their servers, I cannot debug the API call from my browser. Using <a href="https://beeceptor.com/">Beeceptor</a>, I setup a mock endpoint to send the requests to, and inspect what data and headers Carrd is sending.</p><p>Here are the headers:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5Opx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d0651f5-231b-49bc-8c03-37cb5a8461b2_1840x750.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5Opx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d0651f5-231b-49bc-8c03-37cb5a8461b2_1840x750.png 424w, https://substackcdn.com/image/fetch/$s_!5Opx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d0651f5-231b-49bc-8c03-37cb5a8461b2_1840x750.png 848w, https://substackcdn.com/image/fetch/$s_!5Opx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d0651f5-231b-49bc-8c03-37cb5a8461b2_1840x750.png 1272w, https://substackcdn.com/image/fetch/$s_!5Opx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d0651f5-231b-49bc-8c03-37cb5a8461b2_1840x750.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5Opx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d0651f5-231b-49bc-8c03-37cb5a8461b2_1840x750.png" width="728" height="296.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2d0651f5-231b-49bc-8c03-37cb5a8461b2_1840x750.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:593,&quot;width&quot;:1456,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:157612,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5Opx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d0651f5-231b-49bc-8c03-37cb5a8461b2_1840x750.png 424w, https://substackcdn.com/image/fetch/$s_!5Opx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d0651f5-231b-49bc-8c03-37cb5a8461b2_1840x750.png 848w, https://substackcdn.com/image/fetch/$s_!5Opx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d0651f5-231b-49bc-8c03-37cb5a8461b2_1840x750.png 1272w, https://substackcdn.com/image/fetch/$s_!5Opx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d0651f5-231b-49bc-8c03-37cb5a8461b2_1840x750.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>Both the <code>referer</code> and <code>origin</code> headers have been removed from the request. Damn.<br>Why would they do that I don&#8217;t know, but I'll have to use another method.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/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">If you love nothing more than reading a dev over-engineer a form subscription, subscribe!</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><h3>Plan B: all by myself, again</h3><p>Plan B is quite simple: receive the form data from Carrd on a custom endpoint, and forward the subscription to Substack.</p><p>Since my techtrails.io domain is hosted at Cloudflare, I'm going to use their <a href="https://workers.cloudflare.com/">Workers</a> feature to get this done quickly. I had never used Cloudflare as a development platform, and I'm surprised at how easy it is to get something up live!</p><p>All it takes is:</p><pre><code>npm create cloudflare@latest</code></pre><p>Then follow the instructions, log into my Cloudflare account and voil&#224;! I have a running worker online.</p><p>Here&#8217;s the meaty part of what I deployed:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Pn6C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32b169a5-7b6e-4d9c-bcf6-dab92fdd0af8_1840x2956.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Pn6C!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32b169a5-7b6e-4d9c-bcf6-dab92fdd0af8_1840x2956.png 424w, https://substackcdn.com/image/fetch/$s_!Pn6C!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32b169a5-7b6e-4d9c-bcf6-dab92fdd0af8_1840x2956.png 848w, https://substackcdn.com/image/fetch/$s_!Pn6C!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32b169a5-7b6e-4d9c-bcf6-dab92fdd0af8_1840x2956.png 1272w, https://substackcdn.com/image/fetch/$s_!Pn6C!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32b169a5-7b6e-4d9c-bcf6-dab92fdd0af8_1840x2956.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Pn6C!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32b169a5-7b6e-4d9c-bcf6-dab92fdd0af8_1840x2956.png" width="1200" height="1927.7472527472528" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/32b169a5-7b6e-4d9c-bcf6-dab92fdd0af8_1840x2956.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:2339,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:583639,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Pn6C!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32b169a5-7b6e-4d9c-bcf6-dab92fdd0af8_1840x2956.png 424w, https://substackcdn.com/image/fetch/$s_!Pn6C!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32b169a5-7b6e-4d9c-bcf6-dab92fdd0af8_1840x2956.png 848w, https://substackcdn.com/image/fetch/$s_!Pn6C!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32b169a5-7b6e-4d9c-bcf6-dab92fdd0af8_1840x2956.png 1272w, https://substackcdn.com/image/fetch/$s_!Pn6C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32b169a5-7b6e-4d9c-bcf6-dab92fdd0af8_1840x2956.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>Deploying the new code is just a <code>npm run deploy</code> away, and I&#8217;m able to test the endpoint using the automated Swagger UI &#128077;</p><p>Aaaaand&#8230; it does not work.</p><p>I mean, the code works all right, it's pretty simple.<br>But Substack still completely ignores the subscriber request, even though it does respond with an <code>HTTP 200</code> and returns some JSON payload response.</p><p>Using Beeceptor again as the target for this <code>fetch</code> request, I can see that everything is all right from a headers point of view.</p><p>Next, I just launched the <code>node</code> REPL from my machine and pasted the above fetch request into it.</p><p>It works! &#129327;<br>With the <em>exact. same. code.</em></p><p>So now I'm wondering whether they could be identifying that I'm calling them from a Cloudflare worker.<br>Another test from a VPS server led to the same result.<br>Could they be checking the originating IP address for well-known hosting providers?</p><p>Hard to know for sure, but it looks like the server-to-server calls are getting too complicated.</p><h3>Plan C: it's all about <code>origin</code></h3><p>Call me stubborn, but I&#8217;ve got another trick up my sleeve.</p><p>The one thing I&#8217;m sure they won&#8217;t be filtering out is requests coming <em>from a browser</em> and <em>originating from techtrails.io.</em></p><p>I've got one way to pull this out: iframe.</p><p>Cloudflare is an amazing tool. I can use it to re-route some traffic for my techtrails.io domain to a Worker, while letting the rest through to Substack.</p><p>I'm going to host a small HTML page on Cloudflare with some JS code that will send the subscription API call to Substack, and embed this into an iframe on my Carrd landing page.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vaet!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f3ec794-129a-4853-8292-92ce7d7cf8fb_2176x776.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vaet!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f3ec794-129a-4853-8292-92ce7d7cf8fb_2176x776.png 424w, https://substackcdn.com/image/fetch/$s_!vaet!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f3ec794-129a-4853-8292-92ce7d7cf8fb_2176x776.png 848w, https://substackcdn.com/image/fetch/$s_!vaet!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f3ec794-129a-4853-8292-92ce7d7cf8fb_2176x776.png 1272w, https://substackcdn.com/image/fetch/$s_!vaet!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f3ec794-129a-4853-8292-92ce7d7cf8fb_2176x776.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vaet!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f3ec794-129a-4853-8292-92ce7d7cf8fb_2176x776.png" width="1456" height="519" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1f3ec794-129a-4853-8292-92ce7d7cf8fb_2176x776.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:519,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:185645,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vaet!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f3ec794-129a-4853-8292-92ce7d7cf8fb_2176x776.png 424w, https://substackcdn.com/image/fetch/$s_!vaet!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f3ec794-129a-4853-8292-92ce7d7cf8fb_2176x776.png 848w, https://substackcdn.com/image/fetch/$s_!vaet!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f3ec794-129a-4853-8292-92ce7d7cf8fb_2176x776.png 1272w, https://substackcdn.com/image/fetch/$s_!vaet!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f3ec794-129a-4853-8292-92ce7d7cf8fb_2176x776.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>With some cross-frame communication, I can trigger the subscription API call from my Carrd site but with Techtrails as the effective origin, and all should work.</p><p>Let's get to 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_!OePE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b66e629-d3cb-4662-abe8-223d635653ed_592x450.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OePE!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b66e629-d3cb-4662-abe8-223d635653ed_592x450.gif 424w, https://substackcdn.com/image/fetch/$s_!OePE!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b66e629-d3cb-4662-abe8-223d635653ed_592x450.gif 848w, https://substackcdn.com/image/fetch/$s_!OePE!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b66e629-d3cb-4662-abe8-223d635653ed_592x450.gif 1272w, https://substackcdn.com/image/fetch/$s_!OePE!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b66e629-d3cb-4662-abe8-223d635653ed_592x450.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OePE!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b66e629-d3cb-4662-abe8-223d635653ed_592x450.gif" width="592" height="450" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3b66e629-d3cb-4662-abe8-223d635653ed_592x450.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:450,&quot;width&quot;:592,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;alice in wonderland GIF by Disney&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="alice in wonderland GIF by Disney" title="alice in wonderland GIF by Disney" srcset="https://substackcdn.com/image/fetch/$s_!OePE!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b66e629-d3cb-4662-abe8-223d635653ed_592x450.gif 424w, https://substackcdn.com/image/fetch/$s_!OePE!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b66e629-d3cb-4662-abe8-223d635653ed_592x450.gif 848w, https://substackcdn.com/image/fetch/$s_!OePE!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b66e629-d3cb-4662-abe8-223d635653ed_592x450.gif 1272w, https://substackcdn.com/image/fetch/$s_!OePE!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b66e629-d3cb-4662-abe8-223d635653ed_592x450.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><h4>On the Cloudflare side</h4><p>I'm deploying a new Worker that will route everything to Substack normally, except a specific <code>/substack-subscribers</code> route that will serve my special page:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YWbz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e33678-a608-4ee0-926a-e7fd0391d787_1598x1516.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YWbz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e33678-a608-4ee0-926a-e7fd0391d787_1598x1516.png 424w, https://substackcdn.com/image/fetch/$s_!YWbz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e33678-a608-4ee0-926a-e7fd0391d787_1598x1516.png 848w, https://substackcdn.com/image/fetch/$s_!YWbz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e33678-a608-4ee0-926a-e7fd0391d787_1598x1516.png 1272w, https://substackcdn.com/image/fetch/$s_!YWbz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e33678-a608-4ee0-926a-e7fd0391d787_1598x1516.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YWbz!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e33678-a608-4ee0-926a-e7fd0391d787_1598x1516.png" width="1200" height="1138.1868131868132" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/88e33678-a608-4ee0-926a-e7fd0391d787_1598x1516.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:1381,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:295284,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!YWbz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e33678-a608-4ee0-926a-e7fd0391d787_1598x1516.png 424w, https://substackcdn.com/image/fetch/$s_!YWbz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e33678-a608-4ee0-926a-e7fd0391d787_1598x1516.png 848w, https://substackcdn.com/image/fetch/$s_!YWbz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e33678-a608-4ee0-926a-e7fd0391d787_1598x1516.png 1272w, https://substackcdn.com/image/fetch/$s_!YWbz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e33678-a608-4ee0-926a-e7fd0391d787_1598x1516.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>One <code>npm run deploy</code> later, and my domain is now serving this special page at <em>techtrails.io/substack-subscribers</em>.</p><p>But what does it contain?<br>Mainly JavaScript:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!31Ah!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68b74d53-50ee-4b42-8bde-d15eeeb1b3f2_1840x3466.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!31Ah!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68b74d53-50ee-4b42-8bde-d15eeeb1b3f2_1840x3466.png 424w, https://substackcdn.com/image/fetch/$s_!31Ah!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68b74d53-50ee-4b42-8bde-d15eeeb1b3f2_1840x3466.png 848w, https://substackcdn.com/image/fetch/$s_!31Ah!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68b74d53-50ee-4b42-8bde-d15eeeb1b3f2_1840x3466.png 1272w, https://substackcdn.com/image/fetch/$s_!31Ah!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68b74d53-50ee-4b42-8bde-d15eeeb1b3f2_1840x3466.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!31Ah!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68b74d53-50ee-4b42-8bde-d15eeeb1b3f2_1840x3466.png" width="1200" height="2260.714285714286" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/68b74d53-50ee-4b42-8bde-d15eeeb1b3f2_1840x3466.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:2743,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:671116,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!31Ah!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68b74d53-50ee-4b42-8bde-d15eeeb1b3f2_1840x3466.png 424w, https://substackcdn.com/image/fetch/$s_!31Ah!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68b74d53-50ee-4b42-8bde-d15eeeb1b3f2_1840x3466.png 848w, https://substackcdn.com/image/fetch/$s_!31Ah!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68b74d53-50ee-4b42-8bde-d15eeeb1b3f2_1840x3466.png 1272w, https://substackcdn.com/image/fetch/$s_!31Ah!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68b74d53-50ee-4b42-8bde-d15eeeb1b3f2_1840x3466.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>Here&#8217;s what the code does in a nutshell:</p><ul><li><p><strong>Lines 14-64:</strong> Set up a listener for the <code>message</code> event and handle two different messages:</p><ul><li><p><code>substack-subscribers:ack</code> &#8212; simply to let the host page (the Carrd site) acknowledge that our iframe script is ready.</p></li><li><p><code>substack-subscribers:subscribe</code> &#8212; to receive, from the host page, the email address that should be sent to Substack.</p></li></ul></li><li><p><strong>Line 67:</strong> Post the <code>substack-subscribers:init</code> message to the host page. This will allow the host page to know which <code>window</code> &amp; <code>origin</code> pair it should send its own messages to.</p></li></ul><p>It will also post either <code>:subscribed</code> or <code>:error</code> messages to bubble up the Substack API call result to Carrd.</p><h4>On Carrd side</h4><p>On my Carrd landing page, I&#8217;m adding an Embed component to inject the following code into my page:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!z3O-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1641bd6d-8393-453c-a6a8-a1b25e405f12_1840x2630.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!z3O-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1641bd6d-8393-453c-a6a8-a1b25e405f12_1840x2630.png 424w, https://substackcdn.com/image/fetch/$s_!z3O-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1641bd6d-8393-453c-a6a8-a1b25e405f12_1840x2630.png 848w, https://substackcdn.com/image/fetch/$s_!z3O-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1641bd6d-8393-453c-a6a8-a1b25e405f12_1840x2630.png 1272w, https://substackcdn.com/image/fetch/$s_!z3O-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1641bd6d-8393-453c-a6a8-a1b25e405f12_1840x2630.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!z3O-!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1641bd6d-8393-453c-a6a8-a1b25e405f12_1840x2630.png" width="1200" height="1715.10989010989" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1641bd6d-8393-453c-a6a8-a1b25e405f12_1840x2630.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:2081,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:541104,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!z3O-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1641bd6d-8393-453c-a6a8-a1b25e405f12_1840x2630.png 424w, https://substackcdn.com/image/fetch/$s_!z3O-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1641bd6d-8393-453c-a6a8-a1b25e405f12_1840x2630.png 848w, https://substackcdn.com/image/fetch/$s_!z3O-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1641bd6d-8393-453c-a6a8-a1b25e405f12_1840x2630.png 1272w, https://substackcdn.com/image/fetch/$s_!z3O-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1641bd6d-8393-453c-a6a8-a1b25e405f12_1840x2630.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>This code publishes a global <code>Techtrails.subscribeEmail</code> function (lines 40-50) that will be used by the Carrd custom Form to trigger the API call to Substack via the iframe.</p><p>It also handles the following messages:</p><ul><li><p><strong>Lines 14-22:</strong> <code>substack-subscribers:init</code> &#8211; to auto-discover the Techtrails iframe to which messages should be sent.</p></li><li><p><strong>Lines 25-35:</strong> <code>substack-subscribers:subscribed</code> and <code>:error</code> &#8212; to handle subscription success or error by invoking Carrd&#8217;s callbacks. Those callbacks will in turn trigger the Carrd Form success or failure handlers, for instance to redirect to a success page after form submission.</p></li></ul><p>Another Embed component allows me to inject the iframe that will load my <em>techtrails.io/substack-subscribers</em> page, responsible for communicating with Substack:</p><pre><code>&lt;iframe src="https://techtrails.io/substack-subscribers"&gt;&lt;/iframe&gt;</code></pre><p>Finally, I&#8217;m using a custom Carrd form set to <em>run code</em> upon submission:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tiqS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22b794ed-731f-420c-89c1-045db1483ee2_701x1310.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tiqS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22b794ed-731f-420c-89c1-045db1483ee2_701x1310.png 424w, https://substackcdn.com/image/fetch/$s_!tiqS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22b794ed-731f-420c-89c1-045db1483ee2_701x1310.png 848w, https://substackcdn.com/image/fetch/$s_!tiqS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22b794ed-731f-420c-89c1-045db1483ee2_701x1310.png 1272w, https://substackcdn.com/image/fetch/$s_!tiqS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22b794ed-731f-420c-89c1-045db1483ee2_701x1310.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tiqS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22b794ed-731f-420c-89c1-045db1483ee2_701x1310.png" width="397" height="741.8972895863053" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/22b794ed-731f-420c-89c1-045db1483ee2_701x1310.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1310,&quot;width&quot;:701,&quot;resizeWidth&quot;:397,&quot;bytes&quot;:105846,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!tiqS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22b794ed-731f-420c-89c1-045db1483ee2_701x1310.png 424w, https://substackcdn.com/image/fetch/$s_!tiqS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22b794ed-731f-420c-89c1-045db1483ee2_701x1310.png 848w, https://substackcdn.com/image/fetch/$s_!tiqS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22b794ed-731f-420c-89c1-045db1483ee2_701x1310.png 1272w, https://substackcdn.com/image/fetch/$s_!tiqS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22b794ed-731f-420c-89c1-045db1483ee2_701x1310.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 code calls my <code>subscribeEmail</code> function defined earlier, passing in the email to be subscribed and the <code>success</code> and <code>failure</code> callbacks to notify Carrd of submission completion.</p><p>Ok now. Save &amp; publish.</p><h2>The final test</h2><p>Looks like my last idea was the one :)</p><p>Shortly after submitting the form on my landing page, I received the following email:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YzbA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb7f74b-4fe7-4a54-bfdc-8baedde72365_1170x1065.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YzbA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb7f74b-4fe7-4a54-bfdc-8baedde72365_1170x1065.png 424w, https://substackcdn.com/image/fetch/$s_!YzbA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb7f74b-4fe7-4a54-bfdc-8baedde72365_1170x1065.png 848w, https://substackcdn.com/image/fetch/$s_!YzbA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb7f74b-4fe7-4a54-bfdc-8baedde72365_1170x1065.png 1272w, https://substackcdn.com/image/fetch/$s_!YzbA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb7f74b-4fe7-4a54-bfdc-8baedde72365_1170x1065.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YzbA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb7f74b-4fe7-4a54-bfdc-8baedde72365_1170x1065.png" width="398" height="362.28205128205127" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cbb7f74b-4fe7-4a54-bfdc-8baedde72365_1170x1065.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1065,&quot;width&quot;:1170,&quot;resizeWidth&quot;:398,&quot;bytes&quot;:128588,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!YzbA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb7f74b-4fe7-4a54-bfdc-8baedde72365_1170x1065.png 424w, https://substackcdn.com/image/fetch/$s_!YzbA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb7f74b-4fe7-4a54-bfdc-8baedde72365_1170x1065.png 848w, https://substackcdn.com/image/fetch/$s_!YzbA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb7f74b-4fe7-4a54-bfdc-8baedde72365_1170x1065.png 1272w, https://substackcdn.com/image/fetch/$s_!YzbA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb7f74b-4fe7-4a54-bfdc-8baedde72365_1170x1065.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>&#129395;</p><h1>Out of the rabbit hole</h1><p>Et voil&#224;.<br>It was quite a journey to make this work!</p><p>Thank you for reading the whole thing.</p><p>I honestly wouldn&#8217;t have liked to rethink my whole landing page + newsletter setup, especially since I do appreciate Substack as a platform but the landing page design is quite limited.</p><p>However, I can&#8217;t help but feel that being a software engineer can sometimes be a curse in disguise: <em>coding is a superpower I&#8217;m often tempted to use instead of looking for simpler solutions.</em></p><p>It&#8217;s definitely something I&#8217;ll have to be careful about on my journey to build myself a portfolio of side projects.</p><p>What about you? How often do you overdo stuff because you know you can do it?</p><p>Do let me know how you liked this deep dive into bypassing Substack&#8217;s (quite advanced) filters!</p>]]></content:encoded></item><item><title><![CDATA[Installing Rails from scratch]]></title><description><![CDATA[Going back to my roots]]></description><link>https://techtrails.io/p/installing-rails-from-scratch</link><guid isPermaLink="false">https://techtrails.io/p/installing-rails-from-scratch</guid><dc:creator><![CDATA[Olivier Lance]]></dc:creator><pubDate>Sun, 16 Jun 2024 13:39:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!cm0g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5be26e0b-0a39-4bab-9139-d0b3712e09bf_500x483.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cm0g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5be26e0b-0a39-4bab-9139-d0b3712e09bf_500x483.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cm0g!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5be26e0b-0a39-4bab-9139-d0b3712e09bf_500x483.png 424w, https://substackcdn.com/image/fetch/$s_!cm0g!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5be26e0b-0a39-4bab-9139-d0b3712e09bf_500x483.png 848w, https://substackcdn.com/image/fetch/$s_!cm0g!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5be26e0b-0a39-4bab-9139-d0b3712e09bf_500x483.png 1272w, https://substackcdn.com/image/fetch/$s_!cm0g!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5be26e0b-0a39-4bab-9139-d0b3712e09bf_500x483.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cm0g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5be26e0b-0a39-4bab-9139-d0b3712e09bf_500x483.png" width="500" height="483" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5be26e0b-0a39-4bab-9139-d0b3712e09bf_500x483.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:483,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:12576,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cm0g!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5be26e0b-0a39-4bab-9139-d0b3712e09bf_500x483.png 424w, https://substackcdn.com/image/fetch/$s_!cm0g!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5be26e0b-0a39-4bab-9139-d0b3712e09bf_500x483.png 848w, https://substackcdn.com/image/fetch/$s_!cm0g!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5be26e0b-0a39-4bab-9139-d0b3712e09bf_500x483.png 1272w, https://substackcdn.com/image/fetch/$s_!cm0g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5be26e0b-0a39-4bab-9139-d0b3712e09bf_500x483.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>I have been a Ruby on Rails fan for a very long time.</p><p>Unfortunately, my career track did not lead me to use it professionally, so it turns out I haven't touched Rails since its &#8230; 3rd version &#129394;</p><p>Now that I am back to building personal projects, I've decided to pick up Rails again.</p><p>Meaning I have to install the entire stack from scratch, so here are the notes to achieve that<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>:</p><h3>1. Install Ruby via rbenv</h3><p>Looks like the landscape hasn't changed here and it's still RVM vs. rbenv!</p><p>I'm choosing rbenv for&#8230; reasons (mainly because it doesn&#8217;t mess with the environment/standard commands so much):</p><pre><code><code>$ brew install rbenv </code></code></pre><p>Once installed, I can learn that the latest stable Ruby version is now 3.3.3:</p><pre><code>$ rbenv install -l
3.1.6
3.2.4
3.3.3
jruby-9.4.7.0
mruby-3.3.0
picoruby-3.0.0
truffleruby-24.0.1
truffleruby+graalvm-24.0.1

Only latest stable releases for each Ruby implementation are shown.
Use `rbenv install --list-all' to show all local versions.</code></pre><p>So let&#8217;s install it!</p><pre><code>$ rbenv install 3.3.3</code></pre><p>And make it the global Ruby version for my system:</p><pre><code>$ rbenv global 3.3.3</code></pre><p>For everything to work, don't forget to add the following to <code>~/.zshrc</code>:</p><pre><code>eval "$(rbenv init - zsh)"</code></pre><h3>2. Install Rails</h3><p>As easy as it gets:</p><pre><code>$ gem install rails</code></pre><p>And voil&#224; ! Ready to go &#128077;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/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">I'm writing up small tips like this one as I progress through my projects. Subscribe to get more!</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><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>On macOS, using Homebrew, and ZSH as shell</p></div></div>]]></content:encoded></item><item><title><![CDATA[Setting things up]]></title><description><![CDATA[Otherwise called "productive procrastination", or what to do when feeling stuck?]]></description><link>https://techtrails.io/p/setting-things-up</link><guid isPermaLink="false">https://techtrails.io/p/setting-things-up</guid><dc:creator><![CDATA[Olivier Lance]]></dc:creator><pubDate>Sat, 15 Jun 2024 00:14:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!evb4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e00cc55-79eb-42ea-88ef-64693752a054_2048x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!evb4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e00cc55-79eb-42ea-88ef-64693752a054_2048x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset image2-full-screen"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!evb4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e00cc55-79eb-42ea-88ef-64693752a054_2048x1024.png 424w, https://substackcdn.com/image/fetch/$s_!evb4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e00cc55-79eb-42ea-88ef-64693752a054_2048x1024.png 848w, https://substackcdn.com/image/fetch/$s_!evb4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e00cc55-79eb-42ea-88ef-64693752a054_2048x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!evb4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e00cc55-79eb-42ea-88ef-64693752a054_2048x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!evb4!,w_5760,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e00cc55-79eb-42ea-88ef-64693752a054_2048x1024.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8e00cc55-79eb-42ea-88ef-64693752a054_2048x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;full&quot;,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:786113,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-fullscreen" alt="" srcset="https://substackcdn.com/image/fetch/$s_!evb4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e00cc55-79eb-42ea-88ef-64693752a054_2048x1024.png 424w, https://substackcdn.com/image/fetch/$s_!evb4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e00cc55-79eb-42ea-88ef-64693752a054_2048x1024.png 848w, https://substackcdn.com/image/fetch/$s_!evb4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e00cc55-79eb-42ea-88ef-64693752a054_2048x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!evb4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e00cc55-79eb-42ea-88ef-64693752a054_2048x1024.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>I feel stuck.</p><p>Even after deciding I wanted to go down the road of building in public, I feel stuck.<br>Stuck with an inner fear of &#8230; well, I don't know really.</p><p>Once again not finishing what I started?<br>Not being interesting enough?<br>Building a useless app?<br>Failing?</p><p>Probably a mix of all that.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/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">Feeling the same? Subscribe for free to receive new posts and support my work.</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>So to maintain the illusion that I'm doing something towards my goal, I convinced myself I needed some more setup to get started:</p><p>&#9989; Setting up my new substack for this very publication<br>&#9989; Building a landing page for my first project (more on that soon!) on <a href="https://try.carrd.co/techtrails">Carrd.co</a><br>&#9989; Automating subscribers creation from my Carrd landing page to Substack<br>&#9989; Setting up Plausible analytics on both Carrd and Substack</p><p>The last two items were technically challenging so it took me a little while to get them done.</p><p>I'm particularly satisfied with how I managed to set up Plausible on Substack, as it's not an integration Substack does offer.<br>But since I really needed to procrastinate, I found a way :)</p><p>Here's the gist:</p><ul><li><p>Register your domain with <a href="https://cloudflare.com">Cloudflare</a></p></li><li><p>Pay for Substack&#8217;s custom domain option to use that domain</p></li><li><p>Create a <a href="https://developers.cloudflare.com/workers/">Cloudlare Worker</a> that injects Plausible&#8217;s script into the document&#8217;s head</p></li></ul><p>Et voil&#224;.<br>I could write up a detailed tutorial if there's some interest for it &#8211; let me know in the comments or hit reply!</p><p>Now back to being stuck.</p><p>You have probably noted that all 4 items above are checked. All done.<br>So in the next issue, I'll stop stalling and start talking about my first project: <strong>Speakerine</strong>.</p><p>Let's fail forward!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/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 Techtrails! Subscribe for free to receive new posts and support my work.</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>]]></content:encoded></item><item><title><![CDATA[Welcome to Techtrails!]]></title><description><![CDATA[Coming now.]]></description><link>https://techtrails.io/p/welcome</link><guid isPermaLink="false">https://techtrails.io/p/welcome</guid><dc:creator><![CDATA[Olivier Lance]]></dc:creator><pubDate>Tue, 04 Jun 2024 08:18:56 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c12761d-340b-4c7e-b9dd-44b97475f8ac_2048x1357.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cm2l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c12761d-340b-4c7e-b9dd-44b97475f8ac_2048x1357.png" data-component-name="Image2ToDOM"><div class="image2-inset image2-full-screen"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cm2l!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c12761d-340b-4c7e-b9dd-44b97475f8ac_2048x1357.png 424w, https://substackcdn.com/image/fetch/$s_!cm2l!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c12761d-340b-4c7e-b9dd-44b97475f8ac_2048x1357.png 848w, https://substackcdn.com/image/fetch/$s_!cm2l!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c12761d-340b-4c7e-b9dd-44b97475f8ac_2048x1357.png 1272w, https://substackcdn.com/image/fetch/$s_!cm2l!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c12761d-340b-4c7e-b9dd-44b97475f8ac_2048x1357.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cm2l!,w_5760,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c12761d-340b-4c7e-b9dd-44b97475f8ac_2048x1357.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8c12761d-340b-4c7e-b9dd-44b97475f8ac_2048x1357.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;full&quot;,&quot;height&quot;:965,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1392558,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-fullscreen" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cm2l!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c12761d-340b-4c7e-b9dd-44b97475f8ac_2048x1357.png 424w, https://substackcdn.com/image/fetch/$s_!cm2l!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c12761d-340b-4c7e-b9dd-44b97475f8ac_2048x1357.png 848w, https://substackcdn.com/image/fetch/$s_!cm2l!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c12761d-340b-4c7e-b9dd-44b97475f8ac_2048x1357.png 1272w, https://substackcdn.com/image/fetch/$s_!cm2l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c12761d-340b-4c7e-b9dd-44b97475f8ac_2048x1357.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>It took me a long time to dare.</p><p>I'm finally jumping in and starting my newsletter!<br>I will share later about the process I went through to finally hit the &#8220;publish&#8221; button.</p><p>Right now, I want to tell you what you can expect from me and this publication.</p><h2>Building in public</h2><p>I have been maintaining a list of project ideas for a very long time.<br>To date, there are 28 ideas in this list. Some are games, others tools, SaaS services or even goofy apps&#8230;</p><p>So far I have actually worked on none of those ideas. Zero. Nada.<br>That's got to change.</p><p>So I've decided to start building those projects, one by one, and to build them in public to make myself accountable.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://techtrails.io/subscribe?"><span>Subscribe now</span></a></p><h2>Sharing is caring</h2><p>My objective: personal fulfilment and financial autonomy.<br>But to be honest, I have no idea where this will take me.</p><p>What I do know is that it took me a long time to dare, and that I will learn many things along the way. Through failures and successes alike.</p><p>Facing this uncertain road, I want to use this newsletter to:</p><ul><li><p>share the struggles and the successes, but most importantly the learnings they bring</p></li><li><p>find some support in exchanging with people in similar situations or with similar endeavours</p></li><li><p>maybe help some of you to dare, too!</p></li></ul><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://techtrails.io/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">If that&#8217;s a journey you'd like to embark on with me, it starts now!</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></channel></rss>