<?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[YV Insights 🐰💻 by yuryv.info]]></title><description><![CDATA[🐰🕳️ A deep dive into how apps, games, people, and money actually interact, backed by a FAANG-grade engineer.]]></description><link>https://yvinsights.com</link><image><url>https://substackcdn.com/image/fetch/$s_!SCT7!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b656ba9-ef04-471f-9525-7c48ed24a9fd_1024x1024.png</url><title>YV Insights 🐰💻 by yuryv.info</title><link>https://yvinsights.com</link></image><generator>Substack</generator><lastBuildDate>Fri, 31 Jul 2026 07:15:32 GMT</lastBuildDate><atom:link href="https://yvinsights.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Yury Vashchylau]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[yvinsights@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[yvinsights@substack.com]]></itunes:email><itunes:name><![CDATA[Yury Vashchylau | yuryv.info]]></itunes:name></itunes:owner><itunes:author><![CDATA[Yury Vashchylau | yuryv.info]]></itunes:author><googleplay:owner><![CDATA[yvinsights@substack.com]]></googleplay:owner><googleplay:email><![CDATA[yvinsights@substack.com]]></googleplay:email><googleplay:author><![CDATA[Yury Vashchylau | yuryv.info]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The EU “Withdraw Button” Becomes Mandatory (EU Directive 2023/2673)]]></title><description><![CDATA[Comply, or be fined for &#8364;50,000? (Read this before you spend $$$ on a legal consultant.)]]></description><link>https://yvinsights.com/p/the-eu-withdraw-button-becomes-mandatory</link><guid isPermaLink="false">https://yvinsights.com/p/the-eu-withdraw-button-becomes-mandatory</guid><dc:creator><![CDATA[Yury Vashchylau | yuryv.info]]></dc:creator><pubDate>Tue, 16 Jun 2026 19:58:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3slf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce7f9bdd-3dba-4db7-8a9e-5ce4a224bc1b_1060x1346.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cMNc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84873783-a993-4c52-9a6b-6edfe926e550_2400x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cMNc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84873783-a993-4c52-9a6b-6edfe926e550_2400x800.png 424w, https://substackcdn.com/image/fetch/$s_!cMNc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84873783-a993-4c52-9a6b-6edfe926e550_2400x800.png 848w, https://substackcdn.com/image/fetch/$s_!cMNc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84873783-a993-4c52-9a6b-6edfe926e550_2400x800.png 1272w, https://substackcdn.com/image/fetch/$s_!cMNc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84873783-a993-4c52-9a6b-6edfe926e550_2400x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cMNc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84873783-a993-4c52-9a6b-6edfe926e550_2400x800.png" width="1456" height="485" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/84873783-a993-4c52-9a6b-6edfe926e550_2400x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:485,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Subscribe to YV Insights: the next Rabbit Hole in your inbox, free.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Subscribe to YV Insights: the next Rabbit Hole in your inbox, free." title="Subscribe to YV Insights: the next Rabbit Hole in your inbox, free." srcset="https://substackcdn.com/image/fetch/$s_!cMNc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84873783-a993-4c52-9a6b-6edfe926e550_2400x800.png 424w, https://substackcdn.com/image/fetch/$s_!cMNc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84873783-a993-4c52-9a6b-6edfe926e550_2400x800.png 848w, https://substackcdn.com/image/fetch/$s_!cMNc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84873783-a993-4c52-9a6b-6edfe926e550_2400x800.png 1272w, https://substackcdn.com/image/fetch/$s_!cMNc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84873783-a993-4c52-9a6b-6edfe926e550_2400x800.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 aria-hidden="true" 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><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>New here? <a href="https://yvinsights.com/">Subscribe on Substack</a> and the next Rabbit Hole lands in your inbox.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3slf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce7f9bdd-3dba-4db7-8a9e-5ce4a224bc1b_1060x1346.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3slf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce7f9bdd-3dba-4db7-8a9e-5ce4a224bc1b_1060x1346.png 424w, https://substackcdn.com/image/fetch/$s_!3slf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce7f9bdd-3dba-4db7-8a9e-5ce4a224bc1b_1060x1346.png 848w, https://substackcdn.com/image/fetch/$s_!3slf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce7f9bdd-3dba-4db7-8a9e-5ce4a224bc1b_1060x1346.png 1272w, https://substackcdn.com/image/fetch/$s_!3slf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce7f9bdd-3dba-4db7-8a9e-5ce4a224bc1b_1060x1346.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3slf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce7f9bdd-3dba-4db7-8a9e-5ce4a224bc1b_1060x1346.png" width="1060" height="1346" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ce7f9bdd-3dba-4db7-8a9e-5ce4a224bc1b_1060x1346.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1346,&quot;width&quot;:1060,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Apollo and Frens social post (8.5k likes) announcing they will stop accepting EU merch orders over EU Directive 2023/2673, shown over a close-up of a gray African Gray parrot with a red WITHDRAW button and a blue GPSR EU flag pasted on top.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&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="Apollo and Frens social post (8.5k likes) announcing they will stop accepting EU merch orders over EU Directive 2023/2673, shown over a close-up of a gray African Gray parrot with a red WITHDRAW button and a blue GPSR EU flag pasted on top." title="Apollo and Frens social post (8.5k likes) announcing they will stop accepting EU merch orders over EU Directive 2023/2673, shown over a close-up of a gray African Gray parrot with a red WITHDRAW button and a blue GPSR EU flag pasted on top." srcset="https://substackcdn.com/image/fetch/$s_!3slf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce7f9bdd-3dba-4db7-8a9e-5ce4a224bc1b_1060x1346.png 424w, https://substackcdn.com/image/fetch/$s_!3slf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce7f9bdd-3dba-4db7-8a9e-5ce4a224bc1b_1060x1346.png 848w, https://substackcdn.com/image/fetch/$s_!3slf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce7f9bdd-3dba-4db7-8a9e-5ce4a224bc1b_1060x1346.png 1272w, https://substackcdn.com/image/fetch/$s_!3slf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce7f9bdd-3dba-4db7-8a9e-5ce4a224bc1b_1060x1346.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 aria-hidden="true" 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><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 style="text-align: center;"><em>&#8220;I didn&#8217;t even want to buy a tee with a parrot&#8230; until that day&#8221;.</em></p><p>This totally happened: a <a href="https://www.youtube.com/channel/UCRE0hq5gT69syu2ybmpuYWA">YouTube creator I follow for parrot videos</a> posted <em>this</em>. Read it twice, because almost every word is doing more work than it looks like:</p><blockquote><p>&#8220;With the upcoming EU Directive 2023/2673 &#8216;withdrawal button&#8217; coming into effect on June 19, we&#8217;re making the hard decision to no longer accept merch orders from the EU as of June 18th. Along with VAT taxes and other costs, this new legislation makes doing business in the EU unsustainable at our current size&#8221;. <em><a href="https://www.youtube.com/post/UgkxFxFu5N2sawnS0_Co3-OfBmAuZ7pryNMc">&#8212; Apollo and Frens, June 2026</a></em></p></blockquote><p>If you&#8217;re not in the EU, you have probably never heard of <a href="https://eur-lex.europa.eu/eli/dir/2023/2673/oj/eng">Directive 2023/2673</a>, and you have no particular reason to care.</p><p>If you <em>are</em> in the EU&#8230; well, you <em>also</em> likely never heard of it.</p><p>Unless you happened to discover that a cute parrot tee supporting your favorite blogger is, for reasons nobody quite explains, simply no longer for sale to you.</p><p>But that announcement gets one big thing wrong, and one big thing right.</p><p>The cursed <em>&#8220;withdrawal button&#8221;</em>&#8212;the literal subject of the long directive that gets named&#8212;costs <em>zero dollars</em> to add.</p><p>It is a button and a confirmation page. That&#8217;s it.</p><p>It does not: - collect tax, - involve talking to customs, - fine you if you don&#8217;t return goods at first demand, - require anyone physically in Brussels (or the other 26 countries in the EU).</p><p>On its own, it would never make a merch shop &#8220;unsustainable&#8221;.</p><p>Right?</p><p>Well, going dark on the EU is, honestly, a rational call.</p><p>Because &#8220;the withdrawal button problem&#8221; is not really about <em>adding a button</em>.</p><p>Behind it stands a <em>stack</em> of European rules that piled up for <em>decades</em>. That stack genuinely turns small cross-border selling into a pain.</p><blockquote><p>&#8220;It&#8217;s called a&#8221;withdrawal button&#8221;, but the reality is&#8230; pages upon pages of paperwork?&#8221; <em>&#8212; me while researching this</em></p></blockquote><p>Exactly the confusion a small army of consultancies is, right now, being paid to amplify.</p><p>Go looking for a straight answer, and you get two kinds of result, both useless to a human actually selling to Europeans. First is AI-generated panic slop: enterprise blogs manufacturing fear, every one of them quietly funneling you toward a &#8220;compliance consultation&#8221;, starting at &#8364;20k in billable hours + retainer, promising to cure your pain.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eiMR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc00b79e6-1d2a-4201-9dda-7d5210d4c945_1402x502.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eiMR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc00b79e6-1d2a-4201-9dda-7d5210d4c945_1402x502.png 424w, https://substackcdn.com/image/fetch/$s_!eiMR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc00b79e6-1d2a-4201-9dda-7d5210d4c945_1402x502.png 848w, https://substackcdn.com/image/fetch/$s_!eiMR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc00b79e6-1d2a-4201-9dda-7d5210d4c945_1402x502.png 1272w, https://substackcdn.com/image/fetch/$s_!eiMR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc00b79e6-1d2a-4201-9dda-7d5210d4c945_1402x502.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eiMR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc00b79e6-1d2a-4201-9dda-7d5210d4c945_1402x502.png" width="1402" height="502" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c00b79e6-1d2a-4201-9dda-7d5210d4c945_1402x502.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:502,&quot;width&quot;:1402,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI-generated &#8220;compliance guide&#8221; screenshot calling the EU withdrawal button a prominent, frictionless way to cancel contracts and a mandatory compliance requirement, headlined &#8220;The EU Withdrawal Button: A Guide to Compliance&#8221;.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI-generated &#8220;compliance guide&#8221; screenshot calling the EU withdrawal button a prominent, frictionless way to cancel contracts and a mandatory compliance requirement, headlined &#8220;The EU Withdrawal Button: A Guide to Compliance&#8221;." title="AI-generated &#8220;compliance guide&#8221; screenshot calling the EU withdrawal button a prominent, frictionless way to cancel contracts and a mandatory compliance requirement, headlined &#8220;The EU Withdrawal Button: A Guide to Compliance&#8221;." srcset="https://substackcdn.com/image/fetch/$s_!eiMR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc00b79e6-1d2a-4201-9dda-7d5210d4c945_1402x502.png 424w, https://substackcdn.com/image/fetch/$s_!eiMR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc00b79e6-1d2a-4201-9dda-7d5210d4c945_1402x502.png 848w, https://substackcdn.com/image/fetch/$s_!eiMR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc00b79e6-1d2a-4201-9dda-7d5210d4c945_1402x502.png 1272w, https://substackcdn.com/image/fetch/$s_!eiMR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc00b79e6-1d2a-4201-9dda-7d5210d4c945_1402x502.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 aria-hidden="true" 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><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 style="text-align: center;"><em>The slop in question: FOMO, AI tropes, &#8220;it&#8217;s not X, it&#8217;s Y&#8221;, et al.</em></p><p>The second is the primary source itself: a <a href="https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32023L2673">europa.eu directive</a> written, with great care, for <em>solicitors</em> (that&#8217;s <em>lawyers</em> for you in America!), full of legalese and jargon. Nobody in the middle is <em>just telling</em> the hypothetical &#8220;parrot content creator&#8221;, the Shopify store, the SME, or the exec who got volunteered last Thursday to &#8220;fix this by end of week&#8221;.</p><p>So, in this Rabbit Hole: the grounded, slightly devil&#8217;s-advocate version. For the business owner, the enterprise exec, the manager, the SME, and yes, digital creators. Here&#8217;s what each rule actually is, who it really hits, and what you can do that isn&#8217;t &#8220;panic&#8221; or &#8220;abandon 450 million customers&#8221;.</p><p>This is not legal advice. Let&#8217;s dive in.</p><h2>What is the EU&#8217;s problem?</h2><p>Say &#8220;new EU regulation&#8221; out loud, and the room splits: half eye-roll at Brussels inventing another form to fill in, half assume the worst about whatever <a href="https://www.cato.org/briefing-paper/artificial-intelligence-regulation-threatens-free-expression">&#8220;European Communism&#8221;</a> cooked up this quarter. Both reflexes skip the boring, inconvenient part.</p><p>As always, the EU is reacting to something real.</p><p>Canceling, online, <a href="https://www.ftc.gov/news-events/news/press-releases/2024/10/federal-trade-commission-announces-final-click-cancel-rule-making-it-easier-consumers-end-recurring">has</a> <a href="https://op.europa.eu/en/publication-detail/-/publication/606365bc-d58b-11ec-a95f-01aa75ed71a1/language-en">been</a> <a href="https://www.deceptive.design/types/roach-motel">quietly</a> <a href="https://arxiv.org/abs/1907.07032">engineered</a> to be <a href="https://arxiv.org/abs/2309.17145">hard</a>. You subscribe in one tap, but leaving means: </p><ul><li><p><a href="https://www.deceptive.design/cases/norwegian-consumer-council-complaint-against-amazon-prime">a hunt through three settings menus</a>,</p></li><li><p>an <a href="https://www.techtarget.com/searchcio/news/366593576/FTC-DOJ-take-aim-at-dark-patterns-with-Adobe-lawsuit">&#8220;are you sure?&#8221; guilt screen with 5 steps</a>, </p></li><li><p><a href="https://www.deceptive.design/brands/new-york-times">a phone line open Tuesdays from 6 to 8 AM</a>, </p></li><li><p><a href="https://www.deceptive.design/types/hard-to-cancel">a cancel link rendered in 8-point gray</a>, </p></li><li><p>sending <a href="https://www.henson-legal.com/newsroom/la-fitnesss-cancellation-treadmill-runs-into-a-wall-with-the-ftc">certified mail that will get lost anyway</a>. Yes, not email&#8212;snail mail.</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_!n-fq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc439f42-26d1-4114-90eb-fd27825ca1c6_250x250.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!n-fq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc439f42-26d1-4114-90eb-fd27825ca1c6_250x250.jpeg 424w, https://substackcdn.com/image/fetch/$s_!n-fq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc439f42-26d1-4114-90eb-fd27825ca1c6_250x250.jpeg 848w, https://substackcdn.com/image/fetch/$s_!n-fq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc439f42-26d1-4114-90eb-fd27825ca1c6_250x250.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!n-fq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc439f42-26d1-4114-90eb-fd27825ca1c6_250x250.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!n-fq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc439f42-26d1-4114-90eb-fd27825ca1c6_250x250.jpeg" width="250" height="250" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cc439f42-26d1-4114-90eb-fd27825ca1c6_250x250.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:250,&quot;width&quot;:250,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The Eagles &#8220;Hotel California&#8221; album cover: the Beverly Hills Hotel under palm trees at dusk.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The Eagles &#8220;Hotel California&#8221; album cover: the Beverly Hills Hotel under palm trees at dusk." title="The Eagles &#8220;Hotel California&#8221; album cover: the Beverly Hills Hotel under palm trees at dusk." srcset="https://substackcdn.com/image/fetch/$s_!n-fq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc439f42-26d1-4114-90eb-fd27825ca1c6_250x250.jpeg 424w, https://substackcdn.com/image/fetch/$s_!n-fq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc439f42-26d1-4114-90eb-fd27825ca1c6_250x250.jpeg 848w, https://substackcdn.com/image/fetch/$s_!n-fq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc439f42-26d1-4114-90eb-fd27825ca1c6_250x250.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!n-fq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc439f42-26d1-4114-90eb-fd27825ca1c6_250x250.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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 style="text-align: center;"><em>&#8220;&#127925; you can check out anytime you like, but you can never leave&#8221;</em></p><p>The EU&#8217;s own Fitness Check (its periodic review of whether existing consumer law still works) found that <strong><a href="https://www.freshfields.com/en/our-thinking/blogs/technology-quotient/digital-fitness-check-and-digital-fairness-act-part-7-contract-cancellations-and-102krzt">roughly 69% of consumers</a></strong><a href="https://www.freshfields.com/en/our-thinking/blogs/technology-quotient/digital-fitness-check-and-digital-fairness-act-part-7-contract-cancellations-and-102krzt"> who tried to cancel an online contract hit some deliberate technical difficulty</a>. It&#8217;s a design pattern with a name (the &#8220;roach motel&#8221;: easy in, impossible out) and a whole discipline, <a href="https://www.deceptive.design/">&#8220;dark patterns&#8221;</a>, built to keep you paying.</p><p>Then the second thing it&#8217;s mad about: <a href="https://www.britannica.com/money/Temu">Temu</a> and <a href="https://www.cnbc.com/2025/08/25/china-blind-box-craze-pop-mart-labubu-success.html">Labubus</a>.</p><p>Yes, really.</p><p>Genuine concerns about <a href="https://www.thefashionlaw.com/france-focuses-on-shein-temu-in-revised-anti-fast-fashion-legislation/">fast fashion</a>, <a href="https://www.business-humanrights.org/en/latest-news/china-bbc-investigation-reveals-shein-suppliers-workers-face-75-hour-work-weeks-low-wages-incl-co-comment/">ethics</a>, and the <a href="https://www.europarl.europa.eu/topics/en/article/20201208STO93327/the-impact-of-textile-production-and-waste-on-the-environment-infographics">environment</a> aside&#8212;around <a href="https://taxation-customs.ec.europa.eu/news/e-commerce-150-eur-customs-duty-exemption-threshold-be-removed-2026-2025-11-13_en">4.6 billion parcels under &#8364;150 poured into the EU in 2024, roughly 91% of them from China</a>, most riding a duty-free loophole that EU retailers, who pay the VAT (value-added tax, Europe&#8217;s sales tax), the safety testing, and the duties, simply do not get.</p><p>From Brussels&#8217; chair, that looks like its own shops being undercut by an ocean of untaxed, untested, semi-disposable stuff, sold to its own consumers through a dopamine loop tuned in a lab.</p><p>So the &#8220;problem&#8221;, stated fairly, is very real: a digital marketplace in China optimized to trap you in subscriptions, undercut domestic sellers, and outrun consumer protection faster than any regulator can file the paperwork. Even allergic-to-Brussels people can look at that and concede something is off.</p><p>And yes, it&#8217;s also the <a href="https://taxfoundation.org/blog/supreme-court-trump-tariffs-ruling/">tariff war the US kicked off</a>&#8212;chaotic enough that the Supreme Court struck the tariffs down in February 2026 and the White House slapped new ones on within days&#8212;and the fact that <a href="https://www.aircargonews.net/supply-chains/2026/03/box-lines-unlikely-to-return-to-suez-canal-in-2026-following-middle-east-strikes/">logistics get pricier by the week</a>, <a href="https://www.cnbc.com/2026/04/21/oil-price-iran-war-middle-east.html">fuel prices</a> are up no thanks to the 2026 Iran war, the <a href="https://commonslibrary.parliament.uk/research-briefings/cbp-10636/">closed Strait of Hormuz</a>, and a <a href="https://www.seatrade-maritime.com/containers/shipping-lines-reroute-from-red-sea-avoiding-houthi-threat">Red Sea nobody&#8217;s sailing through</a>. Not just another &#8220;ban plastic straws&#8221; law.</p><p>Which makes the <em>instinct</em> defensible, but the <em>implementation</em>&#8230; not as much.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cIj8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ff5ddc4-6600-4487-bb6f-639a54c9745f_2880x1974.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cIj8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ff5ddc4-6600-4487-bb6f-639a54c9745f_2880x1974.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cIj8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ff5ddc4-6600-4487-bb6f-639a54c9745f_2880x1974.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cIj8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ff5ddc4-6600-4487-bb6f-639a54c9745f_2880x1974.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cIj8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ff5ddc4-6600-4487-bb6f-639a54c9745f_2880x1974.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cIj8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ff5ddc4-6600-4487-bb6f-639a54c9745f_2880x1974.jpeg" width="446" height="305.70604395604397" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4ff5ddc4-6600-4487-bb6f-639a54c9745f_2880x1974.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:998,&quot;width&quot;:1456,&quot;resizeWidth&quot;:446,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;A basket of fuzzy rabbit-costumed Labubu collectible figures with toothy grins and big red eyes.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A basket of fuzzy rabbit-costumed Labubu collectible figures with toothy grins and big red eyes." title="A basket of fuzzy rabbit-costumed Labubu collectible figures with toothy grins and big red eyes." srcset="https://substackcdn.com/image/fetch/$s_!cIj8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ff5ddc4-6600-4487-bb6f-639a54c9745f_2880x1974.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cIj8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ff5ddc4-6600-4487-bb6f-639a54c9745f_2880x1974.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cIj8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ff5ddc4-6600-4487-bb6f-639a54c9745f_2880x1974.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cIj8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ff5ddc4-6600-4487-bb6f-639a54c9745f_2880x1974.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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 style="text-align: center;"><em>no, they weren&#8217;t a fad. we&#8217;re still facing the consequences today.</em></p><p>Every tool the EU reaches for: a mandatory cancel button, a named EU &#8220;responsible person&#8221; on every product, a universal right with no minimum price or size, is <em>aimed</em> at <a href="https://alternativeto.net/news/2025/6/eu-commission-takes-action-against-aliexpress-for-dsa-violations-and-illegal-product-sales/">AliExpress</a>, <a href="https://digital-strategy.ec.europa.eu/en/news/commission-launches-investigation-shein-under-digital-services-act">Shein</a> and <a href="https://www.techpolicy.press/eu-tests-limits-of-platform-risk-assessments-with-200-million-temu-fine/">Temu</a>, the actual villains of the story.</p><p>The catch is that the giant companies can absorb every one of them, and the small can&#8217;t.</p><p>Every one of those tools lands hardest on the person the EU was likely not trying to disadvantage: the one human in Florida selling tees of their genius parrot, the small Australian studio handcrafting shoes, and the small Ukrainian shop knitting hats and teddy bears.</p><p>The fast-fashion giant will absorb all of it without even noticing&#8212;as proved by the <a href="https://www.euronews.com/business/2025/07/04/france-hands-shein-40-million-fine-for-deceptive-commercial-practices">&#8364;40 million fine France handed Shein in 2025</a>, which it shrugged off while staying open for business.</p><h2>The proposed solutions so far</h2><p>Here is the part almost nobody explains: the &#8220;withdrawal button&#8221; is <a href="https://en.wikipedia.org/wiki/Cooling-off_period_%28consumer_rights%29">not a new right</a>.</p><p>First, the 101, because the word hides a lot. A &#8220;withdrawal&#8221; just means backing out of a purchase and getting your money back, no reason owed. It exists because, for most of shopping history, the moment a stranger had your money you were on your own. The doorstep salesman vanished, the mail-order catalog never shipped, the dodgy early websites transmitting your credit card information unencrypted to an offshore server. The right to change your mind was invented to end that era, and the &#8220;button&#8221; is just the newest way to claim that right.</p><p>The &#8220;change your mind&#8221; idea behind it&#8212;the cooling-off period&#8212;goes back to <a href="https://www.lexisnexis.co.uk/legal/legislation/uk-parliament-acts/hire-purchase-act-1964-c53">1960s installment-credit law</a>, and the EU has guaranteed a version of it since its <a href="https://eur-lex.europa.eu/legal-content/EN/ALL/?uri=CELEX:31985L0577">1985 Doorstep Selling Directive</a>, back when &#8220;online shopping&#8221; still meant a mail-order catalog.</p><p>The &#8220;button&#8221; is merely the latest patch in a <em>decade</em> of EU attempts to solve one messy, multifront problem. So climb into the regulator&#8217;s chair for a minute and watch the parade of fixes, each one plugging a leak the last one sprang.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1aiU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066ce079-f23f-4cac-a6cd-0d9fc7646243_1296x972.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1aiU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066ce079-f23f-4cac-a6cd-0d9fc7646243_1296x972.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1aiU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066ce079-f23f-4cac-a6cd-0d9fc7646243_1296x972.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1aiU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066ce079-f23f-4cac-a6cd-0d9fc7646243_1296x972.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1aiU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066ce079-f23f-4cac-a6cd-0d9fc7646243_1296x972.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1aiU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066ce079-f23f-4cac-a6cd-0d9fc7646243_1296x972.jpeg" width="472" height="354" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/066ce079-f23f-4cac-a6cd-0d9fc7646243_1296x972.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:972,&quot;width&quot;:1296,&quot;resizeWidth&quot;:472,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;A committee room of the European Parliament in Brussels, rows of empty desks beneath a high ceiling.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A committee room of the European Parliament in Brussels, rows of empty desks beneath a high ceiling." title="A committee room of the European Parliament in Brussels, rows of empty desks beneath a high ceiling." srcset="https://substackcdn.com/image/fetch/$s_!1aiU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066ce079-f23f-4cac-a6cd-0d9fc7646243_1296x972.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1aiU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066ce079-f23f-4cac-a6cd-0d9fc7646243_1296x972.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1aiU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066ce079-f23f-4cac-a6cd-0d9fc7646243_1296x972.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1aiU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066ce079-f23f-4cac-a6cd-0d9fc7646243_1296x972.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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 style="text-align: center;"><em>&#8220;ladies and gentlemen, what shall we regulate today?&#8221;</em> </p><p style="text-align: center;"><em>(Image credit: <a href="https://commons.wikimedia.org/wiki/File:Committee_Room_of_the_European_Parliament_in_Brussels.jpg">JLogan on Wikimedia Commons</a>, licensed CC BY-SA 3.0.)</em></p><h3>What buying used to be</h3><p>To see what each fix was actually for, follow one man through all of them.</p><p>Say I&#8217;m <strong>Bruno</strong>.</p><p>I live in F&#252;rth (Bavaria, Germany). I order more off the internet than I&#8217;d admit at dinner, and above everything I like my life in order.</p><p>It&#8217;s 2008. The world financial crisis is making prices go uncomfortably up, and I want a phone charger for my Nokia. I&#8217;m well aware at this point that prices of goods on the Internet are often much cheaper, and it&#8217;s easy to order online, then collect at my post office. So I find a webshop <em>(<a href="https://www.ebay.com/">eBay</a>, anyone?)</em>, type in my card details, wait a week, it shows up.</p><p>That&#8217;s the entire transaction: no &#8220;cooling-off&#8221;, no &#8220;responsible person&#8221;, no cookie banner, no &#8220;you owe us tariffs&#8221; note on a &#8364;4 trinket.</p><p>Beautifully simple&#8230; and beautifully unprotected. If it never arrived, came broken, or the shop evaporated overnight, Bruno was on his own. Every rule below is the EU trying to keep that simplicity while deleting the <em>&#8220;you&#8217;re on your own; good luck!&#8221;</em> part.</p><h3>2014: Bruno gets buyer&#8217;s remorse</h3><p>Bruno orders a jacket, hates it in the mirror, and ships it back inside two weeks for a full refund, no reason required. That is the <a href="https://eur-lex.europa.eu/eli/dir/2011/83/oj">Consumer Rights Directive</a>: a 14-day &#8220;change your mind&#8221; window on anything bought at a distance.</p><p>Anything? Almost. There&#8217;s a short list of things you can&#8217;t send back, for common sense reasons.</p><p>Obvious exceptions: bespoke items, perishables, unsealed hygiene goods, and a handful more, software or a CD once you break the seal, that day&#8217;s newspaper, a hotel or flight booked for a specific date. The full list is longer and duller; the point is that a standard printed parrot tee is nowhere on it.</p><p>Clean, humane&#8230; and immediately leaky.</p><p>A jacket is easy to send back. A download is not. Watch what happens the first time that tidy little right collides with something digital.</p><p>Bruno buys a video game on Friday. Plays it all weekend. Then, next week, on a Monday morning he clicks &#8220;refund, I changed my mind&#8221;. According to the new law, he keeps the game; the seller eats the refund. You cannot un-sell a played download. The 14-day right, written for jackets, sprang a hole the instant it touched anything digital.</p><p>So Brussels and the platform lawyers bolt on a fix. A trader may switch the 14 days off for digital content if the buyer gives &#8220;express consent to immediate performance&#8221; and acknowledges they forfeit the right (the legal hook is <a href="https://eur-lex.europa.eu/eli/dir/2011/83/oj">Article 16(m)</a>).</p><p>That box, &#8220;start my download now, I understand I lose my right to cancel&#8221;, is the one Bruno (and you) have clicked on Google Play, Steam, the App Store, and the Nintendo eShop for over a decade. A real, working solution, for digital. Physical goods got no such escape hatch.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zqKN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F675a5417-1636-4a8e-b8f7-7fc7c33c9a85_640x397.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zqKN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F675a5417-1636-4a8e-b8f7-7fc7c33c9a85_640x397.png 424w, https://substackcdn.com/image/fetch/$s_!zqKN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F675a5417-1636-4a8e-b8f7-7fc7c33c9a85_640x397.png 848w, https://substackcdn.com/image/fetch/$s_!zqKN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F675a5417-1636-4a8e-b8f7-7fc7c33c9a85_640x397.png 1272w, https://substackcdn.com/image/fetch/$s_!zqKN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F675a5417-1636-4a8e-b8f7-7fc7c33c9a85_640x397.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zqKN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F675a5417-1636-4a8e-b8f7-7fc7c33c9a85_640x397.png" width="640" height="397" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/675a5417-1636-4a8e-b8f7-7fc7c33c9a85_640x397.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:397,&quot;width&quot;:640,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Ubisoft Connect dialog headed &#8220;Right to withdraw&#8221; that has the user consent to immediate download and acknowledge they lose their right of withdrawal, with Cancel and Accept-and-continue buttons.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Ubisoft Connect dialog headed &#8220;Right to withdraw&#8221; that has the user consent to immediate download and acknowledge they lose their right of withdrawal, with Cancel and Accept-and-continue buttons." title="Ubisoft Connect dialog headed &#8220;Right to withdraw&#8221; that has the user consent to immediate download and acknowledge they lose their right of withdrawal, with Cancel and Accept-and-continue buttons." srcset="https://substackcdn.com/image/fetch/$s_!zqKN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F675a5417-1636-4a8e-b8f7-7fc7c33c9a85_640x397.png 424w, https://substackcdn.com/image/fetch/$s_!zqKN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F675a5417-1636-4a8e-b8f7-7fc7c33c9a85_640x397.png 848w, https://substackcdn.com/image/fetch/$s_!zqKN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F675a5417-1636-4a8e-b8f7-7fc7c33c9a85_640x397.png 1272w, https://substackcdn.com/image/fetch/$s_!zqKN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F675a5417-1636-4a8e-b8f7-7fc7c33c9a85_640x397.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 aria-hidden="true" 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><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 style="text-align: center;"><em>these little guys.</em></p><p>Hold that thought.</p><h3>Meanwhile, Bruno&#8217;s socks follow him around the internet</h3><p>Different leak, same digital era.</p><p>It&#8217;s 2015. Bruno leaves a pair of socks in an online shop cart without buying them.</p><p>For three weeks every site he visits shows him socks while his inbox fills with <em>&#8220;still thinking about these? you left something in your cart &#129510;&#8221;</em>.</p><p>That is the leak <a href="https://gdpr.eu/what-is-gdpr/">GDPR</a> (2018) went after, the law Americans mostly meet as &#8220;the cookie banner law&#8221;.</p><p>It is far bigger than banners and cookies, but the part Bruno feels is the restrictions companies now must adhere to on exactly this: who gets to hoard his data and chase him across the web over one abandoned cart. And a &#8220;no, I don&#8217;t consent to tracking&#8221; decision is typically not ground for denying service.</p><blockquote><p>&#8220;Did you know you can (and, arguably, <em>should</em>) click <em>&#8220;Reject All&#8221;</em> or <em>&#8220;Manage Options - Only mandatory&#8221;</em> on most cookie banners?</p></blockquote><p>The fact that the EU&#8217;s own fix then saddled him with a cookie pop-up on every page is its own Rabbit Hole. So before we veer too deep&#8230;</p><h3>2019&#8212;2022: name the friction</h3><p>Somewhere in here the whole economy quietly rewires itself around &#8220;recurring revenue&#8221;.</p><p>Everything becomes a subscription.</p><p>Davos gleefully lands the now infamous &#8220;you&#8217;ll own nothing and be happy&#8221;, dishwashers suddenly start offering &#8220;monthly plans&#8221;, and a generation discovers the special joy of a &#8220;free&#8221; trial that auto-renews at &#8364;99 a year.</p><p>Bruno likes the convenience, though. He has a Spotify subscription for music, an iCloud subscription for his photos&#8230; and a new Xbox with a Game Pass membership. 100 games for only &#8364;9 a month, baby!</p><p>Until Bruno wants to switch, or the service stops suiting him.</p><p>Sellers honored Bruno&#8217;s right to cancel&#8230; but the &#8220;your subscription is now canceled&#8221; outcome had him go through cancel-by-phone, guilt screens, and 8-point-gray &#8220;cancel&#8221; links. So the EU passed the <a href="https://eur-lex.europa.eu/eli/dir/2019/2161/oj">Omnibus Directive</a> (2022). An &#8220;omnibus&#8221; law means one that amends several others in one fell swoop.</p><p>It did not ban &#8220;dark patterns&#8221; wholesale; that fight is still coming. What it actually outlawed was a specific menu of tricks: fake reviews (and deleting negative ones), undisclosed paid search rankings, surprise fees at checkout, and fake &#8220;was &#8364;99, now &#8364;9&#8221; discounts. It also forced sellers to admit when a price had been personalized just for you.</p><p>Those were the headline bans, the consumer-facing stuff. But two quieter moves in the same law mattered more for Bruno. First, it redefined &#8220;price&#8221; to include personal data, so the &#8220;free&#8221; apps he pays for with his data finally count as real contracts, carrying the same 14-day right and the same disclosure rules as anything bought with euros. That way, a &#8220;free&#8221; account, your Meta login, a games app, legally becomes a contract Bruno can walk away from, with the same rights as anything bought with euros. Second, it put a number on cheating: fines up to 4% of a company&#8217;s annual turnover, the same GDPR-scale stick that turns a wrist-slap into a line on the earnings call. The friction finally had a name and a price.</p><p>Remember: none of this is only digital. The same directive, the same right, the same 4% stick covers Bruno&#8217;s physical orders too&#8212;the jacket, the parrot tee, the Nokia (now iPhone) charger.</p><p>Which sets up the move every regulator went on to copy.</p><h3>2022: Germany hands Bruno a button</h3><p>The Omnibus told sellers what they <em>must not</em> do&#8212;hide the exit&#8212;but never what they <em>must build instead</em>. A vague &#8220;don&#8217;t bury the cancel&#8221; still leaves a thousand ways to make &#8220;easy canceling&#8221; ambiguous.</p><p>So Germany stopped describing the bad behavior and mandated the good one: not <em>&#8220;make it easy&#8221;</em>, but &#8220;put this exact button, here&#8221;. A permanent, clearly-labeled, two-click K&#252;ndigungsbutton (&#8220;cancel here&#8221;), written into law as <a href="https://www.gesetze-im-internet.de/bgb/__312k.html">&#167;312k BGB</a>.</p><p>Bruno cancels his gym in two clicks instead of a registered snail-mail letter.</p><p>Retailers howled, and a wave of <a href="https://www.noerr.com/en/insights/cancellation-button-in-online-sales">competitor and consumer-group warning letters</a> followed (a year in, a consumer-group sweep still found barely 40% of subscription sites compliant). But the sky stayed up, and Brussels took notes.</p><h3>The other front: Bruno&#8217;s &#8364;4 phone charger</h3><p>Cancellation was only half the headache. Now let&#8217;s address the other elephant in the room.</p><p>The deluge of 4.6 billion cheap parcels a year.</p><p>Little to none of them had to undergo the duty, safety, and tax checks. Most of them landed on doormats exactly like Bruno&#8217;s.</p><p>Back in 2008, Bruno&#8217;s &#8364;4 charger sailed in untaxed thanks to an old rule: any parcel declaring a value of &#8364;22 or less owed no import VAT at all.</p><p>That floor vanished in 2021.</p><p><strong><a href="https://www.avalara.com/blog/en/europe/2021/01/eu-2021-ending--22-import-exemption--import-oss-returns.html">VAT from the first cent</a></strong> means every parcel now owes tax, even the &#8364;4 one, and the seller remits it through <strong>IOSS</strong> (the <a href="https://vat-one-stop-shop.ec.europa.eu/index_en">Import One-Stop Shop</a>): one EU portal and one monthly tax return instead of registering in 27 countries.</p><p>So why do you, a European, still feel like you pay zero tax on your Temu hauls?</p><p>You don&#8217;t.</p><p>Either the seller used IOSS and quietly baked the VAT into the price you already paid at checkout, or it under-declared the parcel&#8217;s value to skip it&#8212;which is rampant, and is the whole reason the rules below exist.</p><p>Then came the <strong>DSA</strong> (Digital Services Act, 2024). It put the platforms themselves on the hook: Brussels opened proceedings against <a href="https://digital-strategy.ec.europa.eu/en/news/commission-launches-investigation-shein-under-digital-services-act">Shein</a>, <a href="https://www.techpolicy.press/eu-tests-limits-of-platform-risk-assessments-with-200-million-temu-fine/">fined Temu &#8364;200 million</a>, and <a href="https://alternativeto.net/news/2025/6/eu-commission-takes-action-against-aliexpress-for-dsa-violations-and-illegal-product-sales/">pinned AliExpress to binding commitments</a>, all for letting illegal and unsafe products (counterfeits, banned goods) flood their feeds. The shift was philosophical: stop chasing millions of dodgy sellers one at a time, and make the marketplace itself legally answer for what it lists.</p><p>The <strong><a href="https://www.etsy.com/seller-handbook/article/1093438529659">GPSR</a></strong> (General Product Safety Regulation, 2024) demands a named, EU-based &#8220;responsible person&#8221; accountable for every product&#8217;s safety. The catch is in &#8220;EU-based&#8221;: it has to be a real legal entity inside the EU, an importer, a distributor, or a paid representative, who takes on liability for the goods. A one-person shop in Ohio can&#8217;t just type in their own name and address; it has to find and pay an EU company to stand behind every product. For a hobby seller, that overhead alone is the difference between shipping to Europe&#8230; and quietly switching it off. This was the quiet patch that actually killed small cross-border shipping: the week it took effect, <a href="https://www.bbc.com/news/articles/c5ydrp0kjn5o">small sellers paused EU and Northern Ireland orders rather than fund a compliance agent most had only just heard of</a>.</p><p>Have I mentioned Bruno also loves importing odd novelties from Japan or the US? A Blu-ray box set of the Pok&#233;mon anime, a new PlayStation Portal, that fancy American BBQ sauce Reddit won&#8217;t shut up about. Here&#8217;s the rule he&#8217;s leaned on without knowing its name. The <strong>&#8364;150 &#8220;de-minimis&#8221; law</strong> meant a parcel worth &#8364;150 or less skipped <em>customs duty</em>, the import tax that sits on top of VAT. <em>(Not VAT itself; that&#8217;s been due on everything since 2021. This is the extra layer.)</em></p><p>Anything above &#8364;150, like that $199 gaming device, always paid full duty plus VAT, so nothing there changes. What changes in 2026 is the lower end: <strong><a href="https://taxation-customs.ec.europa.eu/news/e-commerce-150-eur-customs-duty-exemption-threshold-be-removed-2026-2025-11-13_en">killing the de-minimis</a></strong> rolls out a flat &#8364;3 charge on the small parcels that used to ride free. On Bruno&#8217;s &#8364;4 charger, that &#8364;3 is almost the price of the thing again. Trivial on one parcel, brutal across four billion of them&#8212;which is exactly the point.</p><h3>2026: the fronts collide</h3><p>Germany&#8217;s cancel button <a href="https://www.taylorwessing.com/en/insights-and-events/insights/2026/02/withdrawal-button-as-compliance-risk-for-eu-and-non-eu-businesses">goes EU-wide as Directive 2023/2673</a>, scaled to all 27 member countries.</p><p>That, in a nutshell, tells you everything about how Brussels moves, smuggled into a bill about the distance marketing of financial services. Bruno can now hit &#8220;Withdraw&#8221; on almost anything he buys online. The cancellation button patch and the parcel spam patches are all inside the same eighteen months. What reads like a coordinated assault is really a decade of separate meetings finally getting approved all at once.</p><h3>Already coming: the next patch</h3><p>Two more bricks in the wall are already waiting. The <a href="https://www.europarl.europa.eu/legislative-train/theme-protecting-our-democracy-upholding-our-values/file-digital-fairness-act">Digital Fairness Act</a>, a proposal the European Commission (the EU&#8217;s executive branch, the body that drafts and proposes its laws) is expected to table in late 2026.</p><p>It aims straight back at the dark patterns the whole saga started with, but where the 2022 Omnibus banned a fixed list of named tricks, this one goes after the design itself: cancellation made deliberately hard, manipulative interface design, addictive feeds, and <a href="https://www.insideprivacy.com/consumer-protection/digital-fairness-act-series-topic-3-personalized-advertising-and-pricing/">surge pricing</a> tuned to exploit what a platform already knows about you. And a second file&#8212;the Digital Omnibus (a separate, parallel EU proposal)&#8212;finally goes after the dreaded &#8220;cookie banner&#8221; the EU inflicted on the world in the first place&#8212;the plan is a one-click &#8220;reject all&#8221; that your browser can remember and send for you automatically, so you stop re-answering the same pop-up, plus a six-month ban on a site asking again once you&#8217;ve said no.</p><p>Twenty years in, Bruno can: - cancel in one click - send almost anything back - not provide a cancellation reason - and is about to stop clicking &#8220;accept&#8221; forty times a day</p><p>He still has no idea any of it has a name.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ddbn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd174bdc-bf3e-4009-9a23-7eab6e6472a8_480x480.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ddbn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd174bdc-bf3e-4009-9a23-7eab6e6472a8_480x480.png 424w, https://substackcdn.com/image/fetch/$s_!ddbn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd174bdc-bf3e-4009-9a23-7eab6e6472a8_480x480.png 848w, https://substackcdn.com/image/fetch/$s_!ddbn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd174bdc-bf3e-4009-9a23-7eab6e6472a8_480x480.png 1272w, https://substackcdn.com/image/fetch/$s_!ddbn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd174bdc-bf3e-4009-9a23-7eab6e6472a8_480x480.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ddbn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd174bdc-bf3e-4009-9a23-7eab6e6472a8_480x480.png" width="480" height="480" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fd174bdc-bf3e-4009-9a23-7eab6e6472a8_480x480.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:480,&quot;width&quot;:480,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Nokia AC-11 compact travel charger with an EU plug and the old 2mm barrel connector, beside its retail box.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Nokia AC-11 compact travel charger with an EU plug and the old 2mm barrel connector, beside its retail box." title="Nokia AC-11 compact travel charger with an EU plug and the old 2mm barrel connector, beside its retail box." srcset="https://substackcdn.com/image/fetch/$s_!ddbn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd174bdc-bf3e-4009-9a23-7eab6e6472a8_480x480.png 424w, https://substackcdn.com/image/fetch/$s_!ddbn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd174bdc-bf3e-4009-9a23-7eab6e6472a8_480x480.png 848w, https://substackcdn.com/image/fetch/$s_!ddbn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd174bdc-bf3e-4009-9a23-7eab6e6472a8_480x480.png 1272w, https://substackcdn.com/image/fetch/$s_!ddbn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd174bdc-bf3e-4009-9a23-7eab6e6472a8_480x480.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 aria-hidden="true" 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><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 style="text-align: center;"><em>all of that for saving a few euros on a phone charger 20 years ago.</em></p><h2>Where we have arrived in 2026 (the TLDR)</h2><p>As you can see, the so-called &#8220;withdrawal button&#8221; didn&#8217;t arrive alone. It&#8217;s the newest brick in a wall the EU spent <em>years</em> building. One rule at a time, each aimed at the swarm of packages, each rule affecting everyone in the world.</p><p>Here&#8217;s the whole stack, in plain words and plain dates.</p><p>Rule; What it means, in one line; Live since </p><ul><li><p><strong>VAT from the first cent:</strong> The &#8364;22 tax-free floor is gone; VAT is due on everything, collected through one IOSS portal. 1 Jul 2021 </p></li><li><p><strong>DSA trader traceability:</strong> Marketplaces must verify who their sellers really are before listing them. 17 Feb 2024 </p></li><li><p><strong>GPSR, the &#8220;responsible person&#8221;:</strong> Every product needs a named, EU-based person liable for its safety. The brick that quietly ended small EU shipping. 13 Dec 2024 </p></li><li><p><strong>The Withdraw Button:</strong> Directive 2023/2673: one-click cancellation for EU buyers. The headline act. 19 Jun 2026 </p></li><li><p><strong>End of the &#8364;150 de-minimis:</strong> The duty-free pass on small parcels dies; a flat &#8364;3 duty per item replaces it. 1 Jul 2026 </p></li><li><p><strong>The Digital Fairness Act:</strong> Still a proposal: aims to ban dark patterns, addictive design, and unfair personalization. The next brick. Expected late 2026</p></li></ul><p>Notice the headline act, the button, is the <em>cheapest</em> line on that list, and it&#8217;s the one everyone&#8217;s panicking about. The genuinely expensive bricks (GPSR, VAT) arrived quietly, eighteen months early, with no countdown.</p><p>So why does the parrot content creator blame this &#8220;cheap&#8221; law?</p><p>Put yourself in their chair.</p><ul><li><p>VAT, which (unlike US sales tax, collected for you at the register) the seller has to register for in the EU and file every month</p></li><li><p>an EU rep&#8212;a person or company you pay to take legal responsibility for your products</p></li><li><p>the &#8364;3-on-everything duty</p></li></ul><p>Each was a survivable annoyance he&#8217;d swallowed one at a time. The button is different in two ways: it is the one with a hard, named, on-the-calendar date, the deadline that forces the decision he&#8217;d been deferring through every brick before it.</p><p>And it is the one that makes returns frictionless&#8212;so any EU buyer can now un-buy a &#8364;25 tee with a tap while he eats the transatlantic postage both ways&#8212;in one (mandatory-to-implement) click.</p><p>On parrot-tee margins, that is the straw. The button finally tips the whole decision-making process into &#8220;not worth it&#8221;.</p><p>And because it&#8217;s a <em>Directive</em>, not a <em>Regulation</em>, each of the 27 countries had to pass its own version&#8212;and some were <em>late</em> after the deadline. So whether it&#8217;s actually in force still depends on where your customer lives.</p><p>Yes, now you have to figure out &#8220;which of the 27 countries enforce this, and which ones are waking up to smell the coffee?&#8221;.</p><p>And that last table row&#8212;the Digital Fairness Act&#8212;is still yet to be proposed and finalized.</p><h2>So what <em>can</em> you do?</h2><p>If you didn&#8217;t get it yet&#8212;there is no size exemption. The 14-day right applies whether you turn over &#8364;5, &#8364;500, or &#8364;5 million a year. So the real question is never <em>&#8220;comply or don&#8217;t&#8221;</em>, but <em>&#8220;which of three things you can afford to spend&#8221;</em>.</p><p>Pick your poison below. It&#8217;s a triangle&#8212;your time, your margin, and your control&#8212;and you only get to keep two. You&#8217;re choosing the one you&#8217;ll give up.</p><h3>Keep Europe and keep your evenings&#8212;pay in margin</h3><p>This is the option nobody selling a compliance suite will mention, and it&#8217;s the one most small sellers actually want.</p><p>Hand the entire legal-seller job to a partner whose whole business <em>is</em> being the seller, and let them eat the VAT, the rep, the button, and the returns.</p><p>Selling digital goods? A <a href="https://www.lawinsider.com/dictionary/merchant-of-record">merchant-of-record</a> like <a href="https://www.lemonsqueezy.com/">Lemon Squeezy</a> or <a href="https://www.paddle.com/">Paddle</a>&#8212;a company that legally becomes the seller&#8212;absorbs essentially all of it: EU VAT in every member state, the consumer-law duties, even the chargeback liability.</p><p>Selling physical goods? A marketplace (Etsy, Amazon), a print-on-demand partner (e.g. <a href="https://www.printful.com/">Printful</a>), or <a href="https://help.shopify.com/en/manual/international/managed-markets">Shopify&#8217;s Managed Markets</a> (where Global-e becomes the merchant of record and adheres to local law for you) does the same for a cut of each sale.</p><p>You keep your store and your 450 million customers&#8212;but give up some margin and control. You already subscribe <em>(= pay rent)</em> to your storefront, your payments, and your hosting&#8212;renting the compliance is the same trade, and if your bottleneck is time and attention rather than cash, it&#8217;s the smart move, not a cop-out.</p><h3>Keep your margin and your independence&#8212;pay in time</h3><p>Do it yourself: register for IOSS, appoint one cheap EU rep, add the button, reprice for the &#8364;3 duty. Every point of margin stays yours and you control the whole experience; what you spend is the setup and the monthly filings. Initially slow work, but once you&#8217;re out of the start-up cost purgatory it <em>just works</em>.</p><h3>Keep your time and your cash&#8212;pay in market</h3><p>Switch EU checkout off.</p><p>Cleanly and dated, the way Apollo and Frens did. Cheapest in both money and effort, and a fair call when Europe is a rounding error. Just price in what you&#8217;re actually giving up: not only the sales, but the audience you quietly alienate and the upside you forfeit if your EU following ever takes off.</p><p>No single right answer. The corner you sacrifice depends on whether your scarcest resource is time, money, or being your own boss.</p><h2>Concrete examples</h2><p>The five rules are the same everywhere. What changes, platform to platform, is how much of them somebody else already carries for you. Here is the honest split, from &#8220;they do almost all of it&#8221; to &#8220;it&#8217;s entirely on you&#8221;. Find your row.</p><h3>Shopify: it&#8217;s your problem, politely</h3><p>Shopify has a <a href="https://help.shopify.com/en/manual/compliance/legal/eu-right-of-withdrawal">help page for exactly this</a>, and the first thing it does is hand the obligation straight back to you. It lays out the 19 June 2026 requirement&#8212;a visible withdrawal function, reachable without logging in, with a confirmation sent on a &#8220;durable medium&#8221; like email&#8212;and then says, in as many words, that &#8220;you&#8217;re responsible for reviewing this information and applying it to your business&#8221;. Shopify surfaces the rule. Shopify does not build the button.</p><p>There&#8217;s no native &#8220;withdrawal button&#8221; toggle in your admin (if Shopify ever ships one, use it), so two honest options remain:</p><ul><li><p><em>A Shopify app.</em> The Shopify App Store already has purpose-built withdrawal-button apps that drop in a two-step form, match it to the order, and fire the confirmation email, several with a free tier. Fine, as long as you are not paying monthly rent forever on a glorified <code>&lt;form&gt;</code> tag.</p></li><li><p><em>Do it yourself.</em> A footer link reachable from every page (with no mandatory login), a confirm page, and Shopify&#8217;s own order-notification email as the durable medium. That is the whole job.</p></li></ul><p><a href="https://help.shopify.com/en/manual/international/gpsr">GPSR</a> is similar: Shopify tells you a named EU &#8220;responsible person&#8221; is required, then tells you to go find and pay for one yourself. No built-in rep marketplace, just a product field to display the details. Good luck.</p><p>The platform that makes selling effortless is, when it comes to EU compliance, mostly a very polite sign that reads &#8220;your problem&#8221;.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vX9r!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a5307e-ac4c-4146-9e54-71f08e4b8330_1632x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vX9r!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a5307e-ac4c-4146-9e54-71f08e4b8330_1632x1024.png 424w, https://substackcdn.com/image/fetch/$s_!vX9r!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a5307e-ac4c-4146-9e54-71f08e4b8330_1632x1024.png 848w, https://substackcdn.com/image/fetch/$s_!vX9r!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a5307e-ac4c-4146-9e54-71f08e4b8330_1632x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!vX9r!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a5307e-ac4c-4146-9e54-71f08e4b8330_1632x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vX9r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a5307e-ac4c-4146-9e54-71f08e4b8330_1632x1024.png" width="1456" height="914" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/06a5307e-ac4c-4146-9e54-71f08e4b8330_1632x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:914,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Shopify Help Center page on the EU right of withdrawal, stating the compliance obligation is the merchant&#8217;s.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Shopify Help Center page on the EU right of withdrawal, stating the compliance obligation is the merchant&#8217;s." title="Shopify Help Center page on the EU right of withdrawal, stating the compliance obligation is the merchant&#8217;s." srcset="https://substackcdn.com/image/fetch/$s_!vX9r!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a5307e-ac4c-4146-9e54-71f08e4b8330_1632x1024.png 424w, https://substackcdn.com/image/fetch/$s_!vX9r!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a5307e-ac4c-4146-9e54-71f08e4b8330_1632x1024.png 848w, https://substackcdn.com/image/fetch/$s_!vX9r!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a5307e-ac4c-4146-9e54-71f08e4b8330_1632x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!vX9r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a5307e-ac4c-4146-9e54-71f08e4b8330_1632x1024.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 aria-hidden="true" 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><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">Shopify Help Center page on the EU right of withdrawal, stating the compliance obligation is the merchant&#8217;s.</figcaption></figure></div><h3>WooCommerce: open source, so the community already fixed it</h3><p>WooCommerce is the other half of the small-store world, and being open source, it punts even harder than Shopify. Its <a href="https://woocommerce.com/posts/eu-withdrawal-link-requirement/">own guidance</a>, published weeks before the deadline, ships no feature at all&#8212;it tells you to add a link, build a request form with any contact-form plugin, and process the refund through the order tools you already have. No native button, no &#8220;coming soon&#8221;.</p><p>The difference is that the ecosystem already solved it, for free. <a href="https://wordpress.org/plugins/woocommerce-germanized/">Germanized for WooCommerce</a>, a free plugin with 70,000-plus installs, added a withdrawal button &#8220;in compliance with EU directive 2023/2673&#8221; in its current release&#8212;guest-accessible, with a timestamped confirmation email as the durable medium&#8212;and it carries the GPSR &#8220;responsible person&#8221; fields in the same free plugin. So on WooCommerce the honest answer is the cheerful one: install the plugin, fill in a couple of settings, done. Open source quietly hands you what Shopify wants you to rent.</p><h3>Stripe: a refund is not a withdrawal</h3><p>This is the most common mix-up, so let&#8217;s say it slowly: <a href="https://docs.stripe.com/payments">Stripe</a> is your payments layer, not your consumer-law layer. There is no withdrawal button anywhere in Stripe, because that was never Stripe&#8217;s job.</p><p>When a customer withdraws and you push the <a href="https://docs.stripe.com/refunds">refund</a> through Stripe, the refund is the <em>consequence</em> of the withdrawal, not the withdrawal itself. The button, the two-step confirm, and the durable-medium email all have to exist before a single euro moves. Stripe&#8217;s customer portal can let subscribers cancel a plan in a click (handy, on by default), but that is a billing convenience, not the legally-labeled &#8220;withdraw from contract here&#8221; function that has to stay visible for the whole cooling-off period. Stripe&#8217;s one genuine EU-compliance footprint is SCA&#8212;the &#8220;confirm this in your banking app&#8221; step&#8212;which authenticates a payment rather than unwinds a contract. Different regime, different rulebook.</p><p>If you remember one line from this whole piece: &#8220;I refunded them in Stripe&#8221; is not &#8220;I was compliant&#8221;. The first is plumbing. The second is still yours to build.</p><p>There&#8217;s a darker corollary worth naming. A frictionless one-click withdrawal is also a <a href="https://www.retaildive.com/news/retailers-lost-billions-fraudulent-returns-2024/736393/">one-click fraud surface</a>: serial returners and fraudsters can withdraw, pocket the refund, and keep the goods (and the postage). So the moment you ship the button, fraud screening (Stripe Radar, a chargeback tool, a returns-abuse service) becomes the next thing you &#8220;need&#8221;. That&#8217;s the assimilation pattern again in miniature.</p><h3>Etsy: the marketplace carries some of it</h3><p>Etsy is the in-between case, and worth understanding, because &#8220;just move onto a marketplace&#8221; was the escape hatch from the last section: let a bigger platform absorb the compliance so you don&#8217;t have to. On Etsy you are still the legal seller, so the cancellation duty and the GPSR responsible person are technically yours&#8212;but Etsy quietly does a lot of the carrying.</p><p>It runs a built-in cancellation, refund, and case system, so the cancel mechanism already exists. For GPSR it lets you enter your &#8220;responsible person&#8221; once and applies it across every EU listing, and it <a href="https://www.etsy.com/seller-handbook/article/1093438529659">partnered with EU-rep services</a> so a maker in Ohio can actually appoint one instead of giving up. It even gives you a single switch to turn EU and Northern Ireland sales off entirely, which is how <a href="https://www.bbc.com/news/articles/c5ydrp0kjn5o">a lot of small shops &#8220;complied&#8221; in December 2024</a>.</p><p>What Etsy had not, at the time of writing, shipped is a dedicated Directive-2023/2673 withdrawal button; it leans on its existing returns-and-refunds machinery instead. If that has changed by the time you read this, the underlying point has not: on a marketplace you inherit whatever the platform builds, for better and for worse.</p><p>The trade is the one from earlier: Etsy absorbs the painful parts, and in exchange takes its cut and its place between you and your customer. For many one-person shops that is the rational deal. It is also, precisely, becoming a tenant.</p><h3>The App Store and Google Play: read the fine print on &#8220;who is the seller&#8221;</h3><p>Selling a <em>digital</em> product through an app store? Whether the consumer-law machinery is yours hinges on one question&#8212;who is the legal seller&#8212;and the two big stores answer it differently.</p><p>On Apple&#8217;s App Store, the store is the seller. In the EU, Apple sells through an Irish entity, <a href="https://www.apple.com/legal/internet-services/itunes/">Apple Distribution International</a>, which is the merchant of record: it takes the money, remits the VAT, and fields the cancellations, refunds, and the 14-day withdrawal. That part really is Apple&#8217;s problem, not yours.</p><p>Google Play is the trap. Google <a href="https://support.google.com/googleplay/answer/2850368">collects and remits the VAT</a> for EU buyers, but its own terms say the purchase is &#8220;made from the developer of the app&#8221;. In other words, on Google Play <em>you</em> are usually the seller of record, and the consumer-law duty (including the withdrawal function) can land on you even though Google runs the checkout. Same kind of storefront, opposite answer. The plumbing is there, to be fair&#8212;Google gives you a <a href="https://developer.android.com/google/play/billing/subscriptions">one-click deep link to the Play cancel-and-manage-subscription screen</a> you can wire straight to a button&#8212;so the mechanism was never the hard part; knowing the duty is yours is.</p><p>What both stores already give you, regardless, is the digital-goods escape hatch, the &#8220;I want this now, and I understand I waive my right to cancel&#8221; box from Bruno&#8217;s story, <a href="https://support.google.com/googleplay/answer/15576634">Article 16(m)</a> in the flesh, plus built-in subscription cancellation in account settings. And the moment you take <a href="https://developer.apple.com/support/communication-and-promotion-of-offers-on-the-app-store-in-the-eu/">Apple&#8217;s or Google&#8217;s alternative EU payment terms</a> and bill customers directly, every duty swings squarely onto you. So choose deliberately if you bill via Stripe in the EU.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sdBa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe287afa7-ac1e-44db-b164-b791297c685a_536x1162.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sdBa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe287afa7-ac1e-44db-b164-b791297c685a_536x1162.png 424w, https://substackcdn.com/image/fetch/$s_!sdBa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe287afa7-ac1e-44db-b164-b791297c685a_536x1162.png 848w, https://substackcdn.com/image/fetch/$s_!sdBa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe287afa7-ac1e-44db-b164-b791297c685a_536x1162.png 1272w, https://substackcdn.com/image/fetch/$s_!sdBa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe287afa7-ac1e-44db-b164-b791297c685a_536x1162.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sdBa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe287afa7-ac1e-44db-b164-b791297c685a_536x1162.png" width="536" height="1162" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e287afa7-ac1e-44db-b164-b791297c685a_536x1162.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1162,&quot;width&quot;:536,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;An iOS Manage Subscriptions screen with a Cancel Subscription option, the built-in cancellation flow the store already provides.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="An iOS Manage Subscriptions screen with a Cancel Subscription option, the built-in cancellation flow the store already provides." title="An iOS Manage Subscriptions screen with a Cancel Subscription option, the built-in cancellation flow the store already provides." srcset="https://substackcdn.com/image/fetch/$s_!sdBa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe287afa7-ac1e-44db-b164-b791297c685a_536x1162.png 424w, https://substackcdn.com/image/fetch/$s_!sdBa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe287afa7-ac1e-44db-b164-b791297c685a_536x1162.png 848w, https://substackcdn.com/image/fetch/$s_!sdBa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe287afa7-ac1e-44db-b164-b791297c685a_536x1162.png 1272w, https://substackcdn.com/image/fetch/$s_!sdBa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe287afa7-ac1e-44db-b164-b791297c685a_536x1162.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 aria-hidden="true" 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><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 iOS Manage Subscriptions screen with a Cancel Subscription option, the built-in cancellation flow the store already provides.</figcaption></figure></div><h3>Other digital storefronts</h3><p>Steam, the Microsoft Store, the Nintendo eShop, Samsung&#8217;s and Xiaomi&#8217;s app stores, every other storefront collapses to the same single question: <em>is the platform the legal seller, or just my payment processor?</em>.</p><p>The big digital stores (<a href="https://store.steampowered.com/subscriber_agreement/">Steam through Valve</a>, <a href="https://learn.microsoft.com/en-us/microsoft-365/commerce/billing-and-payments/tax-information?view=o365-worldwide">Microsoft</a>, <a href="https://www.nintendo.com/eu/terms/3ds/3DS_Shop_EULA/3DS-EULA-Europe_EN-2018-05.html">Nintendo of Europe</a>) generally sell as the principal, collect the EU VAT, and therefore carry the cancellation and withdrawal machinery for you, much like Apple. A thinner &#8220;we only process the payment&#8221; platform leaves it on you, like Google Play. Before you build anything, search your platform&#8217;s terms of service for the word &#8220;seller&#8221; and find out which one you are. That answer decides everything else in this article.</p><h3>Your own storefront: the DIY route</h3><p>If you run your own code, every piece is yours, which is also the good news&#8212;the whole thing is genuinely small. A visible &#8220;Withdraw from contract here&#8221; link on every page, a confirm step so nobody cancels by accident, a stored record with a timestamp, and a confirmation email as the durable medium. That is the entire spec.</p><p>Rather than paste a wall of code here, I built it once so you don&#8217;t have to: a free, open-source, copy-paste reference you can fork, at <strong><a href="https://github.com/yuryv-info/parrot-tee-sample">github.com/yuryv-info/parrot-tee-sample</a></strong> (with a <a href="https://parrot-tee-sample.vercel.app/?utm_source=yvinsights&amp;utm_medium=newsletter&amp;utm_campaign=eu-withdrawal-button">live demo you can click through</a>). It ships a plain button and confirm page and a tiny server handler. Ask your AI agent about wiring it into a Shopify theme or a mobile app&#8217;s settings screen&#8212;the notes and <code>AGENTS.md</code> are there for you.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_ESv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F758fe221-655e-435f-8e56-3dc5a9343ccf_400x112.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_ESv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F758fe221-655e-435f-8e56-3dc5a9343ccf_400x112.png 424w, https://substackcdn.com/image/fetch/$s_!_ESv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F758fe221-655e-435f-8e56-3dc5a9343ccf_400x112.png 848w, https://substackcdn.com/image/fetch/$s_!_ESv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F758fe221-655e-435f-8e56-3dc5a9343ccf_400x112.png 1272w, https://substackcdn.com/image/fetch/$s_!_ESv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F758fe221-655e-435f-8e56-3dc5a9343ccf_400x112.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_ESv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F758fe221-655e-435f-8e56-3dc5a9343ccf_400x112.png" width="236" height="66.08" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/758fe221-655e-435f-8e56-3dc5a9343ccf_400x112.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:112,&quot;width&quot;:400,&quot;resizeWidth&quot;:236,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;View on GitHub&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="View on GitHub" title="View on GitHub" srcset="https://substackcdn.com/image/fetch/$s_!_ESv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F758fe221-655e-435f-8e56-3dc5a9343ccf_400x112.png 424w, https://substackcdn.com/image/fetch/$s_!_ESv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F758fe221-655e-435f-8e56-3dc5a9343ccf_400x112.png 848w, https://substackcdn.com/image/fetch/$s_!_ESv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F758fe221-655e-435f-8e56-3dc5a9343ccf_400x112.png 1272w, https://substackcdn.com/image/fetch/$s_!_ESv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F758fe221-655e-435f-8e56-3dc5a9343ccf_400x112.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption"><a href="https://github.com/yuryv-info/parrot-tee-sample">https://github.com/yuryv-info/parrot-tee-sample</a></figcaption></figure></div><h2>If it&#8217;s still confusing</h2><blockquote><p>Yury, I just want to sell to Europeans and not leave my customers stranded. This is too complicated. What do I do, concretely?</p></blockquote><p>Well, start by working out which of the five regulation packages even touch you&#8212;because most people owe far less than the panic implies.</p><p>If you sell physical goods to EU consumers from your own store, you owe four things:</p><ol><li><p>Register for IOSS so VAT is handled in one place, through the <a href="https://vat-one-stop-shop.ec.europa.eu/index_en">EU&#8217;s One-Stop Shop portal</a> (or let your accountant or an IOSS intermediary file it for you). </p></li><li><p>Appoint one shared EU &#8220;responsible person&#8221;. This is box-ticking, not a trust relationship: you are renting a name and an address that legally stands behind your product, usually for a flat annual fee in the low hundreds of euros. Search &#8220;GPSR authorized representative&#8221;, compare a few, pick one. You are buying compliance, not a co-founder. </p></li><li><p>Reprice for the &#8364;3 duty. Simplest path: fold it into your prices, or add a visible &#8220;EU import fee&#8221; line at checkout, the same way you already handle shipping. </p></li><li><p>Add the withdrawal button&#8212;an afternoon&#8217;s work with your web developer or an AI agent&#8212;or a free plug-in from your plugin&#8217;s app store.</p></li></ol><p>That is the entire list. If you sell through a marketplace like Etsy or through the app stores, most of that is already carried for you, so check what <em>they</em> handle first (the per-platform breakdown is the section right above this one) before you build anything.</p><p>If Europe is a thin slice of your revenue, say under 5-10%, the honest answer might simply be to switch EU checkout off cleanly, the way Apollo and Frens did.</p><p>Just be clear-eyed that &#8220;off&#8221; is not free either: you are trading the compliance cost for the cost of alienating part of your audience and the upside you forfeit if your EU following ever takes off. Pick the cost you&#8217;d rather carry. <em>(Product idea: you can add a waitlist for when you get a critical mass of European fans later in the future!)</em></p><p>What you do <em>not</em> do is buy a six-figure &#8220;compliance platform&#8221;, pay monthly rent on &#8220;withdrawal button as a service&#8221;, or panic in a lawyer&#8217;s office. Nobody is coming to fine a parrot merch shop on June 19th for a missing button. The real exposure is that 12-month cancellation window you trigger by never telling customers their rights at all, and that is fixed with one paragraph of plain copy that you asked ChatGPT to write for you.</p><h3>The shameless plug</h3><p>I&#8217;ll be honest about why this next section exists: untangling five overlapping EU rules for <em>your specific shop</em> is genuinely fiddly, and I find it weirdly fun, so I do it for people at <a href="https://yuryv.info/">yuryv.info</a>.</p><p>I am not a lawyer, so I am not qualified to give legal advice on compliance and what you <em>actually</em> need to <em>not get fined</em>. What we <em>can</em> do is technical brainstorming&#8212;once you figure out what you need (a button, a cancellation flow, a rewritten copy, an IOSS signup), and the open-source code samples linked above are still too complicated, we here at Team YV can implement a compliant withdrawal flow in your store or app, then harden it with tests and automations.</p><p style="text-align: center;"><em>&#8220;Consulting slots&#8212;and even discovery calls&#8212;run out fast. Don&#8217;t delay, buy today&#8221;</em></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Qlne!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe09679e-afc2-4638-9d87-6433dad0d9a4_480x112.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Qlne!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe09679e-afc2-4638-9d87-6433dad0d9a4_480x112.png 424w, https://substackcdn.com/image/fetch/$s_!Qlne!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe09679e-afc2-4638-9d87-6433dad0d9a4_480x112.png 848w, https://substackcdn.com/image/fetch/$s_!Qlne!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe09679e-afc2-4638-9d87-6433dad0d9a4_480x112.png 1272w, https://substackcdn.com/image/fetch/$s_!Qlne!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe09679e-afc2-4638-9d87-6433dad0d9a4_480x112.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Qlne!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe09679e-afc2-4638-9d87-6433dad0d9a4_480x112.png" width="480" height="112" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/be09679e-afc2-4638-9d87-6433dad0d9a4_480x112.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:112,&quot;width&quot;:480,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Book now on yuryv.info&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Book now on yuryv.info" title="Book now on yuryv.info" srcset="https://substackcdn.com/image/fetch/$s_!Qlne!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe09679e-afc2-4638-9d87-6433dad0d9a4_480x112.png 424w, https://substackcdn.com/image/fetch/$s_!Qlne!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe09679e-afc2-4638-9d87-6433dad0d9a4_480x112.png 848w, https://substackcdn.com/image/fetch/$s_!Qlne!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe09679e-afc2-4638-9d87-6433dad0d9a4_480x112.png 1272w, https://substackcdn.com/image/fetch/$s_!Qlne!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe09679e-afc2-4638-9d87-6433dad0d9a4_480x112.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption"><a href="https://book.stripe.com/6oU5kDcBb5MKcz67K58so01">https://book.stripe.com/6oU5kDcBb5MKcz67K58so01</a></figcaption></figure></div><h2>Conclusion</h2><p>The EU&#8217;s &#8220;withdrawal button&#8221; is actually a slow, deliberate squeeze. VAT, traceability, product-safety reps, dead duty thresholds, and yes&#8212;a cancel button. It is aimed at making the bloc a harder place to sell cheap&#8212;not by banning Shein and Temu, but by making the cheap fast fashion stuff stop being so cheap, and at making customers harder to trap. The button is the part with a name and a date, so it gets the blame&#8212;just like &#8220;cookie banners&#8221; took the blame for the whole of GDPR in the 2010s.</p><p>Most of you reading this owe an afternoon of work, one tax registration, and one honest &#8220;is the EU worth it&#8221; reflection where you choose A, B, or C.</p><p>Apollo and Frens made a reasonable call given their audience is mostly US-based, and if naming the right decision saves even one of you from either overpaying a consultancy or needlessly switching off 450 million customers, this was worth writing.</p><p><em>&#8212; Yury Vashchylau &#8226; <a href="https://yuryv.info/">yuryv.info</a></em> <em>A deep dive into how apps, games, people, and money interact.</em> <a href="https://yuryv.info/">yuryv.info</a> | <a href="https://yvinsights.com/">yvinsights.com</a> | <a href="https://yvpodcast.yvinsights.com/">YV Podcast</a></p><ul><li><p>Subscribe on LinkedIn and send this to your boss: https://www.linkedin.com/newsletters/yv-insider-by-yuryv-info-7444467518737608704/</p></li><li><p>Subscribe on Substack: https://yvinsights.com/</p></li><li><p>The Rabbit Hole&#8212;out loud&#8212;on YV Podcast: https://yvpodcast.yvinsights.com/</p></li></ul><div id="youtube2-B8-ZmuJixIg" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;B8-ZmuJixIg&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/B8-ZmuJixIg?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p style="text-align: center;"><em>The parrot that started all this gets the send-off&#8212;go give <a href="https://www.youtube.com/channel/UCRE0hq5gT69syu2ybmpuYWA">Apollo and Frens</a> the views.</em></p><h2>Links</h2><p><strong>The directive (primary)</strong> - <a href="https://eur-lex.europa.eu/eli/dir/2023/2673/oj/eng">Directive (EU) 2023/2673&#8212;EUR-Lex</a> - <a href="https://eur-lex.europa.eu/EN/legal-content/summary/consumer-information-right-of-withdrawal-and-other-consumer-rights.html">Right of withdrawal and consumer rights&#8212;EUR-Lex summary</a></p><p><strong>Dark patterns &amp; cancellation friction (what the EU is reacting to)</strong> - <a href="https://www.freshfields.com/en/our-thinking/blogs/technology-quotient/digital-fitness-check-and-digital-fairness-act-part-7-contract-cancellations-and-102krzt">EU consumer-law Fitness Check: 69% hit cancellation difficulty&#8212;Freshfields</a> - <a href="https://op.europa.eu/en/publication-detail/-/publication/606365bc-d58b-11ec-a95f-01aa75ed71a1/language-en">European Commission behavioural study on dark patterns (2022)</a> - <a href="https://www.ftc.gov/news-events/news/press-releases/2024/10/federal-trade-commission-announces-final-click-cancel-rule-making-it-easier-consumers-end-recurring">FTC &#8220;click-to-cancel&#8221; / Negative Option Rule (2024)</a> - <a href="https://www.deceptive.design/types/roach-motel">Harry Brignull, the &#8220;roach motel&#8221; &#8212; deceptive.design</a> - <a href="https://arxiv.org/abs/1907.07032">Mathur et al., &#8220;Dark Patterns at Scale&#8221; (Princeton, 2019)</a> - <a href="https://www.deceptive.design/cases/norwegian-consumer-council-complaint-against-amazon-prime">Amazon Prime: Norwegian Consumer Council, &#8220;You can log out, but you can never leave&#8221; (2021)</a> - <a href="https://www.techtarget.com/searchcio/news/366593576/FTC-DOJ-take-aim-at-dark-patterns-with-Adobe-lawsuit">Adobe: DOJ/FTC suit over hidden cancellation fees (2024)</a> - <a href="https://www.deceptive.design/brands/new-york-times">The New York Times: phone-only cancellation&#8212;Deceptive Patterns</a> - <a href="https://www.henson-legal.com/newsroom/la-fitnesss-cancellation-treadmill-runs-into-a-wall-with-the-ftc">LA Fitness: FTC suit over certified-mail/phone cancellation (2025)</a></p><p><strong>The logistics squeeze (2026)</strong> - <a href="https://taxfoundation.org/research/all/federal/trump-tariffs-trade-war/">US tariffs 2025-2026 tracker&#8212;Tax Foundation</a> - <a href="https://www.britannica.com/event/2026-Iran-war">The 2026 Iran war&#8212;Britannica</a> - <a href="https://commonslibrary.parliament.uk/research-briefings/cbp-10636/">Strait of Hormuz / shipping impact&#8212;UK House of Commons Library</a> - <a href="https://www.cnbc.com/2026/04/21/oil-price-iran-war-middle-east.html">Oil prices and the Iran war&#8212;CNBC</a> - <a href="https://www.aircargonews.net/supply-chains/2026/03/box-lines-unlikely-to-return-to-suez-canal-in-2026-following-middle-east-strikes/">Container lines unlikely to return to Suez in 2026&#8212;Air Cargo News</a></p><p><strong>Withdrawal button analysis</strong> - <a href="https://www.taylorwessing.com/en/insights-and-events/insights/2026/02/withdrawal-button-as-compliance-risk-for-eu-and-non-eu-businesses">The &#8220;Withdrawal Button&#8221;: a compliance risk for (non-)EU businesses&#8212;Taylor Wessing</a> - <a href="https://www.arnoldporter.com/en/perspectives/advisories/2026/05/eu-withdrawal-button-uk-subscription-rules-and-data-protection-risks-for-us-online-sellers">EU Withdrawal Button: what US online sellers need to know&#8212;Arnold &amp; Porter</a> - <a href="https://www.twobirds.com/en/insights/2026/germany/mandatory-withdrawal-button-upcoming-in-germany-key-implications-for-online-sellers">Mandatory withdrawal button in Germany: penalties up to EUR 50,000 / 4% turnover&#8212;Bird &amp; Bird</a> - <a href="https://help.shopify.com/en/manual/compliance/legal/eu-right-of-withdrawal">EU right of withdrawal compliance&#8212;Shopify Help Center</a></p><p><strong>Germany&#8217;s precedent (K&#252;ndigungsbutton, &#167;312k BGB)</strong> - <a href="https://www.noerr.com/en/insights/cancellation-button-in-online-sales">Cancellation button in online sales&#8212;Noerr</a></p><p><strong>GPSR (the responsible-person rule)</strong> - <a href="https://www.etsy.com/seller-handbook/article/1093438529659">Selling consumer products to Europe under the GPSR&#8212;Etsy Seller Handbook</a> - <a href="https://www.bbc.com/news/articles/c5ydrp0kjn5o">Some businesses suspend NI and EU sales due to GPSR&#8212;BBC News</a> - <a href="https://blog.folksy.com/2024/11/26/gpsr-guide-for-artists-and-makers-on-folksy">What artists and makers on Folksy need to know about GPSR&#8212;Folksy</a> - <a href="https://www.gov.uk/government/publications/general-product-safety-regulations-northern-ireland/eu-regulation-2023988-on-general-product-safety-factsheet">General Product Safety Regulation factsheet&#8212;UK Government (OPSS)</a> - <a href="https://help.shopify.com/en/manual/international/gpsr">Understanding the GPSR&#8212;Shopify Help Center</a></p><p><strong>Platform compliance (who carries the withdrawal duty)</strong> - <a href="https://help.shopify.com/en/manual/compliance/legal/eu-right-of-withdrawal">EU right of withdrawal compliance&#8212;Shopify Help Center</a> - <a href="https://docs.stripe.com/refunds">Refunds&#8212;Stripe Docs</a> - <a href="https://docs.stripe.com/strong-customer-authentication">Strong Customer Authentication (SCA)&#8212;Stripe Docs</a> - <a href="https://www.apple.com/legal/internet-services/itunes/">Apple Media Services terms and right of withdrawal&#8212;Apple Legal</a> - <a href="https://support.google.com/googleplay/answer/2850368">Who is the seller / VAT on Google Play&#8212;Google Play Help</a> - <a href="https://support.google.com/googleplay/answer/15576634">EEA consumer rights and the 14-day withdrawal&#8212;Google Play Help</a> - <a href="https://developer.apple.com/support/communication-and-promotion-of-offers-on-the-app-store-in-the-eu/">Alternative business terms for apps in the EU&#8212;Apple Developer</a></p><p><strong>VAT / IOSS</strong> - <a href="https://vat-one-stop-shop.ec.europa.eu/index_en">VAT One-Stop Shop&#8212;European Commission</a></p><p><strong>End of the EUR 150 de-minimis</strong> - <a href="https://taxation-customs.ec.europa.eu/news/e-commerce-150-eur-customs-duty-exemption-threshold-be-removed-2026-2025-11-13_en">150 EUR customs-duty exemption to be removed in 2026&#8212;EC Taxation &amp; Customs</a></p><p><strong>Fast fashion: the crackdown, the labor, the waste</strong> - <a href="https://www.euronews.com/business/2025/07/04/france-hands-shein-40-million-fine-for-deceptive-commercial-practices">France hands Shein EUR 40 million fine&#8212;Euronews</a> - <a href="https://www.business-humanrights.org/en/latest-news/china-bbc-investigation-reveals-shein-suppliers-workers-face-75-hour-work-weeks-low-wages-incl-co-comment/">Shein suppliers&#8217; workers face 75-hour weeks&#8212;BBC, via Business &amp; Human Rights Centre</a> - <a href="https://chinaselectcommittee.house.gov/media/press-releases/select-committee-releases-interim-findings-shein-temu-forced-labor">US Select Committee on the CCP: Shein &amp; Temu forced-labor interim findings</a> - <a href="https://www.europarl.europa.eu/topics/en/article/20201208STO93327/the-impact-of-textile-production-and-waste-on-the-environment-infographics">The impact of textile production and waste on the environment&#8212;European Parliament</a></p><p><strong>What&#8217;s next</strong> - <a href="https://www.europarl.europa.eu/legislative-train/theme-protecting-our-democracy-upholding-our-values/file-digital-fairness-act">Digital Fairness Act&#8212;European Parliament Legislative Train</a> - <a href="https://digital-strategy.ec.europa.eu/en/consultations/commission-launches-open-consultation-forthcoming-digital-fairness-act">Digital Fairness Act consultation (dark patterns, addictive design, personalization)&#8212;European Commission</a> - <a href="https://www.euronews.com/next/2026/05/18/the-eus-plan-to-tackle-cookie-fatigue">The EU&#8217;s plan to tackle cookie fatigue (the Digital Omnibus)&#8212;Euronews</a> - <a href="https://commission.europa.eu/about_en">What the European Commission is and does&#8212;European Commission</a> - <a href="https://www.freshfields.com/en/our-thinking/blogs/risk-and-compliance/dmcca-subscription-reforms-now-set-for-spring-2027-102mor4">UK&#8217;s own subscription regime (DMCCA), now set for spring 2027&#8212;Freshfields</a></p>]]></content:encoded></item><item><title><![CDATA[10 Things I Do on Every New Xcode Installation]]></title><description><![CDATA[&#8230;and a welcome to the first edition of YV Insights.]]></description><link>https://yvinsights.com/p/10-things-i-do-on-every-new-xcode</link><guid isPermaLink="false">https://yvinsights.com/p/10-things-i-do-on-every-new-xcode</guid><dc:creator><![CDATA[Yury Vashchylau | yuryv.info]]></dc:creator><pubDate>Mon, 08 Jun 2026 22:03:56 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!dlAq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ab46cf3-aa9a-40ca-928c-8f8b4a0c888b_1800x1012.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dlAq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ab46cf3-aa9a-40ca-928c-8f8b4a0c888b_1800x1012.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dlAq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ab46cf3-aa9a-40ca-928c-8f8b4a0c888b_1800x1012.jpeg 424w, https://substackcdn.com/image/fetch/$s_!dlAq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ab46cf3-aa9a-40ca-928c-8f8b4a0c888b_1800x1012.jpeg 848w, https://substackcdn.com/image/fetch/$s_!dlAq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ab46cf3-aa9a-40ca-928c-8f8b4a0c888b_1800x1012.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!dlAq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ab46cf3-aa9a-40ca-928c-8f8b4a0c888b_1800x1012.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dlAq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ab46cf3-aa9a-40ca-928c-8f8b4a0c888b_1800x1012.jpeg" width="588" height="330.75" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9ab46cf3-aa9a-40ca-928c-8f8b4a0c888b_1800x1012.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:588,&quot;bytes&quot;:319851,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://yvinsights.substack.com/i/201161893?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ab46cf3-aa9a-40ca-928c-8f8b4a0c888b_1800x1012.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dlAq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ab46cf3-aa9a-40ca-928c-8f8b4a0c888b_1800x1012.jpeg 424w, https://substackcdn.com/image/fetch/$s_!dlAq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ab46cf3-aa9a-40ca-928c-8f8b4a0c888b_1800x1012.jpeg 848w, https://substackcdn.com/image/fetch/$s_!dlAq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ab46cf3-aa9a-40ca-928c-8f8b4a0c888b_1800x1012.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!dlAq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ab46cf3-aa9a-40ca-928c-8f8b4a0c888b_1800x1012.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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>A fresh Xcode install looks harmless.</p><p>But if you&#8217;ve been in the iOS game for a while, you know better&#8212;because nothing ages a developer faster than &#8220;<em>No signing certificate &#8216;iOS Distribution&#8217; found</em>&#8221; on a release day combined with &#8220;<em>where did all my hotkeys go??&#8221;</em>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://yvinsights.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">YV Insights &#129489;&#8205;&#128187;&#128296; by yuryv.info is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>I&#8217;ll spare you the history of <a href="https://en.wikipedia.org/wiki/Project_Builder">Project Builder</a>, and the fact that Xcode is a <a href="https://forums.macrumors.com/threads/why-is-xcode-still-so-rubbish.2478824/">creaky, decades-deep codebase</a>. The numbers back it up: you <em>have to</em> have a Mac and an Xcode toolchain as your primary IDE. Even though <a href="https://rentamac.io/ios-app-development-statistics/">95% of us are using Xcode as our main toolchain</a>, the day you augment it with <a href="https://code.visualstudio.com/download">VS Code</a> or <a href="https://cursor.com">Cursor</a> is the day you realize you merely tolerated the default IDE Apple ships the mandatory stuff with.</p><p>The bottom line is: Xcode is just not pleasant to work with, and it never quite has been.</p><p>So this is the part where every micro-adjustment will make your life slightly better every time&#8212;and it compounds <em>fast</em> if you&#8217;re working on a moderately serious app or using a modern agent-assisted flow.</p><h4>The Tough Part</h4><p>If the Agentic AI hype wave taught you one thing, it&#8217;s that nobody can reliably predict what ships next month, let alone next decade.</p><p>This goes double for Xcode and Mobile development in general. There&#8217;s a real chance that tomorrow will bring web-based applets &#224; la <a href="https://developer.apple.com/documentation/appclip">App Clips</a> or <a href="https://www.macrumors.com/2026/05/31/apple-glasses-late-2027-report/">Apple Glasses</a> that compete with <a href="https://www.meta.com/ai-glasses/ray-ban-meta/">Meta&#8217;s Ray-Bans</a>. Apple keeps quietly prototyping.</p><p>So I&#8217;ve written this list to be evergreen to the highest extent possible. If you&#8217;re reading this 10 years from now, unless Apple retires Xcode and does a full bottom-up rewrite, very few things here will be outdated. And judging by how the industry treats rewrites, where the canonical advice is literally <a href="https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/">&#8220;never rewrite from scratch&#8221;</a>, plus Xcode&#8217;s own NeXT-era lineage, I would not hold my breath.</p><p>Light spoiler: Number 4 has been a game changer for me since 2019, and #5 has existed for over a decade now. Never went stale, never got retired by Claude Code, never went the way of <a href="https://medium.com/rocknnull/xcode-8-plugins-alcatraz-the-end-of-an-era-ea6e63617d14">Xcode Plugins</a>.</p><p>Let&#8217;s dive in.</p><h4>1. Install Xcodes to manage Xcode versions</h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Agtn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F240c4c50-0a10-47dc-94f7-d99297c37fe3_2262x1520.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Agtn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F240c4c50-0a10-47dc-94f7-d99297c37fe3_2262x1520.png 424w, https://substackcdn.com/image/fetch/$s_!Agtn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F240c4c50-0a10-47dc-94f7-d99297c37fe3_2262x1520.png 848w, https://substackcdn.com/image/fetch/$s_!Agtn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F240c4c50-0a10-47dc-94f7-d99297c37fe3_2262x1520.png 1272w, https://substackcdn.com/image/fetch/$s_!Agtn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F240c4c50-0a10-47dc-94f7-d99297c37fe3_2262x1520.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Agtn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F240c4c50-0a10-47dc-94f7-d99297c37fe3_2262x1520.png" width="525" height="352.6442307692308" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/240c4c50-0a10-47dc-94f7-d99297c37fe3_2262x1520.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:978,&quot;width&quot;:1456,&quot;resizeWidth&quot;:525,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;screenshot_light.png&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="screenshot_light.png" title="screenshot_light.png" srcset="https://substackcdn.com/image/fetch/$s_!Agtn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F240c4c50-0a10-47dc-94f7-d99297c37fe3_2262x1520.png 424w, https://substackcdn.com/image/fetch/$s_!Agtn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F240c4c50-0a10-47dc-94f7-d99297c37fe3_2262x1520.png 848w, https://substackcdn.com/image/fetch/$s_!Agtn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F240c4c50-0a10-47dc-94f7-d99297c37fe3_2262x1520.png 1272w, https://substackcdn.com/image/fetch/$s_!Agtn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F240c4c50-0a10-47dc-94f7-d99297c37fe3_2262x1520.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 aria-hidden="true" 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><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 style="text-align: center;"><em><sub>A screenshot of Xcodes (source: GitHub)</sub></em></p><p>If you miss using <a href="https://www.jetbrains.com/toolbox-app/">JetBrains Toolbox</a>&#8212;this one is for you.</p><p><a href="https://github.com/XcodesOrg/XcodesApp">Xcodes</a> exists for one specific pain point: installing and switching between multiple Xcode versions without manually juggling giant app bundles. The official <a href="https://formulae.brew.sh/formula/xcodes">Homebrew formula</a> gives you&#8212;and your favorite AI Agent&#8212;a command-line tool to install and switch between multiple versions of Xcode, while harnessing Apple&#8217;s own <code>xcode-select</code> tool&#8212;the latter only controls which already-installed developer directory is active for tools like <code>xcodebuild</code>, <code>xcrun</code>, and <code>cc</code>. It tells your system &#8220;<em>hey, </em>switch<em> between different Xcode installations that I have on my machine</em>&#8221;.</p><p>In a Beta season, if your next task is &#8220;ensure iOS Beta builds don&#8217;t break while you still need the latest stable version of iOS for maintenance work&#8221;, Apple&#8217;s answer is &#8220;use <a href="https://developer.apple.com/download/">https://developer.apple.com/download/</a>&#8221;.</p><p>When a &#8220;minor&#8221; <a href="https://github.com/actions/runner-images/issues/10104">Xcode upgrade breaks your CI pipeline</a>, Apple&#8217;s answer is &#8220;well, have you tried Xcode Cloud?&#8221;.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://yvinsights.com/p/10-things-i-do-on-every-new-xcode/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://yvinsights.com/p/10-things-i-do-on-every-new-xcode/comments"><span>Leave a comment</span></a></p><p>Xcodes <em>is</em> that switch + downloader + version browser&#8212;all the way down to Xcode 1.0. (<em>Which you can&#8217;t run on a modern Apple Silicon machine. Sorry, no nostalgia Rabbit Hole this time.)</em></p><h4>2. Enable &#8220;Show whitespaces and newlines&#8221;</h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9Rnz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70fa02cb-9096-44c9-ad70-7c878c25b9c9_850x386.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9Rnz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70fa02cb-9096-44c9-ad70-7c878c25b9c9_850x386.png 424w, https://substackcdn.com/image/fetch/$s_!9Rnz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70fa02cb-9096-44c9-ad70-7c878c25b9c9_850x386.png 848w, https://substackcdn.com/image/fetch/$s_!9Rnz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70fa02cb-9096-44c9-ad70-7c878c25b9c9_850x386.png 1272w, https://substackcdn.com/image/fetch/$s_!9Rnz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70fa02cb-9096-44c9-ad70-7c878c25b9c9_850x386.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9Rnz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70fa02cb-9096-44c9-ad70-7c878c25b9c9_850x386.png" width="560" height="254.30588235294118" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/70fa02cb-9096-44c9-ad70-7c878c25b9c9_850x386.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:386,&quot;width&quot;:850,&quot;resizeWidth&quot;:560,&quot;bytes&quot;:75810,&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://yvinsights.substack.com/i/201161893?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70fa02cb-9096-44c9-ad70-7c878c25b9c9_850x386.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_!9Rnz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70fa02cb-9096-44c9-ad70-7c878c25b9c9_850x386.png 424w, https://substackcdn.com/image/fetch/$s_!9Rnz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70fa02cb-9096-44c9-ad70-7c878c25b9c9_850x386.png 848w, https://substackcdn.com/image/fetch/$s_!9Rnz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70fa02cb-9096-44c9-ad70-7c878c25b9c9_850x386.png 1272w, https://substackcdn.com/image/fetch/$s_!9Rnz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70fa02cb-9096-44c9-ad70-7c878c25b9c9_850x386.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 aria-hidden="true" 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><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 style="text-align: center;"><em>The Xcode editor with invisible characters enabled</em></p><p>You can&#8217;t fix what you can&#8217;t see. By default Xcode hides every space, tab, and newline&#8212;which is how you end up with a diff that&#8217;s 40 &#8220;changed&#8221; lines and 39 of them are nothingness that you didn&#8217;t even touch.</p><p>Turn it on under <em>Editor &gt; Invisibles</em> (recent Xcode also exposes it in <em>Settings &gt; Text Editing &gt; Display</em>). Spaces, tabs, and line endings become visible, so you catch a stray tab in a spaces file&#8212;or trailing junk&#8212;before it reaches the PR.</p><p>It looks noisy for a day. Then your brain filters the dots out and you never go back after noticing how tidy it makes your code look.</p><p>Pairs directly with the next one&#8230;</p><h4>3. Disable &#8220;Leave whitespaces-only lines intact&#8221;</h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!C1YE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe792ba-9dd4-40ac-9079-2cc11b8b114e_976x514.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!C1YE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe792ba-9dd4-40ac-9079-2cc11b8b114e_976x514.png 424w, https://substackcdn.com/image/fetch/$s_!C1YE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe792ba-9dd4-40ac-9079-2cc11b8b114e_976x514.png 848w, https://substackcdn.com/image/fetch/$s_!C1YE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe792ba-9dd4-40ac-9079-2cc11b8b114e_976x514.png 1272w, https://substackcdn.com/image/fetch/$s_!C1YE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe792ba-9dd4-40ac-9079-2cc11b8b114e_976x514.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!C1YE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe792ba-9dd4-40ac-9079-2cc11b8b114e_976x514.png" width="976" height="514" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dfe792ba-9dd4-40ac-9079-2cc11b8b114e_976x514.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:514,&quot;width&quot;:976,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:58616,&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://yvinsights.substack.com/i/201161893?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe792ba-9dd4-40ac-9079-2cc11b8b114e_976x514.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_!C1YE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe792ba-9dd4-40ac-9079-2cc11b8b114e_976x514.png 424w, https://substackcdn.com/image/fetch/$s_!C1YE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe792ba-9dd4-40ac-9079-2cc11b8b114e_976x514.png 848w, https://substackcdn.com/image/fetch/$s_!C1YE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe792ba-9dd4-40ac-9079-2cc11b8b114e_976x514.png 1272w, https://substackcdn.com/image/fetch/$s_!C1YE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe792ba-9dd4-40ac-9079-2cc11b8b114e_976x514.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 aria-hidden="true" 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><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 style="text-align: center;"><em>A stray whitespace-only line has entered your git diff.</em></p><p>Your &#8220;empty&#8221; lines still carry four spaces of invisible cruft that light up every diff.</p><p>It looks untidy, chaotic, and outright sloppy.</p><p>Now that you can <em>see</em> the whitespace, stop shipping it.</p><p>In <em>Settings &gt; Text Editing &gt; Editing</em>, turn on <em>&#8220;Automatically trim trailing whitespace&#8221;</em> and&#8212;crucially&#8212;its sub-option <em>&#8220;Including whitespace-only lines&#8221;</em>.</p><p>Prefer to script your machine setup? Execute these in your Terminal: <code>defaults write com.apple.dt.Xcode DVTTextEditorTrimTrailingWhitespace -bool true</code> and <code>defaults write com.apple.dt.Xcode DVTTextEditorTrimWhitespaceOnlyLines -bool true</code>. One shell script to solve both.</p><p>One known gap: blank lines inside multiline comments still don&#8217;t get trimmed. </p><p>&#8230;but the next tool catches the rest.</p><h4>4. Install SwiftLint</h4><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jPwG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6db4093a-2321-429e-b397-51eaa10fa950_1100x450.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jPwG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6db4093a-2321-429e-b397-51eaa10fa950_1100x450.png 424w, https://substackcdn.com/image/fetch/$s_!jPwG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6db4093a-2321-429e-b397-51eaa10fa950_1100x450.png 848w, https://substackcdn.com/image/fetch/$s_!jPwG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6db4093a-2321-429e-b397-51eaa10fa950_1100x450.png 1272w, https://substackcdn.com/image/fetch/$s_!jPwG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6db4093a-2321-429e-b397-51eaa10fa950_1100x450.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jPwG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6db4093a-2321-429e-b397-51eaa10fa950_1100x450.png" width="547" height="223.77272727272728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6db4093a-2321-429e-b397-51eaa10fa950_1100x450.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:450,&quot;width&quot;:1100,&quot;resizeWidth&quot;:547,&quot;bytes&quot;:264886,&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://yvinsights.substack.com/i/201161893?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6db4093a-2321-429e-b397-51eaa10fa950_1100x450.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_!jPwG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6db4093a-2321-429e-b397-51eaa10fa950_1100x450.png 424w, https://substackcdn.com/image/fetch/$s_!jPwG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6db4093a-2321-429e-b397-51eaa10fa950_1100x450.png 848w, https://substackcdn.com/image/fetch/$s_!jPwG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6db4093a-2321-429e-b397-51eaa10fa950_1100x450.png 1272w, https://substackcdn.com/image/fetch/$s_!jPwG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6db4093a-2321-429e-b397-51eaa10fa950_1100x450.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p style="text-align: center;"><em>Watch your language!</em></p><p>The one tool on this list I&#8217;ve run on every project since 2019.</p><p><a href="https://github.com/realm/SwiftLint">SwiftLint</a> enforces Swift style and conventions so code review stops being an argument about brace placement and goes back to being about logic.</p><p><code>brew install swiftlint</code>, then add a <em>Run Script</em> build phase after <em>Compile Sources</em>. </p><p>That said, if you are using Homebrew, make sure you set <code>ENABLE_USER_SCRIPT_SANDBOXING</code> to <code>NO</code>, as its default <code>YES</code> value <a href="https://stackoverflow.com/questions/76412148/what-is-the-new-option-enable-user-script-sandboxing-in-xcode-15">will block custom script execution</a> since Xcode 15 (2023); <a href="https://askubuntu.com/questions/720678/what-does-export-path-somethingpath-mean">add</a> <code>/opt/homebrew/bin</code> to your <code>PATH</code> as well. </p><p>Drop a <code>.swiftlint.yml</code> at the repo root to pick your rules, and run <code>swiftlint --fix &amp;&amp; swiftlint</code> if you want auto-correct plus warnings on the rest.</p><p>It&#8217;s scriptable and works great with Codex and Claude&#8212;ask your agent to do the setup for you, then watch the runtime do style policing for both manually- and automatically-generated code. <em>(Hint: couple it with GitHub Actions, Xcode Cloud, or other CI of your choice&#8212;setup takes 2 minutes, zero API keys, and negligible compute time.)</em></p><div class="community-chat" data-attrs="{&quot;url&quot;:&quot;https://open.substack.com/pub/yvinsights/chat?utm_source=chat_embed&quot;,&quot;subdomain&quot;:&quot;yvinsights&quot;,&quot;pub&quot;:{&quot;id&quot;:8671474,&quot;name&quot;:&quot;YV Insights &#129489;&#8205;&#128187;&#128296; by yuryv.info&quot;,&quot;author_name&quot;:&quot;Yury Vashchylau | yuryv.info&quot;,&quot;author_photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!xFhc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15e735ef-67d4-490d-8895-ef7e89302fef_800x800.png&quot;}}" data-component-name="CommunityChatRenderPlaceholder"></div><p>Apple finally <a href="https://www.reddit.com/r/iOSProgramming/comments/1g1z9x4/i_just_saw_that_xcode_16_has_integrated_the_code/">bundled</a> <code>swift-format</code> into Xcode 16 (2024), which is nice&#8212;but SwiftLint had a six-year head start and a far deeper rule set.</p><h4>5. Use Xcode templates aggressively</h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!edok!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa920225b-b406-48cf-b45a-7f74574f76a2_664x570.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!edok!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa920225b-b406-48cf-b45a-7f74574f76a2_664x570.png 424w, https://substackcdn.com/image/fetch/$s_!edok!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa920225b-b406-48cf-b45a-7f74574f76a2_664x570.png 848w, https://substackcdn.com/image/fetch/$s_!edok!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa920225b-b406-48cf-b45a-7f74574f76a2_664x570.png 1272w, https://substackcdn.com/image/fetch/$s_!edok!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa920225b-b406-48cf-b45a-7f74574f76a2_664x570.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!edok!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa920225b-b406-48cf-b45a-7f74574f76a2_664x570.png" width="308" height="264.3975903614458" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a920225b-b406-48cf-b45a-7f74574f76a2_664x570.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:570,&quot;width&quot;:664,&quot;resizeWidth&quot;:308,&quot;bytes&quot;:115304,&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://yvinsights.substack.com/i/201161893?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa920225b-b406-48cf-b45a-7f74574f76a2_664x570.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_!edok!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa920225b-b406-48cf-b45a-7f74574f76a2_664x570.png 424w, https://substackcdn.com/image/fetch/$s_!edok!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa920225b-b406-48cf-b45a-7f74574f76a2_664x570.png 848w, https://substackcdn.com/image/fetch/$s_!edok!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa920225b-b406-48cf-b45a-7f74574f76a2_664x570.png 1272w, https://substackcdn.com/image/fetch/$s_!edok!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa920225b-b406-48cf-b45a-7f74574f76a2_664x570.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 aria-hidden="true" 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><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 style="text-align: center;"><em>&#8220;This is the 200th time I&#8217;m creating an app with my preferred architecture. claude please fix&#8221;</em></p><p>The feature that&#8217;s been in Xcode for over a decade and almost nobody seemed to customize.</p><p>Every team has a &#8220;new screen&#8221; shape: a view, a view model, a TCA stack, a coordinator, a set of tests&#8212;all wired together. Rebuilding that by hand every time is how you introduce typos, half-missing boilerplate, and AI hallucinations.</p><p><a href="https://www.hackingwithswift.com/articles/158/how-to-create-a-custom-xcode-template-for-coordinators">It&#8217;s abstracted away from Xcode&#8217;s UI and has a hidden&#8212;almost undocumented&#8212;scripting language</a>. In fact, the only properly documented articles I found online are reverse engineered over years of trial-and-error&#8212;either from GitHub OSS projects, or published on <a href="https://itcraftapps.com/blog/xcode-templates-tutorial/">software agency blogs</a>. But in this day and age, if you can now harness it by asking Claude or Codex to save yourself hours of unpaid labor, what&#8217;s stopping you?</p><p>Custom file templates live in <code>~/Library/Developer/Xcode/Templates/File Templates/</code> (create it&#8212;it does not exist by default). Each one is a <code>.xctemplate</code> folder with a <code>TemplateInfo.plist</code> and a base file. Name the base file <code>___FILEBASENAME___.swift</code> and Xcode substitutes whatever name the developer types in the New File dialog. </p><p>Once your module template exists, &#8220;new feature&#8221; is a ten-second <em>File &gt; New</em>&#8212;instead of a ten-minute ritual you will inevitably get wrong. <a href="https://www.hanselman.com/blog/yak-shaving-defined-ill-get-that-done-as-soon-as-i-shave-this-yak">Focus that energy on building business logic instead</a>.</p><h4>6. Enable the build performance benchmarks</h4><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!v_9a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3580063e-6b55-4ae3-a08b-00b7664aa443_762x528.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!v_9a!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3580063e-6b55-4ae3-a08b-00b7664aa443_762x528.png 424w, https://substackcdn.com/image/fetch/$s_!v_9a!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3580063e-6b55-4ae3-a08b-00b7664aa443_762x528.png 848w, https://substackcdn.com/image/fetch/$s_!v_9a!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3580063e-6b55-4ae3-a08b-00b7664aa443_762x528.png 1272w, https://substackcdn.com/image/fetch/$s_!v_9a!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3580063e-6b55-4ae3-a08b-00b7664aa443_762x528.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!v_9a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3580063e-6b55-4ae3-a08b-00b7664aa443_762x528.png" width="316" height="218.96062992125985" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3580063e-6b55-4ae3-a08b-00b7664aa443_762x528.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:528,&quot;width&quot;:762,&quot;resizeWidth&quot;:316,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Understanding Xcode build time summary - Stack Overflow&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Understanding Xcode build time summary - Stack Overflow" title="Understanding Xcode build time summary - Stack Overflow" srcset="https://substackcdn.com/image/fetch/$s_!v_9a!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3580063e-6b55-4ae3-a08b-00b7664aa443_762x528.png 424w, https://substackcdn.com/image/fetch/$s_!v_9a!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3580063e-6b55-4ae3-a08b-00b7664aa443_762x528.png 848w, https://substackcdn.com/image/fetch/$s_!v_9a!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3580063e-6b55-4ae3-a08b-00b7664aa443_762x528.png 1272w, https://substackcdn.com/image/fetch/$s_!v_9a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3580063e-6b55-4ae3-a08b-00b7664aa443_762x528.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p style="text-align: center;"><em>Here&#8217;s a retro throwback screenshot for you. iOS programming has changed a lot since &#8220;CompileXIB&#8221; was a common build step, but the point still stands.</em></p><p>You can&#8217;t optimize a build time you never measure. </p><p>Apple&#8217;s answer to slow builds is &#8220;buy another MacBook&#8221;. </p><p>That works&#8230; up to a point where you&#8217;re optimizing CI time, or just trying to build more and live life instead of waiting for <em>&#8220;Build Failed&#8221;</em>.</p><p>When you realize <a href="https://github.blog/engineering/infrastructure/experiment-the-hidden-costs-of-waiting-on-slow-build-times/">how much of a sinkhole some Xcode builds become</a>, you&#8217;ll be shocked. Talk about screen time!</p><p>First, surface the number of seconds it took you to build your Xcode project: <code>defaults write com.apple.dt.Xcode ShowBuildOperationDuration -bool YES</code>, then restart Xcode. The <a href="https://macos-defaults.com/xcode/showbuildoperationduration.html">actual build duration</a> now sits next to &#8220;Build Succeeded&#8221; in the toolbar, so every build tells you what it cost.</p><p>Second, find the <em>&#8220;The compiler is unable to type-check this expression&#8221;</em> culprits. </p><p>In <em>Build Settings &gt; Other Swift Flags</em>, add <code>-Xfrontend -warn-long-function-bodies=100 -Xfrontend -warn-long-expression-type-checking=100</code>. Xcode then <a href="https://www.onswiftwings.com/posts/build-time-optimization-part1/">warns on any function or expression</a> that takes over 100ms to type-check. </p><p>Which is almost always a sign of a SwiftUI body doing far too much, or a cursed line of chained operators, <a href="https://github.com/reactivex/rxswift">RxSwift</a>-style.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-Rfs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1fd016-fe1d-47bb-a469-293981c39c0e_468x112.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-Rfs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1fd016-fe1d-47bb-a469-293981c39c0e_468x112.png 424w, https://substackcdn.com/image/fetch/$s_!-Rfs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1fd016-fe1d-47bb-a469-293981c39c0e_468x112.png 848w, https://substackcdn.com/image/fetch/$s_!-Rfs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1fd016-fe1d-47bb-a469-293981c39c0e_468x112.png 1272w, https://substackcdn.com/image/fetch/$s_!-Rfs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1fd016-fe1d-47bb-a469-293981c39c0e_468x112.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-Rfs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1fd016-fe1d-47bb-a469-293981c39c0e_468x112.png" width="468" height="112" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7c1fd016-fe1d-47bb-a469-293981c39c0e_468x112.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:112,&quot;width&quot;:468,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:48275,&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://yvinsights.substack.com/i/201161893?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1fd016-fe1d-47bb-a469-293981c39c0e_468x112.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_!-Rfs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1fd016-fe1d-47bb-a469-293981c39c0e_468x112.png 424w, https://substackcdn.com/image/fetch/$s_!-Rfs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1fd016-fe1d-47bb-a469-293981c39c0e_468x112.png 848w, https://substackcdn.com/image/fetch/$s_!-Rfs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1fd016-fe1d-47bb-a469-293981c39c0e_468x112.png 1272w, https://substackcdn.com/image/fetch/$s_!-Rfs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1fd016-fe1d-47bb-a469-293981c39c0e_468x112.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p style="text-align: center;"><em>&#8220;how to scare an ios developer&#8221;</em></p><h4>7. Disable the crash reporter modals</h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hs2y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a109ec-0ec6-4673-9b3d-0df93bcace2b_800x610.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hs2y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a109ec-0ec6-4673-9b3d-0df93bcace2b_800x610.jpeg 424w, https://substackcdn.com/image/fetch/$s_!hs2y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a109ec-0ec6-4673-9b3d-0df93bcace2b_800x610.jpeg 848w, https://substackcdn.com/image/fetch/$s_!hs2y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a109ec-0ec6-4673-9b3d-0df93bcace2b_800x610.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!hs2y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a109ec-0ec6-4673-9b3d-0df93bcace2b_800x610.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hs2y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a109ec-0ec6-4673-9b3d-0df93bcace2b_800x610.jpeg" width="492" height="375.15" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/32a109ec-0ec6-4673-9b3d-0df93bcace2b_800x610.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:610,&quot;width&quot;:800,&quot;resizeWidth&quot;:492,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;https://media.licdn.com/dms/image/v2/D4D22AQHOXT1ioIFCaA/feedshare-shrink_800/B4DZ5zRF3dJ8Ac-/0/1780050321102?e=1782345600&amp;v=beta&amp;t=yopMXpRdg40sOsdKrlWkS4ibzbSxDZRjQcJ9wTGGvz0&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="https://media.licdn.com/dms/image/v2/D4D22AQHOXT1ioIFCaA/feedshare-shrink_800/B4DZ5zRF3dJ8Ac-/0/1780050321102?e=1782345600&amp;v=beta&amp;t=yopMXpRdg40sOsdKrlWkS4ibzbSxDZRjQcJ9wTGGvz0" title="https://media.licdn.com/dms/image/v2/D4D22AQHOXT1ioIFCaA/feedshare-shrink_800/B4DZ5zRF3dJ8Ac-/0/1780050321102?e=1782345600&amp;v=beta&amp;t=yopMXpRdg40sOsdKrlWkS4ibzbSxDZRjQcJ9wTGGvz0" srcset="https://substackcdn.com/image/fetch/$s_!hs2y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a109ec-0ec6-4673-9b3d-0df93bcace2b_800x610.jpeg 424w, https://substackcdn.com/image/fetch/$s_!hs2y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a109ec-0ec6-4673-9b3d-0df93bcace2b_800x610.jpeg 848w, https://substackcdn.com/image/fetch/$s_!hs2y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a109ec-0ec6-4673-9b3d-0df93bcace2b_800x610.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!hs2y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a109ec-0ec6-4673-9b3d-0df93bcace2b_800x610.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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 style="text-align: center;"><em>&#8220;Xcode quit unexpectedly&#8221;</em></p><p>Nothing breaks flow like a modal you have to dismiss. </p><p>When you&#8217;re chasing a crash loop, macOS throws its &#8220;application quit unexpectedly&#8221; dialog every single time&#8212;stealing focus, stacking up, demanding a click before you can get back to work.</p><p>We will likely never achieve crash-free Xcode&#8230; or crash-free Apple apps, in general. But you can still cope with &#8220;quit unexpectedly&#8221; modals without having to retire from your work. <em>(Yep, no need to retrain as a plumber.)</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://yvinsights.com/p/10-things-i-do-on-every-new-xcode?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://yvinsights.com/p/10-things-i-do-on-every-new-xcode?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p><code>defaults write com.apple.CrashReporter DialogType none</code> makes it <a href="https://osxdaily.com/2010/02/15/disable-the-crash-reporter-dialog-in-mac-os-x/">stop and write the report to a log instead</a>.</p><p>Put it back with <code>defaults write com.apple.CrashReporter DialogType crashreport</code> when you want the dialog again.</p><p>Or, swap the modal with a nonintrusive Notification Center message instead: <code>defaults write com.apple.CrashReporter UseUNC -bool YES</code></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nm_I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b91a7b-8cc0-4337-bd95-6441ac7434de_800x800.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nm_I!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b91a7b-8cc0-4337-bd95-6441ac7434de_800x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!nm_I!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b91a7b-8cc0-4337-bd95-6441ac7434de_800x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!nm_I!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b91a7b-8cc0-4337-bd95-6441ac7434de_800x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!nm_I!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b91a7b-8cc0-4337-bd95-6441ac7434de_800x800.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nm_I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b91a7b-8cc0-4337-bd95-6441ac7434de_800x800.jpeg" width="266" height="266" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69b91a7b-8cc0-4337-bd95-6441ac7434de_800x800.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:800,&quot;resizeWidth&quot;:266,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;No alternative text description for this image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="No alternative text description for this image" title="No alternative text description for this image" srcset="https://substackcdn.com/image/fetch/$s_!nm_I!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b91a7b-8cc0-4337-bd95-6441ac7434de_800x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!nm_I!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b91a7b-8cc0-4337-bd95-6441ac7434de_800x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!nm_I!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b91a7b-8cc0-4337-bd95-6441ac7434de_800x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!nm_I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b91a7b-8cc0-4337-bd95-6441ac7434de_800x800.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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 style="text-align: center;"><em><a href="https://static.wikia.nocookie.net/dota2_gamepedia/images/b/bf/Vo_antimage_anti_level_03.mp3/revision/latest?cb=20200711080029">&#8220;&#8216;tis a blessing!&#8221;</a></em></p><p>Honest caveat: this is system-wide, not Xcode-only. You&#8217;re silencing the crash dialog for every app and giving up the instant &#8220;Report to Apple&#8221; prompt. For a dedicated dev machine it&#8217;s an easy yes; on a Mac you also use for normal work&#8212;think twice.</p><h4>8. Enable the spell checker</h4><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!J8_6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d711170-98ef-464a-b0b3-e2f67ba75bb1_1194x486.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J8_6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d711170-98ef-464a-b0b3-e2f67ba75bb1_1194x486.png 424w, https://substackcdn.com/image/fetch/$s_!J8_6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d711170-98ef-464a-b0b3-e2f67ba75bb1_1194x486.png 848w, https://substackcdn.com/image/fetch/$s_!J8_6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d711170-98ef-464a-b0b3-e2f67ba75bb1_1194x486.png 1272w, https://substackcdn.com/image/fetch/$s_!J8_6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d711170-98ef-464a-b0b3-e2f67ba75bb1_1194x486.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!J8_6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d711170-98ef-464a-b0b3-e2f67ba75bb1_1194x486.png" width="517" height="210.43718592964825" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4d711170-98ef-464a-b0b3-e2f67ba75bb1_1194x486.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:486,&quot;width&quot;:1194,&quot;resizeWidth&quot;:517,&quot;bytes&quot;:161993,&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://yvinsights.substack.com/i/201161893?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d711170-98ef-464a-b0b3-e2f67ba75bb1_1194x486.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_!J8_6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d711170-98ef-464a-b0b3-e2f67ba75bb1_1194x486.png 424w, https://substackcdn.com/image/fetch/$s_!J8_6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d711170-98ef-464a-b0b3-e2f67ba75bb1_1194x486.png 848w, https://substackcdn.com/image/fetch/$s_!J8_6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d711170-98ef-464a-b0b3-e2f67ba75bb1_1194x486.png 1272w, https://substackcdn.com/image/fetch/$s_!J8_6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d711170-98ef-464a-b0b3-e2f67ba75bb1_1194x486.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p style="text-align: center;"><em>Image credit: <a href="https://www.swiftwithvincent.com/blog/how-to-enable-spell-checking-in-xcode">Vincent Pradeilles</a></em></p><p>The compiler checks your syntax. Nothing checks your spelling. </p><p>Spelling bugs are the worst kind. Because they compile.</p><p>Turn on <em>Edit &gt; Format &gt; Spelling and Grammar &gt; Check Spelling While Typing</em>. macOS then underlines typos in your identifiers, comments, and string literals. That matters more than it sounds: a misspelled dictionary key, a typo&#8217;d analytics event name, or a public method called <code>intialize</code> builds perfectly and ships straight to production&#8212;where someone finds it 18 months later.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://yvinsights.com/?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share YV Insights &#129489;&#8205;&#128187;&#128296; by yuryv.info&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://yvinsights.com/?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share YV Insights &#129489;&#8205;&#128187;&#128296; by yuryv.info</span></a></p><p>It is free, it is built in, and it has been sitting in that menu the entire time.</p><h4>9. Anthropic and OpenAI integrations</h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Q2aR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3324fe2a-e9dc-44cc-bebe-ba4f7726156e_1896x1936.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Q2aR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3324fe2a-e9dc-44cc-bebe-ba4f7726156e_1896x1936.png 424w, https://substackcdn.com/image/fetch/$s_!Q2aR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3324fe2a-e9dc-44cc-bebe-ba4f7726156e_1896x1936.png 848w, https://substackcdn.com/image/fetch/$s_!Q2aR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3324fe2a-e9dc-44cc-bebe-ba4f7726156e_1896x1936.png 1272w, https://substackcdn.com/image/fetch/$s_!Q2aR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3324fe2a-e9dc-44cc-bebe-ba4f7726156e_1896x1936.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Q2aR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3324fe2a-e9dc-44cc-bebe-ba4f7726156e_1896x1936.png" width="413" height="421.7932692307692" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3324fe2a-e9dc-44cc-bebe-ba4f7726156e_1896x1936.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1487,&quot;width&quot;:1456,&quot;resizeWidth&quot;:413,&quot;bytes&quot;:738879,&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://yvinsights.substack.com/i/201161893?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3324fe2a-e9dc-44cc-bebe-ba4f7726156e_1896x1936.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_!Q2aR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3324fe2a-e9dc-44cc-bebe-ba4f7726156e_1896x1936.png 424w, https://substackcdn.com/image/fetch/$s_!Q2aR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3324fe2a-e9dc-44cc-bebe-ba4f7726156e_1896x1936.png 848w, https://substackcdn.com/image/fetch/$s_!Q2aR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3324fe2a-e9dc-44cc-bebe-ba4f7726156e_1896x1936.png 1272w, https://substackcdn.com/image/fetch/$s_!Q2aR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3324fe2a-e9dc-44cc-bebe-ba4f7726156e_1896x1936.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 aria-hidden="true" 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><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 style="text-align: center;"><em>Now you can ask Claude and Codex to &#8220;make no mistakes&#8221; without Cmd-tabbing.</em></p><p>The entry that did not exist two years ago.</p><p>Xcode 26 added Coding Intelligence with pluggable model providers&#8212;so the AI assistant is no longer a glorified autocomplete that&#8217;s somehow <a href="https://medium.com/@tttttkkkkk/copilot-vs-xcode-predictive-completion-should-you-switch-a322e098b9bc">worse than GitHub Copilot in its heyday</a>.</p><p>Open <em>Settings &gt; Intelligence</em>. ChatGPT is built in: click Get in the Codex row to use it with a ChatGPT account. For Claude, either sign in with your Anthropic account or choose <em>Add a Model Provider</em>, enter <a href="https://api.anthropic.com/">https://api.anthropic.com/</a> and an API key from <a href="http://console.anthropic.com">console.anthropic.com</a>. Apple wired in the <a href="https://simonbs.dev/posts/using-claude-with-coding-assistant-in-xcode-26/">full Claude Agent SDK</a>, so Claude runs as an autonomous agent inside the IDE&#8212;not just inline completion. </p><p>See <a href="https://developer.apple.com/documentation/Xcode/setting-up-coding-intelligence">Apple&#8217;s own setup docs</a> for the full Rabbit Hole.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://yvinsights.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://yvinsights.com/subscribe?"><span>Subscribe now</span></a></p><p>For a company that spent years insisting on-device-or-nothing and a set of mid-2020s Apple Intelligence fiascos, shipping a settings panel whose entire job is to pipe your code to OpenAI and Anthropic is quite a welcome pivot.</p><h4>10. Use xcconfigs</h4><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!f4RK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faed219fc-79c4-435f-b4be-145c5f5b5c22_520x118.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!f4RK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faed219fc-79c4-435f-b4be-145c5f5b5c22_520x118.png 424w, https://substackcdn.com/image/fetch/$s_!f4RK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faed219fc-79c4-435f-b4be-145c5f5b5c22_520x118.png 848w, https://substackcdn.com/image/fetch/$s_!f4RK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faed219fc-79c4-435f-b4be-145c5f5b5c22_520x118.png 1272w, https://substackcdn.com/image/fetch/$s_!f4RK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faed219fc-79c4-435f-b4be-145c5f5b5c22_520x118.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!f4RK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faed219fc-79c4-435f-b4be-145c5f5b5c22_520x118.png" width="418" height="94.85384615384615" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aed219fc-79c4-435f-b4be-145c5f5b5c22_520x118.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:118,&quot;width&quot;:520,&quot;resizeWidth&quot;:418,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Working with FxPlug Application Bundles&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Working with FxPlug Application Bundles" title="Working with FxPlug Application Bundles" srcset="https://substackcdn.com/image/fetch/$s_!f4RK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faed219fc-79c4-435f-b4be-145c5f5b5c22_520x118.png 424w, https://substackcdn.com/image/fetch/$s_!f4RK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faed219fc-79c4-435f-b4be-145c5f5b5c22_520x118.png 848w, https://substackcdn.com/image/fetch/$s_!f4RK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faed219fc-79c4-435f-b4be-145c5f5b5c22_520x118.png 1272w, https://substackcdn.com/image/fetch/$s_!f4RK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faed219fc-79c4-435f-b4be-145c5f5b5c22_520x118.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p style="text-align: center;"><em>These little guys.</em></p><p>The <code>.xcodeproj</code> is where merge conflicts go to ruin your afternoon. Build settings live inside the project&#8217;s <code>pbxproj</code> by default&#8212;a format that is <a href="https://en.wikipedia.org/wiki/Property_list">technically XML-ish and practically unreadable, and merge-hostile</a> on top of that.</p><p><code>xcconfig</code><a href="https://nshipster.com/xcconfig/"> files</a> pull those settings out into plain text you can read, diff, and review like real code. One file per environment (Debug, Release, Staging), shared values in a base file&#8212;and your configuration stops being something you have to reverse-engineer deliberately. </p><p>Two rules: never add a <code>.xcconfig</code> to a target or to <em>Copy Bundle Resources</em> (that is, it <em>must not</em> end up in your <code>.ipa</code>), and migrate common settings one-by-one, since you can copy any setting&#8217;s resolved value straight from the Build Settings inspector.</p><p>This is the one that scales. On a solo toy app, you <em>maybe</em> won&#8217;t miss it. On a moderately serious app with three environments and a team of developers larger than one, a set of <code>.xcconfig</code>s becomes the difference between clean, flowing work&#8230; and a 600-line <code>pbxproj</code> merge conflict.</p><h3>Summary</h3><blockquote><p>&#8220;People ask if Siri is finally smart now. And I say: she&#8217;s renting a brain from Google. It&#8217;s gonna be great.&#8221;</p><p><em>&#8212; Craig Federighi (source: i made it up)</em></p></blockquote><p>As I&#8217;m writing this, WWDC26&#8212;and, with it, Xcode 27&#8212;are on the way.</p><p>Which means a fresh batch of new APIs piled on top of the old ones Apple still hasn&#8217;t finished burying. (<a href="https://en.wikipedia.org/wiki/Carbon_(API)">Carbon</a> took until macOS Catalina to fully die. Until you <code>grep</code> your system and find its leftovers still there. Go figure.)</p><p>In this first edition of <a href="http://yvinsights.com">YV Insights</a>, you&#8217;re getting a bite-sized version of how I work at <a href="http://yuryv.info">yuryv.info</a> and my Tech, Mobile, and Biz day-to-day. There&#8217;s a lot more coming, and this newsletter is where it lands first.</p><p>So subscribe now, and you&#8217;ll discover how Apple will actually utilize Apple Intelligence in its Google <a href="https://www.geeky-gadgets.com/apple-wwdc-2026-leaks-ios-27/">Gemini-powered</a> &#8220;comeback&#8221; move, and which parts of your future dev workflow are still <a href="https://en.wikipedia.org/wiki/Project_Builder">Project Builder</a> under the hood.</p><p>You&#8217;ll also get what&#8217;s genuinely new in Xcode 27, what breaks once <a href="https://www.macrumors.com/2025/06/10/apple-to-phase-out-rosetta-2">Rosetta 2 is out of the game</a>, and the, uh, <em>insights</em> your Project Manager is bothering you to dig for.</p><p>And one day, I&#8217;ll give one VIP Rabbit a free taco. So buy fast.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZOxb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcddfa28-2018-4c12-a1f6-a4dcbadc2e84_800x533.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZOxb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcddfa28-2018-4c12-a1f6-a4dcbadc2e84_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZOxb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcddfa28-2018-4c12-a1f6-a4dcbadc2e84_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZOxb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcddfa28-2018-4c12-a1f6-a4dcbadc2e84_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZOxb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcddfa28-2018-4c12-a1f6-a4dcbadc2e84_800x533.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZOxb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcddfa28-2018-4c12-a1f6-a4dcbadc2e84_800x533.jpeg" width="499" height="332.45875" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bcddfa28-2018-4c12-a1f6-a4dcbadc2e84_800x533.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:533,&quot;width&quot;:800,&quot;resizeWidth&quot;:499,&quot;bytes&quot;:97762,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://yvinsights.substack.com/i/201161893?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcddfa28-2018-4c12-a1f6-a4dcbadc2e84_800x533.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZOxb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcddfa28-2018-4c12-a1f6-a4dcbadc2e84_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZOxb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcddfa28-2018-4c12-a1f6-a4dcbadc2e84_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZOxb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcddfa28-2018-4c12-a1f6-a4dcbadc2e84_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZOxb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcddfa28-2018-4c12-a1f6-a4dcbadc2e84_800x533.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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>Welcome to the Rabbit Hole.</p><div><hr></div><h4>Links</h4><h3>Intro</h3><ul><li><p><a href="https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/">Things You Should Never Do (Joel Spolsky)</a></p></li><li><p><a href="https://forums.macrumors.com/threads/why-is-xcode-still-so-rubbish.2478824/">Why is Xcode still rubbish (MacRumors)</a></p></li><li><p><a href="https://rentamac.io/ios-app-development-statistics/">iOS dev statistics, 404 devs (RentAMac)</a></p></li><li><p><a href="https://code.visualstudio.com/download">VS Code</a></p></li><li><p><a href="https://cursor.com/">Cursor</a></p></li><li><p><a href="https://developer.apple.com/documentation/appclip">App Clips (Apple)</a></p></li><li><p><a href="https://www.macrumors.com/2026/05/31/apple-glasses-late-2027-report/">Apple Glasses, late 2027 (MacRumors)</a></p></li><li><p><a href="https://www.meta.com/ai-glasses/ray-ban-meta/">Ray-Ban Meta glasses</a></p></li><li><p><a href="https://medium.com/rocknnull/xcode-8-plugins-alcatraz-the-end-of-an-era-ea6e63617d14">The end of Xcode plugins / Alcatraz</a></p></li></ul><h3>1. Install Xcodes</h3><ul><li><p><a href="https://github.com/XcodesOrg/XcodesApp">Xcodes</a></p></li><li><p><a href="https://formulae.brew.sh/formula/xcodes">Homebrew formula</a></p></li><li><p><a href="https://www.jetbrains.com/toolbox-app/">JetBrains Toolbox</a></p></li><li><p><a href="https://developer.apple.com/download/">Apple Developer Downloads</a></p></li></ul><h3>4. Install SwiftLint</h3><ul><li><p><a href="https://github.com/realm/SwiftLint">SwiftLint</a></p></li><li><p><a href="https://stackoverflow.com/questions/76412148/what-is-the-new-option-enable-user-script-sandboxing-in-xcode-15">ENABLE_USER_SCRIPT_SANDBOXING explained (Stack Overflow)</a></p></li><li><p><a href="https://askubuntu.com/questions/720678/what-does-export-path-somethingpath-mean">What does export PATH mean (Ask Ubuntu)</a></p></li><li><p><a href="https://www.reddit.com/r/iOSProgramming/comments/1g1z9x4/i_just_saw_that_xcode_16_has_integrated_the_code/">swift-format in Xcode 16 (Reddit)</a></p></li></ul><h3>5. Use Xcode templates</h3><ul><li><p><a href="https://itcraftapps.com/blog/xcode-templates-tutorial/">Xcode templates tutorial (itCraft)</a></p></li><li><p><a href="https://www.hackingwithswift.com/articles/158/how-to-create-a-custom-xcode-template-for-coordinators">Custom template for coordinators (Hacking with Swift)</a></p></li><li><p><a href="https://www.hanselman.com/blog/yak-shaving-defined-ill-get-that-done-as-soon-as-i-shave-this-yak">Yak Shaving Defined (Scott Hanselman)</a></p></li></ul><h3>6. Build performance benchmarks</h3><ul><li><p><a href="https://macos-defaults.com/xcode/showbuildoperationduration.html">ShowBuildOperationDuration (macOS defaults)</a></p></li><li><p><a href="https://www.onswiftwings.com/posts/build-time-optimization-part1/">Build time optimization (On Swift Wings)</a></p></li><li><p><a href="https://github.blog/engineering/infrastructure/experiment-the-hidden-costs-of-waiting-on-slow-build-times/">The hidden costs of waiting on slow builds (GitHub)</a></p></li><li><p><a href="https://github.com/reactivex/rxswift">RxSwift</a></p></li></ul><h3>7. Crash reporter modals</h3><ul><li><p><a href="https://osxdaily.com/2010/02/15/disable-the-crash-reporter-dialog-in-mac-os-x/">Disable the crash reporter dialog (OS X Daily)</a></p></li></ul><h3>8. Spell checker</h3><ul><li><p><a href="https://www.swiftwithvincent.com/blog/how-to-enable-spell-checking-in-xcode">Enable spell checking in Xcode (Swift with Vincent)</a></p></li></ul><h3>9. Anthropic and OpenAI integrations</h3><ul><li><p><a href="https://developer.apple.com/documentation/Xcode/setting-up-coding-intelligence">Setting up coding intelligence (Apple)</a></p></li><li><p><a href="https://api.anthropic.com/">Anthropic API</a></p></li><li><p><a href="https://console.anthropic.com/">Anthropic Console (API keys)</a></p></li><li><p><a href="https://simonbs.dev/posts/using-claude-with-coding-assistant-in-xcode-26/">Claude in Xcode 26 (Simon B. Stovring)</a></p></li><li><p><a href="https://medium.com/@tttttkkkkk/copilot-vs-xcode-predictive-completion-should-you-switch-a322e098b9bc">Copilot vs Xcode predictive completion</a></p></li></ul><h3>10. Use xcconfigs</h3><ul><li><p><a href="https://nshipster.com/xcconfig/">Xcode build configuration files (NSHipster)</a></p></li><li><p><a href="https://en.wikipedia.org/wiki/Property_list">Property list / pbxproj format (Wikipedia)</a></p></li></ul><h3>Summary</h3><ul><li><p><a href="https://en.wikipedia.org/wiki/Carbon_(API)">Carbon API (Wikipedia)</a></p></li><li><p><a href="https://en.wikipedia.org/wiki/Project_Builder">Project Builder (Wikipedia)</a></p></li><li><p><a href="https://www.macrumors.com/2025/06/10/apple-to-phase-out-rosetta-2/">Apple to phase out Rosetta 2 (MacRumors)</a></p></li><li><p><a href="https://www.geeky-gadgets.com/apple-wwdc-2026-leaks-ios-27/">WWDC 2026 and Gemini-powered Siri leaks (Geeky Gadgets)</a></p></li></ul><h3>More from YV Insights</h3><ul><li><p><a href="https://yuryv.info/">yuryv.info</a></p></li><li><p><a href="https://yvinsights.com/">yvinsights.com</a></p></li><li><p><a href="https://yvinsights.substack.com/">Subscribe on Substack</a></p></li><li><p><a href="https://www.linkedin.com/newsletters/yv-insider-by-yuryv-info-7444467518737608704/">LinkedIn newsletter</a></p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://yvinsights.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">YV Insights &#129489;&#8205;&#128187;&#128296; by yuryv.info is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[This is YV Podcast]]></title><description><![CDATA[Welcome to the rabbit hole.]]></description><link>https://yvinsights.com/p/this-is-yv-podcast-5b4</link><guid isPermaLink="false">https://yvinsights.com/p/this-is-yv-podcast-5b4</guid><dc:creator><![CDATA[Yury Vashchylau | yuryv.info]]></dc:creator><pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/201268207/ed8b3feef86650f9abfbb050fc2b2dda.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Welcome to the rabbit hole. How apps, games, and money really work.</p>]]></content:encoded></item></channel></rss>