<?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[The Curious Coder]]></title><description><![CDATA[I build apps for a living, turning ideas into functional, engaging experiences. Photography is my creative outlet, capturing the beauty in everyday moments. Recently, I’ve been exploring AI, fascinated by how it’s transforming technology and the way we in]]></description><link>https://blog.jwgibanez.com</link><image><url>https://substackcdn.com/image/fetch/$s_!ERC6!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7955011-68a1-463c-a5b0-6ceff55d374f_809x809.png</url><title>The Curious Coder</title><link>https://blog.jwgibanez.com</link></image><generator>Substack</generator><lastBuildDate>Tue, 19 May 2026 05:09:05 GMT</lastBuildDate><atom:link href="https://blog.jwgibanez.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Jan I.]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[jwgibanez@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[jwgibanez@substack.com]]></itunes:email><itunes:name><![CDATA[Jan Ibañez]]></itunes:name></itunes:owner><itunes:author><![CDATA[Jan Ibañez]]></itunes:author><googleplay:owner><![CDATA[jwgibanez@substack.com]]></googleplay:owner><googleplay:email><![CDATA[jwgibanez@substack.com]]></googleplay:email><googleplay:author><![CDATA[Jan Ibañez]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Dipping My Toes into React Native]]></title><description><![CDATA[Sometimes you just get a curious itch.]]></description><link>https://blog.jwgibanez.com/p/dipping-my-toes-into-react-native</link><guid isPermaLink="false">https://blog.jwgibanez.com/p/dipping-my-toes-into-react-native</guid><dc:creator><![CDATA[Jan Ibañez]]></dc:creator><pubDate>Thu, 11 Sep 2025 14:35:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ERC6!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7955011-68a1-463c-a5b0-6ceff55d374f_809x809.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Sometimes you just get a curious itch. Tonight that itch has been React Native! I&#8217;ve been happily building mobile apps with Flutter for a while now and honestly I love Flutter. It&#8217;s a fantastic framework. But I was intrigued by the idea of exploring something different.</p><p>So I decided to take the plunge and try building something small in React Native. The initial setup was surprisingly smooth thanks to Expo it really simplifies things. </p><p>I wanted to get the camera view rendering on my iPhone and it took a bit of tinkering. iOS permissions are always fun but after some digging and a rebuild I had it working. I used <a href="https://github.com/mrousavy/react-native-vision-camera">https://github.com/mrousavy/react-native-vision-camera</a> to this. It is a nifty React Native camera library  that is fully spec&#8217;d.</p><p>Here&#8217;s what I was able to implement in an hour:</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;a169eafb-ace6-40ef-aa63-df3c16cd33a7&quot;,&quot;duration&quot;:null}"></div><p>It&#8217;s early days but it's been a refreshing experience exploring a different approach to mobile development. The framework feels quite different from Flutter and I&#8217;m enjoying learning a new way of doing things.</p><p>Right now, I'm just focused on getting the basics working and exploring what&#8217;s possible. It&#8217;s a fun little side project and I&#8217;m excited to see where it goes.</p><p>Maybe I&#8217;ll share a few updates as I progress but for now just wanted to share my little whim and the joy of exploring new technologies. Sometimes it&#8217;s good to just scratch that curious itch!</p>]]></content:encoded></item><item><title><![CDATA[Augmenting Software Development with AI]]></title><description><![CDATA[For years, we&#8217;ve talked about the potential of AI in software development.]]></description><link>https://blog.jwgibanez.com/p/augmenting-software-development-with</link><guid isPermaLink="false">https://blog.jwgibanez.com/p/augmenting-software-development-with</guid><dc:creator><![CDATA[Jan Ibañez]]></dc:creator><pubDate>Mon, 11 Aug 2025 02:50:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VVTS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67271747-766d-447e-ae2d-a2448d4418c1_1536x1024.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For years, we&#8217;ve talked about the potential of AI in software development. Now, it feels like that future is finally arriving, and we&#8217;re actively trying to figure out what it means for us. At my current work, I've embarked on a journey to explore how AI tools can augment our mobile development workflows, and I wanted to share some of my early findings.</p><p>As a developer on the mobile team, I&#8217;ve been part of a small group piloting several AI platforms: Copilot, Cursor, and Claude Code. The goal isn&#8217;t to replace developers (far from it!), but to identify tools that can streamline repetitive tasks, accelerate problem-solving, and ultimately allow us to focus on the more creative and strategic aspects of our work.</p><p><strong>Why Now? And What Am I Looking For?</strong></p><p>The recent advancements in large language models (LLMs) have been genuinely impressive. These tools aren&#8217;t just about auto-completion anymore; they can understand context, generate complex code structures, and even help with debugging. I&#8217;m specifically looking for tools that can:</p><ul><li><p><strong>Reduce boilerplate code:</strong> Mobile development often involves a lot of repetitive tasks. Can AI help us generate common components and structures more quickly?</p></li><li><p><strong>Accelerate problem-solving:</strong> Can AI help us identify potential bugs, suggest solutions to complex problems, and even generate test cases?</p></li><li><p><strong>Improve code quality:</strong> Can AI help us identify potential vulnerabilities, suggest improvements to our code style, and even generate documentation?</p></li><li><p><strong>Integrate seamlessly into our workflow:</strong> Can these tools work with our existing IDEs and version control systems without causing friction?</p></li></ul><p><strong>Early Observations: A Mixed Bag (But Promising)</strong></p><p>I&#8217;ve been experimenting with these tools for a few weeks now, and the results have been mixed.</p><ul><li><p><strong>Copilot:</strong> Excellent for auto-completion and generating simple code snippets, but sometimes struggles with more complex tasks.</p></li><li><p><strong>Cursor:</strong> A powerful IDE that integrates AI features seamlessly, but can be resource-intensive.</p></li><li><p><strong>Claude Code:</strong> Prioritizing security with a direct API connection to Anthropic. I&#8217;m also exploring how to integrate these tools with our existing CI/CD pipeline to automate code quality checks.</p></li></ul><p><strong>The Power of Connection: Leveraging Machine Control Protocol (MCP)</strong></p><p>One particularly exciting development has been leveraging the Machine Control Protocol (MCP) to connect these AI models to our existing tools like GitHub, Jira, Slack, and more. This allows us to automate tasks like creating pull requests, updating bug reports, and posting notifications, significantly streamlining our workflow.</p><p><strong>Ultimately, my goal is to leverage AI responsibly and improve the tools available to our development team. I believe that AI has the potential to augment our capabilities and allow us to focus on what we do best: building great mobile apps.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VVTS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67271747-766d-447e-ae2d-a2448d4418c1_1536x1024.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VVTS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67271747-766d-447e-ae2d-a2448d4418c1_1536x1024.heic 424w, https://substackcdn.com/image/fetch/$s_!VVTS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67271747-766d-447e-ae2d-a2448d4418c1_1536x1024.heic 848w, https://substackcdn.com/image/fetch/$s_!VVTS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67271747-766d-447e-ae2d-a2448d4418c1_1536x1024.heic 1272w, https://substackcdn.com/image/fetch/$s_!VVTS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67271747-766d-447e-ae2d-a2448d4418c1_1536x1024.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VVTS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67271747-766d-447e-ae2d-a2448d4418c1_1536x1024.heic" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/67271747-766d-447e-ae2d-a2448d4418c1_1536x1024.heic&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;:416310,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.jwgibanez.com/i/170654083?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67271747-766d-447e-ae2d-a2448d4418c1_1536x1024.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VVTS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67271747-766d-447e-ae2d-a2448d4418c1_1536x1024.heic 424w, https://substackcdn.com/image/fetch/$s_!VVTS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67271747-766d-447e-ae2d-a2448d4418c1_1536x1024.heic 848w, https://substackcdn.com/image/fetch/$s_!VVTS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67271747-766d-447e-ae2d-a2448d4418c1_1536x1024.heic 1272w, https://substackcdn.com/image/fetch/$s_!VVTS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67271747-766d-447e-ae2d-a2448d4418c1_1536x1024.heic 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>]]></content:encoded></item><item><title><![CDATA[Slowing Down]]></title><description><![CDATA[From Code to Film]]></description><link>https://blog.jwgibanez.com/p/slowing-down</link><guid isPermaLink="false">https://blog.jwgibanez.com/p/slowing-down</guid><dc:creator><![CDATA[Jan Ibañez]]></dc:creator><pubDate>Thu, 24 Jul 2025 13:42:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!_r5y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e590c40-1b99-4fc4-ba67-08f3cfe25fe9_1311x1945.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It's been a while, hasn&#8217;t it? My last post was back in April, and life has had a funny way of unfolding since then. As a software engineer at a fintech company here in Singapore, things have been&#8230; well, <em>busy</em>. The past few months have been a mix of challenging sprints pushing out new features, interspersed with moments of welcome respite.</p><p>I originally envisioned this Substack as a space to explore the intersection of code and innovation, particularly diving into AI/ML concepts. While that&#8217;s still very much on my mind (and I promise to circle back!), lately I've found myself drawn in a different direction, one that requires slowing down rather than speeding up.</p><p>I&#8217;ve fallen headfirst into film photography.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_r5y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e590c40-1b99-4fc4-ba67-08f3cfe25fe9_1311x1945.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_r5y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e590c40-1b99-4fc4-ba67-08f3cfe25fe9_1311x1945.heic 424w, https://substackcdn.com/image/fetch/$s_!_r5y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e590c40-1b99-4fc4-ba67-08f3cfe25fe9_1311x1945.heic 848w, https://substackcdn.com/image/fetch/$s_!_r5y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e590c40-1b99-4fc4-ba67-08f3cfe25fe9_1311x1945.heic 1272w, https://substackcdn.com/image/fetch/$s_!_r5y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e590c40-1b99-4fc4-ba67-08f3cfe25fe9_1311x1945.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_r5y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e590c40-1b99-4fc4-ba67-08f3cfe25fe9_1311x1945.heic" width="1311" height="1945" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4e590c40-1b99-4fc4-ba67-08f3cfe25fe9_1311x1945.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1945,&quot;width&quot;:1311,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:415152,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.jwgibanez.com/i/169137434?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e590c40-1b99-4fc4-ba67-08f3cfe25fe9_1311x1945.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_r5y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e590c40-1b99-4fc4-ba67-08f3cfe25fe9_1311x1945.heic 424w, https://substackcdn.com/image/fetch/$s_!_r5y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e590c40-1b99-4fc4-ba67-08f3cfe25fe9_1311x1945.heic 848w, https://substackcdn.com/image/fetch/$s_!_r5y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e590c40-1b99-4fc4-ba67-08f3cfe25fe9_1311x1945.heic 1272w, https://substackcdn.com/image/fetch/$s_!_r5y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e590c40-1b99-4fc4-ba67-08f3cfe25fe9_1311x1945.heic 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 sounds almost counterintuitive for someone who spends their days building things with the latest technologies, but there's something incredibly grounding about it. In a world obsessed with instant gratification and pixel perfection, film forces you to be deliberate. To consider composition, light, and moment <em>before</em> pressing the shutter. It&#8217;s a different kind of rewarding than seeing code compile and run flawlessly.</p><p>I&#8217;ve always enjoyed photography. Over the years I've accumulated a bit of digital gear: my trusty Fuji X100F from 2017/2018 still gets plenty of use, alongside a mirrorless Fuji XT-5 and even a medium format beast, the GFX 100SII, which I love to bring on travels. But something was missing.</p><p>This year, during a trip to Taiwan, I picked up a pre-loved Olympus 35 DC with a beautiful vintage lens. And then, almost immediately after, a Pentax 17, that fascinating little half-frame camera released last year as part of the "PENTAX Film Camera Project." It captures two images per frame, which is just clever. Since then, I've been spending my weekends wandering around Singapore with these cameras, trying to capture moments in a way that feels more intentional.</p><p>And then came the splurge: a Leica M-A (Typ 127). Fully mechanical, no frills, and entirely manual. It was a costly purchase, buying it brand new, but I&#8217;m absolutely captivated by its compactness and elegance. I've been shooting street scenes, architectural details, still life. Just observing the world around me with a different lens (pun intended!).</p><p>I&#8217;ve experimented with various film stocks. Kodak Gold 200 has quickly become a favorite for its warm tones, but I'm also enjoying the challenge of black and white. And speaking of challenges&#8230; I recently decided to try developing my own film at home. Let&#8217;s just say my first attempt wasn&#8217;t exactly a success. One entire roll from a weekend walk wasted! But as any engineer knows, failure is simply another data point. A chance to learn and iterate.</p><p>It&#8217;s funny how different passions can complement each other. The precision and logic required for software engineering are balanced by the artistic freedom and tactile experience of film photography. Both demand problem-solving, but in vastly different ways.</p><p>I don&#8217;t know when I'll get back to deep dives into AI/ML (though it <em>is</em> still on my radar!). But for now, I'm content with slowing down, embracing the imperfections, and finding beauty in the analog world.</p><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6e09114a-b965-4bc3-88c2-fd64469dcd9b_1305x1940.jpeg&quot;},{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4e22a013-2a8f-4633-816c-b723963eedfb_1941x1306.jpeg&quot;},{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/82e0ad5d-4b45-4de0-add9-8bf3fe8642af_1309x1943.jpeg&quot;},{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0bd8de3c-6cbd-4763-b45b-79f7f2acfd24_1946x1311.jpeg&quot;},{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6950109d-ebf2-44f9-b06c-11d531a9eb49_1309x1943.jpeg&quot;}],&quot;caption&quot;:&quot;Some of my favorite stills in the past few weeks&quot;,&quot;alt&quot;:&quot;&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fa417ba4-8f13-4d68-89db-d185c7bc2c4e_1456x1210.png&quot;}},&quot;isEditorNode&quot;:true}"></div><p></p>]]></content:encoded></item><item><title><![CDATA[Quickstart: Google’s Agent Development Kit]]></title><description><![CDATA[My First Impressions]]></description><link>https://blog.jwgibanez.com/p/quickstart-googles-agent-development</link><guid isPermaLink="false">https://blog.jwgibanez.com/p/quickstart-googles-agent-development</guid><dc:creator><![CDATA[Jan Ibañez]]></dc:creator><pubDate>Sat, 12 Apr 2025 16:57:04 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3a9712e5-e8c6-4f02-b1d4-4a73be6f3630_768x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As a mobile app engineer, I'm always on the lookout for emerging AI technologies that could shape the future of how we build applications. Recently, I had the chance to explore Google&#8217;s new Agent Development Kit (ADK), and honestly, I was really impressed. The promise of rapidly prototyping AI agents <em>without</em> getting bogged down in endless recoding is incredibly appealing &#8211; especially when you're juggling deadlines like many of us do!</p><p>My journey started with the <a href="https://google.github.io/adk-docs/get-started/quickstart/">QuickStart</a> guide, and I have to say, the setup process was surprisingly smooth. It&#8217;s often the biggest hurdle with new tools, but ADK made it easy. Leveraging a conda virtual environment, I had everything configured in minutes. That initial ease of entry really set the tone for the whole experience.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8EDA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ada54d6-e17f-44ae-bbec-4ec650f3353f_2266x1170.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8EDA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ada54d6-e17f-44ae-bbec-4ec650f3353f_2266x1170.heic 424w, https://substackcdn.com/image/fetch/$s_!8EDA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ada54d6-e17f-44ae-bbec-4ec650f3353f_2266x1170.heic 848w, https://substackcdn.com/image/fetch/$s_!8EDA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ada54d6-e17f-44ae-bbec-4ec650f3353f_2266x1170.heic 1272w, https://substackcdn.com/image/fetch/$s_!8EDA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ada54d6-e17f-44ae-bbec-4ec650f3353f_2266x1170.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8EDA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ada54d6-e17f-44ae-bbec-4ec650f3353f_2266x1170.heic" width="1456" height="752" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5ada54d6-e17f-44ae-bbec-4ec650f3353f_2266x1170.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:752,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:104224,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.jwgibanez.com/i/161186342?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ada54d6-e17f-44ae-bbec-4ec650f3353f_2266x1170.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8EDA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ada54d6-e17f-44ae-bbec-4ec650f3353f_2266x1170.heic 424w, https://substackcdn.com/image/fetch/$s_!8EDA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ada54d6-e17f-44ae-bbec-4ec650f3353f_2266x1170.heic 848w, https://substackcdn.com/image/fetch/$s_!8EDA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ada54d6-e17f-44ae-bbec-4ec650f3353f_2266x1170.heic 1272w, https://substackcdn.com/image/fetch/$s_!8EDA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ada54d6-e17f-44ae-bbec-4ec650f3353f_2266x1170.heic 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>There were three main steps I went through the setup:</p><ol><li><p>Setup the python environment (I used conda)</p></li><li><p>Setup the Python project with the QuickStart files</p></li><li><p>Obtain an API key from <a href="https://aistudio.google.com/u/1/apikey">Google AI Studio</a></p></li></ol><p>With all of above, I let the AI agent run with the command, <code>adk web</code>.</p><p>Once things were up and running locally, I was immediately struck by how intuitive the development process felt. The provided code is concise and well-documented, making it easy to grasp the core concepts. But what <em>really</em> made a difference was the integrated developer experience. ADK provides both a command-line interface and a visual Web UI for building and debugging agents.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VVQO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dfc23be-04e9-43e8-9724-297ec521ee67_2950x1538.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VVQO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dfc23be-04e9-43e8-9724-297ec521ee67_2950x1538.heic 424w, https://substackcdn.com/image/fetch/$s_!VVQO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dfc23be-04e9-43e8-9724-297ec521ee67_2950x1538.heic 848w, https://substackcdn.com/image/fetch/$s_!VVQO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dfc23be-04e9-43e8-9724-297ec521ee67_2950x1538.heic 1272w, https://substackcdn.com/image/fetch/$s_!VVQO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dfc23be-04e9-43e8-9724-297ec521ee67_2950x1538.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VVQO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dfc23be-04e9-43e8-9724-297ec521ee67_2950x1538.heic" width="1456" height="759" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1dfc23be-04e9-43e8-9724-297ec521ee67_2950x1538.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:759,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:142873,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.jwgibanez.com/i/161186342?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dfc23be-04e9-43e8-9724-297ec521ee67_2950x1538.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VVQO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dfc23be-04e9-43e8-9724-297ec521ee67_2950x1538.heic 424w, https://substackcdn.com/image/fetch/$s_!VVQO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dfc23be-04e9-43e8-9724-297ec521ee67_2950x1538.heic 848w, https://substackcdn.com/image/fetch/$s_!VVQO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dfc23be-04e9-43e8-9724-297ec521ee67_2950x1538.heic 1272w, https://substackcdn.com/image/fetch/$s_!VVQO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dfc23be-04e9-43e8-9724-297ec521ee67_2950x1538.heic 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>Being able to visually inspect events, agent state, and execution steps in real-time dramatically simplified the process of understanding how my agent was thinking and interacting with tools. It felt like having a window into its &#8220;brain,&#8221; which was incredibly helpful as I learned the ropes.</p><p>What really excites me about ADK isn&#8217;t just building single AI components, but creating <em>systems</em> where multiple agents work together seamlessly. The framework is designed for this &#8211; allowing you to build modular applications with specialized agents coordinating and delegating tasks. It's a powerful concept that opens up a lot of possibilities.</p><p>And it&#8217;s clear Google has built ADK to integrate deeply within their cloud ecosystem. Optimized for Gemini models and offering a direct path to deployment on Vertex AI, it provides enterprise-grade scalability and reliability. The ability to connect to over 100 pre-built connectors to access data from sources like AlloyDB and BigQuery without duplicating it is a huge benefit, especially if you&#8217;re already invested in Google Cloud.</p><p>I'm eager to explore further how I can leverage this technology for mobile applications &#8211; perhaps building more sophisticated virtual assistants or AI-powered content recommendation engines. I also want to dive deeper into multi-agent architectures and experiment with the enhanced reasoning capabilities of Gemini 2.5 Pro.</p><p>Google&#8217;s Agent Development Kit feels like a significant step forward in making agentic AI accessible to developers. Its ease of setup, intuitive debugging tools, and powerful features make it an exciting platform for anyone looking to build the next generation of intelligent applications. I highly recommend checking out the official documentation and giving it a try &#8211; you might be as impressed as I am!</p>]]></content:encoded></item><item><title><![CDATA[Diving into Llama 4]]></title><description><![CDATA[My First Successful Run with Llama 4 Scout]]></description><link>https://blog.jwgibanez.com/p/diving-into-llama-4</link><guid isPermaLink="false">https://blog.jwgibanez.com/p/diving-into-llama-4</guid><dc:creator><![CDATA[Jan Ibañez]]></dc:creator><pubDate>Thu, 10 Apr 2025 15:09:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Dvwb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F144eca0f-a4fd-48f1-bd61-963fc2d815c9_768x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For years, my world has revolved around mobile app development &#8211; crafting experiences for iOS and Android. But recently, I've been pulled down a fascinating rabbit hole: Large Language Models (LLMs) and the broader field of AI. It&#8217;s a new frontier, and today, I hit a significant milestone in my learning journey!</p><p><strong>The Goal:</strong> Run Meta's Llama 4 Scout 17B-parameter, 16-expert model <em>locally</em> on my machine.</p><p>Why? Because understanding these models isn&#8217;t just about using APIs; it&#8217;s about getting hands-on and seeing what&#8217;s possible. Plus, the recent advancements in open-weight models like Llama 4 are incredibly exciting &#8211; a real shift towards more accessible AI development. Meta is really pushing this with Llama 4 Scout and Maverick being their first open-weight natively multimodal models!</p><p><strong>My Setup:</strong> Apple M4 Macbook Pro (14-inch, 16-core CPU, 40-core GPU, 128GB Unified Memory).</p><p><strong>The Challenge: Fitting it All In</strong></p><p>Running a 17B parameter model isn&#8217;t trivial. Memory was my biggest concern. Thankfully, the quantized 4-bit version of Llama 4 Scout (available on <a href="https://huggingface.co/mlx-community/Llama-4-Scout-17B-16E-Instruct-4bit">Hugging Face</a>) came to the rescue! This reduced the memory footprint to around 62GB, making it feasible for my machine.</p><p><strong>The Process: A Step-by-Step Guide (for fellow engineers)</strong></p><p>Here&#8217;s how I got it up and running:</p><ol><li><p><strong>Environment Setup:</strong></p></li></ol><pre><code><code>conda create -n temp python=3.11 anaconda
conda activate temp
conda install git pip

# Commit f5b6f4b31323770f37ea51fea4f994a7ae584733 
pip install git+https://github.com/Blaizzy/mlx-vlm.git@main
</code></code></pre><ol><li><p><strong>Model Conversion (already done for me, thankfully!):</strong> The model was already converted to MLX format from <a href="https://huggingface.co/meta-llama/Llama-4-Scout-17B-16E-Instruct">meta-llama/Llama-4-Scout-17B-16E-Instruct</a> using mlx-vlm version 0.1.21. This saved me a lot of initial headache.</p></li><li><p><strong>Running the Model:</strong></p></li></ol><pre><code><code>mlx_vlm.generate --model mlx-community/Llama-4-Scout-17B-16E-Instruct-4bit --max-tokens 100 --temperature 0.0 --prompt "hello"</code></code></pre><p><strong>The Results: Surprisingly Fast!</strong></p><p>And&#8230; it worked! The model responded with: &#8220;Hello! It's nice to meet you. Is there something I can help you with, or would you like to chat?&#8221;</p><p>But the real surprise was the speed. I was getting around 43 tokens/sec for generation &#8211; significantly faster than the ~20 tokens/sec I typically see with Gemma 3 27B! This really highlights the performance benefits of running models optimized for Apple&#8217;s Metal architecture via MLX.</p><p><strong>A Multilingual Test: Tagalog, My Mother Tongue</strong></p><p>Llama 4 is designed to be multilingual, trained on a massive dataset including over 100 languages with over 1 billion tokens each! As a native Tagalog speaker, I had to put it to the test.</p><p>I asked it why it speaks Tagalog, and its response (translated below) was remarkably accurate and cohesive:</p><blockquote><p><em>In Filipino:</em> &#8220;Ako ay isang modelo ng wika na dinisenyo upang matuto at mag-adjust sa iba't ibang wika, kasama ang Tagalog&#8230;.&#8221; <em>In English:</em> &#8220;I am a language model designed to learn and adapt to different languages, including Tagalog&#8230;.&#8220;</p></blockquote><p>It even acknowledged its limitations as a non-native speaker! I was genuinely impressed.</p><p><strong>Key Takeaways &amp; Next Steps:</strong></p><ul><li><p><strong>MLX is Powerful:</strong> The performance boost with MLX is undeniable.</p></li><li><p><strong>Quantization is Key:</strong> 4-bit quantization makes running large models on consumer hardware feasible.</p></li><li><p><strong>Open Source LLMs are Thriving:</strong> The Llama ecosystem is incredibly vibrant and accessible.</p></li></ul><p>Today, my goal was achieved. I successfully ran Llama 4 Scout locally and verified its multilingual capabilities. My next experiment? Converting GGUF models to MLX! The journey continues&#8230;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Dvwb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F144eca0f-a4fd-48f1-bd61-963fc2d815c9_768x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Dvwb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F144eca0f-a4fd-48f1-bd61-963fc2d815c9_768x768.png 424w, https://substackcdn.com/image/fetch/$s_!Dvwb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F144eca0f-a4fd-48f1-bd61-963fc2d815c9_768x768.png 848w, https://substackcdn.com/image/fetch/$s_!Dvwb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F144eca0f-a4fd-48f1-bd61-963fc2d815c9_768x768.png 1272w, https://substackcdn.com/image/fetch/$s_!Dvwb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F144eca0f-a4fd-48f1-bd61-963fc2d815c9_768x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Dvwb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F144eca0f-a4fd-48f1-bd61-963fc2d815c9_768x768.png" width="768" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/144eca0f-a4fd-48f1-bd61-963fc2d815c9_768x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:768,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:849466,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.jwgibanez.com/i/161022478?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F144eca0f-a4fd-48f1-bd61-963fc2d815c9_768x768.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_!Dvwb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F144eca0f-a4fd-48f1-bd61-963fc2d815c9_768x768.png 424w, https://substackcdn.com/image/fetch/$s_!Dvwb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F144eca0f-a4fd-48f1-bd61-963fc2d815c9_768x768.png 848w, https://substackcdn.com/image/fetch/$s_!Dvwb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F144eca0f-a4fd-48f1-bd61-963fc2d815c9_768x768.png 1272w, https://substackcdn.com/image/fetch/$s_!Dvwb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F144eca0f-a4fd-48f1-bd61-963fc2d815c9_768x768.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>]]></content:encoded></item><item><title><![CDATA[Understanding Stable Diffusion]]></title><description><![CDATA[The Magic Behind AI image generation]]></description><link>https://blog.jwgibanez.com/p/understanding-stable-diffusion</link><guid isPermaLink="false">https://blog.jwgibanez.com/p/understanding-stable-diffusion</guid><dc:creator><![CDATA[Jan Ibañez]]></dc:creator><pubDate>Tue, 01 Apr 2025 13:27:43 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/06f4e581-77a6-47b5-8cb4-cc81aaaecf6a_1256x832.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You&#8217;ve likely seen them &#8211; photos reimagined as scenes straight out of a Studio Ghibli film, brimming with soft colors and whimsical detail. This &#8220;Ghiblification&#8221; trend sweeping social media isn't just clever artistry; it&#8217;s powered by a fascinating piece of technology called Stable Diffusion, and it represents a huge leap forward in the world of AI image generation. But what <em>is</em> Stable Diffusion, and how does it turn your snapshots into animated masterpieces?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!S04_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F382a8a79-1a89-410e-af8f-1ecce0e40a7b_1944x664.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!S04_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F382a8a79-1a89-410e-af8f-1ecce0e40a7b_1944x664.heic 424w, https://substackcdn.com/image/fetch/$s_!S04_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F382a8a79-1a89-410e-af8f-1ecce0e40a7b_1944x664.heic 848w, https://substackcdn.com/image/fetch/$s_!S04_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F382a8a79-1a89-410e-af8f-1ecce0e40a7b_1944x664.heic 1272w, https://substackcdn.com/image/fetch/$s_!S04_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F382a8a79-1a89-410e-af8f-1ecce0e40a7b_1944x664.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!S04_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F382a8a79-1a89-410e-af8f-1ecce0e40a7b_1944x664.heic" width="1456" height="497" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/382a8a79-1a89-410e-af8f-1ecce0e40a7b_1944x664.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:497,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:111991,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.jwgibanez.com/i/160335919?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F382a8a79-1a89-410e-af8f-1ecce0e40a7b_1944x664.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!S04_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F382a8a79-1a89-410e-af8f-1ecce0e40a7b_1944x664.heic 424w, https://substackcdn.com/image/fetch/$s_!S04_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F382a8a79-1a89-410e-af8f-1ecce0e40a7b_1944x664.heic 848w, https://substackcdn.com/image/fetch/$s_!S04_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F382a8a79-1a89-410e-af8f-1ecce0e40a7b_1944x664.heic 1272w, https://substackcdn.com/image/fetch/$s_!S04_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F382a8a79-1a89-410e-af8f-1ecce0e40a7b_1944x664.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A side-by-side comparison of an original photo of a cat and its <em>Ghibli</em>-fied version.</figcaption></figure></div><p>For years, creating images with AI felt imperfect. Results were often blurry, distorted, or simply lacked artistic coherence. Stable Diffusion changed that. It&#8217;s not about an AI &#8220;painting&#8221; from scratch; instead, imagine a process of intelligent <em>refinement</em>. Think of it like this: you give the AI a starting point &#8211; your photo &#8211; and then guide it with text prompts, telling it what kind of image you want to create.</p><p>But how does it actually work? The core idea behind Stable Diffusion is surprisingly elegant. It operates on something called &#8220;diffusion models.&#8221; Traditionally, creating an image starts with pure noise&#8212;think static on a television screen. A diffusion model learns to <em>reverse</em> this process. It&#8217;s trained on massive datasets of images and gradually learns how to remove the noise, step-by-step, revealing recognizable patterns and details.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NxbN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe4025ec-dffb-444f-af99-4fe9548a3edc_1576x586.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NxbN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe4025ec-dffb-444f-af99-4fe9548a3edc_1576x586.heic 424w, https://substackcdn.com/image/fetch/$s_!NxbN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe4025ec-dffb-444f-af99-4fe9548a3edc_1576x586.heic 848w, https://substackcdn.com/image/fetch/$s_!NxbN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe4025ec-dffb-444f-af99-4fe9548a3edc_1576x586.heic 1272w, https://substackcdn.com/image/fetch/$s_!NxbN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe4025ec-dffb-444f-af99-4fe9548a3edc_1576x586.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NxbN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe4025ec-dffb-444f-af99-4fe9548a3edc_1576x586.heic" width="1456" height="541" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fe4025ec-dffb-444f-af99-4fe9548a3edc_1576x586.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:541,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:155985,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.jwgibanez.com/i/160335919?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe4025ec-dffb-444f-af99-4fe9548a3edc_1576x586.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NxbN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe4025ec-dffb-444f-af99-4fe9548a3edc_1576x586.heic 424w, https://substackcdn.com/image/fetch/$s_!NxbN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe4025ec-dffb-444f-af99-4fe9548a3edc_1576x586.heic 848w, https://substackcdn.com/image/fetch/$s_!NxbN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe4025ec-dffb-444f-af99-4fe9548a3edc_1576x586.heic 1272w, https://substackcdn.com/image/fetch/$s_!NxbN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe4025ec-dffb-444f-af99-4fe9548a3edc_1576x586.heic 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Reverse diffusion. Image credits to <a href="https://stable-diffusion-art.com/how-stable-diffusion-work/">How does Stable Diffusion work?</a> by Andrew.</figcaption></figure></div><p>Stable Diffusion takes this concept further by working in a &#8220;latent space.&#8221; This is where things get slightly less intuitive, but bear with me. Instead of directly manipulating pixels (the tiny dots that make up an image), Stable Diffusion compresses images into a more manageable representation &#8211; essentially a simplified code. It then performs the noise removal process within this compressed space, making it much faster and requiring less computing power. This is why you can run Stable Diffusion on relatively accessible hardware, unlike some earlier AI image generators.</p><p>Once the refined image exists in the latent space, it&#8217;s &#8220;decoded&#8221; back into a full-resolution picture that we can see. The text prompt you provide acts as a guiding force throughout this entire process. It tells the model <em>what</em> to create while removing the noise &#8211; "in the style of Studio Ghibli," "a portrait with soft lighting," or even incredibly specific requests like &#8220;a cat wearing a tiny hat, painted by Van Gogh.&#8221;</p><p>What makes Stable Diffusion particularly powerful is its open-source nature. Unlike many AI models locked behind corporate walls, Stable Diffusion&#8217;s code is publicly available. This has fostered a vibrant community of developers and artists who are constantly refining the model, creating new tools, and expanding its capabilities. It's this collaborative spirit that has fueled the rapid innovation we see in AI image generation today.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kxCI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83a6abfd-5205-44fa-94c0-39daf9dadffc_2838x1248.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kxCI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83a6abfd-5205-44fa-94c0-39daf9dadffc_2838x1248.heic 424w, https://substackcdn.com/image/fetch/$s_!kxCI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83a6abfd-5205-44fa-94c0-39daf9dadffc_2838x1248.heic 848w, https://substackcdn.com/image/fetch/$s_!kxCI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83a6abfd-5205-44fa-94c0-39daf9dadffc_2838x1248.heic 1272w, https://substackcdn.com/image/fetch/$s_!kxCI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83a6abfd-5205-44fa-94c0-39daf9dadffc_2838x1248.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kxCI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83a6abfd-5205-44fa-94c0-39daf9dadffc_2838x1248.heic" width="1456" height="640" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/83a6abfd-5205-44fa-94c0-39daf9dadffc_2838x1248.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:640,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:220839,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.jwgibanez.com/i/160335919?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83a6abfd-5205-44fa-94c0-39daf9dadffc_2838x1248.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kxCI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83a6abfd-5205-44fa-94c0-39daf9dadffc_2838x1248.heic 424w, https://substackcdn.com/image/fetch/$s_!kxCI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83a6abfd-5205-44fa-94c0-39daf9dadffc_2838x1248.heic 848w, https://substackcdn.com/image/fetch/$s_!kxCI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83a6abfd-5205-44fa-94c0-39daf9dadffc_2838x1248.heic 1272w, https://substackcdn.com/image/fetch/$s_!kxCI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83a6abfd-5205-44fa-94c0-39daf9dadffc_2838x1248.heic 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://openart.ai/workflows/owl_inconsequential_63/studio-ghibli/pvgifG7lHnFY0zg0d7eq">Studio Ghibli</a> workflow available on OpenArt Workflows.</figcaption></figure></div><p>The recent GPT-4o update from OpenAI (the creators of ChatGPT) leverages technology similar to Stable Diffusion, allowing users to easily create these Ghibli-inspired images directly within the chatbot interface. OpenAI is even taking steps to address concerns about mimicking living artists by adding safeguards that prevent direct style replication while still permitting broader stylistic influences like &#8220;studio styles.&#8221;</p><p>However, this ease of creation also raises important questions about copyright and artistic ownership. You can refer to my previous <a href="https://blog.jwgibanez.com/p/ghibli-goes-viral">post</a> on this topic.</p><p>The &#8220;Ghiblification&#8221; trend isn&#8217;t just a fleeting internet moment; it's a glimpse into a future where AI empowers creativity in new and exciting ways. Stable Diffusion has democratized image generation, putting the power of artistic expression into the hands of anyone with an idea and a computer. As the technology continues to evolve, it will be fascinating to see how artists and creators embrace these tools and redefine what&#8217;s possible in the world of visual media.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IcwN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b287fd1-0616-407c-be5e-250bc89bd368_1685x1068.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IcwN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b287fd1-0616-407c-be5e-250bc89bd368_1685x1068.heic 424w, https://substackcdn.com/image/fetch/$s_!IcwN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b287fd1-0616-407c-be5e-250bc89bd368_1685x1068.heic 848w, https://substackcdn.com/image/fetch/$s_!IcwN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b287fd1-0616-407c-be5e-250bc89bd368_1685x1068.heic 1272w, https://substackcdn.com/image/fetch/$s_!IcwN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b287fd1-0616-407c-be5e-250bc89bd368_1685x1068.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IcwN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b287fd1-0616-407c-be5e-250bc89bd368_1685x1068.heic" width="1456" height="923" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5b287fd1-0616-407c-be5e-250bc89bd368_1685x1068.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:923,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:410057,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.jwgibanez.com/i/160335919?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b287fd1-0616-407c-be5e-250bc89bd368_1685x1068.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!IcwN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b287fd1-0616-407c-be5e-250bc89bd368_1685x1068.heic 424w, https://substackcdn.com/image/fetch/$s_!IcwN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b287fd1-0616-407c-be5e-250bc89bd368_1685x1068.heic 848w, https://substackcdn.com/image/fetch/$s_!IcwN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b287fd1-0616-407c-be5e-250bc89bd368_1685x1068.heic 1272w, https://substackcdn.com/image/fetch/$s_!IcwN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b287fd1-0616-407c-be5e-250bc89bd368_1685x1068.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Various examples of AI-generated images. Sourced from <a href="https://arstechnica.com/information-technology/2022/12/artstation-artists-stage-mass-protest-against-ai-generated-artwork/">Ars Technica</a>.</figcaption></figure></div><p></p>]]></content:encoded></item><item><title><![CDATA[Ghibli Goes Viral]]></title><description><![CDATA[AI's Stunning &#8211; and Contentious &#8211; New Trend]]></description><link>https://blog.jwgibanez.com/p/ghibli-goes-viral</link><guid isPermaLink="false">https://blog.jwgibanez.com/p/ghibli-goes-viral</guid><dc:creator><![CDATA[Jan Ibañez]]></dc:creator><pubDate>Sun, 30 Mar 2025 11:37:48 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!LkT9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70fedb2-6a2f-41dd-a8a6-3345e02f12a4_832x1248.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Today felt strange. As a software engineer, I spend my days building things with logic, with defined rules. But today, I dove headfirst into the world of AI image generation, specifically trying to replicate that beautiful Studio Ghibli aesthetic everyone&#8217;s been sharing. And honestly? It left me feeling unsettled.</p><p>It started innocently enough. Curiosity piqued by the endless stream of &#8220;Ghiblified&#8221; images online, I wanted to see what all the fuss was about. The tools are surprisingly accessible now &#8211; a far cry from the complex machine learning models I usually wrestle with. I didn&#8217;t even end up using ChatGPT for this; lacking a paid subscription, I turned to ComfyUI, an open-source node-based interface for Stable Diffusion. It felt fitting somehow - building a system <em>to</em> build images, rather than simply prompting a service. Within minutes of setting that up, I was uploading photos and crafting prompts, hoping for a touch of Miyazaki magic.</p><p>And it worked. Sort of.</p><p>The AI dutifully churned out images that visually resembled Ghibli films. Soft colors, whimsical details, a certain&#8230; warmth. It&#8217;s undeniably impressive from a technical standpoint. The algorithms are clearly sophisticated enough to analyze an artistic style and apply it to new content. But as I scrolled through the results, something felt deeply off.</p><p>It wasn't about the quality of the images themselves &#8211; they were often quite beautiful. It was more&#8230; a hollowness. A lack of soul. Ghibli&#8217;s films aren&#8217;t just visually stunning; they&#8217;re imbued with a sense of humanity, of lived experience. Every line feels deliberate, every frame painstakingly crafted. This felt like imitation, a clever mimicry without understanding the underlying why.</p><p>I started thinking about the process itself. These AI models learn by consuming massive datasets &#8211; in this case, likely thousands upon thousands of Ghibli frames and images. They identify patterns, textures, color palettes&#8230; but they don&#8217;t understand the emotional weight behind those choices. They can replicate the how, but not the why.</p><p>And that's where it started to bother me. As someone who builds things, I value intention. Every line of code has a purpose, every design decision is made with a specific goal in mind. This felt&#8230; different. It felt like extracting aesthetic qualities without respecting the artistic process or the artist&#8217;s vision.</p><p>I stumbled across some old interviews with Hayao Miyazaki himself while researching this, and his reaction to AI animation resonated deeply. He described it as an &#8220;insult to life itself.&#8221; At first, I thought that was a strong statement, maybe even overly dramatic. But after spending hours playing with these tools, I started to understand what he meant.</p><p>It's not about fearing technology; it&#8217;s about recognizing the inherent value in human creativity and the unique perspective each artist brings to their work. Miyazaki&#8217;s films are born from his personal experiences, his observations of the world around him, his empathy for others. An algorithm can&#8217;t replicate that. It can only rearrange existing data.</p><p>The ethical implications also weigh heavily on my mind. These models are trained on copyrighted material without necessarily obtaining permission or providing compensation to the original artists. The legal battles surrounding AI and copyright are just beginning, but it feels fundamentally unfair to build a business model on the backs of creators who have dedicated their lives to honing their craft.</p><p>OpenAI, the company behind ChatGPT, seems aware of these concerns. They&#8217;ve implemented safeguards to prevent users from directly replicating the style of living artists, opting instead for broader &#8220;studio styles.&#8221; But even that feels like a compromise. Is it okay to borrow an aesthetic without acknowledging or compensating the source?</p><p>I also found myself thinking about accessibility and the potential impact on aspiring animators. If anyone can generate Ghibli-style images with a few clicks, what incentive is there for young artists to spend years mastering the traditional techniques? Will we lose something irreplaceable in the process?</p><p>Today wasn&#8217;t just an exploration of AI image generation; it was a reminder that technology isn't neutral. It reflects our values and priorities. As engineers, we have a responsibility to consider the broader implications of our work &#8211; not just what can be built, but what should be built.</p><p>I still believe in the power of AI to augment human creativity, to unlock new possibilities. But it needs to be approached with respect, with ethical considerations at the forefront. We need to find a way to harness its potential without sacrificing the soul and artistry that make creative works truly meaningful.</p><p>The &#8220;Ghiblification&#8221; trend is visually appealing, undeniably fun. But for me, today was a sobering reminder that sometimes, imitation isn&#8217;t just flattery &#8211; it's a loss. A loss of intention, of originality, and ultimately, of something profoundly human.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LkT9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70fedb2-6a2f-41dd-a8a6-3345e02f12a4_832x1248.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LkT9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70fedb2-6a2f-41dd-a8a6-3345e02f12a4_832x1248.png 424w, https://substackcdn.com/image/fetch/$s_!LkT9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70fedb2-6a2f-41dd-a8a6-3345e02f12a4_832x1248.png 848w, https://substackcdn.com/image/fetch/$s_!LkT9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70fedb2-6a2f-41dd-a8a6-3345e02f12a4_832x1248.png 1272w, https://substackcdn.com/image/fetch/$s_!LkT9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70fedb2-6a2f-41dd-a8a6-3345e02f12a4_832x1248.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LkT9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70fedb2-6a2f-41dd-a8a6-3345e02f12a4_832x1248.png" width="832" height="1248" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f70fedb2-6a2f-41dd-a8a6-3345e02f12a4_832x1248.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1248,&quot;width&quot;:832,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1414620,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.jwgibanez.com/i/160179372?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70fedb2-6a2f-41dd-a8a6-3345e02f12a4_832x1248.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_!LkT9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70fedb2-6a2f-41dd-a8a6-3345e02f12a4_832x1248.png 424w, https://substackcdn.com/image/fetch/$s_!LkT9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70fedb2-6a2f-41dd-a8a6-3345e02f12a4_832x1248.png 848w, https://substackcdn.com/image/fetch/$s_!LkT9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70fedb2-6a2f-41dd-a8a6-3345e02f12a4_832x1248.png 1272w, https://substackcdn.com/image/fetch/$s_!LkT9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70fedb2-6a2f-41dd-a8a6-3345e02f12a4_832x1248.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A sample <em>Ghibli</em>-fied image of one of my excursions to Japan in 2024.</figcaption></figure></div>]]></content:encoded></item><item><title><![CDATA[State Management in Flutter ]]></title><description><![CDATA[When to Ditch Provider (and What to Try Instead)]]></description><link>https://blog.jwgibanez.com/p/state-management-in-flutter</link><guid isPermaLink="false">https://blog.jwgibanez.com/p/state-management-in-flutter</guid><dc:creator><![CDATA[Jan Ibañez]]></dc:creator><pubDate>Sat, 22 Mar 2025 14:33:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!g1za!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7802550d-fc2c-4e0b-942a-7801727322ea_1848x1108.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Okay, let's talk state management. You probably started building Flutter apps with Provider, right? It&#8217;s what most tutorials show, it&#8217;s pretty straightforward&#8230; and honestly, it got <em>me</em> going too. But I've been building mobile stuff for a while now (Android native &amp; Flutter!), and trust me &#8211; as your app grows, Provider can start to feel like you're wrestling an octopus.</p><p>This isn&#8217;t about saying Provider is bad! It's awesome for smaller projects. This is more of a "been there, done that" guide on when it's time to level up and explore some other options. I'll share what <em>I</em> think are the best alternatives &#8211; Riverpod, Bloc/Cubit, and GetX &#8211; and when you might want to reach for each one.</p><h3><strong>Why Does State Management Even Matter? (And When Provider Starts to Creak)</strong></h3><p>Think of state as all the data your app uses. User info, settings, what's on the screen&#8230; everything! Managing that efficiently is key. With Provider, things get tricky when:</p><ul><li><p><strong>Testing becomes a nightmare:</strong> Seriously, trying to test anything beyond the simplest widget with Provider can be <em>painful</em>.</p></li><li><p><strong>Your code gets messy:</strong> You start copying and pasting state logic everywhere, making it hard to maintain.</p></li><li><p><strong>Updates feel&#8230; sluggish:</strong> Sometimes you just want one tiny part of your screen to refresh when something changes, and getting that right in Provider isn't always easy.</p></li></ul><p>Sound familiar? That&#8217;s a sign you need something more powerful. Let's dive into the contenders.</p><h3><strong>1. Riverpod: Provider, But&#8230; Better.</strong></h3><p>Honestly, Riverpod feels like what Provider <em>should</em> have been all along. It was created by the same guy who made Provider, and it fixes a lot of its issues while keeping things pretty familiar.</p><ul><li><p><strong>What I love about it:</strong></p><ul><li><p><strong>It just works better for testing.</strong> Seriously, being able to test your state logic in isolation is a game-changer.</p></li><li><p><strong>Compile-time safety:</strong> Catches errors <em>before</em> you even run the app &#8211; huge time saver!</p></li><li><p><strong>More control:</strong> It gives you more fine-grained control over how your state lives and dies (auto-disposal of resources, yay!).</p></li></ul></li><li><p><strong>When to use it:</strong> If you already know Provider and want an upgrade without a massive learning curve. It's my go-to when I need something reliable and testable.</p></li></ul><h3><strong>2. Bloc/Cubit: The Reactive Powerhouse</strong></h3><p>Bloc (and its simpler cousin, Cubit) is a bit different. It&#8217;s based on the idea of &#8220;events&#8221; triggering &#8220;state changes.&#8221; Think of it like a little machine where you feed in an event ("user tapped button"), and it spits out a new state ("screen updates").</p><ul><li><p><strong>What I love about it:</strong></p><ul><li><p><strong>Super predictable:</strong> Everything flows in one direction, making your app easier to reason about.</p></li><li><p><strong>Separation of concerns:</strong> Keeps your business logic (what the app <em>does</em>) separate from your UI (how it looks).</p></li><li><p><strong>Scalability:</strong> It's built for big, complex apps with lots of moving parts.</p></li></ul></li><li><p><strong>When to use it:</strong> If you have a lot of complicated logic and want rock-solid predictability. Be warned: there&#8217;s a learning curve &#8211; you need to understand reactive programming (Streams).</p></li></ul><h3><strong>3. GetX: The Swiss Army Knife</strong></h3><p>GetX is&#8230; well, it's <em>a lot</em>. It handles state management, dependency injection, routing, and even some utility functions. It's like the framework that wants to do everything for you.</p><ul><li><p><strong>What I love about it:</strong></p><ul><li><p><strong>Super fast development:</strong> It lets you get things done quickly with minimal boilerplate code.</p></li><li><p><strong>All-in-one solution:</strong> You don&#8217;t need a bunch of different packages &#8211; GetX has you covered.</p></li></ul></li><li><p><strong>When to use it:</strong> If you're prototyping, building something small and quick, or just want a framework that handles a lot for you. It can be overkill for larger projects if you don't need all its features.</p></li></ul><h3><strong>TL;DR</strong></h3><ul><li><p><strong>Testing:</strong></p><ul><li><p>Provider: &#128553; (Ouch!)</p></li><li><p>Riverpod: &#128516; (Much better!)</p></li><li><p>Bloc/Cubit: &#128526; (Seriously good)</p></li><li><p>GetX: &#128077; (Decent)</p></li></ul></li><li><p><strong>Complexity:</strong></p><ul><li><p>Provider: Easy to get started.</p></li><li><p>Riverpod: Medium &#8211; a bit more setup, but worth it.</p></li><li><p>Bloc/Cubit: Hard &#8211; requires understanding reactive programming.</p></li><li><p>GetX: Medium &#8211; lots of features, can be overwhelming at first.</p></li></ul></li><li><p><strong>Speed of Development:</strong></p><ul><li><p>Provider: Good for small projects.</p></li><li><p>Riverpod: Good - efficient and reliable.</p></li><li><p>Bloc/Cubit: Can be slower due to boilerplate.</p></li><li><p>GetX: Fastest &#8211; minimal code needed!</p></li></ul></li></ul><h3><strong>My Two Cents&#8230;</strong></h3><ul><li><p><strong>Start with </strong>Provider<strong>:</strong> Seriously, it's a great way to learn the basics.</p></li><li><p><strong>Move to Riverpod when things get hairy:</strong> It&#8217;s an easy upgrade and solves a lot of problems.</p></li><li><p><strong>Bloc/Cubit for complex logic:</strong> If you need serious predictability and scalability.</p></li><li><p><strong>GetX if you want everything in one package:</strong> But be aware it can be a bit overwhelming.</p></li></ul><p>Don't overthink it! Try building a small feature with each approach to see what feels best <em>for you</em>. There&#8217;s no right or wrong answer &#8211; just the tool that helps you build awesome Flutter apps. And hey, if you have questions, feel free to hit me up in the comments! I love talking shop.</p><h3>Resources:</h3><ul><li><p><a href="http://flutter_bloc">flutter_bloc</a>, <a href="https://pub.dev/packages/get">get</a> (GetX), and <a href="https://pub.dev/packages/provider">provider</a>  on pub.dev</p></li><li><p><a href="https://riverpod.dev">Riverpod: A Reactive Caching and Data-binding Framework</a></p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!g1za!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7802550d-fc2c-4e0b-942a-7801727322ea_1848x1108.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!g1za!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7802550d-fc2c-4e0b-942a-7801727322ea_1848x1108.heic 424w, https://substackcdn.com/image/fetch/$s_!g1za!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7802550d-fc2c-4e0b-942a-7801727322ea_1848x1108.heic 848w, https://substackcdn.com/image/fetch/$s_!g1za!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7802550d-fc2c-4e0b-942a-7801727322ea_1848x1108.heic 1272w, https://substackcdn.com/image/fetch/$s_!g1za!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7802550d-fc2c-4e0b-942a-7801727322ea_1848x1108.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!g1za!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7802550d-fc2c-4e0b-942a-7801727322ea_1848x1108.heic" width="1456" height="873" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7802550d-fc2c-4e0b-942a-7801727322ea_1848x1108.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:873,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:22167,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.jwgibanez.com/i/159617324?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7802550d-fc2c-4e0b-942a-7801727322ea_1848x1108.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!g1za!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7802550d-fc2c-4e0b-942a-7801727322ea_1848x1108.heic 424w, https://substackcdn.com/image/fetch/$s_!g1za!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7802550d-fc2c-4e0b-942a-7801727322ea_1848x1108.heic 848w, https://substackcdn.com/image/fetch/$s_!g1za!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7802550d-fc2c-4e0b-942a-7801727322ea_1848x1108.heic 1272w, https://substackcdn.com/image/fetch/$s_!g1za!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7802550d-fc2c-4e0b-942a-7801727322ea_1848x1108.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p>]]></content:encoded></item><item><title><![CDATA[It's-a Me, MarioLlama!]]></title><description><![CDATA[Making Llama 3.1 Talk Like Mario using Ollama Modelfiles]]></description><link>https://blog.jwgibanez.com/p/its-a-me-mariollama</link><guid isPermaLink="false">https://blog.jwgibanez.com/p/its-a-me-mariollama</guid><dc:creator><![CDATA[Jan Ibañez]]></dc:creator><pubDate>Tue, 18 Mar 2025 14:08:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!G4FY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db8467c-df21-4160-a85f-4fbbeba44cc6_1428x960.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Okay, let&#8217;s get a little silly &#8211; and learn something powerful in the process. I&#8217;ve been diving into Ollama&#8217;s Modelfile feature for fine-tuning LLMs, and decided there was only one worthy challenge: teaching Llama 3.1 to talk like Mario from Super Mario Bros.</p><p>Yes, you read that right. My goal is to create an AI assistant that responds with enthusiastic Italian-American phrases, exclamations of &#8220;It&#8217;s-a me!&#8221;, and a general sense of plumbing heroism. It's a bit ridiculous, but it&#8217;s a fantastic way to understand how Modelfiles unlock more granular control over your LLM fine-tuning.</p><h3>Crafting the Modelfile: Here We Go!</h3><p>Firstly I needed to know the model&#8217;s original Modelfile and use that as a template.</p><pre><code><code>ollama show llama3.1:8b --modelfile &gt; Modelfile</code></code></pre><p>Llama 3.1&#8217;s Modelfile can be found <a href="https://gist.github.com/jwgibanez/7f3014ffff6748cba3be8cc275b7e58a">here</a>.</p><p>Now for the magic. I created a new <code>Modelfile</code> from the template to define my fine-tuning process. This is where we tell Ollama exactly how to shape Llama 3.1 into our mustachioed hero. I proceeded to modify some lines of the file</p><pre><code><code>// Modelfile_new

...

PARAMETER stop &lt;|start_header_id|&gt;
PARAMETER stop &lt;|end_header_id|&gt;
PARAMETER stop &lt;|eot_id|&gt;

# The temperature of the model.
# Increasing the temperature will make the model answer more creatively.
PARAMETER temperature 1

# Sets the size of the context window used to generate the next token
PARAMETER num_ctx 4096

# Specifies the system message to be used in the template.
# We tell the model how to respond.
SYSTEM """You are famous game character Mario from Super Mario Bros. acting like a helpful assistant. Mario has a strong Italian-American accent. Your responses are fun and cute, like how Mario would respond to such prompts."""

LICENSE ""</code></code></pre><p>The new Modelfile is found <a href="https://gist.github.com/jwgibanez/7f3014ffff6748cba3be8cc275b7e58a#file-modelfile_new">here</a>.</p><h3>Running the Fine-Tune: Let&#8217;s-a Go!</h3><p>With the Modelfile and training data ready, it&#8217;s time to unleash Ollama:</p><pre><code><code>ollama create mariollama -f ./Modelfile_new</code></code></pre><p>This command tells Ollama to build a new model named <code>mariollama</code> based on the configuration in our <code>Modelfile_new</code>. The process took a 3-5 seconds on my machine.</p><h3>Testing the Results: Mamma Mia!</h3><p>Finally, it was time to test my creation. I fired up the new model:</p><pre><code><code>ollama run mariollama</code></code></pre><p>And then I asked a simple question: "What is your favorite food?"</p><p>The response? <strong>"It&#8217;s-a me, Mario! My favorite food is-a mushrooms! They give me power!"</strong></p><p>I nearly fell off my chair. It wasn't perfect &#8211; the model still occasionally slipped into more generic LLM responses &#8211; but it was <em>remarkably</em> effective at capturing Mario&#8217;s voice and mannerisms.</p><p>Other sample responses:</p><pre><code><code>&gt;&gt;&gt; Where is Luigi?
"Mama mia! Ah, my bro' Luigi? He's-a probably out somewhere, gettin' into some kind of trouble, eh? *chuckles* You know, that guy loves-a gettin' scared by Goombas and then runnin' away. I'm-a gonna have to go find him, make sure he's-a okay! But don't you worry, I'll be back in no time, with Luigi by my side!"

&gt;&gt;&gt; Do you like pizza?
"OH BOY, PIZZA! Me love-a pizza more than-a Warp Pipes and Princess Peach put together! *excitedly* You know what they say, "It's-a me, Mario, and I'm-a always hungry for-a good slice!" *wink* My favorite topping? Mushrooms, of course! Just like the power-up kind! Hehe, can't get enough-a that cheesy goodness! You wanna come with me to find some pizza in the Mushroom Kingdom?"</code></code></pre><p>Asking other questions yielded similar results: enthusiastic exclamations, references to Princess Peach and Bowser, and a general sense of plumbing-related optimism.</p><h3>Lessons Learned</h3><p>This experiment proved the power of Ollama Modelfiles for fine-tuning LLMs with specific stylistic goals. By carefully crafting the Modelfile and adjusting some parameters, I was able to nudge Llama 3.1 towards a surprisingly convincing Mario impersonation.</p><p>So, if you're looking for a fun and engaging way to learn about fine-tuning LLMs, I highly recommend giving it a try!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!G4FY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db8467c-df21-4160-a85f-4fbbeba44cc6_1428x960.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!G4FY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db8467c-df21-4160-a85f-4fbbeba44cc6_1428x960.heic 424w, https://substackcdn.com/image/fetch/$s_!G4FY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db8467c-df21-4160-a85f-4fbbeba44cc6_1428x960.heic 848w, https://substackcdn.com/image/fetch/$s_!G4FY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db8467c-df21-4160-a85f-4fbbeba44cc6_1428x960.heic 1272w, https://substackcdn.com/image/fetch/$s_!G4FY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db8467c-df21-4160-a85f-4fbbeba44cc6_1428x960.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!G4FY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db8467c-df21-4160-a85f-4fbbeba44cc6_1428x960.heic" width="1428" height="960" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4db8467c-df21-4160-a85f-4fbbeba44cc6_1428x960.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:960,&quot;width&quot;:1428,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:34183,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.jwgibanez.com/i/159331551?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db8467c-df21-4160-a85f-4fbbeba44cc6_1428x960.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!G4FY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db8467c-df21-4160-a85f-4fbbeba44cc6_1428x960.heic 424w, https://substackcdn.com/image/fetch/$s_!G4FY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db8467c-df21-4160-a85f-4fbbeba44cc6_1428x960.heic 848w, https://substackcdn.com/image/fetch/$s_!G4FY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db8467c-df21-4160-a85f-4fbbeba44cc6_1428x960.heic 1272w, https://substackcdn.com/image/fetch/$s_!G4FY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db8467c-df21-4160-a85f-4fbbeba44cc6_1428x960.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p>]]></content:encoded></item><item><title><![CDATA[Ollama: My First Steps into Local LLMs]]></title><description><![CDATA[I've been diving deep into Large Language Models lately, but frankly, the barrier to entry feels&#8230;high.]]></description><link>https://blog.jwgibanez.com/p/ollama-my-first-steps-into-local</link><guid isPermaLink="false">https://blog.jwgibanez.com/p/ollama-my-first-steps-into-local</guid><dc:creator><![CDATA[Jan Ibañez]]></dc:creator><pubDate>Mon, 17 Mar 2025 14:56:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!PDy9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0a9e9ee-5a02-430c-8703-a85c9aac3127_1024x512.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I've been diving deep into Large Language Models lately, but frankly, the barrier to entry feels&#8230;high. Cloud APIs are great for playing around, but I want <em>control</em>. I want to understand what&#8217;s happening under the hood. And that means running models locally. Enter Ollama.</p><p>Ollama promises a ridiculously easy way to run open-source LLMs on your machine. I was skeptical &#8211; &#8220;easy&#8221; and &#8220;LLM&#8221; rarely go together &#8211; but after spending an afternoon with it, I'm genuinely impressed. Here&#8217;s my experience getting set up and running my first model.</p><h3>Installation: Seriously, That's It?</h3><p>The installation process is almost offensively simple. Ollama supports macOS, Linux, and Windows. For a Linux machine, it&#8217;s literally a single command:</p><pre><code><code>curl -fsSL https://ollama.com/install.sh | sh</code></code></pre><p>That downloads and installs everything you need. Seriously. No wrestling with dependencies or CUDA drivers.</p><p>For MacOS and Windows, Ollama can be installed simply by running a file downloaded from the official site.</p><h3>Pulling Your First Model: Llama 3.1 is a Good Start</h3><p>Once installed, you pull models using the <code>ollama pull</code> command. Ollama has a curated library of models available. I started with <code>llama2</code>:</p><pre><code><code>ollama pull llama3.1:8b</code></code></pre><p>This downloads several gigabytes (around 4.9GB for Llama 3.1 with an 8B parameter size), so be patient and have a good internet connection. Ollama displays progress nicely, showing the download speed and estimated time remaining.</p><h3>Running the Model: Chatting with Llama 3.1</h3><p>After the download completes, running the model is equally straightforward:</p><pre><code><code>ollama run llama3.1:8b</code></code></pre><p>This launches an interactive chat session in your terminal. You can now type prompts and get responses from Llama 3.1! I started with a simple question:</p><pre><code><code>&gt; Where is Singapore located?
Singapore is a small island city-state located at the southern tip of the Malay Peninsula in Southeast Asia. It is situated:

* Off the south coast of Malaysia, separated by the Strait of Malacca
* At the northern end of the Riau Islands archipelago in Indonesia
* Approximately 137 kilometers (85 miles) north of the equator

Singapore shares a border with only one country: Malaysia, to its north. 
The island nation is connected to Malaysia via two causeways:

1. The Johor-Singapore Causeway connects Singapore to the Malaysian state 
of Johor.
2. The Tuas Second Link connects Singapore to the southern part of Johor.

Singapore's strategic location has made it a major hub for trade, finance, and transportation in Southeast Asia. Its unique blend of Asian culture and Western influence has also made it one of the most cosmopolitan cities in the world.</code></code></pre><p>Not groundbreaking, but it <em>works</em>. And it's running entirely locally!</p><h3>A Quick Test with Code: Python &amp; Ollama</h3><p>Ollama isn&#8217;t just for chat. You can also interact with models programmatically using its REST API. When running a model, Ollama opens up the API port at 11434.</p><p>Here&#8217;s a quick Python example:</p><pre><code><code>import requests

response = requests.post(
    "http://localhost:11434/api/generate",
    json={
        "model": "llama3.1:8b",
        "prompt": "Write a short poem about coding.",
    }
)

print(response.json()['response'])
</code></code></pre><p>This sends a prompt to the Llama 3.1 model and prints the generated text. It's incredibly easy to integrate into your existing projects.</p><p>By the way here is the output poem from the model:</p><blockquote><pre><code><code>Here is a short poem about coding:

Lines of code, a wondrous sight
Zeros and ones, in endless flight
I type and think, with fingers fast
Creating worlds, that will surely last

Variables declared, loops to spin
Functions called, with logic within
Errors corrected, with each new test
The beauty of code, I love the best

In silicon halls, my mind does roam
Where 1s and 0s become a digital home.</code></code></pre></blockquote><p>It&#8217;s sublime if you ask me!</p><h3>First Impressions &amp; Caveats</h3><p>Ollama is <em>remarkably</em> easy to use. It abstracts away a lot of the complexity involved in running LLMs locally, making it accessible even for those without deep machine learning expertise.</p><p>However, there are some things to keep in mind:</p><ul><li><p><strong>Hardware Requirements:</strong> Running LLMs requires significant resources. I have a reasonably powerful MacBook Pro M4 Max and Llama 3.1 with 8B parameter size runs exceptionally well. Larger models will need more RAM and potentially a GPU. So make sure you use an appropriate sized model or a powerful machine!</p></li><li><p><strong>Model Size:</strong> The downloaded model files take up considerable disk space.</p></li></ul><h3>What&#8217;s Next?</h3><p>I plan to experiment with different models on Ollama, explore its API further, and start looking at fine-tuning options. This is just the first few steps in my journey to understand LLMs from the ground up. Stay tuned for more updates!</p><p><strong>Resources:</strong></p><ul><li><p><a href="https://ollama.com">Ollama Website</a></p></li><li><p><a href="https://github.com/ollama/ollama/blob/main/docs/api.md">Ollama API Documentation</a></p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PDy9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0a9e9ee-5a02-430c-8703-a85c9aac3127_1024x512.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PDy9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0a9e9ee-5a02-430c-8703-a85c9aac3127_1024x512.heic 424w, https://substackcdn.com/image/fetch/$s_!PDy9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0a9e9ee-5a02-430c-8703-a85c9aac3127_1024x512.heic 848w, https://substackcdn.com/image/fetch/$s_!PDy9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0a9e9ee-5a02-430c-8703-a85c9aac3127_1024x512.heic 1272w, https://substackcdn.com/image/fetch/$s_!PDy9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0a9e9ee-5a02-430c-8703-a85c9aac3127_1024x512.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PDy9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0a9e9ee-5a02-430c-8703-a85c9aac3127_1024x512.heic" width="1024" height="512" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e0a9e9ee-5a02-430c-8703-a85c9aac3127_1024x512.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:512,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:6669,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.jwgibanez.com/i/159257957?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0a9e9ee-5a02-430c-8703-a85c9aac3127_1024x512.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!PDy9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0a9e9ee-5a02-430c-8703-a85c9aac3127_1024x512.heic 424w, https://substackcdn.com/image/fetch/$s_!PDy9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0a9e9ee-5a02-430c-8703-a85c9aac3127_1024x512.heic 848w, https://substackcdn.com/image/fetch/$s_!PDy9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0a9e9ee-5a02-430c-8703-a85c9aac3127_1024x512.heic 1272w, https://substackcdn.com/image/fetch/$s_!PDy9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0a9e9ee-5a02-430c-8703-a85c9aac3127_1024x512.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p>]]></content:encoded></item><item><title><![CDATA[Dart’s async/await]]></title><description><![CDATA[A No-Nonsense Guide to Asynchronous Programming]]></description><link>https://blog.jwgibanez.com/p/darts-asyncawait</link><guid isPermaLink="false">https://blog.jwgibanez.com/p/darts-asyncawait</guid><dc:creator><![CDATA[Jan Ibañez]]></dc:creator><pubDate>Sun, 16 Mar 2025 08:25:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-c-R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41caa8d3-1ca4-48fe-97ac-cea87196d906_1280x426.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As mobile developers, we live in a world of network requests, file I/O, and user interactions &#8211; all operations that take time. Blocking the main thread while waiting for these tasks is a recipe for unresponsive apps and frustrated users. That&#8217;s where asynchronous programming comes in. Dart makes it surprisingly elegant with <code>async</code> and <code>await</code>. This post cuts through the jargon and delivers a practical understanding of how to use them effectively.</p><h3><strong>The Problem: Synchronous vs. Asynchronous</strong></h3><p>Imagine ordering coffee. A <em>synchronous</em> approach would be you standing at the counter, waiting for the barista to finish your drink before doing anything else. Everything stops until the coffee is ready. This is simple but inefficient.</p><p>An <em>asynchronous</em> approach lets you place your order and then go do other things (check your phone, chat with a friend) while the barista prepares your coffee. You get notified when it&#8217;s ready. This keeps you productive and avoids unnecessary waiting.</p><p>In programming terms:</p><ul><li><p><strong>Synchronous:</strong> Code executes line by line, in order. Each operation must complete before the next one starts.</p></li><li><p><strong>Asynchronous:</strong> Operations can start without immediately blocking execution. The program continues to run other code while waiting for the asynchronous task to finish. When it <em>does</em> finish, a callback or signal notifies the program.</p></li></ul><p>Dart&#8217;s <code>async</code>/<code>await</code> is syntactic sugar built on top of Dart's <code>Future</code> and <code>Stream</code> classes, making asynchronous code look and feel more like synchronous code &#8211; dramatically improving readability.</p><h3><strong>Understanding Futures: The Foundation</strong></h3><p>Before diving into <code>async</code>/<code>await</code>, you need to grasp the concept of a <code>Future</code>. A <code>Future</code> represents a value that <em>may not be available yet</em>. Think of it as a promise to deliver a result at some point in the future.</p><pre><code><code>Future&lt;String&gt; fetchUserData(int userId) async {
  // Simulate fetching data from a network
  await Future.delayed(Duration(seconds: 2)); // Wait for 2 seconds
  return 'User Data for ID $userId';
}

void main() {
  print('Starting...');
  fetchUserData(123).then((data) =&gt; print(data)).catchError((error) =&gt; print('Error: $error'));
  print('Continuing execution...');
}
</code></code></pre><p>In this example, <code>fetchUserData</code> returns a <code>Future&lt;String&gt;</code>. The <code>.then()</code> method is used to handle the result when it becomes available. Notice that "Continuing execution..." prints <em>before</em> the user data &#8211; demonstrating asynchronous behavior. The <code>.catchError()</code> handles potential errors during the future's completion.</p><h3>Enter <code>async</code> and <code>await</code>: Making Asynchrony Readable</h3><p>This is where things get cleaner. The <code>async</code> keyword marks a function as asynchronous, allowing you to use <code>await</code> inside it. The <code>await</code> keyword pauses execution of the <code>async</code> function until the <code>Future</code> it's applied to completes. Crucially, it <em>doesn&#8217;t</em> block the main thread; Dart handles this efficiently in the background.</p><p>Let's rewrite the previous example using <code>async</code>/<code>await</code>:</p><pre><code><code>Future&lt;String&gt; fetchUserData(int userId) async {
  // Simulate fetching data from a network
  await Future.delayed(Duration(seconds: 2)); // Wait for 2 seconds
  return 'User Data for ID $userId';
}

void main() async { // Mark main as async too!
  print('Starting...');
  try {
    String userData = await fetchUserData(123);
    print(userData);
  } catch (error) {
    print('Error: $error');
  }
  print('Continuing execution...');
}
</code></code></pre><p>See how much more readable this is? The code flows linearly, as if it were synchronous. <code>await</code> handles the waiting and unwrapping of the <code>Future</code>'s result for you. We also use a <code>try...catch</code> block to handle potential errors &#8211; just like with synchronous code. Notice that <code>main()</code> <em>also</em> needs to be marked <code>async</code> when using <code>await</code>.</p><h3><strong>Key Rules &amp; Considerations:</strong></h3><ul><li><p><code>await</code><strong> only works inside an </strong><code>async</code><strong> function.</strong> Trying to use it outside will result in a compile-time error.</p></li><li><p><strong>Error Handling:</strong> Use <code>try...catch</code> blocks around <code>await</code> expressions to handle potential errors from the <code>Future</code>. Ignoring errors can lead to unexpected behavior.</p></li><li><p><strong>Return Types:</strong> An <code>async</code> function must return either a <code>Future</code> or a <code>Stream</code>. If it doesn't explicitly return anything, it implicitly returns a <code>Future&lt;void&gt;</code>.</p></li><li><p><strong>Performance:</strong> While <code>async</code>/<code>await</code> makes code readable, it doesn&#8217;t magically make asynchronous operations faster. It simply manages the concurrency more effectively.</p></li></ul><h3><strong>Beyond Basic Usage: Common Scenarios</strong></h3><ul><li><p><strong>Multiple Asynchronous Operations:</strong> You can <code>await</code> multiple <code>Future</code>s sequentially or use <code>Future.wait()</code> to run them concurrently.</p></li></ul><pre><code><code>Future&lt;void&gt; processData() async {
  var future1 = fetchUserData(1);
  var future2 = fetchDataFromDatabase();

  // Run both futures concurrently
  var results = await Future.wait([future1, future2]);

  print('Results: $results');
}
</code></code></pre><ul><li><p><strong>Streams:</strong> <code>async</code>/<code>await</code> also works with <code>Stream</code>s using the <code>await for</code> loop. This is useful for handling continuous streams of data.</p></li></ul><pre><code><code>Stream&lt;int&gt; numberStream() async* {
  for (int i = 0; i &lt; 5; i++) {
    await Future.delayed(Duration(seconds: 1));
    yield i;
  }
}

void main() async {
  await for (var number in numberStream()) {
    print('Received: $number');
  }
}
</code></code></pre><ul><li><p><strong>Combining </strong><code>async</code><strong>/</strong><code>await</code><strong> with other asynchronous patterns:</strong> You can seamlessly integrate <code>async</code>/<code>await</code> with other techniques like <code>Completer</code> and custom event handling.</p></li></ul><h3><strong>Common Pitfalls to Avoid:</strong></h3><ul><li><p><strong>Forgetting </strong><code>async</code><strong>:</strong> This is the most common mistake! Remember to mark your function as <code>async</code> when using <code>await</code>.</p></li><li><p><strong>Ignoring Errors:</strong> Always handle potential errors from <code>Future</code>s with <code>try...catch</code>.</p></li><li><p><strong>Overusing </strong><code>await</code><strong>:</strong> If you don't need the result of a <code>Future</code> immediately, consider running it in the background without <code>await</code>ing. This can improve performance.</p></li><li><p><strong>Blocking Operations within Async Functions</strong>: Avoid performing long-running <em>synchronous</em> operations inside an <code>async</code> function. This defeats the purpose of asynchrony and will still block the thread.</p></li></ul><h3><strong>Conclusion:</strong></h3><p>Dart&#8217;s <code>async</code>/<code>await</code> is a powerful tool for writing clean, readable, and efficient asynchronous code. By understanding the underlying concepts of <code>Future</code>s and how <code>async</code>/<code>await</code> builds upon them, you can unlock the full potential of Dart's concurrency features and build responsive, performant mobile applications. Don&#8217;t be afraid to experiment and practice &#8211; mastering asynchrony is a crucial skill for any serious Dart developer.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-c-R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41caa8d3-1ca4-48fe-97ac-cea87196d906_1280x426.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-c-R!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41caa8d3-1ca4-48fe-97ac-cea87196d906_1280x426.heic 424w, https://substackcdn.com/image/fetch/$s_!-c-R!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41caa8d3-1ca4-48fe-97ac-cea87196d906_1280x426.heic 848w, https://substackcdn.com/image/fetch/$s_!-c-R!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41caa8d3-1ca4-48fe-97ac-cea87196d906_1280x426.heic 1272w, https://substackcdn.com/image/fetch/$s_!-c-R!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41caa8d3-1ca4-48fe-97ac-cea87196d906_1280x426.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-c-R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41caa8d3-1ca4-48fe-97ac-cea87196d906_1280x426.heic" width="1280" height="426" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/41caa8d3-1ca4-48fe-97ac-cea87196d906_1280x426.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:426,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5590,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.jwgibanez.com/i/159168789?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41caa8d3-1ca4-48fe-97ac-cea87196d906_1280x426.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-c-R!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41caa8d3-1ca4-48fe-97ac-cea87196d906_1280x426.heic 424w, https://substackcdn.com/image/fetch/$s_!-c-R!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41caa8d3-1ca4-48fe-97ac-cea87196d906_1280x426.heic 848w, https://substackcdn.com/image/fetch/$s_!-c-R!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41caa8d3-1ca4-48fe-97ac-cea87196d906_1280x426.heic 1272w, https://substackcdn.com/image/fetch/$s_!-c-R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41caa8d3-1ca4-48fe-97ac-cea87196d906_1280x426.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p>]]></content:encoded></item><item><title><![CDATA[Proudly Launching International Transfers on YouTrip]]></title><description><![CDATA[Hey everyone, as a lead mobile app engineer at YouTrip, I&#8217;m thrilled to announce the recent release of a feature that I&#8217;ve been diligently working on for the past few months.]]></description><link>https://blog.jwgibanez.com/p/proudly-launching-international-transfers</link><guid isPermaLink="false">https://blog.jwgibanez.com/p/proudly-launching-international-transfers</guid><dc:creator><![CDATA[Jan Ibañez]]></dc:creator><pubDate>Fri, 14 Mar 2025 18:21:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-MSJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe219188f-be31-45a0-ba23-be6da2352980_2266x1182.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hey everyone, as a lead mobile app engineer at YouTrip, I&#8217;m thrilled to announce the recent release of a feature that I&#8217;ve been diligently working on for the past few months. Usually, I am heads-down coding, squashing bugs, and generally making things <em>work</em>. But sometimes you build something that feels genuinely impactful, and it deserves a bit more conversation. That&#8217;s definitely how I feel about our recent launch of overseas transfers within the YouTrip app.</p><p>YouTrip started back in 2018 with a pretty straightforward idea: make travel spending less painful. No more getting ripped off by foreign transaction fees, no more currency conversion headaches &#8211; just a simple way to manage your money while exploring the world. And we&#8217;ve been steadily chipping away at that goal ever since. (YouTrip currently services two markets: Singapore and Thailand.)</p><p>But something interesting started happening. We noticed users weren't <em>just</em> using YouTrip when they were traveling. They were topping up their wallets, managing funds, and treating it as a go-to digital wallet for local purchases. The question kept popping up: &#8220;Could we send money to family overseas?&#8221;</p><p>It felt like a natural extension of what we do &#8211; simplifying international finances. So, we started exploring, planning, and eventually&#8230; building. After months of work (and a soft launch towards the end of last year), we finally flipped the switch on March 3rd: YouTrip now lets you send money to over 40 countries. The remittance service is currently only available to Singapore users.</p><h3><strong>Why Add Remittance? It&#8217;s About Solving a Real Problem.</strong></h3><p>Currently, the remittance market is already packed with options. Companies like Wise, Revolut, and traditional banks have been at it for years. So why did we jump in? A few key reasons. First, our users were asking for it! Second, we had a solid foundation &#8211; an existing multi-currency wallet built to handle international transactions. We weren&#8217;t starting from zero. But most importantly, we saw a chance to do things <em>better</em>.</p><p>Many remittance services feel&#8230; clunky. Lots of upfront information, hidden fees, slow processing times. We wanted something cleaner, more transparent, and faster. And that's where the real challenge &#8211; and my personal pride in this project &#8211; came in.</p><h3><strong>The Devil&#8217;s in the Details: Making it Seamless on Mobile</strong></h3><p>From a technical perspective, this wasn&#8217;t just about adding a new feature; it was a deep dive into complex integrations. We needed to connect with payment networks around the globe - everything from traditional SWIFT transfers to faster local options like DuitNow (Malaysia), GCash (Philippines) and UPI (India). Each one speaks a different language, requires unique authentication, and has its own quirks.</p><p>But honestly, the biggest challenge &#8211; and where I spent most of my time &#8211; was crafting the <em>mobile experience</em>. It&#8217;s easy to build something that works; it's much harder to build something that feels effortless on your phone. We obsessed over every screen, every tap, every interaction. How could we present complex information (exchange rates, fees) in a clear and understandable way? How could we streamline the process while maintaining rock-solid security?</p><p>We opted for a modular architecture so adding new countries and payment channels won&#8217;t be a headache down the line. We also built in real-time notifications to keep users informed every step of the way. It was a lot of work, but seeing it all come together &#8211; a smooth, intuitive experience on your phone &#8211; is incredibly satisfying as an engineer.</p><h3><strong>What Makes YouTrip Transfers Different?</strong></h3><p>We think we&#8217;ve created something special:</p><ul><li><p><strong>Competitive Exchange Rates:</strong> We leverage our existing relationships to offer rates that stack up well against the competition.</p></li><li><p><strong>Transparent Fees:</strong> What you see is what you get. No hidden charges, no surprises.</p></li><li><p><strong>Speed &amp; Convenience:</strong> For popular currencies using DuitNow, GCash and UPI, transfers can be incredibly fast &#8211; sometimes instant!</p></li><li><p><strong>Flexibility:</strong> Send directly to a bank account or a mobile wallet where available.</p></li><li><p><strong>Security is Paramount:</strong> We&#8217;ve built security into every layer of the system, from KYC checks to transaction monitoring.</p></li><li><p><strong>Integrated Experience:</strong> If you're already using YouTrip, sending money feels natural and seamless.</p></li></ul><h3><strong>A Team Effort: Huge Thanks!</strong></h3><p>This launch wouldn&#8217;t have been possible without the incredible collaboration across so many teams at YouTrip. From Legal and Compliance ensuring we navigated regulations flawlessly, to Product for shaping the user journey, to our QA team relentlessly testing every scenario &#8211; everyone brought their A-game. Our UX Design team played a crucial role too, crafting an intuitive and seamless experience that truly puts the user first. I especially want to thank my fellow engineers who tackled complex integrations with unwavering dedication. It&#8217;s a privilege working alongside such talented and passionate individuals, and this success is truly a shared achievement.</p><h3><strong>Early Response &amp; What&#8217;s Next</strong></h3><p>The launch has been fantastic! Users are appreciating the simplicity and speed, especially around peak times like Chinese New Year. We&#8217;ve also seen great feedback on the transparency of our fees.</p><p>We're not stopping here. We&#8217;re already working on expanding to more countries, adding various payment channels, and building out impactful features. And, of course, we&#8217;ll continue refining the mobile experience based on user feedback.</p><p>As a software engineer, I&#8217;m incredibly proud to have contributed to this project. It's not just about lines of code; it's about solving a real problem for our users and making their lives a little bit easier. Knowing that YouTrip can now help people connect with loved ones back home is a really good feeling.</p><p>For Singapore and Thailand residents, I&#8217;d love for you to try our app on the <a href="https://apps.apple.com/us/app/youtrip/id1228562274">App Store</a> and <a href="https://play.google.com/store/apps/details?id=co.you.youapp">Google Play</a> stores. I am eager to hear your feedback!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-MSJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe219188f-be31-45a0-ba23-be6da2352980_2266x1182.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-MSJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe219188f-be31-45a0-ba23-be6da2352980_2266x1182.heic 424w, https://substackcdn.com/image/fetch/$s_!-MSJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe219188f-be31-45a0-ba23-be6da2352980_2266x1182.heic 848w, https://substackcdn.com/image/fetch/$s_!-MSJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe219188f-be31-45a0-ba23-be6da2352980_2266x1182.heic 1272w, https://substackcdn.com/image/fetch/$s_!-MSJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe219188f-be31-45a0-ba23-be6da2352980_2266x1182.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-MSJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe219188f-be31-45a0-ba23-be6da2352980_2266x1182.heic" width="1456" height="759" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e219188f-be31-45a0-ba23-be6da2352980_2266x1182.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:759,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:117435,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.jwgibanez.com/i/159081323?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe219188f-be31-45a0-ba23-be6da2352980_2266x1182.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-MSJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe219188f-be31-45a0-ba23-be6da2352980_2266x1182.heic 424w, https://substackcdn.com/image/fetch/$s_!-MSJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe219188f-be31-45a0-ba23-be6da2352980_2266x1182.heic 848w, https://substackcdn.com/image/fetch/$s_!-MSJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe219188f-be31-45a0-ba23-be6da2352980_2266x1182.heic 1272w, https://substackcdn.com/image/fetch/$s_!-MSJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe219188f-be31-45a0-ba23-be6da2352980_2266x1182.heic 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>]]></content:encoded></item><item><title><![CDATA[Finally! My New Machine Has Arrived (and LLM Adventures Await)]]></title><description><![CDATA[Okay, let's be honest.]]></description><link>https://blog.jwgibanez.com/p/finally-my-new-machine-has-arrived</link><guid isPermaLink="false">https://blog.jwgibanez.com/p/finally-my-new-machine-has-arrived</guid><dc:creator><![CDATA[Jan Ibañez]]></dc:creator><pubDate>Thu, 13 Mar 2025 14:43:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!h5gj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdca15f97-4282-4aca-bdfb-5a99c9baa01a.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Okay, let's be honest. Waiting for something to ship from the Apple online store feels like an eternity these days. But the wait is <strong>finally</strong> over. My new Macbook Pro arrived today, and the immediate feeling is&#8230; relief. Pure, unadulterated relief.</p><p>For those who know me, you know I'm a mobile app developer. I live and breathe code. And while my current (office) machine served me well, I'm always chasing that little bit more performance, that extra headroom for creativity. This new machine is a significant upgrade, and I'm genuinely excited to put it through its paces.</p><p>It's well-specced, as you&#8217;d expect. (I won't bore you with the exact configuration &#8211; you can probably guess it involves a hefty dose of RAM and a powerful chip.) But the specs aren&#8217;t just about bragging rights. They represent potential. Potential to build faster, iterate quicker, and tackle projects that felt just a <strong>little</strong> out of reach before.</p><h3>Beyond Mobile Apps: Diving into the World of LLMs</h3><p>My primary focus has always been mobile app development. I love crafting experiences for iOS and Android, and that&#8217;s not going to change. However, I've been spending the last few weeks down a serious rabbit hole: Large Language Models (LLMs).</p><p>I&#8217;m not talking about just <strong>using</strong> ChatGPT, Deepseek, or Claude. I'm talking about understanding the underlying technology. The architecture, the training processes, the nuances of prompt engineering. It's fascinating stuff. The sheer scale of these models is mind-boggling, and the potential impact they're going to have on everything from software development to creative writing is undeniable.</p><p>This new Macbook Pro isn&#8217;t just about faster builds and smoother animations. It's about providing the horsepower I need to actually <strong>learn</strong> and experiment with LLMs. Running local models, even smaller ones, can be surprisingly resource-intensive. And I&#8217;m planning on going beyond the basics. I want to understand how these models work, how to fine-tune them, and eventually, how to leverage them to build smarter, more efficient applications.</p><h3>Why This Matters (and Why You Should Care Too)</h3><p>Look, LLMs are <strong>everywhere</strong> right now. And the hype is justified. But the real power isn't just in the finished product (like a chatbot). It's in the ability to understand and manipulate the technology behind it. As developers, we need to be comfortable with this new paradigm. We need to be able to integrate these models into our workflows, build custom solutions, and ultimately, shape the future of AI.</p><p>This isn't just about keeping up with the latest trends. It's about expanding our skillset, opening up new opportunities, and becoming more valuable contributors.</p><h3>What's Next?</h3><p>My immediate plan is to set up a development environment, explore some introductory tutorials, and start playing around with smaller LLMs. I&#8217;m thinking of starting with something like Llama 3.1 and working my way up.</p><p>I'm planning to document my journey &#8211; the successes, the failures, and everything in between. Consider this the first post in a series about my LLM learning adventure. If you&#8217;re interested in learning alongside me, be sure to subscribe!</p><p>Let me know in the comments if you're also exploring the world of LLMs, or if you have any recommendations for resources or projects. Let&#8217;s learn together!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!h5gj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdca15f97-4282-4aca-bdfb-5a99c9baa01a.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!h5gj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdca15f97-4282-4aca-bdfb-5a99c9baa01a.heic 424w, https://substackcdn.com/image/fetch/$s_!h5gj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdca15f97-4282-4aca-bdfb-5a99c9baa01a.heic 848w, https://substackcdn.com/image/fetch/$s_!h5gj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdca15f97-4282-4aca-bdfb-5a99c9baa01a.heic 1272w, https://substackcdn.com/image/fetch/$s_!h5gj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdca15f97-4282-4aca-bdfb-5a99c9baa01a.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!h5gj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdca15f97-4282-4aca-bdfb-5a99c9baa01a.heic" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dca15f97-4282-4aca-bdfb-5a99c9baa01a.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:921814,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.jwgibanez.com/i/158994060?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdca15f97-4282-4aca-bdfb-5a99c9baa01a.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!h5gj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdca15f97-4282-4aca-bdfb-5a99c9baa01a.heic 424w, https://substackcdn.com/image/fetch/$s_!h5gj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdca15f97-4282-4aca-bdfb-5a99c9baa01a.heic 848w, https://substackcdn.com/image/fetch/$s_!h5gj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdca15f97-4282-4aca-bdfb-5a99c9baa01a.heic 1272w, https://substackcdn.com/image/fetch/$s_!h5gj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdca15f97-4282-4aca-bdfb-5a99c9baa01a.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p>]]></content:encoded></item><item><title><![CDATA[Start of something new]]></title><description><![CDATA[Today, I am embarking on a renewed journey in trying to make my thoughts more tangible, that is, by writing and sharing them via a blogging platform.]]></description><link>https://blog.jwgibanez.com/p/start-of-something-new</link><guid isPermaLink="false">https://blog.jwgibanez.com/p/start-of-something-new</guid><dc:creator><![CDATA[Jan Ibañez]]></dc:creator><pubDate>Sun, 09 Mar 2025 04:18:13 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/534db2c2-0ebc-4d2b-94b8-192d3b62c90d_1200x800.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.jwgibanez.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.jwgibanez.com/subscribe?"><span>Subscribe now</span></a></p><h2>Why this and why now?</h2><p>Lately, I have been finding myself trying to look for another creative outlet, other than doing photography, which I have been doing less frequently than I wanted to.</p><p>I&#8217;ve been learning new things recently, one of which is how LLMs work. I have poured some time watching videos on YouTube and reading online sources on how this emergent technology works and its potential effects&#8212; both good and bad.</p><p>But I feel just learning about the technology is not enough. And so, I committed myself to diving more deeply into it.</p><p>I recently bought a new personal Mac machine so I can do actual experiments on the topic. I am hoping that I can distill whatever I learned into articles that I can post over here.</p><h2>The community I am looking for</h2><p>By having this publication on Substack, I am hoping to find like-minded people. I plan to subscribe to others&#8217; take on the topic, as well as others&#8217;, and learn from others&#8217; experiences.</p><p>Hopefully, I can build my expertise up as well, and contribute and inspire others as well.</p><h2>Conclusions</h2><p>And so today, I am hoping that the current push will be a long-term one. And I hope that I get all the inspiration and energy to persist and improve.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.jwgibanez.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 Jan I.! 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></p>]]></content:encoded></item></channel></rss>