<?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[workerwizard's Substack]]></title><description><![CDATA[Working with workers ]]></description><link>https://blog.workerwizard.com</link><image><url>https://substackcdn.com/image/fetch/$s_!eMKi!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F734eefe1-4d59-420e-9925-e44088dd9aa6_144x144.png</url><title>workerwizard&apos;s Substack</title><link>https://blog.workerwizard.com</link></image><generator>Substack</generator><lastBuildDate>Wed, 06 May 2026 11:07:32 GMT</lastBuildDate><atom:link href="https://blog.workerwizard.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[ww]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[workerwizard@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[workerwizard@substack.com]]></itunes:email><itunes:name><![CDATA[nihonnken]]></itunes:name></itunes:owner><itunes:author><![CDATA[nihonnken]]></itunes:author><googleplay:owner><![CDATA[workerwizard@substack.com]]></googleplay:owner><googleplay:email><![CDATA[workerwizard@substack.com]]></googleplay:email><googleplay:author><![CDATA[nihonnken]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[What is in a k8s cluster?]]></title><description><![CDATA[Why is it called a cluster?]]></description><link>https://blog.workerwizard.com/p/what-is-in-a-k8s-cluster</link><guid isPermaLink="false">https://blog.workerwizard.com/p/what-is-in-a-k8s-cluster</guid><dc:creator><![CDATA[nihonnken]]></dc:creator><pubDate>Tue, 22 Apr 2025 21:11:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FABo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26619be9-1e79-4551-a1a6-31630d080d17_1184x377.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>What is a K8s Cluster?</h2><p>A Kubernetes (K8s) cluster is not a homogeneous collection of machines. Instead, it consists of a control plane and multiple worker nodes that function as a unified system. This architecture is why we call it a "cluster" - it's a collection of connected computing resources working together.</p><p>Important distinctions:</p><ul><li><p>It's <strong>not</strong> a "cluster of containers" - containers are what run on the cluster</p></li><li><p>It <strong>is</strong> a "cluster of machines/VPS/VMs" - these form the physical/virtual infrastructure</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FABo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26619be9-1e79-4551-a1a6-31630d080d17_1184x377.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FABo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26619be9-1e79-4551-a1a6-31630d080d17_1184x377.png 424w, https://substackcdn.com/image/fetch/$s_!FABo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26619be9-1e79-4551-a1a6-31630d080d17_1184x377.png 848w, https://substackcdn.com/image/fetch/$s_!FABo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26619be9-1e79-4551-a1a6-31630d080d17_1184x377.png 1272w, https://substackcdn.com/image/fetch/$s_!FABo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26619be9-1e79-4551-a1a6-31630d080d17_1184x377.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FABo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26619be9-1e79-4551-a1a6-31630d080d17_1184x377.png" width="1184" height="377" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/26619be9-1e79-4551-a1a6-31630d080d17_1184x377.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:377,&quot;width&quot;:1184,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:26361,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.workerwizard.com/i/161920196?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26619be9-1e79-4551-a1a6-31630d080d17_1184x377.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!FABo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26619be9-1e79-4551-a1a6-31630d080d17_1184x377.png 424w, https://substackcdn.com/image/fetch/$s_!FABo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26619be9-1e79-4551-a1a6-31630d080d17_1184x377.png 848w, https://substackcdn.com/image/fetch/$s_!FABo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26619be9-1e79-4551-a1a6-31630d080d17_1184x377.png 1272w, https://substackcdn.com/image/fetch/$s_!FABo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26619be9-1e79-4551-a1a6-31630d080d17_1184x377.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></p><h2>Cluster Components</h2><h3>Control Plane</h3><p>The control plane is the brain of the Kubernetes cluster, responsible for maintaining the desired state of the cluster. It includes:</p><ul><li><p>API Server: The frontend of the control plane</p></li><li><p>etcd: The cluster's database and source of truth</p></li><li><p>Scheduler: Assigns pods to nodes</p></li><li><p>Controller Manager: Manages various controllers</p></li></ul><h3>Worker Nodes</h3><p>Worker nodes are the machines where your containers actually run. Each worker node includes:</p><ul><li><p>Kubelet: Ensures containers are running in pods</p></li><li><p>Kube-proxy: Maintains network rules</p></li><li><p>Container Runtime: Software for running containers (Docker, containerd, etc.)</p></li></ul><h2>Pod Architecture</h2><p>In Kubernetes, the <strong>pod</strong> is the smallest deployable unit (SDU). A pod represents one or more containers that:</p><ul><li><p>Share the same network namespace (IP address and port space)</p></li><li><p>Share the same storage/volumes</p></li><li><p>Are scheduled together on the same node</p></li></ul><h3>Container Relationship</h3><ul><li><p>One pod can contain one or multiple containers</p></li><li><p>Most commonly, a pod contains just a single container</p></li><li><p>Containers within a pod are always co-located and co-scheduled</p></li></ul><h2>Deployment Patterns</h2><h3>Example Scenario</h3><p>Let's consider a scenario with Traefik as an ingress controller, a Python ML service, and a Node.js web service.</p><h4>Option 1: Multi-container Pod Approach</h4><p>You could put Traefik, the Python ML service, and the Node.js web service all in a single pod. This makes sense if:</p><ul><li><p>These services always need to be deployed together</p></li><li><p>They need to communicate via localhost</p></li><li><p>They share a lifecycle (start/stop together)</p></li></ul><h4>Option 2: Typical Kubernetes Approach</h4><p>More commonly, you'd structure this as:</p><ul><li><p>A Traefik pod (as a DaemonSet or Deployment)</p></li><li><p>A Python ML service pod (as a Deployment)</p></li><li><p>A Node.js web service pod (as a Deployment)</p></li></ul><p>This separation provides flexibility to:</p><ul><li><p>Scale each component independently</p></li><li><p>Update each component separately</p></li><li><p>Have different resource allocations for each service</p></li></ul><h3>The Sidecar Pattern</h3><p>A common multi-container pod use case is the sidecar pattern:</p><ul><li><p>Main container: Your primary application (e.g., Python ML service)</p></li><li><p>Sidecar container: A helper container (e.g., logging or monitoring)</p></li></ul><h2>DaemonSets vs Deployments</h2><h3>DaemonSet</h3><ul><li><p>Ensures a copy of a pod runs on <strong>every node</strong> in the cluster</p></li><li><p>Exactly one pod per node</p></li><li><p>Automatically adds pods to new nodes</p></li><li><p>Used for cluster-wide services like:</p><ul><li><p>Node monitoring agents</p></li><li><p>Log collectors</p></li><li><p>Network plugins</p></li><li><p>Storage daemons</p></li></ul></li></ul><h3>Deployment</h3><ul><li><p>Manages a set of identical pods (replicas)</p></li><li><p>Pods are distributed across nodes based on available resources</p></li><li><p>You specify the desired replica count</p></li><li><p>Handles rolling updates and rollbacks</p></li><li><p>Used for stateless applications that can be scaled horizontally</p></li></ul><h3>When to Use Which</h3><p>Ask yourself: "Do I need exactly one instance of this service on every node in my cluster?"</p><ul><li><p>If yes, use a DaemonSet</p></li><li><p>If no, use a Deployment</p></li></ul><h2>Mental Model Summary</h2><ul><li><p>The cluster consists of physical/virtual machines (nodes)</p></li><li><p>Nodes run pods</p></li><li><p>Pods contain Docker/OCI containers</p></li></ul><p>This hierarchical structure allows Kubernetes to efficiently manage containerized applications at scale while providing flexibility in deployment strategies.</p>]]></content:encoded></item><item><title><![CDATA[Learn French Through Natural Reading]]></title><description><![CDATA[Comprehensible words via contextual understanding.]]></description><link>https://blog.workerwizard.com/p/learn-french-through-natural-reading</link><guid isPermaLink="false">https://blog.workerwizard.com/p/learn-french-through-natural-reading</guid><dc:creator><![CDATA[nihonnken]]></dc:creator><pubDate>Sat, 22 Feb 2025 21:27:48 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ea935679-dfa2-487a-873c-012145461a55_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Word-in-context (WIC)</h2><div class="pullquote"><p><em>You shall know a word by the company it keeps</em></p><p>&#8212; Firth (1954)</p></div><p>The word-in-context (WIC) technology at <em><a href="https://mywords.io">mywords.io</a></em> helps the reader get the <em><strong>contextual meaning</strong></em> of the word, in both English and French. We help you know a word by the company it keeps, eliminating the need for Google translate, dictionary, or any of technologies which might distract you from the text.</p><p>When  the reader encounters a sentence, such as this next one from <em>L&#8217;&#201;tranger</em>:</p><blockquote><p><em><strong>J'&#233;tais noy&#233; dans le bruit et la poussi&#232;re.</strong></em></p></blockquote><p>On clicking <strong>noy&#233;, </strong>the reader would get the explanation (NOT the translation) in this specific context. </p><blockquote><p><em><strong>noy&#233;</strong></em></p><p><em>Overwhelmed or engulfed by something</em></p><p><em>Submerg&#233; ou englouti par quelque chose</em></p></blockquote><p>Similarly, on clicking bruit, one would get</p><blockquote><p><em><strong>bruit</strong></em></p><p><em>Noise or sound</em> </p><p><em>son qui d&#233;range</em></p></blockquote><p>On clicking poussi&#232;re: </p><blockquote><p><em><strong>poussi&#232;re</strong></em></p><p><em>Dust or dirt particles</em></p><p><em>Particules de salet&#233; qui flottent dans l'air</em></p></blockquote><h2>WIC: In the wild Example</h2><p>Here is a screenshot of another example:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!n_Tp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc78e471d-dfe6-4b97-98b5-039a9b67a16a_733x151.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!n_Tp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc78e471d-dfe6-4b97-98b5-039a9b67a16a_733x151.png 424w, https://substackcdn.com/image/fetch/$s_!n_Tp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc78e471d-dfe6-4b97-98b5-039a9b67a16a_733x151.png 848w, https://substackcdn.com/image/fetch/$s_!n_Tp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc78e471d-dfe6-4b97-98b5-039a9b67a16a_733x151.png 1272w, https://substackcdn.com/image/fetch/$s_!n_Tp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc78e471d-dfe6-4b97-98b5-039a9b67a16a_733x151.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!n_Tp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc78e471d-dfe6-4b97-98b5-039a9b67a16a_733x151.png" width="733" height="151" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c78e471d-dfe6-4b97-98b5-039a9b67a16a_733x151.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:151,&quot;width&quot;:733,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:16440,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mywords.io/i/157702704?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc78e471d-dfe6-4b97-98b5-039a9b67a16a_733x151.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!n_Tp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc78e471d-dfe6-4b97-98b5-039a9b67a16a_733x151.png 424w, https://substackcdn.com/image/fetch/$s_!n_Tp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc78e471d-dfe6-4b97-98b5-039a9b67a16a_733x151.png 848w, https://substackcdn.com/image/fetch/$s_!n_Tp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc78e471d-dfe6-4b97-98b5-039a9b67a16a_733x151.png 1272w, https://substackcdn.com/image/fetch/$s_!n_Tp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc78e471d-dfe6-4b97-98b5-039a9b67a16a_733x151.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Sentence with auxiliary audio and translation </figcaption></figure></div><p>The sentence is:</p><blockquote><p><em><strong>Mais il le fera sans doute apr&#232;s-demain, quand il me verra en deuil.</strong></em></p></blockquote><p>On user&#8217;s clicking on the word <em><strong>deuil</strong></em>, the translation of the sentence is immediately provided just above the original French text. Simultaneously, the page displays the explanations of the contextual meaning of the word in both languages:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kpFQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6484f4a5-e5b6-4c81-8414-169ba31b64c3_359x213.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kpFQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6484f4a5-e5b6-4c81-8414-169ba31b64c3_359x213.png 424w, https://substackcdn.com/image/fetch/$s_!kpFQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6484f4a5-e5b6-4c81-8414-169ba31b64c3_359x213.png 848w, https://substackcdn.com/image/fetch/$s_!kpFQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6484f4a5-e5b6-4c81-8414-169ba31b64c3_359x213.png 1272w, https://substackcdn.com/image/fetch/$s_!kpFQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6484f4a5-e5b6-4c81-8414-169ba31b64c3_359x213.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kpFQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6484f4a5-e5b6-4c81-8414-169ba31b64c3_359x213.png" width="359" height="213" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6484f4a5-e5b6-4c81-8414-169ba31b64c3_359x213.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:213,&quot;width&quot;:359,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:11262,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mywords.io/i/157702704?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6484f4a5-e5b6-4c81-8414-169ba31b64c3_359x213.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kpFQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6484f4a5-e5b6-4c81-8414-169ba31b64c3_359x213.png 424w, https://substackcdn.com/image/fetch/$s_!kpFQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6484f4a5-e5b6-4c81-8414-169ba31b64c3_359x213.png 848w, https://substackcdn.com/image/fetch/$s_!kpFQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6484f4a5-e5b6-4c81-8414-169ba31b64c3_359x213.png 1272w, https://substackcdn.com/image/fetch/$s_!kpFQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6484f4a5-e5b6-4c81-8414-169ba31b64c3_359x213.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">WIC in both English and French</figcaption></figure></div><p>Now this is a funny example &#8212; <em><strong>deuil </strong></em>has very little ambiguity in any context. Nevertheless, the reader can still learn how a &#8216;french-minded&#8217; person would explain the meaning of the word. The expressions used here, such as <em><strong>il s&#8217;agit </strong></em>and <em><strong>signe de </strong></em>are both very useful for describing things in general.</p><h2>WIC-Gin</h2><p>Gin is good.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HQUV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41226443-f900-49e3-9cb4-9834b3ae8e9d_913x233.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HQUV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41226443-f900-49e3-9cb4-9834b3ae8e9d_913x233.png 424w, https://substackcdn.com/image/fetch/$s_!HQUV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41226443-f900-49e3-9cb4-9834b3ae8e9d_913x233.png 848w, https://substackcdn.com/image/fetch/$s_!HQUV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41226443-f900-49e3-9cb4-9834b3ae8e9d_913x233.png 1272w, https://substackcdn.com/image/fetch/$s_!HQUV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41226443-f900-49e3-9cb4-9834b3ae8e9d_913x233.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HQUV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41226443-f900-49e3-9cb4-9834b3ae8e9d_913x233.png" width="913" height="233" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/41226443-f900-49e3-9cb4-9834b3ae8e9d_913x233.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:233,&quot;width&quot;:913,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:19912,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mywords.io/i/157702704?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41226443-f900-49e3-9cb4-9834b3ae8e9d_913x233.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!HQUV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41226443-f900-49e3-9cb4-9834b3ae8e9d_913x233.png 424w, https://substackcdn.com/image/fetch/$s_!HQUV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41226443-f900-49e3-9cb4-9834b3ae8e9d_913x233.png 848w, https://substackcdn.com/image/fetch/$s_!HQUV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41226443-f900-49e3-9cb4-9834b3ae8e9d_913x233.png 1272w, https://substackcdn.com/image/fetch/$s_!HQUV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41226443-f900-49e3-9cb4-9834b3ae8e9d_913x233.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Contexts ginned with <em><strong>deuil</strong></em></figcaption></figure></div><p>On clicking on a <em><strong>deuil</strong></em>, the word is saved to the user&#8217;s notebook for review. Subsequently, whenever the user clicks <em><strong>deuil</strong></em> in their notbook, they will see all sentences they&#8217;ve read in which the word <em><strong>deuil </strong></em>has appeared. This sentence-word association is achieved via a data indexing algorithm called <a href="https://www.postgresql.org/docs/current/gin.html">generalized inverted index (GIN)</a>.  Gin is good, better than Elasticsearch lol.</p><p>The 2 sentences (or better, contexts) where <em><strong>deuil</strong></em> has appeared are as shown in the screenshot.</p><h2><strong>Conclusion</strong></h2><p>Word in context technology has been introduced. Examples have been given. Everyone is invited to use the WIC technology and have fun reading French with ease at <em><a href="https://mywords.io">mywords.io</a>. </em></p><p>Remember: <em>you shall know a word by the company it keeps.</em></p><p></p>]]></content:encoded></item><item><title><![CDATA[Cloudflare native Sveltekit: Hyperdrive, Postgres, Pages]]></title><description><![CDATA[Setting up Sveltekit with Cloudflare Pages and Hyperdrive. Serverless!]]></description><link>https://blog.workerwizard.com/p/cloudflare-native-sveltekit-hyperdrive</link><guid isPermaLink="false">https://blog.workerwizard.com/p/cloudflare-native-sveltekit-hyperdrive</guid><dc:creator><![CDATA[nihonnken]]></dc:creator><pubDate>Sun, 16 Feb 2025 17:46:58 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!anCM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e9328d-a437-49d8-b8b7-cadd9a9ac28d_1073x739.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You want to deploy sveltekit with Postgres to cloudflare?</p><p>If your postgers is already pooled you can use it very easily with a env var.</p><pre><code>import {<em>DATABASE_URL</em>} from "$env/static/private"
import postgres from "postgres";
import {drizzle} from "drizzle-orm/postgres-js";

//...
// postgres-js db
const client = postgres(DATABASE_URL);
// drizzle db
const db = drizzle(client);</code></pre><p>However, if the postgres is not pooled, and is running on 5432, then we should use Hyperdrive to pool connections. Otherwise, frequent serverless requests will blow up your postgres. See <em>supabase</em> page on connection pooling at <a href="https://supabase.com/docs/guides/database/connecting-to-postgres">Connect to your database | Supabase Docs</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_!anCM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e9328d-a437-49d8-b8b7-cadd9a9ac28d_1073x739.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!anCM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e9328d-a437-49d8-b8b7-cadd9a9ac28d_1073x739.png 424w, https://substackcdn.com/image/fetch/$s_!anCM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e9328d-a437-49d8-b8b7-cadd9a9ac28d_1073x739.png 848w, https://substackcdn.com/image/fetch/$s_!anCM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e9328d-a437-49d8-b8b7-cadd9a9ac28d_1073x739.png 1272w, https://substackcdn.com/image/fetch/$s_!anCM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e9328d-a437-49d8-b8b7-cadd9a9ac28d_1073x739.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!anCM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e9328d-a437-49d8-b8b7-cadd9a9ac28d_1073x739.png" width="1073" height="739" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/46e9328d-a437-49d8-b8b7-cadd9a9ac28d_1073x739.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:739,&quot;width&quot;:1073,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:79623,&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_!anCM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e9328d-a437-49d8-b8b7-cadd9a9ac28d_1073x739.png 424w, https://substackcdn.com/image/fetch/$s_!anCM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e9328d-a437-49d8-b8b7-cadd9a9ac28d_1073x739.png 848w, https://substackcdn.com/image/fetch/$s_!anCM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e9328d-a437-49d8-b8b7-cadd9a9ac28d_1073x739.png 1272w, https://substackcdn.com/image/fetch/$s_!anCM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e9328d-a437-49d8-b8b7-cadd9a9ac28d_1073x739.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Serverless requests, run on your workers or pages functions. Hyperdrive is the connection pool, running on Cloudflare infra</figcaption></figure></div><p>Hyperdrive will be maintained by Cloudflare infra and made as an available binding for your worker or pages functions.</p><p>Enabled <em>node_js compat</em>, injest Hyperdrive into hooks.server.ts locals object, and you&#8217;re good to go.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PjZj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc0c1b7-57b8-4eea-9d89-d626adb5b726_3168x3460.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PjZj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc0c1b7-57b8-4eea-9d89-d626adb5b726_3168x3460.png 424w, https://substackcdn.com/image/fetch/$s_!PjZj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc0c1b7-57b8-4eea-9d89-d626adb5b726_3168x3460.png 848w, https://substackcdn.com/image/fetch/$s_!PjZj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc0c1b7-57b8-4eea-9d89-d626adb5b726_3168x3460.png 1272w, https://substackcdn.com/image/fetch/$s_!PjZj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc0c1b7-57b8-4eea-9d89-d626adb5b726_3168x3460.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PjZj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc0c1b7-57b8-4eea-9d89-d626adb5b726_3168x3460.png" width="1456" height="1590" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9cc0c1b7-57b8-4eea-9d89-d626adb5b726_3168x3460.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1590,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1439794,&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_!PjZj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc0c1b7-57b8-4eea-9d89-d626adb5b726_3168x3460.png 424w, https://substackcdn.com/image/fetch/$s_!PjZj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc0c1b7-57b8-4eea-9d89-d626adb5b726_3168x3460.png 848w, https://substackcdn.com/image/fetch/$s_!PjZj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc0c1b7-57b8-4eea-9d89-d626adb5b726_3168x3460.png 1272w, https://substackcdn.com/image/fetch/$s_!PjZj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc0c1b7-57b8-4eea-9d89-d626adb5b726_3168x3460.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>The bindings is shown here:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qIYY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ea0be58-66d9-4e96-8349-a050b4bb579d_748x53.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qIYY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ea0be58-66d9-4e96-8349-a050b4bb579d_748x53.png 424w, https://substackcdn.com/image/fetch/$s_!qIYY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ea0be58-66d9-4e96-8349-a050b4bb579d_748x53.png 848w, https://substackcdn.com/image/fetch/$s_!qIYY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ea0be58-66d9-4e96-8349-a050b4bb579d_748x53.png 1272w, https://substackcdn.com/image/fetch/$s_!qIYY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ea0be58-66d9-4e96-8349-a050b4bb579d_748x53.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qIYY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ea0be58-66d9-4e96-8349-a050b4bb579d_748x53.png" width="748" height="53" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1ea0be58-66d9-4e96-8349-a050b4bb579d_748x53.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:53,&quot;width&quot;:748,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3750,&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_!qIYY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ea0be58-66d9-4e96-8349-a050b4bb579d_748x53.png 424w, https://substackcdn.com/image/fetch/$s_!qIYY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ea0be58-66d9-4e96-8349-a050b4bb579d_748x53.png 848w, https://substackcdn.com/image/fetch/$s_!qIYY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ea0be58-66d9-4e96-8349-a050b4bb579d_748x53.png 1272w, https://substackcdn.com/image/fetch/$s_!qIYY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ea0be58-66d9-4e96-8349-a050b4bb579d_748x53.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Here <em>hypg</em> is a random name, HYPERDRIVE is the binding var.</p><p><a href="https://mywords.io">https://mywords.io</a> runs with this set up. Have fun.</p>]]></content:encoded></item><item><title><![CDATA[Deploy Sveltekit with nodejs + Github CICD:]]></title><description><![CDATA[Smoother than Vercel but complicated indeed]]></description><link>https://blog.workerwizard.com/p/deploy-sveltekit-with-nodejs-github</link><guid isPermaLink="false">https://blog.workerwizard.com/p/deploy-sveltekit-with-nodejs-github</guid><dc:creator><![CDATA[nihonnken]]></dc:creator><pubDate>Fri, 22 Nov 2024 16:07:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Wvw_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92558f0c-f689-43a0-ab45-e3ac286bf9df_811x511.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I will teach you how to deploy sveltekit on a vps with nodejs + github CICD. You probably won&#8217;t make it following this tutorial. But you might if you have had some experience and really understood what I&#8217;m getting at.</p><p></p><p><strong>Idea:</strong> </p><ol><li><p>having a machine (builder) somewhere that listens for code change in git repo. </p></li><li><p>On change, the builder rebuilds the project with an array of secret variables you gave it</p></li><li><p>Builder sends (scp) the <strong>build </strong>to the production server. </p></li><li><p>Builder SSH into the production server </p></li><li><p>Builder executes restart on the server.</p><p>Note: Of course there could be a few seconds of down time inter-deployment&#8212; not so elegant. But you have no user so whatever bro. I also know how to deploy with no down time, but we are in amateur land here.</p></li></ol><p></p><p><strong>Steps:</strong></p><p>I. Set up vps env + ssh credentials (production server)</p><p>II. Init a sveltekit project (code + repo)</p><p>III. configure github and write yml. (repo + secrets + free builder on github)</p><p>IV. ship and ship</p><p></p><p><strong>I. Setting up vps:</strong></p><ol><li><p>generate a pair of keys (<a href="https://www.wpoven.com/tools/create-ssh-key">Generate SSH Key Pair Online</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_!Wvw_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92558f0c-f689-43a0-ab45-e3ac286bf9df_811x511.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Wvw_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92558f0c-f689-43a0-ab45-e3ac286bf9df_811x511.png 424w, https://substackcdn.com/image/fetch/$s_!Wvw_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92558f0c-f689-43a0-ab45-e3ac286bf9df_811x511.png 848w, https://substackcdn.com/image/fetch/$s_!Wvw_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92558f0c-f689-43a0-ab45-e3ac286bf9df_811x511.png 1272w, https://substackcdn.com/image/fetch/$s_!Wvw_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92558f0c-f689-43a0-ab45-e3ac286bf9df_811x511.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Wvw_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92558f0c-f689-43a0-ab45-e3ac286bf9df_811x511.png" width="811" height="511" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/92558f0c-f689-43a0-ab45-e3ac286bf9df_811x511.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:511,&quot;width&quot;:811,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:49233,&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_!Wvw_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92558f0c-f689-43a0-ab45-e3ac286bf9df_811x511.png 424w, https://substackcdn.com/image/fetch/$s_!Wvw_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92558f0c-f689-43a0-ab45-e3ac286bf9df_811x511.png 848w, https://substackcdn.com/image/fetch/$s_!Wvw_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92558f0c-f689-43a0-ab45-e3ac286bf9df_811x511.png 1272w, https://substackcdn.com/image/fetch/$s_!Wvw_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92558f0c-f689-43a0-ab45-e3ac286bf9df_811x511.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>I&#8217;m not using these keys you should not disclose your keys to anyone..</p></li><li><p>put <strong>public key</strong> on vps in a line in the file: </p><p>/root/.ssh/authorized keys </p><pre><code>ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB/IABctG2IpNNaeZVXm+yhtDWRXpjX7lZcr9eTHh/ZV noname</code></pre><p>Note I&#8217;m using a <strong>Linode</strong> <strong>server</strong> with root access. AWS or any other VPS should have some file in some directory for saving entries of public key like this.</p><p></p><p>In this Linode context, the meaning of this file is: </p><p><em>A request with the private key that corresponds to this public key can connect to this vps as <strong>root</strong> user.</em></p><p></p><p>The private key will be saved in your github action secret, as illustrated in section III</p></li><li><p>install nodejs in vps</p><p>follow this site: <a href="https://nodejs.org/en/download/package-manager/current">install nodejs</a> or <strong><a href="https://github.com/nvm-sh/nvm?tab=readme-ov-file#installing-and-updating">nodejs via nvm, which I use in this tutorial</a></strong></p><p>Use  <code>node --version </code>to verify success</p></li><li><p>download and start nginx in vps</p><pre><code>sudo apt install nginx</code></pre><p>and maybe run</p><pre><code> sudo systemctl enable nginx </code></pre><p>I&#8217;m not even sure bro. Ask Claude and see what happens if you&#8217;re stuck.</p></li><li><p>open up application firewall port (22, 80)</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PDLJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c0b9a1c-72ed-4ff0-ae11-99c8f6dbb7e5_1016x361.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PDLJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c0b9a1c-72ed-4ff0-ae11-99c8f6dbb7e5_1016x361.png 424w, https://substackcdn.com/image/fetch/$s_!PDLJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c0b9a1c-72ed-4ff0-ae11-99c8f6dbb7e5_1016x361.png 848w, https://substackcdn.com/image/fetch/$s_!PDLJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c0b9a1c-72ed-4ff0-ae11-99c8f6dbb7e5_1016x361.png 1272w, https://substackcdn.com/image/fetch/$s_!PDLJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c0b9a1c-72ed-4ff0-ae11-99c8f6dbb7e5_1016x361.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PDLJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c0b9a1c-72ed-4ff0-ae11-99c8f6dbb7e5_1016x361.png" width="1016" height="361" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5c0b9a1c-72ed-4ff0-ae11-99c8f6dbb7e5_1016x361.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:361,&quot;width&quot;:1016,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:34061,&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_!PDLJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c0b9a1c-72ed-4ff0-ae11-99c8f6dbb7e5_1016x361.png 424w, https://substackcdn.com/image/fetch/$s_!PDLJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c0b9a1c-72ed-4ff0-ae11-99c8f6dbb7e5_1016x361.png 848w, https://substackcdn.com/image/fetch/$s_!PDLJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c0b9a1c-72ed-4ff0-ae11-99c8f6dbb7e5_1016x361.png 1272w, https://substackcdn.com/image/fetch/$s_!PDLJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c0b9a1c-72ed-4ff0-ae11-99c8f6dbb7e5_1016x361.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>This is to accepting incoming HTTP request at port 80, the default. HTTPs is a bit different so fuck that.</p><p>quite simple on linode. Outta be easy too on digital ocean, lightsail, EC2, Azure and shit</p><p>22 is opened for us to connect to it.</p></li><li><p>Reverse proxy 80 to 0.0.0.0:3000</p><p>Reverse proxy is a bad name and it does not say anything. It is there to confuse you. Congrats.</p><p>What you want is every request that goes to port 80 should be redirected to this vps&#8217;s localhost (0.0.0.0:3000) lol. I&#8217;d like to call it request redirect.</p><p>Later we&#8217;re gonna run this sveltekit server at 3000</p><p></p><p>Add this block to your nginx site conf at<code> /etc/nginx/sites-enabled/default</code></p><p>or is it site-available? I forgot. Fuck this. Just ask Claude bruv.</p><p>This achieves the reverse proxy. Why is reverse proxy important? Actually you can skip this shit by opening 3000 on firewall too. You&#8217;ll learn it&#8217;s all good. You&#8217;ll learn when it is necessary. Given you have no user there ain&#8217;t no probelm.</p><pre><code><code>location / {
    proxy_pass http://0.0.0.0:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}</code></code></pre></li><li><p>Verify that nginx is running at your ip: say 3.124.5.66 by typing it into your browser you should see this page.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HYlH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aa1cdd1-9d8a-47f6-9741-dc535a80cbee_619x185.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HYlH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aa1cdd1-9d8a-47f6-9741-dc535a80cbee_619x185.png 424w, https://substackcdn.com/image/fetch/$s_!HYlH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aa1cdd1-9d8a-47f6-9741-dc535a80cbee_619x185.png 848w, https://substackcdn.com/image/fetch/$s_!HYlH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aa1cdd1-9d8a-47f6-9741-dc535a80cbee_619x185.png 1272w, https://substackcdn.com/image/fetch/$s_!HYlH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aa1cdd1-9d8a-47f6-9741-dc535a80cbee_619x185.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HYlH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aa1cdd1-9d8a-47f6-9741-dc535a80cbee_619x185.png" width="619" height="185" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4aa1cdd1-9d8a-47f6-9741-dc535a80cbee_619x185.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:185,&quot;width&quot;:619,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:37351,&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_!HYlH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aa1cdd1-9d8a-47f6-9741-dc535a80cbee_619x185.png 424w, https://substackcdn.com/image/fetch/$s_!HYlH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aa1cdd1-9d8a-47f6-9741-dc535a80cbee_619x185.png 848w, https://substackcdn.com/image/fetch/$s_!HYlH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aa1cdd1-9d8a-47f6-9741-dc535a80cbee_619x185.png 1272w, https://substackcdn.com/image/fetch/$s_!HYlH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aa1cdd1-9d8a-47f6-9741-dc535a80cbee_619x185.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div></li><li><p>Create a daemon (it will not work for now)</p><p>Face your inner demon brotha!</p><p>A daemon is just a process that can is kept alive like the machine itself.</p><p></p><p>Create a file called <code>my-demo.service</code> at /etc/systemd/system/</p><pre><code>[Unit]
Description=Demon App or whatever
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/root/demo
ExecStart=/root/.nvm/versions/node/v20.17.0/bin/node build
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target</code></pre></li></ol><p><strong>II. Setting up sveltekit:</strong></p><ol><li><p>initiation: <a href="https://svelte.dev/docs/kit/creating-a-project">Creating a project &#8226; Docs &#8226; Svelte</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_!sqxg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39054c9c-ac1d-44ec-b371-5df22e41ad24_704x453.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sqxg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39054c9c-ac1d-44ec-b371-5df22e41ad24_704x453.png 424w, https://substackcdn.com/image/fetch/$s_!sqxg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39054c9c-ac1d-44ec-b371-5df22e41ad24_704x453.png 848w, https://substackcdn.com/image/fetch/$s_!sqxg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39054c9c-ac1d-44ec-b371-5df22e41ad24_704x453.png 1272w, https://substackcdn.com/image/fetch/$s_!sqxg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39054c9c-ac1d-44ec-b371-5df22e41ad24_704x453.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sqxg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39054c9c-ac1d-44ec-b371-5df22e41ad24_704x453.png" width="704" height="453" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/39054c9c-ac1d-44ec-b371-5df22e41ad24_704x453.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:453,&quot;width&quot;:704,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:31858,&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_!sqxg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39054c9c-ac1d-44ec-b371-5df22e41ad24_704x453.png 424w, https://substackcdn.com/image/fetch/$s_!sqxg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39054c9c-ac1d-44ec-b371-5df22e41ad24_704x453.png 848w, https://substackcdn.com/image/fetch/$s_!sqxg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39054c9c-ac1d-44ec-b371-5df22e41ad24_704x453.png 1272w, https://substackcdn.com/image/fetch/$s_!sqxg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39054c9c-ac1d-44ec-b371-5df22e41ad24_704x453.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></li><li><p>change adapter to node</p><p>run this to install the adaptor</p><pre><code>npm i @sveltejs/adapter-node</code></pre><p>modify the import in <code>svelte.config.js from</code></p><pre><code><code>import adapter from '@sveltejs/adapter-auto';</code></code></pre><p>to</p><pre><code><code>import adapter from '@sveltejs/adapter-node';</code></code></pre><p>then run from root directory</p><pre><code>npm run build</code></pre><p>then </p><pre><code><code>node build</code></code></pre><p>to verify it&#8217;s runnable.</p><p>You should get:</p><p><code>Listening on 0.0.0.0:3000</code></p></li></ol><p></p><p><strong>III. Configure github and write action .yml</strong></p><ol><li><p>Get a github repo like <a href="https://github.com/CLQuantizer/node-svelte-demo">this one of mine</a></p></li><li><p>push it up there (<a href="https://github.com/git-guides/git-push">see tutorial</a>)</p></li><li><p>ssh into your vps and clone the repo there</p><p>Then cd into <code>demo (assuming it is called demo)</code></p><p>run</p><pre><code>npm install</code></pre><p>and then maybe </p><pre><code>npm run build</code></pre><p>to see if it can run on the vps lol</p><p>now if you start the daemon we created before it should be running ok:</p><pre><code>sudo systemctl start my-demo</code></pre><p>demo because the service is called my-demo. Don&#8217;t confuse the directory with the daemon service. I don&#8217;t know who you are and what you know. I&#8217;m just writing about all the random things that confuse people here.</p></li><li><p>Write the .yml for github action</p><p>create this file file under .github/workflows directory</p><pre><code>.github/workflows/node.yml</code></pre><p>Again, supposing the project directory is called <code>demo</code></p><p>so this is <code>demo/.github/workflows/node.yml</code></p><p>we could have:</p><pre><code>name: Deploy Svelte to Server

on:
  push:
    branches:
      - node

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install dependencies
        run: |
          npm install

      - name: Build project
        run: npm run build

      - name: Install SSH key
        uses: shimataro/ssh-key-action@v2
        with:
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          known_hosts: unnecessary
          if_key_exists: replace

      - name: Adding Known Hosts
        run: ssh-keyscan -H ${{ secrets.SSH_IP }} &gt;&gt; ~/.ssh/known_hosts

      - name: Deploy to server
        run: |
          scp -r build/ root@${{ secrets.SSH_IP }}:/root/demo/
          ssh root@${{ secrets.SSH_IP }} 'nohup systemctl restart demo &amp;'
</code></pre><p>What this does is:</p><ul><li><p>only react to the <strong>node</strong> branch (set up any branch you&#8217;d like)</p></li><li><p>use node 20 to build</p></li><li><p>build</p></li><li><p>ssh into the machine we rent at linode</p></li><li><p>Not sure if it is necessary to add known hosts lol</p></li><li><p>deploy is really just sending the newly built <code>build </code>directory to the desination, which is <code>/root/demo</code> and then restarting that our daemon process without waiting (nohup means no waiting innit?)</p></li></ul><p></p><p>Note that SSH_PRIVATE_KEY and SSH_IP both should be in your github secrets.</p><p>Like this:</p><p>In our story, the SSH_IP is </p><pre><code>3.124.5.66</code></pre><p>and the SSH_PRIVATE_KEY is </p><pre><code>-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACAfyAAXLRtiKTTWnmVV5vsobQ1kV6Y1+5WXK/Xkx4f2VQAAAJC7vBvmu7wb
5gAAAAtzc2gtZWQyNTUxOQAAACAfyAAXLRtiKTTWnmVV5vsobQ1kV6Y1+5WXK/Xkx4f2VQ
AAAEA6Gub5A7f8Ap4aDZq/vIZ8ZtC7JRkzl2O072hZJi/Sqh/IABctG2IpNNaeZVXm+yht
DWRXpjX7lZcr9eTHh/ZVAAAABm5vbmFtZQECAwQFBgc=
-----END OPENSSH PRIVATE KEY-----</code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZG6q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F074df93d-1963-4fe7-9551-4e92af377922_1126x401.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZG6q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F074df93d-1963-4fe7-9551-4e92af377922_1126x401.png 424w, https://substackcdn.com/image/fetch/$s_!ZG6q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F074df93d-1963-4fe7-9551-4e92af377922_1126x401.png 848w, https://substackcdn.com/image/fetch/$s_!ZG6q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F074df93d-1963-4fe7-9551-4e92af377922_1126x401.png 1272w, https://substackcdn.com/image/fetch/$s_!ZG6q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F074df93d-1963-4fe7-9551-4e92af377922_1126x401.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZG6q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F074df93d-1963-4fe7-9551-4e92af377922_1126x401.png" width="1126" height="401" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/074df93d-1963-4fe7-9551-4e92af377922_1126x401.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:401,&quot;width&quot;:1126,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:25385,&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_!ZG6q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F074df93d-1963-4fe7-9551-4e92af377922_1126x401.png 424w, https://substackcdn.com/image/fetch/$s_!ZG6q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F074df93d-1963-4fe7-9551-4e92af377922_1126x401.png 848w, https://substackcdn.com/image/fetch/$s_!ZG6q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F074df93d-1963-4fe7-9551-4e92af377922_1126x401.png 1272w, https://substackcdn.com/image/fetch/$s_!ZG6q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F074df93d-1963-4fe7-9551-4e92af377922_1126x401.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You can login to github to configure them or run commands, github action will be able to read them. The entries should be visible in you github repo UI.</p></li></ol><p></p><p>OK I think this is enough. It should work.</p><p>I deployed mine at <strong>https://mywords.io, </strong>there is some https nginx tweaks here but not essential.</p><p></p><p>Thanks for reading.</p>]]></content:encoded></item><item><title><![CDATA[A French Reading App for 2020s]]></title><description><![CDATA[Read books in French]]></description><link>https://blog.workerwizard.com/p/a-french-reading-app-for-2024</link><guid isPermaLink="false">https://blog.workerwizard.com/p/a-french-reading-app-for-2024</guid><dc:creator><![CDATA[nihonnken]]></dc:creator><pubDate>Sat, 21 Sep 2024 13:16:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!AWkF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce2195ee-1536-4d9b-8353-cb20528f4a7a_2282x840.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong><a href="http://fr.mywords.io">mywords.io</a>: Read french books easily</strong></p><p>Bonjour, language nerds and bookworms. Welcome to <strong>mywords.io</strong>, where I&#8217;ve made it my mission to help you read French books without feeling like you&#8217;re drowning in a sea of untranslatable nonsense. No flashy promises, no &#8220;be fluent in 30 days&#8221; nonsense. Just you, some excellent French literature, and a few clever tools to help you enjoy it.</p><h3>Why Are We Here?</h3><p>Because reading in another language is hard. And if you&#8217;ve ever cracked open <em>Madame Bovary</em> and thought, &#8220;Why is every other word a mystery?&#8221; I feel you. Inspired by Adele Goldberg&#8217;s work on usage-based learning (fancy talk for &#8220;context matters&#8221;), I built a platform that gives you what you actually need: the ability to figure out what&#8217;s going on without constantly Googling words or losing your place.</p><h3>What Makes mywords.io Cool?</h3><h4><strong>Word-in-Context (WIC) Technology</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AWkF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce2195ee-1536-4d9b-8353-cb20528f4a7a_2282x840.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AWkF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce2195ee-1536-4d9b-8353-cb20528f4a7a_2282x840.png 424w, https://substackcdn.com/image/fetch/$s_!AWkF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce2195ee-1536-4d9b-8353-cb20528f4a7a_2282x840.png 848w, https://substackcdn.com/image/fetch/$s_!AWkF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce2195ee-1536-4d9b-8353-cb20528f4a7a_2282x840.png 1272w, https://substackcdn.com/image/fetch/$s_!AWkF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce2195ee-1536-4d9b-8353-cb20528f4a7a_2282x840.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AWkF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce2195ee-1536-4d9b-8353-cb20528f4a7a_2282x840.png" width="1456" height="536" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ce2195ee-1536-4d9b-8353-cb20528f4a7a_2282x840.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:536,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:285941,&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_!AWkF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce2195ee-1536-4d9b-8353-cb20528f4a7a_2282x840.png 424w, https://substackcdn.com/image/fetch/$s_!AWkF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce2195ee-1536-4d9b-8353-cb20528f4a7a_2282x840.png 848w, https://substackcdn.com/image/fetch/$s_!AWkF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce2195ee-1536-4d9b-8353-cb20528f4a7a_2282x840.png 1272w, https://substackcdn.com/image/fetch/$s_!AWkF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce2195ee-1536-4d9b-8353-cb20528f4a7a_2282x840.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>mywords.io est aussi le r&#233;sultat d&#8217;un hasard</em></figcaption></figure></div><p>Here&#8217;s the thing about words: they&#8217;re sneaky. They don&#8217;t always mean the same thing depending on where you find them. That&#8217;s where <strong>WIC</strong> comes in. Click on a word like <strong>noy&#233;</strong>, and instead of getting a generic translation like &#8220;drowned,&#8221; you get something better&#8212;its actual meaning in the sentence <em>J'&#233;tais noy&#233; dans le bruit et la poussi&#232;re</em>. Spoiler: it&#8217;s more like &#8220;overwhelmed&#8221; here.</p><p>WIC works because it reads the room. You get a quick French and English definition that fits the vibe, not just the dictionary.</p><p>The screenshot below comes from my personal reading session of the book &#8216;Psychologie des Foules&#8217; by Le Bon. For words that I&#8217;m not 100% sure about, I first predicted their contextual meaning in French in my head, and the clicked on them to verify if they meant indeed what I thought.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eoKq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d317bee-9240-4831-9462-1e42b1a19707_1402x628.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eoKq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d317bee-9240-4831-9462-1e42b1a19707_1402x628.png 424w, https://substackcdn.com/image/fetch/$s_!eoKq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d317bee-9240-4831-9462-1e42b1a19707_1402x628.png 848w, https://substackcdn.com/image/fetch/$s_!eoKq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d317bee-9240-4831-9462-1e42b1a19707_1402x628.png 1272w, https://substackcdn.com/image/fetch/$s_!eoKq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d317bee-9240-4831-9462-1e42b1a19707_1402x628.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eoKq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d317bee-9240-4831-9462-1e42b1a19707_1402x628.png" width="1402" height="628" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9d317bee-9240-4831-9462-1e42b1a19707_1402x628.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:628,&quot;width&quot;:1402,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:119497,&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_!eoKq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d317bee-9240-4831-9462-1e42b1a19707_1402x628.png 424w, https://substackcdn.com/image/fetch/$s_!eoKq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d317bee-9240-4831-9462-1e42b1a19707_1402x628.png 848w, https://substackcdn.com/image/fetch/$s_!eoKq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d317bee-9240-4831-9462-1e42b1a19707_1402x628.png 1272w, https://substackcdn.com/image/fetch/$s_!eoKq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d317bee-9240-4831-9462-1e42b1a19707_1402x628.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">an extrait from Psychologie des Foules</figcaption></figure></div><p></p><p></p><h4><strong>Dynamic Word Notebook</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UbWc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e0a630f-e4d2-4a84-aca4-54a479e4b766_2206x1276.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UbWc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e0a630f-e4d2-4a84-aca4-54a479e4b766_2206x1276.png 424w, https://substackcdn.com/image/fetch/$s_!UbWc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e0a630f-e4d2-4a84-aca4-54a479e4b766_2206x1276.png 848w, https://substackcdn.com/image/fetch/$s_!UbWc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e0a630f-e4d2-4a84-aca4-54a479e4b766_2206x1276.png 1272w, https://substackcdn.com/image/fetch/$s_!UbWc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e0a630f-e4d2-4a84-aca4-54a479e4b766_2206x1276.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UbWc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e0a630f-e4d2-4a84-aca4-54a479e4b766_2206x1276.png" width="1456" height="842" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0e0a630f-e4d2-4a84-aca4-54a479e4b766_2206x1276.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:842,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:225238,&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_!UbWc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e0a630f-e4d2-4a84-aca4-54a479e4b766_2206x1276.png 424w, https://substackcdn.com/image/fetch/$s_!UbWc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e0a630f-e4d2-4a84-aca4-54a479e4b766_2206x1276.png 848w, https://substackcdn.com/image/fetch/$s_!UbWc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e0a630f-e4d2-4a84-aca4-54a479e4b766_2206x1276.png 1272w, https://substackcdn.com/image/fetch/$s_!UbWc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e0a630f-e4d2-4a84-aca4-54a479e4b766_2206x1276.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">Notebook for new words</figcaption></figure></div><p>Every word you click on? It&#8217;s automatically saved in your <strong>Vocabulary Notebook</strong>, so you can revisit it later when you&#8217;re feeling studious (or bored). It&#8217;s not just a boring list either; it tracks the different contexts where you found each word. You&#8217;ll start seeing patterns, and soon you&#8217;ll know these words like old friends.</p><h4><strong>Save Sentences, Not Just Words</strong></h4><p>Ever fall in love with a sentence? Or maybe it just baffles you, and you want to come back to it later. Either way, the <strong>Sentence Contextualisation</strong> feature lets you save entire sentences to your notebook. Because let&#8217;s face it, words are better with their friends.</p><h4><strong>Reverse Index: The Google of French Contexts</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RCXm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6804f984-0444-4547-8c45-e58b95026836_1782x526.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RCXm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6804f984-0444-4547-8c45-e58b95026836_1782x526.png 424w, https://substackcdn.com/image/fetch/$s_!RCXm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6804f984-0444-4547-8c45-e58b95026836_1782x526.png 848w, https://substackcdn.com/image/fetch/$s_!RCXm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6804f984-0444-4547-8c45-e58b95026836_1782x526.png 1272w, https://substackcdn.com/image/fetch/$s_!RCXm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6804f984-0444-4547-8c45-e58b95026836_1782x526.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RCXm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6804f984-0444-4547-8c45-e58b95026836_1782x526.png" width="1456" height="430" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6804f984-0444-4547-8c45-e58b95026836_1782x526.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:430,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:111348,&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_!RCXm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6804f984-0444-4547-8c45-e58b95026836_1782x526.png 424w, https://substackcdn.com/image/fetch/$s_!RCXm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6804f984-0444-4547-8c45-e58b95026836_1782x526.png 848w, https://substackcdn.com/image/fetch/$s_!RCXm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6804f984-0444-4547-8c45-e58b95026836_1782x526.png 1272w, https://substackcdn.com/image/fetch/$s_!RCXm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6804f984-0444-4547-8c45-e58b95026836_1782x526.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">Reverse index for context tracing</figcaption></figure></div><p>Need to see how a particular word behaves in the wild? The <strong>Reverse Index feature</strong> lets you search for all the contexts where a word shows up in the library. It&#8217;s like stalking your favourite word to understand its quirks and habits.</p><h3>What Can You Read?</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Q8lZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F768ed640-3432-462e-b185-c66b996a6d71_2278x958.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Q8lZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F768ed640-3432-462e-b185-c66b996a6d71_2278x958.png 424w, https://substackcdn.com/image/fetch/$s_!Q8lZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F768ed640-3432-462e-b185-c66b996a6d71_2278x958.png 848w, https://substackcdn.com/image/fetch/$s_!Q8lZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F768ed640-3432-462e-b185-c66b996a6d71_2278x958.png 1272w, https://substackcdn.com/image/fetch/$s_!Q8lZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F768ed640-3432-462e-b185-c66b996a6d71_2278x958.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Q8lZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F768ed640-3432-462e-b185-c66b996a6d71_2278x958.png" width="1456" height="612" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/768ed640-3432-462e-b185-c66b996a6d71_2278x958.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:612,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1520831,&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_!Q8lZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F768ed640-3432-462e-b185-c66b996a6d71_2278x958.png 424w, https://substackcdn.com/image/fetch/$s_!Q8lZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F768ed640-3432-462e-b185-c66b996a6d71_2278x958.png 848w, https://substackcdn.com/image/fetch/$s_!Q8lZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F768ed640-3432-462e-b185-c66b996a6d71_2278x958.png 1272w, https://substackcdn.com/image/fetch/$s_!Q8lZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F768ed640-3432-462e-b185-c66b996a6d71_2278x958.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">My growing collection of books</figcaption></figure></div><p>I&#8217;ve got a growing library of French books, from timeless classics to modern works:</p><ul><li><p><em>Le Petit Prince</em> (yes, it&#8217;s mandatory)</p></li><li><p><em>Madame Bovary</em> (for when you&#8217;re in the mood for some drama)</p></li><li><p>Essays by Gustave Le Bon (nerdy, but worth it)</p></li><li><p>Modern stuff from Yann LeCun (to be added)</p></li></ul><p>These aren&#8217;t just here for show. They&#8217;re packed with real, living French&#8212;so you can stop reading stilted textbook sentences and start absorbing the good stuff.</p><h3>So, Why Should You Care?</h3><p>Because reading in French doesn&#8217;t have to feel like running a marathon with a dictionary strapped to your back. <em><strong><a href="http://fr.mywords.io">mywords.io</a></strong></em> is here to make it smoother, weirder, and way more enjoyable. You&#8217;ll actually start to <em>get</em> French, one beautifully confusing sentence at a time.</p><h3>No Pressure, Just Books</h3><p>Sign up if you&#8217;re curious. I&#8217;m not here to sell you some grand language-learning journey. I&#8217;m just a guy who think certain French books are pretty great and want to share the tools that make reading them easier and more fun.</p><p>So grab a croissant and dive in. Let&#8217;s read some French.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://fr.mywords.io&quot;,&quot;text&quot;:&quot;Try it&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://fr.mywords.io"><span>Try it</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Coming soon]]></title><description><![CDATA[This is workerwizard&#39;s Substack.]]></description><link>https://blog.workerwizard.com/p/coming-soon</link><guid isPermaLink="false">https://blog.workerwizard.com/p/coming-soon</guid><dc:creator><![CDATA[nihonnken]]></dc:creator><pubDate>Sat, 21 Sep 2024 13:12:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!eMKi!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F734eefe1-4d59-420e-9925-e44088dd9aa6_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is workerwizard&#39;s Substack.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.workerwizard.com/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://blog.workerwizard.com/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item></channel></rss>