<?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[Solodeveling's Substack]]></title><description><![CDATA[My personal Substack]]></description><link>https://www.solodeveling.dev</link><image><url>https://substackcdn.com/image/fetch/$s_!2jLb!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd330302c-7097-4615-a9ac-133f590938cd_144x144.png</url><title>Solodeveling&apos;s Substack</title><link>https://www.solodeveling.dev</link></image><generator>Substack</generator><lastBuildDate>Thu, 30 Jul 2026 10:00:32 GMT</lastBuildDate><atom:link href="https://www.solodeveling.dev/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Solodeveling Dev]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[solodeveling@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[solodeveling@substack.com]]></itunes:email><itunes:name><![CDATA[Solodeveling Dev]]></itunes:name></itunes:owner><itunes:author><![CDATA[Solodeveling Dev]]></itunes:author><googleplay:owner><![CDATA[solodeveling@substack.com]]></googleplay:owner><googleplay:email><![CDATA[solodeveling@substack.com]]></googleplay:email><googleplay:author><![CDATA[Solodeveling Dev]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[How to Package a GTK App as a Native macOS .app Bundle (Icons, Resources & Code snippets Guide)]]></title><description><![CDATA[So you built a cool little app, it works great on your machine, and now you want to actually give it to people without them opening a terminal and questioning their life choices &#128517;.]]></description><link>https://www.solodeveling.dev/p/how-to-package-a-gtk-app-as-a-native</link><guid isPermaLink="false">https://www.solodeveling.dev/p/how-to-package-a-gtk-app-as-a-native</guid><dc:creator><![CDATA[Solodeveling Dev]]></dc:creator><pubDate>Wed, 15 Jul 2026 14:30:35 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/68937dba-070f-47d6-aa71-2925d394d31c_1024x880.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>So you built a cool little app, it works great on your machine, and now you want to actually give it to people without them opening a terminal and questioning their life choices &#128517;. That was me a few weeks ago, staring at my timer app wondering how to turn it into something that feels native when a Mac friend double-clicks it &#8212; no weird icons, no missing background, just a normal-looking .app. Turns out packaging a GTK app for macOS involves a surprising number of small, fiddly steps: generating the right icon resolutions, bundling your resources so the app can actually find them, and gluing it all together into a proper .app folder. In this third part of the series, I&#8217;ll walk you through exactly how I did it &#8212; mistakes, workarounds, and all.</p><p>Here are the things you will read in this article:</p><ul><li><p>Why Native Packaging Matters for Cross-Platform Apps</p></li><li><p>Generating a Multi-Resolution App Icon (.icns) for macOS</p></li><li><p>Bundling Assets with GResource: Icons, Backgrounds &amp; Metadata</p></li><li><p>Building the .app Bundle: Automating It with Makefile</p></li><li><p>Key Takeaways &amp; What&#8217;s Next</p></li></ul><h2>Why Native Packaging Matters for Cross-Platform Apps</h2><p>If you&#8217;ve ever sent a Linux binary to a Mac friend and watched them squint at a terminal wondering what to do with it, you already know the problem. A cross-platform app that runs &#8220;everywhere&#8221; isn&#8217;t the same as an app that runs like any other native app. On macOS specifically, that means a proper icon, a real .app bundle, and resources that don&#8217;t break just because the file structure changed. That&#8217;s what we&#8217;re fixing in this part of the series.</p><h2>Generating a Multi-Resolution App Icon (.icns) for macOS</h2><p>Select one image as your application icon, I am calling it here app-icon.png. It could be something like the image below. Notice that I already built it curved to be even more similar to Mac native apps.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JxXc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43913a77-5cd1-4973-a04c-4a2782375087_720x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JxXc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43913a77-5cd1-4973-a04c-4a2782375087_720x720.png 424w, https://substackcdn.com/image/fetch/$s_!JxXc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43913a77-5cd1-4973-a04c-4a2782375087_720x720.png 848w, https://substackcdn.com/image/fetch/$s_!JxXc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43913a77-5cd1-4973-a04c-4a2782375087_720x720.png 1272w, https://substackcdn.com/image/fetch/$s_!JxXc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43913a77-5cd1-4973-a04c-4a2782375087_720x720.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JxXc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43913a77-5cd1-4973-a04c-4a2782375087_720x720.png" width="720" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/43913a77-5cd1-4973-a04c-4a2782375087_720x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;app-icon.png&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="app-icon.png" title="app-icon.png" srcset="https://substackcdn.com/image/fetch/$s_!JxXc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43913a77-5cd1-4973-a04c-4a2782375087_720x720.png 424w, https://substackcdn.com/image/fetch/$s_!JxXc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43913a77-5cd1-4973-a04c-4a2782375087_720x720.png 848w, https://substackcdn.com/image/fetch/$s_!JxXc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43913a77-5cd1-4973-a04c-4a2782375087_720x720.png 1272w, https://substackcdn.com/image/fetch/$s_!JxXc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43913a77-5cd1-4973-a04c-4a2782375087_720x720.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p> Then, once you have your app-icon image, you need to convert it to multiple resolutions as it is encouraged in the Apple application development documentation as a good practice. Basically, what it does is that by having these multiple resolutions, they could guarantee your app will be shown on different MacOS versions and form factors(old Macs and Macs with very different screen sizes). These are the commands you can execute to get multiple versions of your app-icon in multiple resolutions: </p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:&quot;69e4ef51-ae90-4da6-98d5-690fbc41af08&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">sips -z 16 16 assets/app-icon.png --out packaging/macos/AppIcon.iconset/icon_16x16.png 
sips -z 32 32 assets/app-icon.png --out packaging/macos/AppIcon.iconset/icon_16x16@2x.png
sips -z 32 32 assets/app-icon.png --out packaging/macos/AppIcon.iconset/icon_32x32.png
sips -z 64 64 assets/app-icon.png --out packaging/macos/AppIcon.iconset/icon_32x32@2x.png</code></pre></div><p>After generating files with multiple resolution sizes to multiple architectures, you need to compact them in a format expected by MacOS(.iconset), where all application images in all expected sizes/resolutions for the app will be. You can do that with the following command:<br></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:&quot;2b8a2661-b8f2-4743-b66e-d1a2fdb5e527&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">iconutil -c icns packaging/macos/AppIcon.iconset </code></pre></div><h2>Bundling Assets with GResource: Icons, Backgrounds &amp; Metadata</h2><p>With .app or with native apps, you do not get to use the images or resources as you were using before, like loading them from a local relative path from disk, they need to get bundled together with everything within the same .app folder. So for the wrapper to be able to package your assets and images the way you want, you need to write a description file. In this project, I am calling resources.xml, and here it is:</p><pre><code>&lt;?xml version=&#8221;1.0&#8221; encoding=&#8221;UTF-8&#8221;?&gt;
&lt;gresources&gt;
&lt;gresource prefix=&#8221;app-background&#8221;&gt;
&lt;file&gt;assets/creation-time-bg.png&lt;/file&gt;
&lt;/gresource&gt;
&lt;/gresources&gt;</code></pre><p>This resources.xml file, after compiling it, produces an application data bundle file called GResource. Making it <code>creation-time-bg.png</code> file available to be accessed by the running application. You can compile the GResource file with the commands below:</p><pre><code>glib-compile-resources --generate --generate-source resources.xml
glib-compile-resources --generate --generate-header resources.xml

# Also add resources.c generated to your compilation line-up
$(CC) main.c resources.c -o $(TARGET) $(CFLAGS) $(LIBS)
</code></pre><h2>Building the .app Bundle: Automating It with Makefile</h2><p>After doing all of the above, now you can rest and enjoy, right? &#128517; Now it is simple you just need to convert everything to one folder .app, in our case CreationTimer.app, and if you placed everything where it should be and followed this article by the book, you will have a native-like macOS application. In any case, I added to the Makefile of our application to make it easy for me and you &#128521; to test multiple icons pretty fast, here is the Makefile target I created for this:</p><pre><code>bundle: my_gtk_app

&#9;./generate_icons.sh
&#9;mkdir -p $(APP)
&#9;mkdir -p $(APP)/Contents/MacOS
&#9;mkdir -p $(APP)/Contents/Resources

&#9;cp my_gtk_app $(APP)/Contents/MacOS/CreationTimer
&#9;cp packaging/macos/Info.plist $(APP)/Contents/
&#9;cp packaging/macos/AppIcon.icns $(APP)/Contents/Resources/
</code></pre><h1>Key Takeaways &amp; What&#8217;s Next</h1><p>Packaging for macOS taught me that creating a MacOS &#8220;native-app&#8221; is mostly about respecting a platform&#8217;s conventions(and documentation) &#8212; icons in the right resolutions, resources bundled the way the OS expects, and a folder structure it recognizes as an app rather than a pile of files. None of it is hard on its own, but it&#8217;s easy to get wrong in small, silent ways (ask me about the images that didn&#8217;t load &#128517;).</p><p>Next up in this series: I&#8217;ll be cross-compiling this same app for Linux and Windows, and sharing what breaks, what surprises me, and how the packaging story differs on each platform. If macOS was about fitting in, I have a feeling Windows and Linux will each come with their own flavor of &#8220;fun&#8221;.</p><p>As always, feedback is welcome &#8212; I&#8217;m still finding my voice here, so tell me what&#8217;s working and what isn&#8217;t.</p><p>As always github link for our projects is here: <a href="https://github.com/solodevelingdev/creation-timer-app">https://github.com/solodevelingdev/creation-timer-app </a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.solodeveling.dev/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 Solodeveling's Substack! 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><item><title><![CDATA[Wrestling with GTK4: Making our app more Useful and Prettier]]></title><description><![CDATA[On the first post of this series Part 1 we were exploring a I wield idea of developing a Timer native App for MacOS(crazy I know).]]></description><link>https://www.solodeveling.dev/p/wrestling-with-gtk4-making-our-app</link><guid isPermaLink="false">https://www.solodeveling.dev/p/wrestling-with-gtk4-making-our-app</guid><dc:creator><![CDATA[Solodeveling Dev]]></dc:creator><pubDate>Tue, 07 Jul 2026 12:02:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FWsf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c7dedbc-3e56-4752-a782-41e958303220_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>On the first post of this series <a href="https://substack.com/@solodevelingdev/p-203540119">Part 1</a> we were exploring a I wield idea of mine of developing a Timer native App for MacOS(crazy I know). I had a lot of fun writting the app and writting an article about it so I would like to thank y&#8217;all that read the article, it means the world to me, next step is to help you guys to write me a comment( if you are still reading comment C &gt; Rust ) &#128517;.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FWsf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c7dedbc-3e56-4752-a782-41e958303220_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FWsf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c7dedbc-3e56-4752-a782-41e958303220_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!FWsf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c7dedbc-3e56-4752-a782-41e958303220_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!FWsf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c7dedbc-3e56-4752-a782-41e958303220_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!FWsf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c7dedbc-3e56-4752-a782-41e958303220_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FWsf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c7dedbc-3e56-4752-a782-41e958303220_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2c7dedbc-3e56-4752-a782-41e958303220_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Pasted image 20260703135010.png&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Pasted image 20260703135010.png" title="Pasted image 20260703135010.png" srcset="https://substackcdn.com/image/fetch/$s_!FWsf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c7dedbc-3e56-4752-a782-41e958303220_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!FWsf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c7dedbc-3e56-4752-a782-41e958303220_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!FWsf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c7dedbc-3e56-4752-a782-41e958303220_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!FWsf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c7dedbc-3e56-4752-a782-41e958303220_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Okay on the first post I told you I would like to create more stuff, instead of keep on trend of content consuming we live, inspired by Millionaire Fastlane from MJ De Marco, past episode I created the MVP of a timer(if you will). This time I made it look more pleasant &#128517;, to make this timer data useful sending to the &#9729;&#65039; and learned a bunch stuff on how to make GTK4 obey your orders(for the most part).</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.solodeveling.dev/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 Solodeveling's Substack! 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>Here are the things you will read on this article: - How to perform HTTP Requests in C</p><h2>HTTP Requests in C</h2><p>To be able to make our app useful(yes it is our app we are building it together right ? &#128517;) we need to gather this information of how much time we spent creating, there are several ways of doing it via git commit, via Google Forms/Sheets integration, via Obsidian files but I choose the Google Sheets path because it is quick and easy.</p><p>On this part I will explain you the backend part of the solution, the part that runs locally. A common Linux/Mac command for performing HTTP Requests is Curl and for our luck there is a library called libcurl that enables us to do everything we do on the command line with curl also with code in C. Did I told you we can send parameters for a POST request via json as we do in Postman and other applications, cool right ? Below you can see everything you need to integrate this to your solution:</p><pre><code>include &lt;curl/curl.h&gt;
# ...
CURL *curl = curl_easy_init();
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, &#8220;Content-Type: application/json&#8221;);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
const char *url = &#8220;&lt;add-your-googlesheets-url-here&gt;&#8221;; 
char post_data[256]; = &#8220;&lt;add-your-data&gt;&#8221;;
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data);
// Performs http POST using curl
CURLcode res = curl_easy_perform(curl);
// Cleaning up after curl is performed freeing up all resources
curl_easy_cleanup(curl);
// Removes all traces of a previously built curl_slist linked list
curl_slist_free_all(headers);
</code></pre><p>Then if <code>response=CURLE_OK</code> data was transmitter successfully!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hdle!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa46357ca-83fe-4e52-9a13-8da55e664da5_986x842.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hdle!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa46357ca-83fe-4e52-9a13-8da55e664da5_986x842.png 424w, https://substackcdn.com/image/fetch/$s_!hdle!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa46357ca-83fe-4e52-9a13-8da55e664da5_986x842.png 848w, https://substackcdn.com/image/fetch/$s_!hdle!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa46357ca-83fe-4e52-9a13-8da55e664da5_986x842.png 1272w, https://substackcdn.com/image/fetch/$s_!hdle!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa46357ca-83fe-4e52-9a13-8da55e664da5_986x842.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hdle!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa46357ca-83fe-4e52-9a13-8da55e664da5_986x842.png" width="986" height="842" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a46357ca-83fe-4e52-9a13-8da55e664da5_986x842.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:842,&quot;width&quot;:986,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Pasted image 20260704105443.png&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Pasted image 20260704105443.png" title="Pasted image 20260704105443.png" srcset="https://substackcdn.com/image/fetch/$s_!hdle!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa46357ca-83fe-4e52-9a13-8da55e664da5_986x842.png 424w, https://substackcdn.com/image/fetch/$s_!hdle!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa46357ca-83fe-4e52-9a13-8da55e664da5_986x842.png 848w, https://substackcdn.com/image/fetch/$s_!hdle!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa46357ca-83fe-4e52-9a13-8da55e664da5_986x842.png 1272w, https://substackcdn.com/image/fetch/$s_!hdle!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa46357ca-83fe-4e52-9a13-8da55e664da5_986x842.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Get your info to the Cloud &#9729;&#65039;</h2><p>The part of the solution being executed on the Cloud is really quick and simple. Create a Google Sheet, then go to the Extensions Tab and click on App Scripts extension(showed on the images below).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Hclb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0343042-e36c-4910-955b-ea6e4c2b719e_1718x596.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hclb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0343042-e36c-4910-955b-ea6e4c2b719e_1718x596.png 424w, https://substackcdn.com/image/fetch/$s_!Hclb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0343042-e36c-4910-955b-ea6e4c2b719e_1718x596.png 848w, https://substackcdn.com/image/fetch/$s_!Hclb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0343042-e36c-4910-955b-ea6e4c2b719e_1718x596.png 1272w, https://substackcdn.com/image/fetch/$s_!Hclb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0343042-e36c-4910-955b-ea6e4c2b719e_1718x596.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hclb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0343042-e36c-4910-955b-ea6e4c2b719e_1718x596.png" width="1456" height="505" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d0343042-e36c-4910-955b-ea6e4c2b719e_1718x596.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:505,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Pasted image 20260704105901.png&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Pasted image 20260704105901.png" title="Pasted image 20260704105901.png" srcset="https://substackcdn.com/image/fetch/$s_!Hclb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0343042-e36c-4910-955b-ea6e4c2b719e_1718x596.png 424w, https://substackcdn.com/image/fetch/$s_!Hclb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0343042-e36c-4910-955b-ea6e4c2b719e_1718x596.png 848w, https://substackcdn.com/image/fetch/$s_!Hclb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0343042-e36c-4910-955b-ea6e4c2b719e_1718x596.png 1272w, https://substackcdn.com/image/fetch/$s_!Hclb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0343042-e36c-4910-955b-ea6e4c2b719e_1718x596.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you want you can copy and paste the code below but this time change it to the inner workings of your application here my script is looking for POST data and extracting minutes and seconds form this http request, you should then modify to whatever your application is sending.</p><pre><code>function doPost(e) {
  try {
    const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(&#8221;Sheet1&#8221;);

    const data = JSON.parse(e.postData.contents);

    sheet.appendRow([
      new Date(),
      data.minutes,
      data.seconds
    ]);

    return ContentService
      .createTextOutput(JSON.stringify({
        success: true
      }))
      .setMimeType(ContentService.MimeType.JSON);

  } catch (err) {
    return ContentService
      .createTextOutput(JSON.stringify({
        success: false,
        error: err.toString()
      }))
      .setMimeType(ContentService.MimeType.JSON);
  }
}
</code></pre><p>Then you deploy this script with Google and your Google Sheet will be listening to POST requests and if you did a good job of not publishing your Sheets link everywhere or on git for example &#128517; you will be fine. One thing you can do is to have sensitive links outside of your main application on files that are not being uploaded to git for example. Going back to GoogleSheets talk hit Deploy and you are done. Congratulations now you have your first C application sending data to the Cloud completely for free.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xi0C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3bc6482-7c2a-472b-aea3-b7d9ecb5355c_488x96.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xi0C!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3bc6482-7c2a-472b-aea3-b7d9ecb5355c_488x96.png 424w, https://substackcdn.com/image/fetch/$s_!xi0C!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3bc6482-7c2a-472b-aea3-b7d9ecb5355c_488x96.png 848w, https://substackcdn.com/image/fetch/$s_!xi0C!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3bc6482-7c2a-472b-aea3-b7d9ecb5355c_488x96.png 1272w, https://substackcdn.com/image/fetch/$s_!xi0C!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3bc6482-7c2a-472b-aea3-b7d9ecb5355c_488x96.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xi0C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3bc6482-7c2a-472b-aea3-b7d9ecb5355c_488x96.png" width="488" height="96" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e3bc6482-7c2a-472b-aea3-b7d9ecb5355c_488x96.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:96,&quot;width&quot;:488,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Pasted image 20260704105943.png&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Pasted image 20260704105943.png" title="Pasted image 20260704105943.png" srcset="https://substackcdn.com/image/fetch/$s_!xi0C!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3bc6482-7c2a-472b-aea3-b7d9ecb5355c_488x96.png 424w, https://substackcdn.com/image/fetch/$s_!xi0C!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3bc6482-7c2a-472b-aea3-b7d9ecb5355c_488x96.png 848w, https://substackcdn.com/image/fetch/$s_!xi0C!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3bc6482-7c2a-472b-aea3-b7d9ecb5355c_488x96.png 1272w, https://substackcdn.com/image/fetch/$s_!xi0C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3bc6482-7c2a-472b-aea3-b7d9ecb5355c_488x96.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Now you can do anything you want with the data from the Cloud side, like plot beautiful graphs or take it one step further and integrate it to some dashboard of yours, where you could make this data more visible to you.</p><h2>How to Set and Customize Application Backgrounds</h2><p>Since our application is already &#8220;functional&#8221;, lets make it beautiful...well well well, there are couple of ways you can do this inside GTK framework, the first one is to use the css provider we were using before to set the background color to RED to now change <code>background-image</code>, and then job done, right ? Right ? &#128517; Not exactly...</p><p>So with the CSS solution you should be able to change no problem(Example images below) but if you want to control things like will this background picture be repeating, will it tightly fit the size of the window application ? You can still solve this things with CSS but documentation start to get scarce in my opinion.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!l6yX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54c1064d-cf48-48f5-8b07-47d178438018_1024x880.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!l6yX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54c1064d-cf48-48f5-8b07-47d178438018_1024x880.png 424w, https://substackcdn.com/image/fetch/$s_!l6yX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54c1064d-cf48-48f5-8b07-47d178438018_1024x880.png 848w, https://substackcdn.com/image/fetch/$s_!l6yX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54c1064d-cf48-48f5-8b07-47d178438018_1024x880.png 1272w, https://substackcdn.com/image/fetch/$s_!l6yX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54c1064d-cf48-48f5-8b07-47d178438018_1024x880.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!l6yX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54c1064d-cf48-48f5-8b07-47d178438018_1024x880.png" width="1024" height="880" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/54c1064d-cf48-48f5-8b07-47d178438018_1024x880.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:880,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:348088,&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://solodeveling.substack.com/i/205754885?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54c1064d-cf48-48f5-8b07-47d178438018_1024x880.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_!l6yX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54c1064d-cf48-48f5-8b07-47d178438018_1024x880.png 424w, https://substackcdn.com/image/fetch/$s_!l6yX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54c1064d-cf48-48f5-8b07-47d178438018_1024x880.png 848w, https://substackcdn.com/image/fetch/$s_!l6yX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54c1064d-cf48-48f5-8b07-47d178438018_1024x880.png 1272w, https://substackcdn.com/image/fetch/$s_!l6yX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54c1064d-cf48-48f5-8b07-47d178438018_1024x880.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Here is the code on how you would do it with CSS, finding the correct path is a bit finicky but using the code below you should be able to do it for your own application.</p><pre><code>const char *css =
&#8220;.background {&#8221;
&#8220;  background-image: url(\&#8221;file:///&lt;absolute-path-for-background-img&gt;\&#8221;);&#8221;
&#8220;}&#8221;;
</code></pre><p>I ended it up going back to gtk_picture and I feel like it gives me much more control over the image shown on the application and also if I want this tile repeating effect to happen or not. Here it is how you can use it.</p><pre><code>background = gtk_picture_new_for_resource(&#8221;app-background/assets/creation-time-bg.png&#8221;);
gtk_picture_set_can_shrink(GTK_PICTURE(background), TRUE);
gtk_picture_set_content_fit(GTK_PICTURE(background),GTK_CONTENT_FIT_COVER); 
</code></pre><h1>The End for now ...</h1><p>I hope you liked and learned something with this post I did not want to make it 100% tutorial again, this time I added more code to it because I also found a lack of examples for things like using json parameters with libcurl in C, I hope you liked the lessons I shared and the problems I spent the most amount of neurons on it past weekend. Please any feedback is welcomed it is my second post on this platform and I am still want to find my voice, and maybe one day I can do funnier and more informative posts like other creators but I know that even them started somewhere.</p><p>The code for the whole application you can checkout here : <a href="https://github.com/solodevelingdev/creation-timer-app">creation-timer-app</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Oi_7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcb290fe-33e9-4ca2-8b63-158a3fba653e_1024x880.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Oi_7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcb290fe-33e9-4ca2-8b63-158a3fba653e_1024x880.png 424w, https://substackcdn.com/image/fetch/$s_!Oi_7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcb290fe-33e9-4ca2-8b63-158a3fba653e_1024x880.png 848w, https://substackcdn.com/image/fetch/$s_!Oi_7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcb290fe-33e9-4ca2-8b63-158a3fba653e_1024x880.png 1272w, https://substackcdn.com/image/fetch/$s_!Oi_7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcb290fe-33e9-4ca2-8b63-158a3fba653e_1024x880.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Oi_7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcb290fe-33e9-4ca2-8b63-158a3fba653e_1024x880.png" width="1024" height="880" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bcb290fe-33e9-4ca2-8b63-158a3fba653e_1024x880.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:880,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:310470,&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://solodeveling.substack.com/i/205754885?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcb290fe-33e9-4ca2-8b63-158a3fba653e_1024x880.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_!Oi_7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcb290fe-33e9-4ca2-8b63-158a3fba653e_1024x880.png 424w, https://substackcdn.com/image/fetch/$s_!Oi_7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcb290fe-33e9-4ca2-8b63-158a3fba653e_1024x880.png 848w, https://substackcdn.com/image/fetch/$s_!Oi_7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcb290fe-33e9-4ca2-8b63-158a3fba653e_1024x880.png 1272w, https://substackcdn.com/image/fetch/$s_!Oi_7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcb290fe-33e9-4ca2-8b63-158a3fba653e_1024x880.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><br></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.solodeveling.dev/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 Solodeveling's Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Reduce the Scope, Stick to the Schedule - Lessons on Coding Mastery/Consistency]]></title><description><![CDATA[We&#8217;ve all done it: we start learning a new language or studying for a certification, life gets busy, and 4 weeks later the project is abandoned.]]></description><link>https://www.solodeveling.dev/p/reduce-the-scope-stick-to-the-schedule</link><guid isPermaLink="false">https://www.solodeveling.dev/p/reduce-the-scope-stick-to-the-schedule</guid><dc:creator><![CDATA[Solodeveling Dev]]></dc:creator><pubDate>Mon, 29 Jun 2026 11:16:04 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/1461d65e-4a76-4f60-9378-7c47e744dc9e_1200x630.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We&#8217;ve all done it: we start learning a new language or certification, life gets busy, and 4 weeks later the project is abandoned. Let&#8217;s stop this trend.</p><p>This weekend I was in the car listening to the interview of James Clear at Diary of a CEO with Steven Barlett and man I really miss the vibe and knowledge of James Clear orbiting my neurons, my synapses feel like this podcast was a <strong>reward</strong> and the difficulties I am having on my learning and study practices are the <strong>cue</strong>. The question is what did I learn or re-learned on this podcast that could enable me to come up with a <strong>response</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_!oup6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1fc4772-09b6-421c-a75b-05b55f1b2e34_1411x1114.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oup6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1fc4772-09b6-421c-a75b-05b55f1b2e34_1411x1114.png 424w, https://substackcdn.com/image/fetch/$s_!oup6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1fc4772-09b6-421c-a75b-05b55f1b2e34_1411x1114.png 848w, https://substackcdn.com/image/fetch/$s_!oup6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1fc4772-09b6-421c-a75b-05b55f1b2e34_1411x1114.png 1272w, https://substackcdn.com/image/fetch/$s_!oup6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1fc4772-09b6-421c-a75b-05b55f1b2e34_1411x1114.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oup6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1fc4772-09b6-421c-a75b-05b55f1b2e34_1411x1114.png" width="1411" height="1114" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f1fc4772-09b6-421c-a75b-05b55f1b2e34_1411x1114.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1114,&quot;width&quot;:1411,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;ChatGPT Image Jun 27, 2026, 11_27_07 AM.png&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="ChatGPT Image Jun 27, 2026, 11_27_07 AM.png" title="ChatGPT Image Jun 27, 2026, 11_27_07 AM.png" srcset="https://substackcdn.com/image/fetch/$s_!oup6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1fc4772-09b6-421c-a75b-05b55f1b2e34_1411x1114.png 424w, https://substackcdn.com/image/fetch/$s_!oup6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1fc4772-09b6-421c-a75b-05b55f1b2e34_1411x1114.png 848w, https://substackcdn.com/image/fetch/$s_!oup6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1fc4772-09b6-421c-a75b-05b55f1b2e34_1411x1114.png 1272w, https://substackcdn.com/image/fetch/$s_!oup6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1fc4772-09b6-421c-a75b-05b55f1b2e34_1411x1114.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p> Lately, I have been falling out of my routine of refreshing my knowledge and my muscular memory in C. It is not like I was ever really good at this language at any part of my life but there were moments where I was decent at it a long time ago and all this AI Hype is making me more and more motivated to learn C again(contraintuitive I know). I even went back to a cheesy book I read years ago and I developed some skills with it, yep you can hate me all you want but it was the HeadFirst C from O&#8217;Reilly. There is something on that 90&#8217;s humor/nostalgia that makes me engage more with the material. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZqIC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7ef341-9151-477e-bb95-8f72f9443575_865x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZqIC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7ef341-9151-477e-bb95-8f72f9443575_865x1000.png 424w, https://substackcdn.com/image/fetch/$s_!ZqIC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7ef341-9151-477e-bb95-8f72f9443575_865x1000.png 848w, https://substackcdn.com/image/fetch/$s_!ZqIC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7ef341-9151-477e-bb95-8f72f9443575_865x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!ZqIC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7ef341-9151-477e-bb95-8f72f9443575_865x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZqIC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7ef341-9151-477e-bb95-8f72f9443575_865x1000.png" width="865" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5f7ef341-9151-477e-bb95-8f72f9443575_865x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:865,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Pasted image 20260629065304.png&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Pasted image 20260629065304.png" title="Pasted image 20260629065304.png" srcset="https://substackcdn.com/image/fetch/$s_!ZqIC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7ef341-9151-477e-bb95-8f72f9443575_865x1000.png 424w, https://substackcdn.com/image/fetch/$s_!ZqIC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7ef341-9151-477e-bb95-8f72f9443575_865x1000.png 848w, https://substackcdn.com/image/fetch/$s_!ZqIC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7ef341-9151-477e-bb95-8f72f9443575_865x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!ZqIC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7ef341-9151-477e-bb95-8f72f9443575_865x1000.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>But going back to the point I started reading the book and solving the code exercises, couple of pages here and there. After 2-4 weeks motivation evaporated and work-life got really busy suddenly I stopped following my goal on becoming good again on this language and becoming again a Performance oriented Programmer. Listening to the Podcast James Clear says that there were things he would like to have <strong>highlighted</strong> more on the book, something that he learned to be very important with his experience over the years after the book was out.</p><p>If you want to become good at coding in any language or particular area of computer Science you know that sometimes motivation fades away and we abandon projects to only try them again in a couple of months/years then the same happens. <strong>LETS STOP THIS TREND</strong>, so these were the things he would like to highlight more:</p><p><strong>How would this look if it was fun ?</strong> I just said that I was having a lot of fun with the book because of the nostalgia and 90&#8217;s humor but I can think of countless subjects that are boring to me by default like [ANY] Certification, Statistics, Algebra. So first lesson is that some way somehow you need to find a way of making these subjects FUN! to increase the chances of becoming a person that knows statistics, certified professional and so on. Easier said than done but one idea is to find a project you really like about even if it is pointless to spice things up like, I don&#8217;t know do an AI bot that plays a game you used to play when you were a child(very specific hun ;) ), Create something original(like a TODOlist app x) ), find a way of engaging with the thing you want to learn whether is professional or not, here focus on FUN.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!k7_w!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ff50aa-b14e-4ec3-91bd-e43d0bd5c59b_1080x1350.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!k7_w!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ff50aa-b14e-4ec3-91bd-e43d0bd5c59b_1080x1350.png 424w, https://substackcdn.com/image/fetch/$s_!k7_w!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ff50aa-b14e-4ec3-91bd-e43d0bd5c59b_1080x1350.png 848w, https://substackcdn.com/image/fetch/$s_!k7_w!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ff50aa-b14e-4ec3-91bd-e43d0bd5c59b_1080x1350.png 1272w, https://substackcdn.com/image/fetch/$s_!k7_w!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ff50aa-b14e-4ec3-91bd-e43d0bd5c59b_1080x1350.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!k7_w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ff50aa-b14e-4ec3-91bd-e43d0bd5c59b_1080x1350.png" width="1080" height="1350" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/01ff50aa-b14e-4ec3-91bd-e43d0bd5c59b_1080x1350.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1350,&quot;width&quot;:1080,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;SoloDevelingComic-01.png&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="SoloDevelingComic-01.png" title="SoloDevelingComic-01.png" srcset="https://substackcdn.com/image/fetch/$s_!k7_w!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ff50aa-b14e-4ec3-91bd-e43d0bd5c59b_1080x1350.png 424w, https://substackcdn.com/image/fetch/$s_!k7_w!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ff50aa-b14e-4ec3-91bd-e43d0bd5c59b_1080x1350.png 848w, https://substackcdn.com/image/fetch/$s_!k7_w!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ff50aa-b14e-4ec3-91bd-e43d0bd5c59b_1080x1350.png 1272w, https://substackcdn.com/image/fetch/$s_!k7_w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ff50aa-b14e-4ec3-91bd-e43d0bd5c59b_1080x1350.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>How would I do this on busy days ?</strong> Here James said something, that I hope it sticks with me for more than 6 days( my mental cache so you know &#128517; ). <strong>Reduce the Scope but stick to the Schedule</strong>. So for example I am working through some exercism problems these days to spicy things up on my C refreshment Developer journey, but what if the day is a very busy day how can I score one vote towards my habit instead of zero ( not doing it today ), I would read one problem and would imagine how I would solve it in C, that does not take that long I could do even standing and only with my phone. Find ways on the habits you have to do that <strong>Reduce the Scope but stick to the Schedule</strong></p><p>Even better at the beginning of your goal establishment next time, already ask yourself how would I make this tasks parts of the process in order to reach my goal&#8217;s destination, How can I make them fun ? And How will I do them even when life gets in my way ? How can I Reduce the Scope and Stick to the Schedule ?</p><h1>The End for now ...</h1><p>Please any feedback is welcomed it is my second post on this platform and I am still trying to find my voice on Substack and how to express myself to my Audience in a way it is fun for me and also for you all.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.solodeveling.dev/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 Solodeveling's Substack! 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><item><title><![CDATA[The Plague I Couldn't Evade - Relearning C in the Age of AI]]></title><description><![CDATA[I have urge for developing things, for creating new stuff and thats why my mind everyonce in a while comes up with weird ideas but I still take notes until suddenly a good idea comes in.]]></description><link>https://www.solodeveling.dev/p/the-plague-i-couldnt-evade-relearning</link><guid isPermaLink="false">https://www.solodeveling.dev/p/the-plague-i-couldnt-evade-relearning</guid><dc:creator><![CDATA[Solodeveling Dev]]></dc:creator><pubDate>Thu, 25 Jun 2026 16:40:27 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8c84aa3f-31e9-40ee-8d2b-e96863b5eacd_1024x842.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I have urge for developing things, for creating new stuff and thats why my mind everyonce in a while comes up with weird ideas but I still take notes until suddenly a good idea comes in. Past weekend I was reading Milionaire fastlane from MJ De Marco and that book really ignited my will for creating things even more.</p><p>Here are the things you will read on this article:</p><ul><li><p>The Spark: Why I built This App</p></li><li><p>Why C ?</p></li><li><p>Design is my passion /s</p></li><li><p>GTK Hello World app</p></li><li><p>Spice things up</p></li><li><p>Handling Time-sensitive Tasks on GTK</p></li></ul><h2>The Spark: Why I built This App</h2><p>It is not the first time I try to jump from the Content Consumer Wagon and go to the Content Creator Wagon. I thought it could be motivating to add a specific timer for the platforms around me where it would be just a simple timer to be added to a keyboard shortcut and maybe if it was created by me(very meta I know) it would motivate me even more.</p><p>The idea of this post is to share the challenges and learned concepts through the developing of a tiny Timer app in C using GTK Library for MacOS.</p><h2>Why C ?</h2><p>I choose C because this language is pursuing me(like the plague) for the past decade or more, I dodge it learning during bachelor degree because everyone near me that was good in C was arrogant when sharing their knowledge, so unfortunately I did the bare minimum to learn this language and pass exams(T.T). I endedup becoming experienced in Java where people where helpful and the community was also good at the time. During the past decade I setup myself to learning C couple of times, 9 years ago I got a bit good, but life circunstancies played out and meanwhile I&#8217;ve being working as developer with Java, Python, Javascript and so on. I still have this willingness and curiosity to Learn C and I believe that on the age of AI, to know the inner workings of everything running on your computer is becoming more and more vital to survive on the market.</p><h2>Design is my passion /s</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QPrv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc15fb9a-f24b-4166-91ac-9012faaa7c09_3882x1815.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QPrv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc15fb9a-f24b-4166-91ac-9012faaa7c09_3882x1815.png 424w, https://substackcdn.com/image/fetch/$s_!QPrv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc15fb9a-f24b-4166-91ac-9012faaa7c09_3882x1815.png 848w, https://substackcdn.com/image/fetch/$s_!QPrv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc15fb9a-f24b-4166-91ac-9012faaa7c09_3882x1815.png 1272w, https://substackcdn.com/image/fetch/$s_!QPrv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc15fb9a-f24b-4166-91ac-9012faaa7c09_3882x1815.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QPrv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc15fb9a-f24b-4166-91ac-9012faaa7c09_3882x1815.png" width="1456" height="681" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dc15fb9a-f24b-4166-91ac-9012faaa7c09_3882x1815.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:681,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Pasted image 20260622090745.png&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Pasted image 20260622090745.png" title="Pasted image 20260622090745.png" srcset="https://substackcdn.com/image/fetch/$s_!QPrv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc15fb9a-f24b-4166-91ac-9012faaa7c09_3882x1815.png 424w, https://substackcdn.com/image/fetch/$s_!QPrv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc15fb9a-f24b-4166-91ac-9012faaa7c09_3882x1815.png 848w, https://substackcdn.com/image/fetch/$s_!QPrv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc15fb9a-f24b-4166-91ac-9012faaa7c09_3882x1815.png 1272w, https://substackcdn.com/image/fetch/$s_!QPrv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc15fb9a-f24b-4166-91ac-9012faaa7c09_3882x1815.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p> I always like to make some sketch of How I visualize the application to be in my head and as you can see I am very advanced in App design with Excalidraw. Jokes a side it is something quick to set a direction and for me how to visualize my applications, you should also try, don&#8217;t let your ideas only inhabit your mind. </p><h2>How to create a GTK Hello World app</h2><p>Lets start learning shall we ? To code a C app with GTK library included on your MacOS follow these steps.</p><h2>Install GTK4 on MAC</h2><p>Not that complicated, if you have homebrew installed it is super easy just execute these commands. THe first one install gtk and the second install the required libraries to gtk work.</p><pre><code>brew install gtk4
brew install pkg-config
</code></pre><h1>Enable GTK library documentation on Vscode(optional)</h1><p>Add this to your c_cpp_properties.json. This file can be acessed by Ctrl+Shift+P and searching for Edit Configuration.</p><pre><code>&#8220;includePath&#8221;: [
&#8220;${workspaceFolder}/**&#8221;,
&#8220;/opt/homebrew/include/gtk-4.0&#8221;,
&#8220;/opt/homebrew/include/glib-2.0&#8221;,
&#8220;/opt/homebrew/lib/glib-2.0/include&#8221;,
&#8220;/opt/homebrew/include/pango-1.0&#8221;,
&#8220;/opt/homebrew/include/cairo&#8221;,
&#8220;/opt/homebrew/include/gdk-pixbuf-2.0&#8221;,
&#8220;/opt/homebrew/include/graphene-1.0&#8221;,
&#8220;/opt/homebrew/lib/graphene-1.0/include&#8221;,
&#8220;/opt/homebrew/include/harfbuzz&#8221;
],

</code></pre><h2>Hello world app</h2><p>Once everything was installed first thing I went to was to compile a hello world app using GTK.</p><p>Me: How hard could it be right ? Me: right ? GTK C Library leaves the room</p><p>Here is the most basic app you can copy and paste just to have a new shiny application window on your Screen:</p><pre><code>#include &lt;gtk/gtk.h&gt;
#include &lt;stdint.h&gt;
#include &lt;stdio.h&gt;

static void activate(GtkApplication *app) {

GtkWidget *window;
  
window = gtk_application_window_new(app);

gtk_window_set_title(GTK_WINDOW(window), &#8220;GTK4 on macOS&#8221;);
gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);

// Defines the CSS targeting the &#8216;window&#8217; node
const char *css = &#8220;window { background-color: red; }&#8221;;

// Creates the CSS Provider and load the string (found in GtkCssProvider docs)
GtkCssProvider *provider = gtk_css_provider_new ();
gtk_css_provider_load_from_string (provider, css);

// Gets the display and add the provider
GdkDisplay *display = gdk_display_get_default ();

gtk_style_context_add_provider_for_display (display,GTK_STYLE_PROVIDER(provider),GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);

gtk_window_present(GTK_WINDOW(window));
}

int main(int argc, char **argv) {

GtkApplication *app;
int status;

  
app = gtk_application_new(&#8221;com.example.GtkApp&#8221;, G_APPLICATION_DEFAULT_FLAGS);
g_signal_connect(app, &#8220;activate&#8221;, G_CALLBACK(activate), NULL);
status = g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);

return status;
}
</code></pre><p>You can compile it using the following minimal Makefile</p><pre><code>CC = gcc
CFLAGS = $(shell pkg-config --cflags gtk4)
LIBS = $(shell pkg-config --libs gtk4)
TARGET = my_gtk_app

all: $(TARGET)
&#9;
$(TARGET): main.c
&#9;$(CC) $(CFLAGS) main.c -o $(TARGET) $(LIBS)

clean:
&#9;rm -f $(TARGET)
</code></pre><p>Compile it with <code>make</code> command and you should see something like the application below:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KLG7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1e9eee8-5999-4f29-ae07-e17f13305969_1024x880.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KLG7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1e9eee8-5999-4f29-ae07-e17f13305969_1024x880.png 424w, https://substackcdn.com/image/fetch/$s_!KLG7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1e9eee8-5999-4f29-ae07-e17f13305969_1024x880.png 848w, https://substackcdn.com/image/fetch/$s_!KLG7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1e9eee8-5999-4f29-ae07-e17f13305969_1024x880.png 1272w, https://substackcdn.com/image/fetch/$s_!KLG7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1e9eee8-5999-4f29-ae07-e17f13305969_1024x880.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KLG7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1e9eee8-5999-4f29-ae07-e17f13305969_1024x880.png" width="1024" height="880" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f1e9eee8-5999-4f29-ae07-e17f13305969_1024x880.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:880,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Pasted image 20260625073139.png&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Pasted image 20260625073139.png" title="Pasted image 20260625073139.png" srcset="https://substackcdn.com/image/fetch/$s_!KLG7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1e9eee8-5999-4f29-ae07-e17f13305969_1024x880.png 424w, https://substackcdn.com/image/fetch/$s_!KLG7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1e9eee8-5999-4f29-ae07-e17f13305969_1024x880.png 848w, https://substackcdn.com/image/fetch/$s_!KLG7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1e9eee8-5999-4f29-ae07-e17f13305969_1024x880.png 1272w, https://substackcdn.com/image/fetch/$s_!KLG7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1e9eee8-5999-4f29-ae07-e17f13305969_1024x880.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Spice things up</h2><p>Ok now that we have our first version compiled lets add buttons and the timer label. For these 2 to work the main lines of code you should be concerned are:</p><pre><code>// inside activate function ...

timer_label = gtk_label_new (timer_text);
gtk_box_append (GTK_BOX (box), timer_label);

g_signal_connect (start_button, &#8220;clicked&#8221;, G_CALLBACK (on_start_button_clicked), timer_app_data);

g_signal_connect (stop_button, &#8220;clicked&#8221;, G_CALLBACK (on_stop_button_clicked), timer_app_data);

</code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nhxz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F897a9749-a60d-409b-8e42-0f9e8366389b_1000x856.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nhxz!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F897a9749-a60d-409b-8e42-0f9e8366389b_1000x856.gif 424w, https://substackcdn.com/image/fetch/$s_!nhxz!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F897a9749-a60d-409b-8e42-0f9e8366389b_1000x856.gif 848w, https://substackcdn.com/image/fetch/$s_!nhxz!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F897a9749-a60d-409b-8e42-0f9e8366389b_1000x856.gif 1272w, https://substackcdn.com/image/fetch/$s_!nhxz!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F897a9749-a60d-409b-8e42-0f9e8366389b_1000x856.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nhxz!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F897a9749-a60d-409b-8e42-0f9e8366389b_1000x856.gif" width="1000" height="856" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/897a9749-a60d-409b-8e42-0f9e8366389b_1000x856.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:856,&quot;width&quot;:1000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;2026-06-25 13.27.48.gif&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="2026-06-25 13.27.48.gif" title="2026-06-25 13.27.48.gif" srcset="https://substackcdn.com/image/fetch/$s_!nhxz!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F897a9749-a60d-409b-8e42-0f9e8366389b_1000x856.gif 424w, https://substackcdn.com/image/fetch/$s_!nhxz!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F897a9749-a60d-409b-8e42-0f9e8366389b_1000x856.gif 848w, https://substackcdn.com/image/fetch/$s_!nhxz!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F897a9749-a60d-409b-8e42-0f9e8366389b_1000x856.gif 1272w, https://substackcdn.com/image/fetch/$s_!nhxz!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F897a9749-a60d-409b-8e42-0f9e8366389b_1000x856.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Handling Time-sensitive Tasks on GTK </h2><p>One I did not showed yet and important lesson here is that we are running this application still in a single threaded manner, so if you want a task to be constantly running, searching, fetching or code parts where you need it to run functions tied to time, then instead of using something like a while true or a big for you should schedule your function. How do we schedule a function using GTK library ? I am glad you asked below I am showing how I implemented this scheduling inside start_button clicked action:</p><pre><code>static void
on_start_button_clicked (GtkButton *button, gpointer user_data)
{

TimerAppData *data = (TimerAppData *)user_data;
data-&gt;stop_button_pressed = 0;

printf(&#8221;Button clicked\n&#8221;);
printf(&#8221;Tick-tack\n&#8221;);

// Here it is how you can schedule Time-sensitive tasks on GTK
// even in a single threaded setup
g_timeout_add(1000, on_timer_tick , data);
}
</code></pre><h1>The End for now ...</h1><p>I hope you liked and learned something with this post I did not want to make it 100% tutorial but I want it also to share the lessons learned and the problems I spent the most amount of neurons on it. Please any feedback is welcomed it is my first post on this platform, if you liked the post please leave a like, comment something and lets chat!<br><br> I am still want to find my voice, maybe one day I can do funnier and more informative posts like other creators but I need to start somewhere.<br><br>The code for the whole application you can checkout here : <a href="https://github.com/solodevelingdev/creation-timer-app">creation-timer-app</a><br></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.solodeveling.dev/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 Solodeveling's Substack! Subscribe for free to receive new posts, maybe even PART2 of this post &#128591; 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><item><title><![CDATA[Coming soon]]></title><description><![CDATA[This is Solodeveling&#39;s Substack.]]></description><link>https://www.solodeveling.dev/p/coming-soon</link><guid isPermaLink="false">https://www.solodeveling.dev/p/coming-soon</guid><dc:creator><![CDATA[Solodeveling Dev]]></dc:creator><pubDate>Sat, 10 Jan 2026 18:12:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2jLb!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd330302c-7097-4615-a9ac-133f590938cd_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is Solodeveling&#39;s Substack.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.solodeveling.dev/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://www.solodeveling.dev/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item></channel></rss>