<?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[Code & Conquer: An Indie Developer’s blog]]></title><description><![CDATA[I’m carving out my path as an indie developer for iOS and macOS. Join me as I blend creative vision with technical mastery, exploring innovative ideas, sharing behind-the-scenes insights, and embracing the challenges of turning dreams into reality.]]></description><link>https://www.carlosgarciadev.com</link><image><url>https://substackcdn.com/image/fetch/$s_!soKI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72c19739-2c03-4d40-93d3-668200d24162_1024x1024.png</url><title>Code &amp; Conquer: An Indie Developer’s blog</title><link>https://www.carlosgarciadev.com</link></image><generator>Substack</generator><lastBuildDate>Mon, 18 May 2026 04:35:33 GMT</lastBuildDate><atom:link href="https://www.carlosgarciadev.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Carlos Garcia]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[carlosfelgarcia@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[carlosfelgarcia@substack.com]]></itunes:email><itunes:name><![CDATA[Carlos Garcia]]></itunes:name></itunes:owner><itunes:author><![CDATA[Carlos Garcia]]></itunes:author><googleplay:owner><![CDATA[carlosfelgarcia@substack.com]]></googleplay:owner><googleplay:email><![CDATA[carlosfelgarcia@substack.com]]></googleplay:email><googleplay:author><![CDATA[Carlos Garcia]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Indie Dev Journal #3]]></title><description><![CDATA[User interface improvements]]></description><link>https://www.carlosgarciadev.com/p/indie-dev-journal-3</link><guid isPermaLink="false">https://www.carlosgarciadev.com/p/indie-dev-journal-3</guid><dc:creator><![CDATA[Carlos Garcia]]></dc:creator><pubDate>Sun, 12 Oct 2025 14:43:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!L1-T!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3911ea73-42a4-434e-8e11-4e055a2a6cd2_1344x768.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_!L1-T!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3911ea73-42a4-434e-8e11-4e055a2a6cd2_1344x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!L1-T!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3911ea73-42a4-434e-8e11-4e055a2a6cd2_1344x768.png 424w, https://substackcdn.com/image/fetch/$s_!L1-T!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3911ea73-42a4-434e-8e11-4e055a2a6cd2_1344x768.png 848w, https://substackcdn.com/image/fetch/$s_!L1-T!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3911ea73-42a4-434e-8e11-4e055a2a6cd2_1344x768.png 1272w, https://substackcdn.com/image/fetch/$s_!L1-T!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3911ea73-42a4-434e-8e11-4e055a2a6cd2_1344x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!L1-T!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3911ea73-42a4-434e-8e11-4e055a2a6cd2_1344x768.png" width="1344" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3911ea73-42a4-434e-8e11-4e055a2a6cd2_1344x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1344,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1213707,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.carlosgarciadev.com/i/175953576?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3911ea73-42a4-434e-8e11-4e055a2a6cd2_1344x768.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_!L1-T!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3911ea73-42a4-434e-8e11-4e055a2a6cd2_1344x768.png 424w, https://substackcdn.com/image/fetch/$s_!L1-T!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3911ea73-42a4-434e-8e11-4e055a2a6cd2_1344x768.png 848w, https://substackcdn.com/image/fetch/$s_!L1-T!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3911ea73-42a4-434e-8e11-4e055a2a6cd2_1344x768.png 1272w, https://substackcdn.com/image/fetch/$s_!L1-T!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3911ea73-42a4-434e-8e11-4e055a2a6cd2_1344x768.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This week, I focused on improving the UI for UV-Buddy. I realized that adding an AI insight was fun, but something was missing&#8212;showing just text felt a bit boring. So I decided to add animation, specifically animating the character to make the UI more engaging.</p><p>Animating the character and integrating it into the UI consumed all my time this week. Using AI to create the animation? That was actually the easy part. The real challenge was doing it without breaking the bank.</p><p>After testing several options, Midjourney gave me the best results for animated characters. Other AI tools were either too expensive or completely changed the character&#8217;s face. But then came the next hurdle: creating a transparent background. I tried multiple solutions, but they were all too costly and didn&#8217;t deliver great results.</p><p>That&#8217;s when I discovered ComfyUI&#8212;a node-based AI tool that runs locally. It gave me exactly the control I needed. The final step was optimizing the file size and making it iOS-ready, which meant converting everything to Lottie files.</p><p>It&#8217;s not the easiest workflow by any stretch. Getting there required a lot of patience and trial and error. But I finally cracked the code: I found the right file formats, figured out how to create Lottie files that aren&#8217;t too grainy, and successfully added them to the app.</p><p>Here is the result:</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;e9d4ea71-58dc-4fd8-a5db-2437a2d8169c&quot;,&quot;duration&quot;:null}"></div><p></p>]]></content:encoded></item><item><title><![CDATA[Indie Dev Journal #2]]></title><description><![CDATA[A Week of Forced Rest and Strategic Pivots]]></description><link>https://www.carlosgarciadev.com/p/indie-journal-2</link><guid isPermaLink="false">https://www.carlosgarciadev.com/p/indie-journal-2</guid><dc:creator><![CDATA[Carlos Garcia]]></dc:creator><pubDate>Sun, 28 Sep 2025 15:42:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!QrL6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa00f61f-75c3-4d0b-a2fb-008bf9d9102e_1024x518.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_!QrL6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa00f61f-75c3-4d0b-a2fb-008bf9d9102e_1024x518.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QrL6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa00f61f-75c3-4d0b-a2fb-008bf9d9102e_1024x518.png 424w, https://substackcdn.com/image/fetch/$s_!QrL6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa00f61f-75c3-4d0b-a2fb-008bf9d9102e_1024x518.png 848w, https://substackcdn.com/image/fetch/$s_!QrL6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa00f61f-75c3-4d0b-a2fb-008bf9d9102e_1024x518.png 1272w, https://substackcdn.com/image/fetch/$s_!QrL6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa00f61f-75c3-4d0b-a2fb-008bf9d9102e_1024x518.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QrL6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa00f61f-75c3-4d0b-a2fb-008bf9d9102e_1024x518.png" width="1024" height="518" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fa00f61f-75c3-4d0b-a2fb-008bf9d9102e_1024x518.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:518,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1039180,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.carlosgarciadev.com/i/174761134?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F729d9c1f-d00e-4d1d-bd41-6a604563c098_1024x585.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_!QrL6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa00f61f-75c3-4d0b-a2fb-008bf9d9102e_1024x518.png 424w, https://substackcdn.com/image/fetch/$s_!QrL6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa00f61f-75c3-4d0b-a2fb-008bf9d9102e_1024x518.png 848w, https://substackcdn.com/image/fetch/$s_!QrL6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa00f61f-75c3-4d0b-a2fb-008bf9d9102e_1024x518.png 1272w, https://substackcdn.com/image/fetch/$s_!QrL6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa00f61f-75c3-4d0b-a2fb-008bf9d9102e_1024x518.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This week threw me a curveball&#8212;I got sick and had to pump the brakes on everything. You know that frustrating feeling when your mind is ready to work but your body just says &#8220;nope&#8221;? That was me for most of the week. I&#8217;d sit down to tackle my projects, only to realize I could barely focus on my screen.</p><p>There&#8217;s something humbling about being forced to rest. Part of me wanted to push through (classic overthinking), but my body had other plans. And honestly? It was probably right. Sometimes we need that forced downtime, especially when we&#8217;re under the weather.</p><p>On the days I did feel human again, I made some solid progress on my side projects&#8217; UI. I&#8217;ve fully decided to embrace the glass effect design&#8212;and here&#8217;s the kicker: I&#8217;m dropping iOS 18 support entirely. The decision was actually pretty straightforward since all my users have already upgraded to iOS 26. Why hold back for an outdated version when I can lean into the latest features?</p><p>This shift also opened up another exciting possibility: integrating Apple Intelligence to provide personalized insights based on user profiles. It&#8217;s one of those decisions that feels both bold and obvious at the same time.</p><p>Looking back, this &#8220;slow&#8221; week actually packed in some pretty significant strategic moves. Sometimes the best progress happens when you&#8217;re not forcing it&#8212;when you give yourself permission to rest and let the bigger picture come into focus.</p>]]></content:encoded></item><item><title><![CDATA[Indie Dev Journal #1]]></title><description><![CDATA[Starting Over (Again): My Indie Dev Journey Continues]]></description><link>https://www.carlosgarciadev.com/p/indie-dev-journal-1</link><guid isPermaLink="false">https://www.carlosgarciadev.com/p/indie-dev-journal-1</guid><dc:creator><![CDATA[Carlos Garcia]]></dc:creator><pubDate>Sun, 21 Sep 2025 14:56:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!kY_a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13d8896-41f3-4563-8ff8-d822476606d5_961x539.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_!kY_a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13d8896-41f3-4563-8ff8-d822476606d5_961x539.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kY_a!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13d8896-41f3-4563-8ff8-d822476606d5_961x539.png 424w, https://substackcdn.com/image/fetch/$s_!kY_a!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13d8896-41f3-4563-8ff8-d822476606d5_961x539.png 848w, https://substackcdn.com/image/fetch/$s_!kY_a!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13d8896-41f3-4563-8ff8-d822476606d5_961x539.png 1272w, https://substackcdn.com/image/fetch/$s_!kY_a!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13d8896-41f3-4563-8ff8-d822476606d5_961x539.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kY_a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13d8896-41f3-4563-8ff8-d822476606d5_961x539.png" width="728" height="408.3163371488033" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d13d8896-41f3-4563-8ff8-d822476606d5_961x539.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:539,&quot;width&quot;:961,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:938081,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.carlosgarciadev.com/i/174165424?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95a7a157-1f18-4f0f-9e59-3185bdc48b8a_1024x585.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_!kY_a!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13d8896-41f3-4563-8ff8-d822476606d5_961x539.png 424w, https://substackcdn.com/image/fetch/$s_!kY_a!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13d8896-41f3-4563-8ff8-d822476606d5_961x539.png 848w, https://substackcdn.com/image/fetch/$s_!kY_a!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13d8896-41f3-4563-8ff8-d822476606d5_961x539.png 1272w, https://substackcdn.com/image/fetch/$s_!kY_a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13d8896-41f3-4563-8ff8-d822476606d5_961x539.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I'm hitting the restart button once more on documenting my journey as an indie developer. Though technically, I suppose I already earned that title&#8212;I've got two apps live in the Apple Store: UV-Buddy and Money Map. But the path forward still feels uncertain, still feels like I'm figuring it out as I go.</p><p>This time, I'm writing differently. Instead of crafting posts hoping to capture everyone's attention, I'm writing for future me. I want to look back months or years from now and remember these exact moments&#8212;the small victories, the frustrating setbacks, the daily grind of building something from nothing. These posts will be my breadcrumbs through the journey, reminders that growth only comes through the messy combination of successes and failures.</p><p></p><h3><strong>This Week's Progress: Wrestling with Screen Sizes</strong></h3><p>I finally tackled something that's been nagging at me for weeks: making my app work across all Apple screen sizes without completely breaking the layout. It's one of those unglamorous tasks that users will never notice when it's done right, but would definitely notice if it's wrong.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WVwr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec2aafa2-78c8-40f5-a774-e2eccc7cb9a7_2064x2752.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WVwr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec2aafa2-78c8-40f5-a774-e2eccc7cb9a7_2064x2752.png 424w, https://substackcdn.com/image/fetch/$s_!WVwr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec2aafa2-78c8-40f5-a774-e2eccc7cb9a7_2064x2752.png 848w, https://substackcdn.com/image/fetch/$s_!WVwr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec2aafa2-78c8-40f5-a774-e2eccc7cb9a7_2064x2752.png 1272w, https://substackcdn.com/image/fetch/$s_!WVwr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec2aafa2-78c8-40f5-a774-e2eccc7cb9a7_2064x2752.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WVwr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec2aafa2-78c8-40f5-a774-e2eccc7cb9a7_2064x2752.png" width="362" height="482.5837912087912" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ec2aafa2-78c8-40f5-a774-e2eccc7cb9a7_2064x2752.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1941,&quot;width&quot;:1456,&quot;resizeWidth&quot;:362,&quot;bytes&quot;:7115562,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.carlosgarciadev.com/i/174165424?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec2aafa2-78c8-40f5-a774-e2eccc7cb9a7_2064x2752.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_!WVwr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec2aafa2-78c8-40f5-a774-e2eccc7cb9a7_2064x2752.png 424w, https://substackcdn.com/image/fetch/$s_!WVwr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec2aafa2-78c8-40f5-a774-e2eccc7cb9a7_2064x2752.png 848w, https://substackcdn.com/image/fetch/$s_!WVwr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec2aafa2-78c8-40f5-a774-e2eccc7cb9a7_2064x2752.png 1272w, https://substackcdn.com/image/fetch/$s_!WVwr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec2aafa2-78c8-40f5-a774-e2eccc7cb9a7_2064x2752.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The results look solid on most devices, but when I pulled it up on the biggest display... well, let's just say there's a problem. There's this awkward dead space at the bottom that makes the whole interface feel cramped toward the top. It's like all the content is huddling together for warmth while leaving half the room empty.</p><p>After staring at it longer than I'd like to admit, I think I've got a solution: flip the counters to stack vertically and redesign the timer layout to run horizontally. It should fill that space more naturally and give the whole thing better balance.</p><p>That's my mission for the coming week&#8212;assuming life cooperates and gives me the time to implement these changes. Fingers crossed I'll have something worth showing in next week's post.</p>]]></content:encoded></item><item><title><![CDATA[The Side Project Struggle: How to Build Your Dreams Without Burning Out]]></title><description><![CDATA[Indie developer journey]]></description><link>https://www.carlosgarciadev.com/p/the-side-project-struggle-how-to</link><guid isPermaLink="false">https://www.carlosgarciadev.com/p/the-side-project-struggle-how-to</guid><dc:creator><![CDATA[Carlos Garcia]]></dc:creator><pubDate>Sun, 22 Jun 2025 21:40:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!BBu7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8a5e08-e46f-445f-a0ca-78281e71e3ba_1536x1024.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_!BBu7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8a5e08-e46f-445f-a0ca-78281e71e3ba_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BBu7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8a5e08-e46f-445f-a0ca-78281e71e3ba_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!BBu7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8a5e08-e46f-445f-a0ca-78281e71e3ba_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!BBu7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8a5e08-e46f-445f-a0ca-78281e71e3ba_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!BBu7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8a5e08-e46f-445f-a0ca-78281e71e3ba_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BBu7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8a5e08-e46f-445f-a0ca-78281e71e3ba_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3c8a5e08-e46f-445f-a0ca-78281e71e3ba_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2680683,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.carlosgarciadev.com/i/166525521?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8a5e08-e46f-445f-a0ca-78281e71e3ba_1536x1024.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_!BBu7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8a5e08-e46f-445f-a0ca-78281e71e3ba_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!BBu7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8a5e08-e46f-445f-a0ca-78281e71e3ba_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!BBu7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8a5e08-e46f-445f-a0ca-78281e71e3ba_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!BBu7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8a5e08-e46f-445f-a0ca-78281e71e3ba_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Every ambitious person faces this familiar crossroads: you're sitting at your desk after a long workday, and that exciting side project is calling your name. Maybe it's the app you've been sketching out, the blog you want to launch, or the small business idea that keeps you awake at night. The question that haunts us all eventually surfaces: "How do I balance my day job with building something meaningful on the side?"</p><p>The answer isn't as straightforward as we'd like it to be. While the theory seems simple enough&#8212;work during the day, build your passion project in the evenings and weekends&#8212;the reality is far more complex.</p><h2>Two Types of Side Project Builders</h2><p>Understanding your motivation is the first step toward success. Side project builders generally fall into two distinct camps, each with different challenges and approaches.</p><p><strong>The Hobbyists</strong> pursue side projects purely for joy and personal fulfillment. They might cook elaborate meals, learn to dance, or play music in their garage band. These builders aren't racing against any clock or chasing external validation. There's no pressure to monetize their next recipe or perform on the biggest stage in town. They simply love what they do and have no plans to replace their day job with their passion.</p><p><strong>The Transitioners</strong> view their side projects as stepping stones toward a complete career pivot. Every project represents a potential breakthrough&#8212;a chance to finally make the leap from employee to full-time entrepreneur. For developers like myself, each app becomes a possible gateway to the independent lifestyle we crave. The stakes feel higher because these projects aren't just hobbies; they're investments in our future selves.</p><p>Understanding which camp you belong to helps set realistic expectations and prevents unnecessary frustration.</p><h2>The Time Crunch Reality</h2><p>Here's the harsh truth that every side project builder must confront: time is your most precious and limited resource. Side projects exist "on the side" for a reason&#8212;they must compete with work deadlines, family obligations, social commitments, and basic human needs like sleep and rest.</p><p>This constraint creates a dangerous trap. When passion meets limited time, we often respond by trying to do everything at once. We stay up too late, skip social events, and push ourselves beyond our sustainable limits. The initial excitement that fuelled our project gradually transformed into exhaustion and frustration. Eventually, we abandon the project entirely, telling ourselves we'll "get back to it someday"&#8212;a someday that rarely comes.</p><p>I've walked away from numerous side projects over the years. Some were simply too ambitious for a solo developer to tackle. Others lost their appeal once the initial novelty wore off. Each abandoned project taught me valuable lessons about what works and what doesn't when juggling multiple priorities.</p><h2>The Birth of Something Personal</h2><p>The breakthrough came when I realized that successful side projects must solve a problem you personally experience. My budgeting app emerged from genuine necessity&#8212;when Mint shut down, I needed a replacement and saw an opportunity to learn mobile development simultaneously. This dual motivation (personal need plus skill development) created the perfect storm for sustained engagement.</p><p>The project succeeded because it mattered to me on multiple levels. I wasn't building an app for some hypothetical user; I was building it for myself, which meant I intimately understood the problem and could validate solutions immediately.</p><h2>Four Principles That Changed Everything</h2><p>Through years of trial and error, I've discovered four principles that make side projects more manageable and sustainable alongside full-time work responsibilities.</p><p><strong>Make It Matter to You Personally</strong></p><p>This principle stands above all others in importance. Looking back at every abandoned project, the common thread was always the same: they weren't deeply meaningful to me. When a project lacks personal significance, it becomes easy to rationalize skipping work sessions. "I'll work on it tomorrow" becomes a weekly refrain, then a monthly one, until the project fades into memory.</p><p>Your side project should address a problem you face, utilize skills you want to develop, or explore interests that genuinely excite you. Without this personal connection, you're building on shaky ground.</p><p><strong>Prioritize Enjoyment Throughout the Process</strong></p><p>Fun acts as the fuel that powers long-term commitment. When working on your side project feels like playing your favorite game&#8212;where you set the rules and determine the pace&#8212;you'll find yourself naturally gravitating toward it during free moments.</p><p>This doesn't mean every aspect will be pure joy. Challenging debugging sessions, tedious configuration tasks, and frustrating setbacks are inevitable. However, these difficult moments should be exceptions rather than the norm. If you consistently dread working on your project, it's time to reassess whether it's the right fit.</p><p><strong>Establish Clear, Achievable Goals</strong></p><p>Goal-setting provides structure and momentum that carries you through challenging periods. I've found that weekly goals strike the perfect balance&#8212;long enough to accomplish meaningful work, short enough to maintain focus and motivation.</p><p>The key is treating these goals as your minimum viable progress. When you meet your weekly target, anything additional becomes a bonus rather than an expectation. This approach creates positive reinforcement cycles where completing goals fuels your desire to continue, rather than creating pressure that leads to burnout.</p><p><strong>Navigate AI Assistance Thoughtfully</strong></p><p>This principle is still evolving as I experiment with different approaches. As a developer, I've discovered that AI can be both a powerful accelerator and a creativity killer, depending on how you use it.</p><p>Some days, when energy is low or time is extremely limited, letting AI handle routine coding tasks while I focus on review and architecture makes perfect sense. Other days, when I'm feeling creative and want to solve problems hands-on, I prefer coding without assistance to maintain that satisfying flow state.</p><p>The key is remaining intentional about when and how you delegate to AI, ensuring it enhances rather than replaces the aspects of your project that bring you joy.</p><h2>The Next Chapter</h2><p>After successfully launching my budgeting app and achieving the goals I set for it, the familiar itch for a new project returned. This time, I'm building UV-Buddy, an app designed to track sun exposure and remind families when it's time to apply sunscreen. The concept combines personal utility (protecting my family from sun damage) with engaging features that encourage kids to participate in their own sun safety.</p><p>The app exemplifies all four principles I've outlined: it solves a real problem my family faces, it's enjoyable to build, I have clear weekly development goals, and I'm thoughtfully incorporating AI assistance where it adds value without diminishing the creative process.</p><p>UV-Buddy is nearly ready for its public debut. Within the next week, I'll be opening TestFlight beta testing for anyone interested in providing feedback. If you'd like to help shape the final product and contribute to my journey toward full-time independent development, I'd be grateful for your participation.</p><h2>Your Turn</h2><p>Balancing work with side projects isn't about finding more hours in the day&#8212;it's about making the hours you have count toward something meaningful. Whether you're building your next career or simply exploring a passion, remember that sustainable progress beats unsustainable sprints every time.</p><p>The path from side project to main project isn't always linear, but with the right approach, it's absolutely achievable. Start with something that matters to you, have fun building it, set realistic goals, and be intentional about the tools you use along the way.</p><p>Your side project journey is waiting. What will you build?</p>]]></content:encoded></item><item><title><![CDATA[I am back]]></title><description><![CDATA[The ride has just started]]></description><link>https://www.carlosgarciadev.com/p/i-am-back</link><guid isPermaLink="false">https://www.carlosgarciadev.com/p/i-am-back</guid><dc:creator><![CDATA[Carlos Garcia]]></dc:creator><pubDate>Mon, 19 May 2025 15:57:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!TXh8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552537e0-78e0-4ee5-ac3b-a8cd62b8475b_1536x1024.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_!TXh8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552537e0-78e0-4ee5-ac3b-a8cd62b8475b_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TXh8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552537e0-78e0-4ee5-ac3b-a8cd62b8475b_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!TXh8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552537e0-78e0-4ee5-ac3b-a8cd62b8475b_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!TXh8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552537e0-78e0-4ee5-ac3b-a8cd62b8475b_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!TXh8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552537e0-78e0-4ee5-ac3b-a8cd62b8475b_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TXh8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552537e0-78e0-4ee5-ac3b-a8cd62b8475b_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/552537e0-78e0-4ee5-ac3b-a8cd62b8475b_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2867742,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.carlosgarciadev.com/i/163924065?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552537e0-78e0-4ee5-ac3b-a8cd62b8475b_1536x1024.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_!TXh8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552537e0-78e0-4ee5-ac3b-a8cd62b8475b_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!TXh8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552537e0-78e0-4ee5-ac3b-a8cd62b8475b_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!TXh8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552537e0-78e0-4ee5-ac3b-a8cd62b8475b_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!TXh8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552537e0-78e0-4ee5-ac3b-a8cd62b8475b_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It&#8217;s been a while since I sat down to write about the journey I started a few months ago. I kept telling myself, <em>&#8220;This weekend, I&#8217;ll continue writing.&#8221;</em> But then I&#8217;d look at the list of tickets waiting for me and decide, <em>&#8220;No, I need to get to the code. I have to finish the app.&#8221;</em></p><p>It often felt like a race&#8212;like getting to the finish line first would magically bring in all the users I wanted. And while speed can help, especially in a competitive space, it&#8217;s not a guarantee. When you&#8217;re working on a side project, that kind of pressure can burn you out quickly.</p><h3>An update about Money Map</h3><p>The app has been running on macOS and iOS for over a month now, and I&#8217;m genuinely thrilled to have reached that milestone. The goals for <em>Money Map</em> were simple:</p><ol><li><p>Help me manage my own finances.</p></li><li><p>Learn everything I needed to build and launch an app on the App Store.</p></li></ol><p>Mission accomplished.</p><p>That said, it&#8217;s not doing particularly well in the store. Most users are looking for finance apps that connect directly to their bank accounts&#8212;something I&#8217;ve deliberately chosen not to do. I won&#8217;t say <em>never</em>, but it&#8217;s definitely not on the roadmap any time soon.</p><p>When I launched the iOS version, I realized just how crowded the space is. Many of the top apps offer bank connectivity, which I still don&#8217;t fully understand how they manage. From my research, it costs around $12k a year plus a per-user fee to use a third-party integration service. That&#8217;s not a path I&#8217;m willing to take&#8212;especially if it means competing on price alone.</p><p>I&#8217;d rather compete on quality. But even more important, I want to stay focused on the app&#8217;s original purpose. If those goals are being met, I can consider it a success&#8212;even if it doesn&#8217;t bring in millions. <em>Money Map</em> is a tool I built for myself, and one I&#8217;m happy to share.</p><p>I&#8217;ll keep updating it, though not as frequently&#8212;because there&#8217;s something new I&#8217;m working on that&#8217;s demanding most of my time and energy.</p><p>Despite not earning a cent, <em>Money Map</em> is still very much alive. I use it daily, I have a list of features I want to add, and above all, I&#8217;m still enjoying the process.</p><h3>Introducing UV-Buddy</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QYIr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F352a8187-6a2c-40cc-a1d6-ee59d8b65a94_1024x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QYIr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F352a8187-6a2c-40cc-a1d6-ee59d8b65a94_1024x1536.png 424w, https://substackcdn.com/image/fetch/$s_!QYIr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F352a8187-6a2c-40cc-a1d6-ee59d8b65a94_1024x1536.png 848w, https://substackcdn.com/image/fetch/$s_!QYIr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F352a8187-6a2c-40cc-a1d6-ee59d8b65a94_1024x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!QYIr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F352a8187-6a2c-40cc-a1d6-ee59d8b65a94_1024x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QYIr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F352a8187-6a2c-40cc-a1d6-ee59d8b65a94_1024x1536.png" width="289" height="433.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/352a8187-6a2c-40cc-a1d6-ee59d8b65a94_1024x1536.png&quot;,&quot;srcNoWatermark&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0cfa27c2-6998-4f7f-a83e-034ad1d49ce5_1024x1536.png&quot;,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1536,&quot;width&quot;:1024,&quot;resizeWidth&quot;:289,&quot;bytes&quot;:3237156,&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://www.carlosgarciadev.com/i/163924065?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cfa27c2-6998-4f7f-a83e-034ad1d49ce5_1024x1536.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_!QYIr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F352a8187-6a2c-40cc-a1d6-ee59d8b65a94_1024x1536.png 424w, https://substackcdn.com/image/fetch/$s_!QYIr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F352a8187-6a2c-40cc-a1d6-ee59d8b65a94_1024x1536.png 848w, https://substackcdn.com/image/fetch/$s_!QYIr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F352a8187-6a2c-40cc-a1d6-ee59d8b65a94_1024x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!QYIr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F352a8187-6a2c-40cc-a1d6-ee59d8b65a94_1024x1536.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I&#8217;m really excited to share a sneak peek at my next project: <em>UV-Buddy</em>.</p><p>This new app is still in development, but the idea is simple&#8212;remind users to apply sunscreen, with help from a friendly little cartoon buddy. More details to come in future posts!</p><p>As with <em>Money Map</em>, this app started from a personal need. I have to take special care of my skin, and I figured&#8212;why not create something that helps me do that <em>and</em> makes it fun? I also wanted something the whole family could use.</p><p>The goals for this app are:</p><ul><li><p>Deepen my understanding of Apple frameworks</p></li><li><p>Launch a proper marketing campaign</p></li><li><p>Generate at least $100 MRR</p></li></ul><h3>Some reflections</h3><p>Here are a few takeaways from the past few months:</p><ul><li><p><strong>Set goals.</strong> Seriously. Without clear goals, it&#8217;s too easy to get lost in endless tweaks and never feel done.</p></li><li><p><strong>Build what you&#8217;ll use.</strong> At least for now&#8212;while indie dev is still my side project&#8212;this rule keeps me grounded. If nothing else, I&#8217;ll always have one satisfied user: me.</p></li><li><p><strong>It&#8217;s a marathon.</strong> It doesn&#8217;t matter how long it takes. What matters is learning something new every day and making sure the journey is fun&#8212;even when it&#8217;s tough to balance time and avoid burnout.</p></li></ul><p>Thanks for reading.</p>]]></content:encoded></item><item><title><![CDATA[Transitioning to Swift 6]]></title><description><![CDATA[My mistakes and how I end up implementing it]]></description><link>https://www.carlosgarciadev.com/p/transitioning-to-swift-6</link><guid isPermaLink="false">https://www.carlosgarciadev.com/p/transitioning-to-swift-6</guid><dc:creator><![CDATA[Carlos Garcia]]></dc:creator><pubDate>Tue, 18 Feb 2025 03:25:10 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/6228506e-1edf-4c0c-aea8-96890ce029f1_1792x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Why just flipping to swift 6 is not enough</h2><p>Let me take you back to the moment I decided to switch my Xcode compiler to Swift 6. I thought this simple flip of a switch would reveal all the necessary errors I needed to fix&#8212;boom, done, app updated. Sure enough, I got just two errors, so I patted myself on the back: &#8220;Looks like moving to Swift 6 isn&#8217;t nearly as difficult as people said!&#8221; Well, that blissful optimism didn&#8217;t last long.</p><h2>How I knew I was not fully using Swift 6</h2><p>I had been working on the iOS version of my app, and as soon as I tested synchronization between iOS and macOS, I noticed something was off: certain transaction data was missing. My categories weren&#8217;t showing up. It felt like a data race, where one process swoops in and grabs data while another is still fetching it. But wait&#8212;Swift 6 is supposed to prevent data races, right?</p><p>I was convinced something deeper was wrong. In a desperate attempt, I forced my data-fetching method in my singleton class to run on the <code>MainActor</code>. I figured, &#8220;Hey, if it&#8217;s on the main thread, what could go wrong?&#8221; Turns out&#8230;plenty.</p><h2>Behind the scenes</h2><p>Simply flipping your compiler to Swift 6 isn&#8217;t enough. Swift 6 will spin up threads automatically for non-UI code if you don&#8217;t explicitly confine that code within an actor. Plus, when you move everything to the <code>MainActor</code>, the compiler&#8217;s concurrency checks basically shrug, because all the code is now lumped into one actor.</p><p>So here I was, staring at no errors yet facing data races. It&#8217;s like the compiler was saying, &#8220;Everything&#8217;s fine!&#8221; while the app was clearly shouting, &#8220;No, it&#8217;s really not!&#8221; After reading blog posts galore, I realized I should switch from singletons with classes to singletons with actors in Swift 6. That&#8217;s when I decided to go all-in.</p><blockquote><p><strong>Pro Tip:</strong> Turn on "Strict Concurrency Checking." I discovered this late in the game, but it&#8217;s a lifesaver for catching data races.</p></blockquote><h2>Moving to actors</h2><p>The moment I changed my class to an actor, I was bombarded with more than 99 errors! But ironically, that massive error list reassured me&#8212;I was finally making a genuine transition to Swift 6. Of course, this meant updating database calls to <code>await</code> and marking methods as <code>async</code>, not to mention switching UI calls to tasks. Time-consuming? Absolutely. But doable.</p><p>Everything was smooth sailing until I hit: "Class Transaction is not sendable." Considering <code>Transaction</code> is a core model, this was a big deal. So, I turned to AI.</p><h2>Why AI is very far from been AGI or replace Software Developers</h2><p>I asked AI what <code>Sendable</code> meant and how to handle it. It explained the concept clearly and suggested using <code>@unchecked Sendable</code> on my model, claiming that since it was only accessed by the data actor, it should be safe. Every AI model I tried said the same thing. Skeptical, I gave in and tried it.</p><p>The compiler was happy. The error vanished. I thought, &#8220;Hooray, I&#8217;m officially on Swift 6!&#8221; But in reality, I had just buried my errors. SwiftData models aren&#8217;t meant to be <code>Sendable</code>, and that <code>@unchecked</code> annotation basically told the compiler to look the other way. Great, now I had even more unaddressed problems under the hood.</p><blockquote><p><strong>Lesson Learned:</strong> AI can provide quick answers, but it lacks real-world context. It&#8217;s like an ocean of knowledge that&#8217;s only a centimeter deep. Beware!</p></blockquote><h2>Using Persisten Model ID</h2><p>Since my model wasn&#8217;t <code>Sendable</code>, I tried passing around its <strong>Persistent Model ID</strong>, which is <code>Sendable</code>. The plan was to fetch the actual object using that ID in the model context.</p><p>For me, this didn&#8217;t go smoothly. I had to enable a special property&#8212;<code>includePendingChanges</code>&#8212;in my fetch descriptor to get it to compile without errors. Even after checking various forums, I couldn&#8217;t find crystal-clear explanations for why this was necessary.</p><p>I used this blog to guide on how to use the ID to fetch and get the object back <a href="https://fatbobman.com/en/posts/concurret-programming-in-swiftdata/">concurret-programming-in-swiftdata</a></p><h2>The final solution</h2><p>Ultimately, I resorted to <strong>DTOs (Data Transfer Objects)</strong>. Whenever I fetch data, I now create a DTO and pass that around. My model remains tucked away behind the data actor.</p><p>Of course, if your model has multiple relationships&#8212;like <code>Transaction</code> -&gt; <code>Categories</code> -&gt; <code>Subcategories</code> -&gt; <code>Transactions</code>&#8212;you might need multiple DTOs or find a strategy to avoid descending too far. It&#8217;s not the easiest fix, but it works and keeps your data race-free.</p><p>Here is the blog that I found that explains better how to implement the DTO and how it has been used with SwiftData <a href="https://medium.com/@samhastingsis/use-swiftdata-like-a-boss-92c05cba73bf">Use Swiftdata Like A Boss</a></p><h2>Conclusion</h2><p>Migrating to Swift 6 was a bit of a roller coaster, but now that I&#8217;m on the other side, I see the benefits. My code is cleaner, the app is faster, and those synchronization issues that once haunted me are finally gone.</p><p>I still have a lot to learn about Swift 6 and concurrency, but I&#8217;m already experiencing the payoffs, and I hope my journey can spare you some of the same headaches.</p><p><strong>P.S.</strong> Stay tuned! I&#8217;ll be sharing updates on my app soon. In the meantime, feast your eyes on this new logo&#8230;</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BPs6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F818ccb0e-545b-4cd5-a9bf-397795f5e3ee_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BPs6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F818ccb0e-545b-4cd5-a9bf-397795f5e3ee_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!BPs6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F818ccb0e-545b-4cd5-a9bf-397795f5e3ee_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!BPs6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F818ccb0e-545b-4cd5-a9bf-397795f5e3ee_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!BPs6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F818ccb0e-545b-4cd5-a9bf-397795f5e3ee_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BPs6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F818ccb0e-545b-4cd5-a9bf-397795f5e3ee_1024x1024.png" width="206" height="206" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/818ccb0e-545b-4cd5-a9bf-397795f5e3ee_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:206,&quot;bytes&quot;:535516,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!BPs6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F818ccb0e-545b-4cd5-a9bf-397795f5e3ee_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!BPs6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F818ccb0e-545b-4cd5-a9bf-397795f5e3ee_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!BPs6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F818ccb0e-545b-4cd5-a9bf-397795f5e3ee_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!BPs6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F818ccb0e-545b-4cd5-a9bf-397795f5e3ee_1024x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p></p>]]></content:encoded></item><item><title><![CDATA[Choosing the Right Tech Stack]]></title><description><![CDATA[Indie Journal Entry # 4]]></description><link>https://www.carlosgarciadev.com/p/choosing-the-right-tech-stack</link><guid isPermaLink="false">https://www.carlosgarciadev.com/p/choosing-the-right-tech-stack</guid><dc:creator><![CDATA[Carlos Garcia]]></dc:creator><pubDate>Sun, 02 Feb 2025 23:27:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!t5_V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ef22ee3-c8d0-4afb-b638-ea9b3a4be62e_1792x1024.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_!t5_V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ef22ee3-c8d0-4afb-b638-ea9b3a4be62e_1792x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!t5_V!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ef22ee3-c8d0-4afb-b638-ea9b3a4be62e_1792x1024.png 424w, https://substackcdn.com/image/fetch/$s_!t5_V!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ef22ee3-c8d0-4afb-b638-ea9b3a4be62e_1792x1024.png 848w, https://substackcdn.com/image/fetch/$s_!t5_V!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ef22ee3-c8d0-4afb-b638-ea9b3a4be62e_1792x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!t5_V!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ef22ee3-c8d0-4afb-b638-ea9b3a4be62e_1792x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!t5_V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ef22ee3-c8d0-4afb-b638-ea9b3a4be62e_1792x1024.png" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9ef22ee3-c8d0-4afb-b638-ea9b3a4be62e_1792x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:566750,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!t5_V!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ef22ee3-c8d0-4afb-b638-ea9b3a4be62e_1792x1024.png 424w, https://substackcdn.com/image/fetch/$s_!t5_V!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ef22ee3-c8d0-4afb-b638-ea9b3a4be62e_1792x1024.png 848w, https://substackcdn.com/image/fetch/$s_!t5_V!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ef22ee3-c8d0-4afb-b638-ea9b3a4be62e_1792x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!t5_V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ef22ee3-c8d0-4afb-b638-ea9b3a4be62e_1792x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>While I&#8217;m no expert in indie development, I know that picking the right tech stack is a game-changer&#8212;it lays the foundation for everything that follows. For me, the journey started with a simple yet powerful question: What do I want to learn so that even if I fail, I still come out ahead with new skills?</p><p>I had already dipped my toes into web development and used Python daily in my job. With that experience in mind, I figured building an app would be the best way to push myself further. After diving into research, I identified three main technologies for app development: Flutter, Swift, and Objective-C. While there may be others, these three seemed to dominate the landscape.</p><p>I had heard that developing for Android comes with the challenge of accommodating countless screen sizes, processors, and brands. Flutter promised a way to tackle that complexity while also supporting iOS. But while its versatility was appealing, I was eager to learn a new language from scratch. Flutter felt too similar to web development, and one major downside was that it&#8217;s always playing catch-up with the latest Swift updates. As for Objective-C, it seemed to be on its way out, so investing time in it didn&#8217;t make much sense.</p><p>That left Swift. I chose it because it&#8217;s a modern language with Apple&#8217;s powerhouse backing, ensuring its longevity. Plus, iOS has a much smaller range of screen sizes to account for, making development smoother. Best of all, with Swift, I can immediately adopt Apple&#8217;s latest innovations. The only real drawback? I need a Mac to work with it&#8212;an investment I hope will pay off in the long run.</p><p>One surprising aspect of my journey has been the role of AI in learning and development. Since Swift is relatively new compared to Python, AI models have less training data on it. While some might see this as a drawback, I view it as an opportunity. It forces me to truly understand the language rather than relying on AI-generated solutions that may not always be accurate.</p><p>In the end, choosing Swift wasn&#8217;t just about practicality&#8212;it was about growth. With Apple&#8217;s continued support and a commitment to staying ahead of the curve, I know I&#8217;m building something that will stand the test of time. The challenges, from requiring a Mac to working without extensive AI guidance, only push me to become a better developer. And that, to me, is the most exciting part of the journey.</p><h2>Money Map progress</h2><p> I&#8217;m currently developing my first app&#8212;a budgeting tool born out of necessity. When Mint, the budgeting app I relied on, was retired, I wasn&#8217;t thrilled about linking my bank account to third-party services like Plaid, which many budget apps use. So, I took matters into my own hands and started building my own solution. Currently, it&#8217;s available for macOS, with an iOS release just around the corner. It&#8217;s been a fun and challenging ride, and I can&#8217;t wait to see where this project takes me!</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://t.co/79l5XQpYdQ" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uV9G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F734876b2-cf4f-4bb3-b877-d44d4d28685e_155x36.png 424w, https://substackcdn.com/image/fetch/$s_!uV9G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F734876b2-cf4f-4bb3-b877-d44d4d28685e_155x36.png 848w, https://substackcdn.com/image/fetch/$s_!uV9G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F734876b2-cf4f-4bb3-b877-d44d4d28685e_155x36.png 1272w, https://substackcdn.com/image/fetch/$s_!uV9G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F734876b2-cf4f-4bb3-b877-d44d4d28685e_155x36.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uV9G!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F734876b2-cf4f-4bb3-b877-d44d4d28685e_155x36.png" width="300" height="69.6774193548387" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/734876b2-cf4f-4bb3-b877-d44d4d28685e_155x36.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:36,&quot;width&quot;:155,&quot;resizeWidth&quot;:300,&quot;bytes&quot;:2412,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://t.co/79l5XQpYdQ&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uV9G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F734876b2-cf4f-4bb3-b877-d44d4d28685e_155x36.png 424w, https://substackcdn.com/image/fetch/$s_!uV9G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F734876b2-cf4f-4bb3-b877-d44d4d28685e_155x36.png 848w, https://substackcdn.com/image/fetch/$s_!uV9G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F734876b2-cf4f-4bb3-b877-d44d4d28685e_155x36.png 1272w, https://substackcdn.com/image/fetch/$s_!uV9G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F734876b2-cf4f-4bb3-b877-d44d4d28685e_155x36.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>As for progress, well, let&#8217;s just say it&#8217;s been a slow crawl this week&#8212;especially on the download front. Balancing development with a full-time job isn&#8217;t easy, and I haven&#8217;t had much time for marketing, posting on X, or spreading the word. But the good news? The accounts section for iOS is officially done! Now, I&#8217;ve got four major tasks ahead: Categories view, paywall, onboarding, and settings.</p><p>I&#8217;m still optimistic that the iOS version will be ready to launch by the end of February. It&#8217;s a challenge, but I love the process. And hey&#8212;here&#8217;s a sneak peek of what&#8217;s coming soon!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vA_R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0e1bdbe-3385-48af-93f5-a2288a622cda_924x908.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vA_R!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0e1bdbe-3385-48af-93f5-a2288a622cda_924x908.png 424w, https://substackcdn.com/image/fetch/$s_!vA_R!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0e1bdbe-3385-48af-93f5-a2288a622cda_924x908.png 848w, https://substackcdn.com/image/fetch/$s_!vA_R!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0e1bdbe-3385-48af-93f5-a2288a622cda_924x908.png 1272w, https://substackcdn.com/image/fetch/$s_!vA_R!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0e1bdbe-3385-48af-93f5-a2288a622cda_924x908.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vA_R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0e1bdbe-3385-48af-93f5-a2288a622cda_924x908.png" width="924" height="908" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d0e1bdbe-3385-48af-93f5-a2288a622cda_924x908.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:908,&quot;width&quot;:924,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:191940,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vA_R!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0e1bdbe-3385-48af-93f5-a2288a622cda_924x908.png 424w, https://substackcdn.com/image/fetch/$s_!vA_R!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0e1bdbe-3385-48af-93f5-a2288a622cda_924x908.png 848w, https://substackcdn.com/image/fetch/$s_!vA_R!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0e1bdbe-3385-48af-93f5-a2288a622cda_924x908.png 1272w, https://substackcdn.com/image/fetch/$s_!vA_R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0e1bdbe-3385-48af-93f5-a2288a622cda_924x908.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Quote for this week</h2><p><strong>Proverbs 3:5&#8211;6<br></strong><em>&#8220;Trust in the LORD with all your heart and lean not on your own understanding; in all your ways submit to him, and he will make your paths straight.&#8221;</em></p><p></p>]]></content:encoded></item><item><title><![CDATA[Setting Goals and Measuring Progress]]></title><description><![CDATA[This is more about what are my goals]]></description><link>https://www.carlosgarciadev.com/p/setting-goals-and-measuring-progress</link><guid isPermaLink="false">https://www.carlosgarciadev.com/p/setting-goals-and-measuring-progress</guid><dc:creator><![CDATA[Carlos Garcia]]></dc:creator><pubDate>Sun, 26 Jan 2025 16:26:46 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e202973f-57ee-4e1f-83d0-d027ad280479_1792x1024.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_!cvLt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ffab6fe-7850-4f90-aa03-59d9ce73009d_1792x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cvLt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ffab6fe-7850-4f90-aa03-59d9ce73009d_1792x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cvLt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ffab6fe-7850-4f90-aa03-59d9ce73009d_1792x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cvLt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ffab6fe-7850-4f90-aa03-59d9ce73009d_1792x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cvLt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ffab6fe-7850-4f90-aa03-59d9ce73009d_1792x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cvLt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ffab6fe-7850-4f90-aa03-59d9ce73009d_1792x1024.jpeg" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0ffab6fe-7850-4f90-aa03-59d9ce73009d_1792x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:350014,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cvLt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ffab6fe-7850-4f90-aa03-59d9ce73009d_1792x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cvLt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ffab6fe-7850-4f90-aa03-59d9ce73009d_1792x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cvLt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ffab6fe-7850-4f90-aa03-59d9ce73009d_1792x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cvLt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ffab6fe-7850-4f90-aa03-59d9ce73009d_1792x1024.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Short-term vs. long-term goals</h2><p>Let&#8217;s begin by categorizing goals into two buckets: <strong>short-term goals</strong> and <strong>long-term goals</strong>. Short-term goals are objectives that can be achieved within a few months to a maximum of six months, while long-term goals take a year or more to accomplish. I&#8217;m not here to explain the best way to set goals&#8212;there are plenty of blogs on that topic. However, I will emphasize that every goal should have a measurable metric and a clear end date.</p><p>I&#8217;ve adopted advice from the video <em><a href="https://courses.avanderlee.com/courses">From Side Project to Going Indie</a></em> to structure my goal-setting process. For instance, I set quarterly goals for all aspects of my work. A recent example is: &#8220;Complete the iOS app version by the end of March.&#8221; To achieve this larger goal, I break it down into smaller, actionable steps. I use Jira to track these goals, not only for coding tasks but also for marketing objectives, ensuring a consistent approach across both domains.</p><p>While I make an effort to set and follow these goals, I often find myself creating new ones almost every week. I don&#8217;t see this as a problem; rather, I think it&#8217;s a sign that I could be more ambitious. Managing short-term goals requires a delicate balance, especially since I&#8217;m juggling a full-time job and a side project. The key is developing the discipline to regularly review and adjust goals. This habit helps me manage time effectively, even if achieving perfect balance remains elusive.</p><p>Long-term goals, on the other hand, allow for broader aspirations and dreams. For example, my main long-term goal this year is to complete the budgeting app and earn $1,000 in revenue. Looking further ahead, by 2026, I aim to have three apps, each generating at least $10,000 annually. While it&#8217;s important to be ambitious, it&#8217;s equally critical to prepare for the possibility of falling short. If I give my best effort but don&#8217;t fully achieve a goal, I&#8217;ll still gain valuable lessons from the process.</p><p>I plan to review these long-term goals annually and adjust them as needed. Since I&#8217;m just starting this journey, I haven&#8217;t had the opportunity to revise any goals yet. My hope is that future adjustments will reflect positive progress&#8212;for instance, achieving financial sustainability for my projects sooner than expected.</p><p>Ultimately, setting goals is just the first step. The real work lies in acting on them and consistently reviewing them, even if it&#8217;s just to keep them top of mind. This practice ensures that I&#8217;m constantly taking steps, however small, toward achieving my ambitions.</p><h2>How Money Map is doing</h2><p>I&#8217;m currently working on an app called <strong>Money Map</strong>, which you can download here: <a href="https://t.co/79l5XQpYdQ">Money Map</a>.</p><p>This week, progress has been similar to last week, with little change in downloads or revenue. My focus has been entirely on the iOS version, and I&#8217;m pleased to report that it&#8217;s on track. I&#8217;ve been hitting my quarterly goals, and the app is shaping up well for a release by the end of February. Things are looking promising!</p><h2>Quote for this week</h2><p>&#8220;Commit to the Lord whatever you do, and he will establish your plans.&#8221;<br><strong><a href="https://www.biblegateway.com/passage/?search=Proverbs%2016:3&amp;version=NIV">Proverbs 16:3</a></strong></p><p></p>]]></content:encoded></item><item><title><![CDATA[Why I Decided to Become an Indie Developer]]></title><description><![CDATA[The journey is more important than the destination.]]></description><link>https://www.carlosgarciadev.com/p/why-i-decided-to-become-an-indie</link><guid isPermaLink="false">https://www.carlosgarciadev.com/p/why-i-decided-to-become-an-indie</guid><dc:creator><![CDATA[Carlos Garcia]]></dc:creator><pubDate>Sun, 19 Jan 2025 16:31:38 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/0a5f4e08-3867-4c2f-8ab0-f0c7cf992cb7_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Backstory</h2><p>For as long as I can remember, I&#8217;ve dreamed of creating my own company and embarking on an entrepreneurial journey where I could be my own boss. However, I kept postponing it, partly because I&#8217;ve been fortunate to have great bosses and genuinely enjoyed my work.</p><p>During the pandemic, I found myself with more free time and decided to explore web development. My goal was to create an app to manage online education&#8212;a pressing need at the time as everything was shifting to the web. But after several months, I hit burnout; tackling such a massive project alone proved overwhelming, and I eventually set it aside.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.carlosgarciadev.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Later, during the Hollywood strikes, which brought movie and TV production to a halt, many artists were left out of work or reduced to part-time roles. I was among the lucky ones working part-time. This extra time gave me an opportunity to reflect on the entrepreneurial journey I had put off for so long. I decided to learn Swift, and the rest of the story can be found in my first post, <a href="https://open.substack.com/pub/carlosfelgarcia/p/first-post-of-the-journey?r=52fmj4&amp;utm_campaign=post&amp;utm_medium=web">First post of the journey</a></p><h2>Defining &#8220;indie&#8221;:</h2><p>For me, being an indie developer is the ideal way to pursue entrepreneurship. It allows me to do what I love while gradually achieving financial independence. I have full creative control over my projects while also learning essential skills like marketing and product sales.</p><p>From a financial perspective, this approach is less risky. I can keep my current job while working on my apps, which reduces stress. I don&#8217;t want to find myself in a situation where I&#8217;m uncertain about how to pay the bills next month.</p><p>Freedom is another significant benefit. As an indie developer, I can choose how and when to work on my projects. Don&#8217;t get me wrong; being indie often means working longer hours. However, not being tied to a strict 9-to-5 schedule is a huge advantage&#8212;especially when you have kids and value family time.</p><h2>Long-term vision</h2><p>My ultimate goal is to create apps that I can share with others while earning a living from them. This would be the dream&#8212;doing what I love while maintaining a fulfilling career.</p><p>I envision a gradual transition. For now, my full-time job pays the bills, but I aim to flip the dynamic: eventually, my apps will generate enough income for me to work part-time, and ultimately, I hope to become a full-time indie developer.</p><p>I&#8217;m aware the journey may be long or short, depending on luck and the effort I put in. Whether I run or walk, the most important thing is to embrace the journey and learn as much as I can along the way.</p><p>I recently took a course about becoming an indie developer, which I highly recommend to anyone considering this path. <a href="https://courses.avanderlee.com/courses/enrolled/2579134">From Side Project to Going Indie</a></p><h2>Update of the journey</h2><p>This week&#8217;s update is fairly light. I&#8217;ve had a few downloads for the macOS app, but overall activity has been slow. On the bright side, I&#8217;ve made significant progress on the iOS app, particularly the budget view&#8212;the most complex part. Once this section is complete, I anticipate releasing the app a few weeks afterward. My target release date is by the end of February.</p><p>One unexpected benefit of working on the iOS app is how it&#8217;s improving the macOS version. While developing new features and refining the UI for iOS, I noticed several areas for enhancement in the macOS app. It&#8217;s exciting to see these improvements come together and elevate the overall quality of both apps.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.carlosgarciadev.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Metrics and recent improvements]]></title><description><![CDATA[How I am using metrics to drive improvements]]></description><link>https://www.carlosgarciadev.com/p/metrics-and-recent-improvements</link><guid isPermaLink="false">https://www.carlosgarciadev.com/p/metrics-and-recent-improvements</guid><dc:creator><![CDATA[Carlos Garcia]]></dc:creator><pubDate>Sat, 11 Jan 2025 00:06:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/35e19998-ae62-49c6-990e-ace43285b8de_1792x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3>First week of the new year</h3><p>The first week of 2025 has brought some exciting developments for my macOS app. Downloads have increased noticeably, and the app is appearing more frequently in Apple Store searches. This is a significant improvement, as previously, the app only appeared to a handful of people on the best days.</p><h3>My Plan Moving Forward</h3><p>From here, my focus is on analyzing every step potential customers take and improving their experience wherever possible. This is not an easy task, but I believe that without improving these metrics, it will be impossible to reach more users who can enjoy the app.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.carlosgarciadev.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3>What Am I Improving?</h3><p><strong>1. Enhancing Visibility in the Apple Store</strong><br>Since I&#8217;m just starting and cannot afford paid ads or marketing campaigns, I&#8217;ve been looking at what successful competitors are doing and finding ways to make my app more attractive without appearing "cheap."</p><ul><li><p><strong>Improved Screenshots:</strong> Competitors use screenshots with phrases that highlight the app&#8217;s features. I&#8217;ve followed suit, creating polished screenshots and adding captions to emphasize the benefits of the app.</p></li><li><p><strong>Expanding Language Support:</strong> I translated the app into Spanish to increase visibility in Spanish-speaking markets. Additionally, I discovered that adding more languages can improve visibility in the US Apple Store. While implementing this, I realized that I had only set the app&#8217;s language to English (Canada). This oversight meant the app was not listed in the US, UK, or Australian stores. When I tried enabling English (US), an error indicated that another app with the same name already existed. To resolve this, I renamed the app to &#8220;Money-Map.&#8221;</p></li></ul><p><strong>2. Using Better Tools</strong><br>I started using the Helm app for macOS, which simplifies the app submission process to the Apple Store. Helm also provides keyword suggestions, making it easier to avoid common mistakes, such as using the same word in both the app&#8217;s name and its tags.</p><p><strong>3. Preparing for User Interaction</strong><br>To ensure the app meets users&#8217; needs, I&#8217;ve set up analytics to track how users interact with the app. However, maintaining user privacy is one of my core values. I&#8217;ve been careful only to track errors and usage of specific features, without logging any personal data that users input into the app.</p><h3>Looking Ahead</h3><p>I&#8217;m hopeful these improvements will attract more customers, which will, in turn, provide valuable feedback and help improve retention. By continuously refining the app, I aim to create a product that users love and trust.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.carlosgarciadev.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[First post of the journey]]></title><description><![CDATA[How I started the journey and where I am at.]]></description><link>https://www.carlosgarciadev.com/p/first-post-of-the-journey</link><guid isPermaLink="false">https://www.carlosgarciadev.com/p/first-post-of-the-journey</guid><dc:creator><![CDATA[Carlos Garcia]]></dc:creator><pubDate>Fri, 03 Jan 2025 20:36:54 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/cd5b307e-8d7d-45f1-8bd6-a120f8ddad67_1440x900.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3>Ideas for an app</h3><p>For over a decade, Python has been my primary programming language. I&#8217;ve always believed that learning any new language builds on the fundamentals of programming, making the language itself less important than how you use it. With this mindset, I decided to challenge myself by creating a new app for my phone and chose Swift as the language to learn. The only question left was what type of app to make.</p><p>About a year ago, I already had some ideas in mind when I discovered that Mint, the budgeting app I relied on, was shutting down. With only four months to find an alternative for tracking my budget, I explored options like YNAB. However, its high cost and reliance on a third-party library for bank integration left me uncertain. That&#8217;s when it clicked: I could build my own budgeting app. It was the perfect solution&#8212;a tool tailored to my needs while also serving as a hands-on way to learn Swift.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.carlosgarciadev.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Even though the budgeting app market is crowded, I was excited by the idea of creating something personal. If nothing else, I&#8217;d be its first user&#8212;me. This project became more than just a way to transition from Mint; it turned into an opportunity to build a tool I truly wanted while growing my programming skills.</p><h3>Money Map app</h3><p>My app is called Money Map and is currently available only for macOS (I&#8217;m working on the iOS version). This decision stems from my preference not to support bank linking&#8212;I&#8217;ve never been comfortable with having my bank credentials stored on potentially vulnerable servers. At the same time, I didn&#8217;t want to manually input every transaction, so I started with support for CSV files. Later, I created a Python script (Transactify) that converts Quicken files into JSON, providing more detailed data than standard CSV files. Currently, the app supports both JSON and CSV file types.</p><p>After testing with friends, I realized the app needed additional features. Some users wanted to manually add transactions, others needed recurring transactions, and some requested app protection through authentication. These, and other features, have all been implemented in the latest release.</p><p>I&#8217;m proud of what I&#8217;ve accomplished with Money Map. It&#8217;s still a work in progress, but seeing it in the Apple Store is incredibly rewarding. There&#8217;s so much more I could share&#8212;like the libraries I&#8217;ve used and the technical challenges I&#8217;ve faced&#8212;but this is a great start for my first blog.</p><h3>How am I doing currently?</h3><p>Having an app in the Apple Store has been a fun and enlightening experience. I&#8217;ve learned that creating an app isn&#8217;t just about development; it&#8217;s also about marketing and getting the word out. So far, I haven&#8217;t excelled in that aspect&#8212;I&#8217;ve had a few downloads but earned $0. I&#8217;m optimistic that the iOS version will improve conversions once it&#8217;s released.</p><h3>Thank you for reading</h3><p>This blog is part of my New Year&#8217;s resolution to be more public about what I&#8217;m working on. It&#8217;s both a way to market Money Map and to document my journey as an indie developer. With any luck, I&#8217;ll soon achieve the coveted "ramen profitability" status :).</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.carlosgarciadev.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>